klog-2.3.3/0000755000015700001710000000000014542412415012335 5ustar jenkinsjenkinsklog-2.3.3/utilities.cpp0000644000015700001710000023335714542412415015071 0ustar jenkinsjenkins/*************************************************************************** utilities.cpp - description ------------------- begin : jun 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "utilities.h" //bool c; Utilities::Utilities(const QString &_parentName) { parentName = _parentName; //qDebug() << Q_FUNC_INFO << " (" << _parentName << ")"; init(); } Utilities::~Utilities() { } void Utilities::init() { //qDebug() << Q_FUNC_INFO << " - Start"; validateCalls = false; softwareVersion = "0.0"; longPrefixes.clear(); specialCalls.clear(); //darkMode = false; logLevel = None; setARRLSect(); setContinent(); setSponsorsList(); logLevels.clear(); logLevels << "None" << "Info" << "Debug" << "Devel"; setLogColumnNames(); //qDebug() << Q_FUNC_INFO << " - END"; } void Utilities::InitializeHash() { ADIFHash = { {"ADDRESS", "MultiLineString"}, {"AGE", "Number"}, {"ALTITUDE", "Number"}, {"ANT_AZ", "Number"}, {"ANT_EL", "Number"}, {"ANT_PATH", "Enumeration"}, {"ARRL_SECT", "Enumeration"}, {"AWARD_SUBMITTED", "SponsoredAwardList"}, {"AWARD_GRANTED", "SponsoredAwardList"}, {"A_INDEX", "Number"}, {"BAND", "Enumeration"}, {"BAND_RX", "Enumeration"}, {"CALL", "String"}, {"CHECK", "String"}, {"CLASS", "String"}, {"CLUBLOG_QSO_UPLOAD_DATE", "Date"}, {"CLUBLOG_QSO_UPLOAD_STATUS", "Enumeration"}, {"CNTY", "Enumeration"}, {"COMMENT", "String"}, {"CONT", "Enumeration"}, {"CONTACTED_OP", "String"}, {"CONTEST_ID", "String"}, {"COUNTRY", "String"}, {"CQZ", "PositiveInteger"}, {"CREDIT_SUBMITTED", "CreditList"}, {"CREDIT_GRANTED", "CreditList"}, {"DARC_DOK", "Enumeration"}, {"DISTANCE", "Number"}, {"DXCC", "Enumeration"}, {"EMAIL", "String"}, {"EQ_CALL", "String"}, {"EQSL_QSLRDATE", "Date"}, {"EQSL_QSLSDATE", "Date"}, {"EQSL_QSL_RCVD", "Enumeration"}, {"EQSL_QSL_SENT", "Enumeration"}, {"FISTS", "PositiveInteger"}, {"FISTS_CC", "PositiveInteger"}, {"FORCE_INIT", "Boolean"}, {"FREQ", "Number"}, {"FREQ_RX", "Number"}, {"GRIDSQUARE", "GridSquare"}, {"GRIDSQUARE_EXT", "GridSquareExt"}, {"GUEST_OP", "String"}, {"HAMLOGEU_QSO_UPLOAD_DATE", "Date"}, {"HAMLOGEU_UPLOAD_STATUS", "Enumeration"}, {"HAMQTH_QSO_UPLOAD_DATE", "Date"}, {"HAMQTH_UPLOAD_STATUS", "Enumeration"}, {"HRDLOG_QSO_UPLOAD_DATE", "Date"}, {"HRDLOG_QSO_UPLOAD_STATUS", "Enumeration"}, {"IOTA", "IOTARefNo"}, {"IOTA_ISLAND_ID", "PositiveInteger"}, {"ITUZ", "PositiveInteger"}, {"K_INDEX", "Integer"}, {"LAT", "Location"}, {"LON", "Location"}, {"LOTW_QSLRDATE", "Date"}, {"LOTW_QSLSDATE", "Date"}, {"LOTW_QSL_RCVD", "Enumeration"}, {"LOTW_QSL_SENT", "Enumeration"}, {"MAX_BURSTS", "Number"}, {"MODE", "Enumeration"}, {"MS_SHOWER", "String"}, {"MY_ALTITUDE", "Number"}, {"MY_ANTENNA", "String"}, {"MY_ARRL_SECT", "Enumeration"}, {"MY_CITY", "String"}, {"MY_CNTY", "Enumeration"}, {"MY_COUNTRY", "String"}, {"MY_CQ_ZONE", "PositiveInteger"}, {"MY_DXCC", "Enumeration"}, {"MY_FISTS", "PositiveInteger"}, {"MY_GRIDSQUARE", "GridSquare"}, {"MY_GRIDSQUARE_EXT", "GridSquareExt"}, {"MY_IOTA", "IOTARefNo"}, {"MY_IOTA_ISLAND_ID", "PositiveInteger"}, {"MY_ITU_ZONE", "PositiveInteger"}, {"MY_LAT", "Location"}, {"MY_LON", "Location"}, {"MY_NAME", "String"}, {"MY_POSTAL_CODE", "String"}, {"MY_POTA_REF", "POTARef"}, {"MY_RIG", "String"}, {"MY_SIG", "String"}, {"MY_SIG_INFO", "String"}, {"MY_SOTA_REF", "SOTARef"}, {"MY_STATE", "Enumeration"}, {"MY_STREET", "String"}, {"MY_USACA_COUNTIES", "SecondarySubdivisionList"}, {"MY_VUCC_GRIDS", "GridSquareList"}, {"MY_WWFF_REF", "WWFFRef"}, {"NAME", "String"}, {"NOTES", "MultilineString"}, {"NR_BURSTS", "Integer"}, {"NR_PINGS", "Integer"}, {"OPERATOR", "String"}, {"OWNER_CALLSIGN", "String"}, {"PFX", "String"}, {"POTA_REF", "POTARef"}, {"PRECEDENCE", "String"}, {"PROP_MODE", "Enumeration"}, {"PUBLIC_KEY", "String"}, {"QRZCOM_QSO_UPLOAD_DATE", "Date"}, {"QRZCOM_QSO_UPLOAD_STATUS", "Enumeration"}, {"QSLMSG", "MultilineString"}, {"QSLRDATE", "Date"}, {"QSLSDATE", "Date"}, {"QSL_RCVD", "Enumeration"}, {"QSL_RCVD_VIA", "Enumeration"}, {"QSL_SENT", "Enumeration"}, {"QSL_SENT_VIA", "Enumeration"}, {"QSL_VIA", "String"}, {"QSO_COMPLETE", "Enumeration"}, {"QSO_DATE", "Date"}, {"QSO_DATE_OFF", "Date"}, {"QSO_RANDOM", "Boolean"}, {"QTH", "String"}, {"REGION", "Enumeration"}, {"RIG", "MultilineString"}, {"RST_RCVD", "String"}, {"RST_SENT", "String"}, {"RX_PWR", "Number"}, {"SAT_MODE", "String"}, {"SAT_NAME", "String"}, {"SFI", "Integer"}, {"SIG", "String"}, {"SIG_INFO", "String"}, {"SILENT_KEY", "Boolean"}, {"SKCC", "String"}, {"SOTA_REF", "SOTARef"}, {"SRX", "Integer"}, {"SRX_STRING", "String"}, {"STATE", "Enumeration"}, {"STATION_CALLSIGN", "String"}, {"STX", "Integer"}, {"STX_STRING", "String"}, {"SUBMODE", "String"}, {"SWL", "Boolean"}, {"TEN_TEN", "PositiveInteger"}, {"TIME_OFF", "Time"}, {"TIME_ON", "Time"}, {"TX_PWR", "Number"}, {"UKSMG", "PositiveInteger"}, {"USACA_COUNTIES", "SecondarySubdivisionList"}, {"VE_PROV", "String"}, {"VUCC_GRIDS", "GridSquareList"}, {"WEB", "String"}, {"WWFF_REF", "WWFFRef"}, {"APP_LOTW_RXQSL", "Date"}, {"APP_LOTW_RXQSO", "Date"}, {"APP_LOTW_QSO_TIMESTAMP", "Date"} }; return; } void Utilities::setLogLevel(DebugLogLevel _l) { logLevel = _l; } void Utilities::setARRLSect() { ARRL_sects.clear (); //QStringList fonts = { "Arial", "Helvetica", "Times" } QStringList preARRL_sects = {"AL", "AK", "AB", "AR", "AZ", "BC", "CO", "CT", "DE", "EB", "EMA", "ENY", "EPA", "EWA" "GA", "GTA", "ID", "IL", "IN", "IA", "KS", "KY", "LAX", "LA", "ME", "MB", "MAR", "MDC", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NM", "NLI", "NL", "NC", "ND", "NTX", "NFL", "NNJ", "NNY", "NT", "NWT", "OH", "OK", "ON", "ONE", "ONN", "ONS", "ORG", "OR", "PAC", "PR", "QC", "RI", "SV", "SDG", "SF", "SJV", "SB", "SCV", "SK", "SC", "SD", "STX", "SFL", "SNJ", "TN", "VI", "UT", "VT", "VA", "WCF", "WTX", "WV", "WMA", "WNY", "WPA", "WWA", "WI", "WY"}; ARRL_sects = preARRL_sects; } void Utilities::setContinent() { continent = QStringList(); QStringList continentList = {"NA", "SA", "EU", "AF", "OC", "AS", "AN"}; continent = continentList; } void Utilities::setSponsorsList() { sponsorsList.clear (); QStringList preSponsorsList = {"ADIF_", "ARI_", "ARRL_", "CQ_", "DARC_", "EQSL_", "IARU_", "JARL_", "RSGB_", "TAG_", "WABAG_"}; sponsorsList = preSponsorsList; } void Utilities::setVersion(const QString &_v) { //qDebug() << "Utilities::setVersion: " << _v ; softwareVersion = _v; } QString Utilities::getVersion() { return softwareVersion; } double Utilities::getVersionDouble() { //qDebug() << "Utilities::getVersionDouble: " << softwareVersion ; if (softwareVersion.count('.')>1) { QString first = softwareVersion.section('.', 0, 0); int pos = softwareVersion.indexOf('.'); QString decimals = softwareVersion.section('.', pos, -1); decimals.remove('.'); first = first + "." + decimals; //qDebug() << "Utilities::getVersionDouble - returning: " << first ; return first.toDouble(); } //qDebug() << "Utilities::getVersionDouble: no points detected" ; return softwareVersion.toDouble(); } int Utilities::getProgresStepForDialog(int totalSteps) { //qDebug() << "Utilities::getProgresStepForDialog"; if (totalSteps <=100) return 1; else if (totalSteps <=1000) return 5; else if (totalSteps <=4000) return 10; else if (totalSteps <=5000) return 15; else if (totalSteps <=7000) return 20; else if (totalSteps <=9999) return 25; else if (totalSteps <=20000) return 100; else return 250; } bool Utilities::trueOrFalse(const QString &_s) {// reads a String and return true if s.upper()== TRUE :-) //qDebug() << "Utilities::trueOrFalse: " << _s ; if ( (_s.toUpper()) == "TRUE") { return true; } else { return false; } //return false; } QChar Utilities::boolToCharToSQLite(const bool _b) { if (_b) { return 'Y'; } else { return 'N'; } } QString Utilities::boolToQString(const bool _b) { if (_b) { return "True"; } else { return "False"; } } bool Utilities::QStringToBool(const QString &_s) { if ( (_s.toUpper()) == "Y") { return true; } else { return false; } } QString Utilities::checkAndFixASCIIinADIF(const QString &_data) { //qDebug() << "SetupDialog::checkAndFixASCIIinADIF " << _data ; // This function is not really working with ASCII but with Unicode ushort unicodeVal; QString st = _data; QString newString; newString.clear(); for(int i=0; i < st.length(); i++) { // Get unicode VALUE into unicodeVal unicodeVal = (st.at(i)).unicode(); if ((20 <= unicodeVal ) && (unicodeVal <= 126)) { newString.append(st.at(i)); } //qDebug() << "SetupDialog::checkAndFixunicodeinADIF: " << st.at(i) <<" = " << QString::number(unicodeVal) ; } // Show into another lineEdit return newString; } void Utilities::printQString(const QStringList &_qs) { //qDebug() << "Utilities::printQString: COMMENT THIS CALL BEFORE RELEASING" ; if (_qs.length()<1) { //qDebug() << "Utilities::printQString: EMPTY QStringList received!!" ; return; } for (int i=0; i<_qs.length()-1;i++) { //qDebug() << _qs.at(i) << "/" ; } //qDebug() << _qs.at(_qs.length()-1) ; } QString Utilities::getGlobalAgent(const QString &_klogversion) { return QString("KLog-%1").arg(_klogversion); } QString Utilities::getAgent(const QString &_klogversion) { QString version; QString ops; version = _klogversion; #if defined(Q_OS_WIN32) ops = "KLog-Win32-"; #elif defined(Q_OS_WIN64) ops = "KLog-Win64-"; #elif defined(Q_OS_LINUX) ops = "KLog-Linux-"; #elif defined(Q_OS_WIN) ops = "KLog-Win-"+ version; #elif defined(Q_OS_MACOS) ops = "KLog-macOS-"; #elif defined(Q_OS_OSX) ops = "KLog-OSX-"; #elif defined(Q_OS_MAC) ops = "KLog-MAC-"; #elif defined(Q_OS_DARWIN) ops = "KLog-DARWIN-"; #elif defined(Q_OS_AIX) ops = "KLog-aix-"; #elif defined(Q_OS_ANDROID) ops = "KLog-android-"; //#elif defined(Q_OS_BSD4) // ops = "KLog-bsd4-"; #elif defined(Q_OS_BSDI) ops = "KLog-bsdi-"; #elif defined(Q_OS_CYGWIN) ops = "KLog-cygwin-"; #elif defined(Q_OS_DARWIN) ops = "KLog-darwin-"; #elif defined(Q_OS_DGUX) ops = "KLog-dgux-"; #elif defined(Q_OS_DYNIX) ops = "KLog-dynix-"; #elif defined(Q_OS_FREEBSD) ops = "KLog-freebsd-"; #elif defined(Q_OS_HPUX) ops = "KLog-hpux-"; #elif defined(Q_OS_IOS) ops = "KLog-ios-"; #elif defined(Q_OS_IRIX) ops = "KLog-irix-"; #elif defined(Q_OS_LYNX) ops = "KLog-lynx-"; #elif defined(Q_OS_NETBSD) ops = "KLog-netbsd-"; #elif defined(Q_OS_OPENBSD) ops = "KLog-openbsd-"; #elif defined(Q_OS_OSF) ops = "KLog-osf-"; #elif defined(Q_OS_QNX) ops = "KLog-qnx-"; #elif defined(Q_OS_SCO) ops = "KLog-sco-"; #elif defined(Q_OS_SOLARIS) ops = "KLog-solaris-"; #elif defined(Q_OS_TVOS) ops = "KLog-tvos-"; #elif defined(Q_OS_UNIX) ops = "KLog-unix-"; #elif defined(Q_OS_UNIXWARE) ops = "KLog-unixware-"; #elif defined(Q_OS_WHATCHOS) ops = "KLog-whatchos-"; #elif defined(Q_OS_WINRT) ops = "KLog-winrt-"; #else ops = "KLog-Other-"; #endif return ops+version; //return "KLog-Unknown-" + version; } QString Utilities::getHomeDir() { //TODO: To be removed when the defaultDir is saved in the config file #if defined(Q_OS_WIN) //qDebug() << "WINDOWS DETECTED!: " << QDir::homePath() + "/klog" ; return QDir::homePath()+"/klog"; // We create the \klog for the logs and data #else //qDebug() << "NO WINDOWS DETECTED!" ; return QDir::homePath()+"/.klog"; // We create the ~/.klog for the logs and data #endif } QString Utilities::getDefaultRST(const QString &_m) { //qDebug() << "Utilities::getDefaultRST: " << _m ; if ((_m == "SSB") || (_m== "LSB") || (_m=="USB") ) { //qDebug() << "MainWindow::setRSTToMode: Detected SSB/LSB/USB" ; return "59"; } else if ((_m == "CW") || (_m == "RTTY")) { return "599"; } else if (_m == "PSK31") { return "599"; } else if ( (_m.contains("FT", Qt::CaseInsensitive)) || (_m.contains("JT", Qt::CaseInsensitive)) || (_m.contains("QRA64", Qt::CaseInsensitive)) || (_m.contains("JS", Qt::CaseInsensitive))) { return "0"; } else { // By default SSB RST is configured but anything could be added return "59"; } } QStringList Utilities::getDefaultLogFields() { QStringList fields; fields.clear(); fields << "qso_date" << "call" << "rst_sent" << "rst_rcvd" << "bandid" << "modeid" << "comment"; return fields; } QString Utilities::getKLogDefaultDatabaseFile() { //TODO: To be removed when the defaultDir is saved in the config file return getHomeDir() ; } QString Utilities::getKLogDBFile() { //qDebug() << "Utilities::getKLogDBFile: start " ; dbPath = getKLogDefaultDatabaseFile(); QFile file(getCfgFile()); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //return dbPath; //return getKLogDatabaseFile(dbPath); } else { while (!file.atEnd()) { QByteArray line = file.readLine(); processConfigLine(line); } if (dbPath.length()<1) { dbPath = getKLogDefaultDatabaseFile(); } } //qDebug() << "Utilities::getKLogDBFile: path to use: " << dbPath ; return dbPath + "/logbook.dat"; } QString Utilities::getKLogDBBackupFile() { //qDebug() << "Utilities::getKLogDBFile: start " ; dbPath = getKLogDefaultDatabaseFile(); QFile file(getCfgFile()); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //return dbPath; //return getKLogDatabaseFile(dbPath); } else { while (!file.atEnd()) { QByteArray line = file.readLine(); processConfigLine(line); } if (dbPath.length()<1) { dbPath = getKLogDefaultDatabaseFile(); } } //qDebug() << "Utilities::getKLogDBFile: path to use: " << dbPath ; return dbPath + "/" + QDateTime::currentDateTime().toString("yyyyMMdd-hhmmss") + "-backup-logbook.dat" ; } bool Utilities::processConfigLine(const QString &_line) { //qDebug() << "Utilities::processConfigLine: " << _line ; QString line = _line.simplified(); //line.simplified(); //QString aux; QStringList values = line.split("=", QT_SKIP); if (line.startsWith('#')){ //qDebug() << "Utilities::processConfigLine: notes Line!" ; return true; } if (!( (line.contains('=')) && (line.contains(';')))){ //qDebug() << "Utilities::processConfigLine: Wrong Line!" ; return false; } QString field = (values.at(0)).toUpper(); QString value = values.at(1); int endValue = value.indexOf(';'); if (endValue>-1){ value = value.left(value.length() - (value.length() - endValue)); } if (field == "DBPATH") { //qDebug() << "Utilities::processConfigLine: dbPATH found: " << value ; dbPath = value; } return true; } /* QString Utilities::getKLogDatabaseFile(const QString &_file) { //qDebug() << "Utilities::getKLogDatabaseFile:" << _file ; if ( QFile::exists(_file + "/logbook.dat") ) { //qDebug() << "Utilities::getKLogDatabaseFile:returning: " << _file + "/logbook.dat" ; return _file + "/logbook.dat"; } //qDebug() << "Utilities::getKLogDatabaseFile: Does not exist so default: " << getKLogDefaultDatabaseFile() ; return getKLogDefaultDatabaseFile(); } */ QString Utilities::getCfgFile() { //TODO: To be removed when the defaultDir is saved in the config file #if defined(Q_OS_WIN) //qDebug() << "WINDOWS DETECTED!: " << getHomeDir() + "/klogrc.cfg" ; return getHomeDir() + "/klogrc.cfg"; #else //qDebug() << "NO WINDOWS DETECTED!: " << getHomeDir() + "/klogrc.cfg" ; return getHomeDir() + "/klogrc"; #endif } QString Utilities::getDebugLogFile() { #if defined(Q_OS_WIN) //qDebug() << "WINDOWS DETECTED!: " << getHomeDir() + "/klogrc.cfg" ; return getHomeDir() + "/klogdebug.log"; #else //qDebug() << "NO WINDOWS DETECTED!: " << getHomeDir() + "/klogrc.cfg" ; return getHomeDir() + "/klogdebug.log"; #endif } QString Utilities::getSaveSpotsLogFile() { QString filename = "/" + (QDateTime::currentDateTime()).toString("yyyyMMdd") + "-klogdxcluster.txt"; return getHomeDir() + filename; } QString Utilities::getBackupADIFile() { return getHomeDir() + "/" + (QDateTime::currentDateTime()).toString("yyyyMMdd-hhmm") + "-klogbackup.adi"; } QString Utilities::getClubLogFile() { return getHomeDir() + "/klog-clublog-upload.adi"; } QString Utilities::getEQSLFile() { return getHomeDir() + "/klog-eqsl-upload.adi"; } QString Utilities::getLoTWAdifFile() { return getHomeDir() + "/klog-lotw-upload.adi"; } QString Utilities::getTQSLsFileName() { //qDebug() << "Utilities::getTQSLsFileName: " ; #if defined(Q_OS_WIN) //qDebug() << "WINDOWS DETECTED!: " ; return "tqsl.exe"; #elif defined(Q_OS_MACOS) //qDebug() << "macOS DETECTED!: " ; return "tqsl.app"; #else //qDebug() << "NO WINDOWS/macOS DETECTED!: " ; return "tqsl"; #endif } QString Utilities::getTQSLsPath() { //qDebug() << "Utilities::getDefaultProgramsPath " ; #if defined(Q_OS_WIN64) //qDebug() << "WINDOWS DETECTED!: " ; return "C:/Program Files/TrustedQSL/"; #elif defined(Q_OS_WIN32) return "C:/Program Files (x86)/TrustedQSL/"; #elif defined(Q_OS_MACOS) //qDebug() << "macOS DETECTED!: " ; return "/Applications/TrustedQSL/"; #else //qDebug() << "NO WINDOWS/macOS DETECTED!: " ; return "/usr/bin/"; #endif } QString Utilities::getCTYFile() { return getHomeDir() + "/cty.csv"; } int Utilities::getNormalizedDXCCValue(const int _dxcc) { if (_dxcc >1000) { return ((QString::number(_dxcc)).rightRef(3)).toInt(); } else { return _dxcc; } } QDate Utilities::getDefaultDate() { //return QDate::fromString("18000101", "yyyyMMdd"); return QDate::currentDate(); } bool Utilities::isValidDate(const QDate _d) { //qDebug() << "Utilities::isValidDate: " << _d.toString("yyyyMMdd") ; if (_d.isValid()) { if ( _d > QDate::fromString("18000101", "yyyyMMdd") ) { //qDebug() << "Utilities::isValidDate: OK" ; return true; } } //qDebug() << "Utilities::isValidDate: Error" ; return false; } bool Utilities::isValidDateTime(const QString &_d) { //qDebug() << "Utilities::isValidDateTime: " << _d ; QDateTime _dateTime = QDateTime::fromString(_d, "yyyyMMddhhmmss"); if ( _dateTime.isValid() ) { //qDebug() << "Utilities::isValidDateTime: 1" ; return isValidDate(_dateTime.date()); } //qDebug() << "Utilities::isValidDateTime: Error" ; return false; } bool Utilities::isValidSimpleCall(const QString &_c) { //logEvent (QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName), QString("Start: %1").arg(_c), Debug); // This functions only checks simple calls like EA4K, not composed like EA4K/F of F/EA4K/QRP //Rules: http://life.itu.int/radioclub/rr/art19.pdf //qDebug() << QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName) << QString(" - 000 - %1").arg(_c); if ((_c.contains('/')) || (_c.contains('\\'))) { //qDebug() << Q_FUNC_INFO << " -001"; return false; } int length = _c.length(); //qDebug() << QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName) << " - 010"; if (length<3) { //logEvent (QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName), QString("Less than 3 chars - FALSE"), Debug); //qDebug() << Q_FUNC_INFO << " - END2"; return false; } //qDebug() << Q_FUNC_INFO << " - 020"; QString call = _c; if (isAKnownCall(call)) { //qDebug() << Q_FUNC_INFO << " - 020.5"; return true; } //qDebug() << Q_FUNC_INFO << " - 021"; // Does it contain any digit? bool hasDigit = false; for (int i=0;i<=length-1;i++) { if (!_c.at(i).isLetterOrNumber ()) { // Non valid chars //logEvent (QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName), QString("Non valid chars - FALSE"), Debug); //qDebug() << Q_FUNC_INFO << " - END3"; return false; } if ((_c.at(i)).isDigit()) hasDigit = true; } if (!hasDigit) { //qDebug() << Q_FUNC_INFO << " - END4"; return false; } //qDebug() << Q_FUNC_INFO << " - 030"; if (!(_c.at(length-1).isLetter ())) { logEvent (QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName), QString("Does not end with a char - FALSE"), Debug); //qDebug() << Q_FUNC_INFO << " - END6"; return false; } //qDebug() << Q_FUNC_INFO << " - 040"; if (length<=5) { //This may fail with JY1 Special call or others special 4 or 5 letter callsigns listed in //qDebug() << Q_FUNC_INFO << " - 031 - " << _c; if (isAKnownPrefix(_c)) { //qDebug() << Q_FUNC_INFO << " - END5"; return false; } } //qDebug() << QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName) << " - 040"; //logEvent (QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName), QString("prefixLength: %1").arg(prefixLength), Devel); //logEvent (QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName), QString("Call: %1").arg(_c), Devel); bool firstCharNumber = _c.at(0).isDigit(); bool secondCharNumber = _c.at(1).isDigit(); bool thirdCharNumber = _c.at(2).isDigit(); //EA4, 2E3, E33, K1A, 3DA, FB1K !2EE if (firstCharNumber && secondCharNumber) { // 11, 22 //qDebug() << Q_FUNC_INFO << "END - 060 "; return false; } else if(firstCharNumber && !secondCharNumber && !thirdCharNumber) { // 2EE if (_c.left(3) != "3DA") { //qDebug() << Q_FUNC_INFO << "END - 070 "; return false; } } //qDebug() << Q_FUNC_INFO << "END"; logEvent (QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName), QString("END - TRUE"), Debug); return true; } bool Utilities::isAValidOperatingSuffix (const QString &_c) { //qDebug() << QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName) << _c; QStringList validSuffixes = {"A", "P", "Q", "AM", "M", "MM", "LH", "R", "J", "FF", "QRP", "QRPP", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}; return validSuffixes.contains (_c); } bool Utilities::isAPrefix (const QString &_c) { // Returns -1 if it is not a prefix or valid call. // Returns an int with the lenght of the prefix: // The length would be including the number, if possible EA4 or; // including just the country prefix: EA if the number is not included. // Prefixes are at least 1 chars (like in K), for K1K it should be 2 (K1) //logEvent (QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName), QString("Start: %1").arg(_c), Debug); //qDebug() << Q_FUNC_INFO << "Call/Pref" << _c; QString aux = _c; if (aux.length()<1) { return false; } //qDebug() << Q_FUNC_INFO << "Call/Pref" << _c << "/" << getPrefixFromCall(_c); int length = (getPrefixFromCall(aux)).length(); return (length>0); } void Utilities::setLongPrefixes (const QStringList &_p) { //qDebug() << Q_FUNC_INFO << ": Start count: " << QString::number(_p.count()); longPrefixes.clear(); longPrefixes.append(_p); //qDebug() << Q_FUNC_INFO << ": count: " << QString::number(longPrefixes.count()); } void Utilities::setSpecialCalls (const QStringList &_p) { //qDebug() << Q_FUNC_INFO << ": Start count: " << QString::number(_p.count()); specialCalls.clear(); specialCalls.append(_p); //qDebug() << Q_FUNC_INFO << ": count: " << QString::number(specialCalls.count()); } bool Utilities::isAKnownPrefix(const QString &_c) {// TODO: Complete with https://rsgb.org/main/operating/licensing-novs-visitors/international-prefixes/ //qDebug() << Q_FUNC_INFO << ": " << _c; QString aux; if (_c.isNull() ) { //qDebug() << Q_FUNC_INFO << ": END - 1"; return false; } if (longPrefixes.count()<100) { //qDebug() << Q_FUNC_INFO << ": ********** END - FAIL"; } //qDebug() << Q_FUNC_INFO << QString(": END - 2 - %1 - %2").arg(_c).arg(boolToQString(longPrefixes.contains(_c))); return longPrefixes.contains(_c); } bool Utilities::isAKnownCall(const QString &_c) { //qDebug() << Q_FUNC_INFO << ": " << _c; QString aux; if (_c.isNull() ) { //qDebug() << Q_FUNC_INFO << ": END - 1"; return false; } if (specialCalls.count()<100) { //qDebug() << Q_FUNC_INFO << ": ********** END - FAIL"; } return specialCalls.contains(_c); } void Utilities::setCallValidation(const bool _b) { //g_callsignCheck = _b; validateCalls = _b; } QString Utilities::getCheckedComplexCall(const QString &_c) { // Normalices calls //qDebug() << Q_FUNC_INFO << " - Start: " << _c; QString call = _c; if (call.isNull()) return QString(); call.replace('\\', '/'); if (call=="/") return QString(); QStringList parts; parts.clear(); parts << call.split('/'); if (parts.count()<2) { return call; } if ((parts.at(0)).isNull()) { call = parts.at(1); } else if ((parts.at(1)).isNull()) { call = parts.at(0); } else { call = parts.at(0) + "/" + parts.at(1); } //qDebug() << Q_FUNC_INFO << " - END: " << call; return call; } QString Utilities::getMainCallFromComplexCall(const QString &_complexCall) { // Return the part of the call that provides entity and prefix information: // EA4K/F => F // VK9/EA4K => VK9 // EA4K/MM => EA4K // MM/EA4K => MM QString call = _complexCall; if (call.length() == 1) { if ((call.at(0)).isLetterOrNumber()) { return call; } else { return QString(); } } //qDebug() << Q_FUNC_INFO << ": " << _complexCall; if (call.count('/') >1) { //Things like F/EA4K/P will become F/EA4K //logEvent (Q_FUNC_INFO, QString("With 2 /"), Debug); call = call.section("/", 0,1); } //qDebug() << Q_FUNC_INFO << ": First cut: " << call; call = getCheckedComplexCall(call); //qDebug() << Q_FUNC_INFO << ": Second cut: " << call; //qDebug() << Q_FUNC_INFO << " - 010" ; if (call.count('/') == 1) {// Complex calls (like F/EA4K - EA4K/F -EA4K/P - EA4K/1 - EA4K/qrp - VK9M/EA4K - EA4K/VK9M // K1B/QRP - B1A/VK9M QStringList parts; parts.clear(); parts << call.split('/'); QString first = parts.at(0); QString second = parts.at(1); // First identify normal suffixes /P, /1, /QRP... bool firstCountry = !isAValidOperatingSuffix(first); bool secondCountry = !isAValidOperatingSuffix(second); //qDebug() << QString("First = %1, Second = %2").arg(boolToQString(firstCountry)).arg(boolToQString(secondCountry)); if (!firstCountry) { if ((parts.at(0)) == "MM") { // Special case for Scotland EA4K/MM colliding as maritime movil // Scotland requires the prefix first like in MM/EA4K firstCountry=true; } } //qDebug() << Q_FUNC_INFO << " - 020" ; if (firstCountry && secondCountry) { // EA4K/VK9M //qDebug() << Q_FUNC_INFO << " - 030" ; bool firstIsPrefix = isAKnownPrefix(first); bool secondIsPrefix = isAKnownPrefix(second); if (firstIsPrefix && !secondIsPrefix) { //qDebug() << Q_FUNC_INFO << " END first - 033" ; return first; } else if (!firstIsPrefix && secondIsPrefix) { //qDebug() << Q_FUNC_INFO << "END second - 034" ; return second; } else { if (first.length()>second.length()) { call = second; } else { call = first; } } } else if (isAValidOperatingSuffix(first)) {// 1/EA4K // TODO: Here the perfect way should be to obtain the country and // add the number, if area is requested call = second; } else if (isAValidOperatingSuffix(second)) {// EA4K/2 call = first; } else { // None is a normal country prefix return QString(); } } return call; } bool Utilities::isValidCall(const QString &_c, bool _force) {// https://life.itu.int/radioclub/rr/art19.pdf //logEvent (QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName), QString("Start = %1").arg(_c), Debug); //qDebug() << QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName) << "Start: " << _c; //qDebug() << Q_FUNC_INFO << ": " << _c; // Prefixes are at least 2 chars if ((!validateCalls) && (!_force)) { //qDebug() << Q_FUNC_INFO << "001 - Not validating calls: " << _c; //logEvent (QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName), QString("END - 001 - true"), Debug); return true; } //qDebug() << Q_FUNC_INFO << " - Long prefixes: " << QString::number(longPrefixes.count()); if (longPrefixes.count()<100) { //qDebug() << Q_FUNC_INFO << "Long prefixes < 100 " << _c; return false; } QString call = _c; //qDebug() << Q_FUNC_INFO << "000 " << _c; if (isAKnownCall(call)) { //qDebug() << Q_FUNC_INFO << "001 - Known call: " << _c; return true; } //qDebug() << Q_FUNC_INFO << "- 002 " << call; if (call.length()<3) { //qDebug() << Q_FUNC_INFO << "- 003 " << call; //logEvent (QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName), QString("END - 010 - False"), Debug); return false; } //call = getMainCallFromComplexCall(call); //qDebug() << Q_FUNC_INFO << "- 004 :" << call; //logEvent (QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName), QString("END - 010"), Devel); if (call.count('\\')>0) { call.replace('\\', '/'); } //qDebug() << Q_FUNC_INFO << " -005"; if (call.count('/')>2) { //logEvent (QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName), QString("END - 015 - false"), Debug); //qDebug() << Q_FUNC_INFO << " -005.5"; return false; } //qDebug() << Q_FUNC_INFO << " -006"; //logEvent (QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName), QString("END - 020"), Devel); //qDebug() << QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName) << " - 020"; if (call.count('/') == 2) { //Things like F/EA4K/P will become F/EA4K //logEvent (QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName), QString("Two /; Ignoring the last part: %1").arg(call), Devel); QStringList parts; parts.clear(); parts << call.split('/'); call = parts.at(0) + "/" + parts.at(1); } //logEvent (QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName), QString(" - 025: %1").arg(call), Devel); //qDebug() << Q_FUNC_INFO << " -025"; if (call.count('/') == 1) { // Complex calls (like F/EA4K or EA4K/F OR /p OR /qrp // We are just checking the call format not if it belongs to a country or whatever. // It may return true for wrong calls like "ABC/EA4K" // TODO: Add a check just for prefixes to fix the previous //logEvent (QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName), QString(" - Call with one /: %1").arg(call), Devel); QStringList parts; parts.clear(); parts << call.split ('/'); //EA4K/P bool result1 = ((isAPrefix (parts.at (0))) || (isValidSimpleCall (parts.at(0)))); //qDebug() << Q_FUNC_INFO << " -027"; bool result2 = ((isAPrefix (parts.at (1))) || (isValidSimpleCall (parts.at(1))) || isAValidOperatingSuffix(parts.at(1)) ); //qDebug() << Q_FUNC_INFO << parts.at(0) << "/" << parts.at(1); //qDebug() << Q_FUNC_INFO << QString("Result1=%1").arg(boolToQString(result1)); //qDebug() << Q_FUNC_INFO << QString("Result2=%1").arg(boolToQString(result2)); //qDebug() << Q_FUNC_INFO << QString("Detailed=%1/%2/%3").arg(boolToQString((isAPrefix (parts.at (1))) )).arg(boolToQString((isValidSimpleCall (parts.at(1))))).arg(boolToQString(isAValidOperatingSuffix(parts.at(1)))); //qDebug() << Q_FUNC_INFO << "END1"; return (result1 && result2); } //logEvent (QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName), QString("END - %1").arg(isValidSimpleCall(call)), Debug); //qDebug() << QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName) << " - END"; return isValidSimpleCall(call); } QString Utilities::getPrefixFromCall(const QString &_c, bool withAreaNumber) { //qDebug() << Q_FUNC_INFO << ": " << _c << " - WithAreaNumber=" << boolToQString(withAreaNumber); if (_c.isNull()) { return QString(); } QString call = _c; int length = call.length(); bool firstSpecial = isAOneLetterPrefix(call.at(0)); if (length==1) { if (firstSpecial) { return _c; } else { return QString(); } } //qDebug() << Q_FUNC_INFO << " - Going to calculate - length = " << QString::number(length); if (length>2) { //qDebug() << Q_FUNC_INFO << " - Going to Look for a known call" ; if (isAKnownCall(_c)) { //qDebug() << Q_FUNC_INFO << " - Known CALL found!"; return _c; } //qDebug() << Q_FUNC_INFO << " - Call not found!" ; } //qDebug() << Q_FUNC_INFO << " - 010"; call = getMainCallFromComplexCall(call); //qDebug() << Q_FUNC_INFO << " - 011: " << call; QString call2 = call; QString call3 = call; int i = length; while (i>0) { //qDebug() << Q_FUNC_INFO << QString(" While (i=%1) = ").arg(i) << call; if (isAKnownPrefix(call)) {// EA, EA6, VK9N, VP2E, K, K1, KN1, 4U1I //qDebug() << Q_FUNC_INFO << QString("- Known prefix found: %1").arg(call); if (withAreaNumber) { //qDebug() << Q_FUNC_INFO << QString("- With Area number"); if ( (call2.back()).isDigit() ) { //qDebug() << Q_FUNC_INFO << QString("- With Area number -call2- & last is a digit"); return call2; } else if((call3.back()).isDigit()) { //qDebug() << Q_FUNC_INFO << QString("- With Area number -call3- & last is a digit"); return call3; } } //qDebug() << Q_FUNC_INFO << QString("- With NO Area number"); return call; } //qDebug() << Q_FUNC_INFO << QString("- Known prefix NOT found: %1").arg(call); call3 = call2; call2 = call; call.chop(1); i--; } return QString(); /* QString call2 = call; QString call3 = call; bool keepAnalyzing = true; bool found = false; bool secondCharIsNumber = false; if ((call.at(1)).isDigit()) { secondCharIsNumber = true; } //GW1A while (keepAnalyzing) { //qDebug() << Q_FUNC_INFO << " - call: " << call; //qDebug() << Q_FUNC_INFO << " - call2: " << call2; //qDebug() << Q_FUNC_INFO << " - call3: " << call3; if (isAKnownPrefix(call)) { //qDebug() << Q_FUNC_INFO << ": Found!: " << call; keepAnalyzing = false; found = true; } else if (call.length()<=2) { //qDebug() << Q_FUNC_INFO << ": Not found & call<=2: " << call; keepAnalyzing = false; } else { //qDebug() << Q_FUNC_INFO << ": else, chop: " << call; call3 = call2; call2 = call; call.chop(1); } } //qDebug() << Q_FUNC_INFO << ": **** Out of while: " << call << "/" << call2 << "/" << call3; if (found) { //qDebug() << Q_FUNC_INFO << ": END-0 " << call; return call; } else { if (firstSpecial) { call3 = call2; call2 = call; call.chop(1); } //qDebug() << Q_FUNC_INFO << ": **** Out of while Special 1-Letter: " << call << "/" << call2 << "/" << call3; } //qDebug() << Q_FUNC_INFO << ": **** To process: " << call << "/" << call2 << "/" << call3; if (withAreaNumber) { //qDebug() << Q_FUNC_INFO << ": WithAreaNumber"; if (firstSpecial) { //qDebug() << Q_FUNC_INFO << ": FirstSpecial"; int last = call2.length(); //qDebug() << Q_FUNC_INFO << ": last="<< QString::number(last); if (call.length()==1) { //qDebug() << Q_FUNC_INFO << ": END0: " << call; return call; } else if (((call2.at(last-1)).isDigit())) {//K1 //qDebug() << Q_FUNC_INFO << ": END1: " << call2; return call2; } else if ((call3.at(call3.length()-1)).isDigit()) {//KB1 //qDebug() << Q_FUNC_INFO << ": END2: " << call3; return call3; } else { //qDebug() << Q_FUNC_INFO << ": END3: " << call; return call; } } else { if (call == call2) { //qDebug() << Q_FUNC_INFO << ": END4: " << call; return call; } int last = call2.length(); if (((call2.at(last-1)).isDigit())) { //qDebug() << Q_FUNC_INFO << ": END5: " << call2; return call2; } //qDebug() << Q_FUNC_INFO << ": END6: " << call; //return call; } } //Si se pide el numero pero el prefijo no trae numero se devuelve sin numero. if (firstSpecial) { //qDebug() << Q_FUNC_INFO << ": call2: " << call2; if (isAKnownPrefix(call2)) { //qDebug() << Q_FUNC_INFO << ": END7.1: " << call; return call2; } else if (!secondCharIsNumber && (call.at(3)).isDigit()) { //qDebug() << Q_FUNC_INFO << ": END7.2: " << call; return call; } //qDebug() << Q_FUNC_INFO << ": END7.3: " << call; //return call; } int last = call2.length(); if (!((call2.at(last-1)).isDigit())) { if (isAKnownPrefix(call)) { //qDebug() << Q_FUNC_INFO << ": END7.5: " << call2; return call; } //qDebug() << Q_FUNC_INFO << ": END8: " << call2; return call2; } //qDebug() << Q_FUNC_INFO << ": END9: " << call; return call; */ } bool Utilities::isAOneLetterPrefix(const QChar &_c) { QList validFirstLettersOnly = {'B', 'F', 'G', 'I', 'K', 'M', 'N', 'R', 'W'}; return validFirstLettersOnly.contains (_c); } bool Utilities::isSameFreq(const double fr1, const double fr2) { //qDebug() << QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName) << ": " << QString::number(fr1) << "/" << QString::number(fr2) << " = " << QString::number(fabs(fr1 - fr2)) ; if (fabs(fr1 - fr2) < 0.00001) // 10 Hz { //qDebug() << QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName) << " - true" ; return true; } else { //qDebug() << QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName) << " - false" ; return false; } //return fabs(fr1 - fr2) < 0.001; } bool Utilities::isValidBandId(const int _b) { if (_b>0) { return true; } else { return false; } //return false; } bool Utilities::isValidModeId(const int _m) { return (_m>0); } bool Utilities::isValidFreq(const QString &_b) { return (_b.toDouble()>0); } bool Utilities::isValidGrid(const QString &_b) { Locator locator; return locator.isValidLocator(_b); } bool Utilities::isValidVUCCGrids(const QString &_b) { //qDebug() << Q_FUNC_INFO << ": " << _b; if(_b.endsWith (',')) return false; //qDebug() << QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName) << ": " << _b; QStringList tmp; //QString a = _b; tmp.clear (); tmp << _b.split (',', QT_SKIP); //qDebug() << Q_FUNC_INFO << ": 10"; if ((tmp.length () !=2) && (tmp.length () !=4) ) { //qDebug() << Q_FUNC_INFO << ": 11 - not valid lenght"; return false; } //qDebug() << Q_FUNC_INFO << ": 20"; QString aux; foreach (aux, tmp) { aux = aux.trimmed (); //if ((!isValidGrid (aux)) || (aux.length ()!=4)) if (!isValidGrid (aux)) { //qDebug() << Q_FUNC_INFO << ": 30 - non valid: " << aux; return false; } else { //qDebug() << Q_FUNC_INFO << ": 31 - valid"; } } //qDebug() << Q_FUNC_INFO << ": 100 - VALID END"; return true; } bool Utilities::isValidRST(const QString &_b) { return (_b.length()>0); } bool Utilities::isValidPower(const QString &_b) { return (_b.toDouble()>0); } bool Utilities::isValidComment(const QString &_b) { return (_b.length()>0); } bool Utilities::isValidName(const QString &_b) { return (_b.length()>0); } bool Utilities::fileExists(const QString &_fileName) { //qDebug() << Q_FUNC_INFO << _file ; return (QFile::exists(_fileName)); } bool Utilities::isValidADIFField(const QString &_b) { //qDebug() << "Utilities::isValidADIFField: " << _b ; /* This functions checks if the ADIF field has the proper format. Data */ if (!((_b.startsWith('<')) && (_b.count('>')) == 1 )) { //qDebug() << "Utilities::isValidADIFField: BAD FORMAT: No < or > delimiters: " << _b ; return false; } if (_b.simplified() == "") { return true; } QStringList validDataTypes = {"B", "N", "D", "T", "S", "I", "M", "G", "E", "L"}; QStringList qs; qs.clear(); qs.append(_b.split('>')); if (qs.size()!= 2) { //qDebug() << "Utilities::isValidADIFField-0 (not two): " << QString::number(qs.size()) ; return false; } QString field = (qs.at(0)).right((qs.at(0)).length() - 1); QString data = (qs.at(1)).simplified(); //data = data.simplified(); QString dataType = QString(); //qDebug() << "Utilities::isValidADIFField-Field: " << field ; //qDebug() << "Utilities::isValidADIFField_Data: " << data ; int length = data.length(); int separatorPosition = 0; int i = (field).count(":"); //Check how many ":" do we have, to see if we have a data type or not if (i == 2) // We have data type { // DATE:8:D / 20141020 separatorPosition = (field.section(':', 1, 1)).toInt(); dataType = field.section(':', 2, 2); if (!validDataTypes.contains(dataType.toUpper())) { //qDebug() << "Utilities::isValidADIFField - FORMAT ERROR: Wrong data type: " << dataType ; return false; } } else if (i == 1) { // DATE:8 / 20141020 separatorPosition = (field.section(':', 1, 1)).toInt(); } else { //qDebug() << "Utilities::isValidADIFField - FORMAT ERROR, more than 2 \":\" - " << field ; return false; } if ( length != separatorPosition) { //qDebug() << "Utilities::isValidADIFField: Data Length problem: " << (field) << "/" << data << " - " << QString::number(length) << "/" << QString::number(separatorPosition) ; return false; } if (separatorPosition <= 0) { //qDebug() << "Utilities::isValidADIFField: Length problem <= 0" ; return false; } //qDebug() << "FileManager::checkADIFValidFormat: Return true" ; return true; } bool Utilities::isValidQSL_Rcvd(const QString &c) { return ((c == "Y") || (c == "N") || (c == "R") || (c == "I") || (c == "V")); } bool Utilities::isValidQSL_Sent(const QString &c) { return ((c == "Y") || (c == "N") || (c == "R") || (c == "Q") || (c == "I")); } bool Utilities::isValidUpload_Status(const QString &c) { return ((c == "Y") || (c == "N") || (c == "M")); } bool Utilities::isValidFISTS(const QString &c) { return (c.toInt ()>0); } QStringList Utilities::getValidADIFFieldAndData(const QString &_b) { //qDebug() << "Utilities::getValidADIFFieldAndData: " << _b ; /* This functions checks if the ADIF field has the proper format. Data */ QStringList result; result.clear(); if (!(_b.startsWith('<'))) { //qDebug() << "Utilities::getValidADIFFieldAndData: BAD FORMAT: No < or > delimiters: " << _b ; return QStringList(); } if (_b.simplified() == "") { //qDebug() << "Utilities::getValidADIFFieldAndData: EOR" ; result << "EOR" << "EOR"; return result; } QString aux = _b; QStringList qs; qs.clear(); if ((aux.contains("APP_LOTW_")) && aux.contains("//")) { // Trying to fix a LoTW ADIF bug qs.append(aux.split("//")); aux = qs.at(0); } //qDebug() << "Utilities::getValidADIFFieldAndData: -20" ; QStringList validDataTypes = {"B", "N", "D", "T", "S", "I", "M", "G", "E", "L"}; qs.clear(); qs.append(aux.split('>')); if (qs.size()!= 2) { //qDebug() << "Utilities::getValidADIFFieldAndData-0 (not two): " << QString::number(qs.size()) ; return result; } //qDebug() << "Utilities::getValidADIFFieldAndData: -30" ; //QString field = (qs.at(0)).right((qs.at(0)).length() - 1); QString field = (qs.at(0)).right((qs.at(0)).length() - 1); QString data = (qs.at(1)).simplified(); //data = data.simplified(); QString dataType = QString(); //qDebug() << "Utilities::getValidADIFFieldAndData-Field: " << field ; //qDebug() << "Utilities::getValidADIFFieldAndData_Data: " << data ; int length = data.length(); int separatorPosition = 0; int i = (field).count(":"); //Check how many ":" do we have, to see if we have a data type or not if (i == 2) // We have data type { // DATE:8:D / 20141020 separatorPosition = (field.section(':', 1, 1)).toInt(); dataType = field.section(':', 2, 2); //qDebug() << "Utilities::getValidADIFFieldAndData - DataType: -" << dataType << "-" ; if (!validDataTypes.contains(dataType.toUpper())) { //qDebug() << "Utilities::getValidADIFFieldAndData - FORMAT ERROR: Wrong data type: " << dataType ; return result; } } else if (i == 1) { // DATE:8 / 20141020 separatorPosition = (field.section(':', 1, 1)).toInt(); } else { //qDebug() << "Utilities::getValidADIFFieldAndData - FORMAT ERROR, more than 2 \":\" - " << field ; return result; } //qDebug() << "Utilities::getValidADIFFieldAndData: -60" ; if ( length != separatorPosition) { //qDebug() << "Utilities::getValidADIFFieldAndData: Data Length problem: " << (field) << "/" << data << " - " << QString::number(length) << "/" << QString::number(separatorPosition) ; return result; } if (separatorPosition <= 0) { //qDebug() << "Utilities::getValidADIFFieldAndData: Length problem <= 0" ; return result; } //qDebug() << "Utilities::getValidADIFFieldAndData: -90: f: " << field ; //qDebug() << "Utilities::getValidADIFFieldAndData: -90: d: " << data;ield = field.section(':', 0, 0); result.clear(); result << field.section(':', 0, 0) << data; //qDebug() << "Utilities::checkADIFValidFormat: Return true: " << result.at(0) << "/" << result.at(1) ; return result; } QString Utilities::getAValidCall (const QString &_wrongCall) { //qDebug() << "Utilities::getAValidCall: " << _wrongCall ; QString _confirmedCall; _confirmedCall.clear(); bool ok; if (_wrongCall.length() > 0) { //qDebug() << "Utilities::getAValidCall (Don't have VALID CALL): " << _wrongCall ; _confirmedCall = QString(QObject::tr("A wrong callsign has been found: %1. Please enter a new callsign or confirm that the current one is a good callsign.")).arg(_wrongCall); } else { //qDebug() << "Utilities::getAValidCall (Don't have ANY CALL): " << _wrongCall ; _confirmedCall = QString(QObject::tr("An empty callsign has been detected. If it is possible, please enter the right call.")); } QString text = QInputDialog::getText(nullptr, QObject::tr("KLog - Not valid callsign found"), _confirmedCall, QLineEdit::Normal, _wrongCall, &ok); if (!(ok && isValidCall(text))) { _confirmedCall = text; } else { _confirmedCall = QString(); } //qDebug() << "Utilities::getAValidCall: " << _confirmedCall ; return _confirmedCall; } QString Utilities::getDateTimeSQLiteStringFromDateTime(const QDateTime &_d) { return QString(_d.toString("yyyy-MM-dd hh:mm:ss")); } QString Utilities::getDateSQLiteStringFromDate(const QDate &_d) { return QString(_d.toString("yyyy-MM-dd")); } bool Utilities::isValidDateFromString(const QString &_s) { return getDateFromSQliteString(_s).isValid(); } bool Utilities::isValidTimeFromString(const QString &_s) { return getDateTimeFromSQLiteString(_s).time().isValid(); } bool Utilities::isValidDateTimeFromString(const QString &_s) { return getDateTimeFromSQLiteString(_s).isValid(); } bool Utilities::isValidDXCC(const int _d) {//TODO: Look for a better way to check, taking into account how KLog is identifiying the DXCC return (((_d > 0) && (_d < 523)) || (_d == 1206) || (_d == 1279) || (_d == 1248) || (_d == 2248) || (_d == 1259) || (_d == 1390)); } bool Utilities::isValidAntPath(const QString &_s) { return ((_s == "G") || (_s == "O") || (_s == "S") || (_s == "L")); } bool Utilities::isValidARRLSect(const QString &_s) { return (ARRL_sects.contains (_s.toUpper ())); } QDateTime Utilities::getDateTimeFromSQLiteString(const QString &_s) { return QDateTime::fromString(_s, "yyyy-MM-dd hh:mm:ss"); } QTime Utilities::getTimeFromSQLiteString(const QString &_s) { if (_s.length()==5) { return QTime::fromString(_s, "hh:mm"); } else { return QTime::fromString(_s, "hh:mm:ss"); } } QDate Utilities::getDateFromSQliteString(const QString &_s) { //It may receive "just" a date or a "date time". if (getDateTimeFromSQLiteString(_s).isValid()) // if we have received a full date time { return (getDateTimeFromSQLiteString(_s)).date(); } else // If we have received "just a date" or an error { return QDate::fromString(_s, "yyyy-MM-dd"); } } QDate Utilities::getDateFromADIFDateString(const QString &_s) {// Expects an ADIF DATE format string: "YYYYMMDD" //qDebug() << "Utilities::getDateFromADIFDateString: " << _s ; return QDate::fromString(_s, "yyyyMMdd"); } QTime Utilities::getTimeFromADIFTimeString(const QString &_s) {// Expects and ADIF TIME format String "HHMMSS" or "HHMM" //qDebug() << "Utilities::getTimeFromADIFTimeString: " << _s ; if (_s.length()==4) { return QTime::fromString(_s, "hhmm"); } else { return QTime::fromString(_s, "hhmmss"); } } QDate Utilities::getDateFromLoTWQSLDateString(const QString &_s) { //qDebug() << "Utilities::getDateFromLoTWQSLDateString: " << _s ; QStringList datet; datet.clear(); if (_s.endsWith ('Z')) { datet << _s.split("T"); } else { datet << _s.split(" "); } //qDebug() << "Utilities::getDateFromLoTWQSLDateString: " << datet.at(0) ; return QDate::fromString(datet.at(0), "yyyy-MM-dd"); } QString Utilities::getADIFDateFromQDateTime(const QDateTime &_d) { if (!_d.isValid()) { return QString(); } else { return _d.date().toString("yyyyMMdd"); } } QString Utilities::getADIFDateFromQDate(const QDate &_d) { if (!_d.isValid()) { return QString(); } else { return _d.toString("yyyyMMdd"); } } QString Utilities::getADIFTimeFromQDateTime(const QDateTime &_d) { if (!_d.isValid()) { return QString(); } else { return _d.time().toString("hhmmss"); } } QString Utilities::getCabrilloDateFromQDate(const QDate &_d) {// Will produce the Cabrillo DATE format: "YYYY-MM-DD" if (!_d.isValid()) { return QString("0000-00-00"); } else { return _d.toString("yyyy-MM-dd"); } } QString Utilities::getCabrilloTimeFromQDateTime(const QDateTime &_d) {// Will produce the Cabrillo TIME format: "HHMM" if (!_d.isValid()) { return QString("0000"); } else { return _d.time().toString("hhmm"); } } QString Utilities::getOnlineServiceName(OnLineProvider _service) {//enum OnLineProvider {ClubLog, LoTW, eQSL, QRZ}; //, HamQTH, HRDLog switch (_service) { case LoTW: { return "LoTW"; } case ClubLog: { return "ClubLog"; } case QRZ: { return "QRZ.com"; } case eQSL: { return "eQSL.cc"; } } return QString(); } QString Utilities::getClearSQLi(QString _s) { return _s.remove ('\''); } //void Utilities::setDarkMode(const QString &_dm) //{ // darkMode = trueOrFalse(_dm); //} //bool Utilities::isDarkMode() //{ // return darkMode; //} void Utilities::setLogColumnNames() { // QMap columnNames; columnNames.insert("qso_date", QObject::tr("Date")); columnNames.insert("call", QObject::tr("Call")); columnNames.insert("rst_sent", QObject::tr("RSTtx")); columnNames.insert("rst_rcvd", QObject::tr("RSTrx")); columnNames.insert("bandid", QObject::tr("Band")); columnNames.insert("comment", QObject::tr("Comment")); columnNames.insert("modeid", QObject::tr("Mode")); columnNames.insert("cqz", QObject::tr("CQz")); columnNames.insert("ituz", QObject::tr("ITUz")); columnNames.insert("dxcc", QObject::tr("DXCC")); columnNames.insert("address", QObject::tr("Address")); columnNames.insert("age", QObject::tr("Age")); columnNames.insert("cnty", QObject::tr("County")); columnNames.insert("a_index", QObject::tr("A_Index")); columnNames.insert("ant_az", QObject::tr("Ant_Az")); columnNames.insert("ant_el", QObject::tr("Ant_El")); columnNames.insert("ant_path", QObject::tr("Ant_Path")); columnNames.insert("arrl_sect", QObject::tr("ARRL_SECT")); columnNames.insert("award_submitted", QObject::tr("Award_Submitted")); columnNames.insert("award_granted", QObject::tr("Award_granted")); columnNames.insert("band_rx", QObject::tr("Band_RX")); columnNames.insert("checkcontest", QObject::tr("CheckContest")); columnNames.insert("class", QObject::tr("Class")); columnNames.insert("clublog_qso_upload_date", QObject::tr("ClubLog SDate")); columnNames.insert("clublog_qso_upload_status", QObject::tr("ClubLog status")); columnNames.insert("cont", QObject::tr("Continent")); columnNames.insert("contacted_op", QObject::tr("Contacted_Op")); columnNames.insert("contest_id", QObject::tr("Contest Id")); columnNames.insert("country", QObject::tr("Country")); columnNames.insert("credit_submitted", QObject::tr("Credit Submitted")); columnNames.insert("credit_granted", QObject::tr("Credit granted")); columnNames.insert("dark_dok", QObject::tr("Dark Dok", "Do not translate if unsure, common hamradio term.")); columnNames.insert("distance", QObject::tr("Distance")); columnNames.insert("email", QObject::tr("Email")); columnNames.insert("eq_call", QObject::tr("EQ_Call")); columnNames.insert("eqsl_qslrdate", QObject::tr("eQSL RDate")); columnNames.insert("eqsl_qslsdate", QObject::tr("eQSL SDate")); columnNames.insert("eqsl_qsl_rcvd", QObject::tr("eQSL Rcvd")); columnNames.insert("eqsl_qsl_sent", QObject::tr("eQSL Sent")); columnNames.insert("fists", QObject::tr("Fists", "Do not translate if unsure, common hamradio term.")); columnNames.insert("fists_cc", QObject::tr("Fists CC", "Do not translate if unsure, common hamradio term.")); columnNames.insert("force_init", QObject::tr("Force Init")); columnNames.insert("freq", QObject::tr("Freq")); columnNames.insert("freq_rx", QObject::tr("Freq RX")); columnNames.insert("gridsquare", QObject::tr("Gridsquare")); columnNames.insert("hrdlog_qso_upload_date", QObject::tr("HRDLog SDate")); columnNames.insert("hrdlog_qso_upload_status", QObject::tr("HRDLog status")); columnNames.insert("iota", QObject::tr("IOTA")); columnNames.insert("iota_island_id", QObject::tr("IOTA Island id")); columnNames.insert("k_index", QObject::tr("K Index")); columnNames.insert("lat", QObject::tr("Lat")); columnNames.insert("lon", QObject::tr("Lon")); columnNames.insert("lotw_qslrdate", QObject::tr("LoTW RDate")); columnNames.insert("lotw_qslsdate", QObject::tr("LoTW SDate")); columnNames.insert("lotw_qsl_rcvd", QObject::tr("LoTW Rcvd")); columnNames.insert("lotw_qsl_sent", QObject::tr("LoTW Sent")); columnNames.insert("max_bursts", QObject::tr("Max Bursts")); columnNames.insert("ms_shower", QObject::tr("MS Shower")); columnNames.insert("my_antenna", QObject::tr("My Antenna")); columnNames.insert("my_city", QObject::tr("My City")); columnNames.insert("my_cnty", QObject::tr("My Cnty")); columnNames.insert("my_country", QObject::tr("My Country")); columnNames.insert("my_cq_zone", QObject::tr("My CQz")); columnNames.insert("my_dxcc", QObject::tr("My DXCC")); columnNames.insert("my_fists", QObject::tr("My Fists", "Do not translate if unsure, common hamradio term.")); columnNames.insert("my_gridsquare", QObject::tr("My Gridsquare")); columnNames.insert("my_iota", QObject::tr("My IOTA")); columnNames.insert("my_iota_island_id", QObject::tr("My IOTA island id")); columnNames.insert("my_itu_zone", QObject::tr("My ITUz")); columnNames.insert("my_lat", QObject::tr("My Lat")); columnNames.insert("my_lon", QObject::tr("My Lon")); columnNames.insert("my_name", QObject::tr("My Name")); columnNames.insert("my_postal_code", QObject::tr("My Postal code")); columnNames.insert("my_rig", QObject::tr("My Rig")); columnNames.insert("my_sig", QObject::tr("My Sig")); columnNames.insert("my_sig_info", QObject::tr("My Sig Info")); columnNames.insert("my_sota_ref", QObject::tr("My SOTA ref")); columnNames.insert("my_state", QObject::tr("My State")); columnNames.insert("my_street", QObject::tr("My Street")); columnNames.insert("my_usaca_counties", QObject::tr("My USACA counties")); columnNames.insert("my_vucc_grids", QObject::tr("My VUCC grids")); columnNames.insert("name", QObject::tr("Name")); columnNames.insert("notes", QObject::tr("Notes")); columnNames.insert("nr_bursts", QObject::tr("Nr bursts", "Do not translate if unsure, common hamradio term.")); columnNames.insert("nr_pings", QObject::tr("Nr pings", "Do not translate if unsure, common hamradio term.")); columnNames.insert("operator", QObject::tr("Operator")); columnNames.insert("owner_callsign", QObject::tr("Owner Callsign")); columnNames.insert("pfx", QObject::tr("Pfx")); columnNames.insert("precedence", QObject::tr("Precedence")); columnNames.insert("prop_mode", QObject::tr("Prop Mode")); columnNames.insert("public_key", QObject::tr("Public Key")); columnNames.insert("qrzcom_qso_upload_date", QObject::tr("QRZcom SDate")); columnNames.insert("qrzcom_qso_upload_status", QObject::tr("QRZcom status")); columnNames.insert("qslmsg", QObject::tr("QSL msg")); columnNames.insert("qslrdate", QObject::tr("QSL RDate")); columnNames.insert("qslsdate", QObject::tr("QSL SDate")); columnNames.insert("qsl_rcvd", QObject::tr("QSL Rcvd")); columnNames.insert("qsl_sent", QObject::tr("QSL Sent")); columnNames.insert("qsl_rcvd_via", QObject::tr("QSL rcvd via")); columnNames.insert("qsl_sent_via", QObject::tr("QSL sent via")); columnNames.insert("qsl_via", QObject::tr("QSL via")); columnNames.insert("qso_complete", QObject::tr("QSO complete")); columnNames.insert("qso_random", QObject::tr("QSO random")); columnNames.insert("qth", QObject::tr("QTH")); columnNames.insert("region", QObject::tr("Region")); columnNames.insert("rig", QObject::tr("Rig")); columnNames.insert("rx_pwr", QObject::tr("RX Pwr")); columnNames.insert("sat_mode", QObject::tr("Sat mode")); columnNames.insert("sat_name", QObject::tr("Sat name")); columnNames.insert("sfi", QObject::tr("SFI")); columnNames.insert("sig", QObject::tr("Sig")); columnNames.insert("sig_info", QObject::tr("Sig Info")); columnNames.insert("silent_key", QObject::tr("Silent key", "Do not translate if unsure, common hamradio term.")); columnNames.insert("skcc", QObject::tr("SKCC")); columnNames.insert("sota_ref", QObject::tr("SOTA Ref")); columnNames.insert("srx_string", QObject::tr("SRX String")); columnNames.insert("srx", QObject::tr("SRX")); columnNames.insert("stx_string", QObject::tr("STX String")); columnNames.insert("state", QObject::tr("State")); columnNames.insert("station_callsign", QObject::tr("Station Callsign")); columnNames.insert("submode", QObject::tr("Submode")); columnNames.insert("swl", QObject::tr("SWL", "Do not translate if unsure, common hamradio term.")); columnNames.insert("uksmg", QObject::tr("UKSMG")); columnNames.insert("usaca_counties", QObject::tr("USACA counties")); columnNames.insert("ve_prov", QObject::tr("VE prov")); columnNames.insert("vucc_grids", QObject::tr("VUCC grids")); columnNames.insert("ten_ten", QObject::tr("Ten-Ten", "Do not translate, it is a hamradio group name.")); columnNames.insert("tx_pwr", QObject::tr("TX Pwr")); columnNames.insert("web", QObject::tr("Web")); columnNames.insert("qso_date_off", QObject::tr("QSO Date off")); columnNames.insert("lognumber", QObject::tr("Log number")); } QString Utilities::getLogColumnName(const QString &_column) { //qDebug() << QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName) << ": " << _column; QString aux; aux = columnNames.value(_column); if (aux.length()>0) { return aux; } return _column; /* if (_column == "qso_date") return QObject::tr("Date"); else if (_column == "call") return QObject::tr("Call"); else if (_column == "rst_sent") return QObject::tr("RSTtx"); else if (_column == "rst_rcvd") return QObject::tr("RSTrx"); else if (_column == "bandid") return QObject::tr("Band"); else if (_column == "comment") return QObject::tr("Comment"); else if (_column == "modeid") return QObject::tr("Mode"); else if (_column == "cqz") return QObject::tr("CQz"); else if (_column == "ituz") return QObject::tr("ITUz"); else if (_column == "dxcc") return QObject::tr("DXCC"); else if (_column == "address") return QObject::tr("Address"); else if (_column == "age") return QObject::tr("Age"); else if (_column == "cnty") return QObject::tr("County"); else if (_column == "a_index") return QObject::tr("A_Index"); else if (_column == "ant_az") return QObject::tr("Ant_Az"); else if (_column == "ant_el") return QObject::tr("Ant_El"); else if (_column == "ant_path") return QObject::tr("Ant_Path"); else if (_column == "arrl_sect") return QObject::tr("ARRL_SECT"); else if (_column == "award_submitted") return QObject::tr("Award_Submitted"); else if (_column == "award_granted") return QObject::tr("Award_granted"); else if (_column == "band_rx") return QObject::tr("Band_RX"); else if (_column == "checkcontest") return QObject::tr("CheckContest"); else if (_column == "class") return QObject::tr("Class"); else if (_column == "clublog_qso_upload_date") return QObject::tr("ClubLog SDate"); else if (_column == "clublog_qso_upload_staus") return QObject::tr("ClubLog status"); else if (_column == "cont") return QObject::tr("Continent"); else if (_column == "contacted_op") return QObject::tr("Contacted Op"); else if (_column == "contest_id") return QObject::tr("Contest Id"); else if (_column == "country") return QObject::tr("Country"); else if (_column == "credit_submitted") return QObject::tr("Credit Submitted"); else if (_column == "credit_granted") return QObject::tr("Credit granted"); else if (_column == "dark_dok") return QObject::tr("Dark Dok", "Do not translate if unsure, common hamradio term."); else if (_column == "distance") return QObject::tr("Distance"); else if (_column == "email") return QObject::tr("Email"); else if (_column == "eq_call") return QObject::tr("EQ_Call"); else if (_column == "eqsl_qslrdate") return QObject::tr("eQSL RDate"); else if (_column == "eqsl_qslsdate") return QObject::tr("eQSL SDate"); else if (_column == "eqsl_qsl_rcvd") return QObject::tr("eQSL Rcvd"); else if (_column == "eqsl_qsl_sent") return QObject::tr("eQSL Sent"); else if (_column == "fists") return QObject::tr("Fists", "Do not translate if unsure, common hamradio term."); else if (_column == "fists_cc") return QObject::tr("Fists CC", "Do not translate if unsure, common hamradio term."); else if (_column == "force_init") return QObject::tr("Force Init"); else if (_column == "freq") return QObject::tr("Freq"); else if (_column == "freq_rx") return QObject::tr("Freq RX"); else if (_column == "gridsquare") return QObject::tr("Gridsquare"); else if (_column == "hrdlog_qso_upload_date") return QObject::tr("HRDLog SDate"); else if (_column == "hrdlog_qso_upload_status") return QObject::tr("HRDLog status"); else if (_column == "iota") return QObject::tr("IOTA"); else if (_column == "iota_island_id") return QObject::tr("IOTA Island id"); else if (_column == "k_index") return QObject::tr("K Index"); else if (_column == "lat") return QObject::tr("Lat"); else if (_column == "lon") return QObject::tr("Lon"); else if (_column == "lotw_qslrdate") return QObject::tr("LoTW RDate"); else if (_column == "lotw_qslsdate") return QObject::tr("LoTW SDate"); else if (_column == "lotw_qsl_rcvd") return QObject::tr("LoTW Rcvd"); else if (_column == "lotw_qsl_sent") return QObject::tr("LoTW Sent"); else if (_column == "max_bursts") return QObject::tr("Max Bursts"); else if (_column == "ms_shower") return QObject::tr("MS Shower"); else if (_column == "my_antenna") return QObject::tr("My Antenna"); else if (_column == "my_city") return QObject::tr("My City"); else if (_column == "my_cnty") return QObject::tr("My Cnty"); else if (_column == "my_country") return QObject::tr("My Country"); else if (_column == "my_cq_zone") return QObject::tr("My CQz"); else if (_column == "my_dxcc") return QObject::tr("My DXCC"); else if (_column == "my_fists") return QObject::tr("My Fists", "Do not translate if unsure, common hamradio term."); else if (_column == "my_gridsquare") return QObject::tr("My Gridsquare"); else if (_column == "my_iota") return QObject::tr("My IOTA"); else if (_column == "my_iota_island_id") return QObject::tr("My IOTA island id"); else if (_column == "my_itu_zone") return QObject::tr("My ITUz"); else if (_column == "my_lat") return QObject::tr("My Lat"); else if (_column == "my_lon") return QObject::tr("My Lon"); else if (_column == "my_name") return QObject::tr("My Name"); else if (_column == "my_postal_code") return QObject::tr("My Postal code"); else if (_column == "my_rig") return QObject::tr("My Rig"); else if (_column == "my_sig") return QObject::tr("My Sig"); else if (_column == "my_sig_info") return QObject::tr("My Sig Info"); else if (_column == "my_sota_ref") return QObject::tr("My SOTA ref"); else if (_column == "my_state") return QObject::tr("My State"); else if (_column == "my_street") return QObject::tr("My Street"); else if (_column == "my_usaca_counties") return QObject::tr("My USACA counties"); else if (_column == "my_vucc_grids") return QObject::tr("My VUCC grids"); else if (_column == "name") return QObject::tr("Name"); else if (_column == "notes") return QObject::tr("Notes"); else if (_column == "nr_bursts") return QObject::tr("Nr bursts", "Do not translate if unsure, common hamradio term."); else if (_column == "nr_pings") return QObject::tr("Nr pings", "Do not translate if unsure, common hamradio term."); else if (_column == "operator") return QObject::tr("Operator"); else if (_column == "owner_callsign") return QObject::tr("Owner Callsign"); else if (_column == "pfx") return QObject::tr("Pfx"); else if (_column == "precedence") return QObject::tr("Precedence"); else if (_column == "prop_mode") return QObject::tr("Prop Mode"); else if (_column == "public_key") return QObject::tr("Public Key"); else if (_column == "qrzcom_qso_upload_date") return QObject::tr("QRZcom SDate"); else if (_column == "qrzcom_qso_upload_status") return QObject::tr("QRZcom status"); else if (_column == "qslmsg") return QObject::tr("QSL msg"); else if (_column == "qslrdate") return QObject::tr("QSL RDate"); else if (_column == "qslsdate") return QObject::tr("QSL SDate"); else if (_column == "qsl_rcvd") return QObject::tr("QSL Rcvd"); else if (_column == "qsl_sent") return QObject::tr("QSL Sent"); else if (_column == "qsl_rcvd_via") return QObject::tr("QSL rcvd via"); else if (_column == "qsl_sent_via") return QObject::tr("QSL sent via"); else if (_column == "qsl_via") return QObject::tr("QSL via"); else if (_column == "qso_complete") return QObject::tr("QSO complete"); else if (_column == "qso_random") return QObject::tr("QSO random"); else if (_column == "qth") return QObject::tr("QTH"); else if (_column == "region") return QObject::tr("Region"); else if (_column == "rig") return QObject::tr("Rig"); else if (_column == "rx_pwr") return QObject::tr("RX Pwr"); else if (_column == "sat_mode") return QObject::tr("Sat mode"); else if (_column == "sat_name") return QObject::tr("Sat name"); else if (_column == "sfi") return QObject::tr("SFI"); else if (_column == "sig") return QObject::tr("Sig"); else if (_column == "sig_info") return QObject::tr("Sig Info"); else if (_column == "silent_key") return QObject::tr("Silent key", "Do not translate if unsure, common hamradio term."); else if (_column == "skcc") return QObject::tr("SKCC"); else if (_column == "sota_ref") return QObject::tr("SOTA Ref"); else if (_column == "srx_string") return QObject::tr("SRX String"); else if (_column == "srx") return QObject::tr("SRX"); else if (_column == "stx_string") return QObject::tr("STX String"); else if (_column == "state") return QObject::tr("State"); else if (_column == "station_callsign") return QObject::tr("Station Callsign"); else if (_column == "submode") return QObject::tr("Submode"); else if (_column == "swl") return QObject::tr("SWL", "Do not translate if unsure, common hamradio term."); else if (_column == "uksmg") return QObject::tr("UKSMG"); else if (_column == "usaca_counties") return QObject::tr("USACA counties"); else if (_column == "ve_prov") return QObject::tr("VE prov"); else if (_column == "vucc_grids") return QObject::tr("VUCC grids"); else if (_column == "ten_ten") return QObject::tr("Ten-Ten", "Do not translate, it is a hamradio group name."); else if (_column == "tx_pwr") return QObject::tr("TX Pwr"); else if (_column == "web") return QObject::tr("Web"); else if (_column == "qso_date_off") return QObject::tr("QSO Date off"); else if (_column == "lognumber") return QObject::tr("Log number"); else { return _column; } */ } bool Utilities::isValidContinent(const QString &_s) { return (continent.contains (_s.toUpper ())); } bool Utilities::isValidPropMode(const QString &_s) { QStringList propModes; propModes.clear (); propModes << "AS" << "AUE" << "AUR" << "BS" << "ECH" << "EME" << "ES" << "F2" << "FAI" << "GWAVE" << "INTERNET" << "ION" << "IRL" << "LOS" << "MS" << "RPT" << "RS" << "SAT" << "TEP" << "TR"; return propModes.contains (_s.toUpper ()); } bool Utilities::isValidDistance(const double _d) { return (_d>=0); } bool Utilities::isValidSponsor(const QString &_s) { return (sponsorsList.contains (_s.toUpper ())); } void Utilities::openQrzcom(const QString _call) { QString url = "https://www.qrz.com/lookup/" + _call; QDesktopServices::openUrl(QUrl(url)); } void Utilities::printCommandHelp(){ cout << "Usage: klog [OPTION]...\n"; cout << "Options:\n"; cout << " -? Display this help\n"; cout << " -h Display this help\n"; cout << " -v Display program version\n"; } QString Utilities::debugLevelToString(DebugLogLevel _l) { switch (_l) { case None: return "None"; break; case Info: return "Info"; break; case Debug: return "Debug"; break; case Devel: return "Devel"; break; default: return "Undefined"; break; } } DebugLogLevel Utilities::stringToDebugLevel(const QString &_s) { QString aux; aux = _s.toUpper(); if (aux == "INFO") return Info; else if (aux == "DEBUG") return Debug; else if (aux == "DEVEL") return Devel; else return None; } bool Utilities::isValidLogLevel(const QString &_s) { return logLevels.contains (_s); } QStringList Utilities::getDebugLevels() { return logLevels; } void Utilities::logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level) { emit debugLog (_func, _msg, _level); /* //qDebug() << QString("%1-%2").arg(Q_FUNC_INFO).arg(parentName) << _func << ": " << _level << ": " << _msg; if (logLevel<=_level) { //qDebug() << _func << ": " << _level << ": " << _msg; emit debugLog (_func, _msg, _level); } */ } klog-2.3.3/database.cpp0000644000015700001710000107125614542412415014621 0ustar jenkinsjenkins/*************************************************************************** database.cpp - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "database.h" //#include DataBase::DataBase(const QString &_parentClass, const QString &_DBName) { Q_UNUSED(_parentClass); //qDebug() << "DataBase::DataBase: PLAIN: " << _parentClass << " / Name = " << _DBName ; logLevel = None; constrid = 1; created = false; util = new Utilities(Q_FUNC_INFO); softVersion = util->getVersion(); dbName = _DBName; //connect(this, SIGNAL(debugLog(QString, QString, int)), this, SLOT(slotPrintErrors(QString, QString, int)) ); //qDebug() << "DataBase::DataBase1: dbName: " << dbName ; //db = QSqlDatabase::database(); dbVersion = DBVersionf; createConnection(QString(Q_FUNC_INFO)+"1"); //qDebug() << "DataBase::DataBase: PLAIN - connection Name: " << dbConnectionName ; //qDebug() << "DataBase::DataBase: PLAIN - DB Name: " << db.databaseName() ; insertPreparedQueries.clear(); insertQueryFields.clear(); //qDebug() << "DataBase::DataBase: PLAIN: - END" ; } DataBase::DataBase(const QString &_parentClass, const QString &_softVersion, const QString &_DBName) { Q_UNUSED(_parentClass); //qDebug() << "DataBase::DataBase2: " << _parentClass << "/" << _softVersion << " / Name = " << _DBName ; //TODO: Sometimes the DB is created without the proper calling (without passing softVersion) logLevel = None; constrid = 2; created = false; dbVersion = DBVersionf; softVersion = _softVersion; //inMemoryOnly = inmemoryonly; latestReaded = 0.0f; util = new Utilities(Q_FUNC_INFO); util->setVersion(softVersion); dbName = _DBName; if (util->getVersionDouble()>0) { createConnection(QString(Q_FUNC_INFO)+"2"); } //qDebug() << "DataBase::DataBase: - connection Name: " << dbConnectionName ; //qDebug() << "DataBase::DataBase: - DB Name: " << db.databaseName() ; insertPreparedQueries.clear(); insertQueryFields.clear(); //qDebug() << "DataBase::DataBase2: END" ; } DataBase::~DataBase() { logEvent(Q_FUNC_INFO, "Start", Debug); delete(util); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "DataBase::~DataBase" ; } QString DataBase::getSoftVersion() { logEvent(Q_FUNC_INFO, "Start", Debug); QSqlQuery query; QString stringQuery ("SELECT MAX (softversion) FROM softwarecontrol"); bool sqlOK = query.exec(stringQuery); if (sqlOK) { query.next(); if (query.isValid()) { logEvent(Q_FUNC_INFO, "END-1", Debug); return (query.value(0)).toString(); } else { query.finish(); logEvent(Q_FUNC_INFO, "END-2", Debug); return QString(); } } else { //ERROR in Query execution queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); logEvent(Q_FUNC_INFO, "END-3", Debug); return QString(); } } QString DataBase::getDBVersion() { logEvent(Q_FUNC_INFO, "Start", Debug); QSqlQuery query; QString stringQuery ("SELECT MAX (dbversion) FROM softwarecontrol"); bool sqlOK = query.exec(stringQuery); if (sqlOK) { query.next(); if (query.isValid()) { logEvent(Q_FUNC_INFO, "END-1", Debug); return QString::number((query.value(0)).toDouble(), 'f', 3); } else { query.finish(); logEvent(Q_FUNC_INFO, "END-2", Debug); return QString(); } } else { //ERROR in Query execution queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); logEvent(Q_FUNC_INFO, "END-3", Debug); return QString(); } } /* bool DataBase::setDir(const QString &_dir) { dbDir = _dir; return true; } */ QString DataBase::getDBName() { logEvent(Q_FUNC_INFO, "Start-EndEND", Debug); return db.databaseName(); } QStringList DataBase::getColumnNamesFromTable(const QString &_tableName) { logEvent(Q_FUNC_INFO, "Start", Debug); QSqlQuery query; QString queryString = "PRAGMA table_info(:table)"; query.prepare(queryString); query.bindValue(":table", _tableName); bool sqlOK = query.exec(); QStringList list; if (sqlOK) { while (query.next()) { QString columnName = query.value(1).toString(); if (!columnName.isEmpty() && columnName.toUpper() != "ID") { list << columnName; } } } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } query.finish(); logEvent(Q_FUNC_INFO, "END", Debug); return list; } void DataBase::compress() { logEvent(Q_FUNC_INFO, "Start", Debug); //QSqlDatabase db = QSqlDatabase::database(); if (!db.open()) { /* Flawfinder: ignore */ QMessageBox::warning(nullptr, QObject::tr("Database Error"), db.lastError().text()); } else { db.exec("VACUUM;"); } logEvent(Q_FUNC_INFO, "END", Debug); } bool DataBase::reConnect(const QString &_DBName) { logEvent(Q_FUNC_INFO, "Start", Debug); db.close(); dbName = _DBName; //qDebug() << "DataBase::reConnect: DB closed" ; //qDebug() << "DataBase::reConnect: DB: " << dbDir ; bool sqlOK = createConnection(Q_FUNC_INFO); if (!sqlOK) { // emit debugLog(Q_FUNC_INFO, "1", 7); } logEvent(Q_FUNC_INFO, "END", Debug); return sqlOK; } bool DataBase::createConnection(const QString &function, bool newDB) { //qDebug() << "DataBase::createConnection: " << function << "-" << QString::number(dbVersion) << "/" << softVersion ; logEvent(Q_FUNC_INFO, "Start", Debug); Q_UNUSED(function); Q_UNUSED(newDB); QString stringQuery; QSqlQuery query; if (!db.isOpen()) { //qDebug() << "DataBase::createConnection: DB NOT Opened" ; if (!db.isValid()) { //qDebug() << "DataBase::createConnection: DB is not valid, let's call addDataBase" ; if (!db.isOpen()) { //qDebug() << "DataBase::createConnection: DB is NOT open, let's open: connection name" << db.connectionName(); QSqlDatabase::removeDatabase("qt_sql_default_connection"); db = QSqlDatabase::addDatabase("QSQLITE"); } //qDebug() << "DataBase::createConnection: Now we call setDatabaseName" ; db.setDatabaseName(dbName); //qDebug() << "DataBase::createConnection: end of not valid" ; } //qDebug() << "DataBase::createConnection: end of valid check, let's try if it is open" ; if (!db.open()) /* Flawfinder: ignore */ { //qDebug() << "DataBase::createConnection:Not open " ; QMessageBox::warning(nullptr, QObject::tr("Database Error"), db.lastError().text()); //qDebug() << "DataBase::createConnection: DB creation ERROR" ; // emit debugLog(Q_FUNC_INFO, "1", 7); logEvent(Q_FUNC_INFO, "END-1", Debug); return false; } else { //qDebug() << "DataBase::createConnection: created and opened after the creation" ; if (!isTheDBCreated()) { //qDebug() << "DataBase::createConnection: DB is still not created" ; if (!createDataBase()) { //qDebug() << "DataBase::createConnection: DB creation failed!!" ; logEvent(Q_FUNC_INFO, "END-2", Debug); return false; } //qDebug() << "DataBase::createConnection: After creation" ; stringQuery ="PRAGMA main.page_size = 4096;"; query.exec(stringQuery); stringQuery ="PRAGMA main.cache_size=10000;"; query.exec(stringQuery); stringQuery ="PRAGMA main.locking_mode=EXCLUSIVE;"; query.exec(stringQuery); stringQuery ="PRAGMA main.synchronous=NORMAL;"; query.exec(stringQuery); stringQuery ="PRAGMA main.journal_mode=WAL;"; query.exec(stringQuery); stringQuery ="PRAGMA main.cache_size=5000;"; query.exec(stringQuery); stringQuery ="PRAGMA synchronous=OFF;"; query.exec(stringQuery); stringQuery ="PRAGMA main.temp_store = MEMORY;"; query.exec(stringQuery); //stringQuery="PRAGMA auto_vacuum = FULL;"; //query.exec(stringQuery); stringQuery ="PRAGMA case_sensitive_like=OFF;"; query.exec(stringQuery); } } } else { //qDebug() << "DataBase::createConnection: No Error, DB is open"; } //qDebug() << "DataBase::createConnection: Going to run - createBandModeMaps " ; if (!createBandModeMaps()) { //qDebug() << "DataBase::createConnection: createBandModeMaps false Stop"; logEvent(Q_FUNC_INFO, "END-3", Debug); return false; } //qDebug() << "DataBase::createConnection -------------------------------------------- END" ; logEvent(Q_FUNC_INFO, "END", Debug); return unMarkAllQSO(); } bool DataBase::isTheDBCreated() { //qDebug() << "DataBase::isTheDBCreated: Called from: " << QString::number(constrid) ; logEvent(Q_FUNC_INFO, "Start", Debug); QSqlQuery query; int _num = 0; //QString stringQuery ("SELECT name FROM sqlite_sequence WHERE name='softwarecontrol'"); QString stringQuery ("SELECT count(id) FROM softwarecontrol"); bool sqlOK = query.exec(stringQuery); if (sqlOK) { //qDebug() << "DataBase::isTheDBCreated - SQL OK" ; query.next(); if (query.isValid()) { //qDebug() << "DataBase::isTheDBCreated - valid" ; _num = (query.value(0)).toInt(); if (_num > 0) { //qDebug() << "DataBase::isTheDBCreated - DB Exists" ; //qDebug() << "DataBase::isTheDBCreated: ------------------------------------------------- END TRUE" ; query.finish(); logEvent(Q_FUNC_INFO, "END-1", Debug); return true; } else { //qDebug() << "DataBase::isTheDBCreated - DB does not Exist" ; //qDebug() << "DataBase::isTheDBCreated: ------------------------------------------------- END FALSE-1" ; query.finish(); // emit debugLog(Q_FUNC_INFO, "1", 7); logEvent(Q_FUNC_INFO, "END-2", Debug); return false; } } else { //qDebug() << "DataBase::isTheDBCreated - not valid" ; //qDebug() << "DataBase::isTheDBCreated: ------------------------------------------------- END FALSE-2" ; query.finish(); logEvent(Q_FUNC_INFO, "END-3", Debug); return false; } } else { //ERROR in Query execution //qDebug() << "DataBase::isTheDBCreated: ------------------------------------------------ ERROR IN QUERY EXECUTION" ; queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); logEvent(Q_FUNC_INFO, "END-4", Debug); return false; } } bool DataBase::recreateTableLog() { logEvent(Q_FUNC_INFO, "Start", Debug); if (!createTableLog(false)) // Create modetemp { //qDebug() << "DataBase::recreateTableLog: CreateTableLog returned false" ; logEvent(Q_FUNC_INFO, "END-1", Debug); return false; } QString queryString; queryString.clear(); QStringList columns; columns.clear(); columns << getColumnNamesFromTable("log"); queryString = columns.first(); for (int i=1;i TMP data table to operate and be deleted afterwards //qDebug() << "DataBase::createTableSubdivisions" ; QString stringQuery = QString(); QString table = QString(); if (NoTmp) { table = "primary_subdivisions" ; } else { table = "primary_subdivisionstemp" ; } stringQuery = "CREATE TABLE "+ table; stringQuery = stringQuery + QString(" (id INTEGER PRIMARY KEY AUTOINCREMENT, " "dxcc INTEGER NOT NULL, " "name VARCHAR NOT NULL, " "shortname VARCHAR NOT NULL, " "prefix VARCHAR, " "cqz INTEGER NOT NULL, " "ituz INTEGER NOT NULL, " "regionalgroup VARCHAR, " "regionalid INTEGER, " "start_date DATETIME, " "end_date DATETIME, " "deleted VARCHAR, " "UNIQUE (id, shortname, name), " "FOREIGN KEY (cqz) REFERENCES entity, " "FOREIGN KEY (ituz) REFERENCES entity, " "FOREIGN KEY (dxcc) REFERENCES entity)"); QString delS = QString(); delS = "DROP TABLE IF exists " + table; execQuery(Q_FUNC_INFO, delS); //qDebug() << "DataBase::createTableSubdivision - END" ; return execQuery(Q_FUNC_INFO, stringQuery); //qDebug() << "DataBase::createTableSubdivision - END" ; } int DataBase::getBandIdFromName(const QString &b) { //qDebug() << "DataBase::getBandIdFromName: " << b ; QString band = b.toUpper(); QSqlQuery query; if (isValidBand(band)) { QString queryString = QString("SELECT id FROM band WHERE name='%1'").arg(band); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if ( query.isValid() ) { //qDebug() << "DataBase::getBandIdFromName: OK" << QString::number((query.value(0)).toInt()) ; int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataBase::getBandIdFromName: NOK 1" ; query.finish(); return -1; } } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -2; } //qDebug() << "DataBase::getBandIdFromName: NOK 3" ; } else { //qDebug() << "DataBase::getBandIdFromName: BAND NOT VALID: " << band ; } //qDebug() << "DataBase::getBandIdFromName: Will return -3 from: " << band ; query.finish(); return -3; } int DataBase::getModeIdFromName(const QString &b) { //qDebug() << "DataBase::getModeIdFromName: " << b ; QSqlQuery query; if (isValidMode(b, false)) { QString queryString = QString("SELECT id FROM mode WHERE name='%1'").arg(b); //qDebug() << "DataBase::getModeIdFromName: queryString: " << queryString ; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if ( query.isValid() ) { //qDebug() << "DataBase::getModeIdFromName: OK" << QString::number((query.value(0)).toInt()) ; return (query.value(0)).toInt(); } else { //qDebug() << "DataBase::getModeIdFromName: NOK 1" ; query.finish(); return -1; } } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); } } //qDebug() << "DataBase::getModeIdFromName: NOK 3" ; query.finish(); return -1; } int DataBase::getModeIdFromSubMode(const QString &b) { //qDebug() << "DataBase::getModeIdFromSubMode: " << b ; QSqlQuery query; QString queryString = QString("SELECT id FROM mode WHERE submode='%1'").arg(b); /* if (_tmp) { queryString = QString("SELECT id FROM modetemp WHERE submode='%1'").arg(b); } else { queryString = QString("SELECT id FROM mode WHERE submode='%1'").arg(b); } */ bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataBase::getModeIdFromName: OK - Mode: " << b << " - " << (query.value(0)).toString() ; return (query.value(0)).toInt(); } else { //qDebug() << "DataBase::getModeIdFromName: NOK 1" << "-------- END"; query.finish(); return -1; } } else { //qDebug() << "DataBase::getModeIdFromName: NOK 2" << "-------- END"; queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } //qDebug() << "DataBase::getModeIdFromName: NOK 3" << "-------- END"; //query.finish(); //return -1; } QString DataBase::getBandNameFromNumber(const int _n) { //qDebug() << "DataBase::getBandNameFromNumber: " << QString::number(_n) ; QSqlQuery query; QString queryString = QString("SELECT name FROM band WHERE id='%1'").arg(_n); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if ( query.isValid() ) { if ( isValidBand((query.value(0)).toString()) ) { //qDebug() << "DataBase::getBandNameFromNumber: " << (query.value(0)).toString() << "-------- END" ; return (query.value(0)).toString(); } else { //qDebug() << "DataBase::getBandNameFromNumber: " << "-------- END-1" ; query.finish(); return QString(); } } else { //qDebug() << "DataBase::getBandNameFromNumber: " << "-------- END-2" ; query.finish(); return QString(); } } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } query.finish(); return QString(); } QString DataBase::getModeNameFromNumber(const int _n, bool _tmp) { //TODO May fail to identify the sumbode(mode/modetemp... (Review STEP-2 o 3) //qDebug() << "DataBase::getModeNameFromNumber: " << QString::number(_n) ; QSqlQuery query; QString queryString; if (_tmp) { queryString = QString("SELECT name FROM modetemp WHERE id='%1'").arg(_n); } else { queryString = QString("SELECT name FROM mode WHERE id='%1'").arg(_n); } bool sqlOK = query.exec(queryString); if (!sqlOK) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); } query.next(); //qDebug() << "DataBase::getModeNameFromNumber: " << QString::number(_n) <<" - " << isValidMode((query.value(0)).toString(), _tmp) ; if ( query.isValid() ) { //qDebug() << "DataBase::getModeNameFromNumber: ------ END-1" ; return (query.value(0)).toString(); /* In a version when I change the mode table to include submode, this comparison may need to be checked in both versions * at once, failing the query as old version was not having the column submode * if ( isValidMode((query.value(0)).toString(), _tmp)) { //qDebug() << "DataBase::getModeNameFromNumber - Found: " << (query.value(0)).toString() ; return (query.value(0)).toString(); } else { //qDebug() << "DataBase::getModeNameFromNumber - Not Valid Mode: " << (query.value(0)).toString() ; return QString(); } */ } else { //qDebug() << "DataBase::getModeNameFromNumber - Not Valid record" ; //qDebug() << "DataBase::getModeNameFromNumber: ------ END-2" ; query.finish(); return QString(); } } QString DataBase::getSubModeNameFromNumber(const int _n, bool _tmp) { //qDebug() << "DataBase::getSubModeNameFromNumber: " << QString::number(_n) ; QSqlQuery query; QString queryString; if (_tmp) { queryString = QString("SELECT submode FROM modetemp WHERE id='%1'").arg(_n); } else { queryString = QString("SELECT submode FROM mode WHERE id='%1'").arg(_n); } bool sqlOk = query.exec(queryString); //qDebug() << "DataBase::getSubModeNameFromNumber - query: " << query.lastQuery() ; if (sqlOk) { if (query.next()) { if ( query.isValid() ) { if ( isValidMode((query.value(0)).toString(), _tmp) ) { //qDebug() << "DataBase::getSubModeNameFromNumber: RETURN: " << (query.value(0)).toString() ; return (query.value(0)).toString(); } else { //qDebug() << "DataBase::getSubModeNameFromNumber: NO valid mode - END" ; query.finish(); return QString(); } } else { //qDebug() << "DataBase::getSubModeNameFromNumber: query not valid - END" ; query.finish(); return QString(); } } else { //qDebug() << "DataBase::getSubModeNameFromNumber: query not next - END" ; query.finish(); return QString(); } } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataBase::getSubModeNameFromNumber: SQL FALSE - END" ; query.finish(); return QString(); } //qDebug() << "DataBase::getSubModeNameFromNumber: - END-X" ; //query.finish(); //return QString(); } bool DataBase::isValidBand (const QString &b) { //qDebug() << "DataBase::isValidBand: " << b ; if (b.length()<1) { // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } QString _band = b.toUpper(); QSqlQuery query; QString stringQuery = QString("SELECT id FROM band WHERE name='%1'").arg(_band); bool sqlOK = query.exec(stringQuery); if (sqlOK) { query.next(); if (query.isValid()) { query.finish(); return true; } else { query.finish(); // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); } //emit debugLog(Q_FUNC_INFO, "3", 7); return false; } bool DataBase::isValidMode (const QString &b, const bool _tmp) { //qDebug() << "DataBase::isValidMode: " << b ; QString stringQuery; if (b.length()<2) { //qDebug() << "DataBase::isValidMode: (length<2) FALSE" ; //emit debugLog(Q_FUNC_INFO, "1", 7); return false; } if (_tmp) { stringQuery = QString("SELECT id FROM modetemp WHERE submode='%1'").arg(b); } else { stringQuery = QString("SELECT id FROM mode WHERE submode='%1'").arg(b); } //stringQuery = QString("SELECT id FROM mode WHERE submode='%1'").arg(b); QSqlQuery query; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); } query.next(); return query.isValid(); } bool DataBase::isValidBandNumber (const int b) { //qDebug() << "DataBase::isValidBandNumber: " << QString::number(b); return isValidBand(getBandNameFromNumber(b)); } bool DataBase::isValidModeNumber (const int b) { //qDebug() << "DataBase::isValidModeNumber: " << QString::number(b); return isValidMode(getModeNameFromNumber(b, false), false); } int DataBase::getBandIdFromFreq(const QString &fr) { //qDebug() << "DataBase::getBandIdFromFreq: " << fr ; //Freq should be in MHz QString queryString = QString("SELECT id FROM band WHERE lower <= '%1' and upper >= '%2'").arg(fr, fr); QSqlQuery query; bool sqlOK = query.exec(queryString); //qDebug() << "DataBase::getBandIdFromFreq: Query: " << query.lastQuery() ; if (sqlOK) { //qDebug() << "DataBase::getBandIdFromFreq: Query OK" ; query.next(); if (query.isValid()) { //qDebug() << "DataBase::getBandIdFromFreq: Query OK - END" ; return (query.value(0)).toInt(); } else { //qDebug() << "DataBase::getBandIdFromFreq: Valid NOK - END" ; query.finish(); return -1; } } else { //qDebug() << "DataBase::getBandIdFromFreq: Query NOK" ; //qDebug() << "DataBase::getBandIdFromFreq: Query NOK: " << query.lastError().text() ; //qDebug() << "DataBase::getBandIdFromFreq: Query NOK: " << query.lastError().nativeErrorCode() ; if (query.lastError().isValid()) { //qDebug() << "DataBase::getBandIdFromFreq: Query NOK - Error VALID" ; } else { //qDebug() << "DataBase::getBandIdFromFreq: Query NOK - Error NOT-VALID" ; } //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); queryErrorManagement(Q_FUNC_INFO, query.lastError().text(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -2; } //qDebug() << "DataBase::getBandIdFromFreq: END-X" ; //query.finish(); //return -3; } bool DataBase::isThisFreqInBand(const QString &b, const QString &fr) {//Freq should be in MHz //qDebug() << Q_FUNC_INFO << ": " << b << "/" << fr ; if (b.length()<2) { //qDebug() << Q_FUNC_INFO << ": returning false" ; return false; } int bandNf = getBandIdFromFreq(fr); int bandN = getBandIDFromName2(b); //qDebug() << Q_FUNC_INFO << ": (b/f)" << QString::number(bandN) << "/" << QString::number(bandNf) ; if (bandNf == bandN) { //qDebug() << Q_FUNC_INFO << ": OK " << b << "/" << fr ; return true; } else { //qDebug() << Q_FUNC_INFO << ": NOK " << b << "/" << fr ; //emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } bool DataBase::unMarkAllQSO() { //qDebug() << "DataBase::unMarkAllQSO" ; QString stringQuery = QString("UPDATE log SET marked = 'N' WHERE 1"); return execQuery(Q_FUNC_INFO, stringQuery); } bool DataBase::updateIfNeeded() { //qDebug() << "DataBase::updateIfNeeded - Version: " << QString::number(dbVersion) ; /************************************************************************************** * This function should call to bool updateToXXX () being XXX dbVersion and * */ QSqlQuery query; QString stringQuery = QString("SELECT MAX (dbversion) FROM softwarecontrol"); bool sqlOK = query.exec(stringQuery); if (sqlOK) { query.next(); latestReaded = (query.value(0)).toFloat(); } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } query.finish(); //qDebug() << "DataBase::updateIfNeeded - LatestReaded: " << QString::number(latestReaded) ; if (latestReaded >= dbVersion) { // DB is updated, no update is needed //qDebug() << "DataBase::updateIfNeeded - DB updated (no need to update anything!) " ; return true; } else { // DB is outdated. We need to update!! //qDebug() << "DataBase::updateIfNeeded - DB outdated... upgrade starts now! " ; QMessageBox msgBox; msgBox.setWindowTitle("KLog"); msgBox.setText( QObject::tr("KLog DB needs to be upgraded.")); msgBox.setInformativeText( QObject::tr("Do you want to upgrade it now?") + "\n"+ QObject::tr("If DB is not upgraded KLog may not work properly.")); msgBox.setStandardButtons(QMessageBox::Apply | QMessageBox::Discard); msgBox.setDefaultButton(QMessageBox::Apply); msgBox.setIcon(QMessageBox::Warning); msgBox.raise(); //this->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint); msgBox.setWindowFlags(Qt::WindowStaysOnTopHint|Qt::Popup); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Apply: // Save was clicked backupB4Update(); break; case QMessageBox::Discard: // Discard was clicked break; default: // should never be reached //qDebug() << "DataBase::updateIfNeeded - FALSE - CHECK IF SEEN, shoud not be here! - END " ; //emit debugLog(Q_FUNC_INFO, "2", 7); return false; //break; } } // If the DB needs to be updated... we update it! :-) //qDebug() << "DataBase::updateIfNeeded - END!" ; return true; } void DataBase::backupB4Update() { //qDebug() << "DataBase::backupB4Update - Start" ; QMessageBox msgBox; msgBox.setWindowTitle("KLog backup"); msgBox.setText( QObject::tr("Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea.")); msgBox.setInformativeText( QObject::tr("Do you want to backup your DB now?") ); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); msgBox.setIcon(QMessageBox::Warning); msgBox.raise(); //this->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint); msgBox.setWindowFlags(Qt::WindowStaysOnTopHint|Qt::Popup); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Save was clicked logBackup(); break; case QMessageBox::No: // NO backup was selected updateToLatest(); break; } //qDebug() << "DataBase::backupB4Update - END" ; } void DataBase::logBackup() { //qDebug() << "DataBase::logBackup - Start" ; QFile DBFile(util->getKLogDBFile()); QString newFile = util->getKLogDBBackupFile(); bool copied = DBFile.copy(newFile); //qDebug() << "DataBase::logBackup copy: " << newFile ; QMessageBox msgBox; msgBox.setWindowTitle("KLog DB backup"); msgBox.setWindowFlags(Qt::WindowStaysOnTopHint|Qt::Popup); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); if (copied) { //qDebug() << "DataBase::logBackup - DB backup was OK" ; msgBox.setText( QObject::tr("The backup finished successfully.")); msgBox.setInformativeText( QObject::tr("You can find the backup in this file: %1").arg(newFile) ); msgBox.setIcon(QMessageBox::Information); msgBox.raise(); msgBox.exec(); updateToLatest(); } else { //qDebug() << "DataBase::logBackup - DB backup was NOK" ; msgBox.setText( QObject::tr("The backup was not properly done.")); msgBox.setInformativeText( QObject::tr("You will be sent back to the starting point.")); msgBox.setIcon(QMessageBox::Warning); msgBox.raise(); msgBox.exec(); updateIfNeeded(); } /* QMessageBox msgBox; msgBox.setWindowTitle("KLog DB backup"); msgBox.setText( QObject::tr("KLog is backing up the DB to a file...")); msgBox.setInformativeText( QObject::tr("Did the DB backup worked well?") ); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); msgBox.setIcon(QMessageBox::Information); msgBox.raise(); //this->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint); msgBox.setWindowFlags(Qt::WindowStaysOnTopHint|Qt::Popup); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Save was clicked updateToLatest(); break; case QMessageBox::No: // NO backup was DONE msgBox.setWindowTitle("KLog DB backup not done."); msgBox.setText( QObject::tr("KLog DB backup was not done.")); msgBox.setInformativeText( QObject::tr("You will be redirected to the first message.") ); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.setIcon(QMessageBox::Warning); msgBox.raise(); msgBox.exec(); updateIfNeeded(); break; default: // should never be reached //qDebug() << "DataBase::backupB4Update - FALSE - CHECK IF SEEN, shoud not be here! - END " ; //lse; //break; } */ //qDebug() << "DataBase::logBackup - END" ; } bool DataBase::createTheBandQuickReference() { /* KEY Value QHash bandIDHash; QHash modeIDHash; QHash IDBandHash; QHash IDModeHash QHash freqBandIdHash; */ //qDebug() << "DataBase::createTheBandQuickReference: " ; QString st = "NULL"; int in = 0; QString stringQuery = QString("SELECT id, name, lower FROM band"); QString fr = QString(); bandIDHash.clear(); IDBandHash.clear(); QSqlQuery query; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } while (query.next()) { if (query.isValid()) { st = (query.value(1)).toString(); in = (query.value(0)).toInt(); fr = (query.value(2)).toString(); bandIDHash.insert(st, in ); IDBandHash.insert(in, st); freqBandIdHash.insert(in, fr); //qDebug() << "DataBase::createTheBandQuickReference: " << st <<"/" << QString::number(in); } else { //qDebug() << "DataBase::createTheBandQuickReference: Query not valid -'RETURN FALSE - END" ; // QMessageBox::warning(0, QObject::tr("Database Error (DataBase::createTheBandQuickReference)"), // query.lastError().text()); query.finish(); // emit debugLog(Q_FUNC_INFO, "2", 7); return false; //TODO: Manage this error, in case the query is NOK. } //qDebug() << "DataBase::createTheBandQuickReference: Go for the next one!" ; } query.finish(); //qDebug() << "DataBase::createTheBandQuickReference: END" ; return true; } bool DataBase::createTheModeQuickReference() { /* KEY Value QHash modeIDHash; QHash IDModeHash */ //qDebug() << "DataBase::createTheModeQuickReference: " ; if (getDBVersion().toFloat()<0.01f) { // If the version is not updated we don't create the reference return true; } QString st = QString(); QString sm = QString(); int in = 0; modeIDHash.clear(); IDModeHash.clear(); subModeIDHash.clear(); IDSubModeHash.clear(); QString stringQuery = QString("SELECT id, name, submode FROM mode"); QSqlQuery query; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } while (query.next()) { if (query.isValid()) { in = (query.value(0)).toInt(); st = (query.value(1)).toString(); sm = (query.value(2)).toString(); modeIDHash.insert(st, in ); IDModeHash.insert(in, st); subModeIDHash.insert(sm, in ); IDSubModeHash.insert(in, sm); //qDebug() << "DataBase::createTheModeQuickReference: " << st <<"/" << QString::number(in); } else { //qDebug() << "DataBase::createTheModeQuickReference: Query not valid - END" ; //QMessageBox::warning(0, QObject::tr("Database Error (DataBase::createTheModeQuickReference)"), // query.lastError().text()); query.finish(); // emit debugLog(Q_FUNC_INFO, "2", 7); return false; //TODO: Manage this error, in case the query is NOK. } } query.finish(); //qDebug() << "DataBase::createTheModeQuickReference: END" ; return true; } int DataBase::getBandIDFromName2(const QString &b) {//KEY, value //name, id /* KEY Value QHash bandIDHash; QHash modeIDHash; QHash IDBandHash; QHash IDModeHash */ //qDebug() << "DataBase::getBandIDFromName2: " << b ; //qDebug() << "DataBase::getBandIDFromName2: This line should be the last one... " ; return getBandIdFromName(b); //qDebug() << "DataBase::getBandIDFromName2: CHECK IF THIS LINE IS SEEN" ; /* if (b.length()<1) { return -3; } if (bandIDHash.contains(b)) { //qDebug() << "DataBase::getBandIDFromName2: " << b << ":" << bandIDHash.value(b) ; return bandIDHash.value(b); } else { //qDebug() << "DataBase::getBandIDFromName2: Contains - False" ; return -1; } //qDebug() << "DataBase::getBandIDFromName2: Safety exit" ; */ } int DataBase::getModeIDFromName2(const QString &b) { //qDebug() << "DataBase::getModeIDFromName2: " << b ; return getModeIdFromSubMode(b); /* if (b.length()<2) { //qDebug() << "DataBase::getModeIDFromName2: END -3" ; return -3; } if (modeIDHash.contains(b)) { //qDebug() << "DataBase::getModeIDFromName2: END - " << b << ":" << modeIDHash.value(b) ; return modeIDHash.value(b); } else { //qDebug() << "DataBase::getModeIDFromName2: Contains - False - END" ; return -1; } //qDebug() << "DataBase::getModeIDFromName2: Safety exit - END" ; */ } int DataBase::getSubModeIDFromName2(const QString &b) { //qDebug() << "DataBase::getSubModeIDFromName2: " << b ; return getModeIdFromSubMode(b); } QString DataBase::getBandNameFromID2(const int _i) { //qDebug() << "DataBase::getBandNameFromid2: " << QString::number(_i) ; return getBandNameFromNumber(_i); /* if (IDBandHash.contains(_i)) { //qDebug() << "DataBase::getBandNameFromid2: END OK" ; return IDBandHash.value(_i); } else { //qDebug() << "DataBase::getBandNameFromid2: END-1" ; return "-1"; } */ //qDebug() << "DataBase::getBandNameFromid2: END-2" ; //return "-2"; } QString DataBase::getModeNameFromID2(const int _i) { //qDebug() << "DataBase::getModeNameFromId2: " << QString::number(_i) ; return getSubModeNameFromNumber(_i); /* if (IDModeHash.contains(_i)) { //qDebug() << "DataBase::getModeNameFromId2: END OK - " << IDModeHash.value(_i) ; return IDModeHash.value(_i); } else { //qDebug() << "DataBase::getModeNameFromId2: END-1" ; return "-1"; } */ //qDebug() << "DataBase::getModeNameFromId2: END-2" ; //return "-2"; } QString DataBase::getSubModeNameFromID2(const int _i) { //qDebug() << "DataBase::getSubModeNameFromId2: " << QString::number(_i) ; return getSubModeNameFromNumber(_i); /* if (IDSubModeHash.contains(_i)) { //qDebug() << "DataBase::getSubModeNameFromId2: END OK - " << IDModeHash.value(_i) ; return IDSubModeHash.value(_i); } else { //qDebug() << "DataBase::getSubModeNameFromId2: END-1" ; return "-1"; } //qDebug() << "DataBase::getSubModeNameFromId2: END-2" ; */ } bool DataBase::createBandModeMaps() { //qDebug() << "DataBase::createBandModeMaps" ; bool b = false; bool m = false; //return (b && m); if (isTheDBCreated()) { b = createTheBandQuickReference(); m = createTheModeQuickReference(); //qDebug() << "DataBase::createBandModeMaps - isTheDbCreated TRUE" ; if (!b) { //emit debugLog(Q_FUNC_INFO, "1", 7); } if (!m) { //emit debugLog(Q_FUNC_INFO, "2", 7); } //qDebug() << "DataBase::createBandModeMaps END 1" ; return (b && m); } else { //qDebug() << "DataBase::createBandModeMaps - isTheDbCreated FALSE" ; //emit debugLog(Q_FUNC_INFO, "3", 7); return false; } //return false; //qDebug() << "DataBase::createBandModeMaps END" ; } QString DataBase::getFreqFromBandId(const int _i) { //qDebug() << "DataBase::getFreqFromBandId" ; if (freqBandIdHash.contains(_i)) { //qDebug() << "DataBase::getFreqFromBandId OK END" ; return freqBandIdHash.value(_i); } else { //qDebug() << "DataBase::getFreqFromBandId END-1" ; return "-1.0"; } //qDebug() << "DataBase::getFreqFromBandId END-2" ; //return "-2.0"; } /* int DataBase::getLogTypeNumber(const QString &_logType) { //qDebug() << "DataBase::getLogTypeNumber: " << _logType ; QSqlQuery query; QString queryString = QString("SELECT id FROM supportedcontests WHERE name='%1'").arg(_logType); bool sqlOK = query.exec(queryString); if(!sqlOK) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); } query.next(); if ( query.isValid() ) { return (query.value(0)).toInt(); } else { query.finish(); return -1; } //query.finish(); //return -2; } QString DataBase::getLogTypeName(const int _logType) { //qDebug() << "DataBase::getLogTypeName: " << QString::number(_logType) ; QSqlQuery query; QString queryString = QString("SELECT name FROM supportedcontests WHERE id='%1'").arg(_logType); bool sqlOK = query.exec(queryString); if(!sqlOK) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); } query.next(); if ( query.isValid() ) { return (query.value(0)).toString(); } else { query.finish(); return QString(); } //query.finish(); //return QString(); } */ bool DataBase::updateToLatest() { /* * With the DB updates, the function that is called from here should be also updated. * The updateXXX are recursive calls that calls the previous one. * */ //qDebug() << "DataBase::updateToLatest " ; if (requiresManualUpgrade()) { //qDebug() << "DataBase::updateToLatest requires" ; exit(1); //return false; } return updateTo025(); } bool DataBase::requiresManualUpgrade() { // If DB version <= 0.006, DB can't be upgraded automatically. // Recomendation is to export to ADIF in an olf KLog version (before KLog 1.1); // Install new KLog version // import ADIF file float ver = getDBVersion().toFloat(); //qDebug() << "DataBase::requiresManualUpgrade - ver: " << QString::number(ver) ; if (ver >= 0.007f) { //qDebug() << "DataBase::requiresManualUpgrade false" ; return false; } else { //qDebug() << "DataBase::requiresManualUpgrade true" ; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Critical); msgBox.setWindowTitle(QObject::tr("KLog - DB can't be updated automatically")); QString aux = QObject::tr("You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version."); QString aux2 = QObject::tr("The process to upgrade is:\n- Using an old KLog version export your log to ADIF.\n- Remove your logbook.dat file from your KLog folder.\n- Install the new KLog version.\n- Import your ADIF file.\n\nKLog will finish when you click on OK."); msgBox.setText(aux); msgBox.setDetailedText(aux2); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } return true; } bool DataBase::updateTo003() {// Updates the DB to 0.0.3 /* * This function should be used as a template to create the all the update functions implementing the needed changes * in the dB to update from one version to the following one. * * // dbVersion shows the DB version that is being deployed * // latestReaded shows the DB version that is currently deployed. *i.e.: * QString stringQuery = QString ("ALTER TABLE award_enumeration ADD COLUMN dxcc INTEGER;"); * */ //qDebug() << "DataBase::updateTo003: latestRead: " << QString::number(latestReaded) ; bool IAmIn003 = false; bool IAmIn002 = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); if (latestReaded >= 0.003f) { //IAmIn003 = true; return true; } else { IAmIn003 = false; } while (!IAmIn003 && !ErrorUpdating) { while (!IAmIn002 && !ErrorUpdating) { //IAmIn002 = updateTo002(); IAmIn002 = true; } if (ErrorUpdating) { // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } //DO ALL THE TASKS TO BE IN 0.003 from 0.002 HERE and set ErrorUpdating if it is not possible. IAmIn003 = true; } return IAmIn003; } bool DataBase::updateTo004() {// Updates the DB to 0.0.41 //qDebug() << "DataBase::updateTo004: latestRead: " << getDBVersion() ; //qDebug() << "DataBase::updateTo004: latestRead: " << QString::number(latestReaded) ; bool IAmIn004 = false; bool IAmIn003 = false; QString stringQuery = QString(); QSqlQuery query; bool sqlOk = false; latestReaded = getDBVersion().toFloat(); if (latestReaded >= 0.004f) { //qDebug() << "DataBase::updateTo004: - I am in 004" ; return true; } else { //qDebug() << "DataBase::updateTo004: - I am not in 004" ; IAmIn004 = false; } while (!IAmIn004) { //qDebug() << "DataBase::updateTo004: - And I am not in 004 nor ErrorUpdating" ; while (!IAmIn003) { //qDebug() << "DataBase::updateTo004: - And I am not in 003" ; //IAmIn002 = updateTo002(); IAmIn003 = true; } //qDebug() << "DataBase::updateTo004: - And I am in 003" ; sqlOk = updateDBVersion(softVersion, "0.004"); //qDebug() << "DataBase::updateTo004: - Update Version" ; if (sqlOk) { // Version updated //qDebug() << "DataBase::updateTo004: - Update OK" ; sqlOk = execQuery(Q_FUNC_INFO, "DROP TABLE award_enumeration"); } else { // Version not updated //qDebug() << "DataBase::updateTo004: - Update NOK" ; } //DO ALL THE TASKS TO BE IN 0.004 from 0.003 HERE and set ErrorUpdating if it is not possible. //qDebug() << "DataBase::updateTo004: - IAmIn004 = true" ; IAmIn004 = true; } if (IAmIn004) { //qDebug() << "DataBase::updateTo004: - Return... TRUE" ; } else { //qDebug() << "DataBase::updateTo004: - Return... FALSE" ; } //qDebug() << "DataBase::updateTo004: UPDATED OK!" ; return IAmIn004; } bool DataBase::updateTo005() {// Updates the DB to 0.0.5 //qDebug() << "DataBase::updateTo005: latestRead: " << getDBVersion() ; bool IAmIn005 = false; bool IAmIn004 = false; bool ErrorUpdating = false; QString stringQuery = QString(); QSqlQuery query; QMessageBox msgBox; msgBox.setWindowTitle(QObject::tr("KLog - DB update")); msgBox.setIcon(QMessageBox::Information); //int errorCode; bool sqlOk = false; latestReaded = getDBVersion().toFloat(); if (latestReaded >= 0.005f) { //qDebug() << "DataBase::updateTo005 - Already in 005" ; return true; } else { //qDebug() << "DataBase::updateTo005 - 005 update false" ; IAmIn005 = false; } while (!IAmIn005 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo005 - I am not in 005" ; while (!IAmIn004 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo005 - I am not in 004" ; IAmIn004 = updateTo004(); } //qDebug() << "DataBase::updateTo005 - I am in 004" ; if (ErrorUpdating) { //qDebug() << "DataBase::updateTo005 - 005 update false2" ; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } sqlOk = updateDBVersion(softVersion, "0.005"); if (sqlOk) { // Version updated if (recreateContestData()) { //qDebug() << "DataBase::updateTo005 - recreateContestData OK" ; sqlOk = execQuery(Q_FUNC_INFO, "DROP table logs"); sqlOk = createTableLogs(true); if (!sqlOk) { //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataBase::updateTo005 - logs table do not created" ; } if (howManyQSOsInLog(0)>0) { // If the user has QSOs that were added with previous versions... // We need to create a new log and rename all QSOs to that QSO. //stringQuery = QString("UPDATE log SET lognumber='1' WHERE lognumber='0'"); msgBox.setText(QObject::tr("KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you.")); msgBox.exec(); if (!execQuery(Q_FUNC_INFO, "UPDATE log SET lognumber='1' WHERE lognumber='0'")) { //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //showError(QObject::tr("QSOs not updated to main log")); //qDebug() << "DataBase::updateTo005 - QSOs not updated to main log" ; } QString dateString = (QDate::currentDate()).toString("yyyy-MM-dd"); QString callToUse = QString(); bool ok; //QString text; //text = QInputDialog::getText(this, QObject::tr("Station Callsign"), QObject::tr("Enter the Station Callsign you want to use in the imported log:"), QLineEdit::Normal, QObject::tr("N0CALL"), &ok); QString text = (QInputDialog::getText(nullptr, QObject::tr("KLog: Enter Station callsign"), QObject::tr("Enter the station callsign used in this log"), QLineEdit::Normal, QObject::tr("Station Callsign"), &ok)).toUpper(); text = text.toUpper(); if (ok && !text.isEmpty()) { callToUse = text; } else { callToUse = "N0CALL"; } stringQuery = QString("INSERT INTO logs (logdate, stationcall, logtype, logtypen) values('%1','%2','DX', '1')").arg(dateString).arg(callToUse); sqlOk = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOk) { //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //showError(QObject::tr("New Log not created")); //qDebug() << "DataBase::updateTo005 - New Log not created" ; //qDebug() << "DataBase::clearLog: Log deleted FAILED" ; } } IAmIn005 = true; } else { //qDebug() << "DataBase::updateTo005 - recreateContestData FAILED" ; ErrorUpdating = true; } } else { // Version not updated //qDebug() << "DataBase::updateTo005 - 005 update false6" ; ErrorUpdating = true; } } //qDebug() << "DataBase::updateTo005 - 005 updated 3" ; //TODO: Delete the table and recreate it if (IAmIn005) { msgBox.setText(QObject::tr("All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay.")); msgBox.exec(); } else { // emit debugLog(Q_FUNC_INFO, "2", 7); } //qDebug() << "DataBase::updateTo005 - I am in 005 already!! " ; //qDebug() << "DataBase::updateTo005: UPDATED OK!" ; return IAmIn005; } bool DataBase::recreateSatelliteData() { //qDebug() << "DataBase::recreateSatelliteData" ; QSqlQuery query; if (isTheTableExisting("satellites")) { if (execQuery(Q_FUNC_INFO, "DROP TABLE satellites")) { if (createTableSatellites(true)) { //qDebug() << "DataBase::recreateSatelliteData SAT table created" ; return populateTableSatellites(true); } else { //qDebug() << "DataBase::recreateSatelliteData SAT table NOT created" ; } } else { //qDebug() << "DataBase::recreateSatelliteData execQuery FAILED" ; } } else { if (createTableSatellites(true)) { //qDebug() << "DataBase::recreateSatelliteData SAT table created" ; return populateTableSatellites(true); } else { //qDebug() << "DataBase::recreateSatelliteData SAT table NOT created" ; } } //qDebug() << "DataBase::recreateSatelliteData END FALSE" ; return false; } bool DataBase::recreateContestData() { //qDebug() << "DataBase::recreateContestData" ; if (isTheTableExisting("contest")) { QSqlQuery query; bool sqlOk = false; sqlOk = execQuery(Q_FUNC_INFO, "DROP TABLE contest"); if (sqlOk) { if (createTableContest()) { return populateContestData(); } } } else { if (createTableContest()) { return populateContestData(); } } return false; } bool DataBase::recreateSupportedContest() { //qDebug() << "DataBase::recreateSupportedContest" ; execQuery(Q_FUNC_INFO, "DROP TABLE IF exists supportedcontests"); if (isTheTableExisting("supportedcontests")) { QSqlQuery query; bool sqlOk = false; sqlOk = execQuery(Q_FUNC_INFO, "DROP TABLE supportedcontests"); if (sqlOk) { //qDebug() << "DataBase::recreateSupportedContest SQLOK" ; if (createTableSupportedContest()) { //qDebug() << "DataBase::recreateSupportedContest - createTable OK" ; return populateTableSupportedContest(); } else { //qDebug() << "DataBase::recreateSupportedContest createTableSupportContest FALSE" ; return false; } } else { //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } } else { if (createTableSupportedContest()) { //qDebug() << "DataBase::recreateSupportedContest - createTable OK" ; return populateTableSupportedContest(); } else { //qDebug() << "DataBase::recreateSupportedContest createTableSupportContest FALSE" ; return false; } } //qDebug() << "DataBase::recreateSupportedContest - FALSE end" ; return false; } bool DataBase::recreatePropModes() { //qDebug() << "DataBase::recreatePropModes" ; if (isTheTableExisting("prop_mode_enumeration")) { //qDebug() << "DataBase::recreatePropModes: Table Exist" ; bool sqlOk = false; sqlOk = execQuery(Q_FUNC_INFO, "DROP TABLE prop_mode_enumeration"); if (sqlOk) { //qDebug() << "DataBase::recreatePropModes SQLOK" ; if (createTablePropModes()) { //qDebug() << "DataBase::recreatePropModes - createTable OK" ; if (populatePropagationModes()) { //qDebug() << "DataBase::recreatePropModes - populatePropModes OK" ; return true; } else { //qDebug() << "DataBase::recreatePropModes - populatePropModes NOK" ; return false; } } else { //qDebug() << "DataBase::recreatePropModes createTableSupportContest FALSE-1" ; return false; } } else { //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataBase::recreatePropModes - prop_mode_enumeration table has not been dropped" ; //qDebug() << "DataBase::recreatePropModes : Table creation FAILED" ; } } else { //qDebug() << "DataBase::recreatePropModes: Table does NOT Exist" ; if (createTablePropModes()) { //qDebug() << "DataBase::recreatePropModes - createTable OK" ; if (populatePropagationModes()) { //qDebug() << "DataBase::recreatePropModes - populatePropModes OK" ; return true; } else { //qDebug() << "DataBase::recreatePropModes - populatePropModes NOK" ; return false; } } else { //qDebug() << "DataBase::recreatePropModes createTableSupportContest FALSE-2" ; } } //qDebug() << "DataBase::recreatePropModes - FALSE end" ; return false; } bool DataBase::createTableLogs(const bool real) { // NoTmp = false => TMP data table to operate and be deleted afterwards //Creating the Sats DB to be able to include satellites to the LOTW //qDebug() << "DataBase::createTableLogs" ; QString stringQuery = QString(); //QSqlQuery query; if (real) { //qDebug() << "DataBase::createTableLogs - logs" ; stringQuery = "CREATE TABLE logs" ; } else { //qDebug() << "DataBase::createTableLogs - logstemp" ; stringQuery = "CREATE TABLE logstemp" ; } stringQuery = stringQuery + QString(" (id INTEGER PRIMARY KEY AUTOINCREMENT, " "logdate VARCHAR(10), " "stationcall VARCHAR(15) NOT NULL, " "operators VARCHAR, " "comment VARCHAR, " "logtype VARCHAR, " "logtypen INTEGER, " "FOREIGN KEY (logtypen) REFERENCES supportedcontests(id)," "FOREIGN KEY (logtype) REFERENCES supportedcontests(name))"); //qDebug() << "DataBase::createTableLogs - END" ; return execQuery(Q_FUNC_INFO, stringQuery); } bool DataBase::createTablePropModes() { //qDebug() << "DataBase::createTablePropModes" ; execQuery(Q_FUNC_INFO, "DROP TABLE IF exists prop_mode_enumeration"); return execQuery(Q_FUNC_INFO, "CREATE TABLE prop_mode_enumeration (id INTEGER PRIMARY KEY AUTOINCREMENT, shortname VARCHAR(8), name VARCHAR(55) )"); } bool DataBase::createTableSupportedContest() { //qDebug() << "DataBase::createTableSupportedContest" ; execQuery(Q_FUNC_INFO, "DROP TABLE IF exists supportedcontests"); QString st = QString("CREATE TABLE supportedcontests (" "id INTEGER PRIMARY KEY, " "longname VARCHAR," "name VARCHAR)"); return execQuery(Q_FUNC_INFO, st); } bool DataBase::createTableContest() { //qDebug() << "DataBase::createTableContest" ; //QSqlQuery query; createTableSupportedContest(); execQuery(Q_FUNC_INFO, "DROP TABLE IF exists contest"); execQuery(Q_FUNC_INFO, "CREATE TABLE contest (" "id INTEGER PRIMARY KEY AUTOINCREMENT, " "contest INTEGER NOT NULL," "catoperator INTEGER NOT NULL," "catassisted INTEGER NOT NULL," "catpower INTEGER NOT NULL," "catband INTEGER NOT NULL," "catoverlay INTEGER NOT NULL," "catmode INTEGER NOT NULL," "FOREIGN KEY (contest) REFERENCES supportedcontests(id), " "FOREIGN KEY (catoperator) REFERENCES contestcatoperator(id), " "FOREIGN KEY (catassisted) REFERENCES contestcatassisted(id), " "FOREIGN KEY (catpower) REFERENCES contestcatpower(id), " "FOREIGN KEY (catband) REFERENCES contestcatband(id), " "FOREIGN KEY (catoverlay) REFERENCES contestcatoverlay(id), " "FOREIGN KEY (catmode) REFERENCES contestcatmode(id))"); execQuery(Q_FUNC_INFO, "CREATE TABLE contestcatoperator (" "id INTEGER PRIMARY KEY, " "name VARCHAR)"); execQuery(Q_FUNC_INFO, "CREATE TABLE contestcatassisted (" "id INTEGER PRIMARY KEY, " "name VARCHAR)"); execQuery(Q_FUNC_INFO, "CREATE TABLE contestcatpower (" "id INTEGER PRIMARY KEY, " "name VARCHAR)"); execQuery(Q_FUNC_INFO, "CREATE TABLE contestcatband (" "id INTEGER PRIMARY KEY, " "name VARCHAR)"); execQuery(Q_FUNC_INFO, "CREATE TABLE contestcatoverlay (" "id INTEGER PRIMARY KEY, " "name VARCHAR)"); execQuery(Q_FUNC_INFO, "CREATE TABLE contestcatmode (" "id INTEGER PRIMARY KEY, " "name VARCHAR)"); populateTableSupportedContest(); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoperator (id, name) VALUES ('0', 'N/A')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoperator (id, name) VALUES ('1', 'Single-Operator')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoperator (id, name) VALUES ('2', 'Multi-One')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoperator (id, name) VALUES ('3', 'Multi-Two')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoperator (id, name) VALUES ('4', 'Multi-Unlimited')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoperator (id, name) VALUES ('5', 'CheckLog')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatassisted (id, name) VALUES ('0', 'N/A')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatassisted (id, name) VALUES ('1', 'Non-Assisted')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatassisted (id, name) VALUES ('2', 'Assisted')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatpower (id, name) VALUES ('0', 'N/A')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatpower (id, name) VALUES ('1', 'High-Power')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatpower (id, name) VALUES ('2', 'Low-Power')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatpower (id, name) VALUES ('3', 'QRP')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatband (id, name) VALUES ('0', 'N/A')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatband (id, name) VALUES ('1', 'All-Band')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatband (id, name) VALUES ('2', 'Single-Band')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoverlay (id, name) VALUES ('0', 'N/A')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoverlay (id, name) VALUES ('1', 'Classic')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatoverlay (id, name) VALUES ('2', 'Rookie')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatmode (id, name) VALUES ('0', 'N/A')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatmode (id, name) VALUES ('1', 'SSB')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatmode (id, name) VALUES ('2', 'CW')"); execQuery(Q_FUNC_INFO, "INSERT INTO contestcatmode (id, name) VALUES ('3', 'MIXED')"); //qDebug() << "DataBase::createTableContest END" ; return true; } bool DataBase::populateTableSupportedContest() { //qDebug() << "DataBase::populateTableSupportedContest" ; // ADDING ALL THE CATEGORIES OPTIONS return execQuery(Q_FUNC_INFO, "INSERT INTO supportedcontests (id, longname, name) VALUES ('0', 'Normal log', 'DX')"); } bool DataBase::createTableQSL_Via_enumeration() { execQuery(Q_FUNC_INFO, "DROP TABLE IF exists qsl_via_enumeration"); QString st = QString("CREATE TABLE qsl_via_enumeration (" "id INTEGER PRIMARY KEY AUTOINCREMENT, " "shortname VARCHAR(1) NOT NULL, " "name VARCHAR(15) NOT NULL)"); return execQuery(Q_FUNC_INFO, st); } bool DataBase::populateTableQSL_Via_enumeration() { execQuery(Q_FUNC_INFO, "INSERT INTO qsl_via_enumeration (shortname, name) VALUES ('B', 'Bureau')"); execQuery(Q_FUNC_INFO, "INSERT INTO qsl_via_enumeration (shortname, name) VALUES ('D', 'Direct')"); execQuery(Q_FUNC_INFO, "INSERT INTO qsl_via_enumeration (shortname, name) VALUES ('E', 'Electronic')"); execQuery(Q_FUNC_INFO, "INSERT INTO qsl_via_enumeration (shortname, name) VALUES ('M', 'Manager')"); return true; } bool DataBase::createTableMode(const bool NoTmp) { // NoTmp = false => TMP data table to operate and be deleted afterwards //qDebug() << "DataBase::createTableMode" ; QString stringQuery = QString(); QSqlQuery query; if (NoTmp) { stringQuery = "CREATE TABLE mode" ; } else { stringQuery = "CREATE TABLE modetemp" ; } stringQuery = stringQuery + QString(" (id INTEGER PRIMARY KEY AUTOINCREMENT, " "cabrillo VARCHAR(2) NOT NULL, " "name VARCHAR(40) NOT NULL, " "submode VARCHAR(40) NOT NULL, " "deprecated VARCHAR(1) NOT NULL)"); //qDebug() << "DataBase::createTableMode END" ; return execQuery(Q_FUNC_INFO, stringQuery); } bool DataBase::populateTableMode(const bool NoTmp) { //qDebug() << "DataBase::populateTableMode" ; //QSqlQuery query; QString tableName = QString(); QString squery = QString(); if (NoTmp) { tableName = "mode"; } else { tableName = "modetemp"; } bool sqlOK = execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('AM', 'AM', 'PH', '0')").arg(tableName)); //int errorCode = -1; if (!sqlOK) { //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataBase::populateTableMode: Mode table population FAILED" ; //errorCode = query.lastError().nativeErrorCode(); } else { //qDebug() << "DataBase::populateTableMode: Mode table population OK" ; } execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ARDOP', 'ARDOP', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('AMTORFEC', 'TOR', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ASCI', 'RTTY', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ATV', 'ATV', 'NO', '0')").arg(tableName)); //execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('C4FM', 'C4FM', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('CHIP', 'CHIP', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('CHIP64', 'CHIP', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('CHIP128', 'CHIP', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('CLO', 'CLO', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('CONTESTI', 'CONTESTI', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('CW', 'CW', 'CW', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DIGITALVOICE', 'DIGITALVOICE', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('C4FM', 'DIGITALVOICE', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DMR', 'DIGITALVOICE', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DSTAR', 'DIGITALVOICE', 'NO', '0')").arg(tableName)); //execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DSTAR', 'DSTAR', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('VARA HF', 'DYNAMIC', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('VARA SATELLITE', 'DYNAMIC', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('VARA FM 1200', 'DYNAMIC', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('VARA FM 9600', 'DYNAMIC', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DOMINO', 'DOMINO', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DOMINOEX', 'DOMINO', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('DOMINOF', 'DOMINO', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FAX', 'FAX', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FM', 'FM', 'PH', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FMHELL', 'HELL', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FT4', 'MFSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FST4', 'MFSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FST4W', 'MFSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FT8', 'FT8', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FSK31', 'PSK', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FSK441', 'FSK441', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FSKHELL', 'HELL', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('FSQCALL', 'MFSK', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('GTOR', 'TOR', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('HELL', 'HELL', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('HELL80', 'HELL', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('HFSK', 'HELL', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ISCAT', 'ISCAT', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ISCAT-A', 'ISCAT', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ISCAT-B', 'ISCAT', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JS8', 'MFSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4', 'JT4', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4A', 'JT4', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4B', 'JT4', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4C', 'JT4', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4D', 'JT4', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4E', 'JT4', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4F', 'JT4', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT4G', 'JT4', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT6M', 'JT6M', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9-1', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9-2', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9-5', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9-10', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9-30', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9A', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9B', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9C', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9D', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9E', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9E FAST', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9F', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9F FAST', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9G', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9G FAST', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9H', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT9H FAST', 'JT9', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT44', 'JT44', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT65', 'JT65', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT65A', 'JT65', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT65B', 'JT65', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT65B2', 'JT65', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT65C', 'JT65', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('JT65C2', 'JT65', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK', 'MFSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK4', 'MFSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK8', 'MFSK', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK11', 'MFSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK16', 'MFSK', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK22', 'MFSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK31', 'MFSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK32', 'MFSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK64', 'MFSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MFSK128', 'MFSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MSK144', 'MSK144', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('MT63', 'MT63', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA', 'OLIVIA', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA 4/125', 'OLIVIA', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA 4/250', 'OLIVIA', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA 8/250', 'OLIVIA', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA 8/500', 'OLIVIA', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA 16/500', 'OLIVIA', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA 16/1000', 'OLIVIA', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OLIVIA 32/1000', 'OLIVIA', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OPERA', 'OPERA', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OPERA-BEACON', 'OPERA', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('OPERA-QSO', 'OPERA', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PAC', 'PAC', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PAC2', 'PAC', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PAC3', 'PAC', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PAC4', 'PAC', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PAX', 'PAX', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PAX2', 'PAX', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PCW', 'CW', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PKT', 'PKT', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK', 'PSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK10', 'PSK', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK31', 'PSK', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK63', 'PSK', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK63F', 'PSK', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK125', 'PSK', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK250', 'PSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK500', 'PSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK1000', 'PSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSKAM10', 'PSK', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSKAM31', 'PSK', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSKAM50', 'PSK', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSKFEC31', 'PSK', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSK2K', 'PSK2K', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('PSKHELL', 'HELL', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('Q15', 'Q15', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('Q65', 'MFSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QPSK31', 'PSK', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QPSK63', 'PSK', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QPSK125', 'PSK', 'DG', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QPSK250', 'PSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QPSK500', 'PSK', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QRA64', 'QRA64', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QRA64A', 'QRA64', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QRA64B', 'QRA64', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QRA64C', 'QRA64', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QRA64D', 'QRA64', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('QRA64E', 'QRA64', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ROS', 'ROS', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ROS-EME', 'ROS', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ROS-HF', 'ROS', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('ROS-MF', 'ROS', 'DG', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('RTTY', 'RTTY', 'RY', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('RTTYM', 'RTTYM', 'RY', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('SSB', 'SSB', 'PH', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('LSB', 'SSB', 'PH', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('USB', 'SSB', 'PH', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('SIM31', 'PSK', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('SSTV', 'SSTV', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('T10', 'T10', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('THRB', 'THRB', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('THRBX', 'THRB', 'NO', '1')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('THOR', 'THOR', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('TOR', 'TOR', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('V4', 'V4', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('VOI', 'VOI', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('WINMOR', 'WINMOR', 'NO', '0')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (submode, name, cabrillo, deprecated) VALUES ('WSPR', 'WSPR', 'NO', '0')").arg(tableName)); createTheModeQuickReference(); //qDebug() << "DataBase::populateTableMode END" ; return true; } bool DataBase::createTableSatellites(const bool NoTmp) { // NoTmp = false => TMP data table to operate and be deleted afterwards //Creating the Sats DB to be able to include satellites to the LOTW //qDebug() << "DataBase::createTableSatellites" ; // The satmode column has the following format: {Up/down-mode;Up/down-mode} // this way we can implement several freqs/modes per sat // Initially I will implement Up/Down only but KLog should be prepared to work with "-mode" also // being mode "SSB, CW, ... and other ADIF modes QString stringQuery = QString(); QString table = QString(); if (NoTmp) { table = "satellites" ; } else { table = "satellitestemp" ; } stringQuery = "CREATE TABLE "+ table; stringQuery = stringQuery + QString(" (id INTEGER PRIMARY KEY AUTOINCREMENT, " "satarrlid VARCHAR, " "satname VARCHAR, " "uplink VARCHAR," "downlink VARCHAR," "satmode VARCHAR, " "UNIQUE (satarrlid) )"); /* * * uplink/downlink format is the following: * Single frecuency: 145.950 * Segment: 145.950-145.975 * Several freqs: 145.950,435.950 * Several segments: 145.950-145.975,435.950-435.975 * * satmode format: * Single mode: FM * Modes complex Up/Downlink: USB/LSB * Several modes (one per uplink/downlink pair): FM,SSB * Several complex modes (one per uplink/downlink pair): USB/LSB,LSB/USB,FM * */ QString delS = QString(); delS = "DROP TABLE IF exists " + table; execQuery(Q_FUNC_INFO, delS); return execQuery(Q_FUNC_INFO, stringQuery); } bool DataBase::populateTableSatellites(const bool NoTmp) { // Data must come from: // https://lotw.arrl.org/lotw-help/frequently-asked-questions/#sats //qDebug() << "DataBase::populateTableSatellites" ; //QSqlQuery query; QString tableName = QString(); QString squery = QString(); if (NoTmp) { tableName = "satellites"; } else { tableName = "satellitestemp"; } // The satmode column has the following format: {Up/down-mode;Up/down-mode} // this way we can implement several freqs/modes per sat // Initially I will implement Up/Down only but KLog should be prepared to work with "-mode" also // being mode "SSB, CW, ... and other ADIF modes //To add a band, just create another line: execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-10', 'AMSAT-OSCAR 10', '435.030,146.180', '145.81', 'SSB,CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-13', 'AMSAT-OSCAR 13', '435.423-435.573', '145.975-145.825', 'SSB,CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-16', 'AMSAT-OSCAR 16', '145.92', '437.026', 'FM/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-21', 'OSCAR 21/RS-14', '', '145.8', 'CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-24', 'Arsene-OSCAR 24', '', '145.975', 'PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-27', 'AMRAD-OSCAR 27', '145.85', '436.795', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-3', 'AMSAT-OSCAR 3', '145.975-146.025', '144.325-144.375', 'SSB,CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-4', 'AMSAT-OSCAR 4', '432.145-432.155', '144.300-144.310', 'SSB,CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-40', 'AMSAT-OSCAR 40','145.840-145.990,435.790-435.520', '2401.2225-2401.475', 'SSB,CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-51', 'AMSAT-OSCAR 51', '145.92', '435.3', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-6', 'AMSAT-OSCAR 6', '145.900-146.000', '29.450-29.550', 'SSB,CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-7', 'AMSAT-OSCAR 7', '145.850-145.950,432.180-432.120', '29.400-29.500,145.920-145.980', 'USB,LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-73', 'AMSAT-OSCAR 73', '435.150-435.130', '145.950-145.970', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-8', 'AMSAT-OSCAR 8', '145.850-145.900,145.900-146.000', '29.400-29.500,435.200-435.100', 'SSB,CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-85', 'AMSAT-OSCAR 85 (Fox-1A)', '435.170', '145.980', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('ARISS', 'ARISS', '145.200,144.490', '145.800,145.800', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('BIRD-BT', 'BHUTAN-1', '145.825', ',145.825', 'PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('BIRD-MY', 'UiTMSat-1', '145.825', ',145.825', 'PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('BIRD-PH', 'MAYA-1', '145.825', ',145.825', 'PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('BY70-1', 'Bayi Kepu Weixing 1', '145.92', '436.2', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('CAS-3H', 'LilacSat 2', '144.350,144.390', '437.225,144.390', 'FM,PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('CAS-4A', 'CAMSAT 4A', '435.210-435.230', '145.880-145.860', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('CAS-4B', 'CAMSAT 4B', '435.270-435.290', '145.935-145.915', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('DO-64', 'Delfi OSCAR-64', '', '145.870', 'CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('EO-79', 'FUNcube-3', '435.047-435.077', '145.935-145.965', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('EO-88', 'Emirates OSCAR 88 (Nayif-1)', '435.045-435.015', '145.960-145.990', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('FO-12', 'Fuji-OSCAR 12', '145.900-146.000,145.85', '435.900-435.800,435.91', 'SSB,PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('FO-20', 'Fuji-OSCAR 20', '145.900-146.000', '435.900-435.800', 'SSB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('FO-29', 'Fuji-OSCAR 29', '145.900-145.999', '435.900-435.800', 'LSB/USB,CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('HO-68', 'Hope OSCAR 68', '145.925-145.975,145.825', '435.765-435.715,435.675', 'LSB/USB,FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('IO-86', 'Indonesia OSCAR 86 (LAPAN-ORARI)', '435.880', '145.880', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('LO-19', 'Lusat-OSCAR 19', '145.840-145.900', '437.125-437.150', 'CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('LO-78', 'LituanicaSAT-1', '145.95,145.85', '435.1755,437.543', 'FM,PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('LO-87', 'LUSEX-OSCAR 87', '435.935-435.965', '145.935-145.965', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('MIREX', 'Mir packet digipeater', '145.985', '145.985', 'PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('NO-44', 'Navy-OSCAR 44', '145.827', '145.827', 'PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('NO-83', 'BRICsat','145.825,28.120', '145.825,435.975','PKT,PSK31')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('NO-84', 'PSAT', '145.825,28.120', '435.350', 'PKT,PSK31')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-1', 'Radio Sputnik 1', '145', '29', '')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-10', 'Radio Sputnik 10', '','29.357,29.403', '')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-11', 'Radio Sputnik 11', '','29.357,29.403', '')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-12', 'Radio Sputnik 12', '21.210-21.250', '29.410-29.450', 'SSB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-13', 'Radio Sputnik 13', '21.260-21.300', '145.860-145.900', 'SSB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-15', 'Radio Sputnik 15', '', '29.3525-29.3987', '')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-2', 'Radio Sputnik 2', '145', '29', '')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('RS-44', 'DOSAAF-85', '145.935-145.995', '435.610-435.670', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, satmode) VALUES ('RS-5', 'Radio Sputnik 5', 'CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, satmode) VALUES ('RS-6', 'Radio Sputnik 6', '')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, satmode) VALUES ('RS-7', 'Radio Sputnik 7', 'CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, satmode) VALUES ('RS-8', 'Radio Sputnik 8', '')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('SAREX', 'Shuttle Amateur Radio Experiment packet digipeater', '144.80,144.49', '144.55', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('SO-35', 'Sunsat-OSCAR 35', '436.291', '145.825', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('SO-41', 'Saudi-OSCAR 41', '145.850', '436.775', 'CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('SO-50', 'Saudi-OSCAR 50', '145.850', '436.795', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('SO-67', 'Sumbandila OSCAR 67', '145.875', '435.345', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('UKUBE1', 'UKube-1 (FUNcube-2)', '435.080-435.060', '145.930-145.950,2401.0', 'LSB/USB,CW')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('UO-14', 'UOSAT-OSCAR 14', '145.975', '435.07', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('VO-52', 'VUsat-OSCAR 52', '435.220-435.280,435.225-435.275', '145.930-145.870,145.925-145.875', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('XW-2A', 'Hope 2A (CAS-3A)', '435.030-435.050', '145.665-145.685', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('XW-2B', 'Hope 2B (CAS-3B)', '435.090-435.110', '145.730-145.750', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('XW-2C', 'Hope 2C (CAS-3C)', '435.150-435.170', '145.795-145.815', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('XW-2D', 'Hope 2D (CAS-3D)', '435.210-435.230', '145.860-145.880', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('XW-2E', 'Hope 2E (CAS-3E)', '435.270-435.290', '145.915-145.935', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('XW-2F', 'Hope 2F (CAS-3F)', '435.330-435.350', '145.980-145.999', 'LSB/USB')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('LO-90', 'LilacSat-OSCAR 90 (LilacSat-1)', '145.985', '436.510', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-91', 'RadFxSat (Fox-1B)', '435.250', '145.960', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('AO-92', 'Fox-1D', '435.350,1267.35', '145.880', 'FM')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('FS-3', 'FalconSat-3', '435.103', '145.840', 'PKT')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (satarrlid, satname, uplink, downlink, satmode) VALUES ('QO-100', 'Es''hail-2', '2400.050-2409.500', '10489.550-10499.000', 'SSB,CW')").arg(tableName)); //qDebug() << "DataBase::populateTableSatellites - END" ; return true; } bool DataBase::createTableEntity(const bool NoTmp) { // NoTmp = false => TMP data table to operate and be deleted afterwards //qDebug() << "DataBase::createTableEntity" ; QString stringQuery = QString(); //QSqlQuery query; if (NoTmp) { stringQuery = "CREATE TABLE entity" ; } else { stringQuery = "CREATE TABLE entitytemp" ; } stringQuery = stringQuery + QString( " (id INTEGER PRIMARY KEY AUTOINCREMENT, " "name VARCHAR(40) NOT NULL," "cqz INTEGER NOT NULL, " "ituz INTEGER NOT NULL, " "continent INTEGER NOT NULL, " "latitude REAL NOT NULL, " "longitude REAL NOT NULL, " "utc INTEGER NOT NULL, " "dxcc INTEGER NOT NULL, " "mainprefix VARCHAR(15) NOT NULL, " "deleted INTEGER, " "sincedate VARCHAR(10), " "todate VARCHAR(10), " "isoname VARCHAR(10), " "UNIQUE (dxcc, mainprefix), " "FOREIGN KEY (continent) REFERENCES continent(shortname) )"); //qDebug() << "DataBase::createTableEntity END" ; return execQuery(Q_FUNC_INFO, stringQuery); //TODO: To add some columns in this the table to mark if worked/confirmed/band/Mode } bool DataBase::createTableBand(const bool NoTmp) { // NoTmp = false => TMP data table to operate and be deleted afterwards //qDebug() << "DataBase::createTableBand" ; QString stringQuery = QString(); //QSqlQuery query; if (NoTmp) { stringQuery = "CREATE TABLE band" ; } else { stringQuery = "CREATE TABLE bandtemp" ; } stringQuery = stringQuery + QString(" (id INTEGER PRIMARY KEY AUTOINCREMENT, " "lower REAL NOT NULL, " "upper REAL NOT NULL, " "cabrillo VARCHAR(6) NOT NULL, " "name VARCHAR(40) NOT NULL, " "UNIQUE (lower, upper, cabrillo, name) )"); //qDebug() << "DataBase::createTableBand END" ; return execQuery(Q_FUNC_INFO, stringQuery); } bool DataBase::syncLogQSOsOnBandTableChange() { //qDebug() << Q_FUNC_INFO ; QString stringQuery; QSqlQuery query; stringQuery = "SELECT DISTINCT log.bandid FROM log ORDER BY bandid DESC"; if (!query.exec(stringQuery)) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } QList bandIDs; bandIDs.clear(); int bandid = -1; while(query.next()) { if (!query.isValid()) { query.finish(); return false; } bandid = (query.value(0)).toInt(); if (bandid>0) { bandIDs.append (bandid); bandid = -1; } } if (bandIDs.length ()>0) { foreach(int i, bandIDs) { stringQuery = QString("UPDATE log SET bandid = (SELECT DISTINCT bandtemp.id FROM bandtemp INNER JOIN band ON band.name = bandtemp.name WHERE band.id='%1') WHERE log.bandid='%1'").arg(i); //qDebug() << Q_FUNC_INFO << ": " << stringQuery ; if (!query.exec(stringQuery)) { query.finish(); return false; } } } query.finish (); //qDebug() << Q_FUNC_INFO << " - END" ; return true; } bool DataBase::populateTableBand(const bool NoTmp) { // Cabrillo definition: http://wwrof.org/cabrillo/cabrillo-specification-v3/ //qDebug() << "DataBase::populateTableBand" ; QString tableName = QString(); QString squery = QString(); if (NoTmp) { tableName = "band"; } else { tableName = "bandtemp"; } //To add a band, just create another line: execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('0', '0', '0', 'Light')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('1mm', '241000', '250000', '241G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('2mm', '142000', '149000', '142G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('2.5mm', '119980', '120020', '119G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('4mm', '75500', '81000', '75G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('6mm', '47000', '47200', '47G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('1.25CM', '24000', '24250', '24G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('3CM', '10000', '10500', '10G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('6CM', '5650', '5925', '5.7G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('9CM', '3300', '3500', '3.4G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('13CM', '2340', '2450', '2.3G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('23CM', '1240', '1300', '1.2G')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('33CM', '902', '928', '902')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('70CM', '420', '450', '432')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('1.25M', '222', '225', '222')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('2M', '144', '148', '144')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('4M', '70', '71', '70')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('5M', '54.000001', '69.9', '5M')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('6M', '50', '54', '50')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('8M', '40', '45', '40')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('10M', '28.0', '29.7', '28000')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('12M', '24.89', '24.99', '24900')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('15M', '21.0', '21.45', '21000')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('17M', '18.068', '18.168', '18100')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('20M', '14.0', '14.35', '14000')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('30M', '10.0', '10.15', '10000')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('40M', '7.0', '7.3', '7000')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('60M', '5.102', '5.404', '60M')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('80M', '3.5', '4.0', '3500')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('160M', '1.8', '2.0', '1800')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('560M', '0.501', '0.504', '560M')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('630M', '0.472', '0.479', '630M')").arg(tableName)); execQuery(Q_FUNC_INFO, QString("INSERT INTO %1 (name, lower, upper, cabrillo) VALUES ('2190M', '0.1357', '0.1378', '2190M')").arg(tableName)); createTheBandQuickReference(); //qDebug() << "DataBase::populateTableBand END" ; return true; } bool DataBase::populatePropagationModes() { //qDebug() << "DataBase::populatePropagationModes" ; //QSqlQuery query; execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('AS', 'Aircraft Scatter')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('AUR', 'Aurora')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('AUE', 'Aurora-E')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('BS', 'Back scatter')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('ECH', 'EchoLink')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('EME', 'Earth-Moon-Earth')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('ES', 'Sporadic E')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('FAI', 'Field Aligned Irregularities')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('F2', 'F2 Reflection')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('GWAVE', 'Ground Wave')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('INTERNET', 'Internet-assisted')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('ION', 'Ionoscatter')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('IRL', 'IRLP')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('LOS', 'Line of Sight')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('MS', 'Meteor scatter')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('RPT', 'Terrestrial or atmospheric repeater or transponder')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('RS', 'Rain scatter')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('SAT', 'Satellite')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('TEP', 'Trans-equatorial')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('TR', 'Tropospheric ducting')")); //qDebug() << "DataBase::populatePropagationModes END" ; return true; } bool DataBase::populateContestData() { //qDebug() << "DataBase::populateContestData" ; // CONTEST DEFINITIONS START HERE // DX execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (0, 0, 0, 0, 0, 0, 0)"); // DX START /* // CQ WW DX SSB START execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 1, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 1, 2, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 2, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 2, 2, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 3, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 3, 2, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 1, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 1, 2, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 2, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 2, 2, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 3, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 3, 2, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 1, 1, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 1, 2, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 2, 1, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 2, 2, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 3, 1, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 3, 2, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 1, 1, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 1, 2, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 2, 1, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 2, 2, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 3, 1, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 3, 2, 1, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 1, 1, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 1, 2, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 2, 1, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 2, 2, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 3, 1, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 1, 3, 2, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 1, 1, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 1, 2, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 2, 1, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 2, 2, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 3, 1, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 1, 2, 3, 2, 2, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 2, 0, 1, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 2, 0, 2, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 3, 0, 1, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 3, 0, 2, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 4, 0, 1, 1, 0, 1)"); execQuery(Q_FUNC_INFO, "INSERT INTO contest (contest, catoperator, catassisted, catpower, catband, catoverlay, catmode) VALUES (1, 5, 0, 0, 0, 0, 1)"); // CQ WW DX SSB END */ //qDebug() << "DataBase::populateContestData END" ; return true; } bool DataBase::howManyQSOsInLog(const int i) { //qDebug() << "DataBase::howManyQSOsInLog" ; QSqlQuery query; QString sqlQueryString = QString("SELECT COUNT(id) from log WHERE lognumber='%1'").arg(i); bool sqlOK = query.exec(sqlQueryString); if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataBase::howManyQSOsInLog OK END" ; return (query.value(0)).toInt(); } else { //qDebug() << "DataBase::howManyQSOsInLog END-1" ; query.finish(); return false; } } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "DataBase::howManyQSOsInLog END-2" ; return false; } //query.finish(); //return -2; } bool DataBase::updateTo006() {// Updates the DB to 0.0.6 //qDebug() << "DataBase::updateTo006: latestRead: " << getDBVersion() ; bool IAmIn006 = false; bool IAmIn005 = false; bool ErrorUpdating = false; QString stringQuery = QString(); bool sqlOk = false; latestReaded = getDBVersion().toFloat(); if (latestReaded >= 0.006f) { return true; } else { IAmIn006 = false; } while (!IAmIn006 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo006: - Still not in 006" ; while (!IAmIn005 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo006: - And still not in 005" ; IAmIn005 = updateTo005(); } //qDebug() << "DataBase::updateTo006: - Already in 005" ; if (ErrorUpdating) { //qDebug() << "DataBase::updateTo006: UPDATED NOK!(0)" ; return false; } sqlOk = updateDBVersion(softVersion, "0.006"); if(sqlOk) { //qDebug() << "DataBase::updateTo006: - DB Updated" ; sqlOk = recreatePropModes(); if(sqlOk) { //qDebug() << "DataBase::updateTo006: - recreatePropModes OK" ; sqlOk = updateTableLog(6); // We copy the log into logtemp } else { //qDebug() << "DataBase::updateTo006: - recreatePropModes NOK" ; ErrorUpdating = true; IAmIn006 = false; //qDebug() << "DataBase::updateTo006: UPDATED NOK!(1)" ; return false; } sqlOk = createTableBand(false); // We create the bandTemp if (sqlOk) { //qDebug() << "DataBase::updateTo006: - createTableBand OK" ; } else { //qDebug() << "DataBase::updateTo006: UPDATED NOK!(2)" ; ErrorUpdating = true; //return false; } sqlOk = populateTableBand(false); // Populate the bandTemp if (sqlOk) { //qDebug() << "DataBase::updateTo006: - populateTableBand OK" ; } else { //qDebug() << "DataBase::updateTo006: UPDATED NOK!(3)" ; ErrorUpdating = true; } sqlOk = updateBandIdTableLogToNewOnes(); if (sqlOk) { //qDebug() << "DataBase::updateTo006: - updateBandIdTableLogToNewOnes OK" ; } else { //qDebug() << "DataBase::updateTo006: UPDATED NOK!(4)" ; ErrorUpdating = true; } sqlOk = updateBandIdTableAward(1); // DXCC if (sqlOk) { //qDebug() << "DataBase::updateTo006: - updateBandIdTableAward 1 OK" ; } else { //qDebug() << "DataBase::updateTo006: UPDATED NOK!(5)" ; ErrorUpdating = true; } sqlOk = updateBandIdTableAward(2); // WAZ if (sqlOk) { //qDebug() << "DataBase::updateTo006: - updateBandIdTableAward 2 OK" ; } else { //qDebug() << "DataBase::updateTo006: UPDATED NOK!(6)" ; ErrorUpdating = true; } if (execQuery(Q_FUNC_INFO, "DROP TABLE band")) { if (execQuery(Q_FUNC_INFO, "ALTER TABLE bandtemp RENAME TO band")) { //qDebug() << "DataBase::updateTo006 - bandtemp renamed" ; } else { //qDebug() << "DataBase::updateTo006 - ERROR - bandtemp not renamed" ; ErrorUpdating = true; //qDebug() << "DataBase::updateTo006: UPDATED NOK!(7)" ; } } else { //qDebug() << "DataBase::updateTo006 - ERROR - bandtemp not dropped" ; ErrorUpdating = true; IAmIn006 = false; //qDebug() << "DataBase::updateTo006: UPDATED NOK!(8)" ; ErrorUpdating = true; } sqlOk = updateTheModeTableAndSyncLog(); if (sqlOk) { //qDebug() << "DataBase::updateTo006: - updateTheModeTableAndSyncLog OK" ; } else { //qDebug() << "DataBase::updateTo006: UPDATED NOK!(9)" ; ErrorUpdating = true; } sqlOk = createTableClubLogStatus(); if (sqlOk) { //qDebug() << "DataBase::updateTo006: - createTableClubLogStatus OK" ; sqlOk = populateTableClubLogStatus(); if (sqlOk) { //qDebug() << "DataBase::updateTo006: - populateTableClubLogStatus OK" ; } else { //qDebug() << "DataBase::updateTo006: UPDATED NOK!(10)" ; ErrorUpdating = true; } } else { //qDebug() << "DataBase::updateTo006: UPDATED NOK!(11)" ; ErrorUpdating = true; } } else {// Version not updated //qDebug() << "DataBase::updateTo006: - DB NOT Updated" ; ErrorUpdating = true; IAmIn006 = false; //qDebug() << "DataBase::updateTo006: UPDATED NOK!(12)" ; ErrorUpdating = true; } //qDebug() << "DataBase::updateTo006: - IAmIn006 = TRUE" ; IAmIn006 = true; } //DO ALL THE TASKS TO BE IN 0.006 from 0.005 HERE and set ErrorUpdating if it is not possible. //qDebug() << "DataBase::updateTo006 - I am in 006 " ; //qDebug() << "DataBase::updateTo006 - END " ; //qDebug() << "DataBase::updateTo006: UPDATED OK!" ; if (!IAmIn006) { // emit debugLog(Q_FUNC_INFO, "2", 7); } return IAmIn006; } bool DataBase::updateTableLog(const int _v) { //qDebug() << "DataBase::updateTableLog " ; createTableLog(false); QString queryString; switch (_v) { case 6: // If 6, we copy in logtemp the full data coming from the old log. This way, the structure of // the log table is updated without any data loss. queryString = QString ("INSERT INTO logtemp (qso_date, call, rst_sent, rst_rcvd, bandid, modeid, srx, stx, cqz, ituz, dxcc, address, age, cnty, comment, a_index, ant_az, ant_el, ant_path, arrl_sect, band_rx, checkcontest, class, contacted_op, contest_id, country, credit_submitted, credit_granted, distance, email, eq_call, eqsl_qslrdate, eqsl_qslsdate, eqsl_qsl_rcvd, eqsl_qsl_sent, force_init, freq, freq_rx, gridsquare, iota, iota_island_id, k_index, lat, lon, lotw_qslrdate, lotw_qslsdate, lotw_qsl_rcvd, lotw_qsl_sent, max_bursts, ms_shower, my_city, my_cnty, my_country, my_cq_zone, my_gridsquare, my_iota, my_iota_island_id, my_lat, my_lon, my_name, my_rig, my_sig, my_sig_info, my_state, my_street, name, notes, nr_bursts, nr_pings, operator, owner_callsign, pfx, precedence, prop_mode, public_key, qslmsg, qslrdate, qslsdate, qsl_rcvd, qsl_sent, qsl_rcvd_via, qsl_sent_via, qsl_via, qso_complete, qso_random, qth, rx_pwr, sat_mode, sat_name, sfi, sig, sig_info, srx_string, stx_string, state, station_callsign, swl, ten_ten, tx_pwr, web, qso_date_off, marked, lognumber) SELECT qso_date, call, rst_sent, rst_rcvd, bandid, modeid, srx, stx, cqz, ituz, dxcc, address, age, cnty, comment, a_index, ant_az, ant_el, ant_path, arrl_sect, band_rx, checkcontest, class, contacted_op, contest_id, country, credit_submitted, credit_granted, distance, email, eq_call, eqsl_qslrdate, eqsl_qslsdate, eqsl_qsl_rcvd, eqsl_qsl_sent, force_init, freq, freq_rx, gridsquare, iota, iota_island_id, k_index, lat, lon, lotw_qslrdate, lotw_qslsdate, lotw_qsl_rcvd, lotw_qsl_sent, max_bursts, ms_shower, my_city, my_cnty, my_country, my_cq_zone, my_gridsquare, my_iota, my_iota_island_id, my_lat, my_lon, my_name, my_rig, my_sig, my_sig_info, my_state, my_street, name, notes, nr_bursts, nr_pings, operator, owner_callsign, pfx, precedence, prop_mode, public_key, qslmsg, qslrdate, qslsdate, qsl_rcvd, qsl_sent, qsl_rcvd_via, qsl_sent_via, qsl_via, qso_complete, qso_random, qth, rx_pwr, sat_mode, sat_name, sfi, sig, sig_info, srx_string, stx_string, state, station_callsign, swl, ten_ten, tx_pwr, web, qso_date_off, marked, lognumber FROM log"); break; default: //qDebug() << "DataBase::updateTableLog FALSE END" ; return false; //break; } if (execQuery(Q_FUNC_INFO, queryString)) { //qDebug() << "DataBase::updateTableLog: " << QString::number(_v) << " - Query executed" ; queryString = "DROP TABLE log"; if (execQuery(Q_FUNC_INFO, queryString)) { //qDebug() << "DataBase::updateTableLog: " << QString::number(_v) << " - Table log dropped" ; queryString = "ALTER TABLE logtemp RENAME TO log" ; if (execQuery(Q_FUNC_INFO, queryString)) { //qDebug() << "DataBase::updateTableLog: " << QString::number(_v) << " - tmp renamed - END" ; return true; } else { //qDebug() << "DataBase::updateTableLog: " << QString::number(_v) << " - Renaming failed" ; } } else { //qDebug() << "DataBase::updateTableLog: " << QString::number(_v) << " - Table log Not dropped" ; } } else { //qDebug() << "DataBase::updateTableLog: " << QString::number(_v) << " - query failed" ; } //qDebug() << "DataBase::updateTableLog END" ; return false; } bool DataBase::createTableClubLogStatus() { //qDebug() << "createTableClubLogStatus" ; execQuery(Q_FUNC_INFO, "DROP TABLE IF exists clublog_status"); QString queryString = QString("CREATE TABLE clublog_status (" "id INTEGER PRIMARY KEY AUTOINCREMENT, " "shortname VARCHAR(1) NOT NULL, " "name VARCHAR(15) NOT NULL)"); return execQuery(Q_FUNC_INFO, queryString); } bool DataBase::populateTableClubLogStatus() { //qDebug() << "populateTableClubLogStatus" ; QString queryString = "INSERT INTO clublog_status (shortname, name) VALUES ('Y', 'Uploaded')"; if (execQuery(Q_FUNC_INFO, queryString)) { queryString = "INSERT INTO clublog_status (shortname, name) VALUES ('N', 'Do not upload')"; if (execQuery(Q_FUNC_INFO, queryString)) { queryString = "INSERT INTO clublog_status (shortname, name) VALUES ('M', 'Modified')"; //qDebug() << "populateTableClubLogStatus END" ; return execQuery(Q_FUNC_INFO, queryString); } } //qDebug() << "populateTableClubLogStatus FALSE END" ; return false; } bool DataBase::updateTableEntity() { //qDebug() << "DataBase::updateTableEntity" ; bool result = false; QString stringQuery; bool sqlOk; result = createTableEntity(false); // Now we have a temp entity table with the correct format if (result) { //qDebug() << "DataBase::updateTableEntity: Table entitytemp created!" ; // Now we need to move all the data from the old to the temp entity table. stringQuery = QString("INSERT INTO entitytemp (name, cqz, ituz, continent, latitude, longitude, utc, dxcc, mainprefix, deleted, sincedate, todate) SELECT name, cqz, ituz, continent, latitude, longitude, utc, dxcc, mainprefix, deleted, sincedate, todate FROM entity"); sqlOk = execQuery(Q_FUNC_INFO, stringQuery); if (sqlOk) { //qDebug() << "DataBase::updateTableEntity: Data copied from entity to entitytemp!" ; stringQuery = "DROP TABLE entity"; if (execQuery(Q_FUNC_INFO, stringQuery)) { //qDebug() << "DataBase::updateTableEntity: Table entity DELETED" ; stringQuery = "ALTER TABLE entitytemp RENAME TO entity"; return execQuery(Q_FUNC_INFO, stringQuery); } else { return false; } } else { //qDebug() << "DataBase::updateTableEntity: Data NOT copied from entity to entitytemp!" ; //TODO: If it fails, we should manage errors... return false; } } else { //qDebug() << "DataBase::updateTableEntity: Table entitytemp NOT created!" ; return false; } //return false; } bool DataBase::updateTableLogs() { //qDebug() << "DataBase::updateTableLogs" ; bool result = false; QString stringQuery; bool sqlOk; result = createTableLogs(false); // Now we have a temp entity table with the correct format if (result) { //qDebug() << "DataBase::updateTableLogs: Table logstemp created!" ; // Now we need to move all the data from the old to the temp logs table. stringQuery = QString("INSERT INTO logstemp (logdate, stationcall, comment, logtype, logtypen) SELECT logdate, stationcall, comment, logtype, logtypen FROM logs"); sqlOk = execQuery(Q_FUNC_INFO, stringQuery); if (sqlOk) { //qDebug() << "DataBase::updateTableLogs: data copied" ; stringQuery = "DROP TABLE logs"; if (execQuery(Q_FUNC_INFO, stringQuery)) { //qDebug() << "DataBase::updateTableLogs: Table logs DELETED" ; stringQuery = "ALTER TABLE logstemp RENAME TO logs"; return execQuery(Q_FUNC_INFO, stringQuery); } else { //qDebug() << "DataBase::updateTableLogs: Table logs NOT DELETED" ; return false; } } else { //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataBase::updateTableLogs: data NOT copied" ; //TODO: If it fails, we should manage errors... return false; } } else { //qDebug() << "DataBase::updateTableLogs: Table logstemp NOT created!" ; return false; } //qDebug() << "DataBase::updateTableLogs: END" ; //return false; } bool DataBase::updateModeIdFromSubModeId() {// Updates the log with the new mode IDs in each QSO: // STEP-1: Get the modeid and QSOid from the log // STEP-2: uses the modeid to get the name of the mode in the mode table (the old one) // STEP-3: uses the name of the mode in the modetemp table (the new one) to get the new ID // STEP-4: Updates the new ID in the QSO in the log //TODO: Optimize this function //qDebug() << "DataBase::updateModeIdFromSubModeId: " ; bool cancel = false; bool alreadyCancelled = false; QString modetxt = QString(); QString sq = QString(); bool sqlOk2 = false; bool sqlOk3 = false; int modeFound = -1; int id = -1; int qsos; int i = 0; QString aux; QSqlQuery query, query2; bool sqlOk = query.exec("SELECT COUNT (*) FROM log"); if (sqlOk) { //QSqlDatabase::database().commit(); query.next(); qsos = (query.value(0)).toInt(); query.finish(); } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "DataBase::updateModeIdFromSubModeId: FALSE END" ; return false; } int step = util->getProgresStepForDialog(qsos); QProgressDialog progress(QObject::tr("Updating mode information..."), QObject::tr("Abort updating"), 0, qsos); progress.setMaximum(qsos); progress.setWindowModality(Qt::WindowModal); sqlOk = query.exec("SELECT modeid, id FROM log ORDER BY modeid"); // STEP-1 if (sqlOk) { while (query.next()) { modetxt = QString(); modeFound = -1; if (query.isValid()) { i++; if (( (i % step )== 0) ) { // To update the speed I will only show the progress once each X QSOs aux = QObject::tr("Updating mode information...") + "\n" + QObject::tr("QSO: ") + QString::number(i) + "/" + QString::number(qsos); progress.setLabelText(aux); progress.setValue(i); } modeFound = (query.value(0)).toInt(); id = (query.value(1)).toInt(); //qDebug() << "DataBase::updateModeIdFromSubModeId: (STEP-1) modeFound (numb): " << QString::number(modeFound) ; modetxt = getModeNameFromNumber(modeFound, false); //STEP-2 //qDebug() << "DataBase::updateModeIdFromSubModeId: (STEP-2) mode found (txt): " << modetxt ; //TODO The following query can be executed in: getModeIdFromSubMode() sq = QString("SELECT id FROM modetemp WHERE submode='%1'").arg(modetxt); // STEP-3 sqlOk2 = query2.exec(sq); if (sqlOk2) { //qDebug() << "DataBase::updateModeIdFromSubModeId: (STEP-3) sqlOK2 TRUE" ; if (query2.next()) { if (query2.isValid()) { modeFound = query2.value(0).toInt(); query2.finish(); sq = QString ("UPDATE log SET modeid='%1' WHERE id='%2'").arg(modeFound).arg(id); // STEP-4 sqlOk3 = execQuery(Q_FUNC_INFO, sq); if (sqlOk3) { //qDebug() << "DataBase::updateModeIdFromSubModeId: (STEP-4) ID: " << QString::number(id) << " updated to: " << QString::number(modeFound) <<"/"<< modetxt ; } else { //queryErrorManagement(Q_FUNC_INFO, query3.lastError().databaseText(), query3.lastError().nativeErrorCode(), query3.lastQuery()); //qDebug() << "DataBase::updateModeIdFromSubModeId: (STEP-4) ID: " << QString::number(id) << " NOT updated-2" ; } } else { query2.finish(); //qDebug() << "DataBase::updateModeIdFromSubModeId: (STEP-3) query2 not valid " ; } } else { //qDebug() << "DataBase::updateModeIdFromSubModeId: query2 not next " ; } } else { queryErrorManagement(Q_FUNC_INFO, query2.lastError().databaseText(), query2.lastError().nativeErrorCode(), query2.lastQuery()); query2.finish(); //qDebug() << "DataBase::updateModeIdFromSubModeId: ID: " << QString::number(id) << " NOT updated-1" ; } } if ( progress.wasCanceled() ) { if (!alreadyCancelled) { alreadyCancelled = true; QMessageBox msgBox; msgBox.setWindowTitle(QObject::tr("KLog - DB update")); aux = QObject::tr("Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel?"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked cancel = true; break; case QMessageBox::No: // No Save was clicked cancel = false; progress.setCancelButton(nullptr); break; default: // should never be reached cancel = false; break; } } } } query.finish(); if (cancel && (!alreadyCancelled)) { //qDebug() << "DataBase::updateModeIdFromSubModeId: FALSE END 2" ; query.finish(); return false; } //qDebug() << "DataBase::updateModeIdFromSubModeId: END" ; query.finish(); return true; } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataBase::updateModeIdFromSubModeId: FALSE END 3" ; query.finish(); return false; } //qDebug() << "DataBase::updateModeIdFromSubModeId: CHECK IF this is seen - END" ; //query.finish(); //return false; } bool DataBase::updateBandIdTableLogToNewOnes() { //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: " ; QString bandtxt = QString(); bool cancel = false; bool alreadyCancelled = false; //int errorCode = -1; QString sq = QString(); bool sqlOk2 = false; bool sqlOk3 = false; int bandFound = -1; int id = -1; int qsos; int i = 0; QString aux; QSqlQuery query, query2; bool sqlOk = query.exec("SELECT COUNT (*) FROM log"); if (sqlOk) { query.next(); qsos = (query.value(0)).toInt(); query.finish(); } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: FALSE END" ; query.finish(); return false; } int step = util->getProgresStepForDialog(qsos); QProgressDialog progress(QObject::tr("Updating bands information..."), QObject::tr("Abort updating"), 0, qsos); progress.setMaximum(qsos); progress.setWindowModality(Qt::WindowModal); sqlOk = query.exec("SELECT bandid, id FROM log ORDER BY bandid DESC"); if (sqlOk) { while (query.next() && (!cancel) ) { bandtxt = QString(); bandFound = -1; if (query.isValid()) { i++; if (( (i % step )== 0) ) { // To update the speed I will only show the progress once each X QSOs aux = QObject::tr("Updating bands information...") + "\n" + QObject::tr("QSO: ") + QString::number(i) + "/" + QString::number(qsos); progress.setLabelText(aux); progress.setValue(i); } bandFound = (query.value(0)).toInt(); id = (query.value(1)).toInt(); bandtxt = getBandNameFromNumber(bandFound); //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: band found: " << bandtxt ; sq = QString("SELECT id FROM bandtemp WHERE name='%1'").arg(bandtxt); sqlOk2 = query2.exec(sq); if (sqlOk2) { if (query2.next()) { if (query2.isValid()) { bandFound = query2.value(0).toInt(); sq = QString ("UPDATE log SET bandid='%1' WHERE id='%2'").arg(bandFound).arg(id); query.finish(); sqlOk3 = execQuery(Q_FUNC_INFO, sq); if (sqlOk3) { //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: ID: " << QString::number(id) << " updated to: " << QString::number(bandFound) <<"/"<< bandtxt ; } else { //queryErrorManagement(Q_FUNC_INFO, query3.lastError().databaseText(), query3.lastError().nativeErrorCode(), query3.lastQuery()); //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: ID: " << QString::number(id) << " NOT updated-2" ; //qDebug() << "DataBase::updateBandIdTableLogToNewOnes - QSOs not updated to main log" ; } } else { //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: query2 not valid " ; } } else { //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: query2 not next " ; } query2.finish(); } else { queryErrorManagement(Q_FUNC_INFO, query2.lastError().databaseText(), query2.lastError().nativeErrorCode(), query2.lastQuery()); query2.finish(); //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: ID: " << QString::number(id) << " NOT updated-1" ; } } if ( progress.wasCanceled() ) { if (!alreadyCancelled) { alreadyCancelled = true; QMessageBox msgBox; msgBox.setWindowTitle(QObject::tr("KLog - DB update")); aux = QObject::tr("Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel?"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked cancel = true; break; case QMessageBox::No: // No Save was clicked cancel = false; progress.setCancelButton(nullptr); break; default: // should never be reached cancel = false; break; } } } } query.finish(); if (cancel && (!alreadyCancelled)) { //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: FALSE END 2" ; return false; } //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: END OK" ; return true; } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "DataBase::updateBandIdTableLogToNewOnes: FALSE END 3" ; return false; } } bool DataBase::updateBandIdTableAward(const int _db) { //qDebug() << "DataBase::updateBandIdTableAward: " ; QString table = QString(); QString field = QString(); QString awardSelected = QString(); switch (_db) { case 1: // table = "awarddxcc"; field = "band"; awardSelected = "DXCC"; break; case 2: table = "awardwaz"; field = "band"; awardSelected = "WAZ"; break; default: //qDebug() << "DataBase::updateBandIdTableAward: FALSE END" ; return false; //break; } QString bandtxt = QString(); bool cancel = false; bool alreadyCancelled = false; QString sq = QString(); bool sqlOk2 = false; bool sqlOk3 = false; int bandFound = -1; int id = -1; int qsos; int i = 0; QString aux; QSqlQuery query, query2; sq = QString("SELECT COUNT (*) FROM %1").arg(table); bool sqlOk = query.exec(sq); if (sqlOk) { query.next(); qsos = (query.value(0)).toInt(); query.finish(); } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "DataBase::updateBandIdTableAward: FALSE END-2" ; return false; } int step = util->getProgresStepForDialog(qsos); QString progressmsg = QString(QObject::tr("Updating bands information in %1 status...")).arg(awardSelected); QProgressDialog progress(progressmsg, QObject::tr("Abort updating"), 0, qsos); progress.setMaximum(qsos); progress.setWindowModality(Qt::WindowModal); sq = QString("SELECT %1, id FROM %2 ORDER BY %3 DESC").arg(field).arg(table).arg(field); sqlOk = query.exec(sq); if (sqlOk) { while (query.next() && (!cancel) ) { bandtxt = QString(); bandFound = -1; if (query.isValid()) { i++; if (( (i % step )== 0) ) { // To update the speed I will only show the progress once each X QSOs aux = QObject::tr("Updating bands information...") + "\n" + QObject::tr("Progress: ") + QString::number(i) + "/" + QString::number(qsos); progress.setLabelText(aux); progress.setValue(i); } bandFound = (query.value(0)).toInt(); id = (query.value(1)).toInt(); bandtxt = getBandNameFromNumber(bandFound); //qDebug() << "DataBase::updateBandIdTableAward: band found: " << bandtxt ; sq = QString("SELECT id FROM bandtemp WHERE name='%1'").arg(bandtxt); sqlOk2 = query2.exec(sq); if (sqlOk2) { if (query2.next()) { if (query2.isValid()) { bandFound = query2.value(0).toInt(); query2.finish(); sq = QString ("UPDATE %1 SET %2='%3' WHERE id='%4'").arg(table).arg(field).arg(bandFound).arg(id); sqlOk3 = execQuery(Q_FUNC_INFO, sq); if (sqlOk3) { //qDebug() << "DataBase::updateBandIdTableAward: ID: " << QString::number(id) << " updated to: " << QString::number(bandFound) <<"/"<< bandtxt ; } else { //queryErrorManagement(Q_FUNC_INFO, query3.lastError().databaseText(), query3.lastError().nativeErrorCode(), query3.lastQuery()); //qDebug() << "DataBase::updateBandIdTableAward: ID: " << QString::number(id) << " NOT updated-2" ; //qDebug() << "DataBase::updateBandIdTableAward - QSOs not updated to main log" ; } } else { //qDebug() << "DataBase::updateBandIdTableAward: query2 not valid " ; } } else { //qDebug() << "DataBase::updateBandIdTableAward: query2 not next " ; } query2.finish(); } else { queryErrorManagement(Q_FUNC_INFO, query2.lastError().databaseText(), query2.lastError().nativeErrorCode(), query2.lastQuery()); query2.finish(); //qDebug() << "DataBase::updateBandIdTableAward: ID: " << QString::number(id) << " NOT updated-1" ; } } if ( progress.wasCanceled() ) { if (!alreadyCancelled) { alreadyCancelled = true; QMessageBox msgBox; msgBox.setWindowTitle(QObject::tr("KLog - DB update")); aux = QObject::tr("Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel?"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked cancel = true; break; case QMessageBox::No: // No Save was clicked cancel = false; progress.setCancelButton(nullptr); break; default: // should never be reached cancel = false; break; } } } } if (cancel && (!alreadyCancelled)) { //qDebug() << "DataBase::updateBandIdTableAward: FALSE END-3" ; query.finish(); return false; } //qDebug() << "DataBase::updateBandIdTableAward: END OK" ; query.finish(); return true; } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataBase::updateBandIdTableAward: FALSE END-4" ; query.finish(); return false; } //qDebug() << "DataBase::updateBandIdTableAward: CHECK IF SEEN END" ; //query.finish(); //return false; } bool DataBase::updateModeIdTableAward(const int _db) { //qDebug() << "DataBase::updateModeIdTableAward: " << QString::number(_db) ; QString table = QString(); QString field = "mode"; QString awardSelected = QString(); switch (_db) { case 1: // table = "awarddxcc"; awardSelected = "DXCC"; break; case 2: table = "awardwaz"; awardSelected = "WAZ"; break; default: //qDebug() << "DataBase::updateModeIdTableAward: FALSE END" ; return false; //break; } QString bandtxt = QString(); bool cancel = false; bool alreadyCancelled = false; //int errorCode = -1; QString sq = QString(); bool sqlOk2 = false; bool sqlOk3 = false; int bandFound = -1; int id = -1; int qsos; int i = 0; QString aux; QSqlQuery query, query2; sq = QString("SELECT COUNT (*) FROM %1").arg(table); bool sqlOk = query.exec(sq); if (sqlOk) { query.next(); qsos = (query.value(0)).toInt(); query.finish(); } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataBase::updateModeIdTableAward: FALSE END-2" ; query.finish(); return false; } int step = util->getProgresStepForDialog(qsos); QString progressmsg = QString(QObject::tr("Updating mode information in %1 status...")).arg(awardSelected); QProgressDialog progress(progressmsg, QObject::tr("Abort updating"), 0, qsos); progress.setMaximum(qsos); progress.setWindowModality(Qt::WindowModal); sq = QString("SELECT %1, id FROM %2 ORDER BY %3 DESC").arg(field).arg(table).arg(field); sqlOk = query.exec(sq); //qDebug() << "DataBase::updateModeIdTableAward (query): " << query.lastQuery() ; if (sqlOk) { while (query.next() && (!cancel) ) { bandtxt = QString(); bandFound = -1; if (query.isValid()) { i++; if (( (i % step )== 0) ) { // To update the speed I will only show the progress once each X QSOs aux = QObject::tr("Updating bands information...") + "\n" + QObject::tr("Progress: ") + QString::number(i) + "/" + QString::number(qsos); progress.setLabelText(aux); progress.setValue(i); } bandFound = (query.value(0)).toInt(); id = (query.value(1)).toInt(); //qDebug() << "DataBase::updateModeIdTableAward: bandfound: " << QString::number(bandFound) ; //qDebug() << "DataBase::updateModeIdTableAward: id: " << QString::number(id) ; bandtxt = getSubModeNameFromNumber(bandFound, true); //qDebug() << "DataBase::updateModeIdTableAward: mode found: " << bandtxt << "/" << QString::number(bandFound) ; sq = QString("SELECT id FROM modetemp WHERE submode='%1'").arg(bandtxt); sqlOk2 = query2.exec(sq); //qDebug() << "DataBase::updateModeIdTableAward (query2): " << query2.lastQuery() ; if (sqlOk2) { if (query2.next()) { if (query2.isValid()) { bandFound = query2.value(0).toInt(); query2.finish(); sq = QString ("UPDATE %1 SET %2='%3' WHERE id='%4'").arg(table).arg(field).arg(bandFound).arg(id); sqlOk3 = execQuery(Q_FUNC_INFO, sq); if (sqlOk3) { //qDebug() << "DataBase::updateModeIdTableAward: ID: " << QString::number(id) << " updated to: " << QString::number(bandFound) <<"/"<< bandtxt ; } else { //queryErrorManagement(Q_FUNC_INFO, query3.lastError().databaseText(), query3.lastError().nativeErrorCode(), query3.lastQuery()); //qDebug() << "DataBase::updateModeIdTableAward: ID: " << QString::number(id) << " NOT updated-2" ; //qDebug() << "DataBase::updateModeIdTableAward - QSOs not updated to main log" ; } } else { //qDebug() << "DataBase::updateModeIdTableAward: query2 not valid " ; } } else { //qDebug() << "DataBase::updateModeIdTableAward: query2 not next " ; } } else { queryErrorManagement(Q_FUNC_INFO, query2.lastError().databaseText(), query2.lastError().nativeErrorCode(), query2.lastQuery()); query2.finish(); //qDebug() << "DataBase::updateModeIdTableAward: ID: " << QString::number(id) << " NOT updated-1" ; } } if ( progress.wasCanceled() ) { if (!alreadyCancelled) { alreadyCancelled = true; QMessageBox msgBox; msgBox.setWindowTitle(QObject::tr("KLog - DB update")); aux = QObject::tr("Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel?"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked cancel = true; break; case QMessageBox::No: // No Save was clicked cancel = false; progress.setCancelButton(nullptr); break; default: // should never be reached cancel = false; break; } } } } if (cancel && (!alreadyCancelled)) { //qDebug() << "DataBase::updateModeIdTableAward: FALSE END-3" ; query.finish(); return false; } //qDebug() << "DataBase::updateModeIdTableAward: END OK" ; query.finish(); return true; } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataBase::updateModeIdTableAward: FALSE END-4" ; query.finish(); return false; } //qDebug() << "DataBase::updateModeIdTableAward: Checkif seen END" ; //query.finish(); //return false; } /* bool DataBase::updateModeIdTableLogToNewOnes() { //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: " ; QString bandtxt = QString(); bool cancel = false; bool alreadyCancelled = false; int errorCode = -1; QString sq = QString(); bool sqlOk2 = false; bool sqlOk3 = false; int bandFound = -1; int id = -1; int qsos; int i = 0; QString aux; QSqlQuery query, query2, query3; bool sqlOk = query.exec("SELECT COUNT (*) FROM log"); if (sqlOk) { query.next(); qsos = (query.value(0)).toInt(); } else { return false; } int step = util->getProgresStepForDialog(qsos); QProgressDialog progress(QObject::tr("Updating mode information..."), QObject::tr("Abort updating"), 0, qsos); progress.setMaximum(qsos); progress.setWindowModality(Qt::WindowModal); sqlOk = query.exec("SELECT modeid, id FROM log ORDER BY bandid DESC"); if (sqlOk) { while (query.next() && (!cancel) ) { bandtxt = QString(); bandFound = -1; if (query.isValid()) { i++; if (( (i % step )== 0) ) { // To update the speed I will only show the progress once each X QSOs aux = QObject::tr("Updating mode information...\n QSO: ") + QString::number(i) + "/" + QString::number(qsos); progress.setLabelText(aux); progress.setValue(i); } bandFound = (query.value(0)).toInt(); id = (query.value(1)).toInt(); bandtxt = getModeNameFromNumber(bandFound, false); //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: mode found: " << bandtxt ; sq = QString("SELECT id FROM modetemp WHERE name='%1'").arg(bandtxt); sqlOk2 = query2.exec(sq); if (sqlOk2) { if (query2.next()) { if (query2.isValid()) { bandFound = query2.value(0).toInt(); sq = QString ("UPDATE log SET modeid='%1' WHERE id='%2'").arg(bandFound).arg(id); sqlOk3 = query3.exec(sq); if (sqlOk3) { //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: ID: " << QString::number(id) << " updated to: " << QString::number(bandFound) <<"/"<< bandtxt ; } else { //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: ID: " << QString::number(id) << " NOT updated-2" ; //qDebug() << "DataBase::updateModeIdTableLogToNewOnes - QSOs not updated to main log" ; errorCode = query3.lastError().nativeErrorCode(); //qDebug() << "DataBase::updateModeIdTableLogToNewOnes - query error: " << QString::number(errorCode) ; //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: LastQuery: " << query3.lastQuery() ; //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: LastError-data: " << query3.lastError().databaseText() ; //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: LastError-driver: " << query3.lastError().driverText() ; //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: LastError-n: " << QString::number(query3.lastError().nativeErrorCode() ) ; } } else { //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: query2 not valid " ; } } else { //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: query2 not next " ; } } else { //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: ID: " << QString::number(id) << " NOT updated-1" ; } } if ( progress.wasCanceled() ) { if (alreadyCancelled) { } else { alreadyCancelled = true; QMessageBox msgBox; aux = QObject::tr("Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel?"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked cancel = true; break; case QMessageBox::No: // No Save was clicked cancel = false; progress.setCancelButton(0); break; default: // should never be reached cancel = false; break; } } } } if (cancel && (!alreadyCancelled)) { return false; } //qDebug() << "DataBase::updateModeIdTableLogToNewOnes: FINISHED OK" ; return true; } else { return false; } } */ bool DataBase::updateTo007() {// Updates the DB to 0.0.7 //qDebug() << "DataBase::updateTo007: latestRead: " << getDBVersion() ; bool IAmIn007 = false; bool IAmIn006 = false; bool ErrorUpdating = false; QString stringQuery = QString(); QSqlQuery query; latestReaded = getDBVersion().toFloat(); bool sqlOk = false; if (latestReaded >= 0.007f) { //qDebug() << "DataBase::updateTo007: - I am in 007" ; return true; } else { //qDebug() << "DataBase::updateTo007: - I am not in 007" ; IAmIn007 = false; } while (!IAmIn007 && !ErrorUpdating) { while (!IAmIn006 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo007: - And I am not in 006" ; IAmIn006 = updateTo006(); } //qDebug() << "DataBase::updateTo007: - And I am in 006!!!!" ; if (ErrorUpdating) { //qDebug() << "DataBase::updateTo007: NOK-1" ; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } sqlOk = updateDBVersion(softVersion, "0.007"); if (sqlOk) { // Version updated IAmIn007 = updateTableLog(6); } else { // Version not updated //qDebug() << "DataBase::updateTo007: NOK-2" ; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } //DO ALL THE TASKS TO BE IN 0.007 from 0.006 HERE and set ErrorUpdating if it is not possible. IAmIn007 = true; } //qDebug() << "DataBase::updateTo007: END" ; if (!IAmIn007) { // emit debugLog(Q_FUNC_INFO, "3", 7); } return IAmIn007; } bool DataBase::updateTo008() {// Updates the DB to 0.0.8 //qDebug() << "DataBase::updateTo008: latestRead: " << getDBVersion() ; bool IAmIn008 = false; bool IAmIn007 = false; latestReaded = getDBVersion().toFloat(); if (latestReaded >= 0.008f) { //qDebug() << "DataBase::updateTo008: - I am in 008" ; return true; } else { //qDebug() << "DataBase::updateTo008: - I am not in 008" ; IAmIn008 = false; } while (!IAmIn008) { while (!IAmIn007 ) { //qDebug() << "DataBase::updateTo008: - And I am not in 007" ; IAmIn007 = updateTo007(); } //qDebug() << "DataBase::updateTo008: - I am in 007" ; //DO ALL THE TASKS TO BE IN 0.008 from 0.007 HERE and set ErrorUpdating if it is not possible. IAmIn008 = updateTheModeTableAndSyncLog(); if (IAmIn008) { bool sqlOk = updateDBVersion(softVersion, "0.008"); if (sqlOk) { // Version updated //qDebug() << "DataBase::updateTo008: - OK" ; } else { // Version not updated //qDebug() << "DataBase::updateTo008: - NOK-3" ; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } } else { //qDebug() << "DataBase::updateTo008: - NOK-2" ; // emit debugLog(Q_FUNC_INFO, "3", 7); return false; } } //qDebug() << "DataBase::updateTo008: - END" ; if (!IAmIn008) {/*emit debugLog(Q_FUNC_INFO, "4", 7);*/ } return IAmIn008; } bool DataBase::updateTo009() {// Updates the DB to 0.0.9 - We add the Satellite tables //qDebug() << "DataBase::updateTo009: latestRead: " << getDBVersion() ; bool IAmIn009 = false; bool IAmIn008 = false; bool ErrorUpdating = false; //qDebug() << "DataBase::updateTo009: Checking:" << QString::number(latestReaded) << ":" << QString::number(0.009); latestReaded = getDBVersion().toFloat(); if (latestReaded >= 0.009f) //if ((latestReaded = 0.009) || (latestReaded > 0.009)) { //qDebug() << "DataBase::updateTo009: - I am in 009" ; //IAmIn009 = true; return true; } else { //qDebug() << "DataBase::updateTo009: - I am not in 009 I am in: " << QString::number(latestReaded); IAmIn009 = false; } //qDebug() << "DataBase::updateTo009: compared latestRead: " << QString::number(latestReaded) ; while (!IAmIn009 && !ErrorUpdating) { while (!IAmIn008 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo009: - And I am not in 008" ; IAmIn008 = updateTo008(); } //qDebug() << "DataBase::updateTo009: - And I am already at least in 008" ; if (ErrorUpdating) { // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } bool sqlOk = updateDBVersion(softVersion, "0.009"); if (sqlOk) { // Version updated //qDebug() << "DataBase::updateTo009: - version updated" ; //IAmIn009 = updateTableLog(6); } else { // Version not updated //qDebug() << "DataBase::updateTo009: - version not updated" ; } //DO ALL THE TASKS TO BE IN 0.009 from 0.008 HERE and set ErrorUpdating if it is not possible. if (recreateSatelliteData()) //if (createTableSatellites(true)) { //qDebug() << "DataBase::updateTo009: - createTableSatellites OK" ; //if (populateTableSatellites(true)) if (updateTableEntity()) { //qDebug() << "DataBase::updateTo009: - updateTableEntity OK" ; if (updateTheEntityTableISONames()) { //qDebug() << "DataBase::updateTo009: - isonames updated" ; // Now I need to update the logs table if (updateTableLogs()) { //qDebug() << "DataBase::updateTo009: - logs updated and Function finished successfuly!!" ; IAmIn009 = true; } else { //qDebug() << "DataBase::updateTo009: - logs NOT updated" ; IAmIn009 = false; ErrorUpdating = true; } } else { //qDebug() << "DataBase::updateTo009: - isonames NOT updated" ; IAmIn009 = false; ErrorUpdating = true; } } else { ErrorUpdating = true; IAmIn009 = false; } } else { //qDebug() << "DataBase::updateTo009: - createTableSatellites FALSE" ; ErrorUpdating = true; IAmIn009 = false; } } //qDebug() << "DataBase::updateTo009: - END" ; if (!IAmIn009) { // emit debugLog(Q_FUNC_INFO, "1", 7); } return IAmIn009; } bool DataBase::updateTo010() {// Updates the DB to 0.010: // We add FT8 mode and // AS Propagation //qDebug() << "DataBase::updateTo010: latestRead: " << getDBVersion() ; bool IAmIn010 = false; bool IAmIn009 = false; bool ErrorUpdating = false; QString stringQuery = QString(); QSqlQuery query; latestReaded = getDBVersion().toFloat(); //qDebug() << "DataBase::updateTo010: Checking (latestRead/dbVersion):" << QString::number(latestReaded) << "/" << QString::number(dbVersion) ; if (latestReaded >= 0.010f) { //qDebug() << "DataBase::updateTo010: - I am in 010" ; IAmIn010 = true; return true; } else { //qDebug() << "DataBase::updateTo010: - I am not in 010 I am in: " << QString::number(latestReaded); while (!IAmIn009 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo010: - Check if I am in 009: !" ; IAmIn009 = updateTo009(); if (IAmIn009) { //qDebug() << "DataBase::updateTo010: - updateTo009 returned TRUE - I am in 0.009: " << QString::number(latestReaded) ; } else { //qDebug() << "DataBase::updateTo010: - updateTo009 returned FALSE - I am NOT in 0.009: " << QString::number(latestReaded) ; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateTo010: - I Could not update to: " << QString::number(dbVersion) ; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } bool sqlOk = execQuery(Q_FUNC_INFO, "UPDATE band SET lower = '0.1357', upper = '0.1378' WHERE name='2190M'"); if (sqlOk) { //qDebug() << "DataBase::updateTo010: - Band update OK" ; } else { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataBase::updateTo010: - Band update NOK" ; } execQuery(Q_FUNC_INFO, QString("INSERT INTO mode (submode, name, cabrillo, deprecated) VALUES ('FT8', 'FT8', 'NO', '0')")); execQuery(Q_FUNC_INFO, QString("INSERT INTO prop_mode_enumeration (shortname, name) VALUES ('AS', 'Aircraft Scatter')")); if (updateDBVersion(softVersion, "0.010")) { //qDebug() << "DataBase::updateTo010: - We are in 010! " ; IAmIn010 = true; } else { //qDebug() << "DataBase::updateTo010: - Failed to go to 010! " ; IAmIn010 = false; // emit debugLog(Q_FUNC_INFO, "1", 7); } //qDebug() << "DataBase::updateTo010: - END" ; return IAmIn010; } bool DataBase::updateDBVersion(QString _softV, QString _dbV) { QString dateString = util->getDateSQLiteStringFromDate(QDate::currentDate()); //qDebug() << "DataBase::updateDBVersion: (date/SoftVersion/dbVersion): " << dateString << "/" << _softV << "/" << _dbV ; QString stringQuery = "INSERT INTO softwarecontrol (dateupgrade, softversion, dbversion) VALUES ('" + dateString + "', '" + _softV + "', '" + _dbV + "')"; return execQuery(Q_FUNC_INFO, stringQuery); } bool DataBase::updateTheModeTableAndSyncLog() { //qDebug() << "DataBase::updateTheModeTableAndSyncLog" ; QSqlQuery query; createTableMode(false); // Create modetemp populateTableMode(false); // Populate modetemp updateModeIdFromSubModeId(); // Updates the log with the new mode IDs in each QSO //updateModeIdTableAward(1); //DXCC //updateModeIdTableAward(2); // WAZ //QSqlDatabase::database().commit(); bool sqlOK = execQuery(Q_FUNC_INFO, "DROP TABLE mode"); if (sqlOK) { //QSqlDatabase::database().commit(); //qDebug() << "DataBase::updateTheModeTableAndSyncLog - OK - mode was dropped" ; sqlOK = execQuery(Q_FUNC_INFO, "ALTER TABLE modetemp RENAME TO mode"); if (!sqlOK) { // emit debugLog(Q_FUNC_INFO, "1", 7); } return sqlOK; } else { //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataBase::updateTheModeTableAndSyncLog - ERROR - modetemp not dropped" ; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } //qDebug() << "DataBase::updateTheModeTableAndSyncLog END" ; //return true; } bool DataBase::recreateTableBand() { //qDebug() << "DataBase::recreateTableBand" ; QSqlQuery query; createTableBand(false); // Create modetemp populateTableBand(false); // Populate modetemp syncLogQSOsOnBandTableChange(); if (execQuery(Q_FUNC_INFO, "DROP TABLE band")) { // emit debugLog(Q_FUNC_INFO, "1", 7); return execQuery(Q_FUNC_INFO, "ALTER TABLE bandtemp RENAME TO band"); } else { //queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataBase::recreateTableBand - ERROR - bandtemp not dropped" ; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } //qDebug() << "DataBase::recreateTableBand END" ; } QMultiMap DataBase::fillCountryCodes() { //qDebug() << Q_FUNC_INFO; QMultiMap countryCodes; countryCodes.clear (); countryCodes.insert ("mt", 246); countryCodes.insert ("un", 247); countryCodes.insert ("mc", 260); countryCodes.insert ("mu", 4); countryCodes.insert ("mu", 165); countryCodes.insert ("mu", 207); countryCodes.insert ("gq", 49); countryCodes.insert ("gq", 195); countryCodes.insert ("fj", 176); countryCodes.insert ("fj", 489); countryCodes.insert ("fj", 460); countryCodes.insert ("sz", 468); countryCodes.insert ("tn", 474); countryCodes.insert ("vn", 293); countryCodes.insert ("gn", 107); countryCodes.insert ("bv", 24); countryCodes.insert ("no", 199); countryCodes.insert ("az", 18); countryCodes.insert ("ge", 75); countryCodes.insert ("me", 514); countryCodes.insert ("lk", 315); countryCodes.insert ("ch", 177); // ITU HQ countryCodes.insert ("us", 289); // UN HQ countryCodes.insert ("tl", 511); // Timor Leste countryCodes.insert ("il", 336); // Israel countryCodes.insert ("ly", 436); // Libya countryCodes.insert ("cy", 215); // Cyprus countryCodes.insert ("tz", 470); // Tanzania countryCodes.insert ("ng", 450); // Nigeria countryCodes.insert ("mg", 438); // Madagascar countryCodes.insert ("mr", 444); // Mauritania countryCodes.insert ("ne", 187); // Niger countryCodes.insert ("tg", 484); // Togo countryCodes.insert ("ws", 190); // Samoa countryCodes.insert ("ug", 286); // Uganda countryCodes.insert ("ke", 430); // Kenya countryCodes.insert ("sn", 456); // Senegal countryCodes.insert ("jm", 82); // Jamaica countryCodes.insert ("es", 281); // Spain countryCodes.insert ("ls", 432); // Lesotho countryCodes.insert ("mw", 440); // Malawi countryCodes.insert ("dz", 400); // Algeria countryCodes.insert ("ye", 492); // Yemen countryCodes.insert ("bb", 62); // Barbados countryCodes.insert ("mv", 159); // Maldives countryCodes.insert ("gy", 129); // Guyana countryCodes.insert ("hr", 497); // Croatia countryCodes.insert ("gh", 424); // Ghana countryCodes.insert ("mt", 257); // Malta countryCodes.insert ("zm", 482); // Zambia countryCodes.insert ("kw", 348); // Kuwait countryCodes.insert ("sl", 458); //Sierra Leone countryCodes.insert ("my", 299); // West Malaysia countryCodes.insert ("my", 46); // East Malaysia countryCodes.insert ("np", 369); // Nepal countryCodes.insert ("cd", 414); // Dem Rep Congo countryCodes.insert ("bi", 404); // Burundi countryCodes.insert ("sg", 381); // Singapore countryCodes.insert ("rw", 454); // Rwanda countryCodes.insert ("tt", 90); // Trinidad & Tobago countryCodes.insert ("bw", 402); countryCodes.insert ("to", 160); countryCodes.insert ("om", 370); countryCodes.insert ("bt", 306); // Bhutan countryCodes.insert ("ae", 391); // Un Arab Emirates countryCodes.insert ("qa", 376); // Qatar countryCodes.insert ("bh", 304); // Bahrain countryCodes.insert ("pk", 372); // Pakistan countryCodes.insert ("tw", 386); // Taiwan countryCodes.insert ("tw", 505); // Pratas Is countryCodes.insert ("cn", 318); // China countryCodes.insert ("nr", 157); // Nauru countryCodes.insert ("ad", 203); // Andorra countryCodes.insert ("gm", 422); // Gambia countryCodes.insert ("bs", 60); countryCodes.insert ("mz", 181); // Mozambique countryCodes.insert ("cl", 112); // Chile countryCodes.insert ("cl", 217); // San Felix countryCodes.insert ("cl", 47); // Easter Is countryCodes.insert ("cl", 125); // Juan Fernandez is countryCodes.insert ("cu", 70); // Cuba countryCodes.insert ("ma", 446); // Morocco countryCodes.insert ("bo", 104); // Bolivia countryCodes.insert ("pt", 272); // Portugal countryCodes.insert ("pt", 256); // Madeira countryCodes.insert ("pt", 149); // Azores countryCodes.insert ("uy", 144); // Uruguay countryCodes.insert ("ca", 211); // Sable Is countryCodes.insert ("ca", 252); // St Paul is countryCodes.insert ("ao", 401); // Angola countryCodes.insert ("cv", 409); // Cape Verde countryCodes.insert ("km", 411); // Comoros countryCodes.insert ("de", 230); // Fed Rep Germany countryCodes.insert ("ph", 375); //Philippines countryCodes.insert ("er", 51); // Eritrea countryCodes.insert ("ps", 510); // Palestine countryCodes.insert ("ck", 191); // North Cook countryCodes.insert ("ck", 234); // South Cook countryCodes.insert ("nu", 188); // Niue countryCodes.insert ("ba", 501); // Bosnia countryCodes.insert ("balear", 21); // Balearic is countryCodes.insert ("canary", 29); // Canary Is countryCodes.insert ("ceuta", 32); // Ceuta & Melilla //TODO: Fix the flag countryCodes.insert ("ie", 245); // Ireland countryCodes.insert ("am", 14); countryCodes.insert ("lr", 434); countryCodes.insert ("ir", 330); // Iran countryCodes.insert ("mv", 179); // Moldova countryCodes.insert ("ee", 52); // Estonia countryCodes.insert ("et", 53); // Ethiopia countryCodes.insert ("by", 27); // Belarus countryCodes.insert ("kg", 135); // Kyrgyzstan countryCodes.insert ("tm", 280); // Turkmenistan countryCodes.insert ("tj", 262); // Tajikistan countryCodes.insert ("fr", 227); // France countryCodes.insert ("fr", 79); // Guadeloupe countryCodes.insert ("yt", 169); // Mayotte countryCodes.insert ("fr", 516); // St Barthelemy countryCodes.insert ("fr", 36); // Clipperton Is countryCodes.insert ("nc", 162); // New Caledonia countryCodes.insert ("nc", 512); // Chesterfield Is countryCodes.insert ("mq", 84); // Martinique countryCodes.insert ("pf", 175); // French Polynesia countryCodes.insert ("pf", 508); // Austral Is countryCodes.insert ("pm", 277); // St Pierre & Miquelon countryCodes.insert ("re", 453); //Reunion Is countryCodes.insert ("fr", 213); // St Marteen countryCodes.insert ("fr", 99); // Glorioso is countryCodes.insert ("fr", 124); // Juan de nova, Europa countryCodes.insert ("fr", 276); // Tromelin - TODO: Add the wikipedia flag countryCodes.insert ("fr", 41); // Crozet countryCodes.insert ("fr", 131); // Kerguelen //TODO: Add the wikipedia flag http://es.wikipedia.org/wiki/Tierras_Australes_y_Ant%C3%A1rticas_Francesas countryCodes.insert ("fr", 10); //Amsterdam & St Paul is //TODO: Add the wikipedia flag countryCodes.insert ("wf", 298); // Wallis & Futuna is countryCodes.insert ("gf", 63); // French Guiana //TODO: Add the wikipedia flag countryCodes.insert ("england", 223); // England countryCodes.insert ("gb", 114); //Isle of Man //TODO: Add the wikipedia flag countryCodes.insert ("northernireland", 265); // Northern Ireland countryCodes.insert ("gb", 122); // Jersey countryCodes.insert ("scotland", 279); // Scotland countryCodes.insert ("scotland", 1279); // Shetland is (Scotland) countryCodes.insert ("gb", 106); // Guernsey //TODO: Add the wikipedia flag countryCodes.insert ("wales", 294); // Wales countryCodes.insert ("sb", 185); // Solomon countryCodes.insert ("sb", 507); // Temotu Province countryCodes.insert ("hu", 239); // Hungary countryCodes.insert ("ch", 287); // Switzerland countryCodes.insert ("li", 251); // Liechtenstein countryCodes.insert ("ec", 120); // Ecuador countryCodes.insert ("ec", 71); // Galapagos Is countryCodes.insert ("ht", 78); // Haiti countryCodes.insert ("do", 72); // Dominican Rep countryCodes.insert ("co", 116); // Colombia countryCodes.insert ("co", 216); // San Andres & Providencia countryCodes.insert ("co", 161); // Malpelo countryCodes.insert ("kr", 137); // Rep Korea countryCodes.insert ("pa", 88); // Panama countryCodes.insert ("hn", 80); // Honduras countryCodes.insert ("th", 387); // Thailand countryCodes.insert ("va", 295); countryCodes.insert ("sa", 378); // Saudi Arabia countryCodes.insert ("it", 248); // Italy countryCodes.insert ("it", 1248); // African Italy countryCodes.insert ("it", 2248); // Sicily countryCodes.insert ("it", 225); // Sardinia countryCodes.insert ("dj", 382); // Djibouti countryCodes.insert ("gd", 77); // Grenada countryCodes.insert ("gw", 109); // Guinea-Bissau countryCodes.insert ("lc", 97); // St Lucia countryCodes.insert ("dm", 95); // Dominica countryCodes.insert ("vc", 98); // St Vicent countryCodes.insert ("jp", 339); // Japan countryCodes.insert ("jp", 177); // Minami Torishima countryCodes.insert ("jp", 192); // Ogasawara countryCodes.insert ("mn", 363); // Mongolia countryCodes.insert ("sj", 259); // Svalbard countryCodes.insert ("sj", 1259); // Svalbard countryCodes.insert ("sj", 118); // Jan Mayen countryCodes.insert ("jo", 342); countryCodes.insert ("us", 291); countryCodes.insert ("us", 105); countryCodes.insert ("mp", 166); countryCodes.insert ("us", 20); countryCodes.insert ("gu", 103); countryCodes.insert ("us", 123); countryCodes.insert ("us", 174); countryCodes.insert ("us", 197); countryCodes.insert ("us", 134); countryCodes.insert ("us", 110); // Hawaii //TODO: Add the wikipedia flag countryCodes.insert ("us", 138); // Kure is countryCodes.insert ("as", 9); // American Samoa countryCodes.insert ("as", 515); // Swains is countryCodes.insert ("us", 297); // Wake is countryCodes.insert ("us", 6); // Alaska countryCodes.insert ("us", 182); // Navassa Is countryCodes.insert ("vi", 285); // Us Virgin is countryCodes.insert ("pr", 202); // Puerto Rico countryCodes.insert ("us", 43); // Desecheo Is countryCodes.insert ("no", 266); // Norway countryCodes.insert ("ar", 100); // Argentina countryCodes.insert ("lu", 254); // Luxembourg countryCodes.insert ("lt", 146); // Lithuania countryCodes.insert ("bg", 212); // Bulgaria countryCodes.insert ("pe", 136); // Peru countryCodes.insert ("lb", 354); // Lebanon countryCodes.insert ("at", 206); // Austria & Viena Intl HQ countryCodes.insert ("fi", 224); // Findland countryCodes.insert ("fi", 5); // Aland is countryCodes.insert ("fi", 167); // Market Reef countryCodes.insert ("cz", 503); // Czech Rep countryCodes.insert ("sk", 504); // Slovak Rep countryCodes.insert ("be", 209); // Belgium countryCodes.insert ("gl", 237); // Greenland countryCodes.insert ("dk", 222); // Faroe is //TODO: Add the wikipedia flag countryCodes.insert ("dk", 221); // Denmark countryCodes.insert ("pg", 163); // Papua New Guinea countryCodes.insert ("aw", 91); // Aruba countryCodes.insert ("kp", 344); //Dpr Korea countryCodes.insert ("nl", 263); // Netherlands countryCodes.insert ("cw", 517); // Curacao //TODO: Add the wikipedia flag countryCodes.insert ("bq", 520); // Bonaire //TODO: Add the wikipedia flag countryCodes.insert ("nl", 519); // Saba & St Eustatius //TODO: Add the wikipedia flag countryCodes.insert ("shm", 518); // Sint Marteen //TODO: Add the wikipedia flag countryCodes.insert ("br", 108); // Brazil countryCodes.insert ("br", 56); // Fernando de Noronha countryCodes.insert ("br", 253); // St Peter & St Paul countryCodes.insert ("br", 273); // Trindade & Martim Vaz countryCodes.insert ("sr", 140); // Suriname countryCodes.insert ("ru", 61); // Franz Josef Land countryCodes.insert ("eh", 302); // Western Sahara //TODO: Add the wikipedia flag countryCodes.insert ("bd", 305); // Bangladesh countryCodes.insert ("si", 499); // Slovenia countryCodes.insert ("sc", 379); // Seychelles countryCodes.insert ("st", 219); // Sao Tome & Principe countryCodes.insert ("se", 284); // Sweden countryCodes.insert ("pl", 269); // Poland countryCodes.insert ("sd", 466); // Sudan countryCodes.insert ("eg", 478); // Egypt countryCodes.insert ("gr", 236); // Greece countryCodes.insert ("gr", 180); // Mount Athos countryCodes.insert ("gr", 45); // Dodecanese countryCodes.insert ("gr", 40); // Crete countryCodes.insert ("tv", 282); // Tuvalu countryCodes.insert ("ki", 301); // Western Kiribati countryCodes.insert ("ki", 31); // Central Kiribati countryCodes.insert ("ki", 48); // Eastern Kiribati countryCodes.insert ("ki", 490); // Banaba is countryCodes.insert ("so", 232); // Somalia countryCodes.insert ("sm", 278); // San Marino countryCodes.insert ("pw", 22); // Palau countryCodes.insert ("tr", 390); // Turkey countryCodes.insert ("tr", 1390); // European Turkey countryCodes.insert ("is", 242); // Iceland countryCodes.insert ("gt", 76); // Guatemala //TODO: Add the wikipedia flag countryCodes.insert ("cr", 308); // Costa Rica countryCodes.insert ("cr", 37); // Coco is countryCodes.insert ("cm", 406); // Cameroon countryCodes.insert ("fr", 214); // Corsica // TODO: Add the wikipedia flag countryCodes.insert ("cf", 408); // Central African Rep countryCodes.insert ("cg", 412); // Rep of Congo countryCodes.insert ("ga", 420); // Gabon countryCodes.insert ("td", 410); // Chad countryCodes.insert ("ci", 428); // Cote d'Ivoire countryCodes.insert ("bj", 416); // Benin countryCodes.insert ("ml", 442); // Mali countryCodes.insert ("ru", 54); // European Russia countryCodes.insert ("ru", 15); // Asiatic Russia countryCodes.insert ("ru", 126); // Kaliningrad countryCodes.insert ("uz", 292); // Uzbekistan countryCodes.insert ("kz", 130); // Kazakhstan countryCodes.insert ("ua", 288); // Ukraine countryCodes.insert ("ag", 94); // Antigua & Barbuda countryCodes.insert ("bz", 66); // Belize countryCodes.insert ("kn", 249); // St Kitts & Nevis countryCodes.insert ("na", 464); // Namibia countryCodes.insert ("fm", 173); // Micronesia countryCodes.insert ("fm", 168); // Marshall Is countryCodes.insert ("bn", 345); // Brunei Darusalam countryCodes.insert ("ca", 1); // Canada countryCodes.insert ("au", 150); // Australia countryCodes.insert ("hm", 111); // Heard Is countryCodes.insert ("au", 153); // Macquarie is countryCodes.insert ("cc", 38); // Cocos / Keeling is countryCodes.insert ("au", 147); // Lord Howe is countryCodes.insert ("au", 171); // Mellish Reed countryCodes.insert ("nf", 189); // Norkfolk is countryCodes.insert ("au", 303); // Willis Is countryCodes.insert ("cx", 35); // Christmas is countryCodes.insert ("ai", 12); // Anguilla countryCodes.insert ("ms", 96); // Montserrat countryCodes.insert ("vg", 65); // British is countryCodes.insert ("tc", 89); // Turks & Caicos is countryCodes.insert ("pn", 172); // Pitcairn countryCodes.insert ("gb", 513); // Ducie is countryCodes.insert ("fk", 141); // Falkland is countryCodes.insert ("gs", 235); // South Georgia is countryCodes.insert ("southbritish", 241); // South Shetland is countryCodes.insert ("un", 238); // South Orkney is countryCodes.insert ("gs", 240); // South Sandwich Is countryCodes.insert ("bm", 64); // Bermuda countryCodes.insert ("io", 33); // Chagos is countryCodes.insert ("hk", 321); // Hong Kong countryCodes.insert ("in", 324); // India countryCodes.insert ("in", 11); // Andaman & Nicobar countryCodes.insert ("in", 142); // Lakshadweep Is countryCodes.insert ("mx", 50); // Mexico countryCodes.insert ("mx", 204); // Revilagigedo countryCodes.insert ("bf", 480); // Burkina Faso countryCodes.insert ("kh", 312); // Cambodia countryCodes.insert ("la", 143); // Laos countryCodes.insert ("mo", 152); // Macao countryCodes.insert ("mm", 309); // Myanmar countryCodes.insert ("af", 3); // Afganistan countryCodes.insert ("id", 327); // Indonesia countryCodes.insert ("iq", 333); // Iraq countryCodes.insert ("vu", 158); // Vanuatu countryCodes.insert ("sy", 384); // Syria countryCodes.insert ("lv", 145); // Latvia countryCodes.insert ("ni", 86); // Nicaragua countryCodes.insert ("ro", 275); // Romania countryCodes.insert ("sv", 74); // El Salvador countryCodes.insert ("rs", 296); // Serbia countryCodes.insert ("ve", 148); // Venezuela countryCodes.insert ("ve", 17); // Aves Is countryCodes.insert ("zw", 452); // Zimbabwe countryCodes.insert ("mk", 502); // Macedonia countryCodes.insert ("ss", 521); //Rep South Sudan countryCodes.insert ("al", 7); // Albania countryCodes.insert ("gi", 233); // Gibraltar countryCodes.insert ("gb", 283); // UK Base Aereas Cyprus countryCodes.insert ("sh", 250); // St Helena countryCodes.insert ("sh", 205); // Ascension is countryCodes.insert ("sh", 274); // Tristan da Cunha & Gough is countryCodes.insert ("ky", 69); // Cayman Is countryCodes.insert ("tk", 270); // Tokelau Is countryCodes.insert ("marquesas", 509); // Marquesas Is countryCodes.insert ("nz", 170); // New Zeland countryCodes.insert ("nz", 34); // Chatham Is countryCodes.insert ("nz", 133); // Kermadec is countryCodes.insert ("nz", 16); // Auckland & Campbell is countryCodes.insert ("py", 132); // Paraguay countryCodes.insert ("za", 462); // South Africa countryCodes.insert ("za", 201); // Pr Edward & Marion Is countryCodes.insert ("xk", 522); // Kosovo // Countries without flag or controversial - Data is added just to keep the DB filled-up countryCodes.insert ("un", 506); // Scarboroug Reef countryCodes.insert ("un", 13); // Antartica return countryCodes; } bool DataBase::updateTheEntityTableISONames() { //qDebug() << "DataBase::updateTheEntityTableISONames" ; QSqlQuery query; QString sq; //First of all we will check if the entity table does contain data. We can't update something non existent! if (!hasTheTableData("entity")) { //qDebug() << Q_FUNC_INFO << " : Entity has NO data"; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } QMultiMap countryCodes; countryCodes.clear (); countryCodes = fillCountryCodes (); foreach (const QString &str, countryCodes.uniqueKeys()) { foreach (int i, countryCodes.values(str)) { if (!updateEntity (str, i)) { //qDebug() << Q_FUNC_INFO << " : Update entity failed: " << str; return false; } //qDebug() << str << ':' << i; } } //qDebug() << "DataBase::updateTheEntityTableISONames-END" ; return true; } bool DataBase::updateEntity (const QString &_codeString, const int _code) { //qDebug() << Q_FUNC_INFO << "ISOCode: " << _codeString << " - int: " << QString::number(_code); QString sq = QString ("UPDATE entity SET isoname='%1' WHERE dxcc='%2'").arg(_codeString).arg(_code); //TODO Capture and manage the error return execQuery(Q_FUNC_INFO, sq); } bool DataBase::isTheTableExisting(const QString &_tableName) { QSqlQuery query; QString sq = QString("SELECT name FROM sqlite_master WHERE name='%1'").arg(_tableName); bool sqlOK = query.exec(sq); if (sqlOK) { if (query.next()) { if (query.isValid()) { int _n = (query.value(0)).toInt(); query.finish(); if (_n > 0) { //qDebug() << "DataBase::isTheTableExisting - Table Exists" ; return true; } else { //qDebug() << "DataBase::isTheTableExisting - Table does not Exist" ; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } } } else { // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } // emit debugLog(Q_FUNC_INFO, "3", 7); return false; } bool DataBase::hasTheTableData(const QString &_tableName) { //qDebug() << "DataBase::hasTheTableData" << _tableName ; QSqlQuery query; QString stringQuery = QString("SELECT count(id) FROM %1").arg(_tableName); bool sqlOK = query.exec(stringQuery); if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataBase::hasTheTableData - valid" ; int _num = (query.value(0)).toInt(); query.finish(); if (_num > 0) { //qDebug() << "DataBase::hasTheTableData - DB Exists" ; return true; } else { //qDebug() << "DataBase::hasTheTableData - DB does not Exist" ; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } else { //qDebug() << "DataBase::hasTheTableData - not valid" ; query.finish(); // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } } else { //qDebug() << "DataBase::hasTheTableData: LastQuery: " << query.lastQuery() ; //qDebug() << "DataBase::hasTheTableData: LastError-data: " << query.lastError().databaseText() ; //qDebug() << "DataBase::hasTheTableData: LastError-driver: " << query.lastError().driverText() ; //qDebug() << "DataBase::hasTheTableData LastError-n: " << QString::number(query.lastError().nativeErrorCode() ) ; //qDebug() << "DataBase::updateTheEntityTableISONames" ; queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); // emit debugLog(Q_FUNC_INFO, "3", 7); return false; } //qDebug() << "DataBase::isTheDBCreated: END FALSE" ; //query.finish(); //return false; } bool DataBase::updateTo011() {// Updates the DB to 0.011: // We add FT8 mode and // AS Propagation //qDebug() << "DataBase::updateTo011: latestRead: " << getDBVersion() ; bool IAmIn011 = false; bool IAmIn010 = false; QString stringQuery = QString(); //QSqlQuery query; //bool sqlOk = false; latestReaded = getDBVersion().toFloat(); //qDebug() << "DataBase::updateTo011: Checking (latestRead/dbVersion):" << QString::number(latestReaded) << "/" << QString::number(dbVersion) ; if (latestReaded >= 0.011f) { //qDebug() << "DataBase::updateTo011: - I am in 011" ; IAmIn011 = true; return true; } else { //qDebug() << "DataBase::updateTo011: - I am not in 0.012 I am in: " << QString::number(latestReaded); bool ErrorUpdating = false; while (!IAmIn010 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo011: - Check if I am in 010: !" ; IAmIn010 = updateTo010(); if (IAmIn010) { //qDebug() << "DataBase::updateTo011: - updateTo010 returned TRUE - I am in 0.010: " << QString::number(latestReaded) ; } else { //qDebug() << "DataBase::updateTo011: - updateTo009 returned FALSE - I am NOT in 0.010: " << QString::number(latestReaded) ; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateTo011: - I Could not update to: " << QString::number(dbVersion) ; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } if (!recreateSatelliteData()) { //qDebug() << "DataBase::updateTo011: - Sats update NOK " ; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } if (!recreateTableDXCC()) { //qDebug() << "DataBase::updateTo011: - recreateTableDXCC NOK " ; // emit debugLog(Q_FUNC_INFO, "3", 7); return false; } if (!recreateTableWAZ()) { //qDebug() << "DataBase::updateTo011: - recreateTableWAZ NOK " ; // emit debugLog(Q_FUNC_INFO, "4", 7); return false; } if(!execQuery(Q_FUNC_INFO, "INSERT INTO mode (submode, name, cabrillo, deprecated) VALUES ('MSK144', 'MSK144', 'NO', '0')")) { //qDebug() << "DataBase::updateTo011: - MSK NOK " ; // emit debugLog(Q_FUNC_INFO, "5", 7); return false; } if (!recreateTableLog()) { //qDebug() << "DataBase::updateTo011: - Failed to recreate Table Log " ; // emit debugLog(Q_FUNC_INFO, "6", 7); return false; } if (updateDBVersion(softVersion, "0.011")) { //qDebug() << "DataBase::updateTo011: - We are in 011! " ; IAmIn011 = true; } else { //qDebug() << "DataBase::updateTo011: - Failed to go to 011! " ; IAmIn011 = false; } if (!updateAwardDXCCTable()) { //qDebug() << "DataBase::updateTo011: - updateAwardDXCCTable NOK " ; IAmIn011 = false; // emit debugLog(Q_FUNC_INFO, "7", 7); return false; } if (!updateAwardWAZTable()) { //qDebug() << "DataBase::updateTo011: - updateAwardWAZTable NOK " ; IAmIn011 = false; } //qDebug() << "DataBase::updateTo011: - END" ; if (!IAmIn011) {// emit debugLog(Q_FUNC_INFO, "8", 7); } return IAmIn011; } bool DataBase::updateTo012() { // Updates the DB to 0.012: // Change the table qsl_via to qsl_via_enumeration // Solve the supportedContest table missing bug in some deployments //qDebug() << "DataBase::updateTo012: latestRead: " << getDBVersion() ; bool IAmIn011 = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); //qDebug() << "DataBase::updateTo012: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) ; if (latestReaded >= 0.012f) { //qDebug() << "DataBase::updateTo012: - I am in 012" ; return true; } else { //qDebug() << "DataBase::updateTo012: - I am not in 0.012 I am in: " << getDBVersion() ; while (!IAmIn011 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo012: - Check if I am in 011: !" ; IAmIn011 = updateTo011(); if (IAmIn011) { //qDebug() << "DataBase::updateTo012: - updateTo011 returned TRUE - I am in 0.011: " << QString::number(latestReaded) ; } else { //qDebug() << "DataBase::updateTo012: - updateTo011 returned FALSE - I am NOT in 0.011: " << QString::number(latestReaded) ; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateTo012: - I Could not update to: " << QString::number(dbVersion) ; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } // Now I am in the previous version and I can update the DB. //bool sqlOK = false; if (isTheTableExisting("supportedcontest")) { bool sqlOK = execQuery(Q_FUNC_INFO, "DROP TABLE supportedcontest"); if (sqlOK) { if (createTableSupportedContest()) { sqlOK = recreateSupportedContest(); } else { //qDebug() << "DataBase::updateTo012: UPDATED NOK-1!" ; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } } } else { if (createTableSupportedContest()) { if (!recreateSupportedContest()) { //qDebug() << "DataBase::updateTo012: UPDATED NOK-2!" ; // emit debugLog(Q_FUNC_INFO, "3", 7); return false; } } } if (updateDBVersion(softVersion, "0.012")) { //qDebug() << "DataBase::updateTo012: - We are in 012! " ; } else { //qDebug() << "DataBase::updateTo011: - Failed to go to 012! " ; // emit debugLog(Q_FUNC_INFO, "4", 7); return false; } //qDebug() << "DataBase::updateTo012: UPDATED OK!" ; return true; } bool DataBase::updateTo013() { // Updates the DB to 0.013: // Change the table qsl_via to qsl_via_enumeration // Solve the supportedContest table missing bug in some deployments //qDebug() << "DataBase::updateTo013: latestRead: " << getDBVersion() ; bool IAmIn012 = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); //qDebug() << "DataBase::updateTo013: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) ; if (latestReaded >= 0.013f) { //qDebug() << "DataBase::updateTo013: - I am in 013" ; return true; } else { //qDebug() << "DataBase::updateTo013: - I am not in 0.013 I am in: " << getDBVersion() ; while (!IAmIn012 && !ErrorUpdating) { //qDebug() << "DataBase::updateTo013: - Check if I am in 012: !" ; IAmIn012 = updateTo012(); if (IAmIn012) { //qDebug() << "DataBase::updateTo013: - updateTo012 returned TRUE - I am in 0.012: " << QString::number(latestReaded) ; } else { //qDebug() << "DataBase::updateTo013: - updateTo011 returned FALSE - I am NOT in 0.012: " << QString::number(latestReaded) ; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateTo013: - I Could not update to: " << QString::number(dbVersion) ; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } // Now I am in the previous version and I can update the DB. if (!recreateSupportedContest()) { // emit debugLog(Q_FUNC_INFO, "2", 7); /*emit debugLog(Q_FUNC_INFO, "0", 7);*/ return false; } execQuery(Q_FUNC_INFO, "DROP TABLE IF exists qsl_via"); if (createTableQSL_Via_enumeration()) { if (!populateTableQSL_Via_enumeration()) { // emit debugLog(Q_FUNC_INFO, "3", 7); return false; } } else { // emit debugLog(Q_FUNC_INFO, "4", 7); return false; } if (updateDBVersion(softVersion, "0.013")) { //qDebug() << "DataBase::updateTo013: - We are in 013! " ; } else { //qDebug() << "DataBase::updateTo013: - Failed to go to 013! " ; // emit debugLog(Q_FUNC_INFO, "5", 7); return false; } //qDebug() << "DataBase::updateTo013: UPDATED OK!" ; return true; } bool DataBase::updateTo014() { // Updates the DB to 0.014: // Updates the Satellite DB //qDebug() << "DataBase::updateto014: latestRead: " << getDBVersion() ; bool IAmIn013 = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); //qDebug() << "DataBase::updateto014: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) ; if (latestReaded >= 0.014f) { //qDebug() << "DataBase::updateto014: - I am in 013" ; return true; } else { //qDebug() << "DataBase::updateto014: - I am not in 0.013 I am in: " << getDBVersion() ; while (!IAmIn013 && !ErrorUpdating) { //qDebug() << "DataBase::updateto014: - Check if I am in 013: !" ; IAmIn013 = updateTo013(); if (IAmIn013) { //qDebug() << "DataBase::updateto014: - updateTo012 returned TRUE - I am in 0.013: " << QString::number(latestReaded) ; } else { //qDebug() << "DataBase::updateto014: - updateTo011 returned FALSE - I am NOT in 0.013: " << QString::number(latestReaded) ; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateto014: - I Could not update to: " << QString::number(dbVersion) ; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } // Now I am in the previous version and I can update the DB. if (!recreateSatelliteData()) { //qDebug() << "DataBase::updateTo014: - Sats update NOK " ; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } if (updateDBVersion(softVersion, "0.014")) { //qDebug() << "DataBase::updateto014: - We are in 013! " ; } else { //qDebug() << "DataBase::updateto014: - Failed to go to 013! " ; // emit debugLog(Q_FUNC_INFO, "3", 7); return false; } //qDebug() << "DataBase::updateTo014: UPDATED OK!" ; return true; } bool DataBase::updateTo015() { // Updates the DB to 0.015: // Adds the FT4 mode //qDebug() << "DataBase::updateto015: latestRead: " << getDBVersion() ; bool IAmIn014 = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); //qDebug() << "DataBase::updateto015: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) ; if (latestReaded >= 0.015f) { //qDebug() << "DataBase::updateto015: - I am in 013" ; return true; } else { //qDebug() << "DataBase::updateto014: - I am not in 0.014 I am in: " << getDBVersion() ; while (!IAmIn014 && !ErrorUpdating) { //qDebug() << "DataBase::updateto015: - Check if I am in 014: !" ; IAmIn014 = updateTo014(); if (IAmIn014) { //qDebug() << "DataBase::updateto015: - updateTo013 returned TRUE - I am in 0.014: " << QString::number(latestReaded) ; } else { //qDebug() << "DataBase::updateto015: - updateTo011 returned FALSE - I am NOT in 0.014: " << QString::number(latestReaded) ; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateto015: - I Could not update to: " << QString::number(dbVersion) ; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } // Now I am in the previous version and I can update the DB. if (updateTheModeTableAndSyncLog()) { //qDebug() << "DataBase::updateTo015: - updateTheModeTableAndSyncLog OK" ; } else { //qDebug() << "DataBase::updateTo015: UPDATED NOK!(9)" ; //ErrorUpdating = true; } if (updateDBVersion(softVersion, "0.015")) { //qDebug() << "DataBase::updateto015: - We are in 015! " ; } else { //qDebug() << "DataBase::updateto015: - Failed to go to 014! " ; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } //qDebug() << "DataBase::updateTo015: UPDATED OK!" ; return true; } bool DataBase::updateTo016() { // Updates the DB to 0.016: // Updates the Satellite DB //qDebug() << "DataBase::updateto016: latestRead: " << getDBVersion() ; bool IAmIn015 = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); //qDebug() << "DataBase::updateto016: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) ; if (latestReaded >= 0.016f) { //qDebug() << "DataBase::updateto016: - I am in 015" ; return true; } else { //qDebug() << "DataBase::updateto016: - I am not in 0.015 I am in: " << getDBVersion() ; while (!IAmIn015 && !ErrorUpdating) { //qDebug() << "DataBase::updateto014: - Check if I am in 015: !" ; IAmIn015 = updateTo015(); if (IAmIn015) { //qDebug() << "DataBase::updateto016: - updateTo015 returned TRUE - I am in 0.015: " << QString::number(latestReaded) ; } else { //qDebug() << "DataBase::updateto016: - updateTo015 returned FALSE - I am NOT in 0.015: " << QString::number(latestReaded) ; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateto016: - I Could not update to: " << QString::number(dbVersion) ; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } // Now I am in the previous version and I can update the DB. if (!recreateSatelliteData()) { //qDebug() << "DataBase::updateTo016: - Sats update NOK " ; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } if (updateDBVersion(softVersion, "0.016")) { //qDebug() << "DataBase::updateto014: - We are in 016! " ; } else { //qDebug() << "DataBase::updateto014: - Failed to go to 016! " ; // emit debugLog(Q_FUNC_INFO, "3", 7); return false; } //qDebug() << "DataBase::updateTo016: UPDATED OK!" ; return true; } bool DataBase::updateTo017() { // Updates the DB to 0.017: // Updates the Satellite DB //qDebug() << "DataBase::updateto017: latestRead: " << getDBVersion() ; bool IAmIn016 = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); //qDebug() << "DataBase::updateto017: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) ; if (latestReaded >= 0.017f) { //qDebug() << "DataBase::updateto017: - I am in 017" ; return true; } else { //qDebug() << "DataBase::updateto017: - I am not in 0.017 I am in: " << getDBVersion() ; while (!IAmIn016 && !ErrorUpdating) { //qDebug() << "DataBase::updateto017: - Check if I am in 016: !" ; IAmIn016 = updateTo016(); if (IAmIn016) { //qDebug() << "DataBase::updateto017: - updateTo016 returned TRUE - I am in 0.016: " << QString::number(latestReaded) ; } else { //qDebug() << "DataBase::updateto017: - updateTo016 returned FALSE - I am NOT in 0.016: " << QString::number(latestReaded) ; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateto017: - I Could not update to: " << QString::number(dbVersion) ; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } // Now I am in the previous version and I can update the DB. // Query to remove the "/" from a Date: update log set qso_date = replace(qso_date, '/', '') // Query to remove the ":" from the Time: update log set time_on = replace(time_on, ':', '') // Query to join columns: // update log set qso_date = replace((SELECT qso_date from log)||'-'||time_on, '', '') /* PROCEDURE: Move to SQLITE - datetime type: // 2020-01-01 10:12:01 // Query to remove the "/" from a Date: update log set qso_date = replace(qso_date, '/', '-') // Join: SELECT qso_date || ' ' || time_on from log UPDATE logtemp SET qso_date = (SELECT qso_date || ' ' || time_on FROM log) */ /* QString stringQuery; stringQuery = "update log set qso_date = replace((SELECT qso_date from log)||'-'||time_on, '', '')"; //UPDATE log set qso_date = qso_date ||'-'||time_on bool sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {return false;} */ // Modify the qso_date with the time_on data with the right format QString stringQuery; stringQuery = "UPDATE log set qso_date = replace(qso_date ||' '||time_on, '/', '-')"; bool sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {/*emit debugLog(Q_FUNC_INFO, "2", 7);*/return false;} stringQuery = "UPDATE log set qso_date_off = replace(qso_date_off, '/', '-')"; sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {/*emit debugLog(Q_FUNC_INFO, "3", 7);*/return false;} stringQuery = "UPDATE log set qslsdate = replace(qslsdate, '/', '-')"; sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {/*emit debugLog(Q_FUNC_INFO, "4", 7);*/return false;} stringQuery = "UPDATE log set qslrdate = replace(qslrdate, '/', '-')"; sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {/*emit debugLog(Q_FUNC_INFO, "5", 7);*/return false;} stringQuery = "UPDATE log set lotw_qslsdate = replace(lotw_qslsdate, '/', '-')"; sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {/*emit debugLog(Q_FUNC_INFO, "6", 7);*/return false;} stringQuery = "UPDATE log set lotw_qslrdate = replace(lotw_qslrdate, '/', '-')"; sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {/*emit debugLog(Q_FUNC_INFO, "7", 7);*/return false;} stringQuery = "UPDATE log set eqsl_qslrdate = replace(eqsl_qslrdate, '/', '-')"; sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {/*emit debugLog(Q_FUNC_INFO, "8", 7);*/return false;} stringQuery = "UPDATE log set eqsl_qslsdate = replace(eqsl_qslsdate, '/', '-')"; sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {/*emit debugLog(Q_FUNC_INFO, "9", 7);*/return false;} stringQuery = "UPDATE log set hrdlog_qso_upload_date = replace(hrdlog_qso_upload_date, '/', '-')"; sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {/*emit debugLog(Q_FUNC_INFO, "10", 7);*/return false;} stringQuery = "UPDATE log set hrdlog_qso_upload_date = replace(hrdlog_qso_upload_date, '/', '-')"; sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {/*emit debugLog(Q_FUNC_INFO, "11", 7);*/return false;} stringQuery = "UPDATE log set clublog_qso_upload_date = replace(clublog_qso_upload_date, '/', '-')"; sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {/*emit debugLog(Q_FUNC_INFO, "12", 7);*/return false;} stringQuery = "UPDATE log set qrzcom_qso_upload_date = replace(qrzcom_qso_upload_date, '/', '-')"; sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {/*emit debugLog(Q_FUNC_INFO, "13", 7);*/return false;} if (!recreateTableLog()) { //qDebug() << "DataBase::updateTo017: - Failed to recreate Table Log " ; // emit debugLog(Q_FUNC_INFO, "14", 7); return false; } //qDebug() << "DataBase::updateTo017: - Recreated Table Log " ; /* else { //qDebug() << "DataBase::updateTo017: - Table log recreated OK" ; } */ // REMOVE THE FOLLOWING LINE ONCE THIS FUNCTION HAS BEEN UPDATED //return false; // If everything went OK, we update the DB number. if (updateDBVersion(softVersion, "0.017")) { //qDebug() << "DataBase::updateto017: - We are in 017! " ; } else { //qDebug() << "DataBase::updateto017: - Failed to go to 017! " ; // emit debugLog(Q_FUNC_INFO, "15", 7); return false; } //qDebug() << "DataBase::updateTo017: UPDATED OK!" ; return true; } bool DataBase::updateTo018() { // Updates the DB to 0.018: // Adds the Subdivisions //qDebug() << "DataBase::updateto018: latestRead: " << getDBVersion() ; bool IAmIn017 = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); //qDebug() << "DataBase::updateto018: Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) ; if (latestReaded >= 0.018f) { //qDebug() << "DataBase::updateto018: - I am in 018" ; return true; } else { //qDebug() << "DataBase::updateto018: - I am not in 0.018 I am in: " << getDBVersion() ; while (!IAmIn017 && !ErrorUpdating) { //qDebug() << "DataBase::updateto017: - Check if I am in 017: !" ; IAmIn017 = updateTo017(); if (IAmIn017) { //qDebug() << "DataBase::updateto018: - updateTo017 returned TRUE - I am in 0.017: " << QString::number(latestReaded) ; } else { //qDebug() << "DataBase::updateto017: - updateTo017 returned FALSE - I am NOT in 0.017: " << QString::number(latestReaded) ; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateto018: - I Could not update to: " << QString::number(dbVersion) ; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } // Now I am in the previous version and I can update the DB. bool ok = createTableSubdivision(true); if (!ok) { return false; } // REMOVE THE FOLLOWING LINE ONCE THIS FUNCTION HAS BEEN UPDATED //return false; // If everything went OK, we update the DB number. if (updateDBVersion(softVersion, "0.018")) { //qDebug() << "DataBase::updateto018: - We are in 018! " ; } else { //qDebug() << "DataBase::updateto018: - Failed to go to 018! " ; // emit debugLog(Q_FUNC_INFO, "15", 7); return false; } //qDebug() << "DataBase::updateTo018: UPDATED OK!" ; return true; } bool DataBase::updateTo019() {// Adds FTS4 and FST4W modes // Adds RS-44 sat //qDebug() << Q_FUNC_INFO << " " << getDBVersion() ; bool IAmIn018 = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); //qDebug() << Q_FUNC_INFO << " : Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) ; if (latestReaded >= 0.019f) { //qDebug() << Q_FUNC_INFO << " : - I am in 019" ; return true; } else { while (!IAmIn018 && !ErrorUpdating) { IAmIn018 = updateTo018(); if (!IAmIn018) { ErrorUpdating = false; } } if (ErrorUpdating) { // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } // Now I am in the previous version and I can update the DB. if (updateTheModeTableAndSyncLog() && recreateSatelliteData()) { //qDebug() << Q_FUNC_INFO << " : - updateTheModeTableAndSyncLog OK" ; } else { //qDebug() << Q_FUNC_INFO << " : UPDATED NOK!(9)" ; return false; } if (updateDBVersion(softVersion, "0.019")) { //qDebug() << Q_FUNC_INFO << " : - We are in 019! " ; } else { //qDebug() << Q_FUNC_INFO << " : - Failed to go to 018! " ; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } //qDebug() << Q_FUNC_INFO << " : UPDATED OK!" ; return true; } bool DataBase::updateTo022() {// Adds Q65 mode //qDebug() << Q_FUNC_INFO << " " << getDBVersion() ; bool IamInPreviousVersion = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); //qDebug() << Q_FUNC_INFO << " : Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) ; if (latestReaded >= 0.022f) { //qDebug() << Q_FUNC_INFO << " : - I am in 022" ; return true; } while (!IamInPreviousVersion && !ErrorUpdating) { IamInPreviousVersion = updateTo021(); if (!IamInPreviousVersion) { return false; } } // Now I am in the previous version and I can update the DB. if (!updateTheModeTableAndSyncLog() ) { //qDebug() << Q_FUNC_INFO << " : - updateTheModeTableAndSyncLog OK" ; return false; } if (!updateDBVersion(softVersion, QString::number(0.022))) { //qDebug() << Q_FUNC_INFO << " : - Failed to go to the previous version! " ; return false; } //qDebug() << Q_FUNC_INFO << " : - We are in the updated version! " ; //qDebug() << Q_FUNC_INFO << " : UPDATED OK!" ; return true; } bool DataBase::updateTo021() {// Adds 5M & 8M bands //qDebug() << Q_FUNC_INFO << " " << getDBVersion() ; bool IamInPreviousVersion = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); //qDebug() << Q_FUNC_INFO << " : Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) ; if (latestReaded >= 0.021f) { //qDebug() << Q_FUNC_INFO << " : - I am in 019" ; return true; } while (!IamInPreviousVersion && !ErrorUpdating) { IamInPreviousVersion = updateTo019(); if (!IamInPreviousVersion) { return false; } } // Now I am in the previous version and I can update the DB. if (!recreateTableBand ()) { //qDebug() << Q_FUNC_INFO << " : - updateTheModeTableAndSyncLog OK" ; return false; } if (!updateDBVersion(softVersion, QString::number(0.021))) { //qDebug() << Q_FUNC_INFO << " : - Failed to go to the previous version! " ; return false; } //qDebug() << Q_FUNC_INFO << " : - We are in the updated version! " ; //qDebug() << Q_FUNC_INFO << " : UPDATED OK!" ; return true; } bool DataBase::updateTo023() {// Recreates the table band //qDebug() << Q_FUNC_INFO << " " << getDBVersion() ; bool IamInPreviousVersion = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); //qDebug() << Q_FUNC_INFO << " : Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) ; if (latestReaded >= 0.023f) { //qDebug() << Q_FUNC_INFO << " : - I am in 023" ; return true; } while (!IamInPreviousVersion && !ErrorUpdating) { IamInPreviousVersion = updateTo022(); if (!IamInPreviousVersion) { return false; } } // Now I am in the previous version and I can update the DB. if (!recreateTableBand()) { //qDebug() << Q_FUNC_INFO << " : - updateTheModeTableAndSyncLog OK" ; return false; } if (!updateDBVersion(softVersion, QString::number(0.023))) { //qDebug() << Q_FUNC_INFO << " : - Failed to go to the previous version! " ; return false; } //qDebug() << Q_FUNC_INFO << " : - We are in the updated version! " ; //qDebug() << Q_FUNC_INFO << " : UPDATED OK!" ; return true; } bool DataBase::updateTo024() {// Recreates the table band //qDebug() << Q_FUNC_INFO << " " << getDBVersion() ; bool IamInPreviousVersion = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); //qDebug() << Q_FUNC_INFO << " : Checking (latestRead/dbVersion):" << getDBVersion() << "/" << QString::number(dbVersion) ; if (latestReaded >= 0.024f) { //qDebug() << Q_FUNC_INFO << " : - I am in 024" ; return true; } while (!IamInPreviousVersion && !ErrorUpdating) { IamInPreviousVersion = updateTo023(); if (!IamInPreviousVersion) { //qDebug() << Q_FUNC_INFO << " : Update to previous version failed"; return false; } } // Now I am in the previous version and I can update the DB. if (!updateTheEntityTableISONames()) { //qDebug() << Q_FUNC_INFO << " : Update of entityTableIsonames failed"; return false; } if (updateDBVersion(softVersion, QString::number(dbVersion))) { //qDebug() << Q_FUNC_INFO << " : - Failed to go to the previous version! " ; return false; } //qDebug() << Q_FUNC_INFO << " : - We are in the updated version! " ; //qDebug() << Q_FUNC_INFO << " : UPDATED OK!" ; return true; } bool DataBase::updateTo025() { // Updates the DB to 0.025: // Adds the mods on ADIF 3.1.3 //qDebug() << "DataBase::updateto025: latestRead: " << getDBVersion() ; bool IAmIn024 = false; bool ErrorUpdating = false; latestReaded = getDBVersion().toFloat(); if (latestReaded >= 0.025f) { //qDebug() << "DataBase::updateto025: - I am in 023" ; return true; } else { //qDebug() << "DataBase::updateto014: - I am not in 0.014 I am in: " << getDBVersion() ; while (!IAmIn024 && !ErrorUpdating) { //qDebug() << "DataBase::updateto015: - Check if I am in 024: !" ; IAmIn024 = updateTo014(); if (IAmIn024) { //qDebug() << "DataBase::updateto015: - updateTo013 returned TRUE - I am in 0.024: " << QString::number(latestReaded) ; } else { //qDebug() << "DataBase::updateto015: - updateTo011 returned FALSE - I am NOT in 0.024: " << QString::number(latestReaded) ; ErrorUpdating = false; } } if (ErrorUpdating) { //qDebug() << "DataBase::updateto025: - I Could not update to: " << QString::number(dbVersion) ; // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } } // Now I am in the previous version and I can update the DB. if ((updateTheModeTableAndSyncLog()) && (recreatePropModes ())) { //qDebug() << "DataBase::updateTo015: - updateTheModeTableAndSyncLog OK" ; } else { //qDebug() << "DataBase::updateTo015: UPDATED NOK!(9)" ; //ErrorUpdating = true; } if (updateDBVersion(softVersion, "0.025")) { //qDebug() << "DataBase::updateto025: - We are in 025! " ; } else { //qDebug() << "DataBase::updateto025: - Failed to go to 014! " ; // emit debugLog(Q_FUNC_INFO, "2", 7); return false; } //qDebug() << "DataBase::updateTo025: UPDATED OK!" ; return true; } bool DataBase::updateAwardDXCCTable() { //qDebug() << "DataBase::updateAwardDXCCTable" ; QList dxccStatusList; //QList dxccStatusListCheck; dxccStatusList.clear(); //dxccStatusListCheck.clear(); AwarddxccEntry awardEntry; awardEntry.dxcc = QString(); awardEntry.band = QString(); awardEntry.status = QString(); awardEntry.logNumber = QString(); awardEntry.qsoID = QString(); QString stringQuery = QString("SELECT id, bandid, modeid, dxcc, qsl_rcvd, lotw_qsl_rcvd, lognumber FROM log ORDER BY dxcc"); QSqlQuery query;//, query2; bool sqlOK = query.exec(stringQuery); QSqlRecord rec = query.record(); if (!sqlOK) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } else { //qDebug() << "DataBase::updateAwardDXCCTable SELECT when OK" ; } QStringList dxccStatus = QStringList(); //dxcc, band, mode, confirmed, lognumber, qsoid (per award set) QStringList dxccStatusCheck = QStringList(); //dxcc, band, mode, confirmed, lognumber (per award set) just to check int nameCol = -1; QString _aux = QString(); //qDebug() << "DataBase::updateAwardDXCCTable before the while" ; while (query.next()) { //qDebug() << "DataBase::updateAwardDXCCTable IN the while" ; if (query.isValid()) { //qDebug() << "DataBase::updateAwardDXCCTable VALID" ; awardEntry.dxcc.clear(); awardEntry.band.clear(); awardEntry.status.clear(); awardEntry.logNumber.clear(); awardEntry.qsoID.clear(); //qDebug() << "DataBase::updateAwardDXCCTable in the while" ; nameCol = rec.indexOf("qsl_rcvd"); bool qsl = false; if ((query.value(nameCol)).toString() == "Y") { qsl = true; } nameCol = rec.indexOf("lotw_qsl_rcvd"); bool lotw = false; if ((query.value(nameCol)).toString() == "Y") { lotw = true; } if (qsl || lotw ) { awardEntry.status = "1"; } else { awardEntry.status = "0"; } //qDebug() << "DataBase::updateAwardDXCCTable - status" << awardEntry.status ; if ((awardEntry.status == "1") || (awardEntry.status == "0") ) { nameCol = rec.indexOf("dxcc"); awardEntry.dxcc = (query.value(nameCol)).toString(); if ((awardEntry.dxcc).toInt()>0) { nameCol = rec.indexOf("bandid"); awardEntry.band = (query.value(nameCol)).toString(); nameCol = rec.indexOf("modeid"); awardEntry.mode = (query.value(nameCol)).toString(); nameCol = rec.indexOf("id"); awardEntry.qsoID = (query.value(nameCol)).toString(); nameCol = rec.indexOf("lognumber"); awardEntry.logNumber = (query.value(nameCol)).toString(); //qDebug() << "DataBase::updateAwardDXCCTable: Adding: " << awardEntry.dxcc <<"/" << awardEntry.band <<"/" << awardEntry.mode <<"/" << awardEntry.status <<"/" << awardEntry.logNumber <<"/" << awardEntry.qsoID ; dxccStatusList.append(awardEntry); } } // END OF IF VALID } } // END OF WHILE //qDebug() << "DataBase::updateAwardDXCCTable - END OF WHILE" ; query.finish(); //qDebug() << "DataBase::updateAwardDXCCTable: Log analized... let's clean the table!" ; stringQuery = QString("DELETE FROM awarddxcc"); sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {return false;} else { //qDebug() << "DataBase::updateAwardDXCCTable: awarddxcc table DELETED" ; } //qDebug() << "DataBase::updateAwardDXCCTable: Now we start writing the table!!" ; //int i = 0; _aux.clear(); int qsos = dxccStatusList.length(); int step = util->getProgresStepForDialog(qsos); QProgressDialog progress(QObject::tr("Updating DXCC award information..."), QObject::tr("Abort updating"), 0, qsos); progress.setMaximum(qsos); progress.setWindowModality(Qt::WindowModal); //qDebug() << "DataBase::updateAwardDXCCTable: INSERTING: " << QString::number(qsos) << " QSOS..." ; for (int j=0;j dxccStatusList; //QList dxccStatusListCheck; dxccStatusList.clear(); //dxccStatusListCheck.clear(); AwarddxccEntry awardEntry; awardEntry.dxcc = QString(); awardEntry.band = QString(); awardEntry.status = QString(); awardEntry.logNumber = QString(); awardEntry.qsoID = QString(); QString stringQuery = QString("SELECT id, bandid, modeid, cqz, qsl_rcvd, lotw_qsl_rcvd, lognumber FROM log ORDER BY cqz"); QSqlQuery query;//, query2; bool sqlOK = query.exec(stringQuery); QSqlRecord rec = query.record(); if (!sqlOK) { queryErrorManagement(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); // emit debugLog(Q_FUNC_INFO, "1", 7); return false; } else { //qDebug() << "DataBase::updateAwardWAZTable SELECT when OK" ; } QStringList dxccStatus = QStringList(); //cqz, band, mode, confirmed, lognumber, qsoid (per award set) QStringList dxccStatusCheck = QStringList(); //cqz, band, mode, confirmed, lognumber (per award set) just to check int nameCol = -1; QString _aux = QString(); //qDebug() << "DataBase::updateAwardWAZTable before the while" ; while (query.next()) { //qDebug() << "DataBase::updateAwardWAZTable IN the while" ; if (query.isValid()) { //qDebug() << "DataBase::updateAwardWAZTable VALID" ; awardEntry.dxcc.clear(); awardEntry.band.clear(); awardEntry.status.clear(); awardEntry.logNumber.clear(); awardEntry.qsoID.clear(); //qDebug() << "DataBase::updateAwardWAZTable in the while" ; nameCol = rec.indexOf("qsl_rcvd"); bool qsl = false; if ((query.value(nameCol)).toString() == "Y") { qsl = true; } nameCol = rec.indexOf("lotw_qsl_rcvd"); bool lotw = false; if ((query.value(nameCol)).toString() == "Y") { lotw = true; } if (qsl || lotw ) { awardEntry.status = "1"; } else { awardEntry.status = "0"; } //qDebug() << "DataBase::updateAwardWAZTable - status" << awardEntry.status ; if ((awardEntry.status == "1") || (awardEntry.status == "0") ) { nameCol = rec.indexOf("cqz"); awardEntry.dxcc = (query.value(nameCol)).toString(); if ((awardEntry.dxcc).toInt()>0) { nameCol = rec.indexOf("bandid"); awardEntry.band = (query.value(nameCol)).toString(); nameCol = rec.indexOf("modeid"); awardEntry.mode = (query.value(nameCol)).toString(); nameCol = rec.indexOf("id"); awardEntry.qsoID = (query.value(nameCol)).toString(); nameCol = rec.indexOf("lognumber"); awardEntry.logNumber = (query.value(nameCol)).toString(); //qDebug() << "DataBase::updateAwardWAZTable: Adding: " << awardEntry.dxcc <<"/" << awardEntry.band <<"/" << awardEntry.mode <<"/" << awardEntry.status <<"/" << awardEntry.logNumber <<"/" << awardEntry.qsoID ; dxccStatusList.append(awardEntry); } } // END OF IF VALID } } // END OF WHILE //qDebug() << "DataBase::updateAwardWAZTable - END OF WHILE" ; query.finish(); //qDebug() << "DataBase::updateAwardWAZTable: Log analized... let's clean the table!" ; stringQuery = QString("DELETE FROM awardwaz"); sqlOK = execQuery(Q_FUNC_INFO, stringQuery); if (!sqlOK) {return false;} else { //qDebug() << "DataBase::updateAwardWAZTable: awardwaz table DELETED" ; } //qDebug() << "DataBase::updateAwardWAZTable: Now we start writing the table!!" ; //int i = 0; _aux.clear(); int qsos = dxccStatusList.length(); int step = util->getProgresStepForDialog(qsos); QProgressDialog progress(QObject::tr("Updating WAZ award information..."), QObject::tr("Abort updating"), 0, qsos); progress.setMaximum(qsos); progress.setWindowModality(Qt::WindowModal); //qDebug() << "DataBase::updateAwardWAZTable: INSERTING: " << QString::number(qsos) << " QSOS..." ; for (int j=0;j. * * * *****************************************************************************/ #include #include #include #include #include "klogdefinitions.h" class TipsDialog : public QDialog { Q_OBJECT public: explicit TipsDialog(QWidget *parent = nullptr); ~TipsDialog(); void setLogLevel(const DebugLogLevel _sev); signals: void debugLog (QString _func, QString _msg, DebugLogLevel _level); void fillInQSOSignal(); void fillInDXCCSignal(); void findQSL2QSOSignal(); void fileExportToPrintSignal(); //void fileExportForLoTWSignal(); void fileOpenKLogFolderSignal(); void toolSendPendingQSLSignal(); void toolRecPendingQSLSignal(); void toolRecRecPendingQSLSignal(); void toolsUploadLoTWSignal(); private slots: void slotPrevButtonClicked(); void slotNextButtonClicked(); void slotLinkActivated(const QString &_link); private: void setTip(const int _t); void logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level); QLabel *tipTextQLabel; //QTextEdit *tipTextEdit; QWidget *tip; DebugLogLevel logLevel; int tipId, tipMax; QString description; }; #endif // TIPSDIALOG_H klog-2.3.3/elogqrzlog.h0000644000015700001710000001172614542412415014702 0ustar jenkinsjenkins#ifndef KLOG_ELOGQRZLOG_H #define KLOG_ELOGQRZLOG_H /*************************************************************************** elogqrzlog.h - description ------------------- begin : nov 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include "utilities.h" #include "dataproxy_sqlite.h" #include "widgets/onlinemessagewidget.h" // https://www.qrz.com/XML/current_spec.html // https://www.qrz.com/page/xml_data.html // https://www.qrz.com/docs/logbook/QRZLogbookAPI.html class eLogQrzLog : public QObject { Q_OBJECT public: explicit eLogQrzLog(DataProxy_SQLite *dp, const QString &_parentFunction, const QString &_klogVersion); ~eLogQrzLog(); void login(); void setUser(const QString &_user); void setPassword(const QString &_pass); void setLogBookKey(const QString &_key); bool hasLogBookKey(); int sendQSOs(QList _qsos); void checkQRZ(const QString &_qrz); void fetchData(); void setSubcription(const bool _ok); bool getSubscription(); //int deleteQSOid(const int _qsoId); //int modifyQSO (QStringList _oldQSO, QStringList _newQSO); //void sendLogFile(const QString &_file, QList _qso, bool _overwrite); private slots: void slotManagerFinished(QNetworkReply* data); void slotManagerLogFinished(QNetworkReply* data); //void slotFileUploadFinished(QNetworkReply* data); void downloadProgress(qint64 received, qint64 total); void slotErrorManagement(QNetworkReply::NetworkError networkError); signals: void actionReturnDownload(const int _i, const int _qsoId); void done(); void actionShowProgres(qint64 received, qint64 total); void actionError(const int _i); void showMessage(const QString &_t); void disableQRZAction(const bool _b); void signalLogUploaded(QNetworkReply::NetworkError, QList); void dataFoundSignal(const QString &_type, const QString &_data); private: void showDebugLog(const QString &_func, const QString &_log); //QString getClubLogAdif(const QStringList _q); //int sendData(const QString &_clublogCall, const QString &_q); // Sends the data (http post) to ClubLog int sendDataParams(const QUrlQuery &_params); QString prepareToTranslate(const QString &_m); // Get the message and put it in a tr to be able to translate it bool canConnect(); //void parseAppAnswer (const int howManyQSOs, const QString &_m); void parseAppAnswer (const QString &_m); void parseNetworkError(QNetworkReply::NetworkError _error); void parseXMLAnswer(QXmlStreamReader &xml); int sendQSO(const int _qsoID); void sendSignal(QNetworkReply::NetworkError _error, QList _qsos); bool errorWhileSendingLog; bool sendingQSO; bool lastQSO; bool subscriptionOK; QString sessionkey, logbookkey; QString user, pass; QString klogVersion; DataProxy_SQLite *dataProxy; QNetworkAccessManager *manager; QNetworkAccessManager *managerLog; int currentQSO; QNetworkReply::NetworkError result; QString target; bool uploadingFile; QList qsos; Utilities *util; bool logged; QUrl serviceUrl; QXmlStreamReader *reader; OnlineMessageWidget *onlineMessage; //bool useQSOStationCallsign; }; #endif // DOWNLOADCTY_H klog-2.3.3/startwizard.h0000644000015700001710000001137114542412415015067 0ustar jenkinsjenkins#ifndef KLOG_STARTWIZARD_H #define KLOG_STARTWIZARD_H /*************************************************************************** startwizard.h - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include //#include #include #include #include #include #include "downloadcty.h" class FileOrMemoryPage; class CTYPage; class StartWizard : public QWizard { Q_OBJECT public: enum { Page_Intro, Page_Lic, Page_Mem, Page_CTY }; StartWizard(const QString &_klogDir, const QString &_softVersion, QWidget *parent = nullptr); void setVersion(const QString &tversion); //~StartWizard(); protected: private slots: void slotCancelWizard(); //void slotRunInMemory(bool checked); void slotButtonFinishedClicked(); private: //FileOrMemoryPage *fileOrMemoryPage; CTYPage *ctyPage; QString version; //bool inMemory; QString klogDir; }; class IntroPage : public QWizardPage { Q_OBJECT public: IntroPage(QWidget *parent = nullptr); int nextId() const; private: QLabel *topLabel; QTextEdit *welcomeBrowser; }; class LicPage : public QWizardPage { Q_OBJECT public: LicPage(QWidget *parent = nullptr); //void setNextButtonActive(const bool _active); int nextId() const; private: QLabel *topLabel; QTextEdit *licenseBrowser; QCheckBox *aceptLicCheckBox; }; /* class FileOrMemoryPage : public QWizardPage { Q_OBJECT public: FileOrMemoryPage(QWidget *parent = 0); int nextId() const; //int nextId() const; private slots: void slotRunningModeSelectedFile(bool checked); void slotRunningModeSelectedMemory(bool checked); signals: void exeInMemory(const bool mem); private: bool downloadCTYFile(); QLabel *topLabel; QCheckBox *memoryQCheckbox; QCheckBox *fileQCheckbox; bool runInMemory; }; */ class CTYPage : public QWizardPage { Q_OBJECT public: CTYPage(const QString &_klogDir, const QString &_version, QWidget *parent = nullptr); void updateProgress (qint64 v,qint64 t); private slots: /* void slotCTYCheckButtonTogled(int state); void slotDownloadCTY(bool checked); void slotDownloadFinished(); void slotValueReturnedFromDownload(int value); void slotDownloadButtonClicked(); */ void slotUpdateDownloadProgress(qint64 received, qint64 total); void slotDownloadButtonClicked(); void slotIgnoreDownloadButtonClicked(); void slotDownloadFinished(const int ret); void slotDownloadError(const int ret); void slotStopProgressBar(); signals: void downloadTheFileSignal(const bool mem); private: //bool prepareTheDownload(); //bool doTheDownload(); //bool isComplete(); //bool CTYFileDownloaded; //int downloadValueResult; //QString klogDir; //int total; //bool completed; DownLoadCTY *dl; QLabel *topLabel; QTextEdit *ctyBrowser; //QCheckBox *downloadCTYCheckBox; QProgressBar *progressBar; QPushButton *downloadButton, *ignoreDownloadButton; QCheckBox *hiddenCheckBox; }; #endif // STARTWIZARD_H klog-2.3.3/klog.rc0000644000015700001710000000007314542412415013617 0ustar jenkinsjenkinsIDI_ICON1 ICON DISCARDABLE "klog.ico" klog-2.3.3/softwareupdatedialog.cpp0000644000015700001710000001053614542412415017263 0ustar jenkinsjenkins/*************************************************************************** softwareupdatedialog.cpp - description ------------------- begin : feb 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "softwareupdatedialog.h" //#include SoftwareUpdateDialog::SoftwareUpdateDialog() { //qDebug() << "SoftwareUpdateDialog::SoftwareUpdateDialog" ; textBrowser = new QTextBrowser; textBrowser->setOpenLinks(true); textBrowser->setOpenExternalLinks(true); //textBrowser->setFrameShadow(QFrame::Raised); //textBrowser->setFrameStyle(QFrame::StyledPanel); QPushButton *acceptButton = new QPushButton(tr("Ok")); textBrowser->setOpenExternalLinks(true); //textBrowser->setHTML(url); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addWidget(acceptButton); /// QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(textBrowser); mainLayout->addLayout(buttonsLayout); setLayout(mainLayout); setWindowTitle(tr("KLog update")); /// connect(acceptButton, SIGNAL(clicked()), this, SLOT(slotAcceptButtonClicked())); //qDebug() << "SoftwareUpdateDialog::SoftwareUpdateDialog - END" ; } void SoftwareUpdateDialog::setVersion(const QString tversion, const bool updateNeeded) { //qDebug() << "SoftwareUpdateDialog::setVersion: " << tversion; _version = tversion; if (updateNeeded) { //text = "

KLog new version ("+ tversion + ") is available!


There is a new version of KLog available.

You can get the new version from:

https://www.klog.xyz
"; text = tr("

KLog new version (%1) is available!


There is a new version of KLog available.

You can get the new version from:

https://www.klog.xyz
").arg(tversion); } else { text = "

" + tr("Congratulations!") + "



" + tr("Your KLog has been updated.") + "

" + tr("You already have the latest version.") + "
("+ tversion + ")
"; } textBrowser->setHtml(text); //qDebug() << "SoftwareUpdateDialog::setVersion: END"<< QT_ENDL; } SoftwareUpdateDialog::~SoftwareUpdateDialog() { //qDebug() << "SoftwareUpdateDialog::~SoftwareUpdateDialog" ; } void SoftwareUpdateDialog::slotAcceptButtonClicked() { //qDebug() << "SoftwareUpdateDialog::slotAcceptButtonClicked" ; accept(); //qDebug() << "SoftwareUpdateDialog::slotAcceptButtonClicked END" ; } void SoftwareUpdateDialog::keyPressEvent(QKeyEvent *event) { //qDebug() << "SoftwareUpdateDialog::keyPressEvent" ; if (event->key()>=0) { slotAcceptButtonClicked(); } //qDebug() << "SoftwareUpdateDialog::keyPressEvent END" ; } klog-2.3.3/eqslutilities.cpp0000644000015700001710000002325214542412415015745 0ustar jenkinsjenkins/*************************************************************************** eqslutilities.cpp - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles user : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "eqslutilities.h" #include #include #include #include //#include eQSLUtilities::eQSLUtilities(const QString &_parentFunction) { //qDebug()<< "eQSLUtilities::eQSLUtilities" ; Q_UNUSED(_parentFunction); #ifdef QT_DEBUG //qDebug() << Q_FUNC_INFO << ": " << _parentFunction; #else #endif user = QString(); pass = QString(); qsos.clear(); currentQSO = -1; manager = new QNetworkAccessManager(this); connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(slotQsoUploadFinished(QNetworkReply*))); stationCallsign = QString(); uploadingFile = false; util = new Utilities(Q_FUNC_INFO); //qDebug()<< "eQSLUtilities::eQSLUtilities - END" ; } eQSLUtilities::~eQSLUtilities() { delete(util); //qDebug()<< "eQSLUtilities::~eQSLUtilities" ; } void eQSLUtilities::setUser(const QString &_call) { //qDebug() << "eQSLUtilities::setUser: " << _call; user = _call; //qDebug() << "eQSLUtilities::setUser: END"; } void eQSLUtilities::setPass(const QString &_pass) { //qDebug() << "eQSLUtilities::setPass: " << _pass; pass = _pass; //qDebug() << "eQSLUtilities::setPass: END"; } void eQSLUtilities::slotQsoUploadFinished(QNetworkReply *data) { //qDebug()<< "eQSLUtilities::slotQsoUploadFinished" ; QStringList parsedAnswer; parsedAnswer.clear(); result = data->error(); //qDebug()<< Q_FUNC_INFO << " - Result = " << QString::number(result); const QByteArray sdata = data->readAll(); QString text = QString(); if (result == QNetworkReply::NoError) { parsedAnswer << prepareToTranslate(sdata); if (parsedAnswer.at(0).contains("Error")) { //qDebug()<< Q_FUNC_INFO << " - error detected"; QMessageBox::warning(nullptr, tr("KLog - eQSL"), tr("eQSL has sent the following message:\n%1").arg(parsedAnswer.at(1)), QMessageBox::Ok); qsos.clear(); return; } //qDebug()<< sdata; //qDebug()<< Q_FUNC_INFO << " - NO ERROR"; if (uploadingFile) { uploadingFile = false; emit signalFileUploaded(QNetworkReply::NoError, qsos); qsos.clear(); return; } } else if (result == QNetworkReply::HostNotFoundError) { //qDebug()<< Q_FUNC_INFO << " - Result = Host Not found! = " << QString::number(result) ; text = "eQSL: " + tr("Host not found!"); //TODO: Mark the previous QSO as not sent to clublog } else if (result == QNetworkReply::TimeoutError) { //qDebug()<< Q_FUNC_INFO << " - Result = Time out error! = " << QString::number(result) ; text = "eQSL: " + tr("Timeout error!"); //TODO: Mark the previous QSO as not sent to clublog } else { //qDebug()<< Q_FUNC_INFO << " - Result = UNDEFINED = " << QString::number(result) ; text = "eQSL: " + tr("Undefined error number (#%1)... ").arg(result); QMessageBox::warning(nullptr, tr("KLog - eQSL"), tr("We have received an undefined error from eQSL (%1)").arg(result) + "\n" + tr("Please check your config in the setup and contact the KLog development team if you can't fix it. eQSL uploads will be disabled."), QMessageBox::Ok); //TODO: Mark the previous QSO as not sent to clublog } //qDebug()<< Q_FUNC_INFO << " END - Result = " << QString::number(result); //emit done(); emit signalFileUploaded(result, qsos); emit showMessage(text); } void eQSLUtilities::downloadProgress(qint64 received, qint64 total) { //qDebug()<< "eQSLUtilities::downloadProgress: " << QString::number(received) << "/" << QString::number(total); //qDebug()<< received << total; emit actionShowProgres(received, total); } void eQSLUtilities::slotErrorManagement(QNetworkReply::NetworkError networkError) { //qDebug()<< "eQSLUtilities::slotErrorManagement: " << QString::number(networkError); result = networkError; /* if (result == QNetworkReply::NoError) { } else if (result == QNetworkReply::HostNotFoundError) { //qDebug()<< "eQSLUtilities::slotErrorManagement: Host not found"; } else { //qDebug()<< "eQSLUtilities::slotErrorManagement: ERROR!"; } */ } void eQSLUtilities::setCredentials(const QString &_user, const QString &_pass, const QString &_defaultStationCallsign) { //qDebug()<< "eQSLUtilities::setCredentials: user: " << _user << " / Pass: " << _pass << " / StationCallsign: " << _defaultStationCallsign; stationCallsign = _defaultStationCallsign; user = _user; pass = _pass; } QStringList eQSLUtilities::prepareToTranslate(const QString &_m) { //qDebug()<< "eQSLUtilities:: = prepareToTranslate" << _m; QString msg = _m; QStringList result; result.clear(); if (_m.contains("Error: No match on eQSL_User/eQSL_Pswd")) { result << QString("Error"); result << QString(tr("eQSL Error: User or password incorrect")); pass = QString(); } else if ( (_m.contains("Warning:")) && (_m.contains("Bad record: Duplicate") ) ) { result << QString("Warning"); result << QString(tr("eQSL Warning: At least one of the uplodaded QSOs is duplicated.")); } else if ((_m.contains("Result:")) && (_m.contains("records added
")) && (!_m.contains("Warning:")) ) { result << QString("OK"); result << QString(tr("eQSL: All the QSOs were properly uploaded.")); } else { result << "Unknown" << "Unknown"; } //qDebug()<< "eQSLUtilities:: = prepareToTranslate returning... " ; return result; } void eQSLUtilities::sendLogFile(const QString &_file, QList _qso) { //qDebug()<< Q_FUNC_INFO << " " << _file; qsos.clear(); qsos.append(_qso); QUrl serviceUrl; serviceUrl = QUrl("https://www.eQSL.cc/qslcard/ImportADIF.cfm"); QByteArray postData; QUrlQuery params; // FIRST PARAMS is the file QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); QByteArray blob; QFile *file = new QFile(_file); if (file->open(QIODevice::ReadOnly)) /* Flawfinder: ignore */ { blob = file->readAll(); //qDebug()<< Q_FUNC_INFO << " FILE OPEN: " << blob; } else { //qDebug()<< Q_FUNC_INFO << " ERROR File not opened"; return; } file->close(); // The rest of the form goes as usual //qDebug()<< Q_FUNC_INFO << " e: " << user; //qDebug()<< Q_FUNC_INFO << " pass: " << pass; //qDebug()<< Q_FUNC_INFO << " stationcall: " << stationCallsign; QHttpPart userPart; userPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"eqsl_user\"")); userPart.setBody(user.toUtf8()); if (pass.length()<1) { bool ok; pass = QInputDialog::getText(nullptr, tr("KLog - eQSL.cc password needed"), tr("Please enter your eQSL.cc password: "), QLineEdit::Password, "", &ok); if (!ok) { return; } } QHttpPart passPart; passPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"eqsl_pswd\"")); passPart.setBody(pass.toUtf8()); QHttpPart filePart; QString aux = QString("form-data; name=\"Filename\"; filename=\"%1\"").arg(_file); filePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/octet-stream")); filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(aux)); filePart.setBody(blob); multiPart->append(userPart); multiPart->append(passPart); multiPart->append(filePart); uploadingFile = true; QNetworkRequest request(serviceUrl); //qDebug()<< Q_FUNC_INFO << " Before sending"; manager->post(request, multiPart); //qDebug()<< Q_FUNC_INFO << " After sending"; //multiPart->setParent(reply); //qDebug()<< "eQSLUtilities::sendLogFile - END"; } klog-2.3.3/logmodel.h0000644000015700001710000000546014542412415014315 0ustar jenkinsjenkins#ifndef KLOG_LOGMODEL_H #define KLOG_LOGMODEL_H /*************************************************************************** logmodel.h - description ------------------- begin : june 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "dataproxy_sqlite.h" #include "utilities.h" class LogModel : public QSqlRelationalTableModel { Q_OBJECT public: LogModel(DataProxy_SQLite *dp, QObject *parent); void createlogModel(const int _i); void setColumns(const QStringList &_columns); private: //void showColumn(const QString &_columnName); //QSqlRelationalTableModel *logModel; DataProxy_SQLite *dataProxy; Utilities *util; QStringList columns; signals: void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution }; #endif // LOGMODEL_H /* class MyModel : public QAbstractTableModel { Q_OBJECT public: MyModel(QObject *parent); int rowCount(const QModelIndex &parent = QModelIndex()) const ; int columnCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; }; */ klog-2.3.3/qso.cpp0000644000015700001710000022214414542412415013650 0ustar jenkinsjenkins/*************************************************************************** qso.cpp - description ------------------- begin : may 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "qso.h" QSO::QSO() { logLevel = None; qsoId = -1; util = new Utilities(Q_FUNC_INFO); util->setCallValidation(false); } QSO::~QSO() { delete(util); } void QSO::setLogLevel (const DebugLogLevel _b) { logEvent (Q_FUNC_INFO, "Start", Debug); logLevel = _b; logEvent (Q_FUNC_INFO, "END", Debug); } void QSO::logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level) { if (logLevel<=_level) emit debugLog (_func, _msg, _level); } bool QSO::isComplete() { return (haveBand && haveMode && haveDateTime && haveCall); } void QSO::clear() { logEvent (Q_FUNC_INFO, "Start", Debug); haveBand = false; haveMode = false; haveDateTime = false; haveCall = false; qsoId = -1; logId = -1; backup = false; stationCallsign = QString(); lotwUpdating = false; realTime = false; manualMode = false; keepComment = false; keepMyData = false; keepOther = false; keepSat = false; modifying = false; // VARIABLES for ADIF ////////// address = QString(); age = 0.0; a_index = -1; ant_az = 0; ant_el = 0; ant_path = QString(); arrl_sect = QString(); award_submitted = QString(); award_granted = QString(); band = QString(); band_rx = QString(); callsign = QString(); check = QString(); clase = QString(); clublogQSOUpdateDate = QDate(); clublogDate = QDate(); clublog_status = QString(); county = QString(); comment = QString(); continent = QString(); contacted_op = QString(); contest_id = QString(); country = QString(); cqz = -1; credit_granted = QString(); credit_submitted = QString(); darc_dok = QString(); distance = 0.0; dxcc = -1; email = QString(); ownerCall = QString(); contacted_owner = QString(); eQSLRDate = QDate(); eQSLSDate = QDate(); eqsl_qsl_rcvd = QString(); eqsl_qsl_sent = QString(); fists = -1; fists_cc = -1; forceInit = false; freq = -1.0; freq_rx = -1.0; freq_tx = -1.0; gridsquare = QString(); operatorCall = QString(); hrdlogUploadDate = QDate(); hrdlog_status = QString(); iota = QString(); iota_ID = -1; itu_zone = -1; k_index = -1; latitude = QString(); longitude = QString(); QSLLoTWRDate = QDate(); QSLLoTWSDate = QDate(); lotw_qsl_rcvd = QString(); lotw_qsl_sent = QString(); max_bursts = -1; mode = QString(); ms_shower = QString(); my_antenna = QString(); my_arrl_sect = QString(); my_city = QString(); my_county = QString(); my_country = QString(); my_cqz = -1; my_dxcc = -1; my_fists = -1; my_gridsquare = QString(); my_iota = QString(); my_iota_ID = -1; my_itu_zone = -1; my_latitude = QString(); my_longitude = QString(); my_name = QString(); my_postal_code = QString(); my_rig = QString(); my_sig = QString(); my_sig_info = QString(); my_sota_ref = QString(); my_state = QString(); my_street = QString(); my_usaca_counties = QString(); my_vucc_grids= QString(); my_wwff_ref = QString(); name = QString(); notes = QString(); nr_bursts = 0; nr_pings = 0; operatorCall = QString(); ownerCall = QString(); contacted_owner = QString(); prefix = QString(); precedence = QString(); propMode = QString(); public_key = QString(); QRZComDate = QDate(); QRZCom_status = QString(); qslmsg = QString(); QSLRDate = QDate(); QSLSDate = QDate(); qsl_rcvd = QString(); qsl_sent = QString(); qslSenVia = QString(); qslRecVia = QString(); qslVia = QString(); qso_complete = QString(); qso_dateTime = QDateTime(); qso_date_off = QDate(); qso_random = false; qth = QString(); region = QString(); rig = QString(); RST_rx = QString(); RST_tx = QString(); pwr_rx = 0.0; satMode = QString(); satName = QString(); sfi = -1; sig = QString(); sig_info = QString(); silent_key = false; skcc = QString(); sota_ref = QString(); srx = -1; srx_string = QString(); state = QString(); stx = -1; stx_string = QString(); submode = QString(); swl = false; ten_ten = -1; qso_time_off = QTime(); pwr_tx = 0.0; uksmg = -1; usaca_counties = QString(); ve_prov = QString(); vucc_grids = QString(); web = QString(); wwff_ref = QString(); logEvent (Q_FUNC_INFO, "END", Debug); } void QSO::setBackup(const bool _rt) { backup = _rt; } bool QSO::getBackup() { return backup; } void QSO::setModifying(const bool _mod) { modifying = _mod; } bool QSO::getModifying() { return modifying; } bool QSO::setQSOid(const int _i) { if (_i >0) { qsoId = _i; return true; } else { return false; } } int QSO::getQSOid() { return qsoId; } bool QSO::setLogId(const int _i) { if (_i >0) { logId = _i; return true; } else { return false; } } int QSO::getLogId() { return logId; } double QSO::setFreqTX(const double _f) { if (_f>0) { freq_tx = _f; emit getBandSignal (freq_tx); return true; } else { return false; } } bool QSO::setFreqRX(const double _f) { if (_f>0) { freq_rx = _f; return true; } else { return false; } } double QSO::getFreqTX() { return freq_tx; } double QSO::getFreqRX() { return freq_rx; } bool QSO::isValid() {// Add more controls: Call, Date, Time, Band, Mode? logEvent (Q_FUNC_INFO, "Start", Debug); if ( (callsign.length()>0)) { logEvent (Q_FUNC_INFO, "END-true", Debug); return true; } else { logEvent (Q_FUNC_INFO, "END-false", Debug); return false; } } bool QSO::setCall(const QString &_c) { logEvent (Q_FUNC_INFO, QString("Start: %1").arg(_c), Debug); QString aux; aux = _c; if (aux.isNull()) { logEvent(Q_FUNC_INFO, "END - False-1", Debug); return false; } if (util->isValidCall(aux)) { logEvent (Q_FUNC_INFO, QString("END - true"), Debug); callsign = aux; haveCall = true; return true; } else { logEvent (Q_FUNC_INFO, QString("END - false-2"), Debug); return false; } } QString QSO::getCall() { return callsign; } bool QSO::setBand(const QString &_c) { //qDebug() << Q_FUNC_INFO << ": " << _c; if (_c.length()>0) { band = _c; haveBand = true; return true; } else { band = QString(); return false; } } QString QSO::getBand() { return band; } bool QSO::setBandRX(const QString &_c) { //qDebug() << Q_FUNC_INFO << ": " << _c; if (_c.length()>0) { band_rx = _c; return true; } else { band_rx = QString(); return false; } } QString QSO::getBandRX() { return band_rx; } bool QSO::setMode(const QString &_c) { logEvent (Q_FUNC_INFO, "Start", Debug); QString aux = _c; if (aux.isNull()) { mode = QString(); logEvent (Q_FUNC_INFO, "END - False 1", Debug); return false; } if (aux.length()>0) { mode = aux; logEvent (Q_FUNC_INFO, "END - True", Debug); haveMode = true; return true; } else { mode = QString(); logEvent (Q_FUNC_INFO, "END - False 2", Debug); return false; } } QString QSO::getMode() { return mode; } bool QSO::setDate(const QDate &_c) { if (_c.isValid()) { qso_dateTime.setDate(_c); if(qso_dateTime.time().isValid ()) haveDateTime = true; return true; } else { return false; } } QDate QSO::getDate() { return qso_dateTime.date(); } bool QSO::setDateOff(const QDate &_c) { if (_c.isValid()) { qso_date_off = _c; return true; } else { qso_date_off = QDate(); return false; } } QDate QSO::getDateOff() { return qso_date_off; } bool QSO::setTimeOff(const QTime &_c) { if (_c.isValid()) { qso_time_off = _c; return true; } else { qso_time_off = QTime(); return false; } } QTime QSO::getTimeOff() { return qso_time_off; } bool QSO::setTimeOn(const QTime &_c) { //qDebug() << Q_FUNC_INFO << ": " << _c.toString("mmhhss"); if (_c.isValid()) { //qDebug() << Q_FUNC_INFO << ": VALID"; qso_dateTime.setTime(_c); if (qso_dateTime.date().isValid ()) haveDateTime = true; return true; } else { return false; } } QTime QSO::getTimeOn() { return qso_dateTime.time(); } bool QSO::setDateTimeOn(const QDateTime &_c) { if (_c.isValid()) { qso_dateTime = _c; haveDateTime = true; return true; } else { return false; } } QDateTime QSO::getDateTimeOn() { return qso_dateTime; } void QSO::setRealTime(const bool _rt) { realTime = _rt; } bool QSO::getRealTime() { return realTime; } void QSO::setManualMode(const bool _rt) { manualMode = _rt; } bool QSO::getManualMode() { return manualMode; } // eQSL Tab bool QSO::setClubLogStatus(const QString &_c) { if (util->isValidUpload_Status (_c)) { clublog_status = _c; return true; } else { return false; } } QString QSO::getClubLogStatus() { return clublog_status; } bool QSO::setClubLogDate(const QDate &_c) { if (_c.isValid()) { clublogDate = _c; return true; } else { clublogDate = QDate(); return false; } } QDate QSO::getClubLogDate() { return clublogDate; } bool QSO::setQRZCOMStatus(const QString &_c) { { if (util->isValidUpload_Status (_c)) { QRZCom_status = _c; return true; } else { return false; } } } QString QSO::getQRZCOMStatus() { return QRZCom_status; } bool QSO::setQRZCOMDate(const QDate &_c) { if (_c.isValid()) { clublogDate = _c; return true; } else { clublogDate = QDate(); return false; } } QDate QSO::getQRZCOMDate() { return QRZComDate; } bool QSO::setEQSLQSL_RCVD(const QString &_c) { if (util->isValidQSL_Rcvd(_c)) { eqsl_qsl_rcvd = _c; return true; } else { return false; } } QString QSO::getEQSLQSL_RCVD() { return eqsl_qsl_rcvd; } bool QSO::setEQSLQSL_SENT(const QString &_c) { if (util->isValidQSL_Sent(_c)) { eqsl_qsl_sent = _c; return true; } else { return false; } } QString QSO::getEQSLQSL_SENT() { return eqsl_qsl_sent; } bool QSO::setEQSLQSLRDate(const QDate &_c) { if (_c.isValid()) { eQSLRDate = _c; return true; } else { eQSLRDate = QDate(); return false; } } QDate QSO::getEQSLQSLRDate() { return eQSLRDate; } bool QSO::setEQSLQSLSDate(const QDate &_c) { if (_c.isValid()) { eQSLSDate = _c; return true; } else { eQSLSDate = QDate(); return false; } } QDate QSO::getEQSLQSLSDate() { return eQSLSDate; } bool QSO::setLoTWQSL_SENT(const QString &_c) { if (util->isValidQSL_Sent(_c)) { lotw_qsl_sent = _c; return true; } else { return false; } } QString QSO::getLoTWQSL_SENT() { return lotw_qsl_sent; } bool QSO::setLoTWQSLSDate(const QDate &_c) { //qDebug() << Q_FUNC_INFO; if (_c.isValid()) { //qDebug() << Q_FUNC_INFO << " - valid"; QSLLoTWSDate = _c; return true; } else { //qDebug() << Q_FUNC_INFO << " - NOT valid"; QSLLoTWSDate = QDate(); return false; } } QDate QSO::getLoTWQSLSDate() { return QSLLoTWSDate; } bool QSO::setLoTWQSL_RCVD(const QString &_c) { //qDebug() << Q_FUNC_INFO << ": " << _c ; if (util->isValidQSL_Rcvd(_c)) { //qDebug() << Q_FUNC_INFO << ": VALID "; lotw_qsl_rcvd = _c; return true; } else { //qDebug() << Q_FUNC_INFO << ": NOT valid "; return false; } } QString QSO::getLoTWQSL_RCVD() { return lotw_qsl_rcvd; } bool QSO::setLoTWQSLRDate(const QDate &_c) { //qDebug() << Q_FUNC_INFO << ": << _c.toString("yyyy-MM-dd"); if (_c.isValid()) { //qDebug() << Q_FUNC_INFO << ": TRUE"; QSLLoTWRDate = _c; return true; } else { //qDebug() << Q_FUNC_INFO << ": FALSE"; QSLLoTWRDate = QDate(); return false; } } QDate QSO::getLoTWQSLRDate() { return QSLLoTWRDate; } // QSL TAB bool QSO::setQSL_SENT(const QString &_c) { if (util->isValidQSL_Sent (_c)) { qsl_sent = _c; return true; } else { return false; } } QString QSO::getQSL_SENT() { return qsl_sent; } bool QSO::setQSLSDate(const QDate &_c) { if (_c.isValid()) { QSLSDate = _c; return true; } else { QSLSDate = QDate(); return false; } } QDate QSO::getQSLSDate() { return QSLSDate; } bool QSO::setQSL_RCVD(const QString &_c) { if (util->isValidQSL_Rcvd(_c)) { qsl_rcvd = _c; return true; } else { return false; } } QString QSO::getQSL_RCVD() { return qsl_rcvd; } bool QSO::setQSLSenVia(const QString &_qs) { if (!_qs.isEmpty ()) { qslSenVia = _qs; return true; } else { return false; } } QString QSO::getQSLSentVia() { return qslSenVia; } bool QSO::setQSLRecVia(const QString &_qs) { if (!_qs.isEmpty ()) { qslRecVia = _qs; return true; } else { return false; } } QString QSO::getQSLRecVia() { return qslRecVia; } bool QSO::setQSLVia(const QString &_qs) { if (!_qs.isEmpty ()) { qslVia = _qs; return true; } else { return false; } } QString QSO::getQSLVia() { return qslVia; } bool QSO::setQSLRDate(const QDate &_c) { if (_c.isValid()) { QSLRDate = _c; return true; } else { QSLRDate = QDate(); return false; } } QDate QSO::getQSLRDate() { return QSLRDate; } bool QSO::setQSLMsg(const QString &_qs) { if (!_qs.isEmpty ()) { qslmsg = _qs; return true; } else { return false; } } QString QSO::getQSLMsg() { return qslmsg; } void QSO::setLoTWUpdating(bool _lotw) { lotwUpdating = _lotw; } void QSO::setDefaultEQSLSentServices(const bool _send) { if (_send) { if ((getLoTWQSL_SENT()).isEmpty()) { setLoTWQSL_SENT ("Q"); } if ((getClubLogStatus ()).isEmpty()) { setClubLogStatus ("M"); } //if (((getEQSLQSL_SENT ()).isEmpty()) || (getEQSLQSL_SENT ().isNull ())) if ((getEQSLQSL_SENT ()).isEmpty()) { setEQSLQSL_SENT ("Q"); } if ((getQRZCOMStatus ()).isEmpty()) { setQRZCOMStatus ("M"); } } } bool QSO::setGridSquare(const QString &_c) { //qDebug() << Q_FUNC_INFO << ": " << _c; if (util->isValidGrid(_c)) { gridsquare = _c; return true; } else { return false; } } QString QSO::getGridSquare() { //qDebug() << Q_FUNC_INFO << ": " << gridsquare; return gridsquare; } bool QSO::setQTH(const QString &_c) { if (!_c.isEmpty ()) { qth = _c; return true; } else { return false; } } QString QSO::getQTH() { return qth; } bool QSO::setName(const QString &_c) { if (!_c.isEmpty ()) { name = _c; return true; } else { return false; } } QString QSO::getName() { return name; } bool QSO::setRSTRX(const QString &_c) { if (!_c.isEmpty ()) { RST_rx = _c; return true; } else { return false; } } QString QSO::getRSTRX() { return RST_rx; } bool QSO::setRSTTX(const QString &_c) { if (!_c.isEmpty ()) { RST_tx = _c; return true; } else { return false; } } QString QSO::getRSTTX() { return RST_tx; } bool QSO::setRXPwr(const double _f) { if (_f>0) { pwr_rx = _f; return true; } else { return false; } } double QSO::getRXPwr() { return pwr_rx; } // Comment Tab bool QSO::setComment(const QString &_c) { if (!_c.isNull ()) { comment = _c; return true; } else { return false; } } QString QSO::getComment() { return comment; } bool QSO::setKeepComment(bool _k) { keepComment = _k; return true; } bool QSO::getKeepComment() { return keepComment; } // Other Tab bool QSO::setDXCC(const int _i) { if (!util->isValidDXCC(_i)) return false; dxcc = _i; return true; } int QSO::getDXCC() { return dxcc; } bool QSO::setPropMode(const QString &_c) { //qDebug() << Q_FUNC_INFO << _c; if (!util->isValidPropMode (_c)) { propMode = QString(); return false; } propMode = _c; return true; } QString QSO::getPropMode() { return propMode; } bool QSO::setSOTA_REF(const QString &_c) { if (_c.length ()>1) { sota_ref = _c; return true; } return false; } QString QSO::getSOTA_REF() { return sota_ref; } bool QSO::setMySOTA_REF(const QString &_c) { if (_c.length ()<=1) return false; my_sota_ref = _c; return true; } QString QSO::getMySOTA_REF() { return my_sota_ref; } bool QSO::setMyRig(const QString &_c) { if (_c.length ()isValidVUCCGrids (_c)) return false; vucc_grids = _c; return true; } QString QSO::getVUCCGrids() { return vucc_grids; } bool QSO::setMyVUCCGrids(const QString &_c) { if (!util->isValidVUCCGrids (_c)) return false; my_vucc_grids = _c; return true; } QString QSO::getMyVUCCGrids() { return my_vucc_grids; } QString QSO::getMyRig() { return my_rig; } bool QSO::setMyAntenna(const QString &_c) { if (_c.length ()>1) { my_antenna = _c; return true; } return false; } QString QSO::getMyAntenna() { return my_antenna; } bool QSO::setMyArrlSect(const QString &_c) { if (!util->isValidARRLSect (_c)) { return false; } else { my_arrl_sect = _c; return true; } } QString QSO::getMyArrlSect() { return my_arrl_sect; } bool QSO::setAge(const double _c) { if ((0 <= _c) && (_c <= 120)) { age = _c; return true; } return false; } double QSO::getAge() { return age; } bool QSO::setIOTA(const QString &_c) { if (_c.length()>0) { iota = _c; return true; } else { iota = QString(); return false; } } QString QSO::getIOTA() { return iota; } bool QSO::setKeepOthers(bool _k) { keepOther = _k; return true; } bool QSO::getKeepOthers() { return keepOther; } // My Data bool QSO::setTXPwr(double _f) { logEvent (Q_FUNC_INFO, "Start", Debug); if (_f>0) { pwr_tx = _f; logEvent (Q_FUNC_INFO, "END - True", Debug); return true; } else { logEvent (Q_FUNC_INFO, "END - False", Debug); return false; } } double QSO::getTXPwr() { return pwr_tx; } bool QSO::setOperatorCallsign(const QString &_c) { //qDebug() << Q_FUNC_INFO << "Start: " << _c; //logEvent(Q_FUNC_INFO, "Start", Debug); QString aux = _c; if (aux.length()<3) return false; if (util->isValidCall(aux)) { operatorCall = aux; //qDebug() << Q_FUNC_INFO << "END - true"; logEvent(Q_FUNC_INFO, "END-true", Debug); return true; } else { //qDebug() << Q_FUNC_INFO << "End - false"; logEvent(Q_FUNC_INFO, "END-false", Debug); return false; } } QString QSO::getOperatorCallsign() { return operatorCall; } bool QSO::setStationCallsign(const QString &_c) { //qDebug() << Q_FUNC_INFO << "Start: " << _c; QString aux = _c; if ((aux.length()<3) || (aux.isNull())) { //qDebug() << Q_FUNC_INFO << " - 009"; return false; } //qDebug() << Q_FUNC_INFO << " - 010"; if (util->isValidCall(aux)) { //qDebug() << Q_FUNC_INFO << " - True"; stationCallsign = aux; return true; } else { //qDebug() << Q_FUNC_INFO << " - False"; return false; } } QString QSO::getStationCallsign() { return stationCallsign; } bool QSO::setMyGridSquare(const QString &_c) { if (util->isValidGrid(_c)) { my_gridsquare = _c; return true; } else { return false; } } QString QSO::getMyGridSquare() { return my_gridsquare; } bool QSO::setKeepMyData(bool _k) { keepMyData = _k; return true; } bool QSO::getKeepMyData() { return keepMyData; } // Satellite Tab bool QSO::setKeepSatTab(bool _k){keepSat = _k; return true;} bool QSO::getKeepSatTab(){return keepSat;} bool QSO::setSatName(const QString &_c) { if (_c.length()>0) { satName = _c; return true; } else { satName = QString(); return false; } } QString QSO::getSatName() { return satName; } bool QSO::setSatMode(const QString &_c) { //qDebug() << Q_FUNC_INFO << ": " << _c; if (_c.length()>0) { satMode = _c; return true; } else { satMode = QString(); return false; } } QString QSO::getSatMode() { return satMode; } bool QSO::setAddress(const QString &_c) { address = _c; return true; } QString QSO::getAddress() { return address; } bool QSO::setA_Index(const int _i) { if ((_i>=0) && (_i<=400)) { a_index = _i; return true; } return false; } int QSO::getA_Index() { return a_index; } bool QSO::setAnt_az(const double _c) { //TODO: Adjust number: http://www.adif.org/312/ADIF_312.htm#QSO_Field_ANT_AZ if ((0 <= _c) && (_c <= 360)) { ant_az = _c; return true; } return false; } double QSO::getAnt_az() { return ant_az; } bool QSO::setAnt_el(const double _c) { //TODO: Adjust number: http://www.adif.org/312/ADIF_312.htm#QSO_Field_ANT_EL if ((-90 <= _c) && (_c <= 90)) { ant_el = _c; return true; } return false; } double QSO::getAnt_el() { return ant_el; } bool QSO::setAnt_Path(const QString &_c) { if (!util->isValidAntPath (_c)) return false; ant_path = _c; return true; } QString QSO::getAnt_Path() { return ant_path; } bool QSO::setARRL_Sect(const QString &_c) { if (!util->isValidARRLSect (_c)) return false; arrl_sect = _c; return true; } QString QSO::getARRL_Sect() { return arrl_sect; } bool QSO::setCheck(const QString &_c) { check = _c; return true; } QString QSO::getCheck() { return check; } bool QSO::setClass(const QString &_c) { clase = _c; return true; } QString QSO::getClass() { return clase; } bool QSO::setClublogQSOUpdateDate(const QDate &_c) { if (_c.isValid()) { clublogQSOUpdateDate = _c; return true; } else { clublogQSOUpdateDate = QDate(); return false; } } QDate QSO::getClublogQSOUpdateDate() { return clublogQSOUpdateDate; } bool QSO::setContinent(const QString &_c) { if (!util->isValidContinent (_c)) return false; continent = _c; return true; } QString QSO::getContinent() { return continent; } bool QSO::setDistance(const double _i) { if (util->isValidDistance(_i)) { distance = _i; return true; } return false; } double QSO::getDistance() { return distance; } bool QSO::setOwnerCallsign(const QString &_c) { if (util->isValidCall(_c)) { ownerCall = _c; return true; } else { return false; } } QString QSO::getOwnerCallsign() { return ownerCall; } bool QSO::setEQ_Call(const QString &_c) { if (util->isValidCall(_c)) {contacted_owner = _c; return true; } else { return false; } } QString QSO::getEQ_Call() { return contacted_owner; } // Contacted station owner bool QSO::setHRDUpdateDate(const QDate &_c) { if (_c.isValid()) { hrdlogUploadDate = _c; return true; } else { hrdlogUploadDate = QDate(); return false; } } QDate QSO::getHRDUpdateDate() { return hrdlogUploadDate; } bool QSO::setHRDLogStatus(const QString &_c) { if (util->isValidUpload_Status (_c)) { hrdlog_status = _c; return true; } else { return false; } } QString QSO::getHRDLogStatus() { return hrdlog_status; } bool QSO::setK_Index(const int _i) { if ((_i>=0) && (_i<=400)) { k_index = _i; return true; } return false; } int QSO::getK_Index() { return k_index; } bool QSO::setRig(const QString &_c) { rig = _c; return true; } QString QSO::getRig() { return rig; } bool QSO::setCountry(const QString &_c) { country = _c; return true; } QString QSO::getCountry() { return country; } bool QSO::setAwardGranted(const QString &_c) { award_granted = _c; return true; } QString QSO::getAwardGranted() { return award_granted; } bool QSO::setAwardSubmitted(const QString &_c) { award_submitted = _c; return true; } QString QSO::getAwardSubmitted() { return award_submitted; } bool QSO::setCounty(const QString &_c) { county = _c; return true; } QString QSO::getCounty() { return county; } bool QSO::setContactedOperator(const QString &_c) { if (util->isValidCall(_c)) { contacted_op = _c; return true; } else { return false; } } QString QSO::getContactedOperator() { return contacted_op; } bool QSO::setContestID(const QString &_c) { contest_id = _c; return true; } QString QSO::getContestID() { return contest_id; } bool QSO::setCQZone(const int _i) { if ((_i>=0) && (_i<=40)) { cqz = _i; return true; } else { return false; } } int QSO::getCQZone() { return cqz; } bool QSO::setCreditGranted(const QString &_c) { credit_granted = _c; return true; } QString QSO::getCreditGranted() { return credit_granted; } bool QSO::setCreditSubmitted(const QString &_c) { credit_submitted = _c; return true; } QString QSO::getCreditSubmitted() { return credit_submitted; } bool QSO::setDarcDok(const QString &_c) { darc_dok = _c; return true; } QString QSO::getDarcDok() { return darc_dok; } bool QSO::setEmail(const QString &_c) { email = _c; return true; } QString QSO::getEmail() { return email; } bool QSO::setFists(const int _i) { if (_i>=0) { fists = _i; return true; } else { return false; } } int QSO::getFists() { return fists; } bool QSO::setFistsCC(const int _i) { if (_i>=0) { fists_cc = _i; return true; } else { return false; } } int QSO::getFistsCC() { return fists_cc; } bool QSO::setForceInit(bool _k) { forceInit = _k; return true; } bool QSO::getForceInit() { return forceInit; } bool QSO::setIotaID(const int _i) { if (_i>=0) { iota_ID = _i; return true; } else { return false; } } int QSO::getIotaID() { return iota_ID; } bool QSO::setItuZone(const int _i) { if (_i>=0 && (_i<=90)) { itu_zone = _i; return true; } else { return false; } } int QSO::getItuZone() { return itu_zone; } bool QSO::setLatitude(const QString &_c) { latitude = _c; return true; } QString QSO::getLatitude() { return latitude; } bool QSO::setLongitude(const QString &_c) { longitude = _c; return true; } QString QSO::getLongitude() { return longitude; } bool QSO::setNrBursts(const int _i) { if (_i>=0) { nr_bursts = _i; return true; } else { return false; } } int QSO::getNrBursts() { return nr_bursts; } bool QSO::setMaxBursts(const int _i) { if (_i>=0) { max_bursts = _i; return true; } else { return false; } } int QSO::getMaxBursts() { return max_bursts; } bool QSO::setNrPings(const int _i) { if (_i>=0) { nr_pings = _i; return true; } else { return false; } } int QSO::getNrPings() { return nr_pings; } bool QSO::setMsShower(const QString &_c) { ms_shower = _c; return true; } QString QSO::getMsShower() { return ms_shower; } bool QSO::setQSOComplete(const QString &_c) { qso_complete = _c; return true; } QString QSO::getQSOComplete() { return qso_complete; } bool QSO::setQSORandom(bool _k) { qso_random = _k; return true; } bool QSO::getQSORandom() { return qso_random; } bool QSO::setMyCity(const QString &_c) { my_city = _c; return true; } QString QSO::getMyCity() { return my_city; } bool QSO::setMyCounty(const QString &_c) { my_county = _c; return true; } QString QSO::getMyCounty() { return my_county; } bool QSO::setMyCountry(const QString &_c) { my_country = _c; return true; } QString QSO::getMyCountry() { return my_country; } bool QSO::setMyCQZone(const int _i) { if ((_i>=0) && (_i<=40)) { my_cqz = _i; return true; } else { return false; } } int QSO::getMyCQZone() { return my_cqz; } bool QSO::setMyDXCC(const int _i) { if (util->isValidDXCC(_i)) { my_dxcc = _i; return true; } return false; } int QSO::getMyDXCC() { return my_dxcc; } bool QSO::setMyFists(const int _i) { if (_i>0) { my_fists = _i; return true; } return false; } int QSO::getMyFists() { return my_fists; } bool QSO::setMyIOTA(const QString &_c) { if (_c.length()>0) { my_iota = _c; return true; } else { my_iota = QString(); return false; } } QString QSO::getMyIOTA() { return my_iota; } bool QSO::setMyIotaID(const int _i) { if (_i>=0) { my_iota_ID = _i; return true; } else { return false; } } int QSO::getMyIotaID() { return my_iota_ID; } bool QSO::setMyITUZone(const int _i) { if (_i>=0 && (_i<=90)) { my_itu_zone = _i; return true; } else { return false; } } int QSO::getMyITUZone() { return my_itu_zone; } bool QSO::setMyLatitude(const QString &_c) { my_latitude = _c; return true; } QString QSO::getMyLatitude() { return my_latitude; } bool QSO::setMyLongitude(const QString &_c) { my_longitude = _c; return true; } QString QSO::getMyLongitude() { return my_longitude; } bool QSO::setMyName(const QString &_c) { my_name = _c; return true; } QString QSO::getMyName() { return my_name; } bool QSO::setMyPostalCode(const QString &_c) { my_postal_code = _c; return true; } QString QSO::getMyPostalCode() { return my_postal_code; } bool QSO::setMySig(const QString &_c) { my_sig = _c; return true; } QString QSO::getMySig() { return my_sig; } bool QSO::setMySigInfo(const QString &_c) { my_sig_info = _c; return true; } QString QSO::getMySigInfo() { return my_sig_info; } bool QSO::setMyState(const QString &_c) { my_state = _c; return true; } QString QSO::getMyState() { return my_state; } bool QSO::setMyStreet(const QString &_c) { my_street = _c; return true; } QString QSO::getMyStreet() { return my_street; } bool QSO::setMyUsacaCounties(const QString &_c) { my_usaca_counties = _c; return true; } QString QSO::getMyUsacaCounties() { return my_usaca_counties; } bool QSO::setNotes(const QString &_c) { notes = _c; return true; } QString QSO::getNotes() { return notes; } bool QSO::setPrefix(const QString &_c) { prefix = _c; return true; } QString QSO::getPrefix() { return prefix; } bool QSO::setPrecedence(const QString &_c) { precedence = _c; return true; } QString QSO::getPrecedence() { return precedence; } bool QSO::setPublicKey(const QString &_c) { public_key = _c; return true; } QString QSO::getPublicKey() { return public_key; } bool QSO::setRegion(const QString &_c) { region = _c; return true; } QString QSO::getRegion() { return region; } bool QSO::setTenTen(const int _i) { if (_i>=0) { ten_ten = _i; return true; } else { return false; } } int QSO::getTenTen() { return ten_ten; } bool QSO::setSFI(const int _i) { if (_i>=0 && (_i<=300)) { sfi = _i; return true; } else { return false; } } int QSO::getSFI() { return sfi; } bool QSO::setSig(const QString &_c) { sig = _c; return true; } QString QSO::getSig() { return sig; } bool QSO::setSigInfo(const QString &_c) { sig_info = _c; return true; } QString QSO::getSigInfo() { return sig_info; } bool QSO::setSilentKey(bool _k) { silent_key = _k; return true; } bool QSO::getSilentKey() { return silent_key; } bool QSO::setSkcc(const QString &_c) { skcc = _c; return true; } QString QSO::getSkcc() { return skcc; } bool QSO::setSrx(const int _i) { if (_i>=0) { srx = _i; return true; } else { return false; } } int QSO::getSrx() { return srx; } bool QSO::setSrxString(const QString &_c) { srx_string = _c; return true; } QString QSO::getSrxString() { return srx_string; } bool QSO::setStx(const int _i) { if (_i>=0) { stx = _i; return true; } else { return false; } } int QSO::getStx() { return stx; } bool QSO::setStxString(const QString &_c) { stx_string = _c; return true; } QString QSO::getStxString() { return stx_string; } bool QSO::setState(const QString &_c) { state = _c; return true; } QString QSO::getState() { return state; } bool QSO::setSubmode(const QString &_c) { submode = _c; //if (requestMode){ // emit getModeSignal(submode); //} return true; } QString QSO::getSubmode() { return submode; } bool QSO::setSwl(bool _k) { swl = _k; return true; } bool QSO::getSwl() { return swl; } bool QSO::setUksmg(const int _i) { if (_i>=0) { uksmg = _i; return true; } else { return false; } } int QSO::getUksmg() { return uksmg; } bool QSO::setUsacaCounties(const QString &_c) { usaca_counties = _c; return true; } QString QSO::getUsacaCounties() { return usaca_counties; } bool QSO::setVeProv(const QString &_c) { ve_prov = _c; return true; } QString QSO::getVeProv() { return ve_prov; } bool QSO::setWeb(const QString &_c) { web = _c; return true; } QString QSO::getWeb() { return web; } bool QSO::setWwffRef(const QString &_c) { wwff_ref = _c; return true; } QString QSO::getWwffRef() { return wwff_ref; } bool QSO::setMyWwffRef(const QString &_c) { my_wwff_ref = _c; return true; } QString QSO::getMyWwffRef() { return my_wwff_ref; } // helper functions for hash, returns original function but takes string data as imput bool QSO::setAge(const QString &data) { return setAge(data.toInt()); } bool QSO::setA_Index(const QString& data) { return setA_Index(data.toInt()); } bool QSO::setAnt_az(const QString& data) { return setAnt_az(data.toInt()); } bool QSO::setAnt_el(const QString& data) { return setAnt_el(data.toInt()); } bool QSO::setCQZone(const QString& data) { return setCQZone(data.toInt()); } bool QSO::setDistance(const QString& data) { return setDistance(data.toInt()); } bool QSO::setDXCC(const QString& data) { return setDXCC(data.toInt()); } bool QSO::setFists(const QString& data) { return setFists(data.toInt()); } bool QSO::setFistsCC(const QString& data) { return setFistsCC(data.toInt()); } bool QSO::setMyFists(const QString& data) { return setMyFists(data.toInt()); } bool QSO::setIotaID(const QString& data) { return setIotaID(data.toInt()); } bool QSO::setItuZone(const QString& data) { return setItuZone(data.toInt()); } bool QSO::setK_Index(const QString& data) { return setK_Index(data.toInt()); } bool QSO::setMaxBursts(const QString& data) { return setMaxBursts(data.toInt()); } bool QSO::setMyCQZone(const QString& data) { return setMyCQZone(data.toInt()); } bool QSO::setMyDXCC(const QString& data) { return setMyDXCC(data.toInt()); } bool QSO::setMyIotaID(const QString& data) { return setMyIotaID(data.toInt()); } bool QSO::setMyITUZone(const QString& data) { return setMyITUZone(data.toInt()); } bool QSO::setNrBursts(const QString& data) { return setNrBursts(data.toInt()); } bool QSO::setNrPings(const QString& data) { return setNrPings(data.toInt()); } bool QSO::setSFI(const QString& data) { return setSFI(data.toInt()); } bool QSO::setSrx(const QString& data) { return setSrx(data.toInt()); } bool QSO::setStx(const QString& data) { return setStx(data.toInt()); } bool QSO::setTenTen(const QString& data) { return setTenTen(data.toInt()); } bool QSO::setUksmg(const QString& data) { return setUksmg(data.toInt()); } bool QSO::setFreqTX(const QString& data) { return setFreqTX(data.toDouble()); } bool QSO::setFreqRX(const QString& data) { return setFreqRX(data.toDouble()); } bool QSO::setRXPwr(const QString& data){ return setRXPwr(data.toDouble()); } bool QSO::setTXPwr(const QString& data){ return setTXPwr(data.toDouble()); } bool QSO::setClublogQSOUpdateDate(const QString& data) { return setClublogQSOUpdateDate(util->getDateFromADIFDateString(data)); } bool QSO::setEQSLQSLRDate(const QString& data) { return setEQSLQSLRDate(util->getDateFromADIFDateString(data)); } bool QSO::setEQSLQSLSDate(const QString& data) { return setEQSLQSLSDate(util->getDateFromADIFDateString(data)); } bool QSO::setForceInit(const QString& data) { return setForceInit(util->QStringToBool(data)); } bool QSO::setHRDUpdateDate(const QString& data) { return setHRDUpdateDate(util->getDateFromADIFDateString(data)); } bool QSO::setLoTWQSLRDate(const QString& data) { return setLoTWQSLRDate(util->getDateFromADIFDateString(data)); } bool QSO::setLoTWQSLSDate(const QString& data) { return setLoTWQSLSDate(util->getDateFromADIFDateString(data)); } bool QSO::setQRZCOMDate(const QString& data) { return setQRZCOMDate(util->getDateFromADIFDateString(data)); } bool QSO::setQSLRDate(const QString& data) { return setQSLRDate(util->getDateFromADIFDateString(data)); } bool QSO::setQSLSDate(const QString& data) { return setQSLSDate(util->getDateFromADIFDateString(data)); } bool QSO::setDate(const QString& data) { return setDate(util->getDateFromADIFDateString(data)); } bool QSO::setDateOff(const QString& data) { return setDateOff(util->getDateFromADIFDateString(data)); } bool QSO::setQSORandom(const QString& data) { return setQSORandom(util->QStringToBool(data)); } bool QSO::setSilentKey(const QString& data) { return setSilentKey(util->QStringToBool(data)); } bool QSO::setSwl(const QString& data) { return setSwl(util->QStringToBool(data)); } bool QSO::setTimeOff(const QString& data) { return setTimeOff(util->getTimeFromADIFTimeString(data)); } bool QSO::setTimeOn(const QString& data) { return setTimeOn(util->getTimeFromADIFTimeString(data)); } bool QSO::setLoTWQSLRDate2(const QString& data) { setLoTWQSL_RCVD("Y"); return setLoTWQSLRDate(util->getDateFromLoTWQSLDateString(data)); } bool QSO::setLoTWQSLSDate1(const QString& data) { setLoTWQSL_SENT("Y"); return setLoTWQSLSDate(util->getDateFromLoTWQSLDateString(data)); } bool QSO::setLoTWQSLSDate2(const QString& data) { setLoTWQSL_SENT("Y"); return setLoTWQSLSDate(util->getDateFromLoTWQSLDateString(data)); } QHash QSO::SetDataHash; void QSO::InitializeHash() { SetDataHash = { {"ADDRESS", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setAddress)}, {"AGE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setAge)}, {"A_INDEX", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setA_Index)}, {"ANT_AZ", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setAnt_az)}, {"ANT_EL", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setAnt_el)}, {"ANT_PATH", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setAnt_Path)}, {"ARRL_SECT", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setARRL_Sect)}, {"AWARD_SUBMITTED", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setAwardSubmitted)}, {"AWARD_GRANTED", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setAwardGranted)}, {"BAND", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setBand)}, {"BAND_RX", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setBandRX)}, {"CALL", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setCall)}, {"CHECK", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setCheck)}, {"CLASS", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setClass)}, {"CLUBLOG_QSO_UPLOAD_DATE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setClublogQSOUpdateDate)}, {"CLUBLOG_QSO_UPLOAD_STATUS", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setClubLogStatus)}, {"CNTY", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setCounty)}, {"COMMENT", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setComment)}, {"CONT", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setContinent)}, {"CONTACTED_OP", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setContactedOperator)}, {"CONTEST_ID", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setContestID)}, {"COUNTRY", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setCountry)}, {"CQZ", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setCQZone)}, {"CREDIT_SUBMITTED", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setCreditSubmitted)}, {"CREDIT_GRANTED", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setCreditGranted)}, {"DARC_DOK", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setDarcDok)}, {"DISTANCE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setDistance)}, {"DXCC", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setDXCC)}, {"EMAIL", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setEmail)}, {"EQ_CALL", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setOwnerCallsign)}, {"EQSL_QSLRDATE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setEQSLQSLRDate)}, {"EQSL_QSLSDATE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setEQSLQSLSDate)}, {"EQSL_QSL_RCVD", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setEQSLQSL_RCVD)}, {"EQSL_QSL_SENT", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setEQSLQSL_SENT)}, {"FISTS", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setFists)}, {"FISTS_CC", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setFistsCC)}, {"FORCE_INIT", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setForceInit)}, {"FREQ", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setFreqTX)}, {"FREQ_RX", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setFreqRX)}, {"GRIDSQUARE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setGridSquare)}, {"HRDLOG_QSO_UPLOAD_DATE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setHRDUpdateDate)}, {"HRDLOG_QSO_UPLOAD_STATUS", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setHRDLogStatus)}, {"IOTA", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setIOTA)}, {"IOTA_ISLAND_ID", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setIotaID)}, {"ITUZ", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setItuZone)}, {"K_INDEX", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setK_Index)}, {"LAT", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setLatitude)}, {"LON", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setLongitude)}, {"LOTW_QSLRDATE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setLoTWQSLRDate)}, {"LOTW_QSLSDATE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setLoTWQSLSDate)}, {"LOTW_QSL_RCVD", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setLoTWQSL_RCVD)}, {"LOTW_QSL_SENT", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setEQSLQSL_SENT)}, {"MAX_BURSTS", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMaxBursts)}, {"MODE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMode)}, {"MS_SHOWER", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMsShower)}, {"MY_ANTENNA", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyAntenna)}, {"MY_ARRL_SECT", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyArrlSect)}, {"MY_CITY", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyCity)}, {"MY_CNTY", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyCounty)}, {"MY_COUNTRY", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyCountry)}, {"MY_CQ_ZONE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyCQZone)}, {"MY_DXCC", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyDXCC)}, {"MY_FISTS", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyFists)}, {"MY_GRIDSQUARE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyGridSquare)}, {"MY_IOTA", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyIOTA)}, {"MY_IOTA_ISLAND_ID", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyIotaID)}, {"MY_ITU_ZONE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyITUZone)}, {"MY_LAT", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyLatitude)}, {"MY_LON", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyLongitude)}, {"MY_NAME", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyName)}, {"MY_POSTAL_CODE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyPostalCode)}, {"MY_RIG", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyRig)}, {"MY_SIG", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMySig)}, {"MY_SIG_INFO", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMySigInfo)}, {"MY_SOTA_REF", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMySOTA_REF)}, {"MY_STATE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyState)}, {"MY_STREET", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyStreet)}, {"MY_USACA_COUNTIES", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyUsacaCounties)}, {"MY_VUCC_GRIDS", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyVUCCGrids)}, {"MY_WWFF_REF", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setMyWwffRef)}, {"NAME", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setName)}, {"NOTES", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setNotes)}, {"NR_BURSTS", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setNrBursts)}, {"NR_PINGS", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setNrPings)}, {"OPERATOR", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setOperatorCallsign)}, {"OWNER_CALLSIGN", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setOwnerCallsign)}, {"PFX", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setPrefix)}, {"PRECEDENCE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setPrecedence)}, {"PROP_MODE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setPropMode)}, {"PUBLIC_KEY", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setPublicKey)}, {"QRZCOM_QSO_UPLOAD_DATE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setQRZCOMDate)}, {"QRZCOM_QSO_UPLOAD_STATUS", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setQRZCOMStatus)}, {"QSLMSG", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setQSLMsg)}, {"QSLRDATE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setQSLRDate)}, {"QSLSDATE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setQSLSDate)}, {"QSL_RCVD", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setQSL_RCVD)}, {"QSL_RCVD_VIA", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setQSLRecVia)}, {"QSL_SENT", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setQSL_SENT)}, {"QSL_SENT_VIA", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setQSLSenVia)}, {"QSL_VIA", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setQSLVia)}, {"QSO_COMPLETE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setQSOComplete)}, {"QSO_DATE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setDate)}, {"QSO_DATE_OFF", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setDateOff)}, {"QSO_RANDOM", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setQSORandom)}, {"QTH", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setQTH)}, {"REGION", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setRegion)}, {"RIG", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setRig)}, {"RST_RCVD", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setRSTRX)}, {"RST_SENT", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setRSTTX)}, {"RX_PWR", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setRXPwr)}, {"SAT_MODE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setSatMode)}, {"SAT_NAME", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setSatName)}, {"SFI", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setSFI)}, {"SIG", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setSig)}, {"SIG_INFO", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setSigInfo)}, {"SILENT_KEY", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setSilentKey)}, {"SKCC", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setSkcc)}, {"SOTA_REF", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setSOTA_REF)}, {"SRX", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setSrx)}, {"SRX_STRING", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setSrxString)}, {"STATE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setState)}, {"STATION_CALLSIGN", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setStationCallsign)}, {"STX", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setStx)}, {"STX_STRING", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setStxString)}, {"SUBMODE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setSubmode)}, {"SWL", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setSwl)}, {"TEN_TEN", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setTenTen)}, {"TIME_OFF", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setTimeOff)}, {"TIME_ON", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setTimeOn)}, {"TX_PWR", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setTXPwr)}, {"UKSMG", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setUksmg)}, {"USACA_COUNTIES", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setUsacaCounties)}, {"VE_PROV", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setVeProv)}, {"VUCC_GRIDS", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setVUCCGrids)}, {"WEB", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setWeb)}, {"WWFF_REF", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setWwffRef)}, {"APP_LOTW_RXQSL", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setLoTWQSLRDate2)}, {"APP_LOTW_RXQSO", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setLoTWQSLSDate1)}, {"APP_LOTW_QSO_TIMESTAMP", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setLoTWQSLSDate2)} }; return; } // SET DATA ---------------------------------------------------------------------------------- bool QSO::setData(const QString &_adifPair) { logEvent (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << ": " << _adifPair; QStringList d; d.clear(); d << util->getValidADIFFieldAndData(_adifPair); if (d.length()!=2) { logEvent (Q_FUNC_INFO, "END - ADIF not valid", Debug); return false; } //qDebug() << Q_FUNC_INFO << ": " << d.at(0) << "/" << d.at(1); QString field = d.at(0).toUpper(); QString data = d.at(1); if (SetDataHash.empty()) { InitializeHash(); } if (SetDataHash.contains(field)) { (*SetDataHash.find(field))(this,data); } logEvent (Q_FUNC_INFO, "END", Debug); return true; } bool QSO::toDB(int _qsoId) { // This function will add or modify a QSO in the DB depending on the _qsoID. // if _qsoID is >0 it should be an existing QSO in the DB. //qDebug() << Q_FUNC_INFO << " - Start: qsoId: " << QString::number(_qsoId) ; if (!isComplete ()) { //qDebug() << Q_FUNC_INFO << " - QSO NOT COMPLETE"; return false; } //qDebug() << Q_FUNC_INFO << " - QSO Complete... adding"; QString queryString; if (_qsoId<=0) { //qDebug() << Q_FUNC_INFO << " - qsoID <=0"; queryString = getAddQueryString(); } else { //qDebug() << Q_FUNC_INFO << " - qsoID>0"; queryString = getModifyQueryString(); } QSqlQuery query = getPreparedQuery(queryString); if (_qsoId>0) { //qDebug() << Q_FUNC_INFO << " - binding ID"; query.bindValue (":id", _qsoId); } //qDebug() << Q_FUNC_INFO << " - executing query"; if (query.exec()) { //qDebug() << Q_FUNC_INFO << ": QSO ADDED/Modified: " << query.lastQuery (); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); return false; } } QString QSO::getAddQueryString() { // submode is not used, keep it empty. // mode field is populated with the submode return QString( "INSERT INTO log (" "qso_date, call, rst_sent, rst_rcvd, bandid, modeid, cqz, ituz, dxcc, address, age, cnty, comment, a_index, ant_az, ant_el, " "ant_path, arrl_sect, award_submitted, award_granted, band_rx, checkcontest, class, clublog_qso_upload_date, " "clublog_qso_upload_status, cont, contacted_op, contest_id, country, credit_submitted, credit_granted, darc_dok, " "distance, email, eq_call, eqsl_qslrdate, eqsl_qslsdate, eqsl_qsl_rcvd, eqsl_qsl_sent, fists, fists_cc, " "force_init, freq, freq_rx, gridsquare, hrdlog_qso_upload_date, hrdlog_qso_upload_status, " "iota, iota_island_id, k_index, lat, lon, lotw_qslrdate, lotw_qslsdate, lotw_qsl_rcvd, lotw_qsl_sent, max_bursts, ms_shower, " "my_antenna, my_city, my_cnty, my_country, my_cq_zone, my_dxcc, my_fists, my_gridsquare, my_iota, my_iota_island_id," " my_itu_zone, my_lat, " "my_lon, my_name, my_postal_code, my_rig, my_sig, my_sig_info, my_sota_ref, my_state, my_street, " "my_usaca_counties, my_vucc_grids, name, " "notes, nr_bursts, nr_pings, operator, owner_callsign, pfx, precedence, prop_mode, public_key, qrzcom_qso_upload_date, " "qrzcom_qso_upload_status, qslmsg, qslrdate, qslsdate, qsl_rcvd, qsl_sent, qsl_rcvd_via, qsl_sent_via, qsl_via, qso_complete, qso_random, " "qth, region, rig, rx_pwr, sat_mode, sat_name, sfi, sig, sig_info, silent_key, skcc, sota_ref, srx_string, srx, stx_string, stx, state, " "station_callsign, swl, uksmg, usaca_counties, ve_prov, vucc_grids, ten_ten, tx_pwr, web, qso_date_off, marked, lognumber) " "VALUES (" ":qso_date, :call, :rst_sent, :rst_rcvd, :bandid, :modeid, :cqz, :ituz, :dxcc, :address, :age, :cnty, :comment, :a_index, :ant_az, :ant_el, " ":ant_path, :arrl_sect, :award_submitted, :award_granted, :band_rx, :checkcontest, :class, :clublog_qso_upload_date, :clublog_qso_upload_status, :cont, " ":contacted_op, :contest_id, :country, :credit_submitted, :credit_granted, :darc_dok, :distance, :email, :eq_call, :eqsl_qslrdate, :eqsl_qslsdate, " ":eqsl_qsl_rcvd, :eqsl_qsl_sent, :fists, :fists_cc, :force_init, :freq, :freq_rx, :gridsquare, :hrdlog_qso_upload_date, " ":hrdlog_qso_upload_status, " ":iota, :iota_island_id, :k_index, :lat, :lon, :lotw_qslrdate, :lotw_qslsdate, :lotw_qsl_rcvd, :lotw_qsl_sent, :max_bursts, :ms_shower, " ":my_antenna, :my_city, :my_cnty, :my_country, :my_cq_zone, :my_dxcc, :my_fists, :my_gridsquare, :my_iota, :my_iota_island_id, :my_itu_zone, :my_lat, " ":my_lon, :my_name, :my_postal_code, :my_rig, :my_sig, :my_sig_info, :my_sota_ref, :my_state, :my_street, :my_usaca_counties, :my_vucc_grids, :name, " ":notes, :nr_bursts, :nr_pings, :operator, :owner_callsign, :pfx, :precedence, :prop_mode, :public_key, :qrzcom_qso_upload_date, " ":qrzcom_qso_upload_status, :qslmsg, :qslrdate, :qslsdate, :qsl_rcvd, :qsl_sent, :qsl_rcvd_via, :qsl_sent_via, :qsl_via, :qso_complete, :qso_random, " ":qth, :region, :rig, :rx_pwr, :sat_mode, :sat_name, :sfi, :sig, :sig_info, :silent_key, :skcc, :sota_ref, :srx_string, :srx, :stx_string, :stx, :state," ":station_callsign, :swl, :uksmg, :usaca_counties, :ve_prov, :vucc_grids, :ten_ten, :tx_pwr, :web, :qso_date_off, " ":marked, :lognumber)" ); } QString QSO::getModifyQueryString() { // submode is not used, keep it empty. // mode field is populated with the submode return QString("UPDATE log SET call = :call, qso_date = :qso_date, rst_sent = :rst_sent, rst_rcvd = :rst_rcvd, " "bandid = :bandid, modeid = :modeid, cqz = :cqz, ituz = :ituz, dxcc = :dxcc, address = :address, " "age = :age, cnty = :cnty, comment = :comment, a_index = :a_index, ant_az = :ant_az, ant_el = :ant_el, " "ant_path = :ant_path, arrl_sect = :arrl_sect, award_submitted = :award_submitted, " "award_granted = :award_granted, band_rx = :band_rx, checkcontest = :checkcontest, class = :class, " "clublog_qso_upload_date = :clublog_qso_upload_date, clublog_qso_upload_status = :clublog_qso_upload_status, " "cont = :cont, contacted_op = :contacted_op, contest_id = :contest_id, country = :country, " "credit_submitted = :credit_submitted, credit_granted = :credit_granted, darc_dok = :darc_dok, " "distance = :distance, email = :email, eq_call = :eq_call, eqsl_qslrdate = :eqsl_qslrdate, " "eqsl_qslsdate = :eqsl_qslsdate, eqsl_qsl_rcvd = :eqsl_qsl_rcvd, eqsl_qsl_sent = :eqsl_qsl_sent, " "fists = :fists, fists_cc = :fists_cc, force_init = :force_init, freq = :freq, freq_rx = :freq_rx, " "gridsquare = :gridsquare, hrdlog_qso_upload_date = :hrdlog_qso_upload_date, " "hrdlog_qso_upload_status = :hrdlog_qso_upload_status, iota = :iota, iota_island_id = :iota_island_id, " "k_index = :k_index, lat = :lat, lon = :lon, lotw_qslrdate = :lotw_qslrdate, lotw_qslsdate = :lotw_qslsdate, " "lotw_qsl_rcvd = :lotw_qsl_rcvd, lotw_qsl_sent = :lotw_qsl_sent, max_bursts = :max_bursts, " "ms_shower = :ms_shower, my_antenna = :my_antenna, my_city = :my_city, my_cnty = :my_cnty, " "my_country = :my_country, my_cq_zone = :my_cq_zone, my_dxcc = :my_dxcc, my_fists = :my_fists, " "my_gridsquare = :my_gridsquare, my_iota = :my_iota, my_iota_island_id = :my_iota_island_id, " "my_itu_zone = :my_itu_zone, my_lat = :my_lat, my_lon = :my_lon, my_name = :my_name, " "my_postal_code = :my_postal_code, my_rig = :my_rig, my_sig = :my_sig, my_sig_info = :my_sig_info, " "my_sota_ref = :my_sota_ref, my_state = :my_state, my_street = :my_street, " "my_usaca_counties = :my_usaca_counties, my_vucc_grids = :my_vucc_grids, name = :name, notes = :notes, " "nr_bursts = :nr_bursts, nr_pings = :nr_pings, operator = :operator, owner_callsign = :owner_callsign, " "pfx = :pfx, precedence = :precedence, prop_mode = :prop_mode, " "public_key = :public_key, qrzcom_qso_upload_date = :qrzcom_qso_upload_date, " "qrzcom_qso_upload_status = :qrzcom_qso_upload_status, qslmsg = :qslmsg, qslrdate = :qslrdate, " "qslsdate = :qslsdate, qsl_rcvd = :qsl_rcvd, qsl_sent = :qsl_sent, qsl_rcvd_via = :qsl_rcvd_via, " "qsl_sent_via = :qsl_sent_via, qsl_via = :qsl_via, qso_complete = :qso_complete, qso_random = :qso_random, " "qth = :qth, region = :region, rig = :rig, rx_pwr = :rx_pwr, sat_mode = :sat_mode, sat_name = :sat_name, " "sfi = :sfi, sig = :sig, sig_info = :sig_info, silent_key = :silent_key, skcc = :skcc, " "sota_ref = :sota_ref, srx_string = :srx_string, srx = :srx, stx_string = :stx_string, stx = :stx, " "state = :state, station_callsign = :station_callsign, swl = :swl, uksmg = :uksmg, " "usaca_counties = :usaca_counties, ve_prov = :ve_prov, vucc_grids = :vucc_grids, ten_ten = :ten_ten, " "tx_pwr = :tx_pwr, web = :web, qso_date_off = :qso_date_off, marked = :marked, lognumber = :lognumber " "WHERE id = :id"); } int QSO::getBandIdFromBandName(bool _rxBand) { QSqlQuery query; //qDebug() << Q_FUNC_INFO << "Band: " << getBand(); bool ok = query.prepare ("SELECT band.id FROM band WHERE band.name=:bandname"); if (!ok) { //qDebug() << Q_FUNC_INFO << " - Query NOT prepared"; } if (_rxBand){ query.bindValue (":bandname", getBandRX()); } else { query.bindValue (":bandname", getBand ()); } if (query.exec ()) { if (query.next()) { if (query.isValid ()) { return query.value (0).toInt (); } else { //qDebug() << Q_FUNC_INFO << " - Query NOT valid"; } } else { //qDebug() << Q_FUNC_INFO << " - Query NO Next"; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); return -1; } return -1; } int QSO::getModeIdFromModeName() { // submode is not used, keep it empty. // mode field is populated with the submode //qDebug() << Q_FUNC_INFO; QSqlQuery query; // // SELECT mode.id FROM mode WHERE mode.submode="FT4" // SELECT mode.id FROM mode WHERE mode.name="MFSK" bool ok = query.prepare ("SELECT mode.id FROM mode WHERE mode.submode=:submode"); //bool ok = query.prepare ("SELECT id from mode WHERE CASE WHEN ''<>:submode THEN submode=:submode ELSE name = :name END"); query.bindValue (":submode", getMode ()); if (query.exec ()) { if (query.next()) { if (query.isValid ()) { return query.value (0).toInt (); } else { //qDebug() << Q_FUNC_INFO << " - Query NOT Valid"; } } else { //qDebug() << Q_FUNC_INFO << " - Query NOT Next"; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); return -1; } return -1; } QSqlQuery QSO::getPreparedQuery(const QString &_s) { QSqlQuery query; //qDebug() << Q_FUNC_INFO << "Band: " << getBand(); //qDebug() << Q_FUNC_INFO << "Mode: " << getMode (); query.clear (); if (!query.prepare (_s)) { //qDebug() << Q_FUNC_INFO << "Query not prepared"; query.clear (); return query; } query.bindValue(":qso_date", util->getDateTimeSQLiteStringFromDateTime (getDateTimeOn ())); query.bindValue(":call", getCall()); query.bindValue(":rst_sent", getRSTTX()); query.bindValue(":rst_rcvd", getRSTRX()); query.bindValue(":bandid", getBandIdFromBandName ()); query.bindValue(":modeid", getModeIdFromModeName ()); query.bindValue(":cqz", getCQZone()); query.bindValue(":ituz", getItuZone()); query.bindValue(":dxcc", getDXCC()); query.bindValue(":address", getAddress()); query.bindValue(":age", getAge()); query.bindValue(":cnty", getCounty()); query.bindValue(":comment", getComment()); query.bindValue(":a_index", getA_Index()); query.bindValue(":ant_az", getAnt_az()); query.bindValue(":ant_el", getAnt_el()); query.bindValue(":ant_path", getAnt_Path()); query.bindValue(":arrl_sect", getARRL_Sect()); query.bindValue(":award_submitted", getAwardSubmitted ()); query.bindValue(":award_granted", getAwardGranted ()); query.bindValue(":band_rx", getBandIdFromBandName(true)); query.bindValue(":checkcontest", getCheck()); query.bindValue(":class", getClass()); query.bindValue(":clublog_qso_upload_date", util->getDateSQLiteStringFromDate(getClublogQSOUpdateDate())); query.bindValue(":clublog_qso_upload_status", getClubLogStatus()); query.bindValue(":cont", getContinent ()); query.bindValue(":contacted_op", getContactedOperator()); query.bindValue(":contest_id", getContestID()); query.bindValue(":country", getCountry()); query.bindValue(":credit_submitted", getCreditSubmitted()); query.bindValue(":credit_granted,", getCreditGranted()); query.bindValue(":darc_dok", getDarcDok ()); query.bindValue(":distance", getDistance()); query.bindValue(":email", getEmail()); query.bindValue(":eq_call", getEQ_Call()); query.bindValue(":eqsl_qslrdate", util->getDateSQLiteStringFromDate(getEQSLQSLRDate())); query.bindValue(":eqsl_qslsdate", util->getDateSQLiteStringFromDate(getEQSLQSLSDate())); query.bindValue(":eqsl_qsl_rcvd", getEQSLQSL_RCVD()); query.bindValue(":eqsl_qsl_sent", getEQSLQSL_SENT()); query.bindValue(":fists", getFists ()); query.bindValue(":fists_cc", getFistsCC ()); query.bindValue(":force_init", util->boolToCharToSQLite (getForceInit())); query.bindValue(":freq", getFreqTX()); query.bindValue(":freq_rx", getFreqRX()); query.bindValue(":gridsquare", getGridSquare()); query.bindValue(":hrdlog_qso_upload_date", getHRDUpdateDate ()); query.bindValue(":hrdlog_qso_upload_status", getHRDLogStatus ()); query.bindValue(":iota", getIOTA()); query.bindValue(":iota_island_id", getIotaID()); query.bindValue(":k_index", getK_Index()); query.bindValue(":lat", getLatitude()); query.bindValue(":lon", getLongitude()); query.bindValue(":lotw_qslrdate", util->getDateSQLiteStringFromDate(getLoTWQSLRDate())); query.bindValue(":lotw_qslsdate", util->getDateSQLiteStringFromDate(getLoTWQSLSDate())); query.bindValue(":lotw_qsl_rcvd", getLoTWQSL_RCVD()); query.bindValue(":lotw_qsl_sent", getLoTWQSL_SENT()); query.bindValue(":max_bursts", getMaxBursts()); query.bindValue(":ms_shower", getMsShower()); query.bindValue(":my_antenna", getMyAntenna()); query.bindValue(":my_city", getMyCity()); query.bindValue(":my_cnty", getMyCounty()); query.bindValue(":my_country", getMyCountry()); query.bindValue(":my_cq_zone", getMyCQZone()); query.bindValue(":my_dxcc", getMyDXCC ()); query.bindValue(":my_fists", getMyFists ()); query.bindValue(":my_gridsquare", getMyGridSquare()); query.bindValue(":my_iota", getMyIOTA()); query.bindValue(":my_iota_island_id", getMyIotaID()); query.bindValue(":my_itu_zone", getMyITUZone ()); query.bindValue(":my_lat", getMyLatitude()); query.bindValue(":my_lon", getMyLongitude()); query.bindValue(":my_name", getMyName()); query.bindValue(":my_postal_code", getMyPostalCode ()); query.bindValue(":my_rig", getMyRig()); query.bindValue(":my_sig", getMySig()); query.bindValue(":my_sig_info", getMySigInfo()); query.bindValue(":my_sota_ref", getMySOTA_REF()); query.bindValue(":my_state", getMyState()); query.bindValue(":my_street", getMyStreet()); query.bindValue(":my_usaca_counties", getMyUsacaCounties ()); query.bindValue(":my_vucc_grids", getMyVUCCGrids()); query.bindValue(":name", getName()); query.bindValue(":notes", getNotes()); query.bindValue(":nr_bursts", getNrBursts()); query.bindValue(":nr_pings", getNrPings()); query.bindValue(":operator", getOperatorCallsign()); query.bindValue(":owner_callsign", getOwnerCallsign()); query.bindValue(":pfx", getPrefix()); query.bindValue(":precedence", getPrecedence()); query.bindValue(":prop_mode", getPropMode()); query.bindValue(":public_key", getPublicKey()); query.bindValue(":qrzcom_qso_upload_date", util->getDateSQLiteStringFromDate(getQRZCOMDate ())); query.bindValue(":qrzcom_qso_upload_status", getQRZCOMStatus ()); query.bindValue(":qslmsg", getQSLMsg()); query.bindValue(":qslrdate", util->getDateSQLiteStringFromDate(getQSLRDate())); query.bindValue(":qslsdate", util->getDateSQLiteStringFromDate(getQSLSDate())); query.bindValue(":qsl_rcvd", getQSL_RCVD()); query.bindValue(":qsl_sent", getQSL_SENT()); query.bindValue(":qsl_rcvd_via", getQSLRecVia()); query.bindValue(":qsl_sent_via", getQSLSentVia()); query.bindValue(":qsl_via", getQSLVia()); query.bindValue(":qso_complete", getQSOComplete()); query.bindValue(":qso_random", getQSORandom()); query.bindValue(":qth", getQTH()); query.bindValue(":region", getRegion ()); query.bindValue(":rig", getRig ()); query.bindValue(":rx_pwr", getRXPwr()); query.bindValue(":sat_mode", getSatMode()); query.bindValue(":sat_name",getSatName()); query.bindValue(":sfi", getSFI()); query.bindValue(":sig", getSig()); query.bindValue(":sig_info", getSigInfo ()); query.bindValue(":silent_key", util->boolToCharToSQLite (getSilentKey ())); query.bindValue(":skcc", getSkcc ()); query.bindValue(":sota_ref", getSOTA_REF()); query.bindValue(":srx_string", getSrxString()); query.bindValue(":srx", getSrx()); query.bindValue(":stx_string", getStxString()); query.bindValue(":stx", getStx()); query.bindValue(":state", getState()); query.bindValue(":station_callsign", getStationCallsign()); //query.bindValue(":submode", getModeIdFromModeName (true)); query.bindValue(":swl", getSwl()); query.bindValue(":uksmg", getUksmg ()); query.bindValue(":usaca_counties", getUsacaCounties ()); query.bindValue(":ve_prov", getVeProv ()); query.bindValue(":vucc_grids", getVUCCGrids()); query.bindValue(":ten_ten", getTenTen()); query.bindValue(":tx_pwr", getTXPwr()); query.bindValue(":web", getWeb()); query.bindValue(":qso_date_off", util->getDateSQLiteStringFromDate(getDateOff())); query.bindValue(":lognumber", getLogId()); return query; } QString QSO::getADIF() { adif = new Adif(Q_FUNC_INFO); QString adifStr = QString(); adifStr.append(adif->getADIFField ("CALL", callsign)); adifStr.append(adif->getADIFField ("QSO_DATE", util->getADIFDateFromQDateTime(qso_dateTime))); adifStr.append(adif->getADIFField ("TIME_ON", util->getADIFTimeFromQDateTime(qso_dateTime))); return adifStr; } klog-2.3.3/awards.cpp0000644000015700001710000017525614542412415014342 0ustar jenkinsjenkins#include "awards.h" /*************************************************************************** awards.cpp - description ------------------- begin : nov 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include Awards::Awards(DataProxy_SQLite *dp, const QString &_parentFunction) { Q_UNUSED(_parentFunction); //qDebug() << "Awards::Awards- from: " << _parentFunction; dataProxy = dp; //QSqlDatabase db = QSqlDatabase::database("QSQLITE"); world = new World(dataProxy, Q_FUNC_INFO); //qDebug() << "Awards::Awards - Before DXMarathon" ; dxMarathon = new DXMarathon(dataProxy); //qDebug() << "Awards::Awards - After DXMarathon" ; util = new Utilities(Q_FUNC_INFO); //world->create(); /* newOneColor.setNamedColor("#ff0000"); neededColor.setNamedColor("#ff8c00"); workedColor.setNamedColor("#ffd700"); confirmedColor.setNamedColor("#32cd32"); defaultColor.setNamedColor("#00bfff"); */ //"Awards::setColors: " << _newOne << "/" << _needed << "/" << _worked << "/" << _confirmed << "/" << _default; //Awards::setColors: "#ff0000" / "#ff8c00" / "#ffd700" / "#32cd32" / "#00bfff" newOneColor = Qt::black; neededColor = Qt::black; workedColor = Qt::black; confirmedColor = Qt::black; defaultColor = Qt::black; dxccWorked.clear(); dxccConfirmed.clear(); wazWorked.clear(); wazConfirmed.clear(); manageModes = false; //qDebug() << "Awards::Awards - END" ; } Awards::~Awards() { delete(world); delete(dxMarathon); delete(util); } void Awards::setAwardDXCC(const int _qsoId) { //qDebug() << "Awards::setAwardDXCC: _qsoId: " << QString::number(_qsoId); dataProxy->setDXCCAwardStatus(_qsoId); } void Awards::setAwardWAZ(const int _qsoId) { //qDebug() << "Awards::setAwardWAZ: _qsoId: " << QString::number(_qsoId); dataProxy->setWAZAwardStatus(_qsoId); } QString Awards::getQSOofAward (const int _enti, const int _bandid, const int _log, const bool _confirmed) {// Returns the QRZ that granted that status in the DXCC //qDebug() << "Awards::getQSOofAward: " << QString::number(_enti) << "/" << QString::number(_bandid); QSqlQuery query; QString stringQuery = QString(); bool sqlOK = false; //QString answer = QString(); if (_confirmed) { stringQuery = QString("SELECT call, qso_date from log where dxcc='%1' AND bandid='%2' AND lognumber='%3' AND (qsl_rcvd='Y' OR lotw_qsl_rcvd='Y')").arg(_enti).arg(_bandid).arg(_log); } else { stringQuery = QString("SELECT call, qso_date from log where dxcc='%1' AND bandid='%2' AND lognumber='%3'").arg(_enti).arg(_bandid).arg(_log); } sqlOK = query.exec(stringQuery); //qDebug() << "Awards::getQSOofAward: stringQuery: " << stringQuery; if (sqlOK) { query.next(); if (query.isValid()) { QString answer = query.value(0).toString() + " / " + query.value(1).toString() ; query.finish(); //qDebug() << "Awards::getQSOofAward: answer: " << answer; return answer; } else { query.finish(); //qDebug() << "Awards::getQSOofAward: 0"; return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "Awards::getQSOofAward: Query error"; return QString(); } } int Awards::getQSOIdofAward (const int _enti, const int _bandid, const int _log, const bool _confirmed) {// Returns the QSOid that granted that status in the DXCC //qDebug() << "Awards::getQSOIdofAward: " << QString::number(_enti) << "/" << QString::number(_bandid); QSqlQuery query; QString stringQuery = QString(); bool sqlOK = false; int answer = -1; //stringQuery = QString("SELECT qsoid from awarddxcc where dxcc='%1' and band='%2'").arg(_enti).arg(_bandid); if (_confirmed) { stringQuery = QString("SELECT id from log where dxcc='%1' AND bandid='%2' AND lognumber='%3' AND (qsl_rcvd='Y' OR lotw_qsl_rcvd='Y')").arg(_enti).arg(_bandid).arg(_log); } else { stringQuery = QString("SELECT id from log where dxcc='%1' AND bandid='%2' AND lognumber='%3'").arg(_enti).arg(_bandid).arg(_log); } sqlOK = query.exec(stringQuery); //qDebug() << "Awards::getQSOIdofAward: stringQuery: " << stringQuery; if (sqlOK) { query.next(); if (query.isValid()) { answer = query.value(0).toInt(); //qDebug() << "Awards::getQSOIdofAward: answer: " << QString::number(answer); query.finish(); if (answer>=1) { return answer; } else { return -1; } } else { query.finish(); //qDebug() << "Awards::getQSOIdofAward: 0"; return -2; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "Awards::getQSOIdofAward: Query error"; return -3; } } int Awards::getDXCCWorked(const int _logNumber) { //qDebug() << "Awards::getDXCCWorked (logNumber): " << QString::number(_logNumber); QSqlQuery query; QString stringQuery; bool sqlOK; if (dataProxy->doesThisLogExist(_logNumber)) { stringQuery = QString("SELECT COUNT (DISTINCT dxcc) FROM log WHERE dxcc>'0' AND dxcc < '1000' AND lognumber='%1'").arg(_logNumber); } else { stringQuery = QString("SELECT COUNT (DISTINCT dxcc) FROM log WHERE dxcc>'0' AND dxcc < '1000' "); } sqlOK = query.exec(stringQuery); //qDebug() << "Awards::getDXCCWorked: stringQuery: " << stringQuery; if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); //qDebug() << "Awards::getDXCCWorked: " << QString::number((query.value(0)).toInt()); return v; } else { //qDebug() << "Awards::getDXCCWorked: 0"; return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "Awards::getDXCCWorked: Query error"; return 0; } } int Awards::getDXCCConfirmed(const int _logNumber) { //qDebug() << "Awards::getDXCCConfirmed (logNumber): " << QString::number(_logNumber); return dataProxy->getFieldInBand (DXCC, "ALL", true, "ALL", _logNumber); } int Awards::getWAZWorked(const int _logNumber) { //qDebug() << "Awards::getWAZWorked (logNumber): " << QString::number(_logNumber); QSqlQuery query; QString stringQuery; if (dataProxy->doesThisLogExist(_logNumber)) { stringQuery = QString("SELECT COUNT (cqz) FROM (SELECT DISTINCT cqz FROM log WHERE cqz!='' AND cqz>'0' AND cqz<'41' AND lognumber='%1')").arg(_logNumber); } else { stringQuery = QString("SELECT COUNT (cqz) FROM (SELECT DISTINCT cqz FROM log WHERE cqz!='' AND cqz>'0' AND cqz<'41')"); } bool sqlOK = query.exec(stringQuery); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return 0; } } int Awards::getWAZConfirmed(const int _logNumber) { //qDebug() << "Awards::getWAZConfirmed (logNumber): " << QString::number(_logNumber); QSqlQuery query; QString stringQuery; //Usar la siguiente para el confirmed if (dataProxy->doesThisLogExist(_logNumber)) { stringQuery = QString("SELECT COUNT (cqz) FROM (SELECT DISTINCT cqz FROM log WHERE cqz!='' AND cqz>'0' AND cqz<'41' AND (qsl_rcvd='Y' OR lotw_qsl_rcvd='Y') AND lognumber='%1')").arg(_logNumber); } else { stringQuery = QString("SELECT COUNT (cqz) FROM (SELECT DISTINCT cqz FROM log WHERE cqz!='' AND cqz>'0' AND cqz<'41' AND (qsl_rcvd='Y' OR lotw_qsl_rcvd='Y'))"); } bool sqlOK = query.exec(stringQuery); if (sqlOK) { query.next(); if (query.isValid()) { int v =(query.value(0)).toInt(); query.finish(); return v; } else { return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return 0; } } bool Awards::isThisSpotConfirmed(const QStringList &_qs) { return (getDXStatus(_qs) == 13); } int Awards::getDXStatus (const QStringList &_qs) { //qDebug() << "Awards::getDXStatus: Entity: " << _qs.at(0) << "/ Band: " << _qs.at(1) << "/ Mode: " << _qs.at(2) << "/ Log: " << _qs.at(3) << QT_ENDL; // Receives: QStringList _qs; //_qs << Entity << BandId << << ModeId << lognumber; /* Not mode -1 - Error. - ERROR - ERROR 0 - New one - New One - New One - 0 1 - Worked but not in this band nor this mode - Needed One - Needed One - 1 2 - Worked in this band, not this mode - Needed One - Worked One - 3 3 - Worked in this band and in this mode - Worked One - Worked One - 3 4 - Worked in this mode, not this band - Needed One - Needed One - 1 5 - Confirmed in another band/mode but not worked in this band nor this mode - Needed One - Needed One - 1 6 - Confirmed in another band/mode but just worked in this band and not in this mode - Needed One - Worked One - 3 7 - Confirmed in another band/mode but just worked in this mode and not in this band - Needed One - Needed One - 1 8 - Confirmed in another band/mode but just worked in this band and mode - Worked One - Worked One - 3 9 - Confirmed in this mode, but not worked this band - Needed One - Needed One - 1 10 - Confirmed in this mode, but worked this band - Worked One - Worked One - 3 11 - Confirmed in this band but not worked in this mode - Needed One - Confirmed One - 13 12 - Confirmed in this band but worked in this mode - Worked One - Confirmed One - 13 13 - Confirmed in this band and mode - Confirmed One - Confirmed One - 13 14 - New CQ Zone 15 - New CQ Zone on band 16 - New ITU Zone 17 - New ITU Zone on band 18 - New Grid 19 - New Grid on band */ /* 0 - New One - Never worked before - RED 1 - Needed - New one in this band - ORANGE 2 - Worked - Worked in this band but not confirmed - YELLOW 3 - Confirmed - Confirmed in this band - GREEN */ if (_qs.length() != 4 ) { //qDebug() << "Awards::getDXStatus: Length != 4, return -1"; return -1; } //int errorCode = 0; int _band = _qs.at(1).toInt(); int _mode = _qs.at(2).toInt(); int _logNumber = _qs.at(3).toInt(); int dxccEntity = (_qs.at(0)).toInt(); //qDebug() << "Awards::getDXStatus: dxccEntity: " << QString::number(dxccEntity); if (dxccEntity<=0) { //qDebug() << "Awards::getDXStatus: dxccEntity <= 0, return -1"; return -1; } bool checkingMode = true; if ( (_mode==-1) || (manageModes==false)) { checkingMode = false; //qDebug() << "Awards::getDXStatus: checkingMode = FALSE"; } int wb = dxccStatusBand(dxccEntity, _band, _logNumber); //-1 error / 0 Not worked / 1 worked / 2 confirmed int wm = -1; if (checkingMode) { wm = dxccStatusMode(dxccEntity, _mode, _logNumber); //-1 error / 0 Not worked / 1 worked / 2 confirmed } // int wm = dxccStatusMode(dxccEntity, _mode, _logNumber); //-1 error / 0 Not worked / 1 worked / 2 confirmed if (wm==-1) { checkingMode = false; } //qDebug() << "Awards::getDXStatus: wb=" << QString::number(wb) << " - wm=" << QString::number(wm); //qDebug() << "Awards::getDXStatus: dxccStatus: " << QString::number(dxccStatus(dxccEntity, _logNumber)); switch(dxccStatus(dxccEntity, _logNumber)) { case 0: //qDebug() << "Awards::getDXStatus: return 0"; return 0; // ATNO //break; case 1: // Worked, not confirmed switch (wb) { case 0: // Not worked in this band but in another band if (checkingMode) { if (wm==1) { //qDebug() << "Awards::getDXStatus: return 4"; return 4; } else { //qDebug() << "Awards::getDXStatus: return 1"; return 1; } } else { //qDebug() << "Awards::getDXStatus: return 4 nc"; return 4; } case 1: // Worked in this band if (checkingMode) { if (wm==1) { //qDebug() << "Awards::getDXStatus: return 3"; return 3; } else { //qDebug() << "Awards::getDXStatus: return 2"; return 2; } } else { //qDebug() << "Awards::getDXStatus: return 3 nc"; return 3; } default: // ERROR //qDebug() << "Awards::getDXStatus: default return -1 - 1"; return -1; } case 2: // Confirmed if (wb==2) { if (checkingMode) { if (wm==2) { //qDebug() << "Awards::getDXStatus: return 13"; return 13; } else if (wm==1) { //qDebug() << "Awards::getDXStatus: return 12"; return 12; } else { //qDebug() << "Awards::getDXStatus: return 11"; return 11; } } else { //qDebug() << "Awards::getDXStatus: return 13 nc"; return 13; } } else if ((wb ==1) || (wb == 0)) { if (checkingMode) { if (wb==1) { if (wm==1) { //qDebug() << "Awards::getDXStatus: return 8"; return 8; } else { //qDebug() << "Awards::getDXStatus: return 6"; return 6; } } else { if (wm==1) { //qDebug() << "Awards::getDXStatus: return 7"; return 7; } else { //qDebug() << "Awards::getDXStatus: return 5"; return 5; } } } else { if (wb==0) { //qDebug() << "Awards::getDXStatus: return 7 nc"; return 7; } else { //qDebug() << "Awards::getDXStatus: return 8 nc"; return 8; } } } else { //qDebug() << "Awards::getDXStatus: return -1 - 2"; return -1; } default: //qDebug() << "Awards::getDXStatus: return -1 default2"; return -1; } // END OF SWITCH //qDebug() << "Awards::getDXStatus: END, return -1"; //return -1; } int Awards::dxccStatusBandMode(const int _ent, const int _band, const int _mode, const int _logNumber, bool _checkingMode) {//-1 error / 0 Not worked / 1 worked / 2 confirmed //qDebug() << "Awards::dxccStatusBandMode: " << QString::number(_ent) << "/" << QString::number(_band) << "/" << QString::number(_mode); QSqlQuery query = QSqlQuery(); QString queryString = QString(); if (_checkingMode) { //qDebug() << "Awards::dxccStatusBandMode: Checking Mode TRUE"; queryString = QString("SELECT DISTINCT qsl_rcvd, lotw_qsl_rcvd FROM log WHERE dxcc='%1' AND bandid='%2' AND modeid='%3' AND lognumber='%4' ").arg(QString::number(_ent)).arg(QString::number(_band)).arg(QString::number(_mode)).arg(QString::number(_logNumber)); } else { //qDebug() << "Awards::dxccStatusBandMode: Checking Mode FALSE"; queryString = QString("SELECT DISTINCT qsl_rcvd, lotw_qsl_rcvd FROM log WHERE dxcc='%1' AND bandid='%2' AND lognumber='%3' ").arg(QString::number(_ent)).arg(QString::number(_band)).arg(QString::number(_logNumber)); } int status = 0; if (query.exec(queryString)) { while (query.next()) { if ( query.isValid() ) { if((query.value(0).toString() == "Y") || (query.value(1).toString() == "Y")) { //qDebug() << "Awards::dxccStatusBandMode: return - 2"; query.finish(); return 2; } status = 1; } } query.finish(); } else { // The query fails... //qDebug() << "Awards::dxccStatusBandMode: return - -1"; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } //qDebug() << "Awards::dxccStatusBandMode: return - 0-4"; return status; } /* int Awards::dxccStatusBandMode(const int _ent, const int _band, const int _mode, const int _logNumber, bool _checkingMode) {//-1 error / 0 Not worked / 1 worked / 2 confirmed //qDebug() << "Awards::dxccStatusBandMode: " << QString::number(_ent) << "/" << QString::number(_band) << "/" << QString::number(_mode); QSqlQuery query = QSqlQuery(); QString queryString = QString(); if (_checkingMode) { //qDebug() << "Awards::dxccStatusBandMode: Checking Mode TRUE"; queryString = QString("SELECT confirmed FROM awarddxcc WHERE dxcc='%1' AND band='%2' AND mode='%3' AND lognumber='%4' ").arg(QString::number(_ent)).arg(QString::number(_band)).arg(QString::number(_mode)).arg(QString::number(_logNumber)); } else { //qDebug() << "Awards::dxccStatusBandMode: Checking Mode FALSE"; queryString = QString("SELECT confirmed FROM awarddxcc WHERE dxcc='%1' AND band='%2' AND lognumber='%3' ").arg(QString::number(_ent)).arg(QString::number(_band)).arg(QString::number(_logNumber)); } int status = 0; if (query.exec(queryString)) { while (query.next()) { if ( query.isValid() ) { if(query.value(0).toString() == "1") { //qDebug() << "Awards::dxccStatusBandMode: return - 2"; query.finish(); return 2; } else if(query.value(0).toString() == "0") { //qDebug() << "Awards::dxccStatusBandMode: return - 1"; if (status < 1) { status = 1; } } } } query.finish(); } else { // The query fails... //qDebug() << "Awards::dxccStatusBandMode: return - -1"; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } //qDebug() << "Awards::dxccStatusBandMode: return - 0-4"; return status; } */ int Awards::dxccStatus(const int _ent, const int _logNumber) {//-1 error / 0 Not worked / 1 worked / 2 confirmed //qDebug() << "Awards::dxccStatus: " << QString::number(_ent); QSqlQuery query = QSqlQuery(); QString queryString = QString(); int worked = 0; queryString = QString("SELECT DISTINCT qsl_rcvd, lotw_qsl_rcvd FROM log WHERE dxcc='%1' AND lognumber='%2' ").arg(QString::number(_ent)).arg(QString::number(_logNumber)); if (query.exec(queryString)) { //qDebug() << "Awards::dxccStatus: query exec OK: " << query.lastQuery(); while (query.next()) { //qDebug() << "Awards::dxccStatus: query VALUE: " << (query.value(0)).toString(); if ( query.isValid() ) { //qDebug() << "Awards::dxccStatus: query valid OK"; if(((query.value(0)).toString() == "Y") || ((query.value(1)).toString() == "Y")) { //qDebug() << "Awards::dxccStatus: value = 1 - return 2"; query.finish(); return 2; } worked = 1; } } //qDebug() << "Awards::dxccStatus: return "<< QString::number(worked) ; query.finish(); //qDebug() << "Awards::dxccStatus: END: " << QString::number(worked); return worked; } else { // The query fails... //qDebug() << "Awards::dxccStatus: return -1" ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } //qDebug() << "Awards::dxccStatus: return 0" ; //return worked; } /* int Awards::dxccStatus(const int _ent, const int _logNumber) {//-1 error / 0 Not worked / 1 worked / 2 confirmed //qDebug() << "Awards::dxccStatus: " << QString::number(_ent); QSqlQuery query = QSqlQuery(); QString queryString = QString(); int worked = 0; queryString = QString("SELECT confirmed FROM awarddxcc WHERE dxcc='%1' AND lognumber='%2' ").arg(QString::number(_ent)).arg(QString::number(_logNumber)); if (query.exec(queryString)) { //qDebug() << "Awards::dxccStatus: query exec OK: " << query.lastQuery(); while (query.next()) { //qDebug() << "Awards::dxccStatus: query VALUE: " << (query.value(0)).toString(); if ( query.isValid() ) { //qDebug() << "Awards::dxccStatus: query valid OK"; if((query.value(0)).toString() == "1") { //qDebug() << "Awards::dxccStatus: value = 1 - return 2"; query.finish(); return 2; } else if((query.value(0)).toString() == "0") { //qDebug() << "Awards::dxccStatus: value = 0 - worked 1"; if (worked <1) { worked = 1; } } } } //qDebug() << "Awards::dxccStatus: return "<< QString::number(worked) ; query.finish(); //qDebug() << "Awards::dxccStatus: END: " << QString::number(worked); return worked; } else { // The query fails... //qDebug() << "Awards::dxccStatus: return -1" ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } //qDebug() << "Awards::dxccStatus: return 0" ; //return worked; } */ QColor Awards::getQRZDXStatusColor(const QStringList &_qs) { //qs << Entity << spotBand << "-1" << QString::number(currentLog) ; //qDebug() << "Awards::getQRZDXStatusColor qs.length: " << QString::number(_qs.length()); //From Search QSO to QSL: q << _call << bandid << _mode << QString::number(currentLog); //qDebug() << "Awards::getQRZDXStatusColor: " << _qs.at(0) << "/" << _qs.at(1) << "/" << _qs.at(2) << _qs.at(3); // Receives: QStringList _qs; //_qs << Entity << BandID << ModeId << lognumber; /* 0 - New One 1 - Needed 2 - Worked 3 - Confirmed */ QColor returnedColor; int status = getDXStatus(_qs); //qDebug() << "Awards::getQRZDXStatusColor: status: " << QString::number(status) << "/" << getDXStatusString(status); //qDebug() << "Awards::getQRZDXStatusColor: status: " << QString::number(status); switch (status) { case 0: returnedColor = newOneColor; break; case 1: returnedColor = neededColor; break; case 2: returnedColor = neededColor; break; case 3: returnedColor = workedColor; break; case 4: returnedColor = neededColor; break; case 5: returnedColor = neededColor; break; case 6: returnedColor = neededColor; break; case 7: returnedColor = neededColor; break; case 8: returnedColor = workedColor; break; case 9: returnedColor = neededColor; break; case 10: returnedColor = workedColor; break; case 11: returnedColor = neededColor; break; case 12: returnedColor = workedColor; break; case 13: returnedColor = confirmedColor; break; //break; default: returnedColor = defaultColor; break; } return returnedColor; } QString Awards::getDXStatusString (const int &_status) { //qDebug() << "Awards::getDXStatusString: " << QString::number(_status); QString message = QString(); switch (_status) { case 0: message = QObject::tr("New One, work it!"); //message = QObject::tr("0-new One"); break; case 1: message = QObject::tr("Needed, work it!"); //message = QObject::tr("1-Needed, work it!"); break; case 2: message = QObject::tr("Needed, work it!"); break; case 3: message = QObject::tr("Worked but not confirmed"); break; case 4: message = QObject::tr("Needed, work it!"); break; case 5: message = QObject::tr("Needed, work it!"); break; case 6: message = QObject::tr("Needed, work it!"); break; case 7: message = QObject::tr("Needed, work it!"); break; case 8: message = QObject::tr("Worked but not confirmed"); break; case 9: message = QObject::tr("Needed, work it!"); break; case 10: message = QObject::tr("Worked but not confirmed"); break; case 11: message = QObject::tr("Needed, work it!"); break; case 12: message = QObject::tr("Worked but not confirmed"); break; case 13: message = QObject::tr("Confirmed"); break; //break; default: message = QObject::tr("Not identified"); break; } return message; } QString Awards::getDXCCStatusBand(const int _dxcc, const int _band) { // Returns -, W or C (Not worked, worked, Confirmed) //qDebug() << Q_FUNC_INFO << "DXCC/Band: " << QString::number(_dxcc) << "/" << QString::number(_band); //qDebug() << Q_FUNC_INFO << "dxccStatusList: " << QString::number(dxccStatusList.length ()); EntityBandStatus aux; foreach (aux, dxccStatusList) { //qDebug() << Q_FUNC_INFO << " DXCC: " << QString::number(aux.dxcc); //qDebug() << Q_FUNC_INFO << " Band: " << QString::number(aux.bandid); if (aux.confirmed) { //qDebug() << Q_FUNC_INFO << "Confirmed"; } else { //qDebug() << Q_FUNC_INFO << "Not confirmed"; } if (aux.dxcc == _dxcc) { //qDebug() << Q_FUNC_INFO << " DXCC found: " << QString::number(_dxcc); if (aux.bandid == _band) { //qDebug() << Q_FUNC_INFO << " Band found: " << QString::number(_band); if (aux.confirmed) { //qDebug() << Q_FUNC_INFO << " Confirmed " ; return "C"; } else { //qDebug() << Q_FUNC_INFO << " Worked " ; return "W"; } } } } //qDebug() << Q_FUNC_INFO << " Returnin -" ; return "-"; } QString Awards::getDXCCStatusBand2(const int _dxcc, const int _band, const int _logNumber) { // Returns -, W or C (Not worked, worked, Confirmed) //qDebug() << "Awards::getDXCCStatusBand: log received: " << QString::number(_logNumber); QString stringQuery; if (_logNumber<0) { stringQuery = QString("SELECT DISTINCT qsl_rcvd, lotw_qsl_rcvd FROM log WHERE dxcc='%1' AND bandid='%2'").arg(_dxcc).arg(_band); } else { stringQuery = QString("SELECT DISTINCT qsl_rcvd, lotw_qsl_rcvd FROM log WHERE dxcc='%1' AND bandid='%2' AND lognumber='%3'").arg(_dxcc).arg(_band).arg(_logNumber); } QString status = "-"; QSqlQuery query; bool sqlOk = query.exec(stringQuery); if (sqlOk) { while (query.next()) { if (query.isValid()) { if (((query.value(0)).toString() == "Y") || ((query.value(1)).toString() == "Y")) { query.finish(); return "C"; } status = "W"; } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return "-"; } query.finish(); return status; } /* QString Awards::getDXCCStatusBand(const int _dxcc, const int _band, const int _logNumber) { // Returns -, W or C (Not worked, worked, Confirmed) //qDebug() << "Awards::getDXCCStatusBand: log received: " << QString::number(_logNumber); QString stringQuery; if (_logNumber<0) { stringQuery = QString("SELECT confirmed from awarddxcc WHERE dxcc='%1' AND band='%2'").arg(_dxcc).arg(_band); } else { stringQuery = QString("SELECT confirmed from awarddxcc WHERE dxcc='%1' AND band='%2' AND lognumber='%3'").arg(_dxcc).arg(_band).arg(_logNumber); } QString status = "-"; QSqlQuery query; bool sqlOk = query.exec(stringQuery); if (sqlOk) { while (query.next()) { if (query.isValid()) { if ((query.value(0)).toString() == "1") { query.finish(); return "C"; } else if ((query.value(0)).toString() == "0") { if (status == "-") { status = "W"; } } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return "-"; } query.finish(); return status; } */ QString Awards::checkIfValidIOTA(const QString &_tiota) { /********************************** IOTA should be always with this format: CC-NNN being: - CC the shortname of the continent - NNN Number of the reference. NNN has ALWAYS to include THREE(3) characters. ADIF Specs says: CC is the continent designator {NA, SA, EU , AF, OC, AS, AN} XXX is the island designator, where 0 <= XXX ,<= 999 [use leading zeroes] Returns a valid format IOTA if possible and "" in other cases. ************************************/ //qDebug() << "Awards::checkIfValidIOTA: " << _tiota; //bool _valid = false; QString _continent; QString _number; if (_tiota.count("-") == 1) { QStringList _values = _tiota.split("-", QT_SKIP); if (_values.size() != 2) { return ""; } if (dataProxy->isValidContinentShortName(_values.at(0))) { _continent = _values.at(0); } else { return ""; } if ((_values.at(1)).toInt() > 0) { _number = _values.at(1); } else { return ""; } } else { return ""; } //qDebug() << "Awards::checkIfValidIOTA (cont) " << _continent; //qDebug() << "Awards::checkIfValidIOTA (numb): " << _number; // Check if continent is valid if (dataProxy->isValidContinentShortName(_continent)) { if ( (_number.toInt() >0 ) && ((_number.toInt()) < 1000 )) { if ((_number.length()) == 3) { return _continent + "-" + _number ; } else if ((_number.length()) == 2) { return _continent + "-0" + QString::number((_number).toInt()); } else if ((_number.length()) == 1) { return _continent + "-00" + QString::number((_number).toInt()); } else { return ""; } } else { return ""; } } else { return QString(); } //return QString(); /* QString stringQuery = QString("SELECT id FROM continent WHERE shortname ='%1'").arg(_continent); QSqlQuery query; query.exec(stringQuery); while (query.next()) { if (query.isValid()) { _valid = true; if ( (_number.toInt() >0 ) && ((_number.toInt()) < 1000 )) { if ((_number.length()) == 3) { return _continent + "-" + _number ; } else if ((_number.length()) == 2) { return _continent + "-0" + QString::number((_number).toInt()); } else if ((_number.length()) == 1) { return _continent + "-00" + QString::number((_number).toInt()); } else { return ""; } } else { return ""; } } } return ""; */ } void Awards::setColors (const QString &_newOne, const QString &_needed, const QString &_worked, const QString &_confirmed, const QString &_default) { //qDebug() << "Awards::setColors: " << _newOne << "/" << _needed << "/" << _worked << "/" << _confirmed << "/" << _default; defaultColor = QColor(_default.toUpper()); neededColor = QColor(_needed.toUpper()); workedColor = QColor(_worked.toUpper()); confirmedColor = QColor(_confirmed.toUpper()); newOneColor = QColor(_newOne.toUpper()); if (defaultColor.isValid()) { defaultColor.setNamedColor(_default.toUpper()); } if (neededColor.isValid()) { neededColor.setNamedColor(_needed.toUpper()); } if (confirmedColor.isValid()) { confirmedColor.setNamedColor(_confirmed.toUpper()); } if (newOneColor.isValid()) { newOneColor.setNamedColor(_newOne.toUpper()); } if (workedColor.isValid()) { workedColor.setNamedColor(_worked.toUpper()); } } QColor Awards::getDefaultColor() { return defaultColor; } void Awards::recalculateAwards() { /* TODO: I need to optimize this function. The select & insert of setAwardDXCC are too slow) Should go in a transaction */ //qDebug() << "Awards::recalculateAwards"; dataProxy->updateAwardDXCC(); emit awardDXCCUpdated(); dataProxy->updateAwardWAZ(); //qDebug() << "Awards::recalculateAwards - END"; } int Awards::getQSOsInLog(const int _logNumber) { //qDebug() << "Awards::getQSOsInLog: " << QString::number(_logNumber); QSqlQuery query; QString queryString; int v; queryString = QString("SELECT COUNT (id) FROM log WHERE lognumber='%1'").arg(_logNumber) ; if( !query.exec(queryString) ) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } else { query.next(); if (query.isValid()) { v = query.value(0).toInt(); query.finish(); return v; } else { query.finish(); return -2; } } } /* void Awards::setAwards(const int _dxcc, const int _waz, const int _band, const int _mode, const int _workedOrConfirmed, const int _logNumber, const int _qsoId) { //qDebug() << "Awards::setAwards: " << QString::number(_dxcc); //_workedOrConfirmed = -1 Remove this pair //_workedOrConfirmed = 0 Set as Worked //_workedOrConfirmed = 1 Set as Confirmed int d = _dxcc; int b = _band; int m = _mode; int w = _workedOrConfirmed; int l = _logNumber; int i = _qsoId; int z = _waz; setAwardDXCC(d, b, m, w, l, i); setAwardWAZ(z, b, m, w, l, i); //setAwardWAZ(_waz, _band, _mode, _workedOrConfirmed, _logNumber); } */ void Awards::setAwards(const int _qsoId) { //qDebug() << "Awards::setAwards: _qsoId: " << QString::number(_qsoId); dataProxy->setDXCCAwardStatus(_qsoId); dataProxy->setWAZAwardStatus(_qsoId); } /* int Awards::setAwardDXCCst(const int _dxcc, const int _band, const int _mode, const bool _confirmed, const int _logNumber, const int _qsoId) { //qDebug() << "Awards::setAwardDXCCst-0: " << QString::number(_dxcc) << "/" << QString::number(_band) << "/" << QString::number(_mode) << "/" << QString::number(_logNumber) << "/" << QString::number(_qsoId); int nameCol=-1; QString _refid = QString(); // _confirmedQSO == false QSO is just worked // _confirmedQSO == true QSO is confirmed //TODO: Fix the way we check for data validity for this function if (!( (_dxcc>=0) && (_band >=0) && (_mode>=0) && (_logNumber>=0) && (_qsoId >=0) )) { //qDebug() << "Awards::setAwardDXCCst: Not valid data received!"; return -1; } int _iconfirmed; if (_confirmed) { _iconfirmed = 1; } else { _iconfirmed = 0; } //qDebug() << "Awards::setAwardDXCCst: _qsoId: " << QString::number(_qsoId) << "/" << QString::number(_iconfirmed); QString stringQuery = QString(); QSqlQuery query; bool sqlOK = false; int errorCode = -1; stringQuery = QString("SELECT id, confirmed FROM awarddxcc where dxcc='%1' AND band='%2' AND mode='%3' AND lognumber='%4'").arg(_dxcc).arg(_band).arg(_mode).arg(_logNumber); sqlOK = query.exec(stringQuery); if (sqlOK) { //qDebug() << "Awards::setAwardDXCCst-1:"; query.next(); QSqlRecord rec = query.record(); if (query.isValid()) {// We have some data, we need to UPDATE - We are only confirming! //qDebug() << "Awards::setAwardDXCCst: We have some data, we neer to update"; nameCol = rec.indexOf("id"); _refid = query.value(nameCol).toString(); stringQuery = QString("UPDATE awarddxcc SET confirmed='1', qsoid='%1' WHERE id='%2'").arg(_qsoId).arg(_refid); //qDebug() << "Awards::setAwardDXCCst: (UPDATE): " << stringQuery; if (sqlOK) { // Set of data updated //qDebug() << "Awards::setAwardDXCCst: Data updated!"; query.finish(); return 1; } else { // Something failed. Trace it! errorCode = query.lastError().nativeErrorCode(); emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } } else { // We don't have this set, we need to INSERT stringQuery = QString("INSERT INTO awarddxcc (dxcc, band, mode, confirmed, lognumber, qsoid) values('%1','%2','%3','%4','%5','%6')").arg(_dxcc).arg(_band).arg(_mode).arg(_iconfirmed).arg(_logNumber).arg(_qsoId); sqlOK = query.exec(stringQuery); //qDebug() << "Awards::setAwardDXCCst: We don't have data... so we INSERT"; //qDebug() << "Awards::setAwardDXCCst: (INSERT): " << stringQuery; if (sqlOK) { // Set of data included query.finish(); //qDebug() << "Awards::setAwardDXCCst: Data inserted!"; } else { // Something failed. Trace it! emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); errorCode = query.lastError().nativeErrorCode(); query.finish(); return -1; } } } else { // Trace the error... what may be happening??? emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); errorCode = query.lastError().nativeErrorCode(); query.finish(); return -1; } return -1; } */ /* int Awards::setAwardWAZst(const int _cqz, const int _band, const int _mode, const bool _confirmed, const int _logNumber, const int _qsoId) { //qDebug() << "Awards::setAwardWAZst(CQZ/BAND/MODE/WORKED/log/qsoid): " << QString::number(_cqz) << "/" << QString::number(_band) << "/" << QString::number(_mode) << "/" << QString::number(_logNumber) << "/" << QString::number(_qsoId); // _confirmed == false QSO is just worked // _confirmed == true QSO is confirmed //TODO: Fix the way we check for data validity for this function if (!( (_cqz>=0) && (_band >=0) && (_mode>=0) && (_logNumber>=0) && (_qsoId >=0) )) { //qDebug() << "Awards::setAwardWAZst: some data was NOK"; return -1; } int _iconfirmed; if (_confirmed) { _iconfirmed = 1; } else { _iconfirmed = 0; } QString stringQuery; QSqlQuery query; bool sqlOK; //int errorCode = -1; stringQuery = QString("INSERT INTO awardwaz (cqz, band, mode, confirmed, lognumber, qsoid) values('%1','%2','%3','%4','%5','%6')").arg(_cqz).arg(_band).arg(_mode).arg(_iconfirmed).arg(_logNumber).arg(_qsoId); sqlOK = query.exec(stringQuery); if ((sqlOK) && (!_confirmed)) // First time a DXCC/Band/mode is worked { //qDebug() << "Awards::setAwardWAZst: _qsoId: " << QString::number(_qsoId) << "- 1" ; query.finish(); return 1; } else if ((sqlOK) && (_confirmed)) // First time a CQZ/Band/Mode is confirmed { //qDebug() << "Awards::setAwardWAZst: _qsoId: " << QString::number(_qsoId) << "- 2" ; query.finish(); return 2; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "Awards::setAwardWAZst: _qsoId: " << QString::number(_qsoId) << "- sqlOK ERROR: " ; //errorCode = query.lastError().nativeErrorCode(); query.finish(); //qDebug() << "Awards::setAwardWAZst: LastQuery: " << query.lastQuery() ; //qDebug() << "Awards::setAwardWAZst: LastError-data: " << query.lastError().databaseText() ; //qDebug() << "Awards::setAwardWAZst: LastError-driver: " << query.lastError().driverText() ; //qDebug() << "Awards::setAwardWAZst: LastError-n: " << QString::number(query.lastError().nativeErrorCode() ); } return -1; } */ /* int Awards::setAwardDXCCConfirmed(const int _band, const int _mode, const int _dxcc, const int _newQSOid) // Changes the status of a DXCC from worked to confirmed { //qDebug() << "Awards::setAwardDXCCConfirmed: " << QString::number(_band) << "/" << QString::number(_mode) << "/" << QString::number(_dxcc)<< "/" << QString::number(_newQSOid)<< QT_ENDL; QString stringQuery; QSqlQuery query = QSqlQuery(); bool sqlOK = false; int errorCode = -1; int nameCol = -1; QString aux = QString(); stringQuery = QString("SELECT qsoid FROM awarddxcc WHERE band='%1' AND mode='%2' AND dxcc='%3'").arg(_band).arg(_mode).arg(_dxcc); sqlOK = query.exec(stringQuery); if (sqlOK) { QSqlRecord rec = query.record(); if (query.next()) { if (query.isValid()) { nameCol = rec.indexOf("qsoid"); aux = (query.value(nameCol)).toString(); query.finish(); stringQuery = QString("UPDATE awarddxcc SET confirmed='1', qsoid='%1' WHERE qsoid='%2'").arg(_newQSOid).arg(aux); sqlOK = query.exec(stringQuery); if (sqlOK) { query.finish(); return _newQSOid; } else { // UPDATE failed emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); errorCode = query.lastError().nativeErrorCode(); query.finish(); //qDebug() << "Awards::setAwardDXCCConfirmed-Update: LastQuery: " << query.lastQuery() ; //qDebug() << "Awards::setAwardDXCCConfirmed-Update: LastError-data: " << query.lastError().databaseText() ; //qDebug() << "Awards::setAwardDXCCConfirmed-Update: LastError-driver: " << query.lastError().driverText() ; //qDebug() << "Awards::setAwardDXCCConfirmed-Update: LastError-n: " << QString::number(query.lastError().nativeErrorCode() ); return errorCode; } } else { // Not valid record //qDebug() << "Awards::setAwardDXCCConfirmed: Not valid record"; return -3; } } else { // Not next record //qDebug() << "Awards::setAwardDXCCConfirmed: Not next record"; return -2; } } else { // emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); errorCode = query.lastError().nativeErrorCode(); query.finish(); //qDebug() << "Awards::setAwardDXCCConfirmed: LastQuery: " << query.lastQuery() ; //qDebug() << "Awards::setAwardDXCCConfirmed: LastError-data: " << query.lastError().databaseText() ; //qDebug() << "Awards::setAwardDXCCConfirmed: LastError-driver: " << query.lastError().driverText() ; //qDebug() << "Awards::setAwardDXCCConfirmed: LastError-n: " << QString::number(query.lastError().nativeErrorCode() ); return errorCode; } return 1; } */ int Awards::setDXCCToQSO(const int _dxcc, const int _qsoid) // Defines the DXCC in a QSO { //qDebug() << "Awards::setDXCCToQSO: " << QString::number(_dxcc) << "/" << QString::number(_qsoid); //int errorCode = -1; QString queryString = QString("UPDATE log SET dxcc='%1' WHERE id='%2'").arg(_dxcc).arg(_qsoid); QSqlQuery query = QSqlQuery(); bool sqlOK = query.exec(queryString); if (sqlOK) { query.finish(); return 1; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "Awards::setDXCCToQSO: DXCC Updated in Log but failed...."; int errorCode = query.lastError().nativeErrorCode().toInt(); query.finish(); //qDebug() << "Awards::setDXCCToQSO: LastQuery: " << query.lastQuery() ; //qDebug() << "Awards::setDXCCToQSO: LastError-data: " << query.lastError().databaseText() ; //qDebug() << "Awards::setDXCCToQSO: LastError-driver: " << query.lastError().driverText() ; //qDebug() << "Awards::setDXCCToQSO: LastError-n: " << QString::number(query.lastError().nativeErrorCode() ); return errorCode; } } int Awards::setCQToQSO(const int _cqz, const int _qsoid) // Defines the CQ in a QSO { //qDebug() << "Awards::setCQToQSO: " << QString::number(_cqz) << "/" << QString::number(_qsoid); //int errorCode = -1; QString queryString = QString("UPDATE log SET cqz='%1' WHERE id='%2'").arg(_cqz).arg(_qsoid); QSqlQuery query = QSqlQuery(); bool sqlOK = query.exec(queryString); if (sqlOK) { query.finish(); return 1; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "Awards::setCQToQSO: DXCC Updated in Log but failed...."; int errorCode = query.lastError().nativeErrorCode().toInt(); query.finish(); //qDebug() << "Awards::setCQToQSO: LastQuery: " << query.lastQuery() ; //qDebug() << "Awards::setCQToQSO: LastError-data: " << query.lastError().databaseText() ; //qDebug() << "Awards::setCQToQSO: LastError-driver: " << query.lastError().driverText() ; //qDebug() << "Awards::setCQToQSO: LastError-n: " << QString::number(query.lastError().nativeErrorCode() ); return errorCode; } } bool Awards::getIsDXCCConfirmed(const int _dxcc, const int _logNumber) { // isDXCCConfirmed(const int _dxcc, const int _currentLog); return dataProxy->isDXCCConfirmed(_dxcc, _logNumber); } int Awards::getDXMarathonQSO(const int _year, const int _logNumber) { //qDebug() << "Awards::getDXMarathonQSO: " << QString::number(_year); return dxMarathon->getDXMarathonQSO(_year, _logNumber); } int Awards::getDXMarathonDXCC(const int _year, const int _logNumber) { //qDebug() << "Awards::getDXMarathonDXCC: " << QString::number(_year); return dxMarathon->getDXMarathonDXCC(_year, _logNumber); } int Awards::getDXMarathonCQ(const int _year, const int _logNumber) { //qDebug() << "Awards::getDXMarathonCQ: " << QString::number(_year); return dxMarathon->getDXMarathonCQ(_year, _logNumber); } int Awards::getDXMarathonScore(const int _year, const int _logNumber) { //qDebug() << "Awards::getDXMarathonScore: " << QString::number(_year); return dxMarathon->getDXMarathonScore(_year, _logNumber); } bool Awards::isDXMarathonNeed(const int _dxcc, const int _cq, const int _year, const int _logNumber) { return dxMarathon->neededForDXMarathon(_dxcc, _cq, _year, _logNumber); } int Awards::dxccStatusBand(const int _ent, const int _band, const int _logNumber) //-1 error / 0 Not worked / 1 worked / 2 confirmed { //-1 error / 0 Not worked / 1 worked / 2 confirmed //qDebug() << "Awards::dxccStatusBand: " << QString::number(_ent) << "/" << QString::number(_band); QSqlQuery query = QSqlQuery(); QString queryString = QString("SELECT DISTINCT qsl_rcvd, lotw_qsl_rcvd FROM log WHERE dxcc='%1' AND bandid='%2' AND lognumber='%4' ").arg(QString::number(_ent)).arg(QString::number(_band)).arg(QString::number(_logNumber)); int status = 0; //qDebug() << "Awards::dxccStatusBand: " << queryString; if (query.exec(queryString)) { while (query.next()) { if ( query.isValid() ) { if((query.value(0).toString() == "Y") || (query.value(1).toString() == "Y")) // Confirmed { query.finish(); return 2; } status = 1; } // Not present => Not worked } query.finish(); } else { //TODO: Manage the query error emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } //qDebug() << "Awards::dxccStatusBand: return - 0.3"; return status; // if arrives to here decision => not worked } /* int Awards::dxccStatusBand(const int _ent, const int _band, const int _logNumber) //-1 error / 0 Not worked / 1 worked / 2 confirmed { //-1 error / 0 Not worked / 1 worked / 2 confirmed //qDebug() << "Awards::dxccStatusBand: " << QString::number(_ent) << "/" << QString::number(_band); QSqlQuery query = QSqlQuery(); QString queryString = QString(); queryString = QString("SELECT confirmed FROM awarddxcc WHERE dxcc='%1' AND band='%2' AND lognumber='%4' ").arg(QString::number(_ent)).arg(QString::number(_band)).arg(QString::number(_logNumber)); int status = 0; if (query.exec(queryString)) { while (query.next()) { if ( query.isValid() ) { if(query.value(0).toString() == "1") // Confirmed { query.finish(); return 2; } else if(query.value(0).toString() == "0") // Worked { if (status < 1) { status = 1; } } } // Not present => Not worked } query.finish(); } else { //TODO: Manage the query error emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } //qDebug() << "Awards::dxccStatusBand: return - 0.3"; return status; // if arrives to here decision => not worked } */ int Awards::dxccStatusMode(const int _ent, const int _mode, const int _logNumber) //-1 error / 0 Not worked / 1 worked / 2 confirmed { //-1 error / 0 Not worked / 1 worked / 2 confirmed //qDebug() << "Awards::dxccStatusMode: " << QString::number(_ent) << "/" << QString::number(_mode); QSqlQuery query = QSqlQuery(); QString queryString = QString(); if (_mode == -1) { return -1; } int status = 0; queryString = QString("SELECT DISTINCT qsl_rcvd, lotw_qsl_rcvd FROM log WHERE dxcc='%1' AND modeid='%2' AND lognumber='%4' ").arg(QString::number(_ent)).arg(QString::number(_mode)).arg(QString::number(_logNumber)); if (query.exec(queryString)) { while (query.next()) { if ( query.isValid() ) { if((query.value(0).toString() == "Y") || (query.value(1).toString() == "Y")) // Confirmed { query.finish(); return 2; } status = 1; } // Not present => Not worked } query.finish(); } else { // The query fails... emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //TODO: Manage the query error return -1; } return status; // if arrives to here decision => not worked } /* int Awards::dxccStatusMode(const int _ent, const int _mode, const int _logNumber) //-1 error / 0 Not worked / 1 worked / 2 confirmed { //-1 error / 0 Not worked / 1 worked / 2 confirmed //qDebug() << "Awards::dxccStatusMode: " << QString::number(_ent) << "/" << QString::number(_mode); QSqlQuery query = QSqlQuery(); QString queryString = QString(); if (_mode == -1) { return -1; } int status = 0; queryString = QString("SELECT confirmed FROM awarddxcc WHERE dxcc='%1' AND mode='%2' AND lognumber='%4' ").arg(QString::number(_ent)).arg(QString::number(_mode)).arg(QString::number(_logNumber)); if (query.exec(queryString)) { while (query.next()) { if ( query.isValid() ) { if(query.value(0).toString() == "1") // Confirmed { query.finish(); return 2; } else if(query.value(0).toString() == "0") // Worked { if (status < 1) { status = 1; } } } // Not present => Not worked } query.finish(); } else { // The query fails... emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //TODO: Manage the query error return -1; } return status; // if arrives to here decision => not worked } */ void Awards::setManageModes(const bool _manageModes) { manageModes = _manageModes; } bool Awards::updateDXCCBandsStatus(const int _logNumber) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_logNumber); //QList dxccStatus; QSqlQuery query; QString stringQuery = QString(); bool sqlOK = false; //QString answer; if (_logNumber>0) { //stringQuery = QString("SELECT DISTINCT dxcc, bandid, qsl_rcvd, lotw_qsl_rcvd FROM log WHERE dxcc>0 AND lognumber='%1'ORDER BY dxcc").arg(_logNumber); stringQuery = QString("SELECT DISTINCT dxcc, bandid, qsl_rcvd, lotw_qsl_rcvd, id FROM log lognumber='%1'ORDER BY dxcc").arg(_logNumber); } else { stringQuery = QString("SELECT DISTINCT dxcc, bandid, qsl_rcvd, lotw_qsl_rcvd, id FROM log ORDER BY dxcc"); } int qsos = 0; sqlOK = query.exec(stringQuery); if (sqlOK) { //qDebug() << Q_FUNC_INFO << " - exec query: " << query.lastQuery (); dxccStatusList.clear(); while(query.next()) { if (query.isValid()) { qsos++; EntityBandStatus ent; if (query.value(0).toInt()==0) { //qDebug() << Q_FUNC_INFO << " - Returning false for: QSOid" << QString::number(query.value(4).toInt()); return false; } ent.dxcc = query.value(0).toInt(); ent.bandid = query.value(1).toInt(); if ((query.value(2).toString () == "Y") || (query.value(3).toString () == "Y")) { ent.confirmed = true; } else { ent.confirmed = false; } dxccStatusList.append (ent); } else { //qDebug() << Q_FUNC_INFO << ": query NOK: " << query.lastQuery (); query.finish(); return false; } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } query.finish(); if ((dxccStatusList.length ()<1) && (qsos>0)) { //qDebug() << Q_FUNC_INFO << " RETURN FALSE" ; // It may be the case that there are not dxcc return false; } else if (dxccStatusList.length ()<1) { //qDebug() << Q_FUNC_INFO << ": dxccStatusList length <1 "; } else if(qsos>0) { //qDebug() << Q_FUNC_INFO << ": qsos>0 "; } else { //qDebug() << Q_FUNC_INFO << ": ELSE"; } //qDebug() << Q_FUNC_INFO << ": dxccStatusList length: " << QString::number(dxccStatusList.length ()) ; //qDebug() << Q_FUNC_INFO << ": QSOs: " << QString::number(qsos) ; return true; } klog-2.3.3/searchwindow.cpp0000644000015700001710000010033714542412415015542 0ustar jenkinsjenkins /*************************************************************************** searchwindow.cpp - description ------------------- begin : sept 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "searchwindow.h" SearchWindow::SearchWindow(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "SearchWindow::SearchWindow: " ; dataProxy = dp; showStationCallsignInHeader = true; //sortingThroughProxyModel = false; searchModel = new SearchModel(dataProxy, this); util = new Utilities(Q_FUNC_INFO); connect(searchModel, SIGNAL(queryError(QString, QString, QString, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, QString, QString)) ); //logView = new QTableView; treeView = new QTreeView; //dxccStatusWidget = new DXCCStatusWidget(dataProxy); //elogClublog = new eLogClubLog(); currentLog = -1; //proxyModel = new LogViewSortFilterProxyModel(this); awards = new Awards(dataProxy, Q_FUNC_INFO); createUI(); createActions(); setDefaultData(); //qDebug() << "SearchWindow::SearchWindow: - END" ; } SearchWindow::~SearchWindow() { // emit clearError(); delete(dataProxy); delete(util); delete(awards); } void SearchWindow::sortColumn(const int _c) { //proxyModel->sort(_c); searchModel->sort(_c, Qt::AscendingOrder); } void SearchWindow::clear() { //qDebug() << "SearchWindow::clear " ; qslingNeeded = false; } void SearchWindow::createUI() { //qDebug() << "SearchWindow::createUI" ; //logView->setContextMenuPolicy(Qt::CustomContextMenu); //logView->setSortingEnabled(true); QStringList labels; if (showStationCallsignInHeader) { labels << tr("Call") << tr("Date/Time") << tr("Band") << tr("Mode") << tr("QSL Sent") << tr("QSL Rcvd") << tr("Station Callsign") << tr("ID") ; //treeView->setColumnCount(8); } else { labels << tr("Call") << tr("Date/Time") << tr("Band") << tr("Mode") << tr("QSL Sent") << tr("QSL Rcvd") << tr("ID") ; //treeView->setColumnCount(7); } //searchModel->setColumnsToDX(); /* QStandardItemModel model; model.setColumnCount (1); model.setHeaderData (0, Qt::Horizontal, "Player"); */ //treeView->setHeaderLabels(labels); //QTreeWidgetItem *item = new QTreeWidgetItem(searchResultsTreeWidget); (treeView->header())->resizeSections(QHeaderView::ResizeToContents); //treeView->clear(); //searchResultsTreeWidget->collapseAll(); treeView->setSortingEnabled(true); treeView->setContextMenuPolicy(Qt::CustomContextMenu); treeView->setSortingEnabled(true); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(treeView); //layout->addWidget(logView); setLayout(layout); } void SearchWindow::setDefaultData() { //qDebug() << "SearchWindow::setDefaultData" ; } void SearchWindow::setStationCallsignInHeader(const bool _h) { showStationCallsignInHeader = _h; setColumnsToDX(); } void SearchWindow::createlogPanel(const int _currentLog) { //qDebug() << "SearchWindow::createlogPanel: " << QString::number(_currentLog); currentLog = _currentLog; searchModel->createSearchModel(currentLog); treeView->setModel(searchModel); treeView->setCurrentIndex(searchModel->index(0, 0)); //logView->setModel(searchModel); //logView->setCurrentIndex(searchModel->index(0, 0)); //setProxyModel(false); //QString contestMode = dataProxy->getLogTypeOfUserLog(currentLog); setColumnsToDX(); sortColumn(1); //Initial sort by column 1 (date & time) //qDebug() << "SearchWindow::createlogPanel " << searchModel->record(0).field(1).value().toString(); //logView->setSelectionMode(QAbstractItemView::ExtendedSelection); //logView->setSelectionBehavior(QAbstractItemView::SelectRows); //logView->resizeColumnsToContents(); //logView->horizontalHeader()->setStretchLastSection(true); //logView->sortByColumn(1); treeView->setSelectionMode(QAbstractItemView::ExtendedSelection); treeView->setSelectionBehavior(QAbstractItemView::SelectRows); //treeView->resizeColumnsToContents(); //treeView->horizontalHeader()->setStretchLastSection(true); treeView->sortByColumn(1, Qt::AscendingOrder); } void SearchWindow::setColumnsToDX() { //qDebug() << "SearchWindow::setColumnsToDX" ; QString stringQuery; //stringQuery = QString("SELECT call, qso_date, bandid, modeid, qsl_sent, qsl_rcvd, station_callsign, id FROM log LIMIT 1"); stringQuery = QString("SELECT * FROM log LIMIT 1"); QSqlQuery query; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } //qDebug() << "SearchWindow::setColumnsToDX - Query: " << query.lastQuery(); QSqlRecord rec; rec = query.record(); // Number of columns int columns = rec.count(); for (int i=0; i < columns; i++) { //logView->setColumnHidden(i, true); treeView->setColumnHidden(i, true); } columns = rec.indexOf("qso_date"); treeView->setColumnHidden(columns, false); searchModel->setHeaderData(columns, Qt::Horizontal,tr("Date/time")); searchModel->setSort(columns, Qt::AscendingOrder); columns = rec.indexOf("call"); treeView->setColumnHidden(columns, false); searchModel->setHeaderData(columns, Qt::Horizontal,tr("Call")); columns = rec.indexOf("bandid"); searchModel->setBandIdColumn(columns); treeView->setColumnHidden(columns, false); searchModel->setRelation(columns, QSqlRelation("band", "id", "name")); searchModel->setHeaderData(columns, Qt::Horizontal,tr("Band")); columns = rec.indexOf("modeid"); treeView->setColumnHidden(columns, false); searchModel->setHeaderData(columns, Qt::Horizontal,tr("Mode")); searchModel->setRelation(columns, QSqlRelation("mode", "id", "submode")); searchModel->setModeIdColumn(columns); columns = rec.indexOf("qsl_sent"); treeView->setColumnHidden(columns, false); searchModel->setHeaderData(columns, Qt::Horizontal,tr("QSL Sent")); columns = rec.indexOf("qsl_rcvd"); treeView->setColumnHidden(columns, false); searchModel->setHeaderData(columns, Qt::Horizontal,tr("QSL Rcvd")); if (showStationCallsignInHeader) { columns = rec.indexOf("station_callsign"); treeView->setColumnHidden(columns, false); searchModel->setHeaderData(columns, Qt::Horizontal,tr("Station callsign")); } columns = rec.indexOf("dxcc"); searchModel->setDXCCColumn(columns); columns = rec.indexOf("lognumber"); searchModel->setLogNColumn(columns); //columns = rec.indexOf("id"); //treeView->setColumnHidden(columns, false); } void SearchWindow::refresh() { //qDebug() << "SearchWindow::refresh" ; searchModel->select(); } void SearchWindow::createActions() { createActionsCommon(); } void SearchWindow::createActionsCommon() { //LOG VIEW //connect(logView, SIGNAL(customContextMenuRequested( const QPoint& ) ), this, SLOT(slotRighButtonFromLog( const QPoint& ) ) ); //connect(logView, SIGNAL(doubleClicked ( const QModelIndex& ) ), this, SLOT(slotDoubleClickLog( const QModelIndex& ) ) ); connect(treeView, SIGNAL(customContextMenuRequested( const QPoint& ) ), this, SLOT(slotRighButtonFromLog( const QPoint& ) ) ); connect(treeView, SIGNAL(doubleClicked ( const QModelIndex& ) ), this, SLOT(slotDoubleClickLog( const QModelIndex& ) ) ); } void SearchWindow::slotRighButtonFromLog(const QPoint& pos) { //qDebug() << "SearchWindow::slotshowRighButtonFromLog: " << QString::number((treeView->indexAt(pos)).row()) ; //int row = (logView->indexAt(pos)).row(); int row = (treeView->indexAt(pos)).row(); //int _qsoID = ((searchModel->index(row, 0)).data(0)).toInt(); showMenuRightButtonFromLogCreateActions(); rightButtonFromLogMenu(row); //TODO: To be added to the SearchWindow and create an action that emist the QSO id } void SearchWindow::rightButtonFromLogMenu(const int row) { //qDebug() << "SearchWindow::slotshowRighButtonFromLogMenu: QSO_id: " << QString::number(row); int _qsoID = ((searchModel->index(row, 0)).data(0)).toInt(); //qDebug() << "SearchWindow::slotshowRighButtonFromLogMenu: QSOid: " << QString::number(_qsoID); bool qslReceived = isQSLReceived(_qsoID); bool qslSent = isQSLSent(_qsoID); QMenu menu(this); menu.addAction(delQSOFromLogAct); delQSOFromLogAct->setData(row); menu.addAction(qsoToEditFromLogAct); qsoToEditFromLogAct->setData(row); menu.addAction(checkQRZCOMFromLogAct); checkQRZCOMFromLogAct->setData(row); menu.addAction(checkDXHeatFromLogAct); checkDXHeatFromLogAct->setData(row); menu.addSeparator(); if (!qslSent) { QMenu *menuSentQsl = menu.addMenu(tr("QSL Send")); menuSentQsl->addAction(qslSentViaBureauFromLogAct); menuSentQsl->addAction(qslSentViaDirectFromLogAct); menuSentQsl->addAction(qslSentRequestedAct); if (!qslReceived) { menuSentQsl->addAction(qslSentViaBureauMarkRcvReqFromSearchAct); menuSentQsl->addAction(qslSentViaDirectMarkRcvReqFromSearchAct); qslSentViaBureauMarkRcvReqFromSearchAct->setData(row); qslSentViaDirectMarkRcvReqFromSearchAct->setData(row); } qslSentViaBureauFromLogAct->setData(row); qslSentViaDirectFromLogAct->setData(row); qslSentRequestedAct->setData(row); } if (!qslReceived) { QMenu *menuRecQsl = menu.addMenu(tr("QSL Rcvd")); menuRecQsl->addAction(qslRecViaBureauFromLogAct); if (!qslSent) { menuRecQsl->addAction(qslRecViaBureauMarkReqFromSearchAct); } menuRecQsl->addAction(qslRecViaDirectFromLogAct); if (!qslSent) { menuRecQsl->addAction(qslRecViaDirectMarkReqFromSearchAct); } menuRecQsl->addAction(qslRecRequestedAct); qslRecViaBureauFromLogAct->setData(row); qslRecViaBureauMarkReqFromSearchAct->setData(row); qslRecViaDirectFromLogAct->setData(row); qslRecViaDirectMarkReqFromSearchAct->setData(row); qslRecRequestedAct->setData(row); } menu.exec(QCursor::pos()); } void SearchWindow::slotDoubleClickLog(const QModelIndex & index) { //qDebug() << "SearchWindow::slotDoubleClickLog: Row: " << QString::number(index.row()) << "Column: " << QString::number(index.column()); int row = index.row(); //qsoToEdit((searchModel->index(row, 0)).data(0).toInt()); int qsoID = ((searchModel->index(row, Qt::DisplayRole)).data(0)).toInt(); //qDebug() << "SearchWindow::slotDoubleClickLog: n: " << QString::number (searchModel->data(index, Qt::DisplayRole).toInt()); //qDebug() << "SearchWindow::slotDoubleClickLog: emitted: " << QString::number (((searchModel->index(row, Qt::DisplayRole)).data(0)).toInt()); emit actionQSODoubleClicked(qsoID); //qsoToEdit((searchModel->index(row, 0)).data(0).toInt()); //TODO: To be added to the SearchWindow and create an action that emist the QSO id to be edited searchModel->select(); } bool SearchWindow::isQSLReceived(const int _qsoId) { //qDebug() << "SearchWindow::isQSLReceived: " << QString::number(_qsoId); return dataProxy->isQSOConfirmed(_qsoId, true, false); // We check just paper QSL //return dataProxy->isQSLReceived(_qsoId); } bool SearchWindow::isQSLSent(const int _qsoId) { //qDebug() << "SearchWindow::isQSLSent: " << QString::number(_qsoId); return dataProxy->isQSLSent(_qsoId); } void SearchWindow::showMenuRightButtonFromLogCreateActions() { //qDebug() << "SearchWindow::showMenuRightButtonFromLogCreateActions"; delQSOFromLogAct = new QAction(tr("&Delete"), this); delQSOFromLogAct->setStatusTip(tr("Delete a QSO")); connect(delQSOFromLogAct, SIGNAL(triggered()), this, SLOT(slotQsoDeleteFromLog())); qsoToEditFromLogAct = new QAction(tr("&Edit QSO"), this); qsoToEditFromLogAct->setStatusTip(tr("Edit this QSO")); connect(qsoToEditFromLogAct, SIGNAL(triggered()), this, SLOT(slotQSOToEditFromLog())); qslSentViaBureauFromLogAct = new QAction(tr("Via &bureau"), this); qslSentViaBureauFromLogAct->setStatusTip(tr("Send this QSL via bureau")); connect(qslSentViaBureauFromLogAct, SIGNAL(triggered()), this, SLOT( slotQSLSentViaBureauFromLog() )); qslSentViaDirectFromLogAct = new QAction(tr("D&irect"), this); qslSentViaDirectFromLogAct->setStatusTip(tr("Send this QSL via direct")); connect(qslSentViaDirectFromLogAct, SIGNAL(triggered()), this, SLOT( slotQSLSentViaDirectFromLog() )); qslRecViaBureauFromLogAct = new QAction(tr("Via bureau"), this); qslRecViaBureauFromLogAct->setStatusTip(tr("QSL &received via bureau")); connect(qslRecViaBureauFromLogAct, SIGNAL(triggered()), this, SLOT( slotQSLRecViaBureauFromLog() )); qslRecViaDirectFromLogAct = new QAction(tr("Direct"), this); qslRecViaDirectFromLogAct->setStatusTip(tr("QSL received via direc&t")); connect(qslRecViaDirectFromLogAct, SIGNAL(triggered()), this, SLOT( slotQSLRecViaDirectFromLog() )); checkQRZCOMFromLogAct = new QAction(tr("Check in QRZ.com"), this); checkQRZCOMFromLogAct->setStatusTip(tr("Check this callsign in QRZ.com")); connect(checkQRZCOMFromLogAct, SIGNAL(triggered()), this, SLOT( slotCheckQRZCom() )); checkDXHeatFromLogAct = new QAction(tr("Check in DXHeat.com"), this); checkDXHeatFromLogAct->setStatusTip(tr("Check this callsign in DXHeat.com")); connect(checkDXHeatFromLogAct, SIGNAL(triggered()), this, SLOT( slotCheckDXHeatCom() )); qslSentRequestedAct = new QAction(tr("&Request my QSL"), this); qslSentRequestedAct->setStatusTip(tr("Mark my QSL as requested")); connect(qslSentRequestedAct, SIGNAL(triggered()), this, SLOT( slotQSLSentMarkAsRequested() )); qslSentViaDirectMarkRcvReqFromSearchAct = new QAction(tr("Via Direct and mark DX QSL as requested"), this); qslSentViaDirectMarkRcvReqFromSearchAct->setStatusTip(tr("Send this QSL via direct and mark DX QSL as requested")); connect(qslSentViaDirectMarkRcvReqFromSearchAct, SIGNAL(triggered()), this, SLOT( slotQSLSentViaDirectMarkDXReqFromSearch() )); qslSentViaBureauMarkRcvReqFromSearchAct = new QAction(tr("Via Bureau and mark DX QSL as requested"), this); qslSentViaBureauMarkRcvReqFromSearchAct->setStatusTip(tr("Send this QSL via bureau and mark DX QSL as requested")); connect(qslSentViaBureauMarkRcvReqFromSearchAct, SIGNAL(triggered()), this, SLOT( slotQSLSentViaBureauMarkDXReqFromSearch() )); qslRecRequestedAct = new QAction(tr("&Request the QSL"), this); qslRecRequestedAct->setStatusTip(tr("Mark the QSL as requested")); connect(qslRecRequestedAct, SIGNAL(triggered()), this, SLOT( slotQSLRecMarkAsRequested() )); qslRecViaBureauMarkReqFromSearchAct = new QAction(tr("Via bureau and mark my QSL as requested"), this); qslRecViaBureauMarkReqFromSearchAct->setStatusTip(tr("QSL received via bureau and mark my QSL as requested")); connect(qslRecViaBureauMarkReqFromSearchAct, SIGNAL(triggered()), this, SLOT( slotQSLRecViaBureauMarkReqFromSearch() )); qslRecViaDirectMarkReqFromSearchAct = new QAction(tr("Direc&t and mark as my QSL requested"), this); qslRecViaDirectMarkReqFromSearchAct->setStatusTip(tr("QSL received via direct and mark my QSL as requested")); connect(qslRecViaDirectMarkReqFromSearchAct, SIGNAL(triggered()), this, SLOT( slotQSLRecViaDirectMarkReqFromSearch() )); } void SearchWindow::slotQSLSentViaBureauFromLog() { //qDebug() << "SearchWindow::slotQSLSentViaBureauFromLog: " << (qslSentViaBureauFromLogAct->data()).toString() << " - Id = " << QString::number( ((searchModel->index( ( (qslSentViaBureauFromLogAct->data()).toInt() ) , 0)).data(0).toInt()) ); int _qsoId = ((searchModel->index( ( (qslSentViaBureauFromLogAct->data()).toInt() ) , 0)).data(0).toInt()); qslSentViaBureau(_qsoId); searchModel->select(); } void SearchWindow::slotQSLSentViaDirectFromLog() { //qDebug() << "SearchWindow::slotQSLSentViaDirectFromLog: " << (qslSentViaDirectFromLogAct->data()).toString() << " - Id = " << QString::number( ((searchModel->index( ( (qslSentViaDirectFromLogAct->data()).toInt() ) , 0)).data(0).toInt()) ); int _qsoId = ((searchModel->index( ( (qslSentViaDirectFromLogAct->data()).toInt() ) , 0)).data(0).toInt()); //dataProxy->qslSentViaDirect(_qsoId, (QDateTime::currentDateTime()).toString("yyyy-MM-dd")); dataProxy->qslSentViaDirect(_qsoId, QDate::currentDate()); searchModel->select(); } void SearchWindow::slotQSLRecViaBureauFromLog() { //qDebug() << "SearchWindow::slotQSLRecViaBureauFromLog: "; int _qsoId = ((searchModel->index( ( (qslRecViaBureauFromLogAct->data()).toInt() ) , 0)).data(0).toInt()); qslRecViaBureau(_qsoId); searchModel->select(); //TODO: To be added to the SearchWindow and create an action that emist the QSO id } void SearchWindow::slotQSLRecViaDirectFromLog() { //qDebug() << "SearchWindow::slotQSLRecViaDirectFromLog: " << (qslRecViaDirectFromLogAct->data()).toString() << " - Id = " << QString::number( ((searchModel->index( ( (qslRecViaDirectFromLogAct->data()).toInt() ) , 0)).data(0).toInt()) ); int _qsoId = ((searchModel->index( ( (qslRecViaDirectFromLogAct->data()).toInt() ) , 0)).data(0).toInt()); qslRecViaDirect(_qsoId); searchModel->select(); // Mark Sent, Bureau, date, update log. //TODO: To be added to the SearchWindow and create an action that emist the QSO id } void SearchWindow::slotQSOToEditFromLog() { //qDebug() << "slotQSOToEditFromLog: " << (qsoToEditFromLogAct->data()).toString(); int QSOid = ((searchModel->index((qsoToEditFromLogAct->data()).toInt(), 0)).data(0)).toInt(); //int QSOid = qsoToEditFromLogAct->data().toInt(); emit actionQSODoubleClicked(QSOid); //TODO: To be added to the SearchWindow and create an action that emit the QSO id } /* void SearchWindow::deleteQSO(const int _qsoID) { //qDebug() << "SearchWindow::deleteQSO: " << QString::number(_qsoID); //int QSOid = (delQSOFromLogAct->data()).toInt(); emit actionDeleteQSO(_qsoID); elogClublog->deleteQSO(dataProxy->getClubLogRealTimeFromId(_qsoID)); dataProxy->deleteQSO(_qsoID); refresh(); searchModel->select(); emit updateAwards(); emit updateSearchText(); } */ void SearchWindow::slotQsoDeleteFromLog() { //qDebug() << "SearchWindow::slotQsoDeleteFromLog: qsoID1: " << QString::number((delQSOFromLogAct->data()).toInt()); int QSOid = ((searchModel->index((delQSOFromLogAct->data()).toInt(), 0)).data(0)).toInt(); //int QSOid = (delQSOFromLogAct->data()).toInt(); //qDebug() << "SearchWindow::slotQsoDeleteFromLog: qsoID1: " << QString::number(QSOid); //qDebug() << "SearchWindow::slotQsoDeleteFromLog: qsoID2: " << QString::number((delQSOFromLogAct->data()).toInt()); emit actionDeleteQSO(QSOid); searchModel->select(); } void SearchWindow::qslSentViaBureau(const int _qsoId) { //qDebug() << "SearchWindow::qslSentViaBureau: " << QString::number(_qsoId)yyyy-MM-dd dataProxy->qslSentViaBureau(_qsoId, QDate::currentDate()); searchModel->select(); } void SearchWindow::qslRecViaBureau(const int _qsoId) { // //qDebug() << "LogWyyyy-MM-ddRecViaBureau: " << QString::number(_qsoIyyyy-MM-dd<< (dateTime->currentDateTime()).toString("yyyy/MM/dd"); dataProxy->qslRecViaBureau(_qsoId, QDate::currentDate(), false); awards->setAwards(_qsoId); //Update the Award status searchModel->select(); //refresh(); emit updateAwards(); } void SearchWindow::qslRecViaDirect(const int _qsoId) { //qDebug() << "SearchWindow::qslRecViaDirect: " << QString::number(_qsoId)yyyy-MM-dd dataProxy->qslRecViaDirect(_qsoId, QDate::currentDate(), false); awards->setAwards(_qsoId); searchModel->select(); //refresh(); emit updateAwards(); } void SearchWindow::slotQueryErrorManagement(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery) { emit queryError(functionFailed, errorCodeS, nativeError, failedQuery); } void SearchWindow::slotCheckQRZCom() { QString _qrz = ((searchModel->index( ( (checkQRZCOMFromLogAct->data()).toInt() ) , 2)).data(Qt::DisplayRole).toString()); //qDebug() << "SearchWindow::sloTCheckQRZCom: " << _qrz; QString url = "https://www.qrz.com/db/" + _qrz; QDesktopServices::openUrl(QUrl(url)); } void SearchWindow::slotCheckDXHeatCom() { //int _qsoId = ((searchModel->index( ( (qslRecViaDirectFromLogAct->data()).toInt() ) , 0)).data(0).toInt()); //QString _qrz = dataProxy->getCallFromId(_qsoId); QString _qrz = ((searchModel->index( ( (checkDXHeatFromLogAct->data()).toInt() ) , 2)).data(Qt::DisplayRole).toString()); //qDebug() << "SearchWindow::slotCheckDXHeatCom(): " << _qrz; QString url = "https://www.dxheat.com/db/" + _qrz; QDesktopServices::openUrl(QUrl(url)); } void SearchWindow::setFilterString(const QString &_st) { //qDebug() << "SearchWindow::setFilterString: " << _st; searchModel->setFilterString(_st); //qDebug() << "SearchWindow::setFilterString: - END " ; } void SearchWindow::selectAll() { //qDebug() << "SearchWindow::selectAll: " << QString::number(searchModel->rowCount()); int rowCount = searchModel->rowCount(); //logView->selectAll(); treeView->selectAll(); for (int i=0;iselectRow(i); } } void SearchWindow::clearSelection() { //qDebug() << "SearchWindow::clearSelection"; //logView->clearSelection(); treeView->clearSelection(); } QList SearchWindow::getSelectedQSOs() { //qDebug() << "SearchWindow::getSelectedQSOs: (Total: " << QString::number(searchModel->rowCount()) << ")"<< QT_ENDL; QList selectedQSOs; //QModelIndexList selection = //logView->selectionModel()->selectedRows(); QModelIndexList selection = treeView->selectionModel()->selectedRows(); foreach (QModelIndex index, selection) { int row, qsoID; row = index.row(); qsoID = ((searchModel->index(row, 0)).data(0)).toInt(); selectedQSOs.append(qsoID); } //qDebug() << "SearchWindow::getSelectedQSOs: (Selected: (" << QString::number(selectedQSOs.count()) << ")"; return selectedQSOs; } void SearchWindow::slotQSLRecMarkAsRequested() { int _qsoId = ((searchModel->index((qslRecRequestedAct->data()).toInt(), 0)).data(0)).toInt(); dataProxy->qslRecAsRequested(_qsoId, QDate::currentDate()); if(qslingNeeded) { searchToolNeededQSLToSend(); } else { emit updateSearchLineEdit(); } searchModel->select(); } void SearchWindow::setNeedingQSL(bool const _q) { qslingNeeded = _q; } void SearchWindow::slotToolSearchQSL(const int actionQSL) { //qDebug() << "SearchWidget::slotToolSearchQSL: " << QString::number(actionQSL) << " - LogNumber: " << QString::number(currentLog); // 2 means QSL_RCVD = 'R' QString stringQuery = QString(); QString message = QString(); QString aux = QString(); QString filter; filter = QString(); //int i = -1; switch (actionQSL) { case 0://void searchToolNeededQSLToSend(); //qDebug() << "SearchWidget::slotToolSearchQSL: CASE 0"; stringQuery = QString("SELECT call, qso_date,dxcc, bandid, modeid, qsl_sent, qsl_rcvd, lotw_qsl_rcvd, station_callsign, id FROM log WHERE (qsl_rcvd<>'Y' AND lotw_qsl_rcvd<>'Y') AND qsl_sent<>'Y' AND qsl_sent<>'Q' AND qsl_sent<>'R' AND lognumber='%1' AND (bandid, dxcc) NOT IN (SELECT distinct bandid, dxcc from log WHERE qsl_rcvd='Y' OR lotw_qsl_rcvd='Y')").arg(currentLog); //stringQuery = QString("SELECT call, qso_date, bandid, modeid, qsl_sent, qsl_rcvd, station_callsign, log.id FROM log JOIN awarddxcc ON awarddxcc.qsoid=log.id WHERE awarddxcc.confirmed='0' AND log.qsl_sent!='Y' AND log.qsl_sent!='Q' AND log.qsl_sent!='R' AND log.lognumber='%1'").arg(currentLog); message = tr("Needed QSO to send the QSL"); setNeedingQSL(true); //qslingNeeded = true; emit requestFocus(); break; case 1: //qDebug() << "SearchWidget::slotToolSearchQSL: CASE 1"; filter = QString("qsl_sent=='R' AND lognumber='%1'").arg(currentLog); message = tr("My QSL requested to be sent"); break; case 2://void slotToolSearchNeededQSLPendingToReceive(); //qDebug() << "SearchWidget::slotToolSearchQSL: CASE 2"; filter = QString("lognumber='%1' AND ( (qsl_sent='Y' AND qsl_rcvd!='Y' AND qsl_rcvd!='I') OR qsl_rcvd='R')").arg(currentLog); message = tr("DX QSL pending to be received"); break; case 3://void slotToolSearchNeededQSLRequested() //qDebug() << "SearchWidget::slotToolSearchQSL: CASE 3"; filter = QString("WHERE lognumber='%1' AND qsl_rcvd='R'").arg(currentLog); message = tr("DX QSL pending to be received"); break; default: //qDebug() << "SearchWidget::slotToolSearchQSL: CASE DEFAULT"; // should never be reached return; // break; } clear(); setFilterString(filter); } void SearchWindow::searchToolNeededQSLToSend() { //qDebug() << "SearchWidget::slotToolSearchQSLToSend - TO PREPARE THE QUERY and optimize the function"; slotToolSearchQSL(0); //qDebug() << "SearchWidget::slotToolSearchQSLToSend - END"; } void SearchWindow::slotQSLSentMarkAsRequested() { //qDebug() << "SearchWindow::slotQSLSentMarkAsRequested: " << QString::number( (qslSentRequestedAct->data()).toInt() ); // bool qslSentAsRequested(const int _qsoId, const QString &_updateDate); int _qsoId = ((searchModel->index((qslSentRequestedAct->data()).toInt(), 0)).data(0)).toInt(); dataProxy->qslSentAsRequested(_qsoId, QDate::currentDate()); if(qslingNeeded) { slotToolSearchQSL(0); } else { emit updateSearchText(); } searchModel->select(); } void SearchWindow::slotQSLSentViaDirectMarkDXReqFromSearch() { //qDebug() << "slotQSLSentViaDirectMarkDXReqFromSearch: "; int _qsoId = ((searchModel->index((qslSentViaDirectMarkRcvReqFromSearchAct->data()).toInt(), 0)).data(0)).toInt(); //int _qsoId = (qslSentViaDirectMarkRcvReqFromSearchAct->data()).toInt(); dataProxy->qslSentViaDirect(_qsoId, QDate::currentDate()); dataProxy->qslRecAsRequested(_qsoId, QDate::currentDate()); if(qslingNeeded) { slotToolSearchQSL(0); } else { emit updateSearchText(); } searchModel->select(); // Mark Sent, Bureau, date, update log. } void SearchWindow::slotQSLSentViaBureauMarkDXReqFromSearch() { //qDebug() << "slotQSLSentViaBureauMarkDXReqFromSearch: " << QString::number( (qslSentViaBureauMarkRcvReqFromSearchAct->data()).toInt() ); //int _qsoId = (qslSentViaBureauMarkRcvReqFromSearchAct->data()).toInt(); int _qsoId = ((searchModel->index((qslSentViaBureauMarkRcvReqFromSearchAct->data()).toInt(), 0)).data(0)).toInt(); dataProxy->qslSentViaBureau(_qsoId, QDate::currentDate()); dataProxy->qslRecAsRequested(_qsoId, QDate::currentDate()); if(qslingNeeded) { slotToolSearchQSL(0); } else { emit updateSearchText(); } searchModel->select(); //qDebug() << "slotQSLSentViaBureauMarkDXReqFromSearch: - END "; // Mark Sent, Bureau, date, update log. } void SearchWindow::slotQSLRecViaBureauMarkReqFromSearch() { //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog - Start"; //int _qsoId = (qslRecViaBureauMarkReqFromSearchAct->data()).toInt(); int _qsoId = ((searchModel->index((qslRecViaBureauMarkReqFromSearchAct->data()).toInt(), 0)).data(0)).toInt(); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 01"; //qslRecViaBureauMarkReq(_qsoId); dataProxy->qslRecViaBureau(_qsoId, QDate::currentDate(), true); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 02: n: " << QString::number(_qsoId); if(qslingNeeded) { //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 03"; slotToolSearchQSL(0); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 04"; } else { //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 05"; emit updateSearchText(); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 06"; } searchModel->select(); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 07"; } void SearchWindow::slotQSLRecViaDirectMarkReqFromSearch() { //qDebug() << "SearchWidget::slotQSLRecViaDirectFromLog: "; //int _qsoId = (qslRecViaDirectMarkReqFromSearchAct->data()).toInt(); int _qsoId = ((searchModel->index((qslRecViaDirectMarkReqFromSearchAct->data()).toInt(), 0)).data(0)).toInt(); //qslRecViaDirectMarkReq(_qsoId); dataProxy->qslRecViaDirect(_qsoId, QDate::currentDate(), true); if(qslingNeeded) { slotToolSearchQSL(0); } else { emit updateSearchText(); } searchModel->select(); // Mark Sent, Bureau, date, update log. } /* void SearchWindow::qslRecViaBureauMarkReq(const int _qsoId) { //qDebug() << "SearchWidget::qslRecViaBureau: " << QString::number(_qsoId) << "/" << QDate::currentDate(); dataProxy->qslRecViaBureau(_qsoId, QDate::currentDate(), true); //qDebug() << "SearchWidget::qslRecViaBureau: END"; } */ /* void SearchWindow::qslRecViaDirectMarkReq(const int _qsoId) { //qDebug() << "SearchWidget::qslRecViaDirect: " << QString::number(_qsoId); dataProxy->qslRecViaDirect(_qsoId, QDate::currentDate(), true); } */ /* void SearchWindow::colorTheList() { //qDebug() << "SearchWidget::colorTheList: " << QString::number(treeView->model()->rowCount()); for (int i = 0; i < treeView->model()->rowCount(); i++) { //QString _qrz = ((searchModel->index( ( (qslRecViaDirectFromLogAct->data()).toInt() ) , 0)).data(1).toString()); QString _qrz = (searchModel->index(i, 2)).data(Qt::DisplayRole).toString(); //QColor getQRZDXStatusColor(const QStringList &_qs); // Receives Entity, band, mode & log //QColor color = awards->getQRZDXStatusColor() QColor color = QColor(Qt::blue); //searchModel->setItemData(searchModel->index(i, 2), color); //qDebug() << "SearchWidget::colorTheList: " << _qrz; } } */ void SearchWindow::setColors (const QString &_newOne, const QString &_needed, const QString &_worked, const QString &_confirmed, const QString &_default) { //qDebug() << "DXClusterWidget::setColors: " << _newOne << "/" << _needed << "/" << _worked << "/" << _confirmed << "/" << _default; // Just to pass the colors to the awards class searchModel->setColors(_newOne, _needed, _worked, _confirmed, _default); } klog-2.3.3/udpserver.cpp0000644000015700001710000006535614542412415015077 0ustar jenkinsjenkins/*************************************************************************** udpserver.cpp - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles user : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "udpserver.h" #include //https://sourceforge.net/p/wsjt/wsjtx/ci/master/tree/UDPExamples/MessageServer.cpp // Read Network\NetworkMessage.hpp in the WSJT-x sources wsjtx UDPServer::UDPServer(QObject *parent) : QObject(parent) { //qDebug() << "UDPServer::UDPServer" ; //address = QString("127.0.0.1"); port = 2237; haveNetworkInterface = false; socketServer = new QUdpSocket(this); groupAddress = QHostAddress::Any; networkInterface = QNetworkInterface(); /* //if (socketServer->bind(QHostAddress::AnyIPv4, port, QAbstractSocket::ShareAddress)) if (socketServer->bind(port, QAbstractSocket::ShareAddress)) { //qDebug() << "UDPServer::UDPServer - Multicast group joined OK" ; } else { //qDebug() << "UDPServer::UDPServer - Multicast group joined NOK" ; } */ util = new Utilities(Q_FUNC_INFO); logging = false; realtime = false; connect(socketServer,SIGNAL(readyRead()),this,SLOT(slotReadPendingDatagrams())); } UDPServer::~UDPServer() { delete(util); } void UDPServer::slotReadPendingDatagrams() { //qDebug() << "UDPServer::slotReadPendingDatagrams" ; while (socketServer->hasPendingDatagrams()) { QByteArray datagram; datagram.resize(socketServer->pendingDatagramSize()); QHostAddress sender; quint16 senderPort; //qDebug() << "UDPServer::slotReadPendingDatagrams: length = " << QString::number(socketServer->pendingDatagramSize()); socketServer->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort); parse (datagram); //qDebug() << "UDPServer::slotReadPendingDatagrams: = " << datagram; } } bool UDPServer::start() { //qDebug() << "UDPServer::start "; if ( (port>0) && (port<65535) ) { //qDebug() << "UDPServer::start: calling startNow "; return startNow(port, groupAddress); } else { //qDebug() << "UDPServer::start FALSE"; return false; } } bool UDPServer::startNow(quint16 _port, QHostAddress const& _multicast_group_address) { //qDebug() << "UDPServer::startNow "; //if ((_port != port) || (_multicast_group_address != groupAddress)) if (1) { //qDebug() << "UDPServer::startNow starting..."; leaveMultiCastGroup(); if (socketServer->state() == QAbstractSocket::BoundState) { //qDebug() << "UDPServer::startNow: closing socket"; socketServer->close(); } groupAddress = _multicast_group_address; auto address = _multicast_group_address.isNull () || QAbstractSocket::IPv4Protocol != groupAddress.protocol () ? QHostAddress::Any : QHostAddress::AnyIPv4; Q_UNUSED(address); if (_port && socketServer->bind(groupAddress, _port, QAbstractSocket::ShareAddress | QAbstractSocket::ReuseAddressHint)) { port = _port; joinMultiCastGroup(); } else { //qDebug() << "UDPServer::startNow port = 0"; port = 0; } } else { //qDebug() << "UDPServer::startNow exiting with an error... "; } //qDebug() << "UDPServer::startNow finalizing... "; return socketServer->isValid(); } void UDPServer::joinMultiCastGroup() { //qDebug() << "UDPServer::joinMultiCastGroup: "; if (!haveNetworkInterface) { return; } if ((socketServer->state() == QAbstractSocket::BoundState) && (!groupAddress.isNull()) && groupAddress.isMulticast() ) { auto mcast_interface = socketServer->multicastInterface(); if (( groupAddress.protocol() == QAbstractSocket::IPv4Protocol ) && (socketServer->localAddress().protocol() != QAbstractSocket::IPv4Protocol )) { socketServer->close(); socketServer->bind(QHostAddress::AnyIPv4, port, QAbstractSocket::ShareAddress | QAbstractSocket::ReuseAddressHint); if (socketServer->isValid()) { //qDebug() << "UDPServer::joinMultiCastGroup socket valid"; } } bool joined {false}; /* QList interfaces; interfaces.clear(); interfaces.append(QNetworkInterface::allInterfaces()); for (int i = 0; i < interfaces.size(); ++i) { socketServer->setMulticastInterface(interfaces.at(i)); joined |= socketServer->joinMulticastGroup(groupAddress, interfaces.at(i)); } */ socketServer->setMulticastInterface(networkInterface); joined |= socketServer->joinMulticastGroup(groupAddress, networkInterface); if (!joined) { groupAddress.clear(); } socketServer->setMulticastInterface(mcast_interface); } //qDebug() << "UDPServer::joinMultiCastGroup - END"; } void UDPServer::leaveMultiCastGroup() { //qDebug() << "UDPServer::leaveMultiCastGroup"; if (groupAddress.isNull() && socketServer->state() && groupAddress.isMulticast()) { QList interfaces; interfaces.clear(); interfaces.append(QNetworkInterface::allInterfaces()); for (int i = 0; i < interfaces.size(); ++i) { socketServer->leaveMulticastGroup(groupAddress, interfaces.at(i)); } } //qDebug() << "UDPServer::leaveMultiCastGroup - END"; } bool UDPServer::isStarted() { return socketServer->isValid(); } void UDPServer::parse(const QByteArray &msg) { //qDebug() << "UDPServer::parse: " << msg; //qDebug() << "UDPServer::parse: " << QString::fromStdString(msg.toStdString()); //in >> time_off >> dx_call >> dx_grid >> frequency >> mode >> report_sent >> report_received >> // tx_power >> comments >> name >> time_on >> operatorCall >> de_call >> de_grid >> // exchange_sent >> exchange_received; quint32 magic; quint32 schema; quint32 type; QByteArray id; QByteArray adifReceived; QDateTime time_off, time_on; QByteArray dx_call; QByteArray operatorCall; QByteArray dx_grid; quint64 frequency = 0; // In Hz?? double frequencyDouble; QByteArray mode; QByteArray report_sent; QByteArray report_received; QByteArray exchange_sent; QByteArray exchange_received; QByteArray tx_power; QByteArray comments; QByteArray name; //QByteArray time_on; // Note: LOTW uses TIME_ON for their +/- 30-minute time QByteArray report; QByteArray tx_mode; bool tx_enabled = false; bool transmitting = false; bool decoding = false; // WSPRDecode bool newDecode = false; QTime time; qint32 snr; double deltaTime = 0.0; qint32 drift; QByteArray decodedCall, decodedGrid; qint32 power; bool offAir; // DECODE QByteArray message; bool lowConfidence = false; qint32 rx_df = -1; // Delta frequency qint32 tx_df = -1; // Delta time QByteArray de_call; QByteArray de_grid; bool watchdog_timeout = false; QByteArray sub_mode; bool fast_mode = false; quint8 specialOpMode; quint32 freqTolerance; quint32 TRPeriod; QByteArray confName; QDataStream in(msg); //QDataStream out(msgOut, QIODevice::ReadWrite); in.setVersion(16); in.setByteOrder(QDataStream::BigEndian); in >> magic >> schema >> type >> id; //QByteArray ba4(QByteArray::fromRawData(cart, 6)); //in.readRawData(type, size) //qDebug() << "UDPServer::parse: - Magic = " << QString::number(magic); //qDebug() << "UDPServer::parse: - schema = " << QString::number(schema); //qDebug() << "UDPServer::parse: - type = " << QString::number(type); //qDebug() << "UDPServer::parse: - id = " << id; //if ((magic != 2914831322) || (id != "WSJT-X")) if (magic != 2914831322) { //qDebug() << "UDPServer::parse: - Magic BAD FORMAT = " << QString::number(magic); return; } //qDebug() << "UDPServer::parse: TYPE: " << QString::number(type); switch (type) { case Heartbeat: //qDebug() << "UDPServer::parse: - type = " << QString::number(type) << " - OUT/IN - Heartbeat"; break; case Status: //qDebug() << "UDPServer::parse: - type" << QString::number(type) << " - OUT - Status"; // unpack message //in >> ch; if (realtime) { in >> frequency >> mode >> dx_call >> report >> tx_mode >> tx_enabled >> transmitting >> decoding >> rx_df >> tx_df >> de_call >> de_grid >> dx_grid >> watchdog_timeout >> sub_mode >> fast_mode >> specialOpMode >> freqTolerance >> TRPeriod >> confName; frequencyDouble = (double)frequency; frequencyDouble = frequencyDouble/1000000; // Change to MHz //if (!util->isValidCall(dx_call)) // { // //qDebug() << "UDPServer::parse: Status : Call not valid: -" << dx_call << "-"; // return; //} //qDebug() << "UDPServer::parse: Status - Freq double = " << QString::number(frequencyDouble) ; //qDebug() << "UDPServer::parse: Status - Mode = " << mode; //qDebug() << "UDPServer::parse: Status - DXCall = " << dx_call; //qDebug() << "UDPServer::parse: Status - Report = " << report; //qDebug() << "UDPServer::parse: Status - Rx DF = " << rx_df; //qDebug() << "UDPServer::parse: Status - Tx DF = " << tx_df; //qDebug() << "UDPServer::parse: Status - De_Call = " << de_call; //qDebug() << "UDPServer::parse: Status - De_Grid = " << de_grid; //qDebug() << "UDPServer::parse: Status - SubMode = " << sub_mode; //qDebug() << "UDPServer::parse: Status - SpecialOp = " << QString::number(specialOpMode); //qDebug() << "UDPServer::parse: Status - Freq Tol = " << QString::number(freqTolerance); //qDebug() << "UDPServer::parse: Status - T/R Period = " << QString::number(TRPeriod); //qDebug() << "UDPServer::parse: Status - Conf Name = " << confName; emit status_update (type, dx_call, frequencyDouble, mode, report, de_call, de_grid, dx_grid, sub_mode); } else { //qDebug() << "UDPServer::parse: realtime = FALSE"; } break; case Decode: //() << "UDPServer::parse: - type = " << QString::number(type) << " - OUT - Decode"; in >> newDecode >> time >> snr >> deltaTime >> drift >> mode >> message >> lowConfidence >> offAir; if (lowConfidence) { //qDebug() << "UDPServer::parse: Decode - Low Confidence"; } else { //qDebug() << "UDPServer::parse: Decode - Time = " << time.toString("hhmmss"); //qDebug() << "UDPServer::parse: Decode - SNR = " << QString::number(snr); //qDebug() << "UDPServer::parse: Decode - Delta = " << QString::number(deltaTime); //qDebug() << "UDPServer::parse: Decode - Drift = " << QString::number(drift); //qDebug() << "UDPServer::parse: Decode - Mode = " << mode; //qDebug() << "UDPServer::parse: Decode - Msg = " << message; } break; case Clear: //qDebug() << "UDPServer::parse: - type = " << QString::number(type) << " - OUT - Clear"; emit clearSignal(Q_FUNC_INFO); break; case Reply: //qDebug() << "UDPServer::parse: - type = " << QString::number(type) << " - IN - Replay "; break; case QSOLogged: //qDebug() << "UDPServer::parse: - type = QSOLogged " ; in >> time_off >> dx_call >> dx_grid >> frequency >> mode >> report_sent >> report_received >> tx_power >> comments >> name >> time_on >> operatorCall >> de_call >> de_grid >> exchange_sent >> exchange_received; //qDebug() << "UDPServer::parse: QSOLogged - Time_off = " << time_off.toString("yyyyMMdd-hhmmss"); //qDebug() << "UDPServer::parse: QSOLogged - DXCall = " << dx_call; //qDebug() << "UDPServer::parse: QSOLogged - Grid = " << dx_grid; //qDebug() << "UDPServer::parse: QSOLogged - Freq = " << QString::number(frequency); //qDebug() << "UDPServer::parse: QSOLogged - Mode = " << mode; //qDebug() << "UDPServer::parse: QSOLogged - ReportSent = " << report_sent; //qDebug() << "UDPServer::parse: QSOLogged - ReportReceived = " << report_received; //qDebug() << "UDPServer::parse: QSOLogged - TX_PWR = " << tx_power; //qDebug() << "UDPServer::parse: QSOLogged - Comments = " << comments; //qDebug() << "UDPServer::parse: QSOLogged - Name = " << name; //qDebug() << "UDPServer::parse: QSOLogged - Time = " << time_on.toString("yyyyMMdd-hhmmss"); //qDebug() << "UDPServer::parse: QSOLogged - DeCall = " << de_call; //qDebug() << "UDPServer::parse: QSOLogged - DeGrid = " << de_grid; //qDebug() << "UDPServer::parse: QSOLogged - Exch Sent = " << exchange_sent; //qDebug() << "UDPServer::parse: QSOLogged - Exch Recv = " << exchange_received; if (logging) { //qDebug() << "UDPServer::parse: logging = true "; //qDebug() << "UDPServer::parse: QSO to be logged: Time_on: " << time_on; //qDebug() << "UDPServer::parse: QSO to be logged: Time_off: " << time_off; frequencyDouble = (double)frequency; frequencyDouble = frequencyDouble/1000000; // Change to MHz //qDebug() << "UDPServer::parse: Data to be logged: Comment: " << comments; //dateTime.setDate(QDate::currentDate()); //dateTime.setTime(QTime::fromString(time_on, "hhmmss")); //dateTimeOff.setDate(QDate::currentDate()); //dateTimeOff.setTime(QTime::fromString(time_off, "hhmmss")); emit logged_qso(dx_call, mode, QString(), frequencyDouble, de_grid, dx_grid, report_sent, report_received, comments, de_call, name, operatorCall, time_on, time_off, exchange_sent, exchange_received, tx_power); } else { //qDebug() << "UDPServer::parse: logging = false"; } break; case Close: //qDebug() << "UDPServer::parse: - type = Close" ; socketServer->close(); //qDebug() << "UDPServer::parse: - type = " << QString::number(type) << " - OUT - Close "; break; case Replay: //qDebug() << "UDPServer::parse: - type = Reply" ; //qDebug() << "UDPServer::parse: - type = " << QString::number(type) << " - IN - Replay"; break; case HaltTx: //qDebug() << "UDPServer::parse: - type = HaltTx" ; //qDebug() << "UDPServer::parse: - type = " << QString::number(type) << " - IN - Halt TX"; break; case FreeText: //qDebug() << "UDPServer::parse: - type = FreeText" ; //qDebug() << "UDPServer::parse: - type = " << QString::number(type) << " - IN - Free Text"; break; case WSPRDecode: //qDebug() << "UDPServer::parse: - type = WSPRDecode" ; in >> newDecode >> time >> snr >> deltaTime >> frequency >> drift >> decodedCall >> decodedGrid >> power >> offAir; //qDebug() << "UDPServer::parse: WSPRDecode - Time = " << time.toString("yyyyMMdd-hhmmss"); //qDebug() << "UDPServer::parse: WSPRDecode - SNR = " << QString::number(snr); //qDebug() << "UDPServer::parse: WSPRDecode - Delta = " << QString::number(deltaTime); //qDebug() << "UDPServer::parse: WSPRDecode - Frec = " << QString::number(frequency); //qDebug() << "UDPServer::parse: WSPRDecode - Drift = " << QString::number(drift); //qDebug() << "UDPServer::parse: WSPRDecode - Call = " << decodedCall; //qDebug() << "UDPServer::parse: WSPRDecode - Grid = " << decodedGrid; //qDebug() << "UDPServer::parse: WSPRDecode - Power = " << QString::number(power); break; case Location: //qDebug() << "UDPServer::parse: - type = Location" ; break; case LoggedADIF: //qDebug() << "UDPServer::parse: - type = LoggedADIF" ; //qDebug() << "UDPServer::parse: - type = " << QString::number(type) << " - ADIF"; //in >> adifReceived; //adifParse(adifReceived); //qDebug() << "UDPServer::parse: ADIF: " << adifReceived; // Q_SIGNAL void logged_ADIF (QString const& id, QByteArray const& ADIF); break; case HighlightCallsign: //qDebug() << "UDPServer::parse: - type = HighlightCallsign" ; break; case SwitchConfiguration: //qDebug() << "UDPServer::parse: - type = SwitchConfiguration" ; break; case Configure: //qDebug() << "UDPServer::parse: - type = Configure" ; break; default: //NO //qDebug() << "UDPServer::parse: - type = " << QString::number(type) << " - ERROR on Type"; break; } //qDebug() << "UDPServer::parse: - Magic: = " << QString::number(magic); } bool UDPServer::stop() { //qDebug() << "UDPServer::stop"; socketServer->close(); if (socketServer->isValid()) { return false; } else { return true; } } void UDPServer::setPort(const int _port) { //qDebug() << "UDPServer::setPort: " << QString::number(_port); if ((_port >= 0) && (_port<=65535)) { port = _port; } } void UDPServer::setNetworkInterface(const QString &_t) { //qDebug() << "UDPServer::setNetworkInterface: " << _t; QString testInterface; testInterface.clear(); QList ifaces; ifaces.clear(); ifaces << QNetworkInterface::allInterfaces(); foreach (QNetworkInterface i, ifaces) { testInterface = i.humanReadableName() + "-" + i.hardwareAddress(); if (testInterface.contains(_t)) { //qDebug() << "UDPServer::setNetworkInterface: FOUND! " << testInterface ; if ((i.flags().testFlag(QNetworkInterface::IsUp)) ) { networkInterface = i; haveNetworkInterface = true; } } } } void UDPServer::adifParse(QByteArray &msg) { //qDebug() << "UDPServer::adifParse: " << msg << QT_ENDL; QString dx_call = QString(); QString mode = QString(); QString band = QString(); QString mygrid = QString(); QString dxgrid = QString(); QString rstTX = QString(); QString rstRX = QString(); QString _comment = QString(); QString _name = QString(); QString _exchangeTX = QString(); QString _exchangeRX = QString(); QString _myPWR = QString(); QString operatorCall = QString(); QString stationcallsign = QString(); double freq = 0.0; QDateTime datetime, datetime_off; QDate _date_on, _date_off; QTime _time_on, _time_off; QStringList adifLine; adifLine.clear(); QString line = QString(msg); adifLine << line.split('<'); //qDebug() << "UDPServer::adifParse: before the while" << QT_ENDL; for (int i = 0; i < adifLine.length() ;i++) { //qDebug() << "UDPServer::adifParse: While-1" << QT_ENDL; QString type, data; QStringList field; field.clear(); //qDebug() << "UDPServer::adifParse: While-2" << QT_ENDL; QString aux = "<" + adifLine.at(i); //qDebug() << "UDPServer::adifParse: While-3" << QT_ENDL; field.clear(); field << util->getValidADIFFieldAndData(aux); if (field.length()==2) { //qDebug() << "UDPServer::adifParse: While-4" << QT_ENDL; type = (field.at(0)).toUpper(); //qDebug() << "UDPServer::adifParse: While-5" << QT_ENDL; data = field.at(1); //qDebug() << "UDPServer::adifParse: While-6" << QT_ENDL; if (type == "CALL") { dx_call = data; } else if (type == "GRIDSQUARE") { //qDebug() << "UDPServer::adifParse: Rec Grid: " << data << QT_ENDL; if (util->isValidGrid(data)) { dxgrid = data; //qDebug() << "UDPServer::adifParse: Rec Grid to export: " << dxgrid << QT_ENDL; } else { //qDebug() << "UDPServer::adifParse: INVALID GRID: " << dxgrid << QT_ENDL; } } else if (type == "MY_GRIDSQUARE") { //qDebug() << "UDPServer::adifParse: Rec mGrid: " << data << QT_ENDL; if (util->isValidGrid(data)) { mygrid = data; //qDebug() << "UDPServer::adifParse: Rec mGrid to export: " << mygrid << QT_ENDL; } else { //qDebug() << "UDPServer::adifParse: INVALID mGRID: " << mygrid << QT_ENDL; } } else if (type == "MODE") { mode = data; } else if (type == "RST_SENT") { rstRX = data; } else if (type == "RST_RCVD") { rstTX = data; } else if (type == "QSO_DATE") { _date_on = util->getDateFromADIFDateString(data); } else if (type == "TIME_ON") { _time_on = util->getTimeFromADIFTimeString(data); } else if (type == "QSO_DATE_OFF") { _date_off = util->getDateFromADIFDateString(data); } else if (type == "TIME_OFF") { _time_off = util->getTimeFromADIFTimeString(data); } else if (type == "COMMENT") { _comment = data; } else if (type == "BAND") { band = data; } else if (type == "OPERATOR") { operatorCall = data; } else if (type == "FREQ") { freq = data.toDouble(); } else if (type == "STATION_CALLSIGN") { stationcallsign = data; } else if (type == "NAME") { stationcallsign = data; } else if (type == "EOR") { if (_date_on.isValid() && _time_on.isValid()) { datetime.setDate(_date_on); datetime.setTime(_time_on); } else { datetime = QDateTime(); } if (_date_off.isValid() && _time_off.isValid()) { datetime_off.setDate(_date_off); datetime_off.setTime(_time_off); } else { datetime_off = QDateTime(); } //qDebug() << "UDPServer::adifParse: Emitting" << QT_ENDL; if ((freq < 0.1) && (band.length ()<2)) { return; } emit logged_qso (dx_call, mode, band, freq, mygrid, dxgrid, rstTX, rstRX, _comment, stationcallsign, _name, operatorCall, datetime, datetime_off, _exchangeTX, _exchangeRX, _myPWR); return; } else { //qDebug() << "UDPServer::adifParse: NON captured ADIF type: " << type << QT_ENDL; //qDebug() << "UDPServer::adifParse: NON captured ADIF data: " << data << QT_ENDL; } } else { //qDebug() << "UDPServer::adifParse: Not a valid ADIF pair " << aux << QT_ENDL; } } //qDebug() << "UDPServer::adifParse: - END" << QT_ENDL; } void UDPServer::loadSettings() { //qDebug() << Q_FUNC_INFO << " - Start"; QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("UDPServer"); setNetworkInterface (settings.value("UDPNetworkInterface").toString ()); setPort (settings.value("UDPServerPort").toInt ()); logging = settings.value("LogFromWSJTX").toBool (); realtime = settings.value ("RealTimeFromWSJTX", false).toBool (); settings.endGroup (); /* UDPServerStart = settings.value ("UDPServer", false).toBool (); UDPLogServer->setRealTimeUpdate(); infoTimeout = settings.value ("InfoTimeOut", 2000).toInt (); wsjtxAutoLog = settings.value ("LogAutoFromWSJTX", false).toBool (); */ //qDebug() << Q_FUNC_INFO << " - END"; } klog-2.3.3/awardswidget.cpp0000644000015700001710000004624214542412415015536 0ustar jenkinsjenkins/*************************************************************************** awardswidget.cpp - description ------------------- begin : nov 2019 copyright : (C) 2019 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "awardswidget.h" AwardsWidget::AwardsWidget(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "AwardsWidget::AwardsWidget" ; manageDXMarathon = false; logLevel = Info; //7 Debug /0=emergency or no debug emit debugLog (Q_FUNC_INFO, "Start", Debug); currentLog = -1; dxccConfirmedQLCDNumber = new QLCDNumber; dxccWorkedQLCDNumber = new QLCDNumber; wazConfirmedQLCDNumber = new QLCDNumber; wazWorkedQLCDNumber = new QLCDNumber; //localConfirmedQLCDNumber = new QLCDNumber; //localWorkedQLCDNumber = new QLCDNumber; qsoConfirmedQLCDNumber = new QLCDNumber; qsoWorkedQLCDNumber = new QLCDNumber; yearlyQSOLCDNumber = new QLCDNumber; yearlyDXCCQLCDNumber = new QLCDNumber; yearlyCQQLCDNumber = new QLCDNumber; yearlyScoreQLCDNumber = new QLCDNumber; operatingYearsComboBox = new QComboBox; yearlyLabelN = new QLabel(); yearlyScoreLabelN = new QLabel(); recalculateAwardsButton = new QPushButton; operatingYearsComboBox = new QComboBox; dataProxy = dp; awards = new Awards(dataProxy, Q_FUNC_INFO); //awards = new Awards(dataProxy, Q_FUNC_INFO); //util = new Utilities(Q_FUNC_INFO); clear(); createUI(); emit debugLog (Q_FUNC_INFO, "END", Debug); //qDebug() << "AwardsWidget::AwardsWidget - END" ; } AwardsWidget::~AwardsWidget() { delete(awards); } void AwardsWidget::clear() { emit debugLog (Q_FUNC_INFO, "Start", Debug); //qDebug() << "AwardsWidget::clear" ; /* searchBoxLineEdit->clear(); searchResultsTreeWidget->clear(); qslingNeeded = false; searchSelectAllClicked = false; */ emit debugLog (Q_FUNC_INFO, "END", Debug); //qDebug() << "AwardsWidget::clear-END" ; } void AwardsWidget::createUI() { //searchBoxClearButton->setToolTip(tr("Clear the searches.")); //qDebug() << "AwardsWidget::createUI" ; emit debugLog (Q_FUNC_INFO, "Start", Debug); recalculateAwardsButton = new QPushButton(tr("Recalculate"), this); recalculateAwardsButton->setToolTip(tr("Click to recalculate the award status.")); operatingYearsComboBox->setToolTip(tr("Select the year you want to check.")); QLabel *yearlyQSOsLabelN = new QLabel(tr("QSOs")); QLabel *yearlyDXCCLabelN = new QLabel(tr("DXCC")); QLabel *yearlyCQLabelN = new QLabel(tr("CQ")); QLabel *awardLabelN = new QLabel(tr("Award")); awardLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); QLabel *confirmedLabelN = new QLabel(tr("Confirmed")); confirmedLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); QLabel *workedLabelN = new QLabel(tr("Worked")); workedLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); QLabel *dxccLabelN = new QLabel(tr("DXCC")); dxccLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); QLabel *wazLabelN = new QLabel(tr("WAZ")); wazLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); //QLabel *localLabelN = new QLabel(tr("Local")); //localLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); QLabel *qsoNLabelN = new QLabel(tr("QSOs")); qsoNLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); yearlyLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); yearlyQSOsLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); yearlyDXCCLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); yearlyQSOsLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); yearlyCQLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); yearlyScoreLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); #ifdef Q_OS_WIN //qDebug() << "AwardsWidget::createUIDX - WINDOWS DETECTED!" ; qsoNLabelN->setFrameShadow(QFrame::Raised); qsoNLabelN->setFrameStyle(QFrame::StyledPanel); wazLabelN->setFrameShadow(QFrame::Raised); wazLabelN->setFrameStyle(QFrame::StyledPanel); //localLabelN->setFrameShadow(QFrame::Raised); //localLabelN->setFrameStyle(QFrame::StyledPanel); dxccLabelN->setFrameShadow(QFrame::Raised); dxccLabelN->setFrameStyle(QFrame::StyledPanel); workedLabelN->setFrameShadow(QFrame::Raised); workedLabelN->setFrameStyle(QFrame::StyledPanel); confirmedLabelN->setFrameShadow(QFrame::Raised); confirmedLabelN->setFrameStyle(QFrame::StyledPanel); awardLabelN->setFrameShadow(QFrame::Raised); awardLabelN->setFrameStyle(QFrame::StyledPanel); yearlyQSOsLabelN->setFrameShadow(QFrame::Raised); yearlyDXCCLabelN->setFrameShadow(QFrame::Raised); yearlyQSOsLabelN->setFrameShadow(QFrame::Raised); yearlyScoreLabelN->setFrameShadow(QFrame::Raised); yearlyLabelN->setFrameShadow(QFrame::Raised); yearlyCQLabelN->setFrameShadow(QFrame::Raised); yearlyQSOsLabelN->setFrameStyle(QFrame::StyledPanel); yearlyDXCCLabelN->setFrameStyle(QFrame::StyledPanel); yearlyQSOsLabelN->setFrameStyle(QFrame::StyledPanel); yearlyScoreLabelN->setFrameStyle(QFrame::StyledPanel); yearlyLabelN->setFrameStyle(QFrame::StyledPanel); yearlyCQLabelN->setFrameStyle(QFrame::StyledPanel); #else //qDebug() << "AwardsWidget::createUIDX - NO WINDOWS DETECTED!" ; //localLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); qsoNLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); wazLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); dxccLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); workedLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); confirmedLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); awardLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); yearlyQSOsLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); yearlyDXCCLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); yearlyQSOsLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); yearlyCQLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); yearlyScoreLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); yearlyLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); #endif //qDebug() << "AwardsWidget::createUI-125" ; //reconfigureyearlyUI(manageyearly); yearlyScoreLabelN->setText(tr("Score")); yearlyLabelN->setText(tr("Annual")); //qDebug() << "AwardsWidget::createUI-135" ; QGridLayout *yearlyDLayout = new QGridLayout; yearlyDLayout->addWidget(yearlyQSOsLabelN, 0, 0); yearlyDLayout->addWidget(yearlyDXCCLabelN, 0, 1); yearlyDLayout->addWidget(yearlyCQLabelN, 0, 2); yearlyDLayout->addWidget(yearlyQSOLCDNumber, 1, 0); yearlyDLayout->addWidget(yearlyDXCCQLCDNumber, 1, 1); yearlyDLayout->addWidget(yearlyCQQLCDNumber, 1, 2); //qDebug() << "AwardsWidget::createUI-145" ; QVBoxLayout *yearlyTLayout = new QVBoxLayout; yearlyTLayout->addWidget(yearlyLabelN); yearlyTLayout->addWidget(operatingYearsComboBox); //qDebug() << "AwardsWidget::createUI-150" ; QGridLayout *dxUpRightAwardsTabLayout = new QGridLayout; //qDebug() << "AwardsWidget::createUI-151" ; dxUpRightAwardsTabLayout->addWidget(awardLabelN, 0, 0); //qDebug() << "AwardsWidget::createUI-152" ; dxUpRightAwardsTabLayout->addWidget(workedLabelN, 0, 1); //qDebug() << "AwardsWidget::createUI-153" ; dxUpRightAwardsTabLayout->addWidget(confirmedLabelN, 0, 2); //qDebug() << "AwardsWidget::createUI-154" ; dxUpRightAwardsTabLayout->addWidget(dxccLabelN, 1, 0); //qDebug() << "AwardsWidget::createUI-155" ; dxUpRightAwardsTabLayout->addWidget(dxccWorkedQLCDNumber, 1, 1); //qDebug() << "AwardsWidget::createUI-156" ; dxUpRightAwardsTabLayout->addWidget(dxccConfirmedQLCDNumber, 1, 2); //qDebug() << "AwardsWidget::createUI-157" ; dxUpRightAwardsTabLayout->addWidget(wazLabelN, 2, 0); //qDebug() << "AwardsWidget::createUI-158" ; dxUpRightAwardsTabLayout->addWidget(wazWorkedQLCDNumber, 2, 1); //qDebug() << "AwardsWidget::createUI-159" ; dxUpRightAwardsTabLayout->addWidget(wazConfirmedQLCDNumber, 2, 2); //qDebug() << "AwardsWidget::createUI-160" ; //dxUpRightAwardsTabLayout->addWidget(localLabelN, 3, 0); //qDebug() << "AwardsWidget::createUI-161" ; //dxUpRightAwardsTabLayout->addWidget(localWorkedQLCDNumber, 3, 1); //qDebug() << "AwardsWidget::createUI-162" ; //dxUpRightAwardsTabLayout->addWidget(localConfirmedQLCDNumber, 3, 2); //qDebug() << "AwardsWidget::createUI-163" ; dxUpRightAwardsTabLayout->addWidget(qsoNLabelN, 4, 0); //qDebug() << "AwardsWidget::createUI-164" ; dxUpRightAwardsTabLayout->addWidget(qsoWorkedQLCDNumber, 4, 1); //qDebug() << "AwardsWidget::createUI-165" ; dxUpRightAwardsTabLayout->addWidget(qsoConfirmedQLCDNumber, 4, 2); //qDebug() << "AwardsWidget::createUI-166" ; dxUpRightAwardsTabLayout->addLayout(yearlyTLayout, 5, 0); //qDebug() << "AwardsWidget::createUI-167" ; dxUpRightAwardsTabLayout->addLayout(yearlyDLayout, 5, 1, 1, -1); //qDebug() << "AwardsWidget::createUI-168" ; dxUpRightAwardsTabLayout->addWidget(recalculateAwardsButton, 6, 1); //qDebug() << "AwardsWidget::createUI-200" ; setLayout(dxUpRightAwardsTabLayout); //connect(dataProxy, SIGNAL(qsoFound(QStringList)), this, SLOT(slotQsoFound(QStringList)) ); //connect(searchBoxExportButton, SIGNAL(clicked()), this, SLOT(slotSearchExportButtonClicked() ) ); setToolTips(); connect(operatingYearsComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotOperatingYearComboBoxChanged() ) ) ; connect(recalculateAwardsButton, SIGNAL(clicked()), this, SLOT(slotRecalculateAwardsButtonClicked() ) ); emit debugLog (Q_FUNC_INFO, "END", Debug); //qDebug() << "AwardsWidget::createUI-END" ; } void AwardsWidget::setManageDXMarathon(const bool _dx) { emit debugLog(Q_FUNC_INFO, "Start", logLevel); manageDXMarathon = _dx; reconfigureDXMarathonUI(manageDXMarathon); emit debugLog(Q_FUNC_INFO, "End", logLevel); } /* void AwardsWidget::slotSearchClearButtonClicked() { //qDebug() << "SearchWidget::slotSearchClearButtonClicked: "; searchResultsTreeWidget->clear(); searchBoxLineEdit->clear(); searchSelectAllClicked = false; qslingNeeded = false; } */ void AwardsWidget::setToolTips() { emit debugLog (Q_FUNC_INFO, "Start", Debug); dxccConfirmedQLCDNumber->setToolTip(tr("Number of confirmed DXCC entities.")); dxccWorkedQLCDNumber->setToolTip(tr("Number of worked DXCC entities.")); wazConfirmedQLCDNumber->setToolTip(tr("Number of confirmed WAZ zones.")); wazWorkedQLCDNumber->setToolTip(tr("Number of worked WAZ zones.")); //localConfirmedQLCDNumber->setToolTip(tr("Number of confirmed local references.")); //localWorkedQLCDNumber->setToolTip(tr("Number of worked local references.")); qsoConfirmedQLCDNumber->setToolTip(tr("Number of confirmed QSOs.")); qsoWorkedQLCDNumber->setToolTip(tr("Number of worked QSOs.")); yearlyQSOLCDNumber->setToolTip(tr("Number of QSOs worked in the selected year.")); yearlyDXCCQLCDNumber->setToolTip(tr("Number of DXCCs worked in the selected year.")); yearlyCQQLCDNumber->setToolTip(tr("Number of CQ Zones worked in the selected year.")); yearlyScoreQLCDNumber->setToolTip(tr("Score for the DXMarathon in the selected year.")); operatingYearsComboBox->setToolTip(tr("Select the year you want to check.")); emit debugLog (Q_FUNC_INFO, "END", Debug); } void AwardsWidget::slotRecalculateAwardsButtonClicked() { emit debugLog (Q_FUNC_INFO, "Start", Debug); awards->recalculateAwards(); //emit recalculateAwardsSignal(); showAwards(); emit debugLog (Q_FUNC_INFO, "END", Debug); } void AwardsWidget::slotOperatingYearComboBoxChanged() { emit debugLog (Q_FUNC_INFO, "Start", Debug); selectedYear = (operatingYearsComboBox->currentText()).toInt(); showDXMarathon(selectedYear); emit debugLog (Q_FUNC_INFO, "END", Debug); } void AwardsWidget::showAwards() { // Updates and show all the award status tab. //qDebug() << "AwardsWidget::showAwards"; /* WAZ Local */ emit debugLog(Q_FUNC_INFO, "Start", logLevel); checkIfValidLog(); int _num = 0; //QSqlQuery query; //QString aux; _num = dataProxy->getHowManyQSOInLog(currentLog); if (_num>99999) { qsoWorkedQLCDNumber->setDigitCount((QString::number(_num)).size()); } else { qsoWorkedQLCDNumber->setDigitCount(5); } qsoWorkedQLCDNumber->display(_num); _num = dataProxy->getHowManyConfirmedQSLInLog(currentLog); if (_num>99999) { qsoConfirmedQLCDNumber->setDigitCount((QString::number(_num)).size()); } else { qsoConfirmedQLCDNumber->setDigitCount(5); } qsoConfirmedQLCDNumber->display(_num); //_num = 0; dxccWorkedQLCDNumber->display(dataProxy->getFieldInBand (DXCC, "ALL", false, "ALL", currentLog)); dxccConfirmedQLCDNumber->display(dataProxy->getFieldInBand (DXCC, "ALL", true, "ALL", currentLog)); wazWorkedQLCDNumber->display(awards->getWAZWorked(currentLog)); wazConfirmedQLCDNumber->display(awards->getWAZConfirmed(currentLog)); showDXMarathon(selectedYear); emit debugLog(Q_FUNC_INFO, "END", logLevel); //qDebug() << "AwardsWidget::showAwards - END"; } void AwardsWidget::showDXMarathon(const int _year) { //qDebug() << "AwardsWidget::AwardsWidget::showDXMarathon: Year: " << QString::number(_year); emit debugLog(Q_FUNC_INFO, "Start", logLevel); int i = 0; i = awards->getDXMarathonQSO(_year, currentLog); //qDebug() << "AwardsWidget::AwardsWidget::showDXMarathon: QSO: " << QString::number(i); yearlyQSOLCDNumber->display(i); i = awards->getDXMarathonDXCC(_year, currentLog); //qDebug() << "AwardsWidget::AwardsWidget::showDXMarathon: DXCC: " << QString::number(i); yearlyDXCCQLCDNumber->display(i); i = awards->getDXMarathonCQ(_year, currentLog); yearlyCQQLCDNumber->display(i); //qDebug() << "AwardsWidget::AwardsWidget::showDXMarathon: CQ: " << QString::number(i); if (manageDXMarathon) { i = awards->getDXMarathonScore(_year, currentLog); } else { i = 0; } yearlyScoreQLCDNumber->display(i); emit debugLog(Q_FUNC_INFO, "End", logLevel); //qDebug() << "AwardsWidget::AwardsWidget::showDXMarathon: Score: " << QString::number(i); } void AwardsWidget::reconfigureDXMarathonUI(const bool _dxM) { emit debugLog(Q_FUNC_INFO, "Start", logLevel); //dxClusterWidget->setDXMarathon(_dxM); if (_dxM) { yearlyLabelN->setText(tr("DX-Marathon")); yearlyScoreLabelN->setEnabled(true); yearlyScoreQLCDNumber->setEnabled(true); yearlyScoreQLCDNumber->display(0); } else { yearlyLabelN->setText(tr("Annual")); yearlyScoreLabelN->setEnabled(false); yearlyScoreQLCDNumber->setEnabled(false); emit requireCurrentYearSignal(); int i = awards->getDXMarathonScore(selectedYear, currentLog); if (i>0) { yearlyScoreQLCDNumber->display(i); } else { yearlyScoreQLCDNumber->display(0); } } emit debugLog(Q_FUNC_INFO, "End", logLevel); } void AwardsWidget::checkIfValidLog() { emit debugLog(Q_FUNC_INFO, "Start", logLevel); if (currentLog < 1) { emit requireCurrentLogSignal(); } emit debugLog(Q_FUNC_INFO, "End", logLevel); } void AwardsWidget::setLog(const int _log) { emit debugLog(Q_FUNC_INFO, "Start", logLevel); if (_log >= 1) { currentLog = _log; } //TODO: Define an action when the log received is NOK emit debugLog(Q_FUNC_INFO, "End", logLevel); } void AwardsWidget::setYear(const int _year) { emit debugLog(Q_FUNC_INFO, "Start", logLevel); if (_year >= 1800) { selectedYear = _year; if (operatingYearsComboBox->findText(QString::number(selectedYear), Qt::MatchCaseSensitive)>=0) { operatingYearsComboBox->setCurrentIndex(operatingYearsComboBox->findText(QString::number(selectedYear), Qt::MatchCaseSensitive)); } else { //TODO: Define what to do when the year is NOK } } emit debugLog(Q_FUNC_INFO, "End", logLevel); } void AwardsWidget::fillOperatingYears() { emit debugLog(Q_FUNC_INFO, "Start", logLevel); emit requireCurrentLogSignal(); emit requireCurrentYearSignal(); operatingYearsComboBox->clear(); if (dataProxy->getLastQSOid()<=1) { //qDebug() << "AwardsWidget::AwardsWidget: 18.4"; operatingYearsComboBox->addItem(QString::number(selectedYear)); } else { //qDebug() << "AwardsWidget::AwardsWidget: 18.5 - currentLog: " << QString::number(currentLog); operatingYearsComboBox->addItems(dataProxy->getOperatingYears(currentLog)); //qDebug() << "AwardsWidget::AwardsWidget: 18.5.1 - currentLog: " << QString::number(currentLog); QStringList a; a.clear(); a << dataProxy->getOperatingYears(currentLog); //qDebug() << "AwardsWidget::AwardsWidget: 18.5.1.1 - currentLog: " << QString::number(currentLog); if (!a.isEmpty()) { //qDebug() << "AwardsWidget::AwardsWidget: 18.5.1.2 - currentLog: " << QString::number(currentLog); operatingYearsComboBox->setCurrentIndex(operatingYearsComboBox->findText(a.last(), Qt::MatchCaseSensitive)); //qDebug() << "AwardsWidget::AwardsWidget: 18.5.1.3 - currentLog: " << QString::number(currentLog); } //qDebug() << "AwardsWidget::AwardsWidget: 18.5.2"; } emit debugLog(Q_FUNC_INFO, "End", logLevel); } klog-2.3.3/mainqsoentrywidget.cpp0000644000015700001710000011233014542412415016776 0ustar jenkinsjenkins /***************************************************************************tv mainqsoentrywidget.cpp - description ------------------- begin : january 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //https://github.com/ea4k/klog/commit/1ac02c7b779922a8e5907ebee088fa64654cbdf5 #include "mainqsoentrywidget.h" MainQSOEntryWidget::MainQSOEntryWidget(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug()<< Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); modifyingBands = false; upAndRunning = false; dataProxy = dp; qrzLineEdit = new QLineEdit; bandComboBox = new QComboBox; modeComboBox = new QComboBox; dateEdit = new QDateEdit; timeEdit = new QTimeEdit; realtimeCheckBox = new QCheckBox; enabledCR = realtimeCheckBox->backgroundRole(); manualModeCheckBox = new QCheckBox; QRZButton = new QPushButton("QRZ"); OKButton = new QPushButton(tr("&Add"), this); clearButton = new QPushButton(tr("&Clear"), this); timer = new QTimer(this); util = new Utilities(Q_FUNC_INFO); realTime = true; duplicatedQSOSlotInSecs = 15; delayInputTimer = new QTimer; logLevel = None; createUI(); setInitialData(); //installEventFilter (this); logEvent (Q_FUNC_INFO, "END", Debug); //qDebug()<< Q_FUNC_INFO << " - END"; } MainQSOEntryWidget::~MainQSOEntryWidget() { logEvent (Q_FUNC_INFO, "Start", Debug); delete(util); logEvent (Q_FUNC_INFO, "END", Debug); } /* void MainQSOEntryWidget::slotRealTimeButtonResize() { int heigh = qrzLineEdit->sizeHint ().height (); realtimeButton->setFixedSize(QSize(heigh, heigh)); //realtimeButton->setSizePolicy (QSizePolicy::Fixed); } */ void MainQSOEntryWidget::createUI() { //qDebug()<< Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); qrzLineEdit->setToolTip(tr("Callsign of the QSO.")); bandComboBox->setToolTip(tr("Band of the QSO.")); modeComboBox->setToolTip(tr("Mode of the QSO.")); dateEdit->setToolTip(tr("Date of the QSO.")); timeEdit->setToolTip(tr("Time of the QSO.")); OKButton->setToolTip(tr("Add the QSO to the log.")); clearButton->setToolTip(tr("Clears the QSO entry.")); QRZButton->setToolTip(tr("Look up info about the current callsign on qrz.com")); realtimeCheckBox->setToolTip(tr("KLog will show real time if enabled.")); realtimeCheckBox->setText (tr("Real time")); //realtimeButton->setToolTip(tr("KLog will show real time if enabled.")); manualModeCheckBox->setToolTip(tr("Stop wsjt-x and hamlib from automatically updating QSO information.")); manualModeCheckBox->setText (tr("Manual Mode")); QHBoxLayout *TimeLayout = new QHBoxLayout; TimeLayout->addWidget(dateEdit); TimeLayout->addWidget(timeEdit); //TimeLayout->addWidget(realtimeButton); TimeLayout->addWidget(realtimeCheckBox); TimeLayout->addWidget(manualModeCheckBox); TimeLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Fixed)); QHBoxLayout *BandModeLayout = new QHBoxLayout; BandModeLayout->addWidget(bandComboBox); BandModeLayout->addWidget(modeComboBox); QHBoxLayout *QrzBandModeLayout = new QHBoxLayout; QrzBandModeLayout->addWidget(qrzLineEdit); QrzBandModeLayout->addLayout(BandModeLayout); qrzgroupBox = new QGroupBox(tr("Callsign")); qrzgroupBox->setFlat(true); QVBoxLayout *qrzvbox = new QVBoxLayout; qrzvbox->addLayout(QrzBandModeLayout); qrzgroupBox->setLayout(qrzvbox); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addWidget(QRZButton); buttonsLayout->addWidget(OKButton); buttonsLayout->addWidget(clearButton); dateEdit->setCalendarPopup (true);; dateEdit->setDisplayFormat("yyyy-MM-dd"); timeEdit->setDisplayFormat("HH:mm:ss"); QGridLayout *widgetLayout = new QGridLayout; widgetLayout->addWidget(qrzgroupBox, 0, 0, 1, 0); widgetLayout->addLayout(TimeLayout, 1, 0); widgetLayout->addLayout(buttonsLayout,1, 1); //widgetLayout->setSizeConstraint(QLayout::SetFixedSize); setLayout(widgetLayout); palRed.setColor(QPalette::Text, Qt::red); palBlack.setColor(QPalette::Text, Qt::black); palWhite.setColor(QPalette::Text, Qt::white); connect(util, SIGNAL(debugLog(QString, QString, DebugLogLevel)), this, SLOT(slotCaptureDebugLogs(QString, QString, DebugLogLevel))); connect(qrzLineEdit, SIGNAL(returnPressed()), this, SLOT(slotOKButtonClicked() ) ); connect(qrzLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotStartDelayInputTimer() ) ); connect(delayInputTimer, SIGNAL(timeout()), this, SLOT(slotDelayInputTimedOut() ) ); connect(bandComboBox, SIGNAL(currentIndexChanged (QString)), this, SLOT(slotBandComboBoxChanged(QString) ) ) ; connect(modeComboBox, SIGNAL(currentIndexChanged (QString)), this, SLOT(slotModeComboBoxChanged(QString) ) ) ; connect(OKButton, SIGNAL(clicked()), this, SLOT(slotOKButtonClicked())); connect(clearButton, SIGNAL(clicked()), this, SLOT(slotClearButtonClicked())); connect(QRZButton, SIGNAL(clicked()), this, SLOT(slotQRZButtonClicked())); connect(timer, SIGNAL(timeout()), this, SLOT(slotUpdateTime()) ); //connect(realtimeButton, SIGNAL(clicked()), this, SLOT(slotRealtimeButtonClicked()) ); connect(realtimeCheckBox, SIGNAL(clicked()), this, SLOT(slotCheckBoxClicked())); connect(manualModeCheckBox, SIGNAL(clicked()), this, SLOT(slotManualModeCheckBoxClicked())); QWidget::setTabOrder (qrzLineEdit, dateEdit); QWidget::setTabOrder (dateEdit, timeEdit); logEvent (Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << ": (" << QString::number(this->size ().width ()) << "/" << QString::number(this->size ().height ()) << ")" ; } void MainQSOEntryWidget::setShowSeconds(const bool &t) { if (t) { timeEdit->setDisplayFormat("HH:mm:ss"); } else { timeEdit->setDisplayFormat("HH:mm"); } } void MainQSOEntryWidget::setLogLevel (const DebugLogLevel _b) { logEvent (Q_FUNC_INFO, "Start", Debug); logLevel = _b; logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::setCallValidation (const bool _b) { util->setCallValidation(_b); dataProxy->setCallValidation(_b); } void MainQSOEntryWidget::slotCheckBoxClicked() { logEvent (Q_FUNC_INFO, "Start", Debug); if (realtimeCheckBox->isChecked()) { realTime = true; //realtimeButton->setIcon(QIcon(":/img/play.svg")); timeEdit->setBackgroundRole(enabledCR); } else { realTime = false; //realtimeButton->setIcon(QIcon(":/img/stop.svg")); timeEdit->setBackgroundRole(QPalette::BrightText); } logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::slotManualModeCheckBoxClicked() { logEvent (Q_FUNC_INFO, "Start", Debug); if (manualModeCheckBox->isChecked()) { slotClearButtonClicked(); emit manualModeSignal(true); //stop hamlib and wsjt-x communication; } else { emit manualModeSignal(false); //start hamlib and wsjt-x communication; } logEvent (Q_FUNC_INFO, "END", Debug); } /* void MainQSOEntryWidget::slotRealtimeButtonClicked() { logEvent (Q_FUNC_INFO, "Start", Debug); if (realtimeButton->isChecked()) { realTime = true; realtimeButton->setIcon(QIcon(":/img/stop.svg")); timeEdit->setBackgroundRole(enabledCR); } else { realTime = false; realtimeButton->setIcon(QIcon(":/img/play.svg")); timeEdit->setBackgroundRole(QPalette::BrightText); } logEvent (Q_FUNC_INFO, "END", Debug); } */ void MainQSOEntryWidget::setCleaning (const bool _c) { logEvent (Q_FUNC_INFO, "Start", Debug); cleaning = _c; logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::slotQRZTextChanged() { logEvent (Q_FUNC_INFO, "Start: " + qrzLineEdit->text(), Debug); //qDebug()<< Q_FUNC_INFO << qrzLineEdit->text() << " / Length: " << QString::number((qrzLineEdit->text()).size()) << "###### START ######"; logEvent (Q_FUNC_INFO, "Start", Debug); if ((qrzLineEdit->text()).length()<1) { //qDebug() << Q_FUNC_INFO << ": qrz length <1"; slotClearButtonClicked(); logEvent (Q_FUNC_INFO, "END-1", Debug); //qDebug()<< Q_FUNC_INFO << ": QRZ <1 - END"; return; } int cursorP = qrzLineEdit->cursorPosition(); //qDebug()<< Q_FUNC_INFO << ": cursor position: " << QString::number(cursorP); qrzLineEdit->setText((qrzLineEdit->text()).toUpper()); if (cleaning) { //qDebug() << Q_FUNC_INFO << ": Cleaning - END"; logEvent (Q_FUNC_INFO, "END-2", Debug); return; } if (qrzAutoChanging) { //qDebug()<< Q_FUNC_INFO << ": qrzAutoChanging - END"; qrzAutoChanging = false; logEvent (Q_FUNC_INFO, "END-3", Debug); return; } qrzAutoChanging = true; //qDebug()<< Q_FUNC_INFO << ": cursor position.1: " << QString::number(cursorP); if ( (qrzLineEdit->text()).endsWith(' ') ) {/*Remove the space and moves the focus to SRX to write the RX exchange*/ previousQRZ = (qrzLineEdit->text()).simplified(); qrzLineEdit->setText(previousQRZ); //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: Space detected"; } //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: Simplifiying & Capitalizing"; qrzLineEdit->setText(((qrzLineEdit->text())).simplified()); qrzLineEdit->setText((qrzLineEdit->text()).remove(" ")); //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: checking for invalid chars"; //TODO: This validCharactersInCall may be removed? InValidCharsInPrevCall = validCharactersInCall(qrzLineEdit->text()); //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: checking for invalid chars 00 "; if (!util->isValidCall(qrzLineEdit->text())) { qrzLineEdit->setPalette(palRed); //emit showInfoLabel(tr("Callsign not valid")); //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: QRZ not valid - Red"; //logEvent (Q_FUNC_INFO, "END-4", Debug); } else { //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: QRZ is valid - Black"; if (getDarkMode()) { qrzLineEdit->setPalette(palWhite); } else { qrzLineEdit->setPalette(palBlack); } currentQrz = qrzLineEdit->text(); //emit showInfoLabel(tr("")); } /* //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: checking for length"; if (((qrzLineEdit->text()).length() < 1)) { // If QRZ box is blank, Information labels should be cleared. slotClearButtonClicked(); logEvent (Q_FUNC_INFO, "END-5", Debug); return; } */ //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: checking for modify or length<1"; if (qrzSmallModDontCalculate) //if ((modify) || ((qrzLineEdit->text()).length() < 1) || (qrzSmallModDontCalculate)) { //qDebug() << "MainQSOEntryWidget::slotQRZTextChanged: qrzSmallModDontCalculate < 1"; qrzSmallModDontCalculate=false; logEvent (Q_FUNC_INFO, "END-6", Debug); return; } //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: running..."; qrzSmallModDontCalculate = true; // A kind of flag to prevent multiple calls to this method. currentQrz = qrzLineEdit->text(); if ((currentQrz).count('\\')) { // Replaces \ by / to ease operation. //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: Replacing \\ by /"; currentQrz.replace(QChar('\\'), QChar('/')); qrzLineEdit->setText(currentQrz); } currentQrz = qrzLineEdit->text(); //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: cursor position.3: " << QString::number(cursorP); if (cursorP>currentQrz.length()) {// A Space that has been removed without updating the cursor //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: cursorP > currentQRZ.length"; } else { //qDebug() << Q_FUNC_INFO << " cursorP0) { if ((currentQrz.at(cursorP-1)).isSpace()) { //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: cursor position.5: " << QString::number(cursorP); previousQRZ = currentQrz.remove(cursorP-1, 1); //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: cursor position.6: " << QString::number(cursorP); cursorP--; //qDebug()<< "MainQSOEntryWidget::slotQRZTextChanged: cursor position.7: " << QString::number(cursorP); qrzLineEdit->setText(previousQRZ); } } } currentQrz = qrzLineEdit->text(); //qDebug() << "MainQSOEntryWidget::slotQRZTextChanged: Emitting: " << currentQrz; emit currentQRZSignal(currentQrz); qrzSmallModDontCalculate = false; // If the text has not been modified in this method //qDebug() << "MainQSOEntryWidget::slotQRZTextChanged: cursorP at the end : " << QString::number(cursorP); qrzLineEdit->setCursorPosition(cursorP); checkIfDupe(Q_FUNC_INFO); qrzAutoChanging = false; logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::setCurrentQRZ(const QString &_qrz) { logEvent (Q_FUNC_INFO, "Start", Debug); currentQrz = _qrz; logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::slotBandComboBoxChanged(const QString &_b){ //qDebug() << Q_FUNC_INFO << ": << _b; logEvent (Q_FUNC_INFO, "Start", Debug); if (modifyingBands){ //qDebug() << Q_FUNC_INFO << ": Modifying bands - END" ; return; } bottomBandLimit = dataProxy->getLowLimitBandFromBandName (_b); upperBandLimit = dataProxy->getUpperLimitBandFromBandName (_b); emit bandChanged(_b); checkIfDupe(Q_FUNC_INFO); logEvent (Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << " - END"; } void MainQSOEntryWidget::slotModeComboBoxChanged(const QString &_m) { logEvent (Q_FUNC_INFO, "Start", Debug); emit modeChanged(_m); checkIfDupe(Q_FUNC_INFO); logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::slotQRZButtonClicked() { if ((qrzLineEdit->text()).length()<1) { return; } util->openQrzcom(currentQrz); } void MainQSOEntryWidget::slotOKButtonClicked() { logEvent (Q_FUNC_INFO, "Start", Debug); if ((qrzLineEdit->text()).length()<1) { return; } emit OKClicked(); logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::slotClearButtonClicked() { //qDebug() << "MainQSOEntryWidget::slotClearButtonClicked: " ; logEvent (Q_FUNC_INFO, "Start", Debug); setCleaning (true); clear(); emit clearForNextQSOSignal(Q_FUNC_INFO); //setModify(false); checkIfDupe(Q_FUNC_INFO); setCleaning (false); logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::clear() { logEvent (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO; setModify(false); //OKButton->setText(tr("&Add")); qrzLineEdit->clear(); qrzLineEdit->setFocus(Qt::OtherFocusReason); //cleaning = false; //qDebug() << Q_FUNC_INFO << " - END"; logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::setInitialData() { //qDebug()<< "MainQSOEntryWidget::setInitialData"; logEvent (Q_FUNC_INFO, "Start", Debug); //Default band/modes modify = false; qrzAutoChanging = false; InValidCharsInPrevCall = false; qrzSmallModDontCalculate=false; previousQRZ = QString(); util->setLongPrefixes(dataProxy->getLongPrefixes()); util->setSpecialCalls(dataProxy->getSpecialCallsigns()); bands.clear(); modes.clear(); bands << "10M" << "15M" << "20M" << "40M" << "80M" << "160M"; modes << "SSB" << "CW"; setBands(bands); setModes(modes); selectDefaultBand(true); selectDefaultMode(true); dateEdit->setDate(QDate::currentDate()); timeEdit->setTime(QTime::currentTime()); UTCTime = true; // //qDebug()ime = true; timer->start(1000); logEvent (Q_FUNC_INFO, "END", Debug); //qDebug()<< "MainQSOEntryWidget::setInitialData-END"; } bool MainQSOEntryWidget::updateBandComboBox(const QString &_band) { logEvent (Q_FUNC_INFO, "Start: " + _band, Debug); //qDebug() << Q_FUNC_INFO << ": << _band; //QString _currentBand = getBand(); if (!isBandExisting(_band)) {// The selected frequency is of a band that is not currently selected QString _currentBand = bandComboBox->currentText (); //qDebug() << Q_FUNC_INFO << ": New band found: " << _band; if (dataProxy->getIdFromBandName(_band) > 1) {// Not affected if 0 (light) is the frequency // In this case the user should select the band in the setup //qDebug() << Q_FUNC_INFO << ": Band is valid: " << _band; QStringList qsTemp; qsTemp.clear(); qsTemp << bands; qsTemp << _band; qsTemp.removeDuplicates(); QString aux; foreach(aux, bands) { //qDebug() << " bands Band: " << aux; } foreach(aux, qsTemp) { //qDebug() << " qsTemp Band: " << aux; } bands.clear(); bands = dataProxy->sortBandNamesBottonUp(qsTemp); foreach(aux, bands) { //qDebug() << " bands2 Band: " << aux; } //qDebug() << Q_FUNC_INFO << ": Before setBands"; setBands(bands); bandComboBox->setCurrentIndex(bandComboBox->findText(_currentBand, Qt::MatchCaseSensitive)); //qDebug() << Q_FUNC_INFO << ": Band has been added : " << _band; } else { //qDebug() << Q_FUNC_INFO << ": (END) Band is NOT valid: " <<_band; logEvent (Q_FUNC_INFO, "END-1", Debug); return false; } } //qDebug() << Q_FUNC_INFO << ": Band already existing, no need to add" ; logEvent (Q_FUNC_INFO, "END", Debug); return true; } void MainQSOEntryWidget::setBands(const QStringList &_bands) { logEvent (Q_FUNC_INFO, "Start: " + QString::number(_bands.length ()), Debug); //qDebug()<< Q_FUNC_INFO << " - Start: " << QString::number(_bands.length ()); modifyingBands = true; //bands.clear(); bands = _bands; bands.removeDuplicates(); bands = dataProxy->sortBandNamesBottonUp(bands); bandComboBox->clear(); bandComboBox->addItems(bands); emit validBands(_bands); //selectDefaultBand(true); modifyingBands = false; logEvent (Q_FUNC_INFO, "END", Debug); //qDebug()<< Q_FUNC_INFO << " - END"; } void MainQSOEntryWidget::setModes(const QStringList &_modes) { logEvent (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO; modes.clear(); modes = _modes; modes.removeDuplicates(); modes.sort(); modeComboBox->clear(); modeComboBox->addItems(modes); selectDefaultMode(true); logEvent (Q_FUNC_INFO, "END", Debug); } QStringList MainQSOEntryWidget::getModes() { logEvent (Q_FUNC_INFO, "Start-End", Debug); return modes; } bool MainQSOEntryWidget::setFreq(const double _f, bool isRX) { //qDebug() << Q_FUNC_INFO << ": << QString::number(_f); logEvent (Q_FUNC_INFO, "Start", Debug); if (isRX) { if (util->isSameFreq (freqRX, _f)) { logEvent (Q_FUNC_INFO, "END-1", Debug); return true; } freqRX = _f; } if (util->isSameFreq (freqTX, _f)) { logEvent (Q_FUNC_INFO, "END-2", Debug); return true; } freqTX = _f; if (newBandNeededForFreq (_f)) { //qDebug() << Q_FUNC_INFO << ": New band needed"; if ((bottomBandLimit<=freqTX) && (freqTX<= upperBandLimit)) { logEvent (Q_FUNC_INFO, "END-3", Debug); return true; } //qDebug() << Q_FUNC_INFO << ": Freq is not in the current band"; QString _newBand = dataProxy->getBandNameFromFreq(_f); //qDebug() << Q_FUNC_INFO << ": before setting band: " << _newBand ; if (isRX) { //qDebug() << Q_FUNC_INFO << ": RX Freq no more actions " ; logEvent (Q_FUNC_INFO, "END-4", Debug); return true; } logEvent (Q_FUNC_INFO, "END-5", Debug); return setBand(_newBand); } else { //qDebug() << Q_FUNC_INFO << ": NO New band needed - REMOVE THIS else"; } logEvent (Q_FUNC_INFO, "END", Debug); return false; } bool MainQSOEntryWidget::newBandNeededForFreq(const double _f) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_f); logEvent (Q_FUNC_INFO, "Start: " + QString::number(_f), Debug); QString _newBand = dataProxy->getBandNameFromFreq(_f); if (!updateBandComboBox (_newBand)) { logEvent (Q_FUNC_INFO, "END-1", Debug); //qDebug() << Q_FUNC_INFO << " - END false"; return false; } //qDebug() << Q_FUNC_INFO << " - END true "; logEvent (Q_FUNC_INFO, "END", Debug); return true; } bool MainQSOEntryWidget::setBand(const QString &_band) { //qDebug() << Q_FUNC_INFO << ": " << _band; logEvent (Q_FUNC_INFO, "Start: " + _band, Debug); if (bandComboBox->findText(_band, Qt::MatchCaseSensitive) < 0) { //qDebug() << Q_FUNC_INFO << ": Band not found " << _band; if (!updateBandComboBox(_band)) { logEvent (Q_FUNC_INFO, "END-1", Debug); return false; } } //qDebug() << "MainQSOEntryWidget::setBand-1: Band found " << _band; bandComboBox->setCurrentIndex(bandComboBox->findText(_band, Qt::MatchCaseSensitive)); logEvent (Q_FUNC_INFO, "END", Debug); return true; } bool MainQSOEntryWidget::setMode(const QString &_mode) { logEvent (Q_FUNC_INFO, "Start" + _mode, Debug); //qDebug() << Q_FUNC_INFO << ": " << _mode; if (modeComboBox->findText(_mode, Qt::MatchCaseSensitive) < 0) { //qDebug() << Q_FUNC_INFO << ": NOT found"; logEvent (Q_FUNC_INFO, "END-1", Debug); return false; } else { //qDebug() << Q_FUNC_INFO << ": Updated"; modeComboBox->setCurrentIndex(modeComboBox->findText(_mode, Qt::MatchCaseSensitive)); logEvent (Q_FUNC_INFO, "END-2", Debug); return true; } } bool MainQSOEntryWidget::setQRZ(const QString &_qrz) { logEvent (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << ": " << _qrz; //TODO: Add validations to prevent that non valid qrz are sent from the outside of this function or at least manage this appropriately. qrzLineEdit->setText(_qrz.toUpper()); logEvent (Q_FUNC_INFO, "END", Debug); return false; } bool MainQSOEntryWidget::setDateTime(const QDateTime _date) { logEvent (Q_FUNC_INFO, "Start", Debug); if (_date.isValid()) { dateEdit->setDate(_date.date()); timeEdit->setTime(_date.time()); logEvent (Q_FUNC_INFO, "END-1", Debug); return true; } else { //qDebug() << Q_FUNC_INFO << ": - NO VALID DATE"; logEvent (Q_FUNC_INFO, "END-2", Debug); return false; } } bool MainQSOEntryWidget::setTime(const QTime _time) { logEvent (Q_FUNC_INFO, "Start", Debug); if (_time.isValid()) { timeEdit->setTime(_time); logEvent (Q_FUNC_INFO, "END-1", Debug); return true; } else { logEvent (Q_FUNC_INFO, "END-2", Debug); return false; } } QString MainQSOEntryWidget::getQrz() { logEvent (Q_FUNC_INFO, "Start", Debug); QString aux; aux = qrzLineEdit->text(); if(aux.length()<1) { logEvent(Q_FUNC_INFO, "END - Not valid", Debug); return QString(); } logEvent(Q_FUNC_INFO, "END", Debug); return aux.toUpper(); } QString MainQSOEntryWidget::getBand(const int _b) { logEvent (Q_FUNC_INFO, "Start: " + QString::number(_b), Debug); if (_b<0) { logEvent (Q_FUNC_INFO, "END-1", Debug); //qDebug() << Q_FUNC_INFO << " (1): " << bandComboBox->currentText()<< QT_ENDL; return bandComboBox->currentText(); } else { if (bandComboBox->count()>=_b) { logEvent (Q_FUNC_INFO, "END-2", Debug); //qDebug() << Q_FUNC_INFO << " (2): " << bandComboBox->currentText()<< QT_ENDL; return bandComboBox->itemText(_b); } else { logEvent (Q_FUNC_INFO, "END-3", Debug); //qDebug() << Q_FUNC_INFO << " (3): " << bandComboBox->currentText()<< QT_ENDL; return bandComboBox->currentText(); } } } QString MainQSOEntryWidget::getMode(int _m) { logEvent (Q_FUNC_INFO, "Start: " + QString::number(_m), Debug); if (_m<0) { logEvent (Q_FUNC_INFO, "END-1", Debug); return modeComboBox->currentText(); } else { if (modeComboBox->count()>=_m) { logEvent (Q_FUNC_INFO, "END-2", Debug); return modeComboBox->itemText(_m); } else { logEvent (Q_FUNC_INFO, "END-3", Debug); return modeComboBox->currentText(); } } } QDate MainQSOEntryWidget::getDate() { logEvent (Q_FUNC_INFO, "Start-End", Debug); return dateEdit->date(); } QDateTime MainQSOEntryWidget::getDateTime() { logEvent (Q_FUNC_INFO, "Start", Debug); //logEvent (Q_FUNC_INFO, "END", Debug); QDateTime dateTime; dateTime.setDate(dateEdit->date()); dateTime.setTime(timeEdit->time()); logEvent (Q_FUNC_INFO, "END", Debug); return dateTime; } QTime MainQSOEntryWidget::getTime() { logEvent (Q_FUNC_INFO, "Start-End", Debug); return timeEdit->time(); } void MainQSOEntryWidget::toggleRealTime() { logEvent (Q_FUNC_INFO, "Start", Debug); if ( realtimeCheckBox->isChecked ()) { setRealTime (false); } else { setRealTime (true); } logEvent (Q_FUNC_INFO, "END", Debug); } bool MainQSOEntryWidget::getRealTime() { logEvent (Q_FUNC_INFO, "Start-End", Debug); return realtimeCheckBox->isChecked (); } void MainQSOEntryWidget::setRealTime(const bool _realTime) { logEvent (Q_FUNC_INFO, "Start", Debug); //qDebug << Q_FUNC_INFO << ": " << util->boolToQString (_realTime); realTime = _realTime; realtimeCheckBox->setChecked(realTime); logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::setManualMode(const bool _manualMode) { logEvent (Q_FUNC_INFO, "Start", Debug); manualModeCheckBox->setChecked (_manualMode); logEvent (Q_FUNC_INFO, "END", Debug); } bool MainQSOEntryWidget::getManualMode() { logEvent (Q_FUNC_INFO, "Start-End", Debug); return manualModeCheckBox->isChecked (); //logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::setUTC(const bool _utc) { logEvent (Q_FUNC_INFO, "Start", Debug); UTCTime = _utc; setDateAndTimeInternally(); logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::setModify(const bool _modify) { logEvent (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << ": " << util->boolToQString(_modify); modify = _modify; if (modify) { OKButton->setText(tr("&Save")); clearButton->setText(tr("&Cancel")); realtimeCheckBox->setChecked (false); } else { OKButton->setText(tr("&Add")); clearButton->setText(tr("&Clear")); } logEvent (Q_FUNC_INFO, "END", Debug); } bool MainQSOEntryWidget::getModifying() { logEvent (Q_FUNC_INFO, "Start-End", Debug); return modify; } void MainQSOEntryWidget::slotUpdateTime() { //logEvent (Q_FUNC_INFO, "Start", Debug); if ( (!modify) && (realtimeCheckBox->isChecked()) ) { //qDebug()<< Q_FUNC_INFO << ": Real Time & update"; setDateAndTimeInternally(); } //logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::setDateAndTimeInternally() { //logEvent (Q_FUNC_INFO, "Start", Debug); if (UTCTime) { dateEdit->setDate(QDateTime::currentDateTime().toUTC().date()); timeEdit->setTime(QDateTime::currentDateTime().toUTC().time()); } else { dateEdit->setDate(QDateTime::currentDateTime().date()); timeEdit->setTime(QDateTime::currentDateTime().time()); } //logEvent (Q_FUNC_INFO, "END", Debug); } bool MainQSOEntryWidget::validCharactersInCall(const QString &_qrz) { //qDebug()<< Q_FUNC_INFO << ": " << _qrz; logEvent (Q_FUNC_INFO, "Start", Debug); for (int i = 0; i<_qrz.size()-1;i++) { if (!( ((_qrz.at(i)).isLetterOrNumber()) || (_qrz.at(i)=='\\') || (_qrz.at(i)=='/') )) { logEvent (Q_FUNC_INFO, "END-1", Debug); return false; } } logEvent (Q_FUNC_INFO, "END", Debug); return true; } bool MainQSOEntryWidget::isModeExisting(const QString &_m) { logEvent (Q_FUNC_INFO, "Start", Debug); if (modeComboBox->findText(_m, Qt::MatchCaseSensitive) >= 0) { logEvent (Q_FUNC_INFO, "END-1", Debug); return true; } else { logEvent (Q_FUNC_INFO, "END-2", Debug); return false; } } bool MainQSOEntryWidget::isBandExisting(const QString &_b) { logEvent (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << ": " << _b; if (bandComboBox->findText(_b, Qt::MatchCaseSensitive) >= 0) { logEvent (Q_FUNC_INFO, "END-1", Debug); //qDebug() << Q_FUNC_INFO << " - END true"; return true; } else { logEvent (Q_FUNC_INFO, "END-2", Debug); //qDebug() << Q_FUNC_INFO << " - END false"; return false; } } void MainQSOEntryWidget::setUpAndRunning(const bool _u) { logEvent (Q_FUNC_INFO, "Start", Debug); upAndRunning = _u; logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::selectDefaultBand(bool _init) { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); if ((upAndRunning) || (!_init)) { logEvent (Q_FUNC_INFO, "END-1", Debug); //qDebug() << Q_FUNC_INFO << " - END-1"; return; } QString aux; aux = QString(); int defaultBand = dataProxy->getMostUsedBand(-1); //TODO: The log could be defined here //qDebug() << Q_FUNC_INFO << ": " << QString::number(defaultBand) << dataProxy->getNameFromBandId (defaultBand)<< QT_ENDL; if (defaultBand<1) { defaultBand = dataProxy->getIdFromBandName(getBand(0)); } aux = dataProxy->getNameFromBandId(defaultBand); //qDebug() << Q_FUNC_INFO << ": before setting band: " << aux; setBand(aux); logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::selectDefaultMode(bool _init) { logEvent (Q_FUNC_INFO, "Start", Debug); if ((upAndRunning) || (!_init)) { logEvent (Q_FUNC_INFO, "END-1", Debug); return; } int defaultMode = dataProxy->getMostUsedMode(-1); //TODO: The log could be defined here //qDebug() << Q_FUNC_INFO << ": " << QString::number(defaultMode); if (defaultMode < 1) { defaultMode = dataProxy->getSubModeIdFromSubMode(getBand(0)); } setMode(dataProxy->getNameFromSubModeId(defaultMode)); //modeComboBox->setCurrentIndex(modeComboBox->findText(dataProxy->getNameFromSubModeId(defaultMode))); //qDebug() << Q_FUNC_INFO << ": " << QString::number(defaultMode); logEvent (Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << " - END"; } void MainQSOEntryWidget::setDuplicatedQSOSlot (const int _secs) { logEvent (Q_FUNC_INFO, "Start", Debug); if (_secs >= 0) { duplicatedQSOSlotInSecs = _secs; } logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::checkIfDupe(const QString &_func) { Q_UNUSED(_func); #ifdef QT_DEBUG //qDebug() << Q_FUNC_INFO << "(" << _func << ")"; #else #endif logEvent (Q_FUNC_INFO, "Start", Debug); QDateTime _dateTime; _dateTime.setDate(dateEdit->date()); _dateTime.setTime(timeEdit->time()); if ((dataProxy->isThisQSODuplicated(Q_FUNC_INFO, qrzLineEdit->text(), _dateTime, dataProxy->getIdFromBandName(bandComboBox->currentText()), dataProxy->getIdFromModeName(modeComboBox->currentText()), duplicatedQSOSlotInSecs).length()<2) || modify) { //qDebug() << Q_FUNC_INFO << " - NOT DUPE "; //qDebug() << Q_FUNC_INFO << " - Modify: " << util->boolToQString(modify); qrzgroupBox->setTitle(tr("Callsign")); } else { //qDebug() << Q_FUNC_INFO << " - NOT DUPE "; qrzgroupBox->setTitle(tr("DUPE", "Translator: DUPE is a common world for hams. Do not translate of not sure")); } logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::slotStartDelayInputTimer() { logEvent (Q_FUNC_INFO, "Start", Debug); if (cleaning) { logEvent (Q_FUNC_INFO, "END-1", Debug); return; } if (qrzLineEdit->text ().length ()<1) { //qDebug() << Q_FUNC_INFO; slotClearButtonClicked (); logEvent (Q_FUNC_INFO, "END-2", Debug); return; } int cursor = qrzLineEdit->cursorPosition (); QString aux = util->getClearSQLi (qrzLineEdit->text ()); qrzLineEdit->setText (aux.toUpper()); qrzLineEdit->setCursorPosition (cursor); delayInputTimer->start(300); logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::slotDelayInputTimedOut() { logEvent (Q_FUNC_INFO, "Start", Debug); delayInputTimer->stop(); QString text = qrzLineEdit->text(); if( text != lastQrz) { //qDebug() << Q_FUNC_INFO << ": going for slotQRZTextChanged"; text = lastQrz; slotQRZTextChanged(); } logEvent (Q_FUNC_INFO, "END", Debug); } bool MainQSOEntryWidget::getDarkMode() { logEvent (Q_FUNC_INFO, "Start-End", Debug); return (OKButton->palette().color (QPalette::Base) == "#646464"); } /* void MainQSOEntryWidget::keyPressEvent( QKeyEvent *event) { //qDebug() << Q_FUNC_INFO; if(event->key()==Qt::Key_Enter) { //qDebug() << Q_FUNC_INFO << " TAB..."; } } */ bool MainQSOEntryWidget::eventFilter(QObject *object, QEvent *event) { logEvent (Q_FUNC_INFO, "Start", Debug); Q_UNUSED(object); if (!(event->type() == QEvent::Paint )) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(event->type ()); } if ((event->type() == QEvent::KeyPress) || (event->type() == QEvent::ShortcutOverride)) { //qDebug() << Q_FUNC_INFO << "KEY PRESSED"; QKeyEvent *ke = static_cast(event); if (ke->key() == Qt::Key_Tab) { //qDebug() << Q_FUNC_INFO << "KEY PRESSED TAB"; if ((realtimeCheckBox->isChecked ()) && (qrzLineEdit->hasFocus ())) { //qDebug() << Q_FUNC_INFO << "KEY PRESSED TAB AND REAL TIME CHECKED"; //qDebug() << Q_FUNC_INFO << "emitting to hand over to QSO TAB-1"; emit handOverFocusSignal(); } else if((!realtimeCheckBox->isChecked ()) && timeEdit->hasFocus () && (timeEdit->currentSection() == QTimeEdit::SecondSection)) { //qDebug() << Q_FUNC_INFO << "emitting to hand over to QSO TAB-2"; emit handOverFocusSignal(); } // special tab handling here logEvent (Q_FUNC_INFO, "END-1", Debug); return true; } } logEvent (Q_FUNC_INFO, "END", Debug); return QWidget::event(event); } void MainQSOEntryWidget::setFocusToOK() { logEvent (Q_FUNC_INFO, "Start", Debug); OKButton->setFocus (); logEvent (Q_FUNC_INFO, "END", Debug); } void MainQSOEntryWidget::slotCaptureDebugLogs(const QString &_func, const QString &_msg, DebugLogLevel _level) { //qDebug() << Q_FUNC_INFO << _func << "/" << _msg << "/" << QString::number(_level); logEvent(_func, _msg, _level); } void MainQSOEntryWidget::logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level) { //qDebug() << Q_FUNC_INFO; if (logLevel<=_level) { //qDebug() << Q_FUNC_INFO << "Emitting..."; emit debugLog (_func, _msg, _level); } } klog-2.3.3/tipsdialog.cpp0000644000015700001710000003005214542412415015200 0ustar jenkinsjenkins/*************************************************************************** tipsdialog.cpp - description ------------------- begin : sept 2019 copyright : (C) 2019 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "tipsdialog.h" #include #include #include #include #include #include TipsDialog::TipsDialog(QWidget *parent): QDialog(parent) { //qDebug() << "TipsDialog::TipsDialog"; logLevel = Info; //7 Debug /0=emergency or no debug logEvent(Q_FUNC_INFO, "Start", Debug); tipTextQLabel = new QLabel; tipId = 1; tipMax = 19; setWindowTitle(tr("KLog tips")); setWindowFlags(windowFlags() & Qt::WindowContextHelpButtonHint); tipTextQLabel->setWordWrap(true); tipTextQLabel->setOpenExternalLinks(false); tipTextQLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); tipTextQLabel->setTextFormat(Qt::RichText); setTip(1); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); QPushButton *closeButton = buttonBox->button(QDialogButtonBox::Close); QPushButton *nextButton = new QPushButton; QPushButton *prevButton = new QPushButton; nextButton->setText(tr("Next")); prevButton->setText(tr("Previous")); buttonBox->addButton(closeButton, QDialogButtonBox::ButtonRole(QDialogButtonBox::RejectRole | QDialogButtonBox::AcceptRole)); buttonBox->addButton(prevButton, QDialogButtonBox::ButtonRole(QDialogButtonBox::ActionRole)); buttonBox->addButton(nextButton, QDialogButtonBox::ButtonRole(QDialogButtonBox::ActionRole)); //connect(buttonBox , &QDialogButtonBox::rejected, this, &QDialog::reject); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())) ; connect(prevButton, SIGNAL(clicked()), this, SLOT(slotPrevButtonClicked() ) ); connect(nextButton, SIGNAL(clicked()), this, SLOT(slotNextButtonClicked() ) ); connect(tipTextQLabel, SIGNAL(linkActivated(QString)), this, SLOT(slotLinkActivated(QString))); tip = new QWidget; QGridLayout *layout1 = new QGridLayout; layout1->addWidget(tipTextQLabel, 0, 1, 4, 4); tip->setLayout(layout1); QVBoxLayout *layout = new QVBoxLayout(this); layout->addWidget(tip); layout->addWidget(buttonBox); setLayout(layout); logEvent(Q_FUNC_INFO, "END", Debug); } TipsDialog::~TipsDialog(){} void TipsDialog::slotPrevButtonClicked() { logEvent(Q_FUNC_INFO, "Start", Debug); if (tipId>1) { tipId--; } else { tipId = tipMax; } setTip(tipId); logEvent(Q_FUNC_INFO, "END", Debug); } void TipsDialog::slotNextButtonClicked() { logEvent(Q_FUNC_INFO, "Start", Debug); if (tipIdFill in QSO data description = tr("Tip #1:
Do you know...
You can use Tools->Fill in QSO data to automatically read the full log to fill the DXCC, CQ, ITU zones and continent?"); break; case 2: //: Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in DXCC data description = tr("Tip #2:
Do you know...
You can find the QSLs that you still need to send with Tools->QSL tools...->Find My-QSLs pending to send.
This tool will list you in the search box all the QSOs with the QSL-Sent marked as Requested."); break; case 3: //: Translator: Please make sure that the name of the link is coherent with the menu Tools->QSL tools...->Find QSO to QSL description = tr("Tip #3:
Do you know...
You can use Tools->QSL tools...->Find QSO to QSL to look for all those QSO that you should send your QSL because you still need to confirm that DXCC and you have still not send your QSL card?"); break; case 4: //: Translator: Please make sure that the name of the link is coherent with the menu File->Export Requested QSL to ADIF... description = tr("Tip #4:
Do you know...
You can enter a '*' in the search box, in the search window to search for all the QSOs done with one specific station callsign?"); break; case 5: description = tr("Tip #5:
Do you know...
You can find the file containing all your log and other information in the logbook.dat " "file and the klogrc file, containing the KLog config file in the KLog folder by opening the" " File->KLog folder menu?"); break; case 6: //: Translator: Please make sure that the name of the link is coherent with the menu File->KLog folder description = tr("Tip #6:
Do you know...
You can upload your QSO marked as queued to LoTW via TQSL with Tools->LoTW tools ...->Sends the log to LoTW calling TQSL. ?

You have to configure TQSL in the preferences to be able to use this functionality."); break; case 7: //: Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find My-QSLs pending to send description = tr("Tip #7:
Do you know...
You can see the QSO that confirms one specific DXCC entity in one specific band by poiting your mouse over that band in the DXCC widget?"); break; case 8: //: Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find DX-QSLs pending to receive description = tr("Tip #8:
Do you know...
You can find the QSLs that you are still waiting for with Tools->QSL tools...->Find DX-QSLs pending to receive.
This tool will list you in the search box all the QSOs with the QSL-Sent marked as Sent but you have still not received the QSL card from the DX."); break; case 9: //: Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find requested pending to receive description = tr("Tip #9:
Do you know...
You can find the QSLs that you are still waiting for with Tools->QSL tools...->Find requested pending to receive.
This tool will list you in the search box all the QSOs with the QSL-Rec marked as Requested but you have still not received the QSL card from the DX."); break; case 10: description = tr("Tip #10:
Do you know...
You can subscribe to the English KLog Telegram group to discuss about KLog in English?"); break; case 11: description = tr("Tip #11:
Do you know...
You can subscribe to the Spanish Telegram group to discuss about KLog in Spanish?"); break; case 12: description = tr("Tip #12:
Do you know...
You can subscribe to KLog mailing list to discuss via email about KLog in English?"); break; case 13: description = tr("Tip #13:
Do you know...
You can follow EA4K on twitter to get updates about KLog?"); break; case 14: description = tr("Tip #14:
Do you know...
You can write your own review in eHam.net about KLog to help other users to decide to use KLog?"); break; case 15: description = tr("Tip #15:
Do you know...
You can join the development team by simply Contacting us?"); break; case 16: description = tr("Tip #16:
Do you know...
That there are many ways to contribute to KLog and some of them are listed in the KLog Contribute page?"); break; case 17: description = tr("Tip #17:
Do you know...
You can support translating KLog into your language? Please check KLog Translations page."); break; case 18: description = tr("Tip #18:
Do you know...
You can double-click on an entity name in the DXCC table and all the QSOs with that DXCC Entity will be shown in the search box?"); break; case 19: description = tr("Tip #19:
Do you know...
You can right-click on a QSO and select Check in QRZ.com to check that callsign in QRZ.com?"); break; default: //description = tr("TIP-Default: Text"); description = ""; break; } //tipTextEdit->setHtml(description); tipTextQLabel->setText(description); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "TipsDialog::setTip: END" ; } void TipsDialog::slotLinkActivated(const QString &_link) { logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << "TipsDialog::slotLinkActivated: " << _link; //Comprobar el enalce y activar el menu correspondiente if (_link == "#ToolsFillInQSO") { emit fillInQSOSignal(); } else if (_link == "#ToolsFindQSO2QSL") { emit fillInDXCCSignal(); } else if (_link == "#ToolsFillInDXCC") { emit findQSL2QSOSignal(); } else if (_link == "#FileExportQSLADIFToPrint") { emit fileExportToPrintSignal(); } else if (_link == "#FileExportLoTWADIF") { //emit fileExportForLoTWSignal(); } else if (_link == "#FileOpenKLogFolder") { emit fileOpenKLogFolderSignal(); } else if (_link == "#ToolsSendPendingQSL") { emit toolSendPendingQSLSignal(); } else if (_link == "#ToolsReceivePendingQSL") { emit toolRecPendingQSLSignal(); } else if (_link == "#ToolsReceiveRecPendingQSL") { emit toolRecRecPendingQSLSignal(); } else if (_link == "#ToolsUploadLoTW") { emit toolsUploadLoTWSignal(); } logEvent(Q_FUNC_INFO, "END", Debug); } void TipsDialog::logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level) { if (logLevel<=_level) emit debugLog (_func, _msg, _level); } klog-2.3.3/klog.qrc0000644000015700001710000002207214542412415014003 0ustar jenkinsjenkins qml/mapqmlfile.qml img/klog_512x512.png img/klog_256x256.png img/klog_logo.png img/klog.ico img/stop.svg img/play.svg flags/ad.png flags/ae.png flags/af.png flags/ag.png flags/ai.png flags/al.png flags/am.png flags/an.png flags/ao.png flags/ar.png flags/as.png flags/at.png flags/au.png flags/aw.png flags/ax.png flags/az.png flags/ba.png flags/bb.png flags/bd.png flags/be.png flags/bf.png flags/bg.png flags/bh.png flags/bi.png flags/bj.png flags/bm.png flags/bn.png flags/bo.png flags/bq.png flags/br.png flags/bs.png flags/bt.png flags/bv.png flags/bw.png flags/by.png flags/bz.png flags/ca.png flags/canary.png flags/cc.png flags/cd.png flags/cf.png flags/cg.png flags/ch.png flags/ci.png flags/ck.png flags/cl.png flags/cm.png flags/cn.png flags/co.png flags/cr.png flags/cs.png flags/cu.png flags/cv.png flags/cw.png flags/cx.png flags/cy.png flags/cz.png flags/de.png flags/dj.png flags/dk.png flags/dm.png flags/do.png flags/dz.png flags/ec.png flags/ee.png flags/eg.png flags/eh.png flags/england.png flags/southbritish.png flags/er.png flags/es.png flags/balear.png flags/ceuta.png flags/et.png flags/europeanunion.png flags/fam.png flags/fi.png flags/fj.png flags/fk.png flags/fm.png flags/fo.png flags/fr.png flags/ga.png flags/gb.png flags/gd.png flags/ge.png flags/gf.png flags/gh.png flags/gi.png flags/gl.png flags/gm.png flags/gn.png flags/gp.png flags/gq.png flags/gr.png flags/gs.png flags/gt.png flags/gu.png flags/gw.png flags/gy.png flags/hk.png flags/hm.png flags/hn.png flags/hr.png flags/ht.png flags/hu.png flags/id.png flags/ie.png flags/il.png flags/in.png flags/io.png flags/iq.png flags/ir.png flags/is.png flags/it.png flags/jm.png flags/jo.png flags/jp.png flags/ke.png flags/kg.png flags/kh.png flags/ki.png flags/km.png flags/kn.png flags/kp.png flags/kr.png flags/kw.png flags/ky.png flags/kz.png flags/la.png flags/lb.png flags/lc.png flags/li.png flags/lk.png flags/lr.png flags/ls.png flags/lt.png flags/lu.png flags/lv.png flags/ly.png flags/ma.png flags/marquesas.png flags/mc.png flags/md.png flags/me.png flags/mg.png flags/mh.png flags/mk.png flags/ml.png flags/mm.png flags/mn.png flags/mo.png flags/mp.png flags/mq.png flags/mr.png flags/ms.png flags/mt.png flags/mu.png flags/mv.png flags/mw.png flags/mx.png flags/my.png flags/mz.png flags/na.png flags/nc.png flags/ne.png flags/nf.png flags/ng.png flags/ni.png flags/nl.png flags/no.png flags/northernireland.png flags/np.png flags/nr.png flags/nu.png flags/nz.png flags/om.png flags/pa.png flags/pe.png flags/pf.png flags/pg.png flags/ph.png flags/pk.png flags/pl.png flags/pm.png flags/pn.png flags/pr.png flags/ps.png flags/pt.png flags/pw.png flags/py.png flags/qa.png flags/re.png flags/ro.png flags/rs.png flags/ru.png flags/rw.png flags/sa.png flags/sardinia.png flags/sb.png flags/sc.png flags/scotland.png flags/sd.png flags/se.png flags/sg.png flags/sh.png flags/si.png flags/sj.png flags/sk.png flags/sl.png flags/sm.png flags/sn.png flags/so.png flags/sr.png flags/ss.png flags/st.png flags/sv.png flags/sy.png flags/sz.png flags/tc.png flags/td.png flags/tf.png flags/tg.png flags/th.png flags/tj.png flags/tk.png flags/tl.png flags/tm.png flags/tn.png flags/to.png flags/tr.png flags/tt.png flags/tv.png flags/tw.png flags/tz.png flags/ua.png flags/ug.png flags/um.png flags/un.png flags/us.png flags/uy.png flags/uz.png flags/va.png flags/vc.png flags/ve.png flags/vg.png flags/vi.png flags/vn.png flags/vu.png flags/wales.png flags/wf.png flags/ws.png flags/xk.png flags/ye.png flags/yt.png flags/za.png flags/zm.png flags/zw.png flags/shm.png img/marker.png qml/marker.qml klog-2.3.3/hamlibclass.h0000644000015700001710000001257014542412415014775 0ustar jenkinsjenkins#ifndef KLOG_HAMLIBCLASS_H #define KLOG_HAMLIBCLASS_H /*************************************************************************** hamlibclass.h - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles user : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include //#include #include #include #include #include #include #include #include "utilities.h" #include "klogdefinitions.h" // Potential fix of hamlib 4.2 migration #ifndef HAMLIB_FILPATHLEN #define HAMLIB_FILPATHLEN FILEPATHLEN #endif #ifndef FILPATHLEN #define FILPATHLEN 100 #endif class HamLibClass : public QObject { Q_OBJECT public: explicit HamLibClass(QObject *parent = nullptr); ~HamLibClass(); QStringList getRigList (); int getModelIdFromName (const QString &_name); QString getNameFromModelId(const int _id); void setModelId(const int _id); void setPort(const QString &_port); void setPoll(const int _milsecs); void setDataBits(const int data); void setStop(const QString &_stop); void setFlow(const QString &_flow); void setParity(const QString &_parity); void setSpeed(const int _speed); void setRTS(const QString &_state); void setDTR(const QString &_state); void setFreq(const double _fr); void setMode(const QString &_m); void setReadOnly(const bool _r); bool isModeADIFMode(const QString &_m); void setNetworkAddress(const QString &_address); void setNetworkPort(const int _port); bool init(bool _active); bool stop(); bool readRadio(bool _forceRead); bool isRunning(); void initClass(); void clean(); void checkErrorCountAndStop(); double getFrequency(); //void showDebugLog(const QString &_func, const QString &_log); bool loadSettings(); signals: void freqChanged(double newFreq); void modeChanged(QString newFreq); public slots: void slotTimer(); private: bool readRadioInternal(bool _forceRead); void fillRigsList(); static int addRigToList(const struct rig_caps* caps, void* data); QString hamlibMode2Mode(rmode_t _rmode); rmode_t mode2HamlibMode (const QString &_mode); bool errorManage(const QString &_func, const int _errorcode); //rmode_t mode2HamlibMode(const QString &_m); QStringList strings; QTimer *timer; QMap rigName2RigId; QMap rigId2RigName; RIG *my_rig; // handle to rig (instance) freq_t freq, freq_old; // Radio freq rmode_t rmode, mode_old; // Radio mode serial_parity_e sparity; serial_handshake_e shandshake; serial_control_state_e srts, sdtr; int retcode; // generic return code from functions rig_model_t myrig_model; // Integer radio model //hamlib_port_t myport; // Hamlib port pbwidth_t width; //vfo_t vfo; /* vfo selection */ //int strength; /* S-Meter level */ int bauds; // default 9600 int dataBits; // default 8 int stopBits; // default 1 QString flowControl; // default QSerialPort::NoFLowControl QString parity; // default QSerialPort::NoParity QString serialPort; QString networkAddress; int networkPort; int pollInterval; // Poll interval in mSecs int errorCount; // Number of times that the rig has returned an error since last time OK. bool rigLaunched; bool readOnlyMode; // If true, KLog will not modify any parameter (freq/mode...) in the radio. KLog just will follow the radio. bool justEmitted; bool reading; // Just a semaphore to prevent several readings //bool active; //QSerialPort *m_serial; }; #endif // HAMLIBCLASS_H klog-2.3.3/dataproxy_sqlite.h0000644000015700001710000004203514542412415016106 0ustar jenkinsjenkins#ifndef KLOG_DATAPROXY_SQLITE_H #define KLOG_DATAPROXY_SQLITE_H /*************************************************************************** dataproxy_sqlite.h - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include "database.h" #include "qso.h" #include "utilities.h" #include "klogdefinitions.h" //#include "regionalaward.h" class QSO; enum { CQZones = 40, ITUZones = 90, DXCCEntities = 521 // http://www.adif.org/adif302.htm#Country%20Codes }; class DataProxy_SQLite : public QObject { Q_OBJECT public: DataProxy_SQLite(const QString &_parentFunction, const QString &_softVersion="0.0"); ~DataProxy_SQLite(); void setLogLevel (const DebugLogLevel _l); QString getSoftVersion(); QString getDBVersion(); bool reconnectDB(); void createLogModel(); void createLogPanel(); bool haveAtLeastOneLog(); QStringList getColumnNamesFromTableLog(); int getIdFromModeName(const QString& _modeName); int getIdFromBandName(const QString& _bandName); int getSubModeIdFromSubMode(const QString &_subModeName); int getModeIdFromSubModeId(const int _sm); void setCallValidation(const bool _v); QStringList getFields(); QStringList getBands(); QStringList getModes(); QStringList sortBandNamesBottonUp(const QStringList _qs); QStringList getBandIDs(); QStringList getModesIDs(); QStringList getBandsInLog(const int _log); QStringList getModesInLog(const int _log); int getMostUsedBand(const int _log); int getMostUsedMode(const int _log); QString getNameFromBandId (const int _id); QString getNameFromModeId (const int _id); QString getNameFromSubModeId (const int _id); QString getSubModeFromId (const int _id); QString getNameFromSubMode (const QString &_sm); // Checks if a submode is deprecated TODO: CHeck if really needed //QString getNameFromSubMode (const QString &_sm); // DEPRECATED bool isModeDeprecated (const QString &_sm); QString getFreqFromBandId(const int _id); int getBandIdFromFreq(const double _n); QString getBandNameFromFreq(const double _n); double getLowLimitBandFromBandName(const QString &_sm); double getLowLimitBandFromBandId(const int _sm); double getUpperLimitBandFromBandName(const QString &_sm); bool isThisFreqInBand(const QString &_band, const QString &_fr); int getLastQSOid(); QDate getFirstQSODateFromCall (const QString &_call); // If the callsign provided is not valid it provides the date of the first QSO QDate getLastQSODateFromCall (const QString &_call); // If the callsign provided is not valid it provides the date of the last QSO bool addQSOFromWSJTX (const QString &_dxcall, const QString &_mode, const QString &_band, const double _freq, const QString &_mygrid, const QString &_dxgrid, const QString &_rstTX, const QString &_rstRX, const QString &_sRX, const QString &_sTX, const QString &_comment, const QString &_stationcallsign, const QString &_name, const QString &_operator, const QDateTime &_datetime, const QDateTime &_datetime_off, const double txpower, const int _dxcc, const int _logNumber, bool _sendQSL = true); int addQSOFromLoTW(const QString &_call, const QDateTime _datetime, const QString &_mode, const QString &_band, const double _freq, const QDate _qslrdate, const QString &_stationcallsign, const int _logn); int addQSO(QSO &_qso); int addQSOQuery(const QSqlQuery &_q); bool deleteQSO(const int _qsoId); int isWorkedB4(const QString &_qrz, const int _currentLog); QList isThisQSODuplicated(const QString &_callingFunc, const QString &_qrz, const QDateTime &_dateTime, const int _band, const int _mode, const int _secs); int getDuplicatedQSOId(const QString &_qrz, const QDateTime &_datetime, const int _band, const int _mode); bool isDXCCConfirmed(const int _dxcc, const int _currentLog); bool isQSLReceived(const int _qsoId); bool isQSLLoTWReceived(const int _qsoId); bool isQSOConfirmed(const int _qsoId, const bool _checkPaper, const bool _checkLoTW); bool isQSLSent(const int _qsoId); bool qslSentViaDirect(const int _qsoId, const QDate &_updateDate); bool qslSentViaBureau(const int _qsoId, const QDate &_updateDate); bool qslRecViaBureau(const int _qsoId, const QDate &_updateDate); bool qslRecViaBureau(const int _qsoId, const QDate &_updateDate, const bool _queueSentQSL); bool qslRecViaDirect(const int _qsoId, const QDate &_updateDate); bool qslRecViaDirect(const int _qsoId, const QDate &_updateDate, const bool _queueSentQSL); bool qslSentAsRequested(const int _qsoId, const QDate &_updateDate); bool qslRecAsRequested(const int _qsoId, const QDate &_updateDate); bool setClubLogSent(const int _qsoId, const QString &_st, const QDate &_updateDate); bool setLoTWQSLRec (const int _qsoId, const QString &_st, const QDate &_updateDate); bool isHF(const int _band); bool isWARC(const int _band); bool isVHF(const int _band); bool isUHF(const int _band); int getBandFromId(const int _qsoId); int getModeFromId(const int _qsoId); int getDXCCFromId(const int _qsoId); int getCQZFromId(const int _qsoId); QList getBandModeDXCCCQZlogIDFromId(const int _qsoId); QString getCallFromId(const int _qsoId); QStringList getClubLogRealTimeFromId(const int _qsoId); // Complete with previous QString getNameFromQRZ(const QString &_call); QString getQTHFromQRZ(const QString &_call); QString getLocatorFromQRZ(const QString &_call); QString getLocatorFromId (const int _id); QString getIOTAFromQRZ(const QString &_call); QString getQSLViaFromQRZ(const QString &_call); // /Complete with previous QStringList getFilteredLocators(const QString &_band, const QString &_mode, const QString &_prop, const QString &_sat, bool _confirmed = false); bool updateAwardDXCC(); bool updateAwardWAZ(); // QRZ.com bool QRZCOMModifyFullLog(const int _currentLog); // Mark all the log as modified to be sent to QRZ.com bool QRZCOMSentQSOs(const QList &_qsos); // Mark as uploaded // QRZ.com //EQSL bool eQSLModifyFullLog(const int _currentLog); // Mark all the log as modified to be sent to eQSL bool eQSLSentQSOs(const QList &_qsos); // Mark as uploaded //EQSL //CLUBLOG bool clublogSentQSOs(const QList &_qsos); // Mark as uploaded bool clublogModifyFullLog(const int _currentLog); // Mark all the log as modified to be sent to CLubLog // CLUBLOG //LOTW bool lotwSentQueue(const QDate &_updateDate, const int _currentLog); // Mark LOTW QSL SENT as Q (Queued) bool lotwSentYes(const QDate &_updateDate, const int _currentLog, const QString &_station); // Update LOTW QSL SENT marked as Q as Y (Queued) bool lotwSentQSOs(const QList &_qsos); int lotwUpdateQSLReception (const QString &_call, const QDateTime &_dateTime, const QString &_band, const QString &_mode, const QDate &_qslrdate); QList getQSOsListLoTWToSend(const QString &_stationCallsign, const QString &_myGrid, const QDate &_startDate, const QDate &_endDate, bool _justQueued=true, int _logN = -1); //QStringList getQSOsListLoTWNotSent2(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, bool _justQueued=true); QStringList getQSODetailsForLoTWDownload(const int _id); QList getQSOsListeQSLNotSent(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, bool _justQueued=true); QList getQSOsListClubLogToSent(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, bool _justModified=true, int _logN = -1); QList getQSOsListEQSLToSent(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, bool _justModified=true, int _logN = -1); QList getQSOsListQRZCOMToSent(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, bool _justModified=true, int _logN = -1); QList getQSOsListToBeExported(const QString &_stationCallsign, const QString &_grid, const QDate &_startDate, const QDate &_endDate, int _logN = -1); QList getQSOsAll(); QStringList getGridsToBeSent(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, const ExportMode _em, bool _justModified=true, int _logN = -1); int getContinentIdFromContinentShortName(const QString &_n); QString getContinentShortNameFromEntity(const int _n); int getContinentIdFromEntity(const int _n); QStringList getContinentShortNames(); bool isValidContinentShortName(const QString &_n); bool isValidDXCC(const int _e); QStringList filterValidFields(const QStringList &_fields); int getCQzFromPrefix(const QString &_p); int getCQzFromEntity(const int _n); int getITUzFromEntity(const int _n); int getITUzFromPrefix(const QString &_p); QString getEntityNameFromId(const int _n); int getEntityIdFromName(const QString &_e); QString getEntityMainPrefix(const int _entityN); QStringList getEntiNameISOAndPrefixFromId(const int _dxcc); int getEntityIdFromMainPrefix(const QString &_e); bool isNewCQz(int _c); bool isNewEntity(int _e); double getLongitudeFromEntity(const int _e); double getLatitudeFromEntity(const int _e); int getDXCCFromPrefix(const QString &_p); QString getEntityPrefixes(const int _enti); QStringList getLongPrefixes(); QStringList getSpecialCallsigns(); QHash getWorldData(); QStringList getEntitiesNames(); QStringList getEntitiesIds(); int getHowManyEntities(); int getMaxEntityID(bool limit = true); // limit = true implies that it will only shouw ARRL valid DXCC (i.e. will not count Sicily) QStringList getOperatingYears(const int _currentLog); void compressDB(); bool unMarkAllQSO(); // Unmarks all the marked QSO bool clearLog(); // Stats int getQSOonYear(const int _year, const int _logNumber); int getDXCConYear(const int _year, const int _logNumber); int getCQzonYear(const int _year, const int _logNumber); int getQSOsWithDXCC(const int _dxcc, const int _logNumber); int getQSOsAtHour(const int _hour, const int _log); int getQSOsAtHourOnBand(const int _hour, const int _band ,const int _log); int getQSOsOnMonth(const int _month, const int _log); int getHowManyQSOInLog(const int _log); int getHowManyConfirmedQSLInLog(const int _log); int getHowManyQSLSentInLog(const int _log); int getQSOsWithContinent(const QString &_cont, const int _logNumber); int getQSOsInBand(const QString &_band, const int _log); int getQSOsInMode(const QString &_mode, const int _log); int getDXCCInBand(const int _bandid, const bool _confirmed, const int _log); QList> getTop10QSOPerDXCC(const int _log); // Stats - end bool updateQSONumberPerLog(); bool newDXMarathon(const int _dxcc, const int _cq, const int _year, const int _logNumber); QStringList getContestNames(); QStringList getContestCat(const int _catn); QStringList getContestOverlays(); //int getContestTypeN(const int _co, const int _catop, const int _catas, const int _catpo, const int _catba, const int _catov, const int _catmo); //QStringList getDataFromContestType(const int _n); //int getLogTypeNumber(const QString &_logType); //QString getLogTypeName(const int _logType); //QString getLogTypeOfUserLog(const int _logN); int getLogNumberFromQSOId(const int _qsoId); QStringList getBandNames(); QStringList getPropModeList(); bool isValidPropMode(const QString &_prop); bool clearSatList(); bool addSatellite(const QString &_arrlId, const QString &_name, const QString &_downLink, const QString &_upLink, const QString &_mode, int id = -1); int getDBSatId(const QString &_arrlId); QStringList getSatellitesList(); QString getSatelliteUplink(const QString &_sat, int _pair=0); QString getSatelliteDownlink(const QString &_sat, int _pair=0); QString getSatelliteMode(const QString &_sat); QString getSatelliteFullUplink(const QString &_sat); QString getSatelliteFullDownlink(const QString &_sat); QString getSatelliteFullMode(const QString &_sat); QString getSatelliteName(const QString &_sat); QString getSateliteArrlIdFromId(const int _id); QStringList getQSLRcvdList(); QStringList getQSLSentList(); QStringList getClubLogStatusList(); QStringList getQSLViaList(); int getHowManyQSOPerPropMode(const QString &_p, const int _logn); //QStringList getValidCatOptions(const int _currentCat, const int _lowerCa); bool fillEmptyDXCCInTheLog(); int getNumberOfManagedLogs(); QStringList getListOfManagedLogs(); int getMaxLogNumber(); QString getStationCallSignFromLog(const int _log); QStringList getStationCallSignsFromLog(const int _log); QStringList getStationCallSignsFromLogWithLoTWPendingToSend(const int _log); QString getOperatorsFromLog(const int _log); QString getCommentsFromLog(const int _log); QString getLogDateFromLog(const int _log); //QString getLogTypeNFromLog(const int _log); bool addNewLog (const QStringList _qs); bool doesThisLogExist(const int _log); bool updateISONames(); // Update the entities ISO 3166names for the flags QString getISOName(const int _n); bool setDXCCAwardStatus(const int _qsoId); bool setWAZAwardStatus(const int _qsoId); //bool addRegionalAward(RegionalAward _regionalAward); bool addDXCCEntitySubdivision(const QString &_name, const QString &_short, const QString &_pref, const QString &_group, const int _regId, const int _dxcc, const int _cq, const int _itu, const QDate &_startDate, const QDate &_endDate, const bool _deleted); //void getFoundInLog(const QString &_txt, const int _log=-1); QString getADIFQSO(const int _qsoId); bool showInvalidCallMessage(const QString &_call); QList getSatGridStats(int _log=-1); QList getGridStats(int _log=-1); QList getSatDXCCStats(int _log=-1); int getFieldInBand(ValidFieldsForStats _field, const QString &_band, bool confirmedOnly, QString _mode = "ALL", int _log=-1); //bool queryPrepare(const QString &_query); //bool queryBind(const QString &_field, const QString &value); //bool queryExec(); private: bool dbCreated; DataBase *db; QStringList sortBandIdBottonUp(const QStringList _qs); double getFreqFromRange(QString _fr, int _pair = 0); //May even receive: 145.900-146.00 and should return the mid in the range (145.950) QStringList getColumnNamesFromTable(const QString &_tableName); int getPrefixId(const QString &_qrz); //QString changeSlashAndFindPrefix(const QString &_qrz); void logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level); QSO *qso; bool searching; int executionN; Utilities *util; DebugLogLevel logLevel; //QSqlQuery preparedQuery; //QSqlRelationalTableModel *logModel; private slots: void slotCaptureDebugLogs(const QString &_func, const QString &_msg, DebugLogLevel _l); signals: void qsoFound(const QStringList _qs); // Each: QString with format: Fieldname:value void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution void debugLog (QString _func, QString _msg, DebugLogLevel _level); }; #endif //DATAPROXY_SQLITE_H klog-2.3.3/logwindow.h0000644000015700001710000001501314542412415014517 0ustar jenkinsjenkins#ifndef KLOG_LOGWINDOW_H #define KLOG_LOGWINDOW_H /*************************************************************************** logwindow.h - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include //#include #include #include #include #include #include #include #include "dataproxy_sqlite.h" #include "logmodel.h" #include "awards.h" //#include "dxccstatuswidget.h" //#include "elogclublog.h" #include "utilities.h" //#include "logviewsortfilterproxymodel.h" //class LogViewSortFilterProxyModel; //class ItemDelegate; class LogWindow : public QWidget { Q_OBJECT public: explicit LogWindow(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~LogWindow(); void createlogPanel(const int _currentLog); void clear(); void refresh(); void setCurrentLog(const int _currentLog); void qslSentViaBureau(const int _qsoId); //Maybe this could be defined as private and call it with an action, if needed. void qslRecViaBureau(const int _qsoId); //Maybe this could be defined as private and call it with an action, if needed. void qslRecViaDirect(const int _qsoId); bool isQSLReceived(const int _qsoId); bool isQSLSent(const int _qsoId); //void setProxyModel (const bool _p); void sortColumn(const int _c); void setColumns(const QStringList &_columns); signals: void actionQSODoubleClicked(const int _qsoid); void actionDeleteQSO(const int _qsoid); void updateAwards(); void updateSearchText(); //void qsoFound(const QStringList _qs); // Each: QString with format: Fieldname:value void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution //void clearError(); void deleteTheseQSOs(QList _qsos); void exportToADIFTheseQSOs(QList _qsos); void uploadToQRZcomTheseQSOs(QList _qsos); private slots: void slotDoubleClickLog(const QModelIndex & index); void slotRighButtonFromLog(const QPoint& pos); void slotQSLSentViaBureauFromLog(); void slotQSLSentViaDirectFromLog(); void slotQSLRecViaDirectFromLog(); void slotQSLRecViaBureauFromLog(); void slotQsoDeleteFromLog(); void slotQSOToEditFromLog(); void slotQueryErrorManagement(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); void slotCheckQRZCom(); void slotCheckDXHeatCom(); void slotQSOsDeselectAll(); void slotQSOsSelectAll(); void slotQSOsDeleteFromLog(); void slotQSOsExportFromLog(); void slotQSOsUploadToLoTWFromLog(); void slotQSOsUploadToClubLogFromLog(); void slotQSOsUploadToEQSLFromLog(); void slotMultipleQSLSentViaBureauFromLog(); void slotMultipleQSLSentViaDirectFromLog(); void slotMultipleQSLRecViaBureauFromLog(); void slotMultipleQSLRecViaDirectFromLog(); void slotQSOsQRZUploadFromLog(); private: void createUI(); void createActionsCommon(); void createActions(); void deleteQSO(const int _qsoID); void rightButtonFromLogMenu(const int trow); void rightButtonMultipleFromLogMenu(); void showMenuRightButtonFromLogCreateActions(); void showColumn(const QString &_columnName); void setDefaultData(); void setColumnsOfLog(const QStringList &_columns); DataProxy_SQLite *dataProxy; LogModel *logModel; //QItemSelectionModel *selectionModel; Awards *awards; //DXCCStatusWidget *dxccStatusWidget; //eLogClubLog *elogClublog; QTableView *logView; QLabel *logLabel; QAction *delQSOFromLogAct; QAction *qsoToEditFromLogAct; QAction *qslSentViaBureauFromLogAct; QAction *qslSentViaDirectFromLogAct; QAction *qslRecViaBureauFromLogAct; QAction *qslRecViaDirectFromLogAct; QAction *checkQRZCOMFromLogAct; QAction *checkDXHeatFromLogAct; //Multiple selection actions QAction *multipleDeselectAll; QAction *multipleSelectAll; QAction *multipleDelQSOsFromLogAct; QAction *multipleExportToADIFFromLogAct; QAction *multipleQueueForLoTWFromLogAct; QAction *multipleQueueForClubLogFromLogAct; QAction *multipleQueueForQRZCOMFromLogAct; QAction *multipleQueueForEQSLFromLogAct; QAction *multipleQslSentViaBureauFromLogAct; QAction *multipleQslSentViaDirectFromLogAct; QAction *multipleQslRecViaBureauFromLogAct; QAction *multipleQslRecViaDirectFromLogAct; //QAction *moveToAnotherLog; // MOves the selected QSOs to another log. int currentLog; Utilities *util; QStringList columns; //LogViewSortFilterProxyModel *proxyModel; //bool sortingThroughProxyModel; }; /* class ItemDelegate: public QStyledItemDelegate { Q_OBJECT public: ItemDelegate(QWidget *parent=nullptr){} QString displayText(const QVariant &value, const QLocale &locale) const; //QString displayText (const QVariant &value); }; */ #endif // LOGWINDOW_H klog-2.3.3/awarddxmarathon.cpp0000644000015700001710000000574714542412415016242 0ustar jenkinsjenkins#include "awarddxmarathon.h" /*************************************************************************** awarddxmarathon.cpp - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include DXMarathon::DXMarathon(DataProxy_SQLite *dp) { //qDebug() << "DXMarathon::DXMarathon" ; dataProxy = dp; //qDebug() << "DXMarathon::DXMarathon - END" ; } int DXMarathon::getDXMarathonQSO(const int _year, const int _logNumber) { //qDebug() << "DXMarathon::getDXMarathonQSO: " << QString::number(_year); return dataProxy->getQSOonYear(_year, _logNumber); } int DXMarathon::getDXMarathonDXCC(const int _year, const int _logNumber) { //qDebug() << "DXMarathon::getDXMarathonDXCC: " << QString::number(_year); return dataProxy->getDXCConYear(_year, _logNumber); } int DXMarathon::getDXMarathonCQ(const int _year, const int _logNumber) { //qDebug() << "DXMarathon::getDXMarathonCQ: " << QString::number(_year); return dataProxy->getCQzonYear(_year, _logNumber); } int DXMarathon::getDXMarathonScore(const int _year, const int _logNumber) { //qDebug() << "DXMarathon::getDXMarathonScore: " << QString::number(_year); return ( getDXMarathonDXCC(_year, _logNumber) + getDXMarathonCQ(_year, _logNumber)); } bool DXMarathon::neededForDXMarathon(const int _dxcc, const int _cq, const int _year, const int _logNumber) { return dataProxy->newDXMarathon(_dxcc, _cq, _year, _logNumber); } klog-2.3.3/INSTALL.txt0000644000015700001710000000031214542412415014200 0ustar jenkinsjenkinsThis file is about the installation process of KLog. Please read: INSTALL-linux.txt for linux installations. INSTALL-macOS.txt for macOS installations. INSTALL-win.txt for Windows installations. klog-2.3.3/src.pro0000644000015700001710000002710014542412415013646 0ustar jenkinsjenkins#*************************************************************************** # src.pro # # ------------------- # begin : jan 2021 # copyright : (C) 2021 by Jaime Robles # email : jaime@robles.es # *************************************************************************** #/***************************************************************************** # * This file is part of KLog. * # * * # * KLog is free software: you can redistribute it and/or modify * # * it under the terms of the GNU General Public License as published by * # * the Free Software Foundation, either version 3 of the License, or * # * (at your option) any later version. * # * * # * KLog is distributed in the hope that it will be useful, * # * but WITHOUT ANY WARRANTY; without even the implied warranty of * # * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * # * GNU General Public License for more details. * # * * # * You should have received a copy of the GNU General Public License * # * along with KLog. If not, see . * # * * # *****************************************************************************/ CONFIG += app_bundle CONFIG += static #CONFIG += console CONFIG -=depend_includepath #CONFIG += release TEMPLATE = app PKGVERSION = 2.3.3 VERSION = 2.3.3 DEFINES += APP_VERSION=\\\"$$VERSION\\\" APP_NAME = KLog DEFINES += APP_NAME="$$APP_NAME" APP_UNIX_NAME = klog DEFINES += APP_UNIX_NAME="$$APP_UNIX_NAME" message(Building $${APP_NAME} $${VERSION}) message(Qt $$[QT_VERSION] in $$[QT_INSTALL_PREFIX]) #DEFINES *= QT_NO_DEBUG_OUTPUT DEFINES *= QT_USE_QSTRINGBUILDER DEFINES *= QT_STRICT_ITERATORS TARGET = $${APP_UNIX_NAME} QT += core \ gui \ sql \ network \ serialport \ printsupport \ charts \ quickwidgets \ positioning \ widgets greaterThan(QT_MAJOR_VERSION, 4):greaterThan(QT_MINOR_VERSION, 4) { macx:QMAKE_LFLAGS += -Wl,-rpath,@executable_path/../Frameworks } HEADERS += setupdialog.h \ aboutdialog.h \ adif.h \ awarddxmarathon.h \ awards.h \ awardswidget.h \ charts/statsfieldperbandwidget.h \ charts/statsgeneralchartwidget.h \ charts/statsdxccsonsatswidget.h \ charts/statsqsosperyearbarchartwidget.h \ charts/statsentitiesperyearbarchartwidget.h \ charts/statscqzperyearbarchartwidget.h \ charts/statsqsosperbandbarchartwidget.h \ charts/statsqsospermodebarchartwidget.h \ charts/statsqsosperdxccbarchartwidget.h \ charts/statsqsospercontinentbarchartwidget.h \ charts/statsqsosperhourbarchartwidget.h \ charts/statsqsospermonthbarchartwidget.h \ charts/statsworkedconfirmedpiechartwidget.h \ charts/statsworkedsentpiechartwidget.h \ charts/statsgridsonsatswidget.h \ charts/statssentconfirmedpiechartwidget.h \ database.h \ dataproxy_sqlite.h \ downloadcty.h \ dxcluster.h \ dxccstatuswidget.h \ elogqrzlog.h \ eqslutilities.h \ global.h \ hamlibclass.h \ inputwidgets/mainwindowinputqso.h \ inputwidgets/mainwindowinputcomment.h \ inputwidgets/mainwindowmydatatab.h \ inputwidgets/mainwindowinputothers.h \ inputwidgets/mainwindowinputeqsl.h \ inputwidgets/mainwindowinputqsl.h \ inputwidgets/mainwindowsattab.h\ klogdefinitions.h \ lotwutilities.h \ mainqsoentrywidget.h \ mainwindow.h \ qso.h \ searchmodel.h \ searchwindow.h \ #widgets/advancedsearch/advancedsearchmodel.h \ #widgets/advancedsearch/advancedsearchwidget.h \ #widgets/advancedsearch/advancedsearchwindow.h \ logwindow.h \ filemanager.h \ fileawardmanager.h \ locator.h \ startwizard.h \ elogclublog.h \ softwareupdate.h \ softwareupdatedialog.h \ utilities.h \ logmodel.h \ searchwidget.h \ infowidget.h \ showerrordialog.h \ statisticswidget.h \ setuppages/setuppagemisc.h \ setuppages/hamlibnetworkconfigwidget.h \ setuppages/hamlibserialconfigwidget.h \ setuppages/setuppagelogview.h \ setuppages/setuppageuserdata.h \ setuppages/setuppagedxcluster.h \ setuppages/setuppagecolors.h \ setuppages/setuppagelogs.h \ setuppages/setuppageworldeditor.h \ setuppages/setuppagesats.h \ setuppages/setuppagesatsnew.h \ setuppages/setuppagehamlib.h \ setuppages/setuppagelogsnew.h \ setuppages/setuppagebandmode.h \ setuppages/setupentitydialog.h \ setuppages/setuppageudp.h \ setuppages/setuppageelog.h \ setuppages/setuppagesubdivisionnew.h \ setuppages/setuppagesubdivisions.h \ tipsdialog.h \ udpserver.h \ updatesatsdata.h \ widgets/map/mapwidget.h \ widgets/map/mapwindowwidget.h \ widgets/adiflotwexportwidget.h \ widgets/showkloglogwidget.h \ widgets/onlinemessagewidget.h \ widgets/showadifimportwidget.h \ updatesettings.h \ world.h message(Sources) SOURCES += main.cpp \ aboutdialog.cpp \ adif.cpp \ awardswidget.cpp \ charts/statsfieldperbandwidget.cpp \ elogqrzlog.cpp \ eqslutilities.cpp \ lotwutilities.cpp \ mainqsoentrywidget.cpp \ mainwindow.cpp \ inputwidgets/mainwindowinputqso.cpp \ inputwidgets/mainwindowinputcomment.cpp \ inputwidgets/mainwindowmydatatab.cpp \ inputwidgets/mainwindowinputothers.cpp \ inputwidgets/mainwindowinputeqsl.cpp \ inputwidgets/mainwindowinputqsl.cpp \ inputwidgets/mainwindowsattab.cpp\ searchmodel.cpp \ searchwindow.cpp \ setupdialog.cpp \ setuppages/hamlibnetworkconfigwidget.cpp \ setuppages/hamlibserialconfigwidget.cpp \ setuppages/setuppageelog.cpp \ setuppages/setuppagelogview.cpp \ setuppages/setuppagesubdivisionnew.cpp \ setuppages/setuppagesubdivisions.cpp \ widgets/adiflotwexportwidget.cpp \ #widgets/advancedsearch/advancedsearchmodel.cpp \ #widgets/advancedsearch/advancedsearchwidget.cpp \ #widgets/advancedsearch/advancedsearchwindow.cpp \ widgets/map/mapwidget.cpp \ widgets/map/mapwindowwidget.cpp \ widgets/onlinemessagewidget.cpp \ widgets/showadifimportwidget.cpp \ widgets/showkloglogwidget.cpp \ logwindow.cpp \ filemanager.cpp \ fileawardmanager.cpp \ database.cpp \ dataproxy_sqlite.cpp \ downloadcty.cpp \ dxcluster.cpp \ locator.cpp \ qso.cpp \ awards.cpp \ setuppages/setuppagemisc.cpp \ setuppages/setuppageuserdata.cpp \ setuppages/setuppagedxcluster.cpp \ setuppages/setuppagecolors.cpp \ setuppages/setuppagelogs.cpp \ setuppages/setuppageworldeditor.cpp \ setuppages/setuppagelogsnew.cpp \ setuppages/setuppagebandmode.cpp \ setuppages/setuppageudp.cpp \ setuppages/setuppagesats.cpp \ setuppages/setuppagesatsnew.cpp \ setuppages/setuppagehamlib.cpp \ setuppages/setupentitydialog.cpp \ startwizard.cpp \ awarddxmarathon.cpp \ elogclublog.cpp \ softwareupdate.cpp \ softwareupdatedialog.cpp \ utilities.cpp \ dxccstatuswidget.cpp \ logmodel.cpp \ searchwidget.cpp \ infowidget.cpp \ showerrordialog.cpp \ udpserver.cpp \ statisticswidget.cpp \ updatesatsdata.cpp \ charts/statsgeneralchartwidget.cpp \ charts/statsdxccsonsatswidget.cpp \ charts/statsqsosperyearbarchartwidget.cpp \ charts/statsentitiesperyearbarchartwidget.cpp \ charts/statscqzperyearbarchartwidget.cpp \ charts/statsqsospermodebarchartwidget.cpp \ charts/statsqsosperdxccbarchartwidget.cpp \ charts/statsqsospercontinentbarchartwidget.cpp \ charts/statsqsosperhourbarchartwidget.cpp \ charts/statsqsospermonthbarchartwidget.cpp \ charts/statsworkedconfirmedpiechartwidget.cpp \ charts/statsworkedsentpiechartwidget.cpp \ charts/statssentconfirmedpiechartwidget.cpp \ charts/statsqsosperbandbarchartwidget.cpp \ charts/statsgridsonsatswidget.cpp \ hamlibclass.cpp \ tipsdialog.cpp \ updatesettings.cpp \ world.cpp message (Other files) OTHER_FILES += \ README-DEVEL \ TODO \ tips-for-devel.txt \ INSTALL.txt \ INSTALL-linux \ INSTALL-win.txt \ Changelog \ INSTALL-osx.txt \ NEWS \ klog.1 \ COPYING \ AUTHORS \ README message (More...) RESOURCES += klog.qrc DESTDIR = build/target/ OBJECTS_DIR = build/obj/ MOC_DIR = build/moc/ RCC_DIR = build/rcc/ #D_OBJECTS = $(SRC:%.cpp=build/obj/%.o) #R_OBJECTS = $(SRC:%.cpp=build/obj/%.o) # Tell Qt Linguist that we use UTF-8 strings in our sources CODECFORTR = UTF-8 CODECFORSRC = UTF-8 #include(translations/translations.pri) message (Translations) TRANSLATIONS = translations/klog_es.ts \ translations/klog_ca.ts \ translations/klog_cs.ts \ translations/klog_da.ts \ translations/klog_de.ts \ translations/klog_fi.ts \ translations/klog_fr.ts \ translations/klog_hr.ts \ translations/klog_it.ts \ translations/klog_ja.ts \ translations/klog_lv.ts \ translations/klog_pl.ts \ translations/klog_uk.ts message(End of translations...) isEmpty(QMAKE_LRELEASE) { win32|os2:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\lrelease.exe else:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease unix { !exists($$QMAKE_LRELEASE) { QMAKE_LRELEASE = lrelease-qt5 } } else { !exists($$QMAKE_LRELEASE) { QMAKE_LRELEASE = lrelease } } } updateqm.input = TRANSLATIONS updateqm.output = $$DESTDIR/translations/${QMAKE_FILE_BASE}.qm updateqm.commands = $$QMAKE_LRELEASE ${QMAKE_FILE_IN} -qm $$DESTDIR/translations/${QMAKE_FILE_BASE}.qm updateqm.CONFIG += no_link target_predeps QMAKE_EXTRA_COMPILERS += updateqm # deploy DISTFILES += Changelog COPYING \ qml/mapqmlfile.qml \ qml/marker.qml unix:!mac { message(unix:!mac) DEFINES += APP_LINUX CONFIG += c++11 #QMAKE_CXXFLAGS += --coverage #LIBS += -lgcov # Translations should be copied in /usr/share/klog/translations # https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard # QT += dbus isEmpty(PREFIX):PREFIX = /usr BINDIR = $$PREFIX/bin DATADIR = $$PREFIX/share PKGDATADIR = $$DATADIR/klog INSTALLS += target target.path = $$BINDIR translations.path = $$PKGDATADIR/translations translations.files += $$DESTDIR/translations/* datafiles.path = $$PKGDATADIR datafiles.files = $$DISTFILES INSTALLS += translations INSTALLS += datafiles LIBS += -lhamlib } macx: { message(macx) ICON = klog.icns TARGET = KLog CONFIG += c++11 #INCLUDEPATH +=../../../hamlib/include/ #LIBS += -L"../../../hamlib/lib" -lhamlib INCLUDEPATH +=/usr/local/include/ LIBS += -L"/usr/local/lib" -lhamlib } win32: { message(windows) RC_ICONS = klog.ico TARGET = klog QMAKE_TARGET_COMPANY = EA4K QMAKE_TARGET_DESCRIPTION = Hamradio logging contains(QT_ARCH, i386) { message("32-bit") LIBS += -L"$$PWD/../../libs/hamlib/lib/gcc" -lhamlib LIBS += -L"$$PWD/../../libs/hamlib/bin" INCLUDEPATH += "$$PWD/../../libs/hamlib/include/" } else { message("64-bit") LIBS += -L"$$PWD/../../libs/hamlib-w64/lib/gcc" -lhamlib LIBS += -L"$$PWD/../../libs/hamlib-w64/bin" INCLUDEPATH += "$$PWD/../../libs/hamlib-w64/include/" } } klog-2.3.3/updatesatsdata.h0000644000015700001710000000454214542412415015522 0ustar jenkinsjenkins#ifndef KLOG_UPDATESATSDATA_H #define KLOG_UPDATESATSDATA_H /*************************************************************************** updatesatsdata.h - description ------------------- begin : sep 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include "utilities.h" #include "dataproxy_sqlite.h" #include "dataproxy_sqlite.h" class UpdateSatsData : public QObject { Q_OBJECT public: explicit UpdateSatsData(DataProxy_SQLite *dp, QObject *parent = nullptr); ~UpdateSatsData(); bool readSatDataFile(); bool satDataFileRead(const QString& tfileName); private: Utilities *util; DataProxy_SQLite *dataProxy; signals: void satsUpdatedSignal(const bool _p); // void clearError(); public slots: }; #endif // UPDATESATSDATA_H klog-2.3.3/tips-for-devel.txt0000644000015700001710000000045114542412415015736 0ustar jenkinsjenkinsSQLite http://www.w3schools.com/sql/default.asp Transfer or populate sqlite table to another table INSERT INTO TABLE2 (COL1, COL2, COL3) SELECT COL1, COL4, COL7 FROM TABLE1 Select only different DXCC select count (distinct dxcc) from log DELETED ENTITIES: http://www.ng3k.com/Dxcc/dxccde.html klog-2.3.3/translations/0000755000015700001710000000000014542412415015056 5ustar jenkinsjenkinsklog-2.3.3/translations/klog_fr.ts0000644000015700001710000137502514542412415017066 0ustar jenkinsjenkins AboutDialog About KLog A propos de KLog By Par KLog is a free logbook for hamradio operators. KLog est un carnet de trafic libre pour les radioamateurs. Please be aware that this is a development release and it may contain many bugs.<br>Backup your data before using this software! Since 0.6.2, KLog has been fully rewritten to provide a cross-platform application that runs on all major operating systems (GNU/Linux, macOS and Windows) and to support new functionality. Please provide your review in KLog's eHam review page: Veuillez fournir votre révision dans la page de révision eHam de KLog : Find more information and the latest release at Trouvez plus d'information et la dernière version à Author Auteur today aujourd'hui Main developer Développeur principal KLog is developed by a very small team and you are invited to join! KLog est développé par une très petite équipe et vous êtes invités à nous rejoindre ! If you want to provide support you are welcome to join the <a href="https://groups.io/g/klog">KLog mailing list</a>! Be aware that you can enable/disable this feature from the Misc tab in the Setup page. You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Vous pouvez aussi nous aider en postant des rapports de bogues ou de petites contributions au code source, idées ou tout ce qui selon vous, pourrait améliorer KLog. Authors Auteurs Translators bring KLog into your language. They are really an important part of the KLog development team. Les traducteurs portent KLog dans votre langue. Ils ont une part importante dans l'équipe de développement KLog. If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://groups.io/g/klog">KLog mailing list</a>! Translators Traducteurs Privacy advisory Avis de confidentialité KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account users' needs. At present, the data that is provided is the following: Actuellement, les données qui sont collectées sont les suivantes : Callsign Indicatif KLog version Version de KLog Operating system Système d'exploitation KLog KLog Privacy Confidentialité AdifLoTWExportWidget Select the Station Callsign that you want to use to upload the log. Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign. Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign. Station callsign My Locator Mon Locator Start date End date Ok Ok Cancel Annuler DX Date/Time Date/Heure Band Bande Mode Mode Not defined ALL QSOs: %1/%2 All Tout KLog - QSOs to be uploaded to LoTW. This table shows the QSOs that will be sent to LoTW. KLog - QSOs to be uploaded to ClubLog. This table shows the QSOs that will be sent to ClubLog. KLog - QSOs to be uploaded to eQSL.cc. This table shows the QSOs that will be sent to eQSL.cc. KLog - QSOs to be uploaded to QRZ.com. This table shows the QSOs that will be sent to QRZ.com. This table shows the QSOs that will be exported to ADIF. AwardsWidget Recalculate Recalculer Click to recalculate the award status. Cliquer pour recalculer le statut du diplôme Select the year you want to check. Sélectionnez l'année que vous souhaitez vérifier. QSOs QSOs DXCC DXCC CQ CQ Award Diplôme Confirmed Confirmé Worked Réalisé WAZ WAZ Score Score Annual Annuel Number of confirmed DXCC entities. Nombre d'entités DXCC confirmées. Number of worked DXCC entities. Nombre d'entités DXCC contactées. Number of confirmed WAZ zones. Nombre de zones WAZ confirmées. Number of worked WAZ zones. Nombre de zones WAZ contactées. Number of confirmed QSOs. Nombre de QSOs confirmés. Number of worked QSOs. Nombre de QSOs réalisés. Number of QSOs worked in the selected year. Number of DXCCs worked in the selected year. Number of CQ Zones worked in the selected year. Score for the DXMarathon in the selected year. DX-Marathon DX-Marathon CTYPage Country data download Téléchargement des données des Pays KLog needs country data... Klog a besoin des données des pays... &Download Télécharger &Ignore Ignorer Country data needed Données de pays nécessaire KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do. Click on Download to download now. Cliquer sur Télecharger pour télécharger maintenant. KLog KLog I can't find the host. Please check your network and try again Do you want to try again? Je ne peux pas trouver le serveur distant. Veuillez vérifier votre connexion réseau et réessayez Souhaitez-vous réessayez ? DXCCStatusWidget Update Mise à jour It seems that the DXCC status in your database is not updated and KLog can't find any dxcc information. You can try to fix this by updating the log. Do you want to update your DXCC status? Entity Entité Prefix Préfixe Pref: Préf : CQ: CQ : ITU: ITU : Beam: Beam : Entity not worked in this band. Entité non contacté sur cette bande DXClusterWidget Click on Connect to connect to the DX-Cluster server Cliquez sur Se connecter pour se connecter au serveur DX-Cluster Connect Se connecter Clear Effacer Check in QRZ.com Check this callsign in QRZ.com Click on connect to connect to the DX-Cluster Cliquer sur Se connecter pour se connecter au DX-Cluster Trying to connect to the server Tentative de connexion au serveur KLog DXCluster DXCluster KLog The host was not found. Please check: Le serveur distant n'a pas été trouvé. Veuillez vérifier : - your network connection; - the host name and port settings. - Votre connexion réseau ; - La configuration du nom d'hôte et du port du serveur distant. The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. La connexion a été refusée par le serveur distant. Soyez sûr que le serveur DXCluster est lancé et vérifiez que le paramètrage du nom d'hôte du serveur distant et du port sont corrects. The following error occurred: %1. L'erreur suivante s'est produite : %1. Connected to server Connecté au serveur KLog message Message KLog Enter your callsign to connect to the cluster: Entrez votre indicatif pour vous connecter au cluster : Enter your password to connect to the cluster: (Just hit enter for no password) Entrez votre mot de passe pour vous connecter au cluster : (Tapez juste sur la touche Entrée s'il n'y a pas de mot de passe) Disconnect Sé déconnecter Not logged on, you may need to enter your callsign again. Non connecté, vous devrez peut-être ressaisir votre indicatif. Enter here the commands to be sent to the DX-Cluster server. Saisir ici les commandes à envoyer au serveur DX-Cluster Connection closed by the server Connexion fermée par le serveur Click on Connect to connect to the DX-Cluster server. Cliquer sur "Se connecter" pour se connecter au serveur DX-Cluster. Send Envoyer It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! DataProxy_SQLite Software version in DB is null La version du logiciel dans la BD est null Query didn't failed Aircraft Scatter Common term in hamradio, do not translate if not sure Aircraft Scatter Aurora Aurora Aurora-E Aurora-E Back scatter Common term in hamradio, do not translate if not sure Back scatter Earth-Moon-Earth Terre-Lune-Terre Sporadic E Sporadique E Field Aligned Irregularities Common term in hamradio, do not translate if not sure Field Aligned Irregularities F2 Reflection Common term in hamradio, do not translate if not sure F2 Reflection Internet-assisted Assisté par Internet Ionoscatter Common term in hamradio, do not translate if not sure Ionoscatter Meteor scatter Common term in hamradio, do not translate if not sure Meteor scatter Terrestrial or atmospheric repeater or transponder Répéteur terrestre ou atmosphérique ou transpondeur Rain scatter Common term in hamradio, do not translate if not sure Rain scatter Satellite Satellite Trans-equatorial Common term in hamradio, do not translate if not sure Trans-équatorial Tropospheric ducting Common term in hamradio, do not translate if not sure Tropospheric ducting Yes Oui No Non Requested Demandé Ignore/Invalid Ignoré/Incorrect Validated Validé Queued Mis en file d'attente Uploaded Téléversé Do not upload Ne pas téléverser Modified Modifié Bureau Common term in hamradio, do not translate if not sure Bureau Direct Direct Electronic Électronique Manager Common term in hamradio, do not translate if not sure Manager KLog DXCC DXCC KLog All QSOs have been updated with a DXCC and the Continent. Tous les QSOs ont été mis à jour avec le DXCC et le continent. KLog - Invalid call detected An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported ADIF record? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. DownLoadCTY Download of cty.csv failed with the following error code: Le téléchargement de cty.csv a échoué avec le code d'erreur suivant : Download of cty.csv done. Téléchargement de cty.csv terminé. There is already a cty.csv file in the folder but it will be replaced with the new one. Il y a déjà un fichier cty.csv dans le répertoire, il va être remplacé par le nouveau. Could not open %1 for writing Ouverture impossible de %1 pour écriture FileAwardManager Open Award file Award files (*.awa) Award file not opened KLog was not able to read the award file It was not possible to open the file %1 for reading. AWA wrong format The AWA file does not have the right format AWA file does not have an <EOH> field KLog - %1 FileManager Writing ADIF file... En cours d'enregistrement du fichier ADIF... Abort writing Annuler l'enregistrement QSO: QSO : Writing ADIF file... QSO: Enregistrement du fichier ADIF... QSO : You have canceled the file export. The file will be removed and no data will be exported. Vous avez annulé l'export du fichier. Le fichier sera supprimé et aucune donnée ne sera exportée. KLog - Error The selected log does not exist, please check it again. The file %1 can't be opened. KLog - Don't ask again Do you want to reuse your answer? KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again. <ul><li>Date/Time:</i> %1</li><li>Callsign: %2</li><li>Band: %3</li><li>Mode: %4</li></ul> KLog - QSO not found Do you want to add this QSO to the log?: We have found a QSO coming from LoTW that is not in your local log. Do you want KLog to add this QSO to the log? KLog - Invalid call detected An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported log file? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log file? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. You can, however, edit the ADIF file once the export process is finished. KLog - User cancelled Do you still want to cancel? Souhaitez-vous toujours annuler ? The selected callsign (%1) is not valid, please check it again to export the log. KLog - File not opened It was not possible to open the file %1 for reading. KLog was not able to read the LoTW file Processing LoTW ADIF file... Abort processing LoTW reading KLog - Add new QSOs? Do you want to add non existing QSOs to your local log? There are some QSOs in the LoTW log that are not in your local log. Processing LoTW ADIF file...... QSO: %1 / %2 You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated. Reading LoTW file... Lecture en cours du fichier LoTW... Abort reading Lecture interrompue Importing LoTW ADIF file... KLog - Log selection There is more than one log in this logfile. Il y a plus d'un log dans ce fichier de logs. All logs will be imported into the current log. Tous les logs seront importés dans le log en cours. Do you want to continue? Souhaites-vous continuer ? Reading ADIF file... Lecture du fichier ADIF en cours... Do you want to add dupe QSOs to your local log? There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date. Importing ADIF file... Importation du fichier ADIF en cours... KLog - Duplicated QSOs It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) Il semble qu'il y ait quelques QSOs en doublon dans le fichier ADIF que vous importez. Souhaitez vous continuer ? (Les QSOs en doublon ne seront pas importés) Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO with %1 on %2: KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO on %1: You have canceled the file import. The file will be removed and no data will be imported. There are no QSOs pending to be exported with that station callsign. Export Exporting ADIF file... QSO: %1 / %2 Export progress Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information. If you select NO, maybe the QSO will not be imported. Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. KLog - Apply to all QSOs in this log? Please edit the ADIF file and make sure that it include at least: Veuillez éditer le fichier ADIF et soyez sûr qu'il contient à minima : and et This QSO had: Ce QSO a : This QSO is not including the minimum data to consider a QSO as valid! - The band missing and the following call: - La bande est manquante pour l'indicatif suivant : - The mode missing and the following call: - Le mode est manquant pour l'indicatif suivant : - The date missing and the following call: - La date est manquante pour l'indicatif suivant : - The time missing and the following call: - L'heure est manquante pour l'indicatif suivant : Do you want to continue with the current file? Souhaitez-vous continuer avec le fichier en cours ? KLog: Not all required data found! KLog : Tous les données requises n'ont pas été trouvés ! KLog - No Station callsign entered. KLog - QSO without Station Callsign KLog: No RST TX found! KLog : Pas de RST TX trouvé ! KLog: No RST RX found! KLog : Pas de RST RX trouvé ! HamLibNetworkConfigWidget Enter the hostname or address of the radio. Set de network port of the radio. Host/Address Port Port Enter the port of the radio. HamLibSerialConfigWidget Bauds Bauds Select the serial port speed. Sélectionner la vitesse du port série Port Port Select the serial port. Only the serial ports that are detected are shown. Sélectionner le port série. Seuls les ports série détectés sont affichés. Scan Scanner Click to identify the serial ports available in your computer. Cliquer pour identifier les ports série disponible sur votre ordinateur 5 bits 5 bits 6 bits 6 bits 7 bits 7 bits 8 bits 8 bits Data bits Bits de données Select the serial data bits. Sélectionner les bits de données None Aucun Hardware Matériel Software XON/XOFF Software XON/XOFF Flow control Contrôle de flux Select the serial flow control Sélectionner le contrôle de flux No parity Pas de parité Even Pair Odd Impair Space Espace Mark Marque Parity Parité Select the serial parity. Sélectionner la parité 1 bit 1 bit 1.5 bits 1,5 bits 2 bits 2 bits Stop bits Bits d'arrêt Select the serial stop bits. Sélectionner les bits d'arrêt InfoWidget 10M 10M 15M 15M 20M 20M 40M 40M 80M 80M 160M 160M 2M 2M 6M 6M 12M 12M 17M 17M 30M 30M 70CM 70CM Continent Continent Prefix Préfixe CQ CQ ITU ITU Short Path Chemin Court Long Path Chemin Long Deg Deg Miles Miles Km Km IntroPage Welcome to KLog! Bienvenue sur KLog ! Welcome to KLog! - brought to you under the terms of the GPL! Bienvenue sur KLog ! - vous est présenté selon les termes de la GPL ! Welcome to KLog Bienvenue sur KLog This looks like it's the first time you've run KLog on this computer. Il semble que c'est la première fois que vous lancez KLog sur cet ordinateur. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. It is designed to provide general purpose DX, and contest logging. It supports QSL management, import and export of ADIF Il supporte la gestion des QSLs, l'import et l'export and Cabrillo file formats and many other features... aux formats de fichiers ADIF et Cabrillo et aussi beaucoup d'autres fonctionnalités... Before you can start using KLog, you will be asked to: Avant que vous puissiez utiliser KLog, il va vous être demandé de : Acknowledge to the terms of the license. Prendre connaissance des termes de la licence. Download the DX entities information. Télécharger les informations des entités DX. Enter your callsign, CQ zone, etc. and main configuration. Entrer votre indicatif, zone CQ etc... et la configuration principale. Enjoy KLog and contact the development team if you have any suggestions! Appréciez KLog et contactez l'équipe de développement si vous avez des suggestions ! LicPage KLog License information Information de licence KLog Welcome to KLog!- brought to you under the terms of the GPL! Bienvenue sur KLog ! - vous est présenté selon les termes de la GPL ! Acknowledge Remerciements Be aware that KLog is free software. Sachez que KLog est un logiciel libre. LoTWUtilities KLog - LoTW password needed Please enter your LoTW password: Are you sure that you want to use that station callsign (%1)? There is a file already existing with the name that will be used. The file %1 already exist. Do you want to overwrite? KLog was not able to save the file %1. Error returned: %2 Downloading data to file: %1. KLog - LoTW download This is the first date of a QSO with the callsign %1 in this log If you think that in LoTW you may have previous QSOs, answer No. Do you want to use this date (%1) as start date? The remote server redirected our connection to %1 Do you want to follow the redirection? It was not possible for find the file %1 that has been just downloaded. It seems that LoTW has no QSO with the Station Callsign you are using (%1). Try again and send the downloaded file (%1) to the KLog developer for analysis. KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data? KLog - LoTW File already exists Double click on the date that you want to use as the start date for downloading QSOs. KLog - LoTW Station callsign There is not a single QSO in the log with that station callsign. KLog - LoTW Can't write the file The file %1 already exists. KLog - LoTW Start date selection KLog - LoTW Download error There was an error (%1) while downloading the file from LoTW. The downloading error details are: %1 KLog - LoTW Redirection found KLog - LoTW File not found KLog can't find the downloaded file. KLog - LoTW user/password error LoTW server did not recognized your user/password Check your user and password and ensure your are using the right one before trying again. KLog - LoTW No QSOs LoTW sent no QSOs KLog - LoTW Unknown error KLog can't recognize the file that has been downloaded from LoTW. Now KLog will process the downloaded QSO and update your local log. LogWindow QSL Send QSL envoyée QSL Rcvd QSL reçue &Delete Supprimer Delete a QSO Supprimer un QSO &Edit QSO &Editer un QSO Edit this QSO Editer ce QSO Via &bureau Via &bureau Send this QSL via bureau Envoyer cette QSL via bureau D&irect D&irecte Send this QSL via direct Envoyer cette QSL via direct Via bureau Via bureau QSL &received via bureau QSL &reçue via bureau Direct Direct QSL received via direc&t QSL reçue via direc&t Check in QRZ.com Check this callsign in QRZ.com Check in DXHeat.com Check this callsign in DXHeat.com Delete selected QSOs Delete the selected QSOs Export to ADIF Export the selected QSOs to an ADIF file. Upload to LoTW Upload the selected QSOs to LoTW Upload to ClubLog Upload the selected QSOs to ClubLog Upload to eQSL.cc Upload the selected QSOs to eQSL.cc Send these QSLs via bureau Send these QSLs via direct QSLs received via bureau QSLs received via direc&t Select none Remove all selections Select all Select all the QSOs MainQSOEntryWidget &Add &Ajouter &Clear Effa&cer Callsign of the QSO. Band of the QSO. Bande Mode of the QSO. Mode Date of the QSO. Date Time of the QSO. Heure Add the QSO to the log. Ajouter le contact Clears the QSO entry. Efface la saisie Look up info about the current callsign on qrz.com KLog will show real time if enabled. Real time Stop wsjt-x and hamlib from automatically updating QSO information. Manual Mode Callsign Indicatif &Save &Cancel &Annuler DUPE Translator: DUPE is a common world for hams. Do not translate of not sure DOUBLON MainWindow Starting KLog Démarrage de Klog DX Entity Entité DX &Log Window Fenêtre de &log KLog KLog Log backup recommended! Ready Prêt An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: Une erreur inattendue s'est produite en essayant d'ajouter votre QSL au fichier de log. Si le problème persiste, veuillez contacter le développeur pour analyse : You have selected an entity: Vous avez sélectionné une entité : that is different from the KLog proposed entity: qui est différente de l'entité proposée par KLog : Click on the prefix of the correct entity or Cancel to edit the QSO again. Cliquez sur le préfixe de l'entité correcte ou Annuler pour éditer à nouveau le QSO. Click on the prefix of the right entity or Cancel to correct. Cliquez sur le préfix de l'entité correcte ou Annuler pour corriger. RSTrx RSTrx RSTtx RSTtx You need to select one station callsign to be able to send your log to LoTW. You need to select one station callsign to be able to send your log to ClubLog. Do you want to add this QSOs to your ClubLog existing log? If you don't agree, this upload will overwrite your current ClubLog existing log. KLog - eQSL It was not possible to define the KLog folder. Some functions may not work properly! KLog needs to update the Entities database. KLog - Backup KLog - New version detected! KLog - ClubLog error KLog - eQSL error KLog - %1 KLog - ADIF export Queue all QSOs from this log to be sent Download from LoTW ... Download the full log from LoTW ... ClubLog tools ... Upload the queued QSOs to ClubLog ... eQSL tools ... Upload the queued QSOs to eQSL.cc ... QRZ.com tools ... Upload the queued QSOs to QRZ.com ... Update cty.csv Update Satellite Data Online manual (F1) ... &Tips ... &About ... About Qt ... Check updates ... Now you can upload them to LoTW. There was a problem to mark all pending QSOs as queued for LoTW! All queued QSOs of this log has been marked as sent to LoTW! There was a problem to mark all queued QSOs as sent to LoTW! About ... KLog - Update checking result Select the Station Callsign to use when quering LoTW: Please check the LoTW setup You have not defined a LoTW user or a proper Station Callsign. Open the LoTW tab in the Setup and configure your LoTW connection. The log is ready to be uploaded to ClubLog. All the QSOs in this log has been marked as Modified in the ClubLog status field KLog could not mark the full log to be sent to ClubLog Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers. The log is ready to be uploaded to eQSL.cc. All the QSOs in this log has been marked as Modified in the eQSL.cc status field KLog could not mark the full log to be sent to eQSL The log is ready to be uploaded to QRZ.com. All the QSOs in this log has been marked as Modified in the QRZ.com status field KLog could not mark the full log to be sent to QRZ.com You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. Filling QSOs ... Date/Time Date/Heure Do you really want to exit KLog? Souhaitez-vous quitter KLog ? &File &Fichier Import an ADIF file into the current log. Importer un fichier ADIF dans le log en cours. Export the current log to an ADIF logfile. Exporter le log en cours vers un fichier de log ADIF. Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Exporter TOUS les QSOs dans un fichier ADIF en fusionnant les QSOs de tous les logs. Print your log. Imprimer votre log KLog folder Répertoire de KLog Opens the data folder of KLog. Ouvre le répertoire de données de KLog. E&xit Quitter &Tools Ou&tils Fill in QSO data Saisir les données de QSO Go through the log reusing previous QSOs to fill missing information in other QSOs. Parcourir le log pour compléter des informations manquantes dans d'autres QSOs en réutilisant de précédents QSOs. Shows QSOs for which you should send your QSL and request the DX QSL. Affiche les QSOs pour lesquels vous devez envoyer votre QSL et demander la QSL DX. Find My-QSLs pending to send Rechercher Mes-QSLs en attente d'envoi Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Affiche les QSOs avec des demandes en attente d'envoi de QSLs. Vous devriez conserver cette file vide ! Mark all queued QSOs in this log as sent to LoTW. Marquer tous les QSOs en file d'attente de ce log comme envoyé à LoTW. Mark all queued QSOs as sent to LoTW. Marquer tous les QSOs en file d'attente comme envoyés à LoTW. It was not possible to open the debug file for writing. No debug log will be saved! KLog - Not valid call Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. None Aucun You have requested to delete the QSO with: %1 Vous avez demandé à supprimer le QSO avec : %1 Are you sure? Êtes-vous sûr ? You have requested to delete several QSOs The ClubLog upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? KLog - ClubLog KLog - ClubLog There was an error while updating to Yes the ClubLog QSO upload information. The ClubLog upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The file has not been removed. It seems that there was something that prevented KLog from removing the file You can remove it manually. The eQSL upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1 Do you want to mark as Uploaded all the QSOs uploaded to eQSL? There was an error while updating to Yes the eQSL QSO upload information. The eQSL upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The QRZ.com upload process has finished with an error and the log was possibly not uploaded. Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? KLog - QRZ.com KLog - Stop the war in Ukraine! KLog - Stop the war in Ukraine! You are using a Russian call (%1). You can probably help to stop the Russian war, people are dying. Please call your leaders to stop the war. You are using an Ukranian call. Please take care and protect yourself and your family. The KLog developers wish you the best of luck in this very difficult moment. People are dying in the war of Russia against Ukraine. You can help to stop the Russian war against Ukraine. Please show your disagreement to your leaders, or in your social network to stop the war. Always check the current callsign in QRZ.com Upload queued QSOs to LoTW KLog - KLog folder not found Do you want to update now? You seem to have never backed up or exported your log to ADIF. Your latest backup seems older than one month. Regular backups prevent data loss and are good operator practice. Once exported, copy your ADIF file to a safe place such as a USB drive, cloud drive or other offsite computer. KLog will remind you to backup on a monthly basis. Backup completed successfully KLog will remind you again in approximately one month. Backup failed. Periodic data backups are recommended to prevent data loss and corruption of your log. This version of KLog requires that the DXCC database is updated. The database will be updated. The setup will now open to allow you to change your settings. KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 KLog - QRZ.com warning QRZ.com has returned a non-subcribed error and queries to QRZ.com will be disabled. Please check your QRZ.com subcription or credentials. There was an error while updating to Yes the QRZ.com QSO upload information. The QRZ.com upload process has finished successfully Call not found in QRZ.com You need to activate the %1 service in the eLog preferences. It is important to export to ADIF and save a copy as a backup. Saving the log was done successfully. The ADIF export was not properly done. &Import from ADIF ... Export to ADIF ... Export all logs to ADIF ... &Print Log ... Settings ... QSL tools ... Find QSO to QSL Find DX-QSLs pending to receive Shows DX-QSLs for which requests or QSLs have been sent with no answer. Find requested pending to receive Shows the DX-QSLs that have been requested. LoTW tools ... Mark all non-sent QSOs in this log as queued to be uploaded. Queue all QSLs to be sent Put all the non-sent QSOs in the queue to be uploaded. Mark all queued QSOs from this log as sent Mark all queued QSOs as sent Check the current callsign in QRZ.com For updated DX-Entity data, update cty.csv. Pour des données d'entités DX mises à jour, mettre à jour cty.csv. Stats Statistiques Show the statistics of your radio activity. Afficher les statistiques de votre activité radio Show Map &Help Aide &Debug ... Do you really want to mark ALL the QSOs of this log to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. Do you really want to mark ALL pending QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded. Error #2: Upload was rejected by LoTW, please check your data. Error #3: The TQSL server returned an unexpected response. Error #4: There was a TQSL error. Error #5: There was a TQSLLib error. Error #6: It was not possible to open the input file. Error #7: It was not possible to open the ouput file. Error #8: No QSOs were processed since some QSOs were duplicates or out of date range. Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range. Error #10: Command syntax error. KLog sent a bad syntax command. Error #11: LoTW Connection error (no network or LoTW is unreachable). Error #00: Unexpected error. Please contact the development team. The log that you have selected contains more than just one station callsign. Le log que vous avez sélectionné contient plus qu'un seul indicatif de station. Please select the station callsign you want to mark as sent to LoTW: Veuillez sélectionner l'indicatif de la station que vous souhaitez marquer comme envoyé à LoTW : Station Callsign: Indicatif de la Station : Define Station Callsign Définir l'indicatif de la Station Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Enter l'indicatif de la station à utiliser pour ce log ou laisser vide pour un QSO sans un indicatif de station défini : You have selected no callsign. KLog will complete the QSOs without a station callsign defined and those with the callsign you are entering here. KLog - No station selected No station callsign has been selected and therefore no log will be marked Aucun indicatif de station n'a été sélectionné, par conséquent aucun log ne sera marqué Congratulations! Félicitations ! You already have the latest version. Vous disposez déjà de la dernière version. You can find the KLog data folder here: Vous pouvez trouver le répertoire de données KLog ici : TQSL finished with no error. Do you want to mark as Sent all the QSOs uploaded to LoTW? The selection you have done does not include any QSO The selection you have done does not include any QSO. Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1 ClubLog ClubLog QRZ.COM To upload QSOs you need a qrz.com subscription. If you have one, go to Setup->QRZ.com tab to enable it. Duplicated QSOs have to match another existing QSO with the same call, band, mode, date and time, taking into account the period that can be defined in the settings. QSO logged from WSJT-X: QSO loggué depuis WSJT-X : start démarrer Check always the current callsign in QRZ.com KLog - File not open Status bar ... You can update the entities database in Tools->Update cty.csv It seems that you are running this version of KLog for the first time. Il semble que vous exécutiez cette version de KLog pour la première fois. The setup will be open to allow you to do any new setup you may need. La fenêtre de configuration va s'ouvrir pour vous permettre de faire toute configuration dont vous avez besoin. The callsign %1 is not a valid call. Do you really want to add this callsign to the log? KLog - Select correct entity This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. KLog - QRZ.com error KLog has received an error from QRZ.com. KLog - Exit Queue all the QSOs to be uploaded Queue all the QSO to be uploaded All pending QSOs of this log has been marked as queued for LoTW! There was a problem to mark all pending QSOs of this log as queued for LoTW! Your log has not been updated. No QSO was updated with the data coming from LoTW. This may be because of errors in the logfile or simply because your log was already updated. All pending QSOs has been marked as queued for LoTW! All queued QSOs has been marked as sent to LoTW! There was a problem to mark all queued QSOs of this log as sent to LoTW! stop arrêter If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. Si vous êtes sûr que la base de données contient des QSOs et que KLog ne parvient pas à les trouver, veuillez "contacter les développeurs (voir A propos de KLog) pour de l'aide. It seems that there are no QSOs in the database. No QSOs have been exported to ADIF. KLog has exported %1 QSOs to the ADIF file: %2 There was an error while updating to Yes the LoTW QSL sent information. The LoTW upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The file has been removed. KLog - LoTW KLog - Select the Station Callsign. The logfile has been modified. Le fichier de log a été modifié KLog - CTY.dat update Do you want to save your changes? Voulez-vous sauvegarder vos modifications ? UDP Server error The UDP server failed to %1. start or stop Erreur du serveur UDP Le serveur UDP à échoué : %1. Status of the DX entity. Statut de la contrée contactée Name of the DX entity. Nom de la contrée contactée QSO QSO QSL QSL eQSL eQSL Comment Commentaire Others Autres My Data Mes Données Satellite Satellite DXCC DXCC Info Info Your log has been updated with the LoTW downloaded QSOs. KLog has updated %1 QSOs from LoTW. Awards Diplômes Search Rechercher Log Log DX-Cluster Cluster-DX Save ADIF File Enregistrer le Fichier ADIF Open File Ouvrir un Fichier - Needed for DXMarathon - Nécessaire pour le DXMarathon Abort filling Annuler la saisie Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: Saisir DXCC, zone CQ, zone ITU, Continent dans les QSOs… QSO : Number Numéro Callsign Indicatif Band Bande Mode Mode Print Log Imprimer le Log Abort printing Annuler l'impression Printing the log ... Printing the log... QSO: Impression du log… QSO : The following QSO data has been received from WSJT-X to be logged: Les données de QSO suivant ont été reçues de WSJT-X pour être logguées : Freq Fréq Time On Heure de début Time Off Heure de fin RST TX TX RST RST RX RX RST DX-Grid DX-Grid Local-Grid Grid-Local Station Callsign Indicatif de la Station Operator Callsign KLog - WSJTX Dupe QSO This QSO seems to be duplicated. Do you want to save or discard it? KLog - Non-supported mode A new mode not supported by KLog has been received from an external program or radio: Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) KLog - QSO Dupe A dupe QSO has been detected in the file and will not be added to the log. Please check the QSO information file and ensure it is properly added. Native Error Recommendation: Periodically export your data to ADIF to prevent a potential data loss. If the received mode is correct, please contact KLog development team and request support for that mode Si le mode reçu est correct, veuillez contacter l'équipe de développement KLog et demandez le support de ce mode KLog - QRZ.COM KLog - QSO received KLog - Duplicated satellite A duplicated satellite has been detected in the file and will not be imported. Un Satellite en doublon a été détecté dans le fichier et ne sera pas importé. Please check the satellite information file and ensure it is properly populated. Veuillez vérifier le fichier des informations sur les Satellites et assurez-vous qu'il est proprement rempli. Now you will see a more detailed error that can be used for debugging... Vous allez voir une erreur plus détaillée qui pourra être utilisée pour le déboggage... An unexpected error ocurred!! Une erreur inattendue s'est produite !! If the problem persists, please contact the developers Si le problème persiste, veuillez contacter les développeurs for analysis: pour analyse : Error in function Erreur dans la fonction Error text Texte d'erreur Failed query Requête échouée KLog - Show errors Do you want to keep showing errors? Voulez-vous continuer à afficher les erreurs ? MainWindowInputComment Comment Commentaire Add a comment for this QSO. Ajouter un commentaire pour ce QSO Keep this data Conserver ces données Data entered in this tab will be copied into the next QSO. Les données saisies dans cet onglet seront réutilisées pour les prochains QSOs MainWindowInputEQSL Date of the ClubLog upload. Date du transfert vers ClubLog Date of the QRZ.com upload. Date of the eQSL sending. Date de l'envoi de l'eQSL Date of the eQSL reception. Date de réception de l"eQSL Date of the LoTW sending. Date de l'envoi LoTW. Date of the LoTW reception. Date de la réception LoTW Status on ClubLog. Statut sur ClubLog Status on QRZ.com. Status of the eQSL sending. Statut de l'envoi de l'eQSL Status of the eQSL reception. Statut de la réception de l'eQSL Status of the LoTW sending. Statut de l'envoi LoTW Status of the LoTW reception. Statut de la réception LoTW ClubLog ClubLog QRZ.com eQSL Sent eQSL Env. eQSL Rec eQSL Reçu LoTW Sent LoTW Env. LoTW Rec LoTW Reçu MainWindowInputOthers Primary Div Div Principale Secondary Div Div Secondaire IOTA IOTA Entity Entité Propagation mode Mode de propagation Others Autres Keep propagation mode Select the primary division for this QSO. Choisir la division principale pour ce QSO Select the secondary division for this QSO. Choisir la division secondaire pour ce QSO Select the entity for this QSO. Choisir l'entité pour ce QSO Select the propagation mode for this QSO. Choisir le mode de propagation pour ce QSO Select the IOTA continent for this QSO. Choisir le continent IOTA pour ce QSO Select the IOTA reference number for this QSO. Choisir la référence IOTA pour ce QSO Keeps the same propagation mode for next QSO. Select the appropriate ADIF field for this QSO. Value for the selected ADIF field. Not Identified Non Identifié Not - Not Identified Non - Non Identifié SOTA Ref Age VUCC grids Distance MainWindowInputQSL QSL Sent QSL Env. QSL Rec QSL Reçue QSL Via QSL Via QSL Msg QSL Msg Status of the QSL sending. Statut de l'envoi de la QSL Status of the QSL reception. Statut de la réception de la QSL QSL sending information. Informations d'envoi de la QSL QSL reception information. Informations de réception de la QSL Date of the QSL sending. Date d'envoi de la QSL Date of the QSL reception. Date de la réception de la QSL Message of the QSL. Message de la QSL QSL via information. Information QSL via MainWindowInputQSO TX RST. RST TX RX RST. RST RX TX Frequency in MHz. Fréquence TX en MHz RX Frequency in MHz. Fréquence RX en MHz Power used by the contacted station. Name of the contacted operator. QTH of the contacted station. Locator of the contacted station. Watts Watts MHz MHz Split Translator: Split is a common hamradio term. Do not translate unless you are sure. Name Nom QTH QTH DX Locator Locator DX Power(rx) Puissance(rx) RST TX RX Frequency RST(tx) RST(tx) RST(rx) RST(rx) Freq TX Fréq TX Freq RX Fréq RX DX QTH locator. DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. TX Frequency in MHz. Frequency is not in a hamradio band! Fréquence d'émission en MHz. La fréquence n'est pas une bande réservée aux radioamateurs ! RX Frequency in MHz. Frequency is not in a hamradio band! Fréquence de réception en MHz. La fréquence n'est pas une bande réservée aux radioamateurs ! MainWindowMyDataTab Watts Watts Keep this data Conserver ces données My QTH locator. Mon QTH locator. Power Puissance Operator callsign Station Callsign Indicatif de la Station My Locator Mon Locator My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. My Rig My Antenna My SOTA_Ref My VUCC_GRIDS MainWindowSatTab Keep this data Conserver ces données Other - Sat not in the list Autre - Sat n'est pas dans la liste Data entered in this tab will be copied into the next QSO. Les données saisies dans cet onglet seront réutilisées pour les prochains QSOs Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Le nom du Satellite n'est pas dans la liste. Choisir : "%1" pour activer ce champ. (format like AO-51). Satellite mode used. Mode Satellite utilisé Select the satellite you are using. Choisir le satellite que vous utilisez UpLink band. Bande UpLink DownLink band. Bande DownLink Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. Locator de la station contactée. Ce champ est synchronisé avec le champ Locator de l'onglet QSO UpLink UpLink DownLink DownLink Satellite Satellite Mode Mode DX Locator Locator DX Other Autre MHz MHz Not Sat QSO QSO non Sat KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. KLog a détecté un nom de satellite qu'il ne reconnaît pas. Si vous préférez utiliser l'un des noms de satellites connus à la place, veuillez le choisir dans la liste. Sinon, veuillez contacter l'équipe de développement pour ajouter le nouveau nom de satellite. The satellite you have in your QSO is: Le satellite que vous avez dans votre QSO est : Please be aware that the satellite name will not be saved if it is not in the list, so that information may be lost! RX Frequency in MHz. Frequency is not in a hamradio band! Fréquence de réception en MHz. La fréquence n'est pas une bande réservée aux radioamateurs ! RX Frequency in MHz. Fréquence RX en MHz TX Frequency in MHz. Frequency is not in a hamradio band! Fréquence d'émission en MHz. La fréquence n'est pas une bande réservée aux radioamateurs ! TX Frequency in MHz. Fréquence TX en MHz MapWindowWidget Select QSOs in this band. Select QSOs in this mode. Select QSOs in this propagation mode. Select QSOs using this Satellite. Only confirmed Select only confirmed QSOs. All bands Show nothing All modes All propagation modes All satellites OnlineMessageWidget The server returned the following error: %1 Not identified Non identifié QObject New One, work it! Un Nouveau, le faire ! Needed, work it! Nécessaire, le faire ! Worked but not confirmed Réalisé mais non confirmé Confirmed Confirmé Not identified Non identifié Database Error Erreur de base de données KLog DB needs to be upgraded. La BD de KLog doit être mise à jour. Do you want to upgrade it now? Voulez-vous la mettre à jour maintenant ? If DB is not upgraded KLog may not work properly. Si la BD n'est pas mise à jour, KLog peut ne pas fonctionner correctement. Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea. Do you want to backup your DB now? The backup finished successfully. You can find the backup in this file: %1 The backup was not properly done. You will be sent back to the starting point. KLog - DB can't be updated automatically You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version. KLog - DB update KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. KLog a détecté un ancien journal dans la BD. Toutes les données seront migrées vers un nouveau journal de type DX pour vous. KLog: Enter Station callsign KLog : Saisir l'indicatif de la Station Enter the station callsign used in this log Saisir l'indicatif de la station utilisé dans ce log Station Callsign Indicatif de la Station Updating DXCC award information... Updating DXCC Award information... Updating WAZ award information... Updating WAZ Award information... The process to upgrade is: - Using an old KLog version export your log to ADIF. - Remove your logbook.dat file from your KLog folder. - Install the new KLog version. - Import your ADIF file. KLog will finish when you click on OK. All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay. Updating mode information... Mise à jour des informations sur les modes... Abort updating Mise à jour annulée QSO: QSO : Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? Annuler cette mise à jour entraînera une altération des données et une perte de données possible. Souhaitez-vous quand même annuler ? Updating bands information... Mise à jour des informations de bande... Updating bands information in %1 status... Mise à jour des information sur les bandes en statut %1... Progress: Progression : Updating mode information in %1 status... Mise à jour des informations sur les modes en statut %1... Updating information... Updating DXCC and Continent information... Mise à jour des informations sur les Contrées DXCC et Continents... KLog is already running. It is allowed to run only one instance. Install wizard was canceled before completing... L'assistant d'installation a été annulé avant de terminer... Do you want to remove the KLog dir from your disk? Voulez-vous supprimer le répertoire KLog de votre disque ? Your KLog dir has been removed Votre répertoire KLog a été supprimé Thank you for running KLog! Merci à vous d'utiliser KLog ! I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. Je n'ai pas pu supprimer votre répertoire KLog. Vous devrez le faire manuellement si vous voulez le supprimer de votre disque-dur. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. Votre répertoire KLog ne peut pas être supprimé. Vous devrez le faire manuellement si vous voulez le supprimer de votre disque dur. Remember that your KLog dir is on your system... Rappelez-vous que votre répertoire KLog est sur votre système... A wrong callsign has been found: %1. Please enter a new callsign or confirm that the current one is a good callsign. An empty callsign has been detected. If it is possible, please enter the right call. KLog - Not valid callsign found Date Date Call Indicatif RSTtx RSTtx RSTrx RSTrx Band Bande Comment Commentaire Mode Mode CQz ITUz DXCC DXCC Address Age County A_Index Ant_Az Ant_El Ant_Path ARRL_SECT Award_Submitted Award_granted Band_RX CheckContest Class ClubLog SDate ClubLog status Continent Continent Contest Id Country Credit Submitted Credit granted Dark Dok Do not translate if unsure, common hamradio term. Fists Do not translate if unsure, common hamradio term. Fists CC Do not translate if unsure, common hamradio term. My Fists Do not translate if unsure, common hamradio term. Nr bursts Do not translate if unsure, common hamradio term. Nr pings Do not translate if unsure, common hamradio term. Sat mode SWL Do not translate if unsure, common hamradio term. Ten-Ten Do not translate, it is a hamradio group name. Distance Contacted_Op Email EQ_Call eQSL RDate eQSL SDate eQSL Rcvd eQSL Sent eQSL Env. Force Init Freq Fréq Freq RX Fréq RX Gridsquare HRDLog SDate HRDLog status IOTA IOTA IOTA Island id K Index Lat Lon LoTW RDate LoTW SDate LoTW Rcvd LoTW Sent LoTW Env. Max Bursts MS Shower My Antenna My City My Cnty My Country My CQz My DXCC My Gridsquare My IOTA My IOTA island id My ITUz My Lat My Lon My Name My Postal code My Rig My Sig My Sig Info My SOTA ref My State My Street My USACA counties My VUCC grids Name Nom Notes Operator Owner Callsign Pfx Precedence Prop Mode Public Key QRZcom SDate QRZcom status QSL msg QSL RDate QSL SDate QSL Rcvd QSL reçue QSL Sent QSL Env. QSL rcvd via QSL sent via QSL via QSO complete QSO random QTH QTH Region Rig RX Pwr Sat name Nom du satellite SFI Sig Sig Info Silent key Do not translate if unsure, common hamradio term. SKCC SOTA Ref SRX String SRX STX String State Submode UKSMG USACA counties VE prov VUCC grids TX Pwr Web QSO Date off Log number SearchWidget &Clear Effa&cer &Export Highlighted &Exporter la Sélection &Select All Tout &Sélectionner &Search Rechercher Clear the searches. Effacer les recherches. Export the search result to an ADIF file. Exporter le résultat de la recherche vers un fichier ADIF. Select/Unselect all the QSOs shown. Sélectionner/Désélectionner tous les QSOs affichés. Search in the log. Rechercher dans le log. Search in all logs. Rechercher dans tous les logs. All logs Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs! Select the Station Callsign used to do this QSO. All in log Not defined &Clear selection Effacer la sélection Save File Sauvegarder le Fichier You have requested to delete the QSO with: %1 Vous avez demandé à supprimer le QSO avec : %1 Are you sure? Êtes-vous sûr ? SearchWindow Date/Time Date/Heure Band Bande Mode Mode QSL Sent QSL Env. QSL Rcvd QSL reçue Station Callsign Indicatif de la Station ID ID Call Indicatif Date/time Station callsign QSL Send QSL envoyée &Delete Supprimer Delete a QSO Supprimer un QSO &Edit QSO &Editer un QSO Edit this QSO Editer ce QSO Via &bureau Via &bureau Send this QSL via bureau Envoyer cette QSL via bureau D&irect D&irecte Send this QSL via direct Envoyer cette QSL via direct Via bureau Via bureau QSL &received via bureau QSL &reçue via bureau Direct Direct QSL received via direc&t QSL reçue via direc&t Check in QRZ.com Check this callsign in QRZ.com Check in DXHeat.com Check this callsign in DXHeat.com &Request my QSL Demande&r ma QSL Mark my QSL as requested Marquer ma QSL en demandée Via Direct and mark DX QSL as requested Send this QSL via direct and mark DX QSL as requested Via Bureau and mark DX QSL as requested Send this QSL via bureau and mark DX QSL as requested &Request the QSL Demande&r la QSL Mark the QSL as requested Marquer la QSL en demandée Via bureau and mark my QSL as requested QSL received via bureau and mark my QSL as requested Direc&t and mark as my QSL requested QSL received via direct and mark my QSL as requested Needed QSO to send the QSL QSO nécessaire pour envoyer la QSL My QSL requested to be sent Mes QSL demandés à envoyer DX QSL pending to be received QSL DX en attente de réception SetupDialog Bands/Modes Bandes/Modes DX-Cluster Cluster DX Colors Couleurs Log widget Misc Divers World Editor Editeur du Monde Logs Logs Satellites Satellites HamLib HamLib Cancel Annuler OK OK You need to enter at least a valid callsign. Go to the User tab and enter valid callsign. User data Données utilisateur D&X-Cluster Cluster D&X WSJT-X WSJT-X Settings You need to enter at least one log in the Logs tab. Vous devez saisir au moins un log dans l'onglet Logs. Do you want to add one log in the Logs tab or exit KLog? (Click Yes to add a log or No to exit KLog) Souhaitez-vous ajouter un log dans l'onglet des Logs ou quitter KLog ? (Cliquez Oui pour ajouter un log ou Non pour quitter KLog) World Monde Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Aller dans l'onglet "Divers" et cliquer sur "Déplacer la base de données" sinon la base de données ne sera pas déplacée vers le nouvel emplacement. eLog DB has not been moved to new path. You have not selected the kind of log you want. Vous n'avez pas choisi le type de log que vous souhaitez. You will be redirected to the Log tab. Please add and select the kind of log you want to use. Vous allez être redirigé vers l'onglet Log. Veuillez ajouter et choisir le type de log que vous souhaitez utiliser. SetupEntityDialog Entity Entité CQ CQ ITU ITU Latitude Latitude Longitude Longitude UTC UTC Main prefix Préfix principal ARRL ID ID ARRL Prefixes Préfixes Comma separated possible prefixes, e.g. EA1, EA2, ... Préfixes possibles séparés par des virgules : EA1, EA2... Ok Ok Name of the Entity. Nom de la Contrée CQ zone. Zone CQ ITU zone. Zone ITU Longitude of the Entity. Longitude de la Contrée DXCC Local time difference to UTC. Différence entre l'heure locale et l'heure UTC Main prefix of the entity. Préfixe principal de la contrée ARRL ID. ID ARRL Date of the deletion. Date de suppression Deleted Supprimé Cancel Annuler Entity Dialog Fenêtre de l'entité SetupPageBandMode Bands Bandes Modes Modes SetupPageColors New One Un Nouveau Needed in this band Nécessaire dans cette bande Worked in this band Contacté dans cette bande Confirmed in this band Confirmé dans cette bande Default Défaut WSJT-X palette Palette WSJT-X Default palette Palette par défaut Dark Mode Color when the DXCC is an ATNO (All Time New One). DXCC is confirmed in this band. Default color. Sets a palette of colors similar to the one used in WSJT-X. Sets the default palette. Light Mode This DXCC was worked before in another band but not in the selected band. It may be needed due to the CQ, ITU, Grid, ... Ce DXCC a déjà été réalisé sur une autre bande mais pas dans la bande sélectionnée. Cela peut être dû au CQ, ITU, Grid... Worked DXCC, but not confirmed in this band. DXCC réalisé mais non confirmé sur cette bande. Sets the Dark Mode Choose a color Choisir une couleur SetupPageDxCluster Add Ajouter Delete Supprimer Show &HF spots Afficher les spots &HF Show V/&UHF spots Afficher les spots V/&UHF Show W&ARC spots Afficher les spots W&ARC Show &worked spots Afficher les spots contactés Show &confirmed spots Afficher les spots &confirmés Show ANN/&FULL messages Afficher les messages ANN/&FULL Show WW&V messages Afficher les messages WW&V Show WC&Y messages Afficher les messages WC&Y Save DX Cluster activity Saves all the DX-Cluster activity to a file in the KLog folder Send DX Spots to the map Sends the received DX Spots to the map to know where is the activity. DX Spots Spots DX Others Autres Messages Messages KLog: Add a DXCluster server KLog : Ajouter un serveur Cluster DX Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Ajouter l'adresse suivie par le :port Exemple : dxfun.com:8000 Si aucun port n'est précisé, le port 41112 sera utilisé par défaut : SetupPageELog ClubLog password ClubLog App password ClubLog email Enter the email you used to register in ClubLog. Entrez le mail utilisé lors de votre inscription à ClubLog Enter your password ClubLog here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!! Send QSOs in real time Activate ClubLog Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Envoyer chaque QSO à ClubLog en même temps qu'ils sont ajoutés ou modifiés dans KLog Starts the ClubLog support in KLog. Activer le support de ClubLog dans KLog Activate eQSL.cc Enter your username of eQSL.cc. Enter your password eQSL.cc here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) eQSL.cc password eQSL.cc user ClubLog ClubLog eQSL.cc QRZ.com Enter the user of your QRZ.com account. You need to be subscribed to QRZ.com to use this service. User Enter your password QRZ.com here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Password Activate QRZ.com Check automatically Check in Qrz.com all Calls as they are entered Paying Subscriber Check it if you are paying for a qrz.com subscription LogBook Key LogBook Key for QSO uploading. You can get this key in your QRZ.com logbook webpage. Remember that you need a QRZ.com subscription to use this feature. LoTW Upload Download TQSL path Use TQSL LoTW password LoTW user Enter your LoTW user. Enter your password LoTW here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Path to the TQSL software. Enable the LoTW integration with TQSL. You will need to have TQSL installed Select File SetupPageHamLib Activate HamLib Activer HamLib Activates the hamlib support that will enable the connection to a radio. Activer le support hamlib pour permettre la connexion à un transceiver. Read-Only mode If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio. Radio Radio Select your rig. Sélectionnez votre rig Serial Network Defines the interval to poll the radio in msecs. Poll interval Test: OK Test: NOK Test Click to test the connection to the radio SetupPageLogView Fields SetupPageLogs &New &Nouveau &Edit &Editer &Remove Supp&rimer Add a new log. Ajouter un nouveau log Edit the selected log. Éditer le log sélectionné Remove the selected log. Supprimer le log sélectionné KLog KLog Do you really want to remove this log? Souhaitez-vous réellement retirer ce log ? All the QSOs from this log will also be deleted... QSOs QSOs The new log could not be created. Log has not been removed. (#3) Le log n'a pas été retiré. (#3) Log has not been removed. (#2) Le log n'a pas été retiré. (#2) Log has not been removed. (#1) Le log n'a pas été retiré. (#1) ID ID Date Date Station Callsign Indicatif de la Station Operators Opérateurs Comments Commentaires An error has occurred showing the following error code: Une erreur s'est produite avec le code d'erreur suivant : KLog - SetupPageLogs KLog - Page de configuration des journaux SetupPageLogsNew &Date &Date &Station Callsign Indicatif de la &Station &Operators &Opérateurs Comm&ent Comm&entaire &Ok &Ok &Cancel &Annuler Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. Callsign used for this log. Indicatif utilisé pour ce log Comma separated list of operators: callsign1, callsign2. Liste d'opérateurs séparés par une virgule : indicatif1, indicatif2... Start date of this log. Date de démarrage du log SetupPageMisc &Imperial system Système &Impérial &Log in real time Journalisation en temps réel &Time in UTC Heure en UTC &Save ADIF on exit &Sauvegarder l'ADIF en quittant Use this &default filename Utiliser ce nom de fichier par &défaut Mark &QSO to send QSL when QSL is received Marquer le &QSO pour envoyer une QSL quand la QSL est reçue Complete QSO with previous data Compléter le QSO avec les données du précédent Show the Station &Callsign used in the search box Afficher l'indicatif de la station utilisée dans le champ de recherche &Check for new versions automatically Vérifier les nouvelles versions automatiquement &Provide Info for statistics Fournir des informations pour les statistiques Manage DX-Marathon Gérer le DX-Marathon Activate the application debug log Activer le journal de débogage de l'application Mark sent eQSL && LoTW in new QSO as queued Browse Parcourir Move DB Déplacer la BD QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. Les QSOs seront marqués en attente pour envoyer une QSL si vous recevez la QSL et que vous n'avez pas encore retourné la vôtre The search box will also show the callsign on the air to do the QSO. Select the application debug log level. This may be useful if something is not working as expected. A debug file will be created in the KLog directory and/or shown with Help->Debug menu. Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default. Check if there is a new release of KLog available every time you start KLog. Vérifier si une nouvelle version de KLog est disponible chaque fois que vous lancez KLog Check non-valid calls Show seconds &Delete always temp ADIF file after uploading QSOs In seconds, enter the time range to consider a duplicate if same call, band and mode is entered. Show seconds in the QSO editor If you disable this checkbox KLog will not check callsigns to identify wrong callsigns. Check it for Imperial system (Miles instead of Kilometers). Cocher pour le système Imperial (Miles au lieu de Kilomètres) Select to use real time. Sélectionner pour utiliser l'heure en temps réel. Select to use UTC time. Sélectionnez pour utiliser l'heure UTC Select if you want to save to ADIF on exit. Sélectionnez si vous souhaitez enregistrer vers ADIF en quittant Select to use the following name for the logfile without being asked for it again. Sélectionnez pour utiliser le nom indiqué pour le fichier de log sans que cela soit à nouveau demandé Complete the current QSO with previous QSO data. Complète le QSO en cours avec les données du QSO précédent Select if you want to manage DX-Marathon. Sélectionner pour gérer le DX-Marathon This is the default file where ADIF data will be saved. Fichier par défaut où les données ADIF seront sauvegardées This is the directory where the database (logbook.dat) will be saved. Répertoire où la base de données (logbook.dat) sera sauvegardée Click to change the default ADIF file. Cliquez pour changer le fichier ADIF par défaut. Click to change the path of the database. Cliquez pour modifier le chemin de la base de données. Click to move the DB to the new directory. Cliquez pour déplacer la BD vers le nouveau répertoire. Activates the application debug log. This may be useful if something is not working as expected. A debug file will be created in the KLog directory. Activer le journal de débogage de l'application. Cela peut être utile si quelque chose ne fonctionne pas correctement. Un fichier de débogage sera créé dans le répertoire de KLog. Delete Always the adif file created after uploading QSOs Log level Dupe time range: Open File Ouvrir un Fichier Select Directory Sélectionnez un répertoire This is the directory where DB (logbook.dat) will be saved. C'est le répertoire où la BD (logbook.dat) sera sauvegardée. Please specify an existing directory where the database (logbook.dat) will be saved. Veuillez spécifier un répertoire existant où la base de données (logbook.dat)sera sauvegardée. KLog - Move DB File moved Fichier déplacé File copied Fichié copié File already exist. The destination file already exist and KLog will not replace it. Please remove the file from the destination folder before moving the file with KLog to make sure KLog can copy the file. File NOT copied Fichier NON copié The file was not copied due to an unknown problem. The target directory does not exist. Please select an existing directory. Le répertoire cible n'existe pas. Veuillez sélectionner un répertoire existant. SetupPageSats &New &Nouveau &Edit &Editer &Remove &Retirer &Import &Importer E&xport E&xporter Add a new satellite. Ajouter un nouveau satellite Edit the selected satellite. Editer le satelite sélectionné Remove the selected satellite. Retirer le satellite sélectionné Export your current satellites to a file. Exporte la liste des satellites actuels vers un fichier Select the sat you want to open. Sélectionner le satellite à éditer KLog KLog Do you really want to remove this satellite? Souhaitez-vous vraiment retirer ce satellite ? Import a satellites file. It will replace the satellites you have in the current list. This satellite will no be longer available to be selected ... Sat has not been removed. (#3) Le satellite n'a pas été retiré. (#3) Sat has not been removed. (#2) Le satellite n'a pas été retiré. (#2) Sat has not been removed. (#1) Le satellite n'a pas été retiré. (#1) ID ID Short Court Name Nom Uplink Uplink Downlink Downlink Modes Modes An error has occurred showing the following error code: Une erreur s'est produite avec le code d'erreur suivant : KLog - SetupPageSats KLog - SetupPageSats Open Satellites File Ouvrir le fichier des satellites KLog warning Avertissement KLog An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Une erreur innatendue s'est produite pendant l'importation des données des satellites. Cela peut provenir du fait que le fichier que vous essayer d'importer n'a pas le format requis. Please check the format or contact the developer for analysis with the error code: Veuillez vérifier le format ou contacter le développeur pour analyse avec le code d'erreur : Save Satellites File Enregistrer le fichier des satellites SetupPageSatsNew Short name Nom court Sat name Nom du satellite UpLink UpLink DownLink DownLink Modes Modes &Ok &Ok &Cancel &Annuler Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Saisir le nom court. Essayez d'utiliser le nom court LoTW ce qui vous permettra ensuite d'envoyer votre QSO à LoTW. Enter the name of the satellite. Saisir le nom du satellite Enter the uplink frequencies in this format: 144.300 Saisir les fréquences d'uplink dans ce format : 144.300 Enter the downlink frequencies in this format: 144.300 Saisir les fréquences de downlink dans ce format : 144.300 Enter the modes in this format: USB Saisir les modes dans ce format : USB Some of the data you have entered is not correct; the satellite can't be added. SetupPageSubdivisionNew &Date &Date &Station Callsign Indicatif de la &Station &Operators &Opérateurs Comm&ent Comm&entaire &Ok &Ok &Cancel &Annuler Callsign used for this log. Indicatif utilisé pour ce log Comma separated list of operators: callsign1, callsign2. Liste d'opérateurs séparés par une virgule : indicatif1, indicatif2... Start date of this log. Date de démarrage du log Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. SetupPageSubdivisions &Remove Import new Import an AWA file with the subdivision details. Remove the selected references. Select the references you want to open. KLog KLog Do you really want to remove the data of this entity? All the subdivision information for this entity will be deleted... Log has not been removed. (#3) Le log n'a pas été retiré. (#3) Log has not been removed. (#2) Le log n'a pas été retiré. (#2) Log has not been removed. (#1) Le log n'a pas été retiré. (#1) ID ID Name Nom Short Name CQ Zone Zone CQ ITU Zone Zone ITU Deleted Supprimé Start Date End Date DXCC DXCC An error has occurred showing the following error code: Une erreur s'est produite avec le code d'erreur suivant : KLog - SetupPageSubdivisions SetupPageUDP Start UDP Server Démarrer le serveur UDP Automatically log QSOs from WSJT-X Allow WSJT-X to send logged QSOs to KLog QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. Update status information from WSJT-X KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...) UDP port number where the UDP Server will listen for packets. Numéro du port UDP où le serveur UDP doit être à l'écoute des paquets réseaux Make sure it is the same port that the other programs are sending the data to. Default port is 2237. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. Le serveur UDP recevra les QSOs envoyés par d'autres programmes tels que WSJT-Xvous permettant ainsi de les logger automatiquement dans KLog UDP Port Port UDP Select the interface to listen for UDP datagrams coming from WSJT-X. Network interface QSOs notification timeout (milisecs) Miliseconds that the notification of QSOs received from WSJTX will be shown. SetupPageUserDataPage &Personal data Données &Personnelles Station &data &Données de la Station Enter your name. Saisir vore nom Enter your address - 1st line. Saisir votre adresse - 1ère ligne Enter your address - 2nd line. Saisir votre adresse - 2ème ligne Enter your address - 3rd line. Saisir votre adresse - 3ème ligne Enter your address - 4th line. Saisir votre adresse - 4ème ligne Enter your city. Saisir votre ville Enter your zip code. Saisir votre code postal Enter your province or state. Saisir votre province ou état Enter your country. Saisir votre pays &Name &Nom &Address &Adresse Cit&y Ville &Zip Code Code Postal Pro&v/State Pro&vince/Etat Countr&y Pa&ys Enter your information for rig Entrez vos informations de rig Enter your information for antenna Entrez les informations de votre antenne Enter your power information. Saisir votre puissance Enter the station callsign that will be used for logging. Saisir l'indicatif de la station qui sera utilisé pour le log &Rig 1 Ri&g 1 R&ig 2 Ri&g 2 Ri&g 3 Ri&g 3 Antenna &1 Antenne &1 Antenna &2 Antenne &2 Antenna &3 Antenne &3 Po&wer Puissance Enter the operators (comma separated if more than one). Entrez les opérateurs (séparés par une virgule si plusieurs) Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Entrez le locator de votre station. Alternativement, KLog peut utiliser un locator approximatif basé sur votre indicatif. &Callsign &Operators &Opérateurs &CQ Zone Zone &CQ &ITU Zone Zone &ITU &Locator &Locator &Locator (not valid) &Locator (invalide) SetupPageWorldEditor Add Ajouter Delete Supprimer Edit Éditer Export World Exporter Import World Importer Still not implemented. Pas encore implémenté. Import a new cty.csv file Importer un nouveau fichier cty.csv An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. Un fichier d'information sur les entités (cty.csv) a été détecté dans votre répertoire KLog et sera chargé. No entities information file (cty.csv) has been detected in your KLog folder. Aucun fichier d'information sur les entités (cty.csv) n'a été détecté dans votre répertoire KLog. KLog will not be able to show entities information. KLog ne sera pas en mesure d'afficher des informations d'entité. Prefix Préfixe Entity Entité ARRL ID ID ARRL Continent Continent CQ Zone Zone CQ ITU Zone Zone ITU UTC UTC Latitude Latitude Longitude Longitude Deleted Supprimé Since Date Depuis la Date To Date Jusqu'à la Date Open File Ouvrir un fichier BigCTY (*.csv) BigCTY (*.csv) Entities information has been updated. Les informations d'entité ont été mises à jour. Entities information has not been updated. Les informations d'entitées n'ont pas été mises à jour. ShowAdifImportWidget The following QSOs are those QSOs that you have received the LoTW confirmation. Ok Ok DX Date/Time Date/Heure Band Bande Mode Mode ShowErrorDialog KLog Message Message KLog SoftwareUpdateDialog Ok Ok KLog update Mise à jour KLog <center><h2>KLog new version (%1) is available! </h2></center><br>There is a new version of KLog available.<br><br><b>You can get the new version from:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> Congratulations! Félicitations ! Your KLog has been updated. Votre KLog a été mis à jour. You already have the latest version. Vous avez déjà la dernière version. StartWizard KLog - The free hamradio logging program KLog - Le logiciel libre de journalisation des contacts radioamateurs Quit Setup Quitter l'Installation Setup is not complete yet. Are you sure you want to quit setup? L'installation n'est pas encore terminée. Êtes-vous sûr de quitter l'installation ? StatisticsWidget QSO per year QSO par an DXCC per year DXCC par an CQ zones per year Zones CQ par an QSO per band QSO par bande QSO per mode QSO par mode QSO per DXCC QSO par DXCC QSO per Continent QSO par continent QSO per hour QSO par heure QSO per month QSO par mois Worked / Confirmed status Réalisé / Statut confirmé Worked / Sent status Réaisé / Statut d'envoi Sent / Confirmed status Envoyé / Statut confirmé Satellite grid status Satellite DXCC status Grids per band status DXCC per band status StatsCQZPerYearBarChartWidget CQ Zones per year Zones CQ par an Reading data ... Lecture des données... Abort reading Interrompre la lecture CQ zones Zones CQ CQ zones per year Zones CQ par an Reading data ... Lecture des données en cours... Years: %1/%2 Années : %1/%2 StatsDXCCOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Numéro Callsign Indicatif Date Date Band Bande Mode Mode DXCC DXCC Satellite Satellite Confirmed Confirmé No Non StatsEntitiesPerYearBarChartWidget Chart title Titre du graphique Reading data ... Lecture des données... Abort reading Interrompre la lecture DXCC Entities Contrées DXCC DXCC Entities per year Contrées DXCC par an Reading data ... Lecture des données en cours... Entities: Contrées DXCC : StatsFieldPerBandWidget All Tout Mode: Band Bande Worked Réalisé Confirmed Confirmé StatsGridsOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Numéro Callsign Indicatif Date Date Band Bande Mode Mode Grid Satellite Satellite Confirmed Confirmé No Non StatsQSOsPerBandBarChartWidget QSOs per band QSOs par bande Reading data ... Lecture des données... Abort reading Lecture interrompue Bands Bandes QSOs per band distribution Reading data ... Lecture des données en cours... Bands: Bandes : StatsQSOsPerContinentBarChartWidget QSOs per continent QSOs par continent Reading data ... Lecture des données... Abort reading Lecture interrompue Continents Continents Reading data ... Lecture des données en cours... Hours: Heures : StatsQSOsPerDXCCBarChartWidget QSOs per DXCC QSOs par DXCC Reading data ... Lecture des données... Abort reading Lecture interrompue Reading data... Lecture des données en cours... DXCC DXCC Top ten DXCC per QSO Top 10 DXCC par QSO StatsQSOsPerHourBarChartWidget QSOs per hour QSOs par heure Reading data ... Lecture des données... Abort reading Lecture interrompue Hours Heures QSOs at hour QSOs à l'heure Reading data ... Lecture des données en cours... Hours: Heures : StatsQSOsPerModeBarChartWidget QSOs per mode QSOs par mode Reading data ... Lecture des données... Abort reading Lecture interrompue Modes Modes QSOs per mode distribution Reading data ... Lecture des données en cours... Modes: Modes : StatsQSOsPerMonthBarChartWidget QSOs per month QSOs par mois Reading data ... Lecture des données... Abort reading Lecture interrompue Jan Jan Feb Fév Mar Mar Apr Avr May Mai Jun Juin Jul Juil Sep Sep Oct Oct Nov Nov Dec Déc Aug Août Months Mois QSOs at Month QSOs du mois Reading data ... Lecture des données en cours... Months: Mois : StatsQSOsPerYearBarChartWidget Reading data ... Lecture des données... Abort reading Lecture interrompue QSOs QSOs QSOs per year QSOs par an Reading data ... Lecture des données en cours... QSO: %1/%2 QSO : %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Envoyé - %1 Confirmed - %2 Confirmé - %2 Sent / Confirmed status Envoyé / Statut confirmé StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Réalisé, non confirmé - %1 Confirmed - %2 Confirmé - %2 Worked / Confirmed status Réalisé / Statut confirmé StatsWorkedSentPieChartWidget Worked - %1 Réalisé - %1 Sent - %2 Envoyé - %2 Worked / Sent status Réaisé / Statut d'envoi TipsDialog KLog tips Astuces KLog Next Suivant Previous Précédent <b>Tip #1:</b><br>Do you know...<br>You can use <a href="#ToolsFillInQSO">Tools->Fill in QSO data</a> to automatically read the full log to fill the DXCC, CQ, ITU zones and continent? Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in QSO data <b>Astuce #1:</b><br>Le saviez-vous...<br>Vous pouvez utiliser <a href="#ToolsFillInQSO">Outils->Saisir les données de QSO</a> pour lire automatiquement le log complet pour compléter DXCC, CQ et les zones et continents ITU ? <b>Tip #3:</b><br>Do you know...<br>You can use <a href="#ToolsFindQSO2QSL">Tools->QSL tools...->Find QSO to QSL</a> to look for all those QSO that you should send your QSL because you still need to confirm that DXCC and you have still not send your QSL card? Translator: Please make sure that the name of the link is coherent with the menu Tools->QSL tools...->Find QSO to QSL <b>Astuce #3:</b><br>Le saviez-vous...<br>Vous pouvez utiliser <a href="#ToolsFindQSO2QSL">Outils->Outils QSL...->Rechercher les QSO pour QSL</a> pour rechercher tous les QSO dont vous devriez envoyer votre QSL parce que vous devez encore confirmer ce DXCC et que vous n'avez pas encore envoyé votre carte QSL ? <b>Tip #11:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/KLogES>Spanish Telegram group</a> to discuss about KLog in Spanish? <b>Tip #13:</b><br>Do you know...<br>You can <a href=https://twitter.com/_ea4k>follow EA4K on twitter</a> to get updates about KLog? <b>Tip #8:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceivePendingQSL">Tools->QSL tools...->Find DX-QSLs pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Sent</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find DX-QSLs pending to receive <b>Astuce #8:</b><br>Le saviez-vous...<br>Vous pouvez trouver les QSLs que vous êtes toujours en attente avec <a href="#ToolsReceivePendingQSL">Outils->Outils QSL...->Rechercher des QSLs-DX en attente de réception</a>.<br>Cet outil vous listera dans la zone de recherche tous les QSOs dont le statut "QSL-Envoyé" est <i>Envoyé</i> mais dont vous n'avez pas encore reçu la carte QSL. <b>Tip #9:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceiveRecPendingQSL">Tools->QSL tools...->Find requested pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Rec marked as <i>Requested</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find requested pending to receive <b>Astuce #9:</b><br>Le saviez-vous...<br>Vous pouvez trouver les QSLs que vous êtes en attente avec <a href="#ToolsReceiveRecPendingQSL">Outils->Outils QSL...->Rechercher les demandes en attente de réception</a>.<br>Cet outil vous listera dans la zone de recherche tous les QSOs dont le statut "QSL-Reçu" est <i>Demandé</i> mais dont vous n'avez pas encore reçu la carte QSL. <b>Tip #10:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/klogchat>English KLog Telegram group</a> to discuss about KLog in English? <b>Astuce #10:</b><br>Le saviez-vous...<br>Vous pouvez vous abonner au <a href=https://t.me/klogchat>Groupe Telegram pour KLog Telegram</a> pour échanger autour de KLog en anglais ? <b>Tip #2:</b><br>Do you know...<br>You can find the QSLs that you still need to send with <a href="#ToolsSendPendingQSL">Tools->QSL tools...->Find My-QSLs pending to send</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Requested</i>. Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in DXCC data <b>Astuce #7:</b><br>Le saviez-vous...<br>Vous pouvez trouver les QSLs que vous devez encore envoyer avec <a href="#ToolsSendPendingQSL">Outils->Outils QSL...->Rechercher Mes-QSLs en attente d'envoi</a>.<br>Cet outil vous listera dans la zone de recherche tous les QSOs dont le statut "QSL-Envoyé" est <i>Demandé</i>. {2:?} <b>Tip #4:</b><br>Do you know...<br>You can enter a '*' in the search box, in the search window to search for all the QSOs done with one specific station callsign? Translator: Please make sure that the name of the link is coherent with the menu File->Export Requested QSL to ADIF... <b>Tip #5:</b><br>Do you know...<br>You can find the file containing all your log and other information in the logbook.dat file and the klogrc file, containing the KLog config file in the KLog folder by opening the <a href="#FileOpenKLogFolder">File->KLog folder</a> menu? <b>Tip #6:</b><br>Do you know...<br>You can upload your QSO marked as queued to LoTW via TQSL with <a href="#ToolsUploadLoTW">Tools->LoTW tools ...->Sends the log to LoTW calling TQSL.</a> ?<br><br>You have to configure TQSL in the preferences to be able to use this functionality. Translator: Please make sure that the name of the link is coherent with the menu File->KLog folder <b>Tip #7:</b><br>Do you know...<br>You can see the QSO that confirms one specific DXCC entity in one specific band by poiting your mouse over that band in the DXCC widget? Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find My-QSLs pending to send <b>Tip #12:</b><br>Do you know...<br>You can subscribe to <a href=https://groups.io/g/klog>KLog mailing list</a> to discuss via email about KLog in English? <b>Tip #14:</b><br>Do you know...<br>You can write your own <a href=https://www.eham.net/reviews/detail/3118>review in eHam.net about KLog</a> to help other users to decide to use KLog? <b>Astuce #14:</b><br>Le saviez-vous...<br>Vous pouvez écrire votre propre <a href=https://www.eham.net/reviews/detail/3118>commentaire concernant KLog sur eHam.net</a> pour inciter les autres utilisateurs à utiliser KLog ? <b>Tip #15:</b><br>Do you know...<br>You can join the development team by simply <a href=https://www.klog.xyz/contact>Contacting us</a>? <b>Astuce #15:</b><br>Le saviez-vous...<br>Vous pouvez joindre l'équipe de développement simplement <a href=https://www.klog.xyz/contact>en nouc contactant</a> ? <b>Tip #16:</b><br>Do you know...<br>That there are many ways to contribute to KLog and some of them are listed in the <a href=https://www.klog.xyz/contrib>KLog Contribute</a> page? <b>Astuce #16:</b><br>Le saviez-vous...<br>Il y a beaucoup de façons pour contribuer à Klog et certains d'entre eux sont listés dans la page de <a href=https://www.klog.xyz/contrib>Contribuer à KLog</a> ? <b>Tip #17:</b><br>Do you know...<br>You can support translating KLog into your language? Please check <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a> page. <b>Astuce #17:</b><br>Le saviez-vous...<br>Vous pouvez aider à traduire KLog dans votre langue. Veuillez consulter la page des <a href=https://www.klog.xyz/contrib/translations>Traductions KLog</a>. <b>Tip #18:</b><br>Do you know...<br>You can double-click on an entity name in the DXCC table and all the QSOs with that DXCC Entity will be shown in the search box? <b>Tip #19:</b><br>Do you know...<br>You can right-click on a QSO and select <i>Check in QRZ.com</i> to check that callsign in QRZ.com? UpdateSatsData Reading Satellites data file... Lecture du fichier de données Satellites en cours... Abort reading Lecture annulée The Satellites information has been updated. Les informations sur les Satellites ont été mises à jour. Open File Ouvrir un Fichier Sat Data Données Sat. UpdateSettings KLog - Settings update The settings system has been changed and KLog will update your settings file. World Entity Entité Continent Continent Reading cty.csv... En cours de lecture de cty.csv... Abort reading Lecture annulée eLogClubLog Host not found! Serveur non trouvé ! Timeout error! Erreur de dépassement du délai ! KLog - ClubLog KLog - ClubLog Undefined error... Erreur indéfinie... Undefined error number (#%1)... It seems to be a CREDENTIALS ERROR; check your email and password. It seems that your ClubLog credentials are not correct. Please check your credentials in the setup. ClubLog uploads will be disabled. QSO dupe or not existing (#%1)... We have received an undefined error from Clublog (%1) This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO. Please check your config in the setup and contact the KLog development team if you can't fix it. ClubLog uploads will be disabled. Callsign missing Indicatif manquant Invalid callsign Indicatif invalide Skipping SWL callsign Sauter l'indicatif SWL Callsign is your own call L'indicatif est le vôtre Invalid callsign with no DXCC mapping Indicatif invalide sans correspondance DXCC Updated QSO QSO mis à jour Invalid ADIF record Entrée ADIF incorrecte Missing ADIF record Entrée ADIF manquante Test mode - parameters ok, no action taken Mode test - paramètres ok, pas d'action réalisée Excessive API Usage Utilisation excessive de l'API Internal Error Erreur interne Rejected Rejeté QSO Duplicate QSO en Doublon QSO Modified QSO Modifié Missing Login Identifiant non saisi QSO OK QSO OK Upload denied Déversement interdit No callsign selected Pas d'indicatif sélectionné No match found Pas de correspondance trouvée Dropped QSO QSO rejeté OK OK Login rejected Identifiant rejeté Rejected: Callsign is your own call Rejeté : L'indicatif est le vôtre eLogQrzLog Host not found! Serveur non trouvé ! Timeout error! Erreur de dépassement du délai ! Undefined error number (#%1) We have received the following error from QRZ.com (%1) You are not subscribed to QRZ.com. Not valid KEY found Please configure your QRZ.com API key. You will find it in your QRZ.com Logbook settings webpage. You need a QRZ.com subscription to use this feature. KLog - QRZ.com password needed Please enter your QRZ.com password: KLog - QRZ.com Callsign missing Indicatif manquant eQSLUtilities Host not found! Serveur non trouvé ! Timeout error! Erreur de dépassement du délai ! Undefined error number (#%1)... eQSL Error: User or password incorrect eQSL Warning: At least one of the uplodaded QSOs is duplicated. eQSL: All the QSOs were properly uploaded. KLog - eQSL.cc password needed Please enter your eQSL.cc password: KLog - eQSL eQSL has sent the following message: %1 We have received an undefined error from eQSL (%1) Please check your config in the setup and contact the KLog development team if you can't fix it. eQSL uploads will be disabled. klog-2.3.3/translations/klog_lv.ts0000644000015700001710000134671314542412415017102 0ustar jenkinsjenkins AboutDialog About KLog Par KLog By Autors KLog is a free logbook for hamradio operators. KLog ir bezmaksas hamradio operatoriem.žurnÄls. Please be aware that this is a development release and it may contain many bugs.<br>Backup your data before using this software! LÅ«dzu, ņemiet vÄ“rÄ, ka Å¡is ir izstrÄdes laidiens un tajÄ var bÅ«t daudz kļūdu.<br>Pirms šīs programmatÅ«ras izmantoÅ¡anas dublÄ“jiet savus datus! Since 0.6.2, KLog has been fully rewritten to provide a cross-platform application that runs on all major operating systems (Linux, macOS and Windows) and to support new functionality. KopÅ¡ 0.6.2 KLog ir pilnÄ«bÄ pÄrrakstÄ«ts, lai nodroÅ¡inÄtu starpplatformu lietojumprogrammu, kas darbojas visÄs lielÄkajÄs operÄ“tÄjsistÄ“mÄs (Linux, macOS un Windows), un atbalstÄ«tu jaunas funkcionalitÄtes. Please provide your review in KLog's eHam review page: LÅ«dzu, sniedziet savu atsauksmi KLog eHam pÄrskata lapÄ: Find more information and the latest release at PlaÅ¡Äku informÄciju un jaunÄko izlaidumu meklÄ“jiet vietnÄ“ Author Autors today Å¡odien Main developer Galvenais izstrÄdÄtÄjs KLog is developed by a very small team and you are invited to join! KLog izstrÄdÄ Ä¼oti maza komanda, un jÅ«s esat aicinÄti pievienoties! If you want to provide support you are welcome to join the <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog development mailing list</a>! Ja vÄ“laties sniegt atbalstu, laipni lÅ«dzam pievienoties <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog izstrÄdes adresÄtu sarakstam</a>! You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Varat arÄ« mums palÄ«dzÄ“t, nosÅ«tot kļūdu ziņojumus vai nelielu koda ieguldÄ«jumu, idejas vai visu, kas, jÅ«suprÄt, varÄ“tu uzlabot KLog. Authors Autori Translators bring KLog into your language. They are really an important part of the KLog development team. TulkotÄjimi ienes KLog jÅ«su valodÄ. Viņi patieÅ¡Äm ir svarÄ«ga KLog izstrÄdes komandas sastÄvdaļa. If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog development mailing list</a>! Ja KLog joprojÄm nav jÅ«su valodÄ un vÄ“laties mums palÄ«dzÄ“t, varat sazinÄties ar mums, izmantojot <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog izstrÄdes vÄ“stuli. saraksts</a>! Since 0.6.2, KLog has been fully rewritten to provide a cross-platform application that runs on all major operating systems (GNU/Linux, macOS and Windows) and to support new functionality. If you want to provide support you are welcome to join the <a href="https://groups.io/g/klog">KLog mailing list</a>! If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://groups.io/g/klog">KLog mailing list</a>! Translators TulkotÄji Privacy advisory PrivÄtuma ieteikums KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account users' needs. KLog izstrÄdÄtÄji ir iekļÄvuÅ¡i funkciju, kas ziņo par dažiem lietotÄja datiem KLog serverim ar vienÄ«go mÄ“rÄ·i identificÄ“t instalÄ“to versiju skaitu, lai fokusÄ“tu attÄ«stÄ«bu vienÄ vai otrÄ virzienÄ, ņemot vÄ“rÄ lietotÄju vajadzÄ«bas. At present, the data that is provided is the following: Å obrÄ«d sniegtie dati ir Å¡Ädi: Callsign Izsaukuma signÄls KLog version KLog versija Operating system OperÄ“tÄjsistÄ“ma Be aware that you can enable/disable this feature from the Misc tab in the Setup page. Å…emiet vÄ“rÄ, ka Å¡o funkciju varat iespÄ“jot/atspÄ“jot iestatīšanas lapas cilnÄ“ DažÄdi. KLog KLog Privacy PrivÄtums AdifLoTWExportWidget Select the Station Callsign that you want to use to upload the log. Atlasiet stacijas izsaukuma signÄlu, kuru vÄ“laties izmantot žurnÄla augÅ¡upielÄdei. Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign. IzvÄ“lieties sÄkuma datumu, lai eksportÄ“tu QSO. NoklusÄ“juma datums ir pirmÄ QSO datums ar Å¡o stacijas izsaukuma signÄlu. Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign. Atlasiet beigu datumu, lai eksportÄ“tu QSO. NoklusÄ“juma datums ir pÄ“dÄ“jÄ QSO datums ar Å¡o stacijas izsaukuma signÄlu. Station callsign Stacijas izsaukuma signÄls My Locator Start date SÄkuma datums End date Beigu datums Ok Labi Cancel Atcelt DX DX Date/Time Datums Laiks Band Diepazons Mode Režīms Not defined Nav definÄ“ts ALL QSOs: %1/%2 All Visi QSOs: QSO: KLog - QSOs to be uploaded to LoTW. KLog — QSO, kas jÄaugÅ¡upielÄdÄ“ LoTW. This table shows the QSOs that will be sent to LoTW. Å ajÄ tabulÄ parÄdÄ«ti QSO, kas tiks nosÅ«tÄ«ti uz LoTW. KLog - QSOs to be uploaded to ClubLog. KLog - QSO, kas augÅ¡upielÄdÄ“jami ClubLog. This table shows the QSOs that will be sent to ClubLog. Å ajÄ tabulÄ parÄdÄ«ti QSO, kas tiks nosÅ«tÄ«ti uz ClubLog. KLog - QSOs to be uploaded to eQSL.cc. KLog — QSO, kas augÅ¡upielÄdÄ“jami eQSL.cc. This table shows the QSOs that will be sent to eQSL.cc. Å ajÄ tabulÄ parÄdÄ«ti QSO, kas tiks nosÅ«tÄ«ti uz eQSL.cc. KLog - QSOs to be uploaded to QRZ.com. KLog — QSO, kas jÄaugÅ¡upielÄdÄ“ uz QRZ.com. This table shows the QSOs that will be sent to QRZ.com. Å ajÄ tabulÄ parÄdÄ«ti QSO, kas tiks nosÅ«tÄ«ti uz QRZ.com. This table shows the QSOs that will be exported to ADIF. Å ajÄ tabulÄ parÄdÄ«ti QSO, kas tiks eksportÄ“ti uz ADIF. AwardsWidget Recalculate PÄrrēķinÄt Click to recalculate the award status. Noklikšķiniet, lai pÄrrēķinÄtu balvas statusu. Select the year you want to check. Atlasiet gadu, kuru vÄ“laties pÄrbaudÄ«t. QSOs QSO DXCC DXCC CQ CQ Award Balva Confirmed ApstiprinÄts Worked StrÄdÄja WAZ WAZ Score RezultÄts Annual Gada Number of confirmed DXCC entities. ApstiprinÄto DXCC skaits. Number of worked DXCC entities. NostrÄdÄto DXCC skaits. Number of confirmed WAZ zones. ApstiprinÄto WAZ zonu skaits. Number of worked WAZ zones. NostrÄdÄto WAZ zonu skaits. Number of confirmed QSOs. ApstiprinÄto QSO skaits. Number of worked QSOs. NostrÄdÄto QSO skaits. Number of QSOs worked in the selected year. NostrÄdÄto QSO skaits izvÄ“lÄ“tajÄ gadÄ. Number of DXCCs worked in the selected year. NostrÄdÄto DXCC skaits atlasÄ«tajÄ gadÄ. Number of CQ Zones worked in the selected year. NostrÄdÄto CQ zonu skaits izvÄ“lÄ“tajÄ gadÄ. Score for the DXMarathon in the selected year. RezultÄts DXMarathon izvÄ“lÄ“tajÄ gadÄ. DX-Marathon DX-maratons CTYPage Country data download Valsts datu lejupielÄde KLog needs country data... KLog nepiecieÅ¡ami valstu dati... &Download &Ignore Country data needed NepiecieÅ¡ami valsts dati KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. KLog izmanto cty.csv failu no https://www.country-files.com/, lai iegÅ«tu DXCC informÄciju. You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do. Jums ir jÄlejupielÄdÄ“ cty.csv fails, ja vÄ“laties, lai KLog parÄdÄ«tu jÅ«su veikto QSO valstis, vietrÄdi utt. Click on Download to download now. Noklikšķiniet uz LejupielÄdÄ“t, lai lejupielÄdÄ“tu tÅ«lÄ«t. KLog Klogs I can't find the host. Please check your network and try again Do you want to try again? Es nevaru atrast saimnieku. LÅ«dzu, pÄrbaudiet savu tÄ«klu un mēģiniet vÄ“lreiz Vai vÄ“laties mēģinÄt vÄ“lreiz? DXCCStatusWidget Update AtjauninÄt It seems that the DXCC status in your database is not updated and KLog can't find any dxcc information. You can try to fix this by updating the log. Do you want to update your DXCC status? Prefix Prefix Entity Entity Pref: Prefiks: CQ: CQ: ITU: ITU: Beam: Sija: Entity not worked in this band. VienÄ«ba nedarbojÄs Å¡ajÄ joslÄ. DXClusterWidget Click on Connect to connect to the DX-Cluster server Noklikšķiniet uz Savienot lai izveidotu savienojumu ar DX-Cluster serveri Connect Savienot Clear DzÄ“st Check in QRZ.com Check this callsign in QRZ.com Click on connect to connect to the DX-Cluster Noklikšķiniet uz izveidot savienojumu, lai izveidotu savienojumu ar DX-klasteri Trying to connect to the server Mēģina izveidot savienojumu ar serveri KLog DXCluster Klog DXCluster The host was not found. Please check: Saimnieks netika atrasts. LÅ«dzu pÄrbaudi: - your network connection; - the host name and port settings. - jÅ«su tÄ«kla savienojums; - resursdatora nosaukums un porta iestatÄ«jumi. The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. LÄ«dzinieks atteicÄs izveidot savienojumu. PÄrliecinieties, vai darbojas DXCluster serveris, un pÄrbaudiet, vai resursdatora nosaukums un porta iestatÄ«jumi ir pareizi. The following error occurred: %1. RadÄs Å¡Äda kļūda: %1. Connected to server Savienots ar serveri KLog message Klog ziņojums Enter your callsign to connect to the cluster: Ievadiet savu izsaukuma signÄlu, lai izveidotu savienojumu ar klasteri: Enter your password to connect to the cluster: (Just hit enter for no password) Ievadiet savu paroli, lai izveidotu savienojumu ar klasteri: (VienkÄrÅ¡i nospiediet Enter, lai bez paroles) Disconnect Atvienoties Not logged on, you may need to enter your callsign again. Neesat pieteicies, iespÄ“jams, vÄ“lreiz jÄievada izsaukuma signÄls. Enter here the commands to be sent to the DX-Cluster server. Å eit ievadiet komandas, kas jÄnosÅ«ta uz DX-Cluster serveri. Connection closed by the server Savienojumu noslÄ“dzis serveris Click on Connect to connect to the DX-Cluster server. Noklikšķiniet uz Savienot, lai izveidotu savienojumu ar DX-Cluster serveri. Send SÅ«tÄ«t It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! NevarÄ“ja atvÄ“rt failu, lai saglabÄtu DX-Spots rakstīšanai. DX klastera darbÄ«ba netiks saglabÄta! DataProxy_SQLite Software version in DB is null ProgrammatÅ«ras versija DB ir nulle Query didn't failed VaicÄjums neizdevÄs Aircraft Scatter Common term in hamradio, do not translate if not sure Aurora Aurora Aurora-E Aurora-E Back scatter Common term in hamradio, do not translate if not sure Earth-Moon-Earth Zeme-MÄ“ness-Zeme Sporadic E SporÄdisks E Field Aligned Irregularities Common term in hamradio, do not translate if not sure LaukÄ izlÄ«dzinÄtie pÄrkÄpumi F2 Reflection Common term in hamradio, do not translate if not sure F2 Atspulgs Internet-assisted Ar interneta palÄ«dzÄ«bu Ionoscatter Common term in hamradio, do not translate if not sure Jonu izkliede Meteor scatter Common term in hamradio, do not translate if not sure Meteoru izkliede Terrestrial or atmospheric repeater or transponder Virszemes vai atmosfÄ“ras atkÄrtotÄjs vai retranslators Rain scatter Common term in hamradio, do not translate if not sure Lietus izkliedÄ“ Satellite SatelÄ«ts Trans-equatorial Common term in hamradio, do not translate if not sure TransekvatoriÄls Tropospheric ducting Common term in hamradio, do not translate if not sure TroposfÄ“ras kanÄli Yes No NÄ“ Requested PieprasÄ«ts Ignore/Invalid IgnorÄ“t/nederÄ«gs Validated ApstiprinÄts Queued RindÄ Uploaded AugÅ¡upielÄdÄ“ts Do not upload NeaugÅ¡upielÄdÄ“t Modified PÄrveidots Bureau Common term in hamradio, do not translate if not sure Birojs Direct TieÅ¡a Electronic ElektroniskÄ Manager Common term in hamradio, do not translate if not sure KLog DXCC Klog DXCC All QSOs have been updated with a DXCC and the Continent. Visi QSO ir atjauninÄti ar DXCC un kontinentu. KLog - Invalid call detected KLog — konstatÄ“ts nederÄ«gs izsaukumasignals An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported ADIF record? Ir konstatÄ“ts tukÅ¡s izsaukuma signÄls. Vai tomÄ“r vÄ“laties eksportÄ“t Å¡o QSO (noklikšķinÄt uz JÄ) vai noņemt lauku no eksportÄ“tÄ ADIF ieraksta? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log? Ir konstatÄ“ts nederÄ«gs izsaukuma signÄls %1. Vai tomÄ“r vÄ“laties eksportÄ“t Å¡o izsaukuma signÄlu (noklikšķinÄt uz JÄ) vai noņemt zvanu no eksportÄ“tÄ Å¾urnÄla? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. Nepareizu zvanu eksportēšana var radÄ«t problÄ“mas lietojumprogrammÄs, kurÄs, iespÄ“jams, importÄ“jat Å¡o žurnÄlfailu. TomÄ“r tas var bÅ«t labs izsaukuma signÄls, ko KLog nepareizi identificÄ“ kÄ nederÄ«gu. DownLoadCTY Download of cty.csv failed with the following error code: Cty.csv lejupielÄde neizdevÄs ar Å¡Ädu kļūdas kodu: Download of cty.csv done. Cty.csv lejupielÄde ir pabeigta. There is already a cty.csv file in the folder but it will be replaced with the new one. MapÄ“ jau ir fails cty.csv, taÄu tas tiks aizstÄts ar jaunu. Could not open %1 for writing NevarÄ“ja atvÄ“rt %1 rakstīšanai FileAwardManager Open Award file Atveriet balvas failu Award files (*.awa) Apbalvojuma faili (*.awa) Award file not opened Balvas fails nav atvÄ“rts KLog was not able to read the award file KLog nevarÄ“ja nolasÄ«t balvas failu It was not possible to open the file %1 for reading. NevarÄ“ja atvÄ“rt failu %1 lasīšanai. AWA wrong format AWA nepareizs formÄts The AWA file does not have the right format AWA failam nav pareizais formÄts AWA file does not have an <EOH> field AWA failam nav <EOH> lauka KLog - %1 Klog — %1 FileManager KLog - Error KLog — kļūda The selected log does not exist, please check it again. The selected callsign (%1) is not valid, please check it again to export the log. The file %1 can't be opened. There are no QSOs pending to be exported with that station callsign. Writing ADIF file... Abort writing Export Exporting ADIF file... QSO: %1 / %2 KLog - User cancelled You have canceled the file export. The file will be removed and no data will be exported. Do you still want to cancel? Export progress Writing ADIF file... QSO: Notiek ADIF faila rakstīšana... QSO: KLog - File not opened It was not possible to open the file %1 for reading. NevarÄ“ja atvÄ“rt failu %1 lasīšanai. KLog was not able to read the LoTW file Processing LoTW ADIF file... Abort processing PÄrtraukt apstrÄdi LoTW reading LoTW lasīšana KLog - Add new QSOs? Klog — pievienot jaunus QSO? Do you want to add non existing QSOs to your local log? There are some QSOs in the LoTW log that are not in your local log. Processing LoTW ADIF file...... QSO: %1 / %2 You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated. Reading LoTW file... Notiek LoTW faila lasīšana... Abort reading PÄrtraukt lasīšanu Importing LoTW ADIF file... QSO: QSO: You have canceled the file import. The file will be removed and no data will be imported. KLog - Log selection There is more than one log in this logfile. All logs will be imported into the current log. Do you want to continue? Reading ADIF file... Do you want to add dupe QSOs to your local log? There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date. Importing ADIF file... KLog - Duplicated QSOs It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) This QSO is not including the minimum data to consider a QSO as valid! Please edit the ADIF file and make sure that it include at least: and This QSO had: - The band missing and the following call: - The mode missing and the following call: - The date missing and the following call: - The time missing and the following call: Do you want to continue with the current file? KLog: Not all required data found! Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information. Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. If you select NO, maybe the QSO will not be imported. KLog: No RST TX found! Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. KLog: No RST RX found! KLog - No Station callsign entered. KLog - Apply to all QSOs in this log? KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO with %1 on %2: KLog - QSO without Station Callsign KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO on %1: KLog - Don't ask again Do you want to reuse your answer? KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again. <ul><li>Date/Time:</i> %1</li><li>Callsign: %2</li><li>Band: %3</li><li>Mode: %4</li></ul> KLog - QSO not found Do you want to add this QSO to the log?: We have found a QSO coming from LoTW that is not in your local log. Do you want KLog to add this QSO to the log? KLog - Invalid call detected KLog — konstatÄ“ts nederÄ«gs izsaukumasignals An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported log file? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log file? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. You can, however, edit the ADIF file once the export process is finished. HamLibNetworkConfigWidget Enter the hostname or address of the radio. Set de network port of the radio. Host/Address Port Enter the port of the radio. HamLibSerialConfigWidget Bauds Select the serial port speed. Port Select the serial port. Only the serial ports that are detected are shown. Scan Click to identify the serial ports available in your computer. 5 bits 6 bits 7 bits 8 bits Data bits Select the serial data bits. None Hardware Software XON/XOFF Flow control Select the serial flow control No parity Even Odd Space Mark Parity Select the serial parity. 1 bit 1.5 bits 2 bits Stop bits Select the serial stop bits. InfoWidget 10M 10M 15M 15M 20M 40M 40M 80M 80M 160M 160M 2M 2M 6M 6M 12M 12M 17M 17M 30M 30M 70CM 70CM Continent Kontinents Prefix Prefiks CQ CQ ITU ITU Short Path Īss ceļš Long Path Garais ceļš Deg Miles JÅ«dzes Km Km IntroPage Welcome to KLog! Laipni lÅ«dzam KLog! Welcome to KLog! - brought to you under the terms of the GPL! Laipni lÅ«dzam KLog! - sniegta jums saskaÅ†Ä ar GPL noteikumiem! Welcome to KLog Laipni lÅ«dzam KLog This looks like it's the first time you've run KLog on this computer. Å Ä·iet, ka šī ir pirmÄ reize, kad Å¡ajÄ datorÄ palaižat KLog. KLog is a free hamradio logging program that can run on Linux, macOS, and Windows. KLog ir bezmaksas hamradio reÄ£istrēšanas programma, kas var darboties operÄ“tÄjsistÄ“mÄs Linux, macOS un Windows. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. It is designed to provide general purpose DX, and contest logging. Tas ir paredzÄ“ts, lai nodroÅ¡inÄtu vispÄrÄ“jas nozÄ«mes DX un sacensÄ«bu reÄ£istrēšanu. It supports QSL management, import and export of ADIF TÄ atbalsta QSL pÄrvaldÄ«bu, ADIF importu un eksportu and Cabrillo file formats and many other features... un Cabrillo failu formÄti un daudzas citas funkcijas... Before you can start using KLog, you will be asked to: Pirms sÄkat lietot KLog, jums tiks lÅ«gts: Acknowledge to the terms of the license. Apstipriniet licences nosacÄ«jumus. Download the DX entities information. LejupielÄdÄ“jiet DX entÄ«tiju informÄciju. Enter your callsign, CQ zone, etc. and main configuration. Ievadiet savu izsaukuma signÄlu, CQ zonu utt. un galveno konfigurÄciju. Enjoy KLog and contact the development team if you have any suggestions! Izbaudiet KLog un sazinieties ar izstrÄdes komandu, ja jums ir kÄdi ieteikumi! LicPage KLog License information InformÄcija par KLog licenzi Welcome to KLog!- brought to you under the terms of the GPL! Laipni lÅ«dzam KLog! — nodroÅ¡inÄts saskaÅ†Ä ar GPL noteikumiem! Acknowledge AtzÄ«t Be aware that KLog is free software. Å…emiet vÄ“rÄ, ka KLog ir bezmaksas programmatÅ«ra. LoTWUtilities Double click on the date that you want to use as the start date for downloading QSOs. Veiciet dubultklikšķi uz datuma, kuru vÄ“laties izmantot kÄ QSO lejupielÄdes sÄkuma datumu. KLog - LoTW password needed KLog — nepiecieÅ¡ama LoTW parole Please enter your LoTW password: KLog - LoTW Station callsign There is not a single QSO in the log with that station callsign. Are you sure that you want to use that station callsign (%1)? KLog - LoTW File already exists There is a file already existing with the name that will be used. The file %1 already exist. Do you want to overwrite? KLog - LoTW Can't write the file KLog was not able to save the file %1. Error returned: %2 The file %1 already exists. Downloading data to file: %1. KLog - LoTW download KLog — LoTW lejupielÄde KLog - LoTW Start date selection This is the first date of a QSO with the callsign %1 in this log If you think that in LoTW you may have previous QSOs, answer No. Do you want to use this date (%1) as start date? KLog - LoTW Download error There was an error (%1) while downloading the file from LoTW. The downloading error details are: %1 KLog - LoTW Redirection found The remote server redirected our connection to %1 Do you want to follow the redirection? KLog - LoTW File not found KLog — LoTW fails nav atrasts KLog can't find the downloaded file. It was not possible for find the file %1 that has been just downloaded. KLog - LoTW user/password error LoTW server did not recognized your user/password Check your user and password and ensure your are using the right one before trying again. KLog - LoTW No QSOs LoTW sent no QSOs It seems that LoTW has no QSO with the Station Callsign you are using (%1). KLog - LoTW Unknown error KLog can't recognize the file that has been downloaded from LoTW. Try again and send the downloaded file (%1) to the KLog developer for analysis. KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data? Now KLog will process the downloaded QSO and update your local log. LogModel Date Datums Call Izsaukuma signÄls Band Diapazons Mode Režīms RSTtx RSTtx RSTrx RSTrx Comment KomentÄri LogWindow QSL Send QSL Rcvd &Delete Delete a QSO &Edit QSO Edit this QSO Via &bureau Send this QSL via bureau D&irect Send this QSL via direct Via bureau QSL &received via bureau Direct TieÅ¡a QSL received via direc&t Check in QRZ.com Check this callsign in QRZ.com Check in DXHeat.com Check this callsign in DXHeat.com Delete selected QSOs Delete the selected QSOs Export to ADIF Export the selected QSOs to an ADIF file. Upload to LoTW Upload the selected QSOs to LoTW Upload to ClubLog Upload the selected QSOs to ClubLog Upload to eQSL.cc Upload the selected QSOs to eQSL.cc Send these QSLs via bureau Send these QSLs via direct QSLs received via bureau QSLs received via direc&t Select none Remove all selections Select all Select all the QSOs MainQSOEntryWidget &Add &Clear Callsign of the QSO. Band of the QSO. Mode of the QSO. Date of the QSO. Time of the QSO. Add the QSO to the log. Clears the QSO entry. Look up info about the current callsign on qrz.com KLog will show real time if enabled. Real time Stop wsjt-x and hamlib from automatically updating QSO information. Manual Mode Callsign Izsaukuma signÄls &Save &Cancel DUPE Translator: DUPE is a common world for hams. Do not translate of not sure MainWindow Check always the current callsign in QRZ.com KLog - File not open It was not possible to open the debug file for writing. No debug log will be saved! Status bar ... DX Entity Starting KLog &Log Window KLog needs to update the Entities database. You can update the entities database in Tools->Update cty.csv Log backup recommended! It seems that you are running this version of KLog for the first time. Ready KLog KLog - Not valid call The callsign %1 is not a valid call. Do you really want to add this callsign to the log? Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. KLog - Select correct entity You have selected an entity: that is different from the KLog proposed entity: Click on the prefix of the correct entity or Cancel to edit the QSO again. Save ADIF File You have requested to delete several QSOs This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. Are you sure? You have requested to delete the QSO with: %1 The ClubLog upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? KLog - ClubLog KLog - ClubLog KLog - Stop the war in Ukraine! KLog - Stop the war in Ukraine! You are using a Russian call (%1). You can probably help to stop the Russian war, people are dying. Please call your leaders to stop the war. You are using an Ukranian call. Please take care and protect yourself and your family. The KLog developers wish you the best of luck in this very difficult moment. People are dying in the war of Russia against Ukraine. You can help to stop the Russian war against Ukraine. Please show your disagreement to your leaders, or in your social network to stop the war. Always check the current callsign in QRZ.com Upload queued QSOs to LoTW KLog - KLog folder not found It was not possible to define the KLog folder. Some functions may not work properly! KLog - CTY.dat update Do you want to update now? You seem to have never backed up or exported your log to ADIF. Your latest backup seems older than one month. Regular backups prevent data loss and are good operator practice. Once exported, copy your ADIF file to a safe place such as a USB drive, cloud drive or other offsite computer. KLog will remind you to backup on a monthly basis. KLog - Backup Backup completed successfully KLog will remind you again in approximately one month. Backup failed. Periodic data backups are recommended to prevent data loss and corruption of your log. KLog - New version detected! This version of KLog requires that the DXCC database is updated. The database will be updated. The setup will now open to allow you to change your settings. KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 KLog - ClubLog error There was an error while updating to Yes the ClubLog QSO upload information. The ClubLog upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The file has been removed. The file has not been removed. It seems that there was something that prevented KLog from removing the file You can remove it manually. The eQSL upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1 Do you want to mark as Uploaded all the QSOs uploaded to eQSL? KLog - eQSL KLog - eQSL There was an error while updating to Yes the eQSL QSO upload information. The eQSL upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The QRZ.com upload process has finished with an error and the log was possibly not uploaded. Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? KLog - QRZ.com KLog — QRZ.com KLog - eQSL error KLog - QRZ.com warning QRZ.com has returned a non-subcribed error and queries to QRZ.com will be disabled. Please check your QRZ.com subcription or credentials. There was an error while updating to Yes the QRZ.com QSO upload information. The QRZ.com upload process has finished successfully Call not found in QRZ.com KLog - QRZ.com error KLog has received an error from QRZ.com. You need to activate the %1 service in the eLog preferences. KLog - Exit Do you really want to exit KLog? The logfile has been modified. Do you want to save your changes? It is important to export to ADIF and save a copy as a backup. Saving the log was done successfully. The ADIF export was not properly done. &File &Import from ADIF ... Import an ADIF file into the current log. Export to ADIF ... Export the current log to an ADIF logfile. Export all logs to ADIF ... Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. &Print Log ... Print your log. KLog folder Opens the data folder of KLog. Settings ... E&xit &Tools Fill in QSO data Go through the log reusing previous QSOs to fill missing information in other QSOs. QSL tools ... Find QSO to QSL Shows QSOs for which you should send your QSL and request the DX QSL. Find My-QSLs pending to send Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Find DX-QSLs pending to receive Shows DX-QSLs for which requests or QSLs have been sent with no answer. Find requested pending to receive Shows the DX-QSLs that have been requested. LoTW tools ... Mark all non-sent QSOs in this log as queued to be uploaded. Queue all QSLs to be sent Put all the non-sent QSOs in the queue to be uploaded. Mark all queued QSOs from this log as sent Mark all queued QSOs in this log as sent to LoTW. Mark all queued QSOs as sent Mark all queued QSOs as sent to LoTW. Download from LoTW ... Download the full log from LoTW ... ClubLog tools ... Queue all the QSOs to be uploaded Upload the queued QSOs to ClubLog ... eQSL tools ... Upload the queued QSOs to eQSL.cc ... QRZ.com tools ... Check the current callsign in QRZ.com Queue all the QSO to be uploaded Upload the queued QSOs to QRZ.com ... Update cty.csv For updated DX-Entity data, update cty.csv. Update Satellite Data Stats Show the statistics of your radio activity. &Help Online manual (F1) ... &Tips ... &Debug ... &About ... About Qt ... Check updates ... All pending QSOs of this log has been marked as queued for LoTW! There was a problem to mark all pending QSOs of this log as queued for LoTW! Your log has been updated with the LoTW downloaded QSOs. KLog has updated %1 QSOs from LoTW. Your log has not been updated. No QSO was updated with the data coming from LoTW. This may be because of errors in the logfile or simply because your log was already updated. Do you really want to mark ALL pending QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. All pending QSOs has been marked as queued for LoTW! There was a problem to mark all pending QSOs as queued for LoTW! KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded. Error #2: Upload was rejected by LoTW, please check your data. Error #3: The TQSL server returned an unexpected response. Error #4: There was a TQSL error. Error #5: There was a TQSLLib error. Error #6: It was not possible to open the input file. Error #7: It was not possible to open the ouput file. Error #8: No QSOs were processed since some QSOs were duplicates or out of date range. Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range. Error #10: Command syntax error. KLog sent a bad syntax command. Error #11: LoTW Connection error (no network or LoTW is unreachable). Error #00: Unexpected error. Please contact the development team. The log that you have selected contains more than just one station callsign. Please select the station callsign you want to mark as sent to LoTW: Station Callsign: Define Station Callsign Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: KLog - No station selected No station callsign has been selected and therefore no log will be marked All queued QSOs has been marked as sent to LoTW! There was a problem to mark all queued QSOs of this log as sent to LoTW! KLog - %1 Klog — %1 KLog - ADIF export Queue all QSOs from this log to be sent Show Map Do you really want to mark ALL the QSOs of this log to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. Now you can upload them to LoTW. You have selected no callsign. KLog will complete the QSOs without a station callsign defined and those with the callsign you are entering here. All queued QSOs of this log has been marked as sent to LoTW! There was a problem to mark all queued QSOs as sent to LoTW! About ... Congratulations! You already have the latest version. Jums jau ir jaunÄkÄ versija. You can find the KLog data folder here: start UDP Server error The UDP server failed to %1. start or stop stop TQSL finished with no error. Do you want to mark as Sent all the QSOs uploaded to LoTW? Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1 ClubLog KLog - QRZ.COM QRZ.COM To upload QSOs you need a qrz.com subscription. If you have one, go to Setup->QRZ.com tab to enable it. KLog - QSO received Duplicated QSOs have to match another existing QSO with the same call, band, mode, date and time, taking into account the period that can be defined in the settings. KLog - QSO Dupe A dupe QSO has been detected in the file and will not be added to the log. Please check the QSO information file and ensure it is properly added. Native Error It seems that there are no QSOs in the database. If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. Status of the DX entity. Name of the DX entity. QSO QSL eQSL Comment KomentÄri Others My Data Satellite Info Awards Search Log DX-Cluster DXCC DXCC No QSOs have been exported to ADIF. KLog has exported %1 QSOs to the ADIF file: %2 KLog - LoTW KLog - Update checking result You need to select one station callsign to be able to send your log to LoTW. There was an error while updating to Yes the LoTW QSL sent information. The LoTW upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? You need to select one station callsign to be able to send your log to ClubLog. The selection you have done does not include any QSO Do you want to add this QSOs to your ClubLog existing log? If you don't agree, this upload will overwrite your current ClubLog existing log. The selection you have done does not include any QSO. KLog - Select the Station Callsign. Select the Station Callsign to use when quering LoTW: Please check the LoTW setup You have not defined a LoTW user or a proper Station Callsign. Open the LoTW tab in the Setup and configure your LoTW connection. The log is ready to be uploaded to ClubLog. All the QSOs in this log has been marked as Modified in the ClubLog status field KLog could not mark the full log to be sent to ClubLog Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers. The log is ready to be uploaded to eQSL.cc. All the QSOs in this log has been marked as Modified in the eQSL.cc status field KLog could not mark the full log to be sent to eQSL The log is ready to be uploaded to QRZ.com. All the QSOs in this log has been marked as Modified in the QRZ.com status field KLog could not mark the full log to be sent to QRZ.com You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. Open File Atver failu - Needed for DXMarathon Filling QSOs ... Abort filling Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: Number Numurs Date/Time Datums Laiks Callsign Izsaukuma signÄls RSTtx RSTtx RSTrx RSTrx Band Mode Print Log Printing the log ... Abort printing Printing the log... QSO: The following QSO data has been received from WSJT-X to be logged: Freq Time On Time Off RST TX RST RX DX-Grid Local-Grid Station Callsign Operator Callsign KLog - WSJTX Dupe QSO This QSO seems to be duplicated. Do you want to save or discard it? QSO logged from WSJT-X: KLog - Non-supported mode A new mode not supported by KLog has been received from an external program or radio: If the received mode is correct, please contact KLog development team and request support for that mode Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) KLog - Duplicated satellite A duplicated satellite has been detected in the file and will not be imported. Please check the satellite information file and ensure it is properly populated. Now you will see a more detailed error that can be used for debugging... An unexpected error ocurred!! If the problem persists, please contact the developers for analysis: Error in function Error text Failed query Recommendation: Periodically export your data to ADIF to prevent a potential data loss. KLog - Show errors Do you want to keep showing errors? MainWindowInputComment Comment KomentÄri Add a comment for this QSO. Keep this data Data entered in this tab will be copied into the next QSO. MainWindowInputEQSL Date of the ClubLog upload. Date of the QRZ.com upload. Date of the eQSL sending. Date of the eQSL reception. Date of the LoTW sending. Date of the LoTW reception. Status on ClubLog. Status on QRZ.com. Status of the eQSL sending. Status of the eQSL reception. Status of the LoTW sending. Status of the LoTW reception. ClubLog QRZ.com eQSL Sent eQSL Rec LoTW Sent LoTW Rec MainWindowInputOthers Primary Div Secondary Div IOTA Entity Entity Propagation mode Others Keep propagation mode Select the primary division for this QSO. Select the secondary division for this QSO. Select the entity for this QSO. Select the propagation mode for this QSO. Select the IOTA continent for this QSO. Select the IOTA reference number for this QSO. Keeps the same propagation mode for next QSO. Select the appropriate ADIF field for this QSO. Value for the selected ADIF field. Not Identified Not - Not Identified SOTA Ref Age VUCC grids Distance MainWindowInputQSL QSL Sent QSL Rec QSL Via QSL Msg Status of the QSL sending. Status of the QSL reception. QSL sending information. QSL reception information. Date of the QSL sending. Date of the QSL reception. Message of the QSL. QSL via information. MainWindowInputQSO TX RST. RX RST. TX Frequency in MHz. RX Frequency in MHz. Power used by the contacted station. Name of the contacted operator. QTH of the contacted station. Locator of the contacted station. Watts MHz Split Translator: Split is a common hamradio term. Do not translate unless you are sure. Name QTH DX Locator Power(rx) RST TX RX Frequency DX QTH locator. DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. TX Frequency in MHz. Frequency is not in a hamradio band! RX Frequency in MHz. Frequency is not in a hamradio band! MainWindowMyDataTab Watts Keep this data My QTH locator. Power Operator callsign Station Callsign My Locator My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. My Rig My Antenna My SOTA_Ref My VUCC_GRIDS MainWindowSatTab Keep this data Data entered in this tab will be copied into the next QSO. Other - Sat not in the list Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Satellite mode used. Select the satellite you are using. UpLink band. DownLink band. UpLink DownLink Satellite Mode Other Not Sat QSO KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. The satellite you have in your QSO is: Please be aware that the satellite name will not be saved if it is not in the list, so that information may be lost! MapWindowWidget Select QSOs in this band. Select QSOs in this mode. Select QSOs in this propagation mode. Select QSOs using this Satellite. Only confirmed Select only confirmed QSOs. All bands Show nothing All modes All propagation modes All satellites OnlineMessageWidget The server returned the following error: %1 Not identified QObject New One, work it! Needed, work it! Worked but not confirmed Confirmed ApstiprinÄts Not identified Database Error KLog DB needs to be upgraded. Do you want to upgrade it now? If DB is not upgraded KLog may not work properly. Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea. Do you want to backup your DB now? The backup finished successfully. You can find the backup in this file: %1 The backup was not properly done. You will be sent back to the starting point. KLog - DB can't be updated automatically You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version. The process to upgrade is: - Using an old KLog version export your log to ADIF. - Remove your logbook.dat file from your KLog folder. - Install the new KLog version. - Import your ADIF file. KLog will finish when you click on OK. KLog - DB update KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. KLog: Enter Station callsign Enter the station callsign used in this log Station Callsign All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay. Updating mode information... Abort updating QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? Updating bands information... Updating bands information in %1 status... Progress: Updating mode information in %1 status... Updating DXCC award information... Updating DXCC Award information... Updating WAZ award information... Updating WAZ Award information... Updating information... Updating DXCC and Continent information... A wrong callsign has been found: %1. Please enter a new callsign or confirm that the current one is a good callsign. An empty callsign has been detected. If it is possible, please enter the right call. KLog - Not valid callsign found Date Datums Call Izsaukuma signÄls RSTtx RSTtx RSTrx RSTrx Band Comment KomentÄri Mode CQz ITUz DXCC DXCC Address Age County A_Index Ant_Az Ant_El Ant_Path ARRL_SECT Award_Submitted Award_granted Band_RX CheckContest Class ClubLog SDate ClubLog status Continent Kontinents Contacted_Op Contest Id Country Credit Submitted Credit granted Dark Dok Do not translate if unsure, common hamradio term. Distance Email EQ_Call eQSL RDate eQSL SDate eQSL Rcvd eQSL Sent Fists Do not translate if unsure, common hamradio term. Fists CC Do not translate if unsure, common hamradio term. Force Init Freq Freq RX Gridsquare HRDLog SDate HRDLog status IOTA IOTA Island id K Index Lat Lon LoTW RDate LoTW SDate LoTW Rcvd LoTW Sent Max Bursts MS Shower My Antenna My City My Cnty My Country My CQz My DXCC My Fists Do not translate if unsure, common hamradio term. My Gridsquare My IOTA My IOTA island id My ITUz My Lat My Lon My Name My Postal code My Rig My Sig My Sig Info My SOTA ref My State My Street My USACA counties My VUCC grids Name Notes Nr bursts Do not translate if unsure, common hamradio term. Nr pings Do not translate if unsure, common hamradio term. Operator Owner Callsign Pfx Precedence Prop Mode Public Key QRZcom SDate QRZcom status QSL msg QSL RDate QSL SDate QSL Rcvd QSL Sent QSL rcvd via QSL sent via QSL via QSO complete QSO random QTH Region Rig RX Pwr Sat mode Sat name SFI Sig Sig Info Silent key Do not translate if unsure, common hamradio term. SKCC SOTA Ref SRX String SRX STX String State Submode SWL Do not translate if unsure, common hamradio term. UKSMG USACA counties VE prov VUCC grids Ten-Ten Do not translate, it is a hamradio group name. TX Pwr Web QSO Date off Log number KLog is already running. It is allowed to run only one instance. SearchWidget &Clear &Export Highlighted &Select All &Search All logs Clear the searches. Export the search result to an ADIF file. Select/Unselect all the QSOs shown. Search in the log. Search in all logs. Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs! Select the Station Callsign used to do this QSO. You have requested to delete the QSO with: %1 Are you sure? All in log Not defined Nav definÄ“ts &Clear selection Save File SearchWindow Call Izsaukuma signÄls Date/Time Datums Laiks Band Mode QSL Sent QSL Rcvd Station Callsign ID Date/time Station callsign Stacijas izsaukuma signÄls QSL Send &Delete Delete a QSO &Edit QSO Edit this QSO Via &bureau Send this QSL via bureau D&irect Send this QSL via direct Via bureau QSL &received via bureau Direct TieÅ¡a QSL received via direc&t Check in QRZ.com Check this callsign in QRZ.com Check in DXHeat.com Check this callsign in DXHeat.com &Request my QSL Mark my QSL as requested Via Direct and mark DX QSL as requested Send this QSL via direct and mark DX QSL as requested Via Bureau and mark DX QSL as requested Send this QSL via bureau and mark DX QSL as requested &Request the QSL Mark the QSL as requested Via bureau and mark my QSL as requested QSL received via bureau and mark my QSL as requested Direc&t and mark as my QSL requested QSL received via direct and mark my QSL as requested Needed QSO to send the QSL My QSL requested to be sent DX QSL pending to be received SetupDialog User data Bands/Modes Log widget D&X-Cluster Colors Misc World Editor Logs eLog WSJT-X Satellites HamLib Cancel Atcelt OK Settings You need to enter at least one log in the Logs tab. Do you want to add one log in the Logs tab or exit KLog? (Click Yes to add a log or No to exit KLog) DX-Cluster World DB has not been moved to new path. Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. You need to enter at least a valid callsign. Go to the User tab and enter valid callsign. You have not selected the kind of log you want. You will be redirected to the Log tab. Please add and select the kind of log you want to use. SetupEntityDialog Entity Entity Name of the Entity. CQ CQ CQ zone. ITU ITU ITU zone. Latitude Longitude of the Entity. Longitude UTC Local time difference to UTC. Main prefix Main prefix of the entity. ARRL ID ARRL ID. Prefixes Comma separated possible prefixes, e.g. EA1, EA2, ... Date of the deletion. Deleted Cancel Atcelt Ok Labi Entity Dialog SetupPageBandMode Bands Diapazons Modes Modes SetupPageColors New One Needed in this band Worked in this band Confirmed in this band Default WSJT-X palette Default palette Dark Mode Color when the DXCC is an ATNO (All Time New One). This DXCC was worked before in another band but not in the selected band. It may be needed due to the CQ, ITU, Grid, ... Worked DXCC, but not confirmed in this band. DXCC is confirmed in this band. Default color. Sets a palette of colors similar to the one used in WSJT-X. Sets the default palette. Sets the Dark Mode Choose a color Light Mode SetupPageDxCluster Add Delete Show &HF spots Show V/&UHF spots Show W&ARC spots Show &worked spots Show &confirmed spots Show ANN/&FULL messages Show WW&V messages Show WC&Y messages Save DX Cluster activity Saves all the DX-Cluster activity to a file in the KLog folder Send DX Spots to the map Sends the received DX Spots to the map to know where is the activity. DX Spots Others Messages KLog: Add a DXCluster server Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: SetupPageELog ClubLog password ClubLog App password ClubLog email Enter the email you used to register in ClubLog. Enter your password ClubLog here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!! Send QSOs in real time Activate ClubLog Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Starts the ClubLog support in KLog. Activate eQSL.cc Enter your username of eQSL.cc. Enter your password eQSL.cc here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) eQSL.cc password eQSL.cc user ClubLog eQSL.cc QRZ.com Enter the user of your QRZ.com account. You need to be subscribed to QRZ.com to use this service. User Enter your password QRZ.com here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Password Activate QRZ.com Check automatically Check in Qrz.com all Calls as they are entered Paying Subscriber Check it if you are paying for a qrz.com subscription LogBook Key LogBook Key for QSO uploading. You can get this key in your QRZ.com logbook webpage. Remember that you need a QRZ.com subscription to use this feature. LoTW Upload Download TQSL path Use TQSL LoTW password LoTW user Enter your LoTW user. Enter your password LoTW here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Path to the TQSL software. Enable the LoTW integration with TQSL. You will need to have TQSL installed Select File SetupPageHamLib Activate HamLib Activates the hamlib support that will enable the connection to a radio. Read-Only mode If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio. Test Click to test the connection to the radio Radio Select your rig. Serial Network Defines the interval to poll the radio in msecs. Test: OK Test: NOK Poll interval SetupPageLogView Fields SetupPageLogs &New &Edit &Remove Add a new log. Edit the selected log. Remove the selected log. KLog Do you really want to remove this log? All the QSOs from this log will also be deleted... Log has not been removed. (#3) Log has not been removed. (#2) Log has not been removed. (#1) ID Date Datums Station Callsign Operators Comments QSOs QSO The new log could not be created. An error has occurred showing the following error code: KLog - SetupPageLogs SetupPageLogsNew &Date &Station Callsign &Operators Comm&ent &Ok &Cancel Callsign used for this log. Comma separated list of operators: callsign1, callsign2. Start date of this log. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. SetupPageMisc &Imperial system &Log in real time &Time in UTC &Save ADIF on exit Use this &default filename Mark &QSO to send QSL when QSL is received Complete QSO with previous data Show the Station &Callsign used in the search box &Check for new versions automatically Manage DX-Marathon Mark sent eQSL && LoTW in new QSO as queued &Delete always temp ADIF file after uploading QSOs Browse Move DB QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. The search box will also show the callsign on the air to do the QSO. Check if there is a new release of KLog available every time you start KLog. Check it for Imperial system (Miles instead of Kilometers). Select to use real time. Select to use UTC time. Select if you want to save to ADIF on exit. Select to use the following name for the logfile without being asked for it again. Complete the current QSO with previous QSO data. Select if you want to manage DX-Marathon. This is the default file where ADIF data will be saved. This is the directory where the database (logbook.dat) will be saved. Click to change the default ADIF file. Click to change the path of the database. Click to move the DB to the new directory. Check non-valid calls Show seconds In seconds, enter the time range to consider a duplicate if same call, band and mode is entered. Show seconds in the QSO editor If you disable this checkbox KLog will not check callsigns to identify wrong callsigns. Select the application debug log level. This may be useful if something is not working as expected. A debug file will be created in the KLog directory and/or shown with Help->Debug menu. Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default. Delete Always the adif file created after uploading QSOs Log level Dupe time range: Open File Atver failu Select Directory This is the directory where DB (logbook.dat) will be saved. Please specify an existing directory where the database (logbook.dat) will be saved. KLog - Move DB File moved File copied File already exist. The destination file already exist and KLog will not replace it. Please remove the file from the destination folder before moving the file with KLog to make sure KLog can copy the file. File NOT copied The file was not copied due to an unknown problem. The target directory does not exist. Please select an existing directory. SetupPageSats &New &Edit &Remove &Import E&xport Add a new satellite. Edit the selected satellite. Remove the selected satellite. Import a satellites file. It will replace the satellites you have in the current list. Export your current satellites to a file. Select the sat you want to open. KLog Do you really want to remove this satellite? This satellite will no be longer available to be selected ... Sat has not been removed. (#3) Sat has not been removed. (#2) Sat has not been removed. (#1) ID Short Name Uplink Downlink Modes Modes An error has occurred showing the following error code: KLog - SetupPageSats Open Satellites File KLog warning An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Please check the format or contact the developer for analysis with the error code: Save Satellites File SetupPageSatsNew Short name Sat name UpLink DownLink Modes Modes &Ok &Cancel Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Enter the name of the satellite. Enter the uplink frequencies in this format: 144.300 Enter the downlink frequencies in this format: 144.300 Enter the modes in this format: USB Some of the data you have entered is not correct; the satellite can't be added. SetupPageSubdivisionNew &Date &Station Callsign &Operators Comm&ent &Ok &Cancel Callsign used for this log. Comma separated list of operators: callsign1, callsign2. Start date of this log. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. SetupPageSubdivisions &Remove Import new Import an AWA file with the subdivision details. Remove the selected references. Select the references you want to open. KLog Do you really want to remove the data of this entity? All the subdivision information for this entity will be deleted... Log has not been removed. (#3) Log has not been removed. (#2) Log has not been removed. (#1) ID Name Short Name CQ Zone ITU Zone Deleted Start Date End Date DXCC DXCC An error has occurred showing the following error code: KLog - SetupPageSubdivisions SetupPageUDP Start UDP Server Automatically log QSOs from WSJT-X Allow WSJT-X to send logged QSOs to KLog QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. Update status information from WSJT-X KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...) UDP port number where the UDP Server will listen for packets. Make sure it is the same port that the other programs are sending the data to. Default port is 2237. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. UDP Port Select the interface to listen for UDP datagrams coming from WSJT-X. Network interface QSOs notification timeout (milisecs) Miliseconds that the notification of QSOs received from WSJTX will be shown. SetupPageUserDataPage &Personal data Station &data Enter your name. Enter your address - 1st line. Enter your address - 2nd line. Enter your address - 3rd line. Enter your address - 4th line. Enter your city. Enter your zip code. Enter your province or state. Enter your country. &Name &Address Cit&y &Zip Code Pro&v/State Countr&y Enter your information for rig Enter your information for antenna Enter your power information. &Rig 1 R&ig 2 Ri&g 3 Antenna &1 Antenna &2 Antenna &3 Po&wer Enter the station callsign that will be used for logging. Enter the operators (comma separated if more than one). Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. &Callsign &Operators &CQ Zone &ITU Zone &Locator &Locator (not valid) SetupPageWorldEditor Add Delete Edit Export World Import World Still not implemented. Import a new cty.csv file An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. No entities information file (cty.csv) has been detected in your KLog folder. KLog will not be able to show entities information. Prefix Entity Entity ARRL ID Continent Kontinents CQ Zone ITU Zone UTC Latitude Longitude Deleted Since Date To Date Open File Atver failu BigCTY (*.csv) Entities information has been updated. Entities information has not been updated. ShowAdifImportWidget The following QSOs are those QSOs that you have received the LoTW confirmation. Ok Labi DX DX Date/Time Datums Laiks Band Mode ShowErrorDialog KLog Message KLog ziņojums SoftwareUpdateDialog Ok Labi KLog update Klog atjauninÄjums <center><h2>KLog new version (%1) is available! </h2></center><br>There is a new version of KLog available.<br><br><b>You can get the new version from:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> Congratulations! Your KLog has been updated. JÅ«su KLog ir atjauninÄts. You already have the latest version. Jums jau ir jaunÄkÄ versija. StartWizard KLog - The free hamradio logging program Quit Setup Setup is not complete yet. Are you sure you want to quit setup? StatisticsWidget QSO per year DXCC per year CQ zones per year CQ zonas gadÄ QSO per band QSO per mode QSO per DXCC QSO per Continent QSO per hour QSO per month Worked / Confirmed status Worked / Sent status Sent / Confirmed status Satellite grid status Satellite DXCC status Grids per band status DXCC per band status StatsCQZPerYearBarChartWidget CQ Zones per year CQ zonas gadÄ Reading data ... Notiek datu lasīšana ... Abort reading PÄrtraukt lasīšanu CQ zones CQ zonas CQ zones per year CQ zonas gadÄ Reading data ... Notiek datu lasīšana ... Years: %1/%2 Gadi: %1/%2 StatsDXCCOnSatsWidget Show confirmed only RÄdÄ«t tikai apstiprinÄts Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Tikai LEO satelÄ«ti Number Numurs Callsign Izsaukuma signÄls Date Datums Band Diapazons Mode Mode DXCC DXCC Satellite SatelÄ«ti Confirmed ApstiprinÄts No NÄ“ StatsEntitiesPerYearBarChartWidget Chart title Reading data ... Notiek datu lasīšana ... Abort reading PÄrtraukt lasīšanu DXCC Entities Reading data ... Notiek datu lasīšana ... Entities: StatsFieldPerBandWidget All Visi Mode: Band Worked StrÄdÄja Confirmed ApstiprinÄts StatsGridsOnSatsWidget Show confirmed only RÄdÄ«t tikai apstiprinÄts Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Tikai LEO satelÄ«ti Number Numurs Callsign Izsaukuma signÄls Date Datums Band Mode Grid Satellite Confirmed ApstiprinÄts No NÄ“ StatsQSOsPerBandBarChartWidget QSOs per band Reading data ... Notiek datu lasīšana ... Abort reading PÄrtraukt lasīšanu Bands Diapazons QSOs per band distribution Reading data ... Notiek datu lasīšana ... Bands: StatsQSOsPerContinentBarChartWidget QSOs per continent Reading data ... Notiek datu lasīšana ... Abort reading PÄrtraukt lasīšanu Continents Reading data ... Notiek datu lasīšana ... Hours: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC Reading data ... Notiek datu lasīšana ... Abort reading PÄrtraukt lasīšanu Reading data... DXCC DXCC Top ten DXCC per QSO StatsQSOsPerHourBarChartWidget QSOs per hour Reading data ... Notiek datu lasīšana ... Abort reading PÄrtraukt lasīšanu Hours QSOs at hour Reading data ... Notiek datu lasīšana ... Hours: StatsQSOsPerModeBarChartWidget QSOs per mode Reading data ... Notiek datu lasīšana ... Abort reading PÄrtraukt lasīšanu Modes Modes QSOs per mode distribution Reading data ... Notiek datu lasīšana ... Modes: StatsQSOsPerMonthBarChartWidget QSOs per month Reading data ... Notiek datu lasīšana ... Abort reading PÄrtraukt lasīšanu Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Months QSOs at Month Reading data ... Notiek datu lasīšana ... Months: StatsQSOsPerYearBarChartWidget QSOs per year Reading data ... Notiek datu lasīšana ... Abort reading PÄrtraukt lasīšanu QSOs QSO Reading data ... Notiek datu lasīšana ... QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Confirmed - %2 Sent / Confirmed status StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Confirmed - %2 Worked / Confirmed status StatsWorkedSentPieChartWidget Worked - %1 Sent - %2 Worked / Sent status TipsDialog KLog tips Next Previous <b>Tip #1:</b><br>Do you know...<br>You can use <a href="#ToolsFillInQSO">Tools->Fill in QSO data</a> to automatically read the full log to fill the DXCC, CQ, ITU zones and continent? Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in QSO data <b>Tip #3:</b><br>Do you know...<br>You can use <a href="#ToolsFindQSO2QSL">Tools->QSL tools...->Find QSO to QSL</a> to look for all those QSO that you should send your QSL because you still need to confirm that DXCC and you have still not send your QSL card? Translator: Please make sure that the name of the link is coherent with the menu Tools->QSL tools...->Find QSO to QSL <b>Tip #8:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceivePendingQSL">Tools->QSL tools...->Find DX-QSLs pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Sent</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find DX-QSLs pending to receive <b>Tip #9:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceiveRecPendingQSL">Tools->QSL tools...->Find requested pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Rec marked as <i>Requested</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find requested pending to receive <b>Tip #10:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/klogchat>English KLog Telegram group</a> to discuss about KLog in English? <b>Tip #11:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/KLogES>Spanish Telegram group</a> to discuss about KLog in Spanish? <b>Tip #2:</b><br>Do you know...<br>You can find the QSLs that you still need to send with <a href="#ToolsSendPendingQSL">Tools->QSL tools...->Find My-QSLs pending to send</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Requested</i>. Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in DXCC data <b>Tip #4:</b><br>Do you know...<br>You can enter a '*' in the search box, in the search window to search for all the QSOs done with one specific station callsign? Translator: Please make sure that the name of the link is coherent with the menu File->Export Requested QSL to ADIF... <b>Tip #5:</b><br>Do you know...<br>You can find the file containing all your log and other information in the logbook.dat file and the klogrc file, containing the KLog config file in the KLog folder by opening the <a href="#FileOpenKLogFolder">File->KLog folder</a> menu? <b>Tip #6:</b><br>Do you know...<br>You can upload your QSO marked as queued to LoTW via TQSL with <a href="#ToolsUploadLoTW">Tools->LoTW tools ...->Sends the log to LoTW calling TQSL.</a> ?<br><br>You have to configure TQSL in the preferences to be able to use this functionality. Translator: Please make sure that the name of the link is coherent with the menu File->KLog folder <b>Tip #7:</b><br>Do you know...<br>You can see the QSO that confirms one specific DXCC entity in one specific band by poiting your mouse over that band in the DXCC widget? Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find My-QSLs pending to send <b>Tip #12:</b><br>Do you know...<br>You can subscribe to <a href=https://groups.io/g/klog>KLog mailing list</a> to discuss via email about KLog in English? <b>Tip #13:</b><br>Do you know...<br>You can <a href=https://twitter.com/_ea4k>follow EA4K on twitter</a> to get updates about KLog? <b>Tip #14:</b><br>Do you know...<br>You can write your own <a href=https://www.eham.net/reviews/detail/3118>review in eHam.net about KLog</a> to help other users to decide to use KLog? <b>Tip #15:</b><br>Do you know...<br>You can join the development team by simply <a href=https://www.klog.xyz/contact>Contacting us</a>? <b>Tip #16:</b><br>Do you know...<br>That there are many ways to contribute to KLog and some of them are listed in the <a href=https://www.klog.xyz/contrib>KLog Contribute</a> page? <b>Tip #17:</b><br>Do you know...<br>You can support translating KLog into your language? Please check <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a> page. <b>Tip #18:</b><br>Do you know...<br>You can double-click on an entity name in the DXCC table and all the QSOs with that DXCC Entity will be shown in the search box? <b>Tip #19:</b><br>Do you know...<br>You can right-click on a QSO and select <i>Check in QRZ.com</i> to check that callsign in QRZ.com? UpdateSatsData Reading Satellites data file... Notiek satelÄ«tu datu faila lasīšana... Abort reading PÄrtraukt lasīšanu The Satellites information has been updated. SatelÄ«tu informÄcija ir atjauninÄta. Open File Atver failu Sat Data Satelitu Dati UpdateSettings KLog - Settings update The settings system has been changed and KLog will update your settings file. World Continent Kontinents Reading cty.csv... Lasu cty.csv... Abort reading PÄrtraukt lasīšanu WorldMapWidget World map Pasaules karte View SkatÄ«t Zoom In(25%) TuvinÄt (25%) Zoom Out(25%) TÄlinÄt (25%) Normal Size NormÄls izmÄ“rs Fit to window PielÄgot logam eLogClubLog Host not found! Timeout error! Taimauta kļūda! QSO dupe or not existing (#%1)... QSO ir dublikÄts vai nepastÄv (#% 1)... KLog - ClubLog KLog - ClubLog It seems to be a CREDENTIALS ERROR; check your email and password. It seems that your ClubLog credentials are not correct. Please check your credentials in the setup. ClubLog uploads will be disabled. We have received an undefined error from Clublog (%1) This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO. Undefined error number (#%1)... NedefinÄ“ts kļūdas numurs (#%1)... Please check your config in the setup and contact the KLog development team if you can't fix it. ClubLog uploads will be disabled. Undefined error... Callsign missing TrÅ«kst izsaukuma signÄla Invalid callsign Skipping SWL callsign Callsign is your own call Invalid callsign with no DXCC mapping Updated QSO AtjauninÄts QSO Invalid ADIF record NederÄ«gs ADIF ieraksts Missing ADIF record Test mode - parameters ok, no action taken Excessive API Usage Internal Error Rejected QSO Duplicate QSO Modified Missing Login QSO OK Upload denied No callsign selected No match found Dropped QSO OK Login rejected Rejected: Callsign is your own call eLogQrzLog Host not found! DomÄ“na nav Timeout error! Taimauta kļūda! Undefined error number (#%1) NedefinÄ“ts kļūdas numurs (#%1) KLog - QRZ.com KLog — QRZ.com We have received the following error from QRZ.com (%1) MÄ“s esam saņēmuÅ¡i Å¡Ädu kļūdu no QRZ.com (% 1) You are not subscribed to QRZ.com. Not valid KEY found Atrasts nederÄ«gs KEY Please configure your QRZ.com API key. You will find it in your QRZ.com Logbook settings webpage. You need a QRZ.com subscription to use this feature. LÅ«dzu, konfigurÄ“jiet savu QRZ.com API atslÄ“gu. JÅ«s to atradÄ«sit savÄ QRZ.com žurnÄla iestatÄ«jumu tÄ«mekļa vietnÄ“. Lai izmantotu Å¡o funkciju, jums ir nepiecieÅ¡ams QRZ.com abonements. KLog - QRZ.com password needed KLog — nepiecieÅ¡ama QRZ.com parole Please enter your QRZ.com password: LÅ«dzu, ievadiet savu QRZ.com paroli: Callsign missing TrÅ«kst izsaukuma signÄla eQSLUtilities KLog - eQSL KLog - eQSL eQSL has sent the following message: %1 eQSL ir nosÅ«tÄ«jis Å¡Ädu ziņojumu: %1 Host not found! NeeksistÄ“ Å¡is domÄ“ns! Timeout error! Taimauta kļūda! Undefined error number (#%1)... NedefinÄ“ts kļūdas numurs (#%1)... We have received an undefined error from eQSL (%1) MÄ“s esam saņēmuÅ¡i nedefinÄ“tu kļūdu no eQSL (% 1) Please check your config in the setup and contact the KLog development team if you can't fix it. eQSL uploads will be disabled. LÅ«dzu, pÄrbaudiet savu konfigurÄciju iestatÄ«jumos un sazinieties ar KLog izstrÄdes komandu, ja nevarat to labot. eQSL augÅ¡upielÄde tiks atspÄ“jota. eQSL Error: User or password incorrect eQSL kļūda: nepareizs lietotÄjs vai parole eQSL Warning: At least one of the uplodaded QSOs is duplicated. eQSL BrÄ«dinÄjums: Vismaz viens no augÅ¡upielÄdÄ“tajiem QSO ir dublÄ“ts. eQSL: All the QSOs were properly uploaded. eQSL: visi QSO tika pareizi augÅ¡upielÄdÄ“ti. KLog - eQSL.cc password needed KLog — nepiecieÅ¡ama eQSL.cc parole Please enter your eQSL.cc password: LÅ«dzu, ievadiet savu eQSL.cc paroli: klog-2.3.3/translations/klog.pot0000644000015700001710000033704314542412415016550 0ustar jenkinsjenkinsmsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Qt-Contexts: true\n" #: ../aboutdialog.cpp:28 msgctxt "AboutDialog|" msgid "About KLog" msgstr "" #: ../aboutdialog.cpp:35 msgctxt "AboutDialog|" msgid "By" msgstr "" #: ../aboutdialog.cpp:37 msgctxt "AboutDialog|" msgid "KLog is a free logbook for hamradio operators." msgstr "" #: ../aboutdialog.cpp:38 msgctxt "AboutDialog|" msgid "" "Please know that this is an BETA release and it may contain many " "bugs.
Backup your data before using this software!" msgstr "" #: ../aboutdialog.cpp:40 msgctxt "AboutDialog|" msgid "" "KLog has been fully rewritten from the 0.6.2 to be able to provide a " "cross-platform application that runs in the main operating systems (Linux, " "macOS & Windows) and provide new functionalities that KLog was not providing." msgstr "" #: ../aboutdialog.cpp:42 msgctxt "AboutDialog|" msgid "Please provide your review in KLog's eHam review page:" msgstr "" #: ../aboutdialog.cpp:45 msgctxt "AboutDialog|" msgid "Find more information and the latest release at" msgstr "" #: ../aboutdialog.cpp:46 msgctxt "AboutDialog|" msgid "Author" msgstr "" #: ../aboutdialog.cpp:69 msgctxt "AboutDialog|" msgid "today" msgstr "" #: ../aboutdialog.cpp:69 msgctxt "AboutDialog|" msgid "Main developer" msgstr "" #: ../aboutdialog.cpp:73 msgctxt "AboutDialog|" msgid "KLog is developed by a very small team and you are invited to join!" msgstr "" #: ../aboutdialog.cpp:73 msgctxt "AboutDialog|" msgid "" "If you want to provide support you are welcome to join the KLog " "development mailing list!" msgstr "" #: ../aboutdialog.cpp:73 msgctxt "AboutDialog|" msgid "" "You can also help us by sending bug reports or small code contributions, " "ideas or whatever you think may improve KLog." msgstr "" #: ../aboutdialog.cpp:74 ../aboutdialog.cpp:145 msgctxt "AboutDialog|" msgid "Authors" msgstr "" #: ../aboutdialog.cpp:89 msgctxt "AboutDialog|" msgid "" "Translators bring KLog into your language. They are really an important part " "of the KLog development team." msgstr "" #: ../aboutdialog.cpp:89 msgctxt "AboutDialog|" msgid "" "If KLog is still not in your language and you want to help us, you are " "welcome to contact us through the KLog " "development mailing list!" msgstr "" #: ../aboutdialog.cpp:90 ../aboutdialog.cpp:146 msgctxt "AboutDialog|" msgid "Translators" msgstr "" #: ../aboutdialog.cpp:102 msgctxt "AboutDialog|" msgid "Privacy advisory" msgstr "" #: ../aboutdialog.cpp:103 msgctxt "AboutDialog|" msgid "" "KLog developers have included a feature that reports some user data to the " "KLog server with the sole purpose of identifying the number of installed " "versions, to focus development in one direction or another taking into " "account user's needs" msgstr "" #: ../aboutdialog.cpp:104 msgctxt "AboutDialog|" msgid "At present, the data that is provided is the following:" msgstr "" #: ../aboutdialog.cpp:105 msgctxt "AboutDialog|" msgid "Callsign" msgstr "" #: ../aboutdialog.cpp:105 msgctxt "AboutDialog|" msgid "KLog version" msgstr "" #: ../aboutdialog.cpp:105 msgctxt "AboutDialog|" msgid "Operating system" msgstr "" #: ../aboutdialog.cpp:106 msgctxt "AboutDialog|" msgid "" "Be aware that you can enable/disable this feature from the Misc tab in the " "Setup page" msgstr "" #: ../aboutdialog.cpp:144 msgctxt "AboutDialog|" msgid "KLog" msgstr "" #: ../aboutdialog.cpp:147 msgctxt "AboutDialog|" msgid "Privacy" msgstr "" #: ../startwizard.cpp:914 msgctxt "CTYPage|" msgid "Country data download" msgstr "" #: ../startwizard.cpp:917 msgctxt "CTYPage|" msgid "KLog needs country data..." msgstr "" #: ../startwizard.cpp:922 msgctxt "CTYPage|" msgid "&Download" msgstr "" #: ../startwizard.cpp:923 msgctxt "CTYPage|" msgid "&Ignore" msgstr "" #: ../startwizard.cpp:942 msgctxt "CTYPage|" msgid "Country data needed" msgstr "" #: ../startwizard.cpp:945 msgctxt "CTYPage|" msgid "" "KLog uses the cty.csv file from http://www.country-files.com/ to get DXCC " "information." msgstr "" #: ../startwizard.cpp:947 msgctxt "CTYPage|" msgid "" "You need to download the cty.csv file if you want KLog to show you the " "countries, locator, ... of the QSOs you do." msgstr "" #: ../startwizard.cpp:949 msgctxt "CTYPage|" msgid "Click on Download to download now." msgstr "" #: ../startwizard.cpp:1025 msgctxt "CTYPage|" msgid "KLog" msgstr "" #: ../startwizard.cpp:1026 msgctxt "CTYPage|" msgid "" "I can't find the host. Please check your network and try again\n" "Do you want to try again?" msgstr "" #: ../dxccstatuswidget.cpp:48 msgctxt "DXCCStatusWidget|" msgid "Update" msgstr "" #: ../dxccstatuswidget.cpp:286 msgctxt "DXCCStatusWidget|" msgid "ID" msgstr "" #: ../dxccstatuswidget.cpp:286 msgctxt "DXCCStatusWidget|" msgid "Entity" msgstr "" #: ../dxccstatuswidget.cpp:372 msgctxt "DXCCStatusWidget|" msgid "Entity not worked in this band." msgstr "" #: ../dxcluster.cpp:70 msgctxt "DXClusterWidget|" msgid "Click on Connect to connect to the DX-Cluster server" msgstr "" #: ../dxcluster.cpp:74 ../dxcluster.cpp:533 msgctxt "DXClusterWidget|" msgid "Connect" msgstr "" #: ../dxcluster.cpp:75 ../dxcluster.cpp:512 ../dxcluster.cpp:591 #: ../dxcluster.cpp:596 msgctxt "DXClusterWidget|" msgid "Clear" msgstr "" #: ../dxcluster.cpp:151 msgctxt "DXClusterWidget|" msgid "Click on connect to connect to the DX-Cluster" msgstr "" #: ../dxcluster.cpp:210 msgctxt "DXClusterWidget|" msgid "Trying to connect to the server" msgstr "" #: ../dxcluster.cpp:221 ../dxcluster.cpp:227 ../dxcluster.cpp:234 msgctxt "DXClusterWidget|" msgid "KLog DXCluster" msgstr "" #: ../dxcluster.cpp:222 msgctxt "DXClusterWidget|" msgid "The host was not found. Please check:" msgstr "" #: ../dxcluster.cpp:223 msgctxt "DXClusterWidget|" msgid "" "- your network connection;\n" "- the host name and port settings." msgstr "" #: ../dxcluster.cpp:228 msgctxt "DXClusterWidget|" msgid "" "The connection was refused by the peer. Make sure the DXCluster server is " "running, and check that the host name and port settings are correct." msgstr "" #: ../dxcluster.cpp:235 #, qt-format msgctxt "DXClusterWidget|" msgid "The following error occurred: %1." msgstr "" #: ../dxcluster.cpp:485 msgctxt "DXClusterWidget|" msgid "Connected to server" msgstr "" #: ../dxcluster.cpp:498 ../dxcluster.cpp:502 ../dxcluster.cpp:506 msgctxt "DXClusterWidget|" msgid "KLog message" msgstr "" #: ../dxcluster.cpp:498 ../dxcluster.cpp:502 msgctxt "DXClusterWidget|" msgid "Enter your callsign to connect to the cluster:" msgstr "" #: ../dxcluster.cpp:506 msgctxt "DXClusterWidget|" msgid "" "Enter your password to connect to the cluster:\n" "(Just hit enter for no password)" msgstr "" #: ../dxcluster.cpp:511 ../dxcluster.cpp:590 msgctxt "DXClusterWidget|" msgid "Disconnect" msgstr "" #: ../dxcluster.cpp:515 msgctxt "DXClusterWidget|" msgid "Not logged on, you may need to enter your callsign again." msgstr "" #: ../dxcluster.cpp:519 msgctxt "DXClusterWidget|" msgid "Enter here the commands to be sent to the DX-Cluster server." msgstr "" #: ../dxcluster.cpp:529 msgctxt "DXClusterWidget|" msgid "Connection closed by the server" msgstr "" #: ../dxcluster.cpp:535 msgctxt "DXClusterWidget|" msgid "Click on Connect to connect to the DX-Cluster server." msgstr "" #: ../dxcluster.cpp:595 msgctxt "DXClusterWidget|" msgid "Send" msgstr "" #: ../dataproxy_sqlite.cpp:74 msgctxt "DataProxy_SQLite|" msgid "Software version in DB is null" msgstr "" #: ../dataproxy_sqlite.cpp:74 msgctxt "DataProxy_SQLite|" msgid "No query failed" msgstr "" #: ../dataproxy_sqlite.cpp:3027 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Aircraft Scatter" msgstr "" #: ../dataproxy_sqlite.cpp:3031 msgctxt "DataProxy_SQLite|" msgid "Aurora" msgstr "" #: ../dataproxy_sqlite.cpp:3035 msgctxt "DataProxy_SQLite|" msgid "Aurora-E" msgstr "" #: ../dataproxy_sqlite.cpp:3039 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Back scatter" msgstr "" #: ../dataproxy_sqlite.cpp:3043 msgctxt "DataProxy_SQLite|" msgid "Earth-Moon-Earth" msgstr "" #: ../dataproxy_sqlite.cpp:3047 msgctxt "DataProxy_SQLite|" msgid "Sporadic E" msgstr "" #: ../dataproxy_sqlite.cpp:3051 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Field Aligned Irregularities" msgstr "" #: ../dataproxy_sqlite.cpp:3055 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "F2 Reflection" msgstr "" #: ../dataproxy_sqlite.cpp:3059 msgctxt "DataProxy_SQLite|" msgid "Internet-assisted" msgstr "" #: ../dataproxy_sqlite.cpp:3063 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Ionoscatter" msgstr "" #: ../dataproxy_sqlite.cpp:3067 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Meteor scatter" msgstr "" #: ../dataproxy_sqlite.cpp:3071 msgctxt "DataProxy_SQLite|" msgid "Terrestrial or atmospheric repeater or transponder" msgstr "" #: ../dataproxy_sqlite.cpp:3075 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Rain scatter" msgstr "" #: ../dataproxy_sqlite.cpp:3079 msgctxt "DataProxy_SQLite|" msgid "Satellite" msgstr "" #: ../dataproxy_sqlite.cpp:3083 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Trans-equatorial" msgstr "" #: ../dataproxy_sqlite.cpp:3087 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Tropospheric ducting" msgstr "" #: ../dataproxy_sqlite.cpp:3639 ../dataproxy_sqlite.cpp:3706 msgctxt "DataProxy_SQLite|" msgid "Yes" msgstr "" #: ../dataproxy_sqlite.cpp:3643 ../dataproxy_sqlite.cpp:3710 msgctxt "DataProxy_SQLite|" msgid "No" msgstr "" #: ../dataproxy_sqlite.cpp:3647 ../dataproxy_sqlite.cpp:3714 msgctxt "DataProxy_SQLite|" msgid "Requested" msgstr "" #: ../dataproxy_sqlite.cpp:3651 ../dataproxy_sqlite.cpp:3722 msgctxt "DataProxy_SQLite|" msgid "Ignore/Invalid" msgstr "" #: ../dataproxy_sqlite.cpp:3655 msgctxt "DataProxy_SQLite|" msgid "Validated" msgstr "" #: ../dataproxy_sqlite.cpp:3718 msgctxt "DataProxy_SQLite|" msgid "Queued" msgstr "" #: ../dataproxy_sqlite.cpp:3770 msgctxt "DataProxy_SQLite|" msgid "Uploaded" msgstr "" #: ../dataproxy_sqlite.cpp:3774 msgctxt "DataProxy_SQLite|" msgid "Do not upload" msgstr "" #: ../dataproxy_sqlite.cpp:3778 msgctxt "DataProxy_SQLite|" msgid "Modified" msgstr "" #: ../dataproxy_sqlite.cpp:3828 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Bureau" msgstr "" #: ../dataproxy_sqlite.cpp:3832 msgctxt "DataProxy_SQLite|" msgid "Direct" msgstr "" #: ../dataproxy_sqlite.cpp:3836 msgctxt "DataProxy_SQLite|" msgid "Electronic" msgstr "" #: ../dataproxy_sqlite.cpp:3840 msgctxt "" "DataProxy_SQLite|Common term in hamradio, do not translate if not sure" msgid "Manager" msgstr "" #: ../dataproxy_sqlite.cpp:4862 msgctxt "DataProxy_SQLite|" msgid "KLog DXCC" msgstr "" #: ../dataproxy_sqlite.cpp:4863 msgctxt "DataProxy_SQLite|" msgid "All QSOs have been updated with a DXCC and the Continent." msgstr "" #: ../downloadcty.cpp:64 msgctxt "DownLoadCTY|" msgid "Download of cty.csv failed with the following error code: " msgstr "" #: ../downloadcty.cpp:76 msgctxt "DownLoadCTY|" msgid "Download of cty.csv done." msgstr "" #: ../downloadcty.cpp:147 msgctxt "DownLoadCTY|" msgid "" "There is already a cty.csv file in the folder but it will be replaced with " "the new one." msgstr "" #: ../downloadcty.cpp:177 #, qt-format msgctxt "DownLoadCTY|" msgid "Could not open %1 for writing" msgstr "" #: ../filemanager.cpp:199 msgctxt "FileManager|" msgid "" "The log that you have selected contains more than just one station callsign." msgstr "" #: ../filemanager.cpp:199 msgctxt "FileManager|" msgid "Please select the station callsign you want to export the log from:" msgstr "" #: ../filemanager.cpp:202 msgctxt "FileManager|" msgid "Station Callsign:" msgstr "" #: ../filemanager.cpp:211 msgctxt "FileManager|" msgid "Define Station Callsign" msgstr "" #: ../filemanager.cpp:212 msgctxt "FileManager|" msgid "" "You have selected no callsign. KLog will export QSOs without a station " "callsign defined and those with the call you are entering here." msgstr "" #: ../filemanager.cpp:212 msgctxt "FileManager|" msgid "" "Enter the station callsign to use for this log or leave it empty for QSO " "without station callsign defined:" msgstr "" #: ../filemanager.cpp:224 msgctxt "FileManager|" msgid "" "No station callsign has been selected and therefore no log will be exported" msgstr "" #: ../filemanager.cpp:249 ../filemanager.cpp:570 msgctxt "FileManager|" msgid "Writing ADIF file..." msgstr "" #: ../filemanager.cpp:249 ../filemanager.cpp:570 ../filemanager.cpp:2783 msgctxt "FileManager|" msgid "Abort writing" msgstr "" #: ../filemanager.cpp:441 msgctxt "FileManager|" msgid "Exporting LoTW ADIF file..." msgstr "" #: ../filemanager.cpp:441 ../filemanager.cpp:3589 msgctxt "FileManager|" msgid " QSO: " msgstr "" #: ../filemanager.cpp:2626 msgctxt "FileManager|" msgid "" "Writing ADIF file...\n" " QSO: " msgstr "" #: ../filemanager.cpp:2634 msgctxt "FileManager|" msgid "" "You have canceled the file export. The file will be removed and no data will " "be exported." msgstr "" #: ../filemanager.cpp:2634 ../filemanager.cpp:3755 msgctxt "FileManager|" msgid "Do you still want to cancel?" msgstr "" #: ../filemanager.cpp:2783 msgctxt "FileManager|" msgid "Writing Cabrillo file..." msgstr "" #: ../filemanager.cpp:2967 msgctxt "FileManager|" msgid "KLog: Cabrillo Log Export not implemented" msgstr "" #: ../filemanager.cpp:2968 msgctxt "FileManager|" msgid "" "I am sorry but the Cabrillo Export To File feature has still not been " "implemented." msgstr "" #: ../filemanager.cpp:3100 msgctxt "FileManager|" msgid "Reading LoTW file..." msgstr "" #: ../filemanager.cpp:3100 ../filemanager.cpp:3383 msgctxt "FileManager|" msgid "Abort reading" msgstr "" #: ../filemanager.cpp:3336 msgctxt "FileManager|" msgid "There is more than one log in this logfile." msgstr "" #: ../filemanager.cpp:3336 msgctxt "FileManager|" msgid "All logs will be imported into the current log." msgstr "" #: ../filemanager.cpp:3336 msgctxt "FileManager|" msgid "Do you want to continue?" msgstr "" #: ../filemanager.cpp:3383 msgctxt "FileManager|" msgid "Reading ADIF file..." msgstr "" #: ../filemanager.cpp:3589 msgctxt "FileManager|" msgid "Importing ADIF file..." msgstr "" #: ../filemanager.cpp:3616 msgctxt "FileManager|" msgid "" "It seems that there are some duplicated QSOs in the ADIF file you are " "importing. Do you want to continue? (Duped QSOs will not be imported)" msgstr "" #: ../filemanager.cpp:3755 msgctxt "FileManager|" msgid "" "You have cancelled the file import. The file will be removed and no data " "will be imported." msgstr "" #: ../filemanager.cpp:4773 msgctxt "FileManager|" msgid "This QSO is not including the minimum data to consider a QSO as valid!." msgstr "" #: ../filemanager.cpp:4773 msgctxt "FileManager|" msgid "Please edit the ADIF file and make sure that it include at least:" msgstr "" #: ../filemanager.cpp:4773 msgctxt "FileManager|" msgid "and" msgstr "" #: ../filemanager.cpp:4773 msgctxt "FileManager|" msgid "This QSO had:" msgstr "" #: ../filemanager.cpp:4777 msgctxt "FileManager|" msgid " - The band missing and the following call: " msgstr "" #: ../filemanager.cpp:4782 msgctxt "FileManager|" msgid " - The call missing but was done at this time: " msgstr "" #: ../filemanager.cpp:4787 msgctxt "FileManager|" msgid " - The mode missing and the following call: " msgstr "" #: ../filemanager.cpp:4792 msgctxt "FileManager|" msgid " - The date missing and the following call: " msgstr "" #: ../filemanager.cpp:4797 msgctxt "FileManager|" msgid " - The time missing and the following call: " msgstr "" #: ../filemanager.cpp:4802 msgctxt "FileManager|" msgid "Do you want to continue with the current file?" msgstr "" #: ../filemanager.cpp:4806 msgctxt "FileManager|" msgid "KLog: Not all required data found!" msgstr "" #: ../filemanager.cpp:4830 msgctxt "FileManager|" msgid "This log seems to lack of RST-TX information." msgstr "" #: ../filemanager.cpp:4830 ../filemanager.cpp:4852 msgctxt "FileManager|" msgid "Click on Yes to add a default 59 to all QSO with a similar problem." msgstr "" #: ../filemanager.cpp:4830 ../filemanager.cpp:4852 msgctxt "FileManager|" msgid "If you select NO, the QSO may not be imported." msgstr "" #: ../filemanager.cpp:4831 msgctxt "FileManager|" msgid "KLog: No RST TX found!" msgstr "" #: ../filemanager.cpp:4852 msgctxt "FileManager|" msgid "This log seems to lack of RST-RX information." msgstr "" #: ../filemanager.cpp:4854 msgctxt "FileManager|" msgid "KLog: No RST RX found!" msgstr "" #: ../infowidget.cpp:48 msgctxt "InfoWidget|" msgid "10M" msgstr "" #: ../infowidget.cpp:49 msgctxt "InfoWidget|" msgid "15M" msgstr "" #: ../infowidget.cpp:50 msgctxt "InfoWidget|" msgid "20M" msgstr "" #: ../infowidget.cpp:51 msgctxt "InfoWidget|" msgid "40M" msgstr "" #: ../infowidget.cpp:52 msgctxt "InfoWidget|" msgid "80M" msgstr "" #: ../infowidget.cpp:53 msgctxt "InfoWidget|" msgid "160M" msgstr "" #: ../infowidget.cpp:54 msgctxt "InfoWidget|" msgid "2M" msgstr "" #: ../infowidget.cpp:55 msgctxt "InfoWidget|" msgid "6M" msgstr "" #: ../infowidget.cpp:56 msgctxt "InfoWidget|" msgid "12M" msgstr "" #: ../infowidget.cpp:57 msgctxt "InfoWidget|" msgid "17M" msgstr "" #: ../infowidget.cpp:58 msgctxt "InfoWidget|" msgid "30M" msgstr "" #: ../infowidget.cpp:59 msgctxt "InfoWidget|" msgid "70CM" msgstr "" #: ../infowidget.cpp:74 msgctxt "InfoWidget|" msgid "Continent" msgstr "" #: ../infowidget.cpp:78 msgctxt "InfoWidget|" msgid "Prefix" msgstr "" #: ../infowidget.cpp:82 msgctxt "InfoWidget|" msgid "CQ" msgstr "" #: ../infowidget.cpp:86 msgctxt "InfoWidget|" msgid "ITU" msgstr "" #: ../infowidget.cpp:90 msgctxt "InfoWidget|" msgid "Short Path" msgstr "" #: ../infowidget.cpp:93 msgctxt "InfoWidget|" msgid "Long Path" msgstr "" #: ../infowidget.cpp:96 ../infowidget.cpp:101 msgctxt "InfoWidget|" msgid "Deg" msgstr "" #: ../infowidget.cpp:314 ../infowidget.cpp:315 msgctxt "InfoWidget|" msgid "Miles" msgstr "" #: ../infowidget.cpp:321 ../infowidget.cpp:322 msgctxt "InfoWidget|" msgid "Km" msgstr "" #: ../startwizard.cpp:141 msgctxt "IntroPage|" msgid "Welcome to KLog!" msgstr "" #: ../startwizard.cpp:143 msgctxt "IntroPage|" msgid "Welcome to KLog! - brought to you under the terms of the GPL!" msgstr "" #: ../startwizard.cpp:151 msgctxt "IntroPage|" msgid "Welcome to KLog" msgstr "" #: ../startwizard.cpp:152 msgctxt "IntroPage|" msgid "This looks like it's the first time you've run KLog on this computer." msgstr "" #: ../startwizard.cpp:153 msgctxt "IntroPage|" msgid "" "KLog is a free hamradio logging program that can run on Linux macOS and " "Windows." msgstr "" #: ../startwizard.cpp:154 msgctxt "IntroPage|" msgid "It is designed to provide general purpose, DX and contest logging." msgstr "" #: ../startwizard.cpp:155 msgctxt "IntroPage|" msgid "It supports QSL management, import and export of ADIF " msgstr "" #: ../startwizard.cpp:156 msgctxt "IntroPage|" msgid "and Cabrillo file formats and many other features..." msgstr "" #: ../startwizard.cpp:157 msgctxt "IntroPage|" msgid "Before you can start using KLog, you will be asked to:" msgstr "" #: ../startwizard.cpp:158 msgctxt "IntroPage|" msgid "Acknowledge to the terms of the license." msgstr "" #: ../startwizard.cpp:159 msgctxt "IntroPage|" msgid "Download the DX entities information." msgstr "" #: ../startwizard.cpp:160 msgctxt "IntroPage|" msgid "Enter your callsign, CQ zone, etc. and main configuration." msgstr "" #: ../startwizard.cpp:161 msgctxt "IntroPage|" msgid "" "Enjoy KLog and contact the development team if you have any suggestions!" msgstr "" #: ../startwizard.cpp:182 msgctxt "LicPage|" msgid "KLog License information" msgstr "" #: ../startwizard.cpp:185 msgctxt "LicPage|" msgid "Welcome to KLog!- brought to you under the terms of the GPL!" msgstr "" #: ../startwizard.cpp:826 msgctxt "LicPage|" msgid "Acknowledge" msgstr "" #: ../startwizard.cpp:827 msgctxt "LicPage|" msgid "Be aware that KLog is free software." msgstr "" #: ../logmodel.cpp:105 msgctxt "LogModel|" msgid "Date" msgstr "" #: ../logmodel.cpp:108 msgctxt "LogModel|" msgid "Time" msgstr "" #: ../logmodel.cpp:111 msgctxt "LogModel|" msgid "QRZ" msgstr "" #: ../logmodel.cpp:114 msgctxt "LogModel|" msgid "Band" msgstr "" #: ../logmodel.cpp:117 msgctxt "LogModel|" msgid "Mode" msgstr "" #: ../logmodel.cpp:120 msgctxt "LogModel|" msgid "RSTtx" msgstr "" #: ../logmodel.cpp:123 msgctxt "LogModel|" msgid "RSTrx" msgstr "" #: ../logmodel.cpp:126 msgctxt "LogModel|" msgid "Comment" msgstr "" #: ../logwindow.cpp:209 msgctxt "LogWindow|" msgid "QSL Send" msgstr "" #: ../logwindow.cpp:221 msgctxt "LogWindow|" msgid "QSL Rcvd" msgstr "" #: ../logwindow.cpp:278 msgctxt "LogWindow|" msgid "&Delete" msgstr "" #: ../logwindow.cpp:280 msgctxt "LogWindow|" msgid "Delete a QSO" msgstr "" #: ../logwindow.cpp:283 msgctxt "LogWindow|" msgid "&Edit QSO" msgstr "" #: ../logwindow.cpp:285 msgctxt "LogWindow|" msgid "Edit this QSO" msgstr "" #: ../logwindow.cpp:288 msgctxt "LogWindow|" msgid "Via &bureau" msgstr "" #: ../logwindow.cpp:290 msgctxt "LogWindow|" msgid "Send this QSL via bureau" msgstr "" #: ../logwindow.cpp:293 msgctxt "LogWindow|" msgid "D&irect" msgstr "" #: ../logwindow.cpp:295 msgctxt "LogWindow|" msgid "Send this QSL via direct" msgstr "" #: ../logwindow.cpp:298 msgctxt "LogWindow|" msgid "Via bureau" msgstr "" #: ../logwindow.cpp:300 msgctxt "LogWindow|" msgid "QSL &received via bureau" msgstr "" #: ../logwindow.cpp:303 msgctxt "LogWindow|" msgid "Direct" msgstr "" #: ../logwindow.cpp:305 msgctxt "LogWindow|" msgid "QSL received via direc&t" msgstr "" #: ../logwindow.cpp:386 msgctxt "LogWindow|" msgid "You have requested to delete this QSO." msgstr "" #: ../logwindow.cpp:387 msgctxt "LogWindow|" msgid "Are you sure?" msgstr "" #: ../mainwindow.cpp:183 msgctxt "MainWindow|" msgid "Recalculate" msgstr "" #: ../mainwindow.cpp:184 msgctxt "MainWindow|" msgid "Click to recalculate the award status." msgstr "" #: ../mainwindow.cpp:210 msgctxt "MainWindow|" msgid "Starting KLog" msgstr "" #: ../mainwindow.cpp:314 ../mainwindow.cpp:909 ../mainwindow.cpp:3171 #: ../mainwindow.cpp:3234 msgctxt "MainWindow|" msgid "&Add" msgstr "" #: ../mainwindow.cpp:317 msgctxt "MainWindow|" msgid "&Clear" msgstr "" #: ../mainwindow.cpp:320 msgctxt "MainWindow|" msgid "Status bar..." msgstr "" #: ../mainwindow.cpp:321 msgctxt "MainWindow|" msgid "DX Entity" msgstr "" #: ../mainwindow.cpp:323 msgctxt "MainWindow|" msgid "&Log Window" msgstr "" #: ../mainwindow.cpp:324 msgctxt "MainWindow|" msgid "&Score Window" msgstr "" #: ../mainwindow.cpp:334 msgctxt "MainWindow|" msgid "Watts" msgstr "" #: ../mainwindow.cpp:339 ../mainwindow.cpp:344 msgctxt "MainWindow|" msgid "MHz" msgstr "" #: ../mainwindow.cpp:428 ../mainwindow.cpp:4135 msgctxt "MainWindow|" msgid "KLog" msgstr "" #: ../mainwindow.cpp:480 ../mainwindow.cpp:4476 ../mainwindow.cpp:7813 msgctxt "MainWindow|" msgid "DX-Marathon" msgstr "" #: ../mainwindow.cpp:487 ../mainwindow.cpp:4482 ../mainwindow.cpp:7822 msgctxt "MainWindow|" msgid "Annual" msgstr "" #: ../mainwindow.cpp:663 msgctxt "MainWindow|" msgid "Ready" msgstr "" #: ../mainwindow.cpp:875 msgctxt "MainWindow|" msgid "" "An unexpected error ocurred when trying to add the QSO to your log. If the " "problem persists, please contact the developer for analysis: " msgstr "" #: ../mainwindow.cpp:1067 ../mainwindow.cpp:1770 msgctxt "MainWindow|" msgid "You have selected an entity:" msgstr "" #: ../mainwindow.cpp:1067 ../mainwindow.cpp:1770 msgctxt "MainWindow|" msgid "that is different from the KLog proposed entity:" msgstr "" #: ../mainwindow.cpp:1068 msgctxt "MainWindow|" msgid "" "Click on the prefix of the correct entity or Cancel to edit the QSO again." msgstr "" #: ../mainwindow.cpp:1771 msgctxt "MainWindow|" msgid "Click on the prefix of the right entity or Cancel to correct." msgstr "" #: ../mainwindow.cpp:2438 ../mainwindow.cpp:5087 msgctxt "MainWindow|" msgid "QRZ of the QSO." msgstr "" #: ../mainwindow.cpp:2439 ../mainwindow.cpp:5088 msgctxt "MainWindow|" msgid "TX RST." msgstr "" #: ../mainwindow.cpp:2440 ../mainwindow.cpp:5089 msgctxt "MainWindow|" msgid "RX RST." msgstr "" #: ../mainwindow.cpp:2441 ../mainwindow.cpp:5090 msgctxt "MainWindow|" msgid "TX Exchange." msgstr "" #: ../mainwindow.cpp:2442 ../mainwindow.cpp:5091 msgctxt "MainWindow|" msgid "RX Exchange." msgstr "" #: ../mainwindow.cpp:2443 ../mainwindow.cpp:5092 msgctxt "MainWindow|" msgid "Band of the QSO." msgstr "" #: ../mainwindow.cpp:2444 ../mainwindow.cpp:5093 msgctxt "MainWindow|" msgid "Mode of the QSO." msgstr "" #: ../mainwindow.cpp:2445 ../mainwindow.cpp:5094 msgctxt "MainWindow|" msgid "Date of the QSO." msgstr "" #: ../mainwindow.cpp:2446 ../mainwindow.cpp:5095 msgctxt "MainWindow|" msgid "Time of the QSO." msgstr "" #: ../mainwindow.cpp:2449 ../mainwindow.cpp:5098 msgctxt "MainWindow|" msgid "Add the QSO to the log." msgstr "" #: ../mainwindow.cpp:2451 msgctxt "MainWindow|" msgid "Clear the box." msgstr "" #: ../mainwindow.cpp:2453 msgctxt "MainWindow|" msgid "Input" msgstr "" #: ../mainwindow.cpp:2466 ../mainwindow.cpp:6664 msgctxt "MainWindow|" msgid "RSTrx" msgstr "" #: ../mainwindow.cpp:2473 ../mainwindow.cpp:6662 msgctxt "MainWindow|" msgid "RSTtx" msgstr "" #: ../mainwindow.cpp:2482 ../mainwindow.cpp:3291 ../mainwindow.cpp:3297 #: ../mainwindow.cpp:4215 ../mainwindow.cpp:5287 ../mainwindow.cpp:6660 msgctxt "MainWindow|" msgid "QRZ" msgstr "" #: ../mainwindow.cpp:2489 msgctxt "MainWindow|" msgid "STX" msgstr "" #: ../mainwindow.cpp:2496 msgctxt "MainWindow|" msgid "SRX" msgstr "" #: ../mainwindow.cpp:2803 msgctxt "MainWindow|" msgid "NEW MULT" msgstr "" #: ../mainwindow.cpp:2909 msgctxt "MainWindow|" msgid "Invalid characters used in the QRZ" msgstr "" #: ../mainwindow.cpp:3061 msgctxt "MainWindow|" msgid "Ready..." msgstr "" #: ../mainwindow.cpp:3401 msgctxt "MainWindow|" msgid "The logfile has been modified." msgstr "" #: ../mainwindow.cpp:3401 msgctxt "MainWindow|" msgid "Do you want to save your changes?" msgstr "" #: ../mainwindow.cpp:3435 msgctxt "MainWindow|" msgid "&File" msgstr "" #: ../mainwindow.cpp:3437 msgctxt "MainWindow|" msgid "&New..." msgstr "" #: ../mainwindow.cpp:3442 msgctxt "MainWindow|" msgid "&Open..." msgstr "" #: ../mainwindow.cpp:3447 msgctxt "MainWindow|" msgid "&Import from ADIF..." msgstr "" #: ../mainwindow.cpp:3450 msgctxt "MainWindow|" msgid "Import an ADIF file into the current log." msgstr "" #: ../mainwindow.cpp:3459 msgctxt "MainWindow|" msgid "&Save As..." msgstr "" #: ../mainwindow.cpp:3466 msgctxt "MainWindow|" msgid "Export to ADIF..." msgstr "" #: ../mainwindow.cpp:3470 msgctxt "MainWindow|" msgid "Export the current log to an ADIF logfile." msgstr "" #: ../mainwindow.cpp:3472 msgctxt "MainWindow|" msgid "Export all logs to ADIF..." msgstr "" #: ../mainwindow.cpp:3476 msgctxt "MainWindow|" msgid "Export ALL the QSOs into one ADIF file, merging QSOs from all the logs." msgstr "" #: ../mainwindow.cpp:3478 msgctxt "MainWindow|" msgid "Export Requested QSL to ADIF..." msgstr "" #: ../mainwindow.cpp:3481 msgctxt "MainWindow|" msgid "" "Export all QSOs requesting QSLs to an ADIF file (e.g. to import it into a " "QSL tag printing program)." msgstr "" #: ../mainwindow.cpp:3483 msgctxt "MainWindow|" msgid "Export ADIF for LoTW..." msgstr "" #: ../mainwindow.cpp:3486 msgctxt "MainWindow|" msgid "" "Export an ADIF file to be sent to LoTW. Remember to sign it with TQSL before " "uploading to LoTW!" msgstr "" #: ../mainwindow.cpp:3490 msgctxt "MainWindow|" msgid "&Print Log..." msgstr "" #: ../mainwindow.cpp:3493 msgctxt "MainWindow|" msgid "Print your log." msgstr "" #: ../mainwindow.cpp:3498 msgctxt "MainWindow|" msgid "KLog folder" msgstr "" #: ../mainwindow.cpp:3500 msgctxt "MainWindow|" msgid "Opens the data folder of KLog." msgstr "" #: ../mainwindow.cpp:3505 msgctxt "MainWindow|" msgid "E&xit" msgstr "" #: ../mainwindow.cpp:3511 msgctxt "MainWindow|" msgid "&Tools" msgstr "" #: ../mainwindow.cpp:3513 msgctxt "MainWindow|" msgid "Fill in QSO data" msgstr "" #: ../mainwindow.cpp:3517 msgctxt "MainWindow|" msgid "" "Go through the log reusing previous QSOs to fill missing information in " "other QSOs." msgstr "" #: ../mainwindow.cpp:3519 msgctxt "MainWindow|" msgid "Fill in DXCC data" msgstr "" #: ../mainwindow.cpp:3522 msgctxt "MainWindow|" msgid "Go through the log filling QSOs without a DXCC defined." msgstr "" #: ../mainwindow.cpp:3525 msgctxt "MainWindow|" msgid "QSL tools..." msgstr "" #: ../mainwindow.cpp:3532 msgctxt "MainWindow|" msgid "&Find QSO to QSL" msgstr "" #: ../mainwindow.cpp:3535 msgctxt "MainWindow|" msgid "Shows QSOs for which you should send your QSL and request the DX QSL." msgstr "" #: ../mainwindow.cpp:3537 msgctxt "MainWindow|" msgid "Find My-QSLs pending to send" msgstr "" #: ../mainwindow.cpp:3541 msgctxt "MainWindow|" msgid "" "Shows the QSOs with pending requests to send QSLs. You should keep this " "queue empty!" msgstr "" #: ../mainwindow.cpp:3543 msgctxt "MainWindow|" msgid "&Find DX-QSLs pending to receive" msgstr "" #: ../mainwindow.cpp:3546 msgctxt "MainWindow|" msgid "" "Shows the DX-QSL that has been requested or QSLs has been sent with no " "answer." msgstr "" #: ../mainwindow.cpp:3548 msgctxt "MainWindow|" msgid "&Find requested pending to receive" msgstr "" #: ../mainwindow.cpp:3551 msgctxt "MainWindow|" msgid "Shows the DX-QSL that has been requested." msgstr "" #: ../mainwindow.cpp:3554 msgctxt "MainWindow|" msgid "LoTW tools..." msgstr "" #: ../mainwindow.cpp:3556 msgctxt "MainWindow|" msgid "Queue all QSL to be sent of this log" msgstr "" #: ../mainwindow.cpp:3559 msgctxt "MainWindow|" msgid "Mark all non sent QSOs in this log as queued to be uploaded." msgstr "" #: ../mainwindow.cpp:3561 msgctxt "MainWindow|" msgid "Queue all QSL to be sent" msgstr "" #: ../mainwindow.cpp:3564 msgctxt "MainWindow|" msgid "Mark all non sent QSOs as queued to be uploaded." msgstr "" #: ../mainwindow.cpp:3568 msgctxt "MainWindow|" msgid "Mark as sent all queued QSO of this log" msgstr "" #: ../mainwindow.cpp:3571 msgctxt "MainWindow|" msgid "Mark all queued QSOs in this log as sent to LoTW." msgstr "" #: ../mainwindow.cpp:3573 msgctxt "MainWindow|" msgid "Mark all queued QSO as sent" msgstr "" #: ../mainwindow.cpp:3576 msgctxt "MainWindow|" msgid "Mark all queued QSOs as sent to LoTW." msgstr "" #: ../mainwindow.cpp:3581 msgctxt "MainWindow|" msgid "&Update cty.csv" msgstr "" #: ../mainwindow.cpp:3585 ../mainwindow.cpp:3590 msgctxt "MainWindow|" msgid "For updated DX-Entity data, update cty.csv." msgstr "" #: ../mainwindow.cpp:3587 msgctxt "MainWindow|" msgid "&Update Satellite Data" msgstr "" #: ../mainwindow.cpp:3594 msgctxt "MainWindow|" msgid "Stats" msgstr "" #: ../mainwindow.cpp:3598 msgctxt "MainWindow|" msgid "Show the statistics of your radio activity." msgstr "" #: ../mainwindow.cpp:3602 msgctxt "MainWindow|" msgid "&Setup" msgstr "" #: ../mainwindow.cpp:3604 msgctxt "MainWindow|" msgid "&Setup..." msgstr "" #: ../mainwindow.cpp:3610 msgctxt "MainWindow|" msgid "&Help" msgstr "" #: ../mainwindow.cpp:3612 msgctxt "MainWindow|" msgid "Check updates..." msgstr "" #: ../mainwindow.cpp:3617 msgctxt "MainWindow|" msgid "&About..." msgstr "" #: ../mainwindow.cpp:3622 msgctxt "MainWindow|" msgid "About Qt..." msgstr "" #: ../mainwindow.cpp:3665 ../mainwindow.cpp:3674 ../mainwindow.cpp:3688 #: ../mainwindow.cpp:3696 ../mainwindow.cpp:3770 ../mainwindow.cpp:3778 #: ../mainwindow.cpp:3796 ../mainwindow.cpp:3804 msgctxt "MainWindow|" msgid "KLog LoTW" msgstr "" #: ../mainwindow.cpp:3666 msgctxt "MainWindow|" msgid "All pending QSO of this log has been marked as queued for LoTW!" msgstr "" #: ../mainwindow.cpp:3666 ../mainwindow.cpp:3689 msgctxt "MainWindow|" msgid "" "Now you can go to the File menu to export the LoTW ADIF file and upload it " "to LoTW." msgstr "" #: ../mainwindow.cpp:3675 ../mainwindow.cpp:3697 msgctxt "MainWindow|" msgid "" "There was a problem to mark all pending QSO of this log as queued for LoTW!" msgstr "" #: ../mainwindow.cpp:3689 msgctxt "MainWindow|" msgid "All pending QSO has been marked as queued for LoTW!" msgstr "" #: ../mainwindow.cpp:3716 msgctxt "MainWindow|" msgid "" "The log that you have selected contains more than just one station callsign." msgstr "" #: ../mainwindow.cpp:3716 msgctxt "MainWindow|" msgid "Please select the station callsign you want to mark as sent to LoTW:" msgstr "" #: ../mainwindow.cpp:3719 msgctxt "MainWindow|" msgid "Station Callsign:" msgstr "" #: ../mainwindow.cpp:3728 msgctxt "MainWindow|" msgid "Define Station Callsign" msgstr "" #: ../mainwindow.cpp:3729 msgctxt "MainWindow|" msgid "" "You have selected no callsign. KLog will mark QSOs without a station " "callsign defined and those with the call you are entering here." msgstr "" #: ../mainwindow.cpp:3729 msgctxt "MainWindow|" msgid "" "Enter the station callsign to use for this log or leave it empty for QSO " "without station callsign defined:" msgstr "" #: ../mainwindow.cpp:3742 msgctxt "MainWindow|" msgid "" "No station callsign has been selected and therefore no log will be marked" msgstr "" #: ../mainwindow.cpp:3771 msgctxt "MainWindow|" msgid "All queued QSO of this log has been marked as sent for LoTW!" msgstr "" #: ../mainwindow.cpp:3779 msgctxt "MainWindow|" msgid "" "There was a problem to mark all queued QSO of this log as sent for LoTW!" msgstr "" #: ../mainwindow.cpp:3797 msgctxt "MainWindow|" msgid "All queued QSO has been marked as sent to LoTW!" msgstr "" #: ../mainwindow.cpp:3805 msgctxt "MainWindow|" msgid "There was a problem to mark all queued QSO of this log as sent to LoTW!" msgstr "" #: ../mainwindow.cpp:3814 msgctxt "MainWindow|" msgid "About..." msgstr "" #: ../mainwindow.cpp:3870 msgctxt "MainWindow|" msgid "KLog update checking result" msgstr "" #: ../mainwindow.cpp:3871 msgctxt "MainWindow|" msgid "Congratulations!" msgstr "" #: ../mainwindow.cpp:3871 msgctxt "MainWindow|" msgid "You already have the latest version." msgstr "" #: ../mainwindow.cpp:4021 ../mainwindow.cpp:4071 msgctxt "MainWindow|" msgid "Nothing has been saved. You have to select a valid file type." msgstr "" #: ../mainwindow.cpp:4049 msgctxt "MainWindow|" msgid "Save File" msgstr "" #: ../mainwindow.cpp:4051 msgctxt "MainWindow|" msgid "ADIF file" msgstr "" #: ../mainwindow.cpp:4051 msgctxt "MainWindow|" msgid "Cabrillo files" msgstr "" #: ../mainwindow.cpp:4051 msgctxt "MainWindow|" msgid "Any file" msgstr "" #: ../mainwindow.cpp:4128 msgctxt "MainWindow|" msgid "You can find the KLog data folder here: " msgstr "" #: ../mainwindow.cpp:4211 msgctxt "MainWindow|" msgid "DUPE" msgstr "" #: ../mainwindow.cpp:4328 msgctxt "MainWindow|" msgid "start" msgstr "" #: ../mainwindow.cpp:4329 ../mainwindow.cpp:4351 #, qt-format msgctxt "MainWindow|start or stop" msgid "" "UDP Server error\n" "The UDP server failed to %1." msgstr "" #: ../mainwindow.cpp:4350 msgctxt "MainWindow|" msgid "stop" msgstr "" #: ../mainwindow.cpp:4742 msgctxt "MainWindow|" msgid "It seems that there are no QSO in the database." msgstr "" #: ../mainwindow.cpp:4742 msgctxt "MainWindow|" msgid "" "If you are sure that the database contains QSOs and KLog is not able to find " "them, please contact the developers (see About KLog) for help." msgstr "" #: ../mainwindow.cpp:5076 ../mainwindow.cpp:7261 msgctxt "MainWindow|" msgid "TX Frequency in MHz." msgstr "" #: ../mainwindow.cpp:5077 ../mainwindow.cpp:7339 msgctxt "MainWindow|" msgid "RX Frequency in MHz." msgstr "" #: ../mainwindow.cpp:5079 msgctxt "MainWindow|" msgid "Power used by the DX." msgstr "" #: ../mainwindow.cpp:5080 msgctxt "MainWindow|" msgid "Logging operator's callsign." msgstr "" #: ../mainwindow.cpp:5081 msgctxt "MainWindow|" msgid "Callsign used over the air." msgstr "" #: ../mainwindow.cpp:5082 msgctxt "MainWindow|" msgid "My QTH locator." msgstr "" #: ../mainwindow.cpp:5083 msgctxt "MainWindow|" msgid "Name of the DX." msgstr "" #: ../mainwindow.cpp:5084 msgctxt "MainWindow|" msgid "QTH of the DX." msgstr "" #: ../mainwindow.cpp:5085 msgctxt "MainWindow|" msgid "Locator of the DX." msgstr "" #: ../mainwindow.cpp:5100 msgctxt "MainWindow|" msgid "Clears the QSO entry." msgstr "" #: ../mainwindow.cpp:5102 msgctxt "MainWindow|" msgid "Number of confirmed DXCC entities." msgstr "" #: ../mainwindow.cpp:5103 msgctxt "MainWindow|" msgid "Number of worked DXCC entities." msgstr "" #: ../mainwindow.cpp:5104 msgctxt "MainWindow|" msgid "Number of confirmed WAZ zones." msgstr "" #: ../mainwindow.cpp:5105 msgctxt "MainWindow|" msgid "Number of worked WAZ zones." msgstr "" #: ../mainwindow.cpp:5106 msgctxt "MainWindow|" msgid "Number of confirmed local references." msgstr "" #: ../mainwindow.cpp:5107 msgctxt "MainWindow|" msgid "Number of worked local references." msgstr "" #: ../mainwindow.cpp:5108 msgctxt "MainWindow|" msgid "Number of confirmed QSOs." msgstr "" #: ../mainwindow.cpp:5109 msgctxt "MainWindow|" msgid "Number of worked QSOs." msgstr "" #: ../mainwindow.cpp:5110 msgctxt "MainWindow|" msgid "Number of QSOs worked on the selected year." msgstr "" #: ../mainwindow.cpp:5111 msgctxt "MainWindow|" msgid "Number of DXCC worked on the selected year." msgstr "" #: ../mainwindow.cpp:5112 msgctxt "MainWindow|" msgid "Number of CQ Zones worked on the selected year." msgstr "" #: ../mainwindow.cpp:5113 msgctxt "MainWindow|" msgid "Score for the DXMarathon on the selected year." msgstr "" #: ../mainwindow.cpp:5114 msgctxt "MainWindow|" msgid "Select the year you want to check." msgstr "" #: ../mainwindow.cpp:5116 msgctxt "MainWindow|" msgid "Status of the DX entity." msgstr "" #: ../mainwindow.cpp:5117 msgctxt "MainWindow|" msgid "Name of the DX entity." msgstr "" #: ../mainwindow.cpp:5135 ../mainwindow.cpp:7464 msgctxt "MainWindow|" msgid "Name" msgstr "" #: ../mainwindow.cpp:5139 msgctxt "MainWindow|" msgid "QTH" msgstr "" #: ../mainwindow.cpp:5142 msgctxt "MainWindow|" msgid "Locator" msgstr "" #: ../mainwindow.cpp:5145 msgctxt "MainWindow|" msgid "Power(rx)" msgstr "" #: ../mainwindow.cpp:5149 msgctxt "MainWindow|" msgid "RST(tx)" msgstr "" #: ../mainwindow.cpp:5152 msgctxt "MainWindow|" msgid "RST(rx)" msgstr "" #: ../mainwindow.cpp:5185 msgctxt "MainWindow|" msgid "Freq TX" msgstr "" #: ../mainwindow.cpp:5187 msgctxt "MainWindow|" msgid "Freq RX" msgstr "" #: ../mainwindow.cpp:5255 msgctxt "MainWindow|" msgid "QSO" msgstr "" #: ../mainwindow.cpp:5265 msgctxt "MainWindow|" msgid "QSL" msgstr "" #: ../mainwindow.cpp:5266 msgctxt "MainWindow|" msgid "eQSL" msgstr "" #: ../mainwindow.cpp:5267 ../mainwindow.cpp:6670 msgctxt "MainWindow|" msgid "Comment" msgstr "" #: ../mainwindow.cpp:5270 msgctxt "MainWindow|" msgid "Others" msgstr "" #: ../mainwindow.cpp:5272 msgctxt "MainWindow|" msgid "My Data" msgstr "" #: ../mainwindow.cpp:5273 msgctxt "MainWindow|" msgid "Satellite" msgstr "" #: ../mainwindow.cpp:5323 ../mainwindow.cpp:5355 msgctxt "MainWindow|" msgid "QSOs" msgstr "" #: ../mainwindow.cpp:5324 ../mainwindow.cpp:5346 ../mainwindow.cpp:5409 msgctxt "MainWindow|" msgid "DXCC" msgstr "" #: ../mainwindow.cpp:5325 msgctxt "MainWindow|" msgid "CQ" msgstr "" #: ../mainwindow.cpp:5327 msgctxt "MainWindow|" msgid "Score" msgstr "" #: ../mainwindow.cpp:5333 msgctxt "MainWindow|" msgid "Info" msgstr "" #: ../mainwindow.cpp:5337 msgctxt "MainWindow|" msgid "Award" msgstr "" #: ../mainwindow.cpp:5340 msgctxt "MainWindow|" msgid "Confirmed" msgstr "" #: ../mainwindow.cpp:5343 msgctxt "MainWindow|" msgid "Worked" msgstr "" #: ../mainwindow.cpp:5349 msgctxt "MainWindow|" msgid "WAZ" msgstr "" #: ../mainwindow.cpp:5352 msgctxt "MainWindow|" msgid "Local" msgstr "" #: ../mainwindow.cpp:5404 msgctxt "MainWindow|" msgid "Awards" msgstr "" #: ../mainwindow.cpp:5405 msgctxt "MainWindow|" msgid "Search" msgstr "" #: ../mainwindow.cpp:5407 msgctxt "MainWindow|" msgid "Log" msgstr "" #: ../mainwindow.cpp:5408 msgctxt "MainWindow|" msgid "DX-Cluster" msgstr "" #: ../mainwindow.cpp:5504 ../mainwindow.cpp:5515 ../mainwindow.cpp:5589 #: ../mainwindow.cpp:5599 msgctxt "MainWindow|" msgid "Save ADIF File" msgstr "" #: ../mainwindow.cpp:5525 msgctxt "MainWindow|" msgid "LoTW logfile has been properly exported!" msgstr "" #: ../mainwindow.cpp:5525 msgctxt "MainWindow|" msgid "Remember to:" msgstr "" #: ../mainwindow.cpp:5525 msgctxt "MainWindow|" msgid "Before uploading: sign the LoTW log; and" msgstr "" #: ../mainwindow.cpp:5525 msgctxt "MainWindow|" msgid "After uploading: mark as sent all the queued QSO (LoTW Tools)." msgstr "" #: ../mainwindow.cpp:5546 msgctxt "MainWindow|" msgid "There was no QSO to be exported." msgstr "" #: ../mainwindow.cpp:5546 msgctxt "MainWindow|" msgid "" "If you think that some QSO should have been exported, please look for them " "and ensure that the eQSL LoTW QSL sent box is marked as:" msgstr "" #: ../mainwindow.cpp:5546 msgctxt "MainWindow|" msgid "Q - Queued" msgstr "" #: ../mainwindow.cpp:5567 msgctxt "MainWindow|" msgid "" "There was an error while exporting the LoTW. The log has not been exported!" msgstr "" #: ../mainwindow.cpp:5613 msgctxt "MainWindow|" msgid "Save Cabrillo File" msgstr "" #: ../mainwindow.cpp:5624 ../mainwindow.cpp:5648 msgctxt "MainWindow|" msgid "Open File" msgstr "" #: ../mainwindow.cpp:5765 msgctxt "MainWindow|" msgid "&Modify" msgstr "" #: ../mainwindow.cpp:6328 msgctxt "MainWindow|" msgid " - Needed for DXMarathon" msgstr "" #: ../mainwindow.cpp:6447 msgctxt "MainWindow|" msgid "Filling QSOs..." msgstr "" #: ../mainwindow.cpp:6447 msgctxt "MainWindow|" msgid "Abort filling" msgstr "" #: ../mainwindow.cpp:6580 msgctxt "MainWindow|" msgid "" "Filling DXCC in QSOs...\n" " QSO: " msgstr "" #: ../mainwindow.cpp:6654 msgctxt "MainWindow|" msgid "Number" msgstr "" #: ../mainwindow.cpp:6656 msgctxt "MainWindow|" msgid "Date" msgstr "" #: ../mainwindow.cpp:6658 msgctxt "MainWindow|" msgid "Time" msgstr "" #: ../mainwindow.cpp:6666 msgctxt "MainWindow|" msgid "Band" msgstr "" #: ../mainwindow.cpp:6668 ../mainwindow.cpp:7449 msgctxt "MainWindow|" msgid "Mode" msgstr "" #: ../mainwindow.cpp:6683 msgctxt "MainWindow|" msgid "Print Log" msgstr "" #: ../mainwindow.cpp:6688 msgctxt "MainWindow|" msgid "Printing the log..." msgstr "" #: ../mainwindow.cpp:6688 msgctxt "MainWindow|" msgid "Abort printing" msgstr "" #: ../mainwindow.cpp:6703 ../mainwindow.cpp:6718 msgctxt "MainWindow|" msgid "" "Printing the log...\n" " QSO: " msgstr "" #: ../mainwindow.cpp:7279 msgctxt "MainWindow|" msgid "" "TX Frequency in MHz.\n" "Frequency is not in a hamradio band!" msgstr "" #: ../mainwindow.cpp:7352 msgctxt "MainWindow|" msgid "" "RX Frequency in MHz.\n" "Frequency is not in a hamradio band!" msgstr "" #: ../mainwindow.cpp:7435 msgctxt "MainWindow|" msgid "KLog QSO received" msgstr "" #: ../mainwindow.cpp:7440 msgctxt "MainWindow|" msgid "The following QSO data has been received from WSJT-X to be logged:" msgstr "" #: ../mainwindow.cpp:7443 msgctxt "MainWindow|" msgid "Call" msgstr "" #: ../mainwindow.cpp:7446 msgctxt "MainWindow|" msgid "Freq" msgstr "" #: ../mainwindow.cpp:7452 msgctxt "MainWindow|" msgid "Time On" msgstr "" #: ../mainwindow.cpp:7455 msgctxt "MainWindow|" msgid "Time Off" msgstr "" #: ../mainwindow.cpp:7458 msgctxt "MainWindow|" msgid "RST TX" msgstr "" #: ../mainwindow.cpp:7458 msgctxt "MainWindow|" msgid "RST RX" msgstr "" #: ../mainwindow.cpp:7461 msgctxt "MainWindow|" msgid "DX-Grid" msgstr "" #: ../mainwindow.cpp:7467 msgctxt "MainWindow|" msgid "Comments" msgstr "" #: ../mainwindow.cpp:7470 msgctxt "MainWindow|" msgid "TX Pwr" msgstr "" #: ../mainwindow.cpp:7473 msgctxt "MainWindow|" msgid "Operator" msgstr "" #: ../mainwindow.cpp:7476 msgctxt "MainWindow|" msgid "Local-Grid" msgstr "" #: ../mainwindow.cpp:7526 msgctxt "MainWindow|" msgid "QSO logged from WSJT-X:" msgstr "" #: ../mainwindow.cpp:7559 msgctxt "MainWindow|" msgid "" "A new mode not supported by KLog has been received from an external software " "or radio:" msgstr "" #: ../mainwindow.cpp:7559 msgctxt "MainWindow|" msgid "" "If the received mode is correct, please contact KLog development team and " "request support for that mode" msgstr "" #: ../mainwindow.cpp:7559 msgctxt "MainWindow|" msgid "" "Do you want to keep receiving this alerts? (disabling this alerts will " "prevent that non-valid modes are detected)" msgstr "" #: ../mainwindow.cpp:7721 msgctxt "MainWindow|" msgid "" "A duplicated satellite has been detected in the file and will not be " "imported." msgstr "" #: ../mainwindow.cpp:7722 msgctxt "MainWindow|" msgid "" "Please check the satellite information file and ensure it is properly " "populated." msgstr "" #: ../mainwindow.cpp:7722 msgctxt "MainWindow|" msgid "" "Now you will see a more detailed error that can be used for debugging..." msgstr "" #: ../mainwindow.cpp:7729 msgctxt "MainWindow|" msgid "An unexpected error ocurred!!" msgstr "" #: ../mainwindow.cpp:7729 msgctxt "MainWindow|" msgid "If the problem persists, please contact the developers" msgstr "" #: ../mainwindow.cpp:7729 msgctxt "MainWindow|" msgid "for analysis:" msgstr "" #: ../mainwindow.cpp:7731 msgctxt "MainWindow|" msgid "Error in function" msgstr "" #: ../mainwindow.cpp:7732 msgctxt "MainWindow|" msgid "Error code" msgstr "" #: ../mainwindow.cpp:7733 msgctxt "MainWindow|" msgid "Error text" msgstr "" #: ../mainwindow.cpp:7734 msgctxt "MainWindow|" msgid "Failed query" msgstr "" #: ../mainwindow.cpp:7736 msgctxt "MainWindow|" msgid "Recomendation:" msgstr "" #: ../mainwindow.cpp:7736 msgctxt "MainWindow|" msgid "" "Export, periodically, your data to ADIF to prevent a potential data loss." msgstr "" #: ../mainwindow.cpp:7745 msgctxt "MainWindow|" msgid "Do you want to keep showing errors?" msgstr "" #: ../mainwindowinputcomment.cpp:46 msgctxt "MainWindowInputComment|" msgid "Add a comment for this QSO." msgstr "" #: ../mainwindowinputeqsl.cpp:44 msgctxt "MainWindowInputEQSL|" msgid "Date of the ClubLog upload." msgstr "" #: ../mainwindowinputeqsl.cpp:45 msgctxt "MainWindowInputEQSL|" msgid "Date of the eQSL sending." msgstr "" #: ../mainwindowinputeqsl.cpp:46 msgctxt "MainWindowInputEQSL|" msgid "Date of the eQSL reception." msgstr "" #: ../mainwindowinputeqsl.cpp:47 msgctxt "MainWindowInputEQSL|" msgid "Date of the LoTW sending." msgstr "" #: ../mainwindowinputeqsl.cpp:48 msgctxt "MainWindowInputEQSL|" msgid "Date of the LoTW reception." msgstr "" #: ../mainwindowinputeqsl.cpp:50 msgctxt "MainWindowInputEQSL|" msgid "Status on ClubLog." msgstr "" #: ../mainwindowinputeqsl.cpp:51 msgctxt "MainWindowInputEQSL|" msgid "Status of the eQSL sending." msgstr "" #: ../mainwindowinputeqsl.cpp:52 msgctxt "MainWindowInputEQSL|" msgid "Status of the eQSL reception." msgstr "" #: ../mainwindowinputeqsl.cpp:53 msgctxt "MainWindowInputEQSL|" msgid "Status of the LoTW sending." msgstr "" #: ../mainwindowinputeqsl.cpp:54 msgctxt "MainWindowInputEQSL|" msgid "Status of the LoTW reception." msgstr "" #: ../mainwindowinputeqsl.cpp:58 msgctxt "MainWindowInputEQSL|" msgid "ClubLog" msgstr "" #: ../mainwindowinputeqsl.cpp:61 msgctxt "MainWindowInputEQSL|" msgid "eQSL Sent" msgstr "" #: ../mainwindowinputeqsl.cpp:64 msgctxt "MainWindowInputEQSL|" msgid "eQSL Rec" msgstr "" #: ../mainwindowinputeqsl.cpp:67 msgctxt "MainWindowInputEQSL|" msgid "LoTW Sent" msgstr "" #: ../mainwindowinputeqsl.cpp:70 msgctxt "MainWindowInputEQSL|" msgid "LoTW Rec" msgstr "" #: ../mainwindowinputothers.cpp:66 msgctxt "MainWindowInputOthers|" msgid "Primary Div" msgstr "" #: ../mainwindowinputothers.cpp:67 msgctxt "MainWindowInputOthers|" msgid "Secondary Div" msgstr "" #: ../mainwindowinputothers.cpp:68 msgctxt "MainWindowInputOthers|" msgid "IOTA" msgstr "" #: ../mainwindowinputothers.cpp:69 msgctxt "MainWindowInputOthers|" msgid "Entity" msgstr "" #: ../mainwindowinputothers.cpp:70 msgctxt "MainWindowInputOthers|" msgid "Propagation mode" msgstr "" #: ../mainwindowinputothers.cpp:78 msgctxt "MainWindowInputOthers|" msgid "Select the primary division for this QSO." msgstr "" #: ../mainwindowinputothers.cpp:79 msgctxt "MainWindowInputOthers|" msgid "Select the secondary division for this QSO." msgstr "" #: ../mainwindowinputothers.cpp:80 msgctxt "MainWindowInputOthers|" msgid "Select the entity for this QSO." msgstr "" #: ../mainwindowinputothers.cpp:81 msgctxt "MainWindowInputOthers|" msgid "Select the propagation mode for this QSO." msgstr "" #: ../mainwindowinputothers.cpp:82 msgctxt "MainWindowInputOthers|" msgid "Select the IOTA continent for this QSO." msgstr "" #: ../mainwindowinputothers.cpp:83 msgctxt "MainWindowInputOthers|" msgid "Select the IOTA reference number for this QSO." msgstr "" #: ../mainwindowinputothers.cpp:108 ../mainwindowinputothers.cpp:150 msgctxt "MainWindowInputOthers|" msgid "Not Identified" msgstr "" #: ../mainwindowinputothers.cpp:114 msgctxt "MainWindowInputOthers|" msgid "Not - Not Identified" msgstr "" #: ../mainwindowinputqsl.cpp:66 msgctxt "MainWindowInputQSL|" msgid "QSL Sent" msgstr "" #: ../mainwindowinputqsl.cpp:69 msgctxt "MainWindowInputQSL|" msgid "QSL Rec" msgstr "" #: ../mainwindowinputqsl.cpp:72 msgctxt "MainWindowInputQSL|" msgid "QSL Via" msgstr "" #: ../mainwindowinputqsl.cpp:75 msgctxt "MainWindowInputQSL|" msgid "QSL Msg" msgstr "" #: ../mainwindowinputqsl.cpp:78 msgctxt "MainWindowInputQSL|" msgid "Status of the QSL sending." msgstr "" #: ../mainwindowinputqsl.cpp:79 msgctxt "MainWindowInputQSL|" msgid "Status of the QSL reception." msgstr "" #: ../mainwindowinputqsl.cpp:80 msgctxt "MainWindowInputQSL|" msgid "QSL sending information." msgstr "" #: ../mainwindowinputqsl.cpp:81 msgctxt "MainWindowInputQSL|" msgid "QSL reception information." msgstr "" #: ../mainwindowinputqsl.cpp:83 msgctxt "MainWindowInputQSL|" msgid "Date of the QSL sending." msgstr "" #: ../mainwindowinputqsl.cpp:84 msgctxt "MainWindowInputQSL|" msgid "Date of the QSL reception." msgstr "" #: ../mainwindowinputqsl.cpp:85 msgctxt "MainWindowInputQSL|" msgid "Message of the QSL." msgstr "" #: ../mainwindowinputqsl.cpp:86 msgctxt "MainWindowInputQSL|" msgid "QSL via information." msgstr "" #: ../mainwindowmydatatab.cpp:61 msgctxt "MainWindowMyDataTab|" msgid "Watt" msgstr "" #: ../mainwindowmydatatab.cpp:64 msgctxt "MainWindowMyDataTab|" msgid "Keep this data" msgstr "" #: ../mainwindowmydatatab.cpp:66 ../mainwindowmydatatab.cpp:68 msgctxt "MainWindowMyDataTab|" msgid "Data entered in this tab will be copied into the next QSO." msgstr "" #: ../mainwindowmydatatab.cpp:70 msgctxt "MainWindowMyDataTab|" msgid "Power used for the QSO in watts." msgstr "" #: ../mainwindowmydatatab.cpp:71 msgctxt "MainWindowMyDataTab|" msgid "Logging operator's callsign." msgstr "" #: ../mainwindowmydatatab.cpp:72 msgctxt "MainWindowMyDataTab|" msgid "Callsign used over the air." msgstr "" #: ../mainwindowmydatatab.cpp:73 msgctxt "MainWindowMyDataTab|" msgid "My QTH locator." msgstr "" #: ../mainwindowmydatatab.cpp:75 msgctxt "MainWindowMyDataTab|" msgid "Power" msgstr "" #: ../mainwindowmydatatab.cpp:78 msgctxt "MainWindowMyDataTab|" msgid "Operator" msgstr "" #: ../mainwindowmydatatab.cpp:80 msgctxt "MainWindowMyDataTab|" msgid "Station Callsign" msgstr "" #: ../mainwindowmydatatab.cpp:83 msgctxt "MainWindowMyDataTab|" msgid "My Locator" msgstr "" #: ../mainwindowsattab.cpp:80 msgctxt "MainWindowSatTab|" msgid "Keep this data" msgstr "" #: ../mainwindowsattab.cpp:82 ../mainwindowsattab.cpp:84 msgctxt "MainWindowSatTab|" msgid "Data entered in this tab will be copied into the next QSO." msgstr "" #: ../mainwindowsattab.cpp:85 ../mainwindowsattab.cpp:375 msgctxt "MainWindowSatTab|" msgid "Other - Sat not in the list" msgstr "" #: ../mainwindowsattab.cpp:88 #, qt-format msgctxt "MainWindowSatTab|" msgid "" "Name of the Satellite if not in the list. Select: \"%1\" to enable this box. " "(format like AO-51)." msgstr "" #: ../mainwindowsattab.cpp:91 msgctxt "MainWindowSatTab|" msgid "Satellite mode used." msgstr "" #: ../mainwindowsattab.cpp:92 msgctxt "MainWindowSatTab|" msgid "Select the satellite you are using." msgstr "" #: ../mainwindowsattab.cpp:93 msgctxt "MainWindowSatTab|" msgid "UpLink band." msgstr "" #: ../mainwindowsattab.cpp:94 msgctxt "MainWindowSatTab|" msgid "DownLink band." msgstr "" #: ../mainwindowsattab.cpp:95 msgctxt "MainWindowSatTab|" msgid "" "Locator of the DX station. This box is synchronized with the Locator box in " "the QSO tab." msgstr "" #: ../mainwindowsattab.cpp:98 msgctxt "MainWindowSatTab|" msgid "UpLink" msgstr "" #: ../mainwindowsattab.cpp:102 msgctxt "MainWindowSatTab|" msgid "DownLink" msgstr "" #: ../mainwindowsattab.cpp:106 msgctxt "MainWindowSatTab|" msgid "Satellite" msgstr "" #: ../mainwindowsattab.cpp:110 msgctxt "MainWindowSatTab|" msgid "Mode" msgstr "" #: ../mainwindowsattab.cpp:114 msgctxt "MainWindowSatTab|" msgid "DX Locator" msgstr "" #: ../mainwindowsattab.cpp:119 msgctxt "MainWindowSatTab|" msgid "Other" msgstr "" #: ../mainwindowsattab.cpp:125 ../mainwindowsattab.cpp:129 msgctxt "MainWindowSatTab|" msgid "MHz" msgstr "" #: ../mainwindowsattab.cpp:374 msgctxt "MainWindowSatTab|" msgid "Not Sat QSO" msgstr "" #: ../mainwindowsattab.cpp:411 msgctxt "MainWindowSatTab|" msgid "" "KLog has detected a satellite name that it does not recognise. If it should " "use one of the names of known satellites instead, please select it from the " "list. Alternatively, please contact the development team to add the new " "satellite name." msgstr "" #: ../mainwindowsattab.cpp:412 msgctxt "MainWindowSatTab|" msgid "The satellite you have in your QSO is: " msgstr "" #: ../mainwindowsattab.cpp:412 msgctxt "MainWindowSatTab|" msgid "" "Please know that the satellite name will not be saved if it is not in the " "list so that information may be lost!" msgstr "" #: ../awards.cpp:755 msgctxt "QObject|" msgid "New One, work it!" msgstr "" #: ../awards.cpp:759 ../awards.cpp:763 ../awards.cpp:769 ../awards.cpp:772 #: ../awards.cpp:775 ../awards.cpp:778 ../awards.cpp:784 ../awards.cpp:790 msgctxt "QObject|" msgid "Needed, work it!" msgstr "" #: ../awards.cpp:766 ../awards.cpp:781 ../awards.cpp:787 ../awards.cpp:793 msgctxt "QObject|" msgid "Worked but not confirmed" msgstr "" #: ../awards.cpp:796 msgctxt "QObject|" msgid "Confirmed" msgstr "" #: ../awards.cpp:800 msgctxt "QObject|" msgid "Not identified" msgstr "" #: ../database.cpp:271 ../database.cpp:323 msgctxt "QObject|" msgid "Database Error" msgstr "" #: ../database.cpp:1465 msgctxt "QObject|" msgid "KLog DB needs to be upgraded." msgstr "" #: ../database.cpp:1466 msgctxt "QObject|" msgid "Do you want to upgrade it now?" msgstr "" #: ../database.cpp:1466 msgctxt "QObject|" msgid "If DB is not upgraded KLog may not work properly." msgstr "" #: ../database.cpp:2072 msgctxt "QObject|" msgid "" "KLog has detected a previous log in the DB. All data will be migrated to a " "newly created DX type log for you." msgstr "" #: ../database.cpp:2090 msgctxt "QObject|" msgid "KLog: Enter Station callsign" msgstr "" #: ../database.cpp:2091 msgctxt "QObject|" msgid "Enter the station callsign used in this log" msgstr "" #: ../database.cpp:2092 msgctxt "QObject|" msgid "Station Callsign" msgstr "" #: ../database.cpp:2143 msgctxt "QObject|" msgid "" "All the data was migrated correctly. You should now go to " "Setup->Preferences->Logs to check that everything is OK." msgstr "" #: ../database.cpp:3572 ../database.cpp:3593 msgctxt "QObject|" msgid "Updating mode information..." msgstr "" #: ../database.cpp:3572 ../database.cpp:3757 ../database.cpp:3954 #: ../database.cpp:4155 ../database.cpp:7199 ../database.cpp:7422 #: ../dataproxy_sqlite.cpp:4801 msgctxt "QObject|" msgid "Abort updating" msgstr "" #: ../database.cpp:3593 ../database.cpp:3776 ../database.cpp:7291 #: ../database.cpp:7514 ../dataproxy_sqlite.cpp:4844 msgctxt "QObject|" msgid "QSO: " msgstr "" #: ../database.cpp:3668 ../database.cpp:3845 ../database.cpp:4046 #: ../database.cpp:4254 msgctxt "QObject|" msgid "" "Canceling this update will cause data inconsistencies and possibly data " "loss. Do you still want to cancel?" msgstr "" #: ../database.cpp:3757 ../database.cpp:3776 ../database.cpp:3976 #: ../database.cpp:4178 msgctxt "QObject|" msgid "Updating bands information..." msgstr "" #: ../database.cpp:3952 #, qt-format msgctxt "QObject|" msgid "Updating bands information in %1 status..." msgstr "" #: ../database.cpp:3976 ../database.cpp:4178 msgctxt "QObject|" msgid "Progress: " msgstr "" #: ../database.cpp:4153 #, qt-format msgctxt "QObject|" msgid "Updating mode information in %1 status..." msgstr "" #: ../database.cpp:7199 msgctxt "QObject|" msgid "Updating DXCC award information..." msgstr "" #: ../database.cpp:7291 msgctxt "QObject|" msgid "Updating DXCC Award information..." msgstr "" #: ../database.cpp:7422 msgctxt "QObject|" msgid "Updating WAZ award information..." msgstr "" #: ../database.cpp:7514 msgctxt "QObject|" msgid "Updating WAZ Award information..." msgstr "" #: ../dataproxy_sqlite.cpp:4801 ../dataproxy_sqlite.cpp:4844 msgctxt "QObject|" msgid "Updating DXCC and Continent information..." msgstr "" #: ../main.cpp:267 msgctxt "QObject|" msgid "Install wizard was canceled before completing..." msgstr "" #: ../main.cpp:268 msgctxt "QObject|" msgid "Do you want to remove the KLog dir from your disk?" msgstr "" #: ../main.cpp:281 msgctxt "QObject|" msgid "Your KLog dir has been removed" msgstr "" #: ../main.cpp:281 ../main.cpp:287 ../main.cpp:294 ../main.cpp:300 msgctxt "QObject|" msgid "Thank you for running KLog!" msgstr "" #: ../main.cpp:287 msgctxt "QObject|" msgid "" "I could not remove your KLog dir. You should do it manually if you want it " "removed from your hard disk." msgstr "" #: ../main.cpp:294 msgctxt "QObject|" msgid "" "Your KLog dir could not be removed. You should do it manually if you want it " "removed from your hard disk." msgstr "" #: ../main.cpp:300 msgctxt "QObject|" msgid "Remember that your KLog dir is on your system..." msgstr "" #: ../searchwidget.cpp:26 msgctxt "SearchWidget|" msgid "&Clear" msgstr "" #: ../searchwidget.cpp:27 msgctxt "SearchWidget|" msgid "&Export Highlighted" msgstr "" #: ../searchwidget.cpp:28 ../searchwidget.cpp:577 ../searchwidget.cpp:609 msgctxt "SearchWidget|" msgid "&Select All" msgstr "" #: ../searchwidget.cpp:29 msgctxt "SearchWidget|" msgid "&Search" msgstr "" #: ../searchwidget.cpp:30 msgctxt "SearchWidget|" msgid "All" msgstr "" #: ../searchwidget.cpp:69 msgctxt "SearchWidget|" msgid "Clear the searches." msgstr "" #: ../searchwidget.cpp:70 msgctxt "SearchWidget|" msgid "Export the search result to an ADIF file." msgstr "" #: ../searchwidget.cpp:71 msgctxt "SearchWidget|" msgid "Select/Unselect all the QSOs shown." msgstr "" #: ../searchwidget.cpp:72 msgctxt "SearchWidget|" msgid "Search in the log." msgstr "" #: ../searchwidget.cpp:73 msgctxt "SearchWidget|" msgid "Search in all logs." msgstr "" #: ../searchwidget.cpp:74 msgctxt "SearchWidget|" msgid "Enter the QRZ to search for." msgstr "" #: ../searchwidget.cpp:75 msgctxt "SearchWidget|" msgid "Search results." msgstr "" #: ../searchwidget.cpp:81 ../searchwidget.cpp:86 msgctxt "SearchWidget|" msgid "QRZ" msgstr "" #: ../searchwidget.cpp:81 ../searchwidget.cpp:86 msgctxt "SearchWidget|" msgid "Date/Time" msgstr "" #: ../searchwidget.cpp:81 ../searchwidget.cpp:86 msgctxt "SearchWidget|" msgid "Band" msgstr "" #: ../searchwidget.cpp:81 ../searchwidget.cpp:86 msgctxt "SearchWidget|" msgid "Mode" msgstr "" #: ../searchwidget.cpp:81 ../searchwidget.cpp:86 msgctxt "SearchWidget|" msgid "QSL Sent" msgstr "" #: ../searchwidget.cpp:81 ../searchwidget.cpp:86 ../searchwidget.cpp:787 msgctxt "SearchWidget|" msgid "QSL Rcvd" msgstr "" #: ../searchwidget.cpp:81 msgctxt "SearchWidget|" msgid "Station Callsign" msgstr "" #: ../searchwidget.cpp:81 ../searchwidget.cpp:86 msgctxt "SearchWidget|" msgid "ID" msgstr "" #: ../searchwidget.cpp:585 ../searchwidget.cpp:604 msgctxt "SearchWidget|" msgid "&Clear selection" msgstr "" #: ../searchwidget.cpp:679 msgctxt "SearchWidget|" msgid "Save File" msgstr "" #: ../searchwidget.cpp:762 msgctxt "SearchWidget|" msgid "QSL Send" msgstr "" #: ../searchwidget.cpp:821 msgctxt "SearchWidget|" msgid "&Delete" msgstr "" #: ../searchwidget.cpp:823 msgctxt "SearchWidget|" msgid "Delete a QSO" msgstr "" #: ../searchwidget.cpp:826 msgctxt "SearchWidget|" msgid "&Edit QSO" msgstr "" #: ../searchwidget.cpp:828 msgctxt "SearchWidget|" msgid "Edit this QSO" msgstr "" #: ../searchwidget.cpp:831 msgctxt "SearchWidget|" msgid "Via &bureau" msgstr "" #: ../searchwidget.cpp:833 msgctxt "SearchWidget|" msgid "Send this QSL via bureau" msgstr "" #: ../searchwidget.cpp:836 msgctxt "SearchWidget|" msgid "D&irect" msgstr "" #: ../searchwidget.cpp:838 msgctxt "SearchWidget|" msgid "Send this QSL via direct" msgstr "" #: ../searchwidget.cpp:841 msgctxt "SearchWidget|" msgid "&Request my QSL" msgstr "" #: ../searchwidget.cpp:843 msgctxt "SearchWidget|" msgid "Mark my QSL as requested" msgstr "" #: ../searchwidget.cpp:846 msgctxt "SearchWidget|" msgid "Via Direct && mark DX QSL as requested" msgstr "" #: ../searchwidget.cpp:847 msgctxt "SearchWidget|" msgid "Send this QSL via direct & mark DX QSL as requested" msgstr "" #: ../searchwidget.cpp:850 msgctxt "SearchWidget|" msgid "Via Bureau && mark DX QSL as requested" msgstr "" #: ../searchwidget.cpp:851 msgctxt "SearchWidget|" msgid "Send this QSL via bureau & mark DX QSL as requested" msgstr "" #: ../searchwidget.cpp:855 msgctxt "SearchWidget|" msgid "&Request the QSL" msgstr "" #: ../searchwidget.cpp:857 msgctxt "SearchWidget|" msgid "Mark the QSL as requested" msgstr "" #: ../searchwidget.cpp:861 msgctxt "SearchWidget|" msgid "Via bureau && mark my QSL as requested" msgstr "" #: ../searchwidget.cpp:862 msgctxt "SearchWidget|" msgid "QSL received via bureau & mark my QSL as requested" msgstr "" #: ../searchwidget.cpp:865 msgctxt "SearchWidget|" msgid "Via bureau" msgstr "" #: ../searchwidget.cpp:866 msgctxt "SearchWidget|" msgid "QSL received via bureau" msgstr "" #: ../searchwidget.cpp:870 msgctxt "SearchWidget|" msgid "Direc&t && mark as my QSL requested" msgstr "" #: ../searchwidget.cpp:871 msgctxt "SearchWidget|" msgid "QSL received via direct & mark my QSL as requested" msgstr "" #: ../searchwidget.cpp:874 msgctxt "SearchWidget|" msgid "Direc&t" msgstr "" #: ../searchwidget.cpp:875 msgctxt "SearchWidget|" msgid "QSL received via direct" msgstr "" #: ../searchwidget.cpp:1108 #, qt-format msgctxt "SearchWidget|" msgid "You have requested to delete the QSO with: %1" msgstr "" #: ../searchwidget.cpp:1113 msgctxt "SearchWidget|" msgid "Are you sure?" msgstr "" #: ../searchwidget.cpp:1176 msgctxt "SearchWidget|" msgid "Needed QSO to send the QSL" msgstr "" #: ../searchwidget.cpp:1184 msgctxt "SearchWidget|" msgid "My QSL requested to be sent" msgstr "" #: ../searchwidget.cpp:1189 ../searchwidget.cpp:1194 msgctxt "SearchWidget|" msgid "DX QSL pending to be received" msgstr "" #: ../setupdialog.cpp:90 msgctxt "SetupDialog|" msgid "My Data" msgstr "" #: ../setupdialog.cpp:91 ../setupdialog.cpp:172 ../setupdialog.cpp:327 msgctxt "SetupDialog|" msgid "Bands/Modes" msgstr "" #: ../setupdialog.cpp:92 ../setupdialog.cpp:333 msgctxt "SetupDialog|" msgid "DX-Cluster" msgstr "" #: ../setupdialog.cpp:93 ../setupdialog.cpp:174 ../setupdialog.cpp:339 msgctxt "SetupDialog|" msgid "Colors" msgstr "" #: ../setupdialog.cpp:94 ../setupdialog.cpp:175 ../setupdialog.cpp:345 msgctxt "SetupDialog|" msgid "Misc" msgstr "" #: ../setupdialog.cpp:95 ../setupdialog.cpp:176 msgctxt "SetupDialog|" msgid "World Editor" msgstr "" #: ../setupdialog.cpp:96 ../setupdialog.cpp:177 ../setupdialog.cpp:321 msgctxt "SetupDialog|" msgid "Logs" msgstr "" #: ../setupdialog.cpp:99 ../setupdialog.cpp:180 msgctxt "SetupDialog|" msgid "Satellites" msgstr "" #: ../setupdialog.cpp:100 ../setupdialog.cpp:181 msgctxt "SetupDialog|" msgid "HamLib" msgstr "" #: ../setupdialog.cpp:103 ../setupdialog.cpp:185 msgctxt "SetupDialog|" msgid "Cancel" msgstr "" #: ../setupdialog.cpp:104 ../setupdialog.cpp:186 msgctxt "SetupDialog|" msgid "OK" msgstr "" #: ../setupdialog.cpp:127 ../setupdialog.cpp:204 msgctxt "SetupDialog|" msgid "Config Dialog" msgstr "" #: ../setupdialog.cpp:171 ../setupdialog.cpp:315 msgctxt "SetupDialog|" msgid "User data" msgstr "" #: ../setupdialog.cpp:173 msgctxt "SetupDialog|" msgid "D&X-Cluster" msgstr "" #: ../setupdialog.cpp:178 msgctxt "SetupDialog|" msgid "ClubLog" msgstr "" #: ../setupdialog.cpp:179 msgctxt "SetupDialog|" msgid "WSJT-X" msgstr "" #: ../setupdialog.cpp:299 msgctxt "SetupDialog|" msgid "You need to enter at least one log in the Logs tab." msgstr "" #: ../setupdialog.cpp:351 msgctxt "SetupDialog|" msgid "World" msgstr "" #: ../setupdialog.cpp:380 msgctxt "SetupDialog|" msgid "DB has not been moved to new path" msgstr "" #: ../setupdialog.cpp:381 msgctxt "SetupDialog|" msgid "" "Go to the Misc tab and click on Move DB\n" " or the DB will not be moved to the new location." msgstr "" #: ../setupdialog.cpp:389 msgctxt "SetupDialog|" msgid "You need to enter at least a valid QRZ." msgstr "" #: ../setupdialog.cpp:390 msgctxt "SetupDialog|" msgid "Go to the User tab and enter valid QRZ." msgstr "" #: ../setupdialog.cpp:401 msgctxt "SetupDialog|" msgid "You have not selected the kind of log you want." msgstr "" #: ../setupdialog.cpp:402 msgctxt "SetupDialog|" msgid "" "You will be redirected to the Log tab.\n" "Please add and select the kind of log you want to use." msgstr "" #: ../setupentitydialog.cpp:69 msgctxt "SetupEntityDialog|" msgid "Entity" msgstr "" #: ../setupentitydialog.cpp:71 msgctxt "SetupEntityDialog|" msgid "Name of the Entity." msgstr "" #: ../setupentitydialog.cpp:73 msgctxt "SetupEntityDialog|" msgid "CQ" msgstr "" #: ../setupentitydialog.cpp:75 msgctxt "SetupEntityDialog|" msgid "CQ zone." msgstr "" #: ../setupentitydialog.cpp:77 msgctxt "SetupEntityDialog|" msgid "ITU" msgstr "" #: ../setupentitydialog.cpp:79 msgctxt "SetupEntityDialog|" msgid "ITU zone." msgstr "" #: ../setupentitydialog.cpp:85 msgctxt "SetupEntityDialog|" msgid "Latitude" msgstr "" #: ../setupentitydialog.cpp:87 ../setupentitydialog.cpp:91 msgctxt "SetupEntityDialog|" msgid "Longitude of the Entity." msgstr "" #: ../setupentitydialog.cpp:89 msgctxt "SetupEntityDialog|" msgid "Longitude" msgstr "" #: ../setupentitydialog.cpp:93 msgctxt "SetupEntityDialog|" msgid "UTC" msgstr "" #: ../setupentitydialog.cpp:95 msgctxt "SetupEntityDialog|" msgid "Local time difference to UTC." msgstr "" #: ../setupentitydialog.cpp:97 msgctxt "SetupEntityDialog|" msgid "Main prefix" msgstr "" #: ../setupentitydialog.cpp:99 msgctxt "SetupEntityDialog|" msgid "Main prefix of the entity." msgstr "" #: ../setupentitydialog.cpp:103 msgctxt "SetupEntityDialog|" msgid "ARRL ID" msgstr "" #: ../setupentitydialog.cpp:105 msgctxt "SetupEntityDialog|" msgid "ARRL ID." msgstr "" #: ../setupentitydialog.cpp:111 msgctxt "SetupEntityDialog|" msgid "Prefixes" msgstr "" #: ../setupentitydialog.cpp:113 msgctxt "SetupEntityDialog|" msgid "Comma separated possible prefixes, e.g. EA1, EA2, ..." msgstr "" #: ../setupentitydialog.cpp:116 msgctxt "SetupEntityDialog|" msgid "Date of the deletion." msgstr "" #: ../setupentitydialog.cpp:118 msgctxt "SetupEntityDialog|" msgid "Deleted" msgstr "" #: ../setupentitydialog.cpp:120 msgctxt "SetupEntityDialog|" msgid "Cancel" msgstr "" #: ../setupentitydialog.cpp:121 msgctxt "SetupEntityDialog|" msgid "OK" msgstr "" #: ../setupentitydialog.cpp:209 msgctxt "SetupEntityDialog|" msgid "Entity Dialog" msgstr "" #: ../setuppagebandmode.cpp:16 msgctxt "SetupPageBandMode|" msgid "Bands" msgstr "" #: ../setuppagebandmode.cpp:20 msgctxt "SetupPageBandMode|" msgid "Modes" msgstr "" #: ../setuppageclublog.cpp:45 msgctxt "SetupPageClubLog|" msgid "&Callsign" msgstr "" #: ../setuppageclublog.cpp:46 msgctxt "SetupPageClubLog|" msgid "ClubLog &password" msgstr "" #: ../setuppageclublog.cpp:47 msgctxt "SetupPageClubLog|" msgid "ClubLog &email" msgstr "" #: ../setuppageclublog.cpp:53 msgctxt "SetupPageClubLog|" msgid "Enter the email you used to register in ClubLog." msgstr "" #: ../setuppageclublog.cpp:54 msgctxt "SetupPageClubLog|" msgid "Enter the callsign you used to register in ClubLog." msgstr "" #: ../setuppageclublog.cpp:55 msgctxt "SetupPageClubLog|" msgid "Enter your password in ClubLog." msgstr "" #: ../setuppageclublog.cpp:60 msgctxt "SetupPageClubLog|" msgid "&Send QSOs in real time" msgstr "" #: ../setuppageclublog.cpp:61 msgctxt "SetupPageClubLog|" msgid "&Activate ClubLog" msgstr "" #: ../setuppageclublog.cpp:62 msgctxt "SetupPageClubLog|" msgid "Use QSO Station &Callsign" msgstr "" #: ../setuppageclublog.cpp:63 msgctxt "SetupPageClubLog|" msgid "" "Send each QSO to ClubLog in real time, as they are added (or modified) in " "KLog." msgstr "" #: ../setuppageclublog.cpp:64 msgctxt "SetupPageClubLog|" msgid "Starts the ClubLog support in KLog." msgstr "" #: ../setuppageclublog.cpp:65 msgctxt "SetupPageClubLog|" msgid "" "Use the Station Callsign defined in each QSO instead of the one defined here." msgstr "" #: ../setuppagecolors.cpp:42 msgctxt "SetupPageColors|" msgid "New One" msgstr "" #: ../setuppagecolors.cpp:43 msgctxt "SetupPageColors|" msgid "Needed in this band" msgstr "" #: ../setuppagecolors.cpp:44 msgctxt "SetupPageColors|" msgid "Worked in this band" msgstr "" #: ../setuppagecolors.cpp:45 msgctxt "SetupPageColors|" msgid "Confirmed in this band" msgstr "" #: ../setuppagecolors.cpp:46 msgctxt "SetupPageColors|" msgid "Default" msgstr "" #: ../setuppagecolors.cpp:131 msgctxt "SetupPageColors|" msgid "Choose a color" msgstr "" #: ../setuppagedxcluster.cpp:74 msgctxt "SetupPageDxCluster|" msgid "Add" msgstr "" #: ../setuppagedxcluster.cpp:75 msgctxt "SetupPageDxCluster|" msgid "Delete" msgstr "" #: ../setuppagedxcluster.cpp:77 msgctxt "SetupPageDxCluster|" msgid "Show &HF spots" msgstr "" #: ../setuppagedxcluster.cpp:78 msgctxt "SetupPageDxCluster|" msgid "Show V/&UHF spots" msgstr "" #: ../setuppagedxcluster.cpp:79 msgctxt "SetupPageDxCluster|" msgid "Show W&ARC spots" msgstr "" #: ../setuppagedxcluster.cpp:80 msgctxt "SetupPageDxCluster|" msgid "Show &worked spots" msgstr "" #: ../setuppagedxcluster.cpp:81 msgctxt "SetupPageDxCluster|" msgid "Show &confirmed spots" msgstr "" #: ../setuppagedxcluster.cpp:82 msgctxt "SetupPageDxCluster|" msgid "Show ANN/&FULL messages" msgstr "" #: ../setuppagedxcluster.cpp:83 msgctxt "SetupPageDxCluster|" msgid "Show WW&V messages" msgstr "" #: ../setuppagedxcluster.cpp:84 msgctxt "SetupPageDxCluster|" msgid "Show WC&Y messages" msgstr "" #: ../setuppagedxcluster.cpp:86 msgctxt "SetupPageDxCluster|" msgid "DX Spots" msgstr "" #: ../setuppagedxcluster.cpp:98 msgctxt "SetupPageDxCluster|" msgid "Messages" msgstr "" #: ../setuppagedxcluster.cpp:156 msgctxt "SetupPageDxCluster|" msgid "KLog: Add a DXCluster server" msgstr "" #: ../setuppagedxcluster.cpp:157 msgctxt "SetupPageDxCluster|" msgid "" "Add the address followed by the :port\n" "Example: dxfun.com:8000\n" "If no port is specified, 41112 will be used by default:" msgstr "" #: ../setuppagehamlib.cpp:50 msgctxt "SetupPageHamLib|" msgid "Activate HamLib" msgstr "" #: ../setuppagehamlib.cpp:51 msgctxt "SetupPageHamLib|" msgid "" "Activates the hamlib support that will enable the connection to a radio." msgstr "" #: ../setuppagehamlib.cpp:53 msgctxt "SetupPageHamLib|" msgid "RTS on" msgstr "" #: ../setuppagehamlib.cpp:54 msgctxt "SetupPageHamLib|" msgid "Setting RTS may be needed for some serial ports." msgstr "" #: ../setuppagehamlib.cpp:55 msgctxt "SetupPageHamLib|" msgid "DTR on" msgstr "" #: ../setuppagehamlib.cpp:56 msgctxt "SetupPageHamLib|" msgid "Setting DTR may be needed for some serial ports." msgstr "" #: ../setuppagehamlib.cpp:66 msgctxt "SetupPageHamLib|" msgid "Radio" msgstr "" #: ../setuppagehamlib.cpp:68 msgctxt "SetupPageHamLib|" msgid "Select your rig." msgstr "" #: ../setuppagehamlib.cpp:72 msgctxt "SetupPageHamLib|" msgid "Defines the interval to pool the radio in msecs." msgstr "" #: ../setuppagehamlib.cpp:78 msgctxt "SetupPageHamLib|" msgid "Pool interval" msgstr "" #: ../setuppagehamlib.cpp:90 msgctxt "SetupPageHamLib|" msgid "Port" msgstr "" #: ../setuppagehamlib.cpp:92 msgctxt "SetupPageHamLib|" msgid "" "Select the serial port. Only the serial ports that are detected are shown." msgstr "" #: ../setuppagehamlib.cpp:96 msgctxt "SetupPageHamLib|" msgid "Scan" msgstr "" #: ../setuppagehamlib.cpp:97 msgctxt "SetupPageHamLib|" msgid "Click to identify the serial ports available in your computer." msgstr "" #: ../setuppagehamlib.cpp:102 msgctxt "SetupPageHamLib|" msgid "Bauds" msgstr "" #: ../setuppagehamlib.cpp:104 msgctxt "SetupPageHamLib|" msgid "Select the serial port speed." msgstr "" #: ../setuppagehamlib.cpp:111 msgctxt "SetupPageHamLib|" msgid "5 bits" msgstr "" #: ../setuppagehamlib.cpp:111 msgctxt "SetupPageHamLib|" msgid "6 bits" msgstr "" #: ../setuppagehamlib.cpp:111 msgctxt "SetupPageHamLib|" msgid "7 bits" msgstr "" #: ../setuppagehamlib.cpp:111 msgctxt "SetupPageHamLib|" msgid "8 bits" msgstr "" #: ../setuppagehamlib.cpp:113 msgctxt "SetupPageHamLib|" msgid "Data bits" msgstr "" #: ../setuppagehamlib.cpp:115 msgctxt "SetupPageHamLib|" msgid "Select the serial data bits." msgstr "" #: ../setuppagehamlib.cpp:121 msgctxt "SetupPageHamLib|" msgid "None" msgstr "" #: ../setuppagehamlib.cpp:121 msgctxt "SetupPageHamLib|" msgid "Hardware" msgstr "" #: ../setuppagehamlib.cpp:121 msgctxt "SetupPageHamLib|" msgid "Software XON/XOFF" msgstr "" #: ../setuppagehamlib.cpp:123 msgctxt "SetupPageHamLib|" msgid "Flow control" msgstr "" #: ../setuppagehamlib.cpp:125 msgctxt "SetupPageHamLib|" msgid "Select the serial flow control" msgstr "" #: ../setuppagehamlib.cpp:131 msgctxt "SetupPageHamLib|" msgid "No parity" msgstr "" #: ../setuppagehamlib.cpp:131 msgctxt "SetupPageHamLib|" msgid "Even" msgstr "" #: ../setuppagehamlib.cpp:131 msgctxt "SetupPageHamLib|" msgid "Odd" msgstr "" #: ../setuppagehamlib.cpp:131 msgctxt "SetupPageHamLib|" msgid "Space" msgstr "" #: ../setuppagehamlib.cpp:131 msgctxt "SetupPageHamLib|" msgid "Mark" msgstr "" #: ../setuppagehamlib.cpp:133 msgctxt "SetupPageHamLib|" msgid "Parity" msgstr "" #: ../setuppagehamlib.cpp:135 msgctxt "SetupPageHamLib|" msgid "Select the serial parity." msgstr "" #: ../setuppagehamlib.cpp:142 msgctxt "SetupPageHamLib|" msgid "1 bit" msgstr "" #: ../setuppagehamlib.cpp:142 msgctxt "SetupPageHamLib|" msgid "1.5 bits" msgstr "" #: ../setuppagehamlib.cpp:142 msgctxt "SetupPageHamLib|" msgid "2 bits" msgstr "" #: ../setuppagehamlib.cpp:144 msgctxt "SetupPageHamLib|" msgid "Stop bits" msgstr "" #: ../setuppagehamlib.cpp:146 msgctxt "SetupPageHamLib|" msgid "Select the serial stop bits." msgstr "" #: ../setuppagelogs.cpp:70 msgctxt "SetupPageLogs|" msgid "&New" msgstr "" #: ../setuppagelogs.cpp:71 msgctxt "SetupPageLogs|" msgid "&Edit" msgstr "" #: ../setuppagelogs.cpp:72 msgctxt "SetupPageLogs|" msgid "&Remove" msgstr "" #: ../setuppagelogs.cpp:75 msgctxt "SetupPageLogs|" msgid "Add a new log." msgstr "" #: ../setuppagelogs.cpp:79 msgctxt "SetupPageLogs|" msgid "Edit the selected log." msgstr "" #: ../setuppagelogs.cpp:80 msgctxt "SetupPageLogs|" msgid "Remove the selected log." msgstr "" #: ../setuppagelogs.cpp:82 msgctxt "SetupPageLogs|" msgid "Select the log you want to open." msgstr "" #: ../setuppagelogs.cpp:219 msgctxt "SetupPageLogs|" msgid "KLog" msgstr "" #: ../setuppagelogs.cpp:220 msgctxt "SetupPageLogs|" msgid "Do you really want to remove this log?" msgstr "" #: ../setuppagelogs.cpp:221 msgctxt "SetupPageLogs|" msgid "All the QSOs from this log will be also deleted..." msgstr "" #: ../setuppagelogs.cpp:253 msgctxt "SetupPageLogs|" msgid "Log has not been removed. (#3)" msgstr "" #: ../setuppagelogs.cpp:260 msgctxt "SetupPageLogs|" msgid "Log has not been removed. (#2)" msgstr "" #: ../setuppagelogs.cpp:267 msgctxt "SetupPageLogs|" msgid "Log has not been removed. (#1)" msgstr "" #: ../setuppagelogs.cpp:327 msgctxt "SetupPageLogs|" msgid "ID" msgstr "" #: ../setuppagelogs.cpp:330 msgctxt "SetupPageLogs|" msgid "Date" msgstr "" #: ../setuppagelogs.cpp:333 msgctxt "SetupPageLogs|" msgid "Station Callsign" msgstr "" #: ../setuppagelogs.cpp:336 msgctxt "SetupPageLogs|" msgid "Operators" msgstr "" #: ../setuppagelogs.cpp:339 msgctxt "SetupPageLogs|" msgid "Comments" msgstr "" #: ../setuppagelogs.cpp:342 msgctxt "SetupPageLogs|" msgid "Type" msgstr "" #: ../setuppagelogs.cpp:649 msgctxt "SetupPageLogs|" msgid "An error has occurred showing the following error code:" msgstr "" #: ../setuppagelogs.cpp:652 msgctxt "SetupPageLogs|" msgid "KLog - SetupPageLogs" msgstr "" #: ../setuppagelogsnew.cpp:92 msgctxt "SetupPageLogsNew|" msgid "&Date" msgstr "" #: ../setuppagelogsnew.cpp:93 msgctxt "SetupPageLogsNew|" msgid "&Station Callsign" msgstr "" #: ../setuppagelogsnew.cpp:94 msgctxt "SetupPageLogsNew|" msgid "&Operators" msgstr "" #: ../setuppagelogsnew.cpp:95 msgctxt "SetupPageLogsNew|" msgid "Comm&ent" msgstr "" #: ../setuppagelogsnew.cpp:97 msgctxt "SetupPageLogsNew|" msgid "&Ok" msgstr "" #: ../setuppagelogsnew.cpp:98 msgctxt "SetupPageLogsNew|" msgid "&Cancel" msgstr "" #: ../setuppagelogsnew.cpp:155 msgctxt "SetupPageLogsNew|" msgid "Select categories" msgstr "" #: ../setuppagelogsnew.cpp:159 msgctxt "SetupPageLogsNew|" msgid "Callsign used for this log." msgstr "" #: ../setuppagelogsnew.cpp:160 msgctxt "SetupPageLogsNew|" msgid "Comma separated list of operators: callsign1, callsign2." msgstr "" #: ../setuppagelogsnew.cpp:162 msgctxt "SetupPageLogsNew|" msgid "Start date of this log." msgstr "" #: ../setuppagelogsnew.cpp:163 msgctxt "SetupPageLogsNew|" msgid "Add a comment about this log." msgstr "" #: ../setuppagelogsnew.cpp:165 msgctxt "SetupPageLogsNew|" msgid "&Type of Operation" msgstr "" #: ../setuppagelogsnew.cpp:172 msgctxt "SetupPageLogsNew|" msgid "Select the kind of operation for this log." msgstr "" #: ../setuppagelogsnew.cpp:179 msgctxt "SetupPageLogsNew|" msgid "&Mode Category" msgstr "" #: ../setuppagelogsnew.cpp:181 msgctxt "SetupPageLogsNew|" msgid "Select the mode category." msgstr "" #: ../setuppagelogsnew.cpp:187 msgctxt "SetupPageLogsNew|" msgid "O&perators Category" msgstr "" #: ../setuppagelogsnew.cpp:189 msgctxt "SetupPageLogsNew|" msgid "Select the operators category." msgstr "" #: ../setuppagelogsnew.cpp:194 msgctxt "SetupPageLogsNew|" msgid "&Assisted Category" msgstr "" #: ../setuppagelogsnew.cpp:196 msgctxt "SetupPageLogsNew|" msgid "Select the assisted category." msgstr "" #: ../setuppagelogsnew.cpp:202 msgctxt "SetupPageLogsNew|" msgid "Po&wer Category" msgstr "" #: ../setuppagelogsnew.cpp:204 msgctxt "SetupPageLogsNew|" msgid "Select the power category." msgstr "" #: ../setuppagelogsnew.cpp:210 msgctxt "SetupPageLogsNew|" msgid "&Bands Category" msgstr "" #: ../setuppagelogsnew.cpp:212 msgctxt "SetupPageLogsNew|" msgid "Select the bands category." msgstr "" #: ../setuppagelogsnew.cpp:217 msgctxt "SetupPageLogsNew|" msgid "O&verlay" msgstr "" #: ../setuppagelogsnew.cpp:219 msgctxt "SetupPageLogsNew|" msgid "Select the Overlay category." msgstr "" #: ../setuppagelogsnew.cpp:380 ../setuppagelogsnew.cpp:933 msgctxt "SetupPageLogsNew|" msgid "Categories not OK" msgstr "" #: ../setuppagelogsnew.cpp:577 msgctxt "SetupPageLogsNew|" msgid "" "You need to enter a valid QRZ in the Station Callsign box.\n" "The log will not be opened." msgstr "" #: ../setuppagelogsnew.cpp:688 msgctxt "SetupPageLogsNew|" msgid "" "You selected an invalid combination.\n" "The log will not be opened." msgstr "" #: ../setuppagelogsnew.cpp:925 msgctxt "SetupPageLogsNew|" msgid "Categories OK" msgstr "" #: ../setuppagemisc.cpp:38 msgctxt "SetupPageMisc|" msgid "&Imperial system" msgstr "" #: ../setuppagemisc.cpp:39 msgctxt "SetupPageMisc|" msgid "&Log in real time" msgstr "" #: ../setuppagemisc.cpp:40 msgctxt "SetupPageMisc|" msgid "&Time in UTC" msgstr "" #: ../setuppagemisc.cpp:41 msgctxt "SetupPageMisc|" msgid "&Save ADIF on exit" msgstr "" #: ../setuppagemisc.cpp:42 msgctxt "SetupPageMisc|" msgid "Use this &default filename" msgstr "" #: ../setuppagemisc.cpp:43 msgctxt "SetupPageMisc|" msgid "Mark &QSO to send QSL when QSL is received" msgstr "" #: ../setuppagemisc.cpp:44 msgctxt "SetupPageMisc|" msgid "Complete QSO with previous data" msgstr "" #: ../setuppagemisc.cpp:45 msgctxt "SetupPageMisc|" msgid "Show the Station &Callsign used in the search box" msgstr "" #: ../setuppagemisc.cpp:46 msgctxt "SetupPageMisc|" msgid "&Reset to My Data for all QSOs" msgstr "" #: ../setuppagemisc.cpp:47 msgctxt "SetupPageMisc|" msgid "&Check for new versions automatically" msgstr "" #: ../setuppagemisc.cpp:48 msgctxt "SetupPageMisc|" msgid "&Provide Info for statistics" msgstr "" #: ../setuppagemisc.cpp:49 msgctxt "SetupPageMisc|" msgid "Manage DX-Marathon" msgstr "" #: ../setuppagemisc.cpp:54 ../setuppagemisc.cpp:55 msgctxt "SetupPageMisc|" msgid "Browse" msgstr "" #: ../setuppagemisc.cpp:56 msgctxt "SetupPageMisc|" msgid "Move DB" msgstr "" #: ../setuppagemisc.cpp:116 msgctxt "SetupPageMisc|" msgid "" "QSOs will be marked as pending to send a QSL if you receive the DX QSL and " "have not sent yours." msgstr "" #: ../setuppagemisc.cpp:117 msgctxt "SetupPageMisc|" msgid "The search box will show also the callsign on the air to do the QSO." msgstr "" #: ../setuppagemisc.cpp:118 msgctxt "SetupPageMisc|" msgid "" "All the data from the My Data tab will be used or data from the previous QSO " "will be maintained." msgstr "" #: ../setuppagemisc.cpp:119 msgctxt "SetupPageMisc|" msgid "" "Check if there is a new release of KLog available every time you start KLog." msgstr "" #: ../setuppagemisc.cpp:120 msgctxt "SetupPageMisc|" msgid "" "If new version checking is selected, KLog will send the developer your " "callsign, KLog version & Operating system to help in improving KLog." msgstr "" #: ../setuppagemisc.cpp:121 msgctxt "SetupPageMisc|" msgid "Check it for Imperial system (Miles instead of Kilometers)." msgstr "" #: ../setuppagemisc.cpp:122 msgctxt "SetupPageMisc|" msgid "Select to use real time." msgstr "" #: ../setuppagemisc.cpp:123 msgctxt "SetupPageMisc|" msgid "Select to use UTC time." msgstr "" #: ../setuppagemisc.cpp:124 msgctxt "SetupPageMisc|" msgid "Select if you want to save to ADIF on exit." msgstr "" #: ../setuppagemisc.cpp:125 msgctxt "SetupPageMisc|" msgid "" "Select to use the following name for the logfile without being asked for it " "again." msgstr "" #: ../setuppagemisc.cpp:126 msgctxt "SetupPageMisc|" msgid "Complete the current QSO with previous QSO data." msgstr "" #: ../setuppagemisc.cpp:127 msgctxt "SetupPageMisc|" msgid "Select if you want to manage DX-Marathon." msgstr "" #: ../setuppagemisc.cpp:128 msgctxt "SetupPageMisc|" msgid "This is the default file where ADIF data will be saved." msgstr "" #: ../setuppagemisc.cpp:129 msgctxt "SetupPageMisc|" msgid "This is the directory where the database (logbook.dat) will be saved." msgstr "" #: ../setuppagemisc.cpp:130 msgctxt "SetupPageMisc|" msgid "Click to change the default ADIF file." msgstr "" #: ../setuppagemisc.cpp:131 msgctxt "SetupPageMisc|" msgid "Click to change the path of the database." msgstr "" #: ../setuppagemisc.cpp:132 msgctxt "SetupPageMisc|" msgid "Click to move the DB to the new directory." msgstr "" #: ../setuppagemisc.cpp:274 msgctxt "SetupPageMisc|" msgid "Open File" msgstr "" #: ../setuppagemisc.cpp:602 msgctxt "SetupPageMisc|" msgid "Select Directory" msgstr "" #: ../setuppagemisc.cpp:633 msgctxt "SetupPageMisc|" msgid "This is the directory where DB (logbook.dat) will be saved." msgstr "" #: ../setuppagemisc.cpp:639 msgctxt "SetupPageMisc|" msgid "" "Please specify an existing directory where the database (logbook.dat) will " "be saved." msgstr "" #: ../setuppagemisc.cpp:674 msgctxt "SetupPageMisc|" msgid "File moved" msgstr "" #: ../setuppagemisc.cpp:684 msgctxt "SetupPageMisc|" msgid "File copied" msgstr "" #: ../setuppagemisc.cpp:694 msgctxt "SetupPageMisc|" msgid "File NOT copied" msgstr "" #: ../setuppagemisc.cpp:707 msgctxt "SetupPageMisc|" msgid "" "The target directory does not exist. Please select an existing directory." msgstr "" #: ../setuppagesats.cpp:64 msgctxt "SetupPageSats|" msgid "&New" msgstr "" #: ../setuppagesats.cpp:65 msgctxt "SetupPageSats|" msgid "&Edit" msgstr "" #: ../setuppagesats.cpp:66 msgctxt "SetupPageSats|" msgid "&Remove" msgstr "" #: ../setuppagesats.cpp:67 msgctxt "SetupPageSats|" msgid "&Import" msgstr "" #: ../setuppagesats.cpp:68 msgctxt "SetupPageSats|" msgid "E&xport" msgstr "" #: ../setuppagesats.cpp:70 msgctxt "SetupPageSats|" msgid "Add a new satellite." msgstr "" #: ../setuppagesats.cpp:71 msgctxt "SetupPageSats|" msgid "Edit the selected satellite." msgstr "" #: ../setuppagesats.cpp:72 msgctxt "SetupPageSats|" msgid "Remove the selected satellite." msgstr "" #: ../setuppagesats.cpp:73 msgctxt "SetupPageSats|" msgid "" "Import a satellites file. It will replace the satellites you have now " "configured." msgstr "" #: ../setuppagesats.cpp:74 msgctxt "SetupPageSats|" msgid "Export your current satellites to a file." msgstr "" #: ../setuppagesats.cpp:76 msgctxt "SetupPageSats|" msgid "Select the sat you want to open." msgstr "" #: ../setuppagesats.cpp:210 msgctxt "SetupPageSats|" msgid "KLog" msgstr "" #: ../setuppagesats.cpp:211 msgctxt "SetupPageSats|" msgid "Do you really want to remove this satellite?" msgstr "" #: ../setuppagesats.cpp:212 msgctxt "SetupPageSats|" msgid "This satellite will not be longer available to be selected ..." msgstr "" #: ../setuppagesats.cpp:244 msgctxt "SetupPageSats|" msgid "Sat has not been removed. (#3)" msgstr "" #: ../setuppagesats.cpp:251 msgctxt "SetupPageSats|" msgid "Sat has not been removed. (#2)" msgstr "" #: ../setuppagesats.cpp:258 msgctxt "SetupPageSats|" msgid "Sat has not been removed. (#1)" msgstr "" #: ../setuppagesats.cpp:318 msgctxt "SetupPageSats|" msgid "ID" msgstr "" #: ../setuppagesats.cpp:321 msgctxt "SetupPageSats|" msgid "Short" msgstr "" #: ../setuppagesats.cpp:324 msgctxt "SetupPageSats|" msgid "Name" msgstr "" #: ../setuppagesats.cpp:327 msgctxt "SetupPageSats|" msgid "Uplink" msgstr "" #: ../setuppagesats.cpp:330 msgctxt "SetupPageSats|" msgid "Downlink" msgstr "" #: ../setuppagesats.cpp:333 msgctxt "SetupPageSats|" msgid "Modes" msgstr "" #: ../setuppagesats.cpp:571 msgctxt "SetupPageSats|" msgid "An error has occurred showing the following error code:" msgstr "" #: ../setuppagesats.cpp:574 msgctxt "SetupPageSats|" msgid "KLog - SetupPageSats" msgstr "" #: ../setuppagesats.cpp:584 msgctxt "SetupPageSats|" msgid "Open Satellites File" msgstr "" #: ../setuppagesats.cpp:603 msgctxt "SetupPageSats|" msgid "KLog warning" msgstr "" #: ../setuppagesats.cpp:605 msgctxt "SetupPageSats|" msgid "" "An unexpected error ocurred while importing the satellite data.\n" "\n" "It may be caused because the file you are trying to import does not have the " "right format." msgstr "" #: ../setuppagesats.cpp:608 msgctxt "SetupPageSats|" msgid "" "Please check the format or contact the developer for analysis with the error " "code: " msgstr "" #: ../setuppagesats.cpp:675 msgctxt "SetupPageSats|" msgid "Save Satellites File" msgstr "" #: ../setuppagesatsnew.cpp:46 msgctxt "SetupPageSatsNew|" msgid "Short name" msgstr "" #: ../setuppagesatsnew.cpp:47 msgctxt "SetupPageSatsNew|" msgid "Sat name" msgstr "" #: ../setuppagesatsnew.cpp:48 msgctxt "SetupPageSatsNew|" msgid "UpLink" msgstr "" #: ../setuppagesatsnew.cpp:49 msgctxt "SetupPageSatsNew|" msgid "DownLink" msgstr "" #: ../setuppagesatsnew.cpp:50 msgctxt "SetupPageSatsNew|" msgid "Modes" msgstr "" #: ../setuppagesatsnew.cpp:56 msgctxt "SetupPageSatsNew|" msgid "&Ok" msgstr "" #: ../setuppagesatsnew.cpp:57 msgctxt "SetupPageSatsNew|" msgid "&Cancel" msgstr "" #: ../setuppagesatsnew.cpp:103 msgctxt "SetupPageSatsNew|" msgid "" "Enter the short name. Try to use the LoTW short name so you can upload your " "QSO to LoTW afterwards." msgstr "" #: ../setuppagesatsnew.cpp:104 msgctxt "SetupPageSatsNew|" msgid "Enter the name of the satellite." msgstr "" #: ../setuppagesatsnew.cpp:105 msgctxt "SetupPageSatsNew|" msgid "Enter the uplink frequencies in this format: 144.300" msgstr "" #: ../setuppagesatsnew.cpp:106 msgctxt "SetupPageSatsNew|" msgid "Enter the downlink frequencies in this format: 144.300" msgstr "" #: ../setuppagesatsnew.cpp:107 msgctxt "SetupPageSatsNew|" msgid "Enter the modes in this format: USB" msgstr "" #: ../setuppagesatsnew.cpp:385 msgctxt "SetupPageSatsNew|" msgid "" "Some of the data you have entered is not correct, the satellite can't be " "added." msgstr "" #: ../setuppageudp.cpp:10 msgctxt "SetupPageUDP|" msgid "Start UDP Server" msgstr "" #: ../setuppageudp.cpp:33 msgctxt "SetupPageUDP|" msgid "Log automatically QSOs from WSJT-X" msgstr "" #: ../setuppageudp.cpp:34 msgctxt "SetupPageUDP|" msgid "Allow WSJT-X to send logged QSO to KLog" msgstr "" #: ../setuppageudp.cpp:35 #, qt-format msgctxt "SetupPageUDP|" msgid "" "QSO logged in WSJT-X will be sent to KLog and KLog will ask before logging " "into KLog unless \"%1\" is selected" msgstr "" #: ../setuppageudp.cpp:38 msgctxt "SetupPageUDP|" msgid "" "KLog will log automatically any QSO coming from WSJT-X without any manual " "confirmation." msgstr "" #: ../setuppageudp.cpp:41 msgctxt "SetupPageUDP|" msgid "Receive and Update QSO data to KLog" msgstr "" #: ../setuppageudp.cpp:42 msgctxt "SetupPageUDP|" msgid "" "KLog will automatically show and update data coming from WSJT-X (DX " "callsign, locator, RPT, ...)" msgstr "" #: ../setuppageudp.cpp:58 msgctxt "SetupPageUDP|" msgid "UDP port number where the UDP Server will listen for packets." msgstr "" #: ../setuppageudp.cpp:58 msgctxt "SetupPageUDP|" msgid "" "Make sure it is the same port where the other programs are sending the data " "to. Default port is 2237." msgstr "" #: ../setuppageudp.cpp:59 msgctxt "SetupPageUDP|" msgid "" "UDP Server will receive QSOs sent from other programs like WSJT-X allowing " "you to log in KLog automatically from those programs." msgstr "" #: ../setuppageudp.cpp:65 msgctxt "SetupPageUDP|" msgid "UDP Port" msgstr "" #: ../setuppageudp.cpp:78 msgctxt "SetupPageUDP|" msgid "QSO notification timeout (milisecs)" msgstr "" #: ../setuppageudp.cpp:79 msgctxt "SetupPageUDP|" msgid "" "Milliseconds that the notification of QSO received from WSJTX will be shown." msgstr "" #: ../setuppageuserdata.cpp:40 msgctxt "SetupPageUserDataPage|" msgid "&Personal data" msgstr "" #: ../setuppageuserdata.cpp:41 msgctxt "SetupPageUserDataPage|" msgid "Station &data" msgstr "" #: ../setuppageuserdata.cpp:70 msgctxt "SetupPageUserDataPage|" msgid "Enter your name." msgstr "" #: ../setuppageuserdata.cpp:71 msgctxt "SetupPageUserDataPage|" msgid "Enter your address - 1st line." msgstr "" #: ../setuppageuserdata.cpp:72 msgctxt "SetupPageUserDataPage|" msgid "Enter your address - 2nd line." msgstr "" #: ../setuppageuserdata.cpp:73 msgctxt "SetupPageUserDataPage|" msgid "Enter your address - 3rd line." msgstr "" #: ../setuppageuserdata.cpp:74 msgctxt "SetupPageUserDataPage|" msgid "Enter your address - 4th line." msgstr "" #: ../setuppageuserdata.cpp:75 msgctxt "SetupPageUserDataPage|" msgid "Enter your city." msgstr "" #: ../setuppageuserdata.cpp:76 msgctxt "SetupPageUserDataPage|" msgid "Enter your zip code." msgstr "" #: ../setuppageuserdata.cpp:77 msgctxt "SetupPageUserDataPage|" msgid "Enter your province or state." msgstr "" #: ../setuppageuserdata.cpp:78 msgctxt "SetupPageUserDataPage|" msgid "Enter your country." msgstr "" #: ../setuppageuserdata.cpp:80 msgctxt "SetupPageUserDataPage|" msgid "&Name" msgstr "" #: ../setuppageuserdata.cpp:81 msgctxt "SetupPageUserDataPage|" msgid "&Address" msgstr "" #: ../setuppageuserdata.cpp:82 msgctxt "SetupPageUserDataPage|" msgid "Cit&y" msgstr "" #: ../setuppageuserdata.cpp:83 msgctxt "SetupPageUserDataPage|" msgid "&Zip Code" msgstr "" #: ../setuppageuserdata.cpp:84 msgctxt "SetupPageUserDataPage|" msgid "Pro&v/State" msgstr "" #: ../setuppageuserdata.cpp:85 msgctxt "SetupPageUserDataPage|" msgid "Countr&y" msgstr "" #: ../setuppageuserdata.cpp:139 ../setuppageuserdata.cpp:140 #: ../setuppageuserdata.cpp:141 msgctxt "SetupPageUserDataPage|" msgid "Enter your information for rig" msgstr "" #: ../setuppageuserdata.cpp:142 ../setuppageuserdata.cpp:143 #: ../setuppageuserdata.cpp:144 msgctxt "SetupPageUserDataPage|" msgid "Enter your information for antenna" msgstr "" #: ../setuppageuserdata.cpp:145 msgctxt "SetupPageUserDataPage|" msgid "Enter your power information." msgstr "" #: ../setuppageuserdata.cpp:147 msgctxt "SetupPageUserDataPage|" msgid "&Rig 1" msgstr "" #: ../setuppageuserdata.cpp:148 msgctxt "SetupPageUserDataPage|" msgid "R&ig 2" msgstr "" #: ../setuppageuserdata.cpp:149 msgctxt "SetupPageUserDataPage|" msgid "Ri&g 3" msgstr "" #: ../setuppageuserdata.cpp:150 msgctxt "SetupPageUserDataPage|" msgid "Antenna &1" msgstr "" #: ../setuppageuserdata.cpp:151 msgctxt "SetupPageUserDataPage|" msgid "Antenna &2" msgstr "" #: ../setuppageuserdata.cpp:152 msgctxt "SetupPageUserDataPage|" msgid "Antenna &3" msgstr "" #: ../setuppageuserdata.cpp:153 msgctxt "SetupPageUserDataPage|" msgid "Po&wer" msgstr "" #: ../setuppageuserdata.cpp:186 msgctxt "SetupPageUserDataPage|" msgid "Enter the station callsign that will be used for logging." msgstr "" #: ../setuppageuserdata.cpp:187 msgctxt "SetupPageUserDataPage|" msgid "Enter the operators (comma separated if more than one)." msgstr "" #: ../setuppageuserdata.cpp:188 msgctxt "SetupPageUserDataPage|" msgid "" "Enter the locator of your station. Alternatively, KLog can use an " "approximate locator based on your callsign." msgstr "" #: ../setuppageuserdata.cpp:191 msgctxt "SetupPageUserDataPage|" msgid "&QRZ" msgstr "" #: ../setuppageuserdata.cpp:192 msgctxt "SetupPageUserDataPage|" msgid "&Operators" msgstr "" #: ../setuppageuserdata.cpp:193 msgctxt "SetupPageUserDataPage|" msgid "&CQ Zone" msgstr "" #: ../setuppageuserdata.cpp:194 msgctxt "SetupPageUserDataPage|" msgid "&ITU Zone" msgstr "" #: ../setuppageuserdata.cpp:195 ../setuppageuserdata.cpp:374 msgctxt "SetupPageUserDataPage|" msgid "&Locator" msgstr "" #: ../setuppageuserdata.cpp:370 msgctxt "SetupPageUserDataPage|" msgid "&Locator (not valid)" msgstr "" #: ../setuppageworldeditor.cpp:32 msgctxt "SetupPageWorldEditor|" msgid "Add" msgstr "" #: ../setuppageworldeditor.cpp:33 msgctxt "SetupPageWorldEditor|" msgid "Delete" msgstr "" #: ../setuppageworldeditor.cpp:34 msgctxt "SetupPageWorldEditor|" msgid "Edit" msgstr "" #: ../setuppageworldeditor.cpp:36 msgctxt "SetupPageWorldEditor|" msgid "Export World" msgstr "" #: ../setuppageworldeditor.cpp:37 msgctxt "SetupPageWorldEditor|" msgid "Import World" msgstr "" #: ../setuppageworldeditor.cpp:43 ../setuppageworldeditor.cpp:44 #: ../setuppageworldeditor.cpp:45 ../setuppageworldeditor.cpp:49 msgctxt "SetupPageWorldEditor|" msgid "Still not implemented." msgstr "" #: ../setuppageworldeditor.cpp:50 msgctxt "SetupPageWorldEditor|" msgid "Import a new cty.csv file" msgstr "" #: ../setuppageworldeditor.cpp:88 msgctxt "SetupPageWorldEditor|" msgid "" "An entities information file (cty.csv) has been detected in your KLog folder " "and will be loaded." msgstr "" #: ../setuppageworldeditor.cpp:97 msgctxt "SetupPageWorldEditor|" msgid "" "No entities information file (cty.csv) has been detected in your KLog folder." msgstr "" #: ../setuppageworldeditor.cpp:98 msgctxt "SetupPageWorldEditor|" msgid "KLog will not be able to show entities information." msgstr "" #: ../setuppageworldeditor.cpp:184 msgctxt "SetupPageWorldEditor|" msgid "Prefix" msgstr "" #: ../setuppageworldeditor.cpp:186 msgctxt "SetupPageWorldEditor|" msgid "Entity" msgstr "" #: ../setuppageworldeditor.cpp:188 msgctxt "SetupPageWorldEditor|" msgid "ARRL ID" msgstr "" #: ../setuppageworldeditor.cpp:190 msgctxt "SetupPageWorldEditor|" msgid "Continent" msgstr "" #: ../setuppageworldeditor.cpp:192 msgctxt "SetupPageWorldEditor|" msgid "CQ Zone" msgstr "" #: ../setuppageworldeditor.cpp:194 msgctxt "SetupPageWorldEditor|" msgid "ITU Zone" msgstr "" #: ../setuppageworldeditor.cpp:196 msgctxt "SetupPageWorldEditor|" msgid "UTC" msgstr "" #: ../setuppageworldeditor.cpp:198 msgctxt "SetupPageWorldEditor|" msgid "Latitude" msgstr "" #: ../setuppageworldeditor.cpp:200 msgctxt "SetupPageWorldEditor|" msgid "Longitude" msgstr "" #: ../setuppageworldeditor.cpp:203 msgctxt "SetupPageWorldEditor|" msgid "Deleted" msgstr "" #: ../setuppageworldeditor.cpp:206 msgctxt "SetupPageWorldEditor|" msgid "Since Date" msgstr "" #: ../setuppageworldeditor.cpp:208 msgctxt "SetupPageWorldEditor|" msgid "To Date" msgstr "" #: ../setuppageworldeditor.cpp:302 msgctxt "SetupPageWorldEditor|" msgid "Open File" msgstr "" #: ../setuppageworldeditor.cpp:302 msgctxt "SetupPageWorldEditor|" msgid "BigCTY (*.csv)" msgstr "" #: ../setuppageworldeditor.cpp:311 msgctxt "SetupPageWorldEditor|" msgid "Entities information has been updated." msgstr "" #: ../setuppageworldeditor.cpp:317 msgctxt "SetupPageWorldEditor|" msgid "Entities information has not been updated." msgstr "" #: ../showerrordialog.cpp:9 msgctxt "ShowErrorDialog|" msgid "KLog Message" msgstr "" #: ../softwareupdatedialog.cpp:17 msgctxt "SoftwareUpdateDialog|" msgid "Ok" msgstr "" #: ../softwareupdatedialog.cpp:35 msgctxt "SoftwareUpdateDialog|" msgid "KLog update" msgstr "" #: ../softwareupdatedialog.cpp:53 msgctxt "SoftwareUpdateDialog|" msgid "Congratulations!" msgstr "" #: ../softwareupdatedialog.cpp:53 msgctxt "SoftwareUpdateDialog|" msgid "Your KLog has been updated." msgstr "" #: ../softwareupdatedialog.cpp:53 msgctxt "SoftwareUpdateDialog|" msgid "You already have the latest version." msgstr "" #: ../startwizard.cpp:42 msgctxt "StartWizard|" msgid "KLog - The free hamradio logging program" msgstr "" #: ../startwizard.cpp:68 msgctxt "StartWizard|" msgid "Quit Setup" msgstr "" #: ../startwizard.cpp:68 msgctxt "StartWizard|" msgid "Setup is not complete yet. Are you sure you want to quit setup?" msgstr "" #: ../statisticswidget.cpp:79 msgctxt "StatisticsWidget|" msgid "QSO per year" msgstr "" #: ../statisticswidget.cpp:80 msgctxt "StatisticsWidget|" msgid "DXCC per year" msgstr "" #: ../statisticswidget.cpp:81 msgctxt "StatisticsWidget|" msgid "CQ zones per year" msgstr "" #: ../statisticswidget.cpp:82 msgctxt "StatisticsWidget|" msgid "QSO per band" msgstr "" #: ../statisticswidget.cpp:83 msgctxt "StatisticsWidget|" msgid "QSO per mode" msgstr "" #: ../statisticswidget.cpp:84 msgctxt "StatisticsWidget|" msgid "QSO per DXCC" msgstr "" #: ../statisticswidget.cpp:85 msgctxt "StatisticsWidget|" msgid "QSO per Continent" msgstr "" #: ../statisticswidget.cpp:86 msgctxt "StatisticsWidget|" msgid "QSO per hour" msgstr "" #: ../statisticswidget.cpp:87 msgctxt "StatisticsWidget|" msgid "QSO per month" msgstr "" #: ../statisticswidget.cpp:88 msgctxt "StatisticsWidget|" msgid "Worked / Confirmed status" msgstr "" #: ../statisticswidget.cpp:89 msgctxt "StatisticsWidget|" msgid "Worked / Sent status" msgstr "" #: ../statisticswidget.cpp:90 msgctxt "StatisticsWidget|" msgid "Sent / Confirmed status" msgstr "" #: ../charts/statscqzperyearbarchartwidget.cpp:47 msgctxt "StatsCQZPerYearBarChartWidget|" msgid "CQ Zones per year" msgstr "" #: ../charts/statscqzperyearbarchartwidget.cpp:51 msgctxt "StatsCQZPerYearBarChartWidget|" msgid "Reading data ... " msgstr "" #: ../charts/statscqzperyearbarchartwidget.cpp:51 msgctxt "StatsCQZPerYearBarChartWidget|" msgid "Abort reading" msgstr "" #: ../charts/statscqzperyearbarchartwidget.cpp:56 msgctxt "StatsCQZPerYearBarChartWidget|" msgid "CQ zones" msgstr "" #: ../charts/statscqzperyearbarchartwidget.cpp:57 msgctxt "StatsCQZPerYearBarChartWidget|" msgid "CQ zones per year" msgstr "" #: ../charts/statscqzperyearbarchartwidget.cpp:69 msgctxt "StatsCQZPerYearBarChartWidget|" msgid "Reading data ..." msgstr "" #: ../charts/statscqzperyearbarchartwidget.cpp:69 #, qt-format msgctxt "StatsCQZPerYearBarChartWidget|" msgid "Years: %1/%2" msgstr "" #: ../charts/statsentitiesperyearbarchartwidget.cpp:47 msgctxt "StatsEntitiesPerYearBarChartWidget|" msgid "Chart title" msgstr "" #: ../charts/statsentitiesperyearbarchartwidget.cpp:51 msgctxt "StatsEntitiesPerYearBarChartWidget|" msgid "Reading data ... " msgstr "" #: ../charts/statsentitiesperyearbarchartwidget.cpp:51 msgctxt "StatsEntitiesPerYearBarChartWidget|" msgid "Abort reading" msgstr "" #: ../charts/statsentitiesperyearbarchartwidget.cpp:57 msgctxt "StatsEntitiesPerYearBarChartWidget|" msgid "DXCC Entities" msgstr "" #: ../charts/statsentitiesperyearbarchartwidget.cpp:58 msgctxt "StatsEntitiesPerYearBarChartWidget|" msgid "DXCC Entities per year" msgstr "" #: ../charts/statsentitiesperyearbarchartwidget.cpp:66 msgctxt "StatsEntitiesPerYearBarChartWidget|" msgid "Reading data ..." msgstr "" #: ../charts/statsentitiesperyearbarchartwidget.cpp:66 msgctxt "StatsEntitiesPerYearBarChartWidget|" msgid "Entities: " msgstr "" #: ../charts/statsqsosperbandbarchartwidget.cpp:47 msgctxt "StatsQSOsPerBandBarChartWidget|" msgid "QSOs per band" msgstr "" #: ../charts/statsqsosperbandbarchartwidget.cpp:51 msgctxt "StatsQSOsPerBandBarChartWidget|" msgid "Reading data ... " msgstr "" #: ../charts/statsqsosperbandbarchartwidget.cpp:51 msgctxt "StatsQSOsPerBandBarChartWidget|" msgid "Abort reading" msgstr "" #: ../charts/statsqsosperbandbarchartwidget.cpp:56 msgctxt "StatsQSOsPerBandBarChartWidget|" msgid "Bands" msgstr "" #: ../charts/statsqsosperbandbarchartwidget.cpp:57 msgctxt "StatsQSOsPerBandBarChartWidget|" msgid "QSO per band distribution" msgstr "" #: ../charts/statsqsosperbandbarchartwidget.cpp:67 msgctxt "StatsQSOsPerBandBarChartWidget|" msgid "Reading data ..." msgstr "" #: ../charts/statsqsosperbandbarchartwidget.cpp:67 msgctxt "StatsQSOsPerBandBarChartWidget|" msgid "Bands: " msgstr "" #: ../charts/statsqsospercontinentbarchartwidget.cpp:47 #: ../charts/statsqsospercontinentbarchartwidget.cpp:61 msgctxt "StatsQSOsPerContinentBarChartWidget|" msgid "QSOs per continent" msgstr "" #: ../charts/statsqsospercontinentbarchartwidget.cpp:51 msgctxt "StatsQSOsPerContinentBarChartWidget|" msgid "Reading data ... " msgstr "" #: ../charts/statsqsospercontinentbarchartwidget.cpp:51 msgctxt "StatsQSOsPerContinentBarChartWidget|" msgid "Abort reading" msgstr "" #: ../charts/statsqsospercontinentbarchartwidget.cpp:60 msgctxt "StatsQSOsPerContinentBarChartWidget|" msgid "Continents" msgstr "" #: ../charts/statsqsospercontinentbarchartwidget.cpp:70 msgctxt "StatsQSOsPerContinentBarChartWidget|" msgid "Reading data ..." msgstr "" #: ../charts/statsqsospercontinentbarchartwidget.cpp:70 msgctxt "StatsQSOsPerContinentBarChartWidget|" msgid "Hours: " msgstr "" #: ../charts/statsqsosperdxccbarchartwidget.cpp:47 msgctxt "StatsQSOsPerDXCCBarChartWidget|" msgid "QSOs per DXCC" msgstr "" #: ../charts/statsqsosperdxccbarchartwidget.cpp:51 msgctxt "StatsQSOsPerDXCCBarChartWidget|" msgid "Reading data ... " msgstr "" #: ../charts/statsqsosperdxccbarchartwidget.cpp:51 msgctxt "StatsQSOsPerDXCCBarChartWidget|" msgid "Abort reading" msgstr "" #: ../charts/statsqsosperdxccbarchartwidget.cpp:53 #: ../charts/statsqsosperdxccbarchartwidget.cpp:96 msgctxt "StatsQSOsPerDXCCBarChartWidget|" msgid "Reading data..." msgstr "" #: ../charts/statsqsosperdxccbarchartwidget.cpp:96 msgctxt "StatsQSOsPerDXCCBarChartWidget|" msgid "Entity: " msgstr "" #: ../charts/statsqsosperdxccbarchartwidget.cpp:119 msgctxt "StatsQSOsPerDXCCBarChartWidget|" msgid "DXCC" msgstr "" #: ../charts/statsqsosperdxccbarchartwidget.cpp:120 msgctxt "StatsQSOsPerDXCCBarChartWidget|" msgid "Top ten DXCC per QSO" msgstr "" #: ../charts/statsqsosperhourbarchartwidget.cpp:47 msgctxt "StatsQSOsPerHourBarChartWidget|" msgid "QSOs per hour" msgstr "" #: ../charts/statsqsosperhourbarchartwidget.cpp:51 msgctxt "StatsQSOsPerHourBarChartWidget|" msgid "Reading data ... " msgstr "" #: ../charts/statsqsosperhourbarchartwidget.cpp:51 msgctxt "StatsQSOsPerHourBarChartWidget|" msgid "Abort reading" msgstr "" #: ../charts/statsqsosperhourbarchartwidget.cpp:59 msgctxt "StatsQSOsPerHourBarChartWidget|" msgid "Hours" msgstr "" #: ../charts/statsqsosperhourbarchartwidget.cpp:60 msgctxt "StatsQSOsPerHourBarChartWidget|" msgid "QSOs at hour" msgstr "" #: ../charts/statsqsosperhourbarchartwidget.cpp:70 msgctxt "StatsQSOsPerHourBarChartWidget|" msgid "Reading data ..." msgstr "" #: ../charts/statsqsosperhourbarchartwidget.cpp:70 msgctxt "StatsQSOsPerHourBarChartWidget|" msgid "Hours: " msgstr "" #: ../charts/statsqsospermodebarchartwidget.cpp:47 msgctxt "StatsQSOsPerModeBarChartWidget|" msgid "QSOs per mode" msgstr "" #: ../charts/statsqsospermodebarchartwidget.cpp:51 msgctxt "StatsQSOsPerModeBarChartWidget|" msgid "Reading data ... " msgstr "" #: ../charts/statsqsospermodebarchartwidget.cpp:51 msgctxt "StatsQSOsPerModeBarChartWidget|" msgid "Abort reading" msgstr "" #: ../charts/statsqsospermodebarchartwidget.cpp:56 msgctxt "StatsQSOsPerModeBarChartWidget|" msgid "Modes" msgstr "" #: ../charts/statsqsospermodebarchartwidget.cpp:57 msgctxt "StatsQSOsPerModeBarChartWidget|" msgid "QSO per mode distribution" msgstr "" #: ../charts/statsqsospermodebarchartwidget.cpp:67 msgctxt "StatsQSOsPerModeBarChartWidget|" msgid "Reading data ..." msgstr "" #: ../charts/statsqsospermodebarchartwidget.cpp:67 msgctxt "StatsQSOsPerModeBarChartWidget|" msgid "Modes: " msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:47 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "QSOs per month" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:51 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Reading data ... " msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:51 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Abort reading" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:56 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Jan" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:56 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Feb" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:56 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Mar" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:56 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Apr" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:56 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "May" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:56 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Jun" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:57 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Jul" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:57 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Aug" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:57 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Sep" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:57 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Oct" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:57 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Nov" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:57 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Dec" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:59 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Months" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:60 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "QSOs at Month" msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:70 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Reading data ..." msgstr "" #: ../charts/statsqsospermonthbarchartwidget.cpp:70 msgctxt "StatsQSOsPerMonthBarChartWidget|" msgid "Months: " msgstr "" #: ../charts/statsqsosperyearbarchartwidget.cpp:47 msgctxt "StatsQSOsPerYearBarChartWidget|" msgid "Chart title" msgstr "" #: ../charts/statsqsosperyearbarchartwidget.cpp:51 msgctxt "StatsQSOsPerYearBarChartWidget|" msgid "Reading data ... " msgstr "" #: ../charts/statsqsosperyearbarchartwidget.cpp:51 msgctxt "StatsQSOsPerYearBarChartWidget|" msgid "Abort reading" msgstr "" #: ../charts/statsqsosperyearbarchartwidget.cpp:56 msgctxt "StatsQSOsPerYearBarChartWidget|" msgid "QSOs" msgstr "" #: ../charts/statsqsosperyearbarchartwidget.cpp:57 msgctxt "StatsQSOsPerYearBarChartWidget|" msgid "QSOs per year" msgstr "" #: ../charts/statsqsosperyearbarchartwidget.cpp:68 msgctxt "StatsQSOsPerYearBarChartWidget|" msgid "Reading data ..." msgstr "" #: ../charts/statsqsosperyearbarchartwidget.cpp:68 #, qt-format msgctxt "StatsQSOsPerYearBarChartWidget|" msgid "QSO: %1/%2" msgstr "" #: ../charts/statssentconfirmedpiechartwidget.cpp:39 #, qt-format msgctxt "StatsSentConfirmedPieChartWidget|" msgid "Sent - %1" msgstr "" #: ../charts/statssentconfirmedpiechartwidget.cpp:40 #, qt-format msgctxt "StatsSentConfirmedPieChartWidget|" msgid "Confirmed - %2" msgstr "" #: ../charts/statsworkedconfirmedpiechartwidget.cpp:39 #, qt-format msgctxt "StatsWorkedConfirmedPieChartWidget|" msgid "Worked, not confirmed - %1" msgstr "" #: ../charts/statsworkedconfirmedpiechartwidget.cpp:40 #, qt-format msgctxt "StatsWorkedConfirmedPieChartWidget|" msgid "Confirmed - %2" msgstr "" #: ../charts/statsworkedsentpiechartwidget.cpp:39 #, qt-format msgctxt "StatsWorkedSentPieChartWidget|" msgid "Worked - %1" msgstr "" #: ../charts/statsworkedsentpiechartwidget.cpp:40 #, qt-format msgctxt "StatsWorkedSentPieChartWidget|" msgid "Sent - %2" msgstr "" #: ../updatesatsdata.cpp:59 msgctxt "UpdateSatsData|" msgid "Reading Satellites data file..." msgstr "" #: ../updatesatsdata.cpp:59 msgctxt "UpdateSatsData|" msgid "Abort reading" msgstr "" #: ../updatesatsdata.cpp:213 msgctxt "UpdateSatsData|" msgid "The Satellites information has been updated." msgstr "" #: ../updatesatsdata.cpp:231 msgctxt "UpdateSatsData|" msgid "Open File" msgstr "" #: ../updatesatsdata.cpp:233 msgctxt "UpdateSatsData|" msgid "Sat Data" msgstr "" #: ../world.cpp:171 msgctxt "World|" msgid "Entity" msgstr "" #: ../world.cpp:172 msgctxt "World|" msgid "Continent" msgstr "" #: ../world.cpp:1199 msgctxt "World|" msgid "Reading cty.csv..." msgstr "" #: ../world.cpp:1199 msgctxt "World|" msgid "Abort reading" msgstr "" #: ../elogclublog.cpp:58 ../elogclublog.cpp:118 msgctxt "eLogClubLog|" msgid "Host not found!" msgstr "" #: ../elogclublog.cpp:64 ../elogclublog.cpp:123 msgctxt "eLogClubLog|" msgid "Timeout error!" msgstr "" #: ../elogclublog.cpp:70 msgctxt "eLogClubLog|" msgid "It seems to be a PASSWORD ERROR; check your password." msgstr "" #: ../elogclublog.cpp:72 msgctxt "eLogClubLog|" msgid "KLog - ClubLog" msgstr "" #: ../elogclublog.cpp:73 msgctxt "eLogClubLog|" msgid "It seems that your ClubLog password is not correct." msgstr "" #: ../elogclublog.cpp:74 msgctxt "eLogClubLog|" msgid "" "Please check your password in the setup. ClubLog uploads will be disabled." msgstr "" #: ../elogclublog.cpp:84 ../elogclublog.cpp:128 msgctxt "eLogClubLog|" msgid "Undefined error..." msgstr "" #: ../elogclublog.cpp:391 msgctxt "eLogClubLog|" msgid "Callsign missing" msgstr "" #: ../elogclublog.cpp:395 msgctxt "eLogClubLog|" msgid "Invalid callsign" msgstr "" #: ../elogclublog.cpp:399 msgctxt "eLogClubLog|" msgid "Skipping SWL callsign" msgstr "" #: ../elogclublog.cpp:403 msgctxt "eLogClubLog|" msgid "Callsign is your own call" msgstr "" #: ../elogclublog.cpp:407 msgctxt "eLogClubLog|" msgid "Invalid callsign with no DXCC mapping" msgstr "" #: ../elogclublog.cpp:411 msgctxt "eLogClubLog|" msgid "Updated QSO" msgstr "" #: ../elogclublog.cpp:415 msgctxt "eLogClubLog|" msgid "Invalid ADIF record" msgstr "" #: ../elogclublog.cpp:419 msgctxt "eLogClubLog|" msgid "Missing ADIF record" msgstr "" #: ../elogclublog.cpp:423 msgctxt "eLogClubLog|" msgid "Test mode - parameters ok, no action taken" msgstr "" #: ../elogclublog.cpp:427 msgctxt "eLogClubLog|" msgid "Excessive API Usage" msgstr "" #: ../elogclublog.cpp:431 msgctxt "eLogClubLog|" msgid "Internal Error" msgstr "" #: ../elogclublog.cpp:435 msgctxt "eLogClubLog|" msgid "Rejected" msgstr "" #: ../elogclublog.cpp:439 msgctxt "eLogClubLog|" msgid "QSO Duplicate" msgstr "" #: ../elogclublog.cpp:443 msgctxt "eLogClubLog|" msgid "QSO Modified" msgstr "" #: ../elogclublog.cpp:447 msgctxt "eLogClubLog|" msgid "Missing Login" msgstr "" #: ../elogclublog.cpp:451 msgctxt "eLogClubLog|" msgid "QSO OK" msgstr "" #: ../elogclublog.cpp:455 ../elogclublog.cpp:479 msgctxt "eLogClubLog|" msgid "Upload denied" msgstr "" #: ../elogclublog.cpp:459 msgctxt "eLogClubLog|" msgid "No callsign selected" msgstr "" #: ../elogclublog.cpp:463 msgctxt "eLogClubLog|" msgid "No match found" msgstr "" #: ../elogclublog.cpp:467 msgctxt "eLogClubLog|" msgid "Dropped QSO" msgstr "" #: ../elogclublog.cpp:471 msgctxt "eLogClubLog|" msgid "OK" msgstr "" #: ../elogclublog.cpp:475 msgctxt "eLogClubLog|" msgid "Login rejected" msgstr "" #: ../elogclublog.cpp:483 msgctxt "eLogClubLog|" msgid "Rejected: Callsign is your own call" msgstr "" klog-2.3.3/translations/klog_ja.ts0000644000015700001710000151360014542412415017042 0ustar jenkinsjenkins AboutDialog About KLog KLogã«ã¤ã„㦠You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. ãƒã‚°ãƒ¬ãƒãƒ¼ãƒˆã‚„ã¡ã‚‡ã£ã¨ã—ãŸã‚³ãƒ¼ãƒ‰ã‚’書ã„ã¦é€ã£ã¦ãれãŸã‚Šã€ä»–ã«ã‚‚アイデアã¨ã‹ KLog をよりよãã™ã‚‹ã¨ã‚ãªãŸãŒæ€ã†ã“ã¨ã‚’何ã§ã‚‚é€ã£ã¦ãれるã“ã¨ã§æ‰‹åŠ©ã‘ã¨ãªã‚Šã¾ã™. Authors 作者 By Author 作者 KLog is a free logbook for hamradio operators. KLogã¯ã‚¢ãƒžãƒãƒ¥ã‚¢ç„¡ç·šå®¶ã®ãŸã‚ã®ãƒ•リーãªãƒ­ã‚°ã‚½ãƒ•トã§ã™. Please provide your review in KLog's eHam review page: eHamã®ãƒ¬ãƒ“ューページã«KLogã®ãƒ¬ãƒ“ューをãœã²æŠ•稿ã—ã¦ãã ã•ã„: Find more information and the latest release at より詳ã—ã„æƒ…å ±ã‚„ã€æœ€æ–°ã®ãƒªãƒªãƒ¼ã‚¹ã¯ä»¥ä¸‹ã®å ´æ‰€ã§å…¥æ‰‹ã§ãã¾ã™.<br> today ç¾åœ¨ Main developer メイン開発者 KLog is developed by a very small team and you are invited to join! KLogã¯ã¨ã¦ã‚‚å°ã•ãªãƒãƒ¼ãƒ ã«ã‚ˆã£ã¦é–‹ç™ºã•れã¦ãŠã‚Šã€ã‚ãªãŸã®å‚åŠ ãŒæœ›ã¾ã‚Œã¦ã„ã¾ã™! KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account users' needs. At present, the data that is provided is the following: 今ã®ã¨ã“ã‚ã€æä¾›ã„ãŸã ã情報ã¯ä»¥ä¸‹ã®ã‚‚ã®ã§ã™: Translators bring KLog into your language. They are really an important part of the KLog development team. 翻訳者ã¯KLogã‚’ã‚ãªãŸã®è¨€èªžã§ä½¿ãˆã‚‹ã‚ˆã†ã«ã—ã¾ã™. 翻訳者ã¯KLog開発ãƒãƒ¼ãƒ ã®ä¸­ã§ã‚‚ã¨ã‚Šã‚ã‘é‡è¦ãªå½¹å‰²ã‚’æ‹…ã„ã¾ã™. Please be aware that this is a development release and it may contain many bugs.<br>Backup your data before using this software! ã“れã¯é–‹ç™ºç‰ˆã§ã‚りã€å¤šãã®ãƒã‚°ãŒå«ã¾ã‚Œã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ã“ã¨ã‚’ã”了承ãã ã•ã„。<br>ã“ã®ã‚½ãƒ•トウェアを使用ã™ã‚‹å‰ã«ã€ãƒ‡ãƒ¼ã‚¿ã‚’ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã—ã¦ãã ã•ã„ï¼ Since 0.6.2, KLog has been fully rewritten to provide a cross-platform application that runs on all major operating systems (GNU/Linux, macOS and Windows) and to support new functionality. KLogã¯ã€0.6.2以é™ã€ä¸»è¦ãªã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ï¼ˆGNU/Linuxã€macOSã€Windows)ã§å‹•作ã™ã‚‹ã‚¯ãƒ­ã‚¹ãƒ—ラットフォームã®ã‚¢ãƒ—リケーションをæä¾›ã—ã€æ–°ã—ã„æ©Ÿèƒ½ã‚’サãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã«å®Œå…¨ã«æ›¸ãæ›ãˆã‚‰ã‚Œã¾ã—ãŸã€‚ If you want to provide support you are welcome to join the <a href="https://groups.io/g/klog">KLog mailing list</a>! 応æ´ã—ã¦ãã ã•ã‚‹æ–¹ã¯ã€ãœã²<a href="https://groups.io/g/klog">KLogã®ãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆ</a>ã«ã”å‚加ãã ã•ã„ï¼ If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://groups.io/g/klog">KLog mailing list</a>! KLogãŒã¾ã ã‚ãªãŸã®è¨€èªžã«å¯¾å¿œã—ã¦ãŠã‚‰ãšã€ç§ãŸã¡ã‚’助ã‘ãŸã„ã¨ãŠè€ƒãˆã®å ´åˆã¯ã€<a href="https://groups.io/g/klog">KLog</a>メーリングリストを通ã˜ã¦ç§ãŸã¡ã«ã”連絡ãã ã•ã„ï¼ Translators 翻訳者 Privacy advisory プライãƒã‚·ãƒ¼ã«ã¤ã„ã¦ã®å‹§å‘Š Callsign コールサイン KLog version KLogã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ Operating system OSã®æƒ…å ± Be aware that you can enable/disable this feature from the Misc tab in the Setup page. ã“ã®æ©Ÿèƒ½ã¯ã€ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—ページã®ã€ŒMiscã€ã‚¿ãƒ–ã§æœ‰åй/無効を切り替ãˆã‚‹ã“ã¨ãŒã§ãã¾ã™ã®ã§ã€ã”注æ„ãã ã•ã„。 KLog KLog Privacy プライãƒã‚·ãƒ¼ AdifLoTWExportWidget Select the Station Callsign that you want to use to upload the log. ログã®ã‚¢ãƒƒãƒ—ロードã«ä½¿ç”¨ã™ã‚‹ç„¡ç·šå±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’é¸æŠžã—ã¾ã™ã€‚ Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign. QSOをエクスãƒãƒ¼ãƒˆã™ã‚‹é–‹å§‹æ—¥ã‚’é¸æŠžã—ã¾ã™ã€‚ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®æ—¥ä»˜ã¯ã€ã“ã®å±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã§æœ€åˆã®QSOを行ã£ãŸæ—¥ã§ã™ã€‚ Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign. QSOをエクスãƒãƒ¼ãƒˆã™ã‚‹çµ‚äº†æ—¥ã‚’é¸æŠžã—ã¾ã™ã€‚ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®æ—¥ä»˜ã¯ã€ã“ã®å±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã§æœ€å¾Œã«QSOを行ã£ãŸæ—¥ã§ã™ã€‚ Station callsign ç„¡ç·šå±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ My Locator 自局ã®ã‚°ãƒªãƒƒãƒ‰ãƒ­ã‚±ãƒ¼ã‚¿ãƒ¼ Start date é–‹å§‹æ—¥ End date 終了日 Ok OK Cancel キャンセル DX DX Date/Time 日付/時刻 Band ãƒãƒ³ãƒ‰ Mode モード Not defined 定義ã•れã¦ã„ã¾ã›ã‚“ ALL QSOs: %1/%2 All ã™ã¹ã¦ã®ãƒ­ã‚° QSOs: QSOs: KLog - QSOs to be uploaded to LoTW. KLog - LoTW ã«ã‚¢ãƒƒãƒ—ロードã•れる QSO。 This table shows the QSOs that will be sent to LoTW. ã“ã®ãƒ†ãƒ¼ãƒ–ルã¯ã€LoTW ã«é€ä¿¡ã•れる QSOを示ã—ã¾ã™ã€‚ KLog - QSOs to be uploaded to ClubLog. KLog - ClubLogã«ã‚¢ãƒƒãƒ—ロードã•れるQSO。 This table shows the QSOs that will be sent to ClubLog. ã“ã®è¡¨ã¯ã€ClubLogã«é€ä¿¡ã•れるQSOを示ã—ã¦ã„ã¾ã™ã€‚ KLog - QSOs to be uploaded to eQSL.cc. KLog - eQSL.ccã«ã‚¢ãƒƒãƒ—ロードã•れるQSO。 This table shows the QSOs that will be sent to eQSL.cc. ã“ã®è¡¨ã¯ã€eQSL.ccã«é€ä¿¡ã•れるQSOを示ã—ã¦ã„ã¾ã™ã€‚ KLog - QSOs to be uploaded to QRZ.com. KLog - QRZ.comã«ã‚¢ãƒƒãƒ—ロードã•れるQSO。 This table shows the QSOs that will be sent to QRZ.com. ã“ã®è¡¨ã¯ã€QRZ.comã«é€ä¿¡ã•れるQSOを示ã—ã¦ã„ã¾ã™ã€‚ This table shows the QSOs that will be exported to ADIF. ã“ã®è¡¨ã¯ã€ADIFã«ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã•れるQSOを示ã—ã¦ã„ã¾ã™ã€‚ AwardsWidget Recalculate å†è¨ˆç®— Click to recalculate the award status. クリックã™ã‚‹ã¨ã‚¢ãƒ¯ãƒ¼ãƒ‰ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ãŒå†è¨ˆç®—ã•れã¾ã™ã€‚ Select the year you want to check. 確èªã—ãŸã„å¹´ã‚’é¸æŠžã—ã¾ã™ã€‚ QSOs QSOç·æ•° DXCC DXCC CQ CQ Award アワード Confirmed コンファーム済 Worked WAZ Score Annual Number of confirmed DXCC entities. 確èªã•れãŸDXCCã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ã®æ•°ã€‚ Number of worked DXCC entities. 活動ã—ãŸDXCCã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ã®æ•°ã€‚ Number of confirmed WAZ zones. 確èªã•れãŸWAZã‚¾ãƒ¼ãƒ³ã®æ•°ã€‚ Number of worked WAZ zones. 活動ã—ãŸWAZã‚¾ãƒ¼ãƒ³ã®æ•°ã€‚ Number of confirmed QSOs. 確èªã•れãŸQSOã®æ•°ã€‚ Number of worked QSOs. 活動ã—ãŸQSOã®æ•°ã€‚ Number of QSOs worked in the selected year. é¸æŠžã—ãŸå¹´ã«æ´»å‹•ã—ãŸQSO数。 Number of DXCCs worked in the selected year. é¸æŠžã—ãŸå¹´ã«æ´»å‹•ã—ãŸDXCCã®æ•°ã€‚ Number of CQ Zones worked in the selected year. é¸æŠžã•れãŸå¹´ã«æ´»å‹•ã—ãŸCQã‚¾ãƒ¼ãƒ³ã®æ•°ã€‚ Score for the DXMarathon in the selected year. é¸æŠžã—ãŸå¹´ã®DXMarathonã®ã‚¹ã‚³ã‚¢ã€‚ DX-Marathon DX-マラソン CTYPage Country data download エンティティーデータã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ KLog needs country data... KLogã§ã¯ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ãƒ¼ãƒ‡ãƒ¼ã‚¿ã‚’利用ã—ã¾ã™... &Download ダウンロード(&D) &Ignore 無視(&I) Country data needed エンティティデータãŒå¿…è¦ã§ã™ KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. KLogã§ã¯ã€https://www.country-files.com/ ã® cty.csv ファイルを使ã£ã¦ DXCC 情報をå–å¾—ã—ã¦ã„ã¾ã™ã€‚ You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do. KLogã§QSOã—ãŸå›½ã‚„ロケータãªã©ã‚’表示ã•ã›ãŸã„å ´åˆã¯ã€cty.csvファイルをダウンロードã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ Click on Download to download now. ダウンロードを開始ã™ã‚‹ãŸã‚ã«ã€ã€Œãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¦ãã ã•ã„. KLog KLog I can't find the host. Please check your network and try again Do you want to try again? 接続先ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“. ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶šã‚’確èªã—ã¦ã€å†åº¦ãƒˆãƒ©ã‚¤ã—ã¦ã¿ã¦ãã ã•ã„. ã‚‚ã†ä¸€åº¦è¡Œã„ã¾ã™ã‹ï¼Ÿ DXCCStatusWidget Update æ›´æ–° It seems that the DXCC status in your database is not updated and KLog can't find any dxcc information. You can try to fix this by updating the log. Do you want to update your DXCC status? ã‚ãªãŸã®DXCCステータスを更新ã—ãŸã„ã§ã™ã‹ï¼Ÿ Entity エンティティ Prefix プリフィクス Pref: CQ: ITU: Beam: Entity not worked in this band. ã“ã®ãƒãƒ³ãƒ‰ã§ã¯æ´»å‹•ã—ã¦ã„ãªã„エンティティー。 DXClusterWidget Click on Connect to connect to the DX-Cluster server 接続ボタンをクリックã™ã‚‹ã¨DXã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼ã«æŽ¥ç¶šã—ã¾ã™ Connect 接続 Clear クリア Check in QRZ.com QRZ.comã§ãƒã‚§ãƒƒã‚¯ Check this callsign in QRZ.com Click on connect to connect to the DX-Cluster 接続ボタンをクリックã™ã‚‹ã¨DXã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼ã«æŽ¥ç¶šã—ã¾ã™ Trying to connect to the server サーãƒãƒ¼ã«æŽ¥ç¶šã—ã¦ã„ã¾ã™ KLog DXCluster KLog DXクラスター The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. 接続ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚DXクラスターãŒç¨¼åƒã—ã¦ã„ã‚‹ã“ã¨ã‚’確ã‹ã‚ã¦ãã ã•ã„。ã¾ãŸã€ãƒ›ã‚¹ãƒˆåã€ãƒãƒ¼ãƒˆç•ªå·ã®è¨­å®šãŒæ­£ã—ã„ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 The following error occurred: %1. 次ã®ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ: %1。 Connected to server サーãƒãƒ¼ã«æŽ¥ç¶šã—ã¾ã—㟠KLog message KLog メッセージ Enter your callsign to connect to the cluster: DXã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼ã«æŽ¥ç¶šã™ã‚‹ãŸã‚ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’入力ã—ã¦ãã ã•ã„: Enter your password to connect to the cluster: (Just hit enter for no password) DXã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼ã«æŽ¥ç¶šã™ã‚‹ãŸã‚ã®ãƒ‘スワードを入力ã—ã¦ãã ã•ã„。 (カラã®ãƒ‘スワードã«ã¤ã„ã¦ã¯ã‚¨ãƒ³ã‚¿ãƒ¼ã ã‘押ã—ã¦ãã ã•ã„。) Not logged on, you may need to enter your callsign again. ログオンã—ã¦ã„ã¾ã›ã‚“. ã‚‚ã†ä¸€åº¦ã€ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’入力ã—ã¦ã¿ã¦ãã ã•ã„. Enter here the commands to be sent to the DX-Cluster server. ã“ã“ã§ã¯ã€DX-Clusterサーãƒãƒ¼ã«é€ä¿¡ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’入力ã—ã¾ã™ã€‚ It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! 書ãè¾¼ã¿ç”¨ã®DX-Spotã‚’ä¿å­˜ã™ã‚‹ãƒ•ァイルを開ãã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚DXã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼ã®æ´»å‹•ãŒä¿å­˜ã•れãªã„! Disconnect 切断 The host was not found. Please check: ホストãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ã”確èªãã ã•ã„: - your network connection; - the host name and port settings. - ã‚ãªãŸã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶š - ホストåã¨ãƒãƒ¼ãƒˆã®è¨­å®šã€‚ Connection closed by the server サーãƒãƒ¼ã«ã‚ˆã£ã¦æŽ¥ç¶šãŒåˆ‡ã‚‰ã‚Œã¾ã—㟠Click on Connect to connect to the DX-Cluster server. 接続をクリックã—ã¦ã€DX-Clusterサーãƒãƒ¼ã«æŽ¥ç¶šã—ã¾ã™ã€‚ Send é€ä¿¡ DataProxy_SQLite Software version in DB is null DBã®ã‚½ãƒ•トウェアãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒNULL Aircraft Scatter Common term in hamradio, do not translate if not sure Aurora Aurora-E Back scatter Common term in hamradio, do not translate if not sure Earth-Moon-Earth Sporadic E Internet-assisted Ionoscatter Common term in hamradio, do not translate if not sure Meteor scatter Common term in hamradio, do not translate if not sure Terrestrial or atmospheric repeater or transponder Rain scatter Common term in hamradio, do not translate if not sure Satellite サテライト通信 Bureau Common term in hamradio, do not translate if not sure ビューロー Manager Common term in hamradio, do not translate if not sure マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ All QSOs have been updated with a DXCC and the Continent. å…¨ã¦ã®QSOã¯DXCCã¨å¤§é™¸ãŒæ›´æ–°ã•れã¦ã„ã¾ã™ã€‚ Field Aligned Irregularities Common term in hamradio, do not translate if not sure Query didn't failed F2 Reflection Common term in hamradio, do not translate if not sure Trans-equatorial Common term in hamradio, do not translate if not sure Tropospheric ducting Common term in hamradio, do not translate if not sure Yes ã¯ã„ No ã„ã„㈠Requested リクエスト済㿠Ignore/Invalid 無視/無効 Validated 検証済㿠Queued 待機中 Uploaded アップロード Do not upload アップロードã—ãªã„ Modified æ›´æ–°æ—¥ Direct ダイレクト Electronic KLog DXCC KLog DXCC KLog - Invalid call detected KLog - 無効ãªcallãŒæ¤œå‡ºã•れã¾ã—㟠An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported ADIF record? 空ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ãŒæ¤œå‡ºã•れã¾ã—ãŸã€‚ã“ã®QSOã‚’ãã®ã¾ã¾ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã™ã‚‹ã‹ï¼ˆï¼»ã¯ã„]をクリック)ã€ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã—ãŸADIFレコードã‹ã‚‰ãƒ•ィールドを削除ã—ã¾ã™ã‹ï¼Ÿ An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log? 無効ãªã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ãŒæ¤œå‡ºã•れã¾ã—㟠%1。ã“ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’エクスãƒãƒ¼ãƒˆã™ã‚‹ã‹ï¼ˆ[ã¯ã„]をクリック)ã€ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã—ãŸãƒ­ã‚°ã‹ã‚‰é€šè©±ã‚’削除ã—ã¾ã™ã‹ï¼Ÿ Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. é–“é•ã£ãŸã‚³ãƒ¼ãƒ«ã‚’エクスãƒãƒ¼ãƒˆã™ã‚‹ã¨ã€ã“ã®ãƒ­ã‚°ãƒ•ァイルをインãƒãƒ¼ãƒˆã™ã‚‹å¯èƒ½æ€§ã®ã‚ã‚‹ アプリケーションã§å•題ãŒç™ºç”Ÿã™ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ã—ã‹ã—ã€è‰¯ã„コールサインãŒKLogã«ã‚ˆã£ã¦æœ‰åйã§ã¯ãªã„ã¨èª¤ã£ã¦èªè­˜ã•れã¦ã„ã‚‹å¯èƒ½æ€§ã‚‚ã‚りã¾ã™ã€‚ DownLoadCTY Download of cty.csv failed with the following error code: cty.csv ã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã€å¤±æ•—. エラーコード: Download of cty.csv done. cty.csv ã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã€å®Œäº†. There is already a cty.csv file in the folder but it will be replaced with the new one. フォルダーã«ã™ã§ã« cty.csv ファイルãŒã‚りã¾ã™ãŒã€æœ€æ–°ã®ã‚‚ã®ã§ç½®ãæ›ãˆã¾ã™. Could not open %1 for writing 書ãè¾¼ã¿ã«%1ã‚’é–‹ã‘ã¾ã›ã‚“ã§ã—㟠FileAwardManager Open Award file アワードファイルを開ã Award files (*.awa) アワードファイル(*.awa) Award file not opened アワードファイルãŒé–‹ã‹ã‚Œãªã„ KLog was not able to read the award file KLogã¯ã‚¢ãƒ¯ãƒ¼ãƒ‰ãƒ•ァイルを読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—㟠It was not possible to open the file %1 for reading. 読ã¿è¾¼ã¿ã«%1ã‚’é–‹ãã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ AWA wrong format AWAã®é–“é•ã£ãŸãƒ•ォーマット The AWA file does not have the right format AWAファイルã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆãŒæ­£ã—ããªã„ AWA file does not have an <EOH> field AWAファイルã«<EOH>フィールド</EOH>ãŒãªã„ KLog - %1 KLog - %1 FileManager Writing ADIF file... ADIFファイルを書ã込んã§ã„ã¾ã™... Abort writing 書込ã¿ã®ä¸­æ­¢ Writing ADIF file... QSO: ADIFファイルを書ã込んã§ã„ã¾ã™... QSO: You have canceled the file export. The file will be removed and no data will be exported. ファイルã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆãŒä¸­æ–­ã•れã¾ã—ãŸ. 出力先ã®ãƒ•ァイルã¯å‰Šé™¤ã•れã€ãƒ‡ãƒ¼ã‚¿ã¯ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã•れã¾ã›ã‚“. Do you still want to cancel? 本当ã«ä¸­æ­¢ã—ã¾ã™ã‹? QSO: Reading ADIF file... ADIFファイルを読ã¿ã“ã‚“ã§ã„ã¾ã™... Abort reading 読込ã¿ã®ä¸­æ­¢ Reading LoTW file... LoTWã®ãƒ•ァイルを読む... KLog - Log selection KLog - ログã®é¸æŠž You have canceled the file import. The file will be removed and no data will be imported. ファイルã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚’キャンセルã—ã¾ã—ãŸã€‚ファイルã¯å‰Šé™¤ã•れã€ãƒ‡ãƒ¼ã‚¿ã¯ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•れã¾ã›ã‚“。 Exporting ADIF file... QSO: %1 / %2 ADIF ファイルをエクスãƒãƒ¼ãƒˆã™ã‚‹... QSO: %1 / %2 Please edit the ADIF file and make sure that it include at least: and This QSO had: Do you want to continue with the current file? ç¾åœ¨ã®ãƒ•ァイルを継続ã—ã¦ä½¿ç”¨ã—ã¾ã™ã‹ï¼Ÿ Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information. ã“ã®ãƒ­ã‚°ã®ã„ãã¤ã‹ã®QSO (例: %1) ã§ã¯ã€RST-TX情報ãŒä¸è¶³ã—ã¦ã„るよã†ã§ã™ã€‚ If you select NO, maybe the QSO will not be imported. NOã‚’é¸æŠžã—ãŸå ´åˆã€ã‚‚ã—ã‹ã—ãŸã‚‰QSOãŒã‚¤ãƒ³ãƒãƒ¼ãƒˆã•れãªã„ã‹ã‚‚ã—れã¾ã›ã‚“。 - The band missing and the following call: KLog - Error KLog - エラー The selected log does not exist, please check it again. é¸æŠžã—ãŸãƒ­ã‚°ãŒå­˜åœ¨ã—ãªã„ã®ã§ã€ã‚‚ã†ä¸€åº¦ç¢ºèªã—ã¦ãã ã•ã„。 The file %1 can't be opened. ファイル%1 cã‚’é–‹ãã“ã¨ãŒã§ãã¾ã›ã‚“。 KLog - Don't ask again KLog - Don't ask again Do you want to reuse your answer? ç­”ãˆã‚’å†åˆ©ç”¨ã—ãŸã„ã¨æ€ã„ã¾ã™ã‹ï¼Ÿ KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again. KLogã¯ã€åŒæ§˜ã®äº‹æ…‹ãŒç™ºç”Ÿã—ãŸå ´åˆã€å†åº¦è³ªå•ã™ã‚‹ã“ã¨ãªãã€å‰å›žã®å›žç­”を自動的ã«ä½¿ç”¨ã—ã¾ã™ã€‚ <ul><li>Date/Time:</i> %1</li><li>Callsign: %2</li><li>Band: %3</li><li>Mode: %4</li></ul> <ul><li><i>日付/時間: </i>%1</li><li>コールサイン: %2</li><li>ãƒãƒ³ãƒ‰ï¼š %3</li><li>モード: %4</li></ul> KLog - QSO not found KLog - QSOãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ Do you want to add this QSO to the log?: ã“ã®QSOをログã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ We have found a QSO coming from LoTW that is not in your local log. Do you want KLog to add this QSO to the log? ã‚ãªãŸã®ãƒ­ãƒ¼ã‚«ãƒ«ãƒ­ã‚°ã«ã¯ãªã„ã€LoTWã‹ã‚‰æ¥ãŸQSOを発見ã—ã¾ã—ãŸã€‚ KLogã«ã“ã®QSOをログã«è¿½åŠ ã•ã›ã¾ã™ã‹ï¼Ÿ KLog - Invalid call detected KLog - 無効ãªcallãŒæ¤œå‡ºã•れã¾ã—㟠An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported log file? 空ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ãŒæ¤œå‡ºã•れã¾ã—ãŸã€‚ã“ã®QSOã‚’ãã®ã¾ã¾ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã™ã‚‹ã‹ï¼ˆã€Œã¯ã„ã€ã‚’クリック)ã€ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã—ãŸãƒ­ã‚°ãƒ•ァイルã‹ã‚‰ã“ã®ãƒ•ィールドを削除ã—ã¾ã™ã‹ï¼Ÿ An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log file? 無効ãªã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ãŒæ¤œå‡ºã•れã¾ã—㟠%1。ã“ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’エクスãƒãƒ¼ãƒˆã™ã‚‹ã‹ï¼ˆ[ã¯ã„]をクリック)ã€ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã•れãŸãƒ­ã‚°ãƒ•ァイルã‹ã‚‰é€šè©±ã‚’削除ã—ã¾ã™ã‹ï¼Ÿ Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. You can, however, edit the ADIF file once the export process is finished. é–“é•ã£ãŸã‚³ãƒ¼ãƒ«ã‚’エクスãƒãƒ¼ãƒˆã™ã‚‹ã¨ã€ã“ã®ãƒ­ã‚°ãƒ•ァイルをインãƒãƒ¼ãƒˆã™ã‚‹å¯èƒ½æ€§ã®ã‚ã‚‹ アプリケーションã§å•題ãŒç™ºç”Ÿã™ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ã—ã‹ã—ã€è‰¯ã„コールサインãŒKLogã«ã‚ˆã£ã¦æœ‰åйã§ã¯ãªã„ã¨èª¤ã£ã¦èªè­˜ã•れã¦ã„ã‚‹å¯èƒ½æ€§ã‚‚ã‚りã¾ã™ã€‚ãŸã ã—ã€ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆå‡¦ç†ãŒçµ‚了ã™ã‚‹ã¨ã€ADIFファイルを編集ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ KLog - User cancelled KLog - ユーザーãŒã‚­ãƒ£ãƒ³ã‚»ãƒ«ã—㟠The selected callsign (%1) is not valid, please check it again to export the log. é¸æŠžã•れãŸã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ï¼ˆ%1ï¼‰ã¯æœ‰åйã§ã¯ã‚りã¾ã›ã‚“。ログをエクスãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã«ã‚‚ã†ä¸€åº¦ç¢ºèªã—ã¦ãã ã•ã„。 There are no QSOs pending to be exported with that station callsign. ãã®å±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã§ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã«ä¿ç•™ã•れã¦ã„ã‚‹QSOã¯ã‚りã¾ã›ã‚“。 Export エクスãƒãƒ¼ãƒˆ Export progress 輸出ã®é€²æ—çŠ¶æ³ KLog - File not opened KLog - ファイルãŒé–‹ã‹ãªã„ It was not possible to open the file %1 for reading. 読ã¿è¾¼ã¿ã«%1ã‚’é–‹ãã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ KLog was not able to read the LoTW file KLogãŒLoTWファイルを読ã‚ãªã‹ã£ãŸ Processing LoTW ADIF file... LoTW ADIFファイルã®å‡¦ç†... Abort processing 処ç†ã‚’中止ã™ã‚‹ LoTW reading LoTWã®èª­ã¿æ–¹ KLog - Add new QSOs? KLog - æ–°ã—ã„QSOを追加ã—ã¾ã™ã‹ï¼Ÿ Do you want to add non existing QSOs to your local log? 既存ã®QSO以外ã®QSOをローカルログã«è¿½åŠ ã—ãŸã„ã§ã™ã‹ï¼Ÿ There are some QSOs in the LoTW log that are not in your local log. LoTWã®ãƒ­ã‚°ã«ã¯ã€ã‚ãªãŸã®ãƒ­ãƒ¼ã‚«ãƒ«ãƒ­ã‚°ã«ã¯ãªã„QSOãŒã‚りã¾ã™ã€‚ Processing LoTW ADIF file...... QSO: %1 / %2 LoTW ADIFファイルã®å‡¦ç†...... QSO: %1 / %2 You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated. LoTWã®å‡¦ç†ã‚’キャンセルã—ã¾ã—ãŸã€‚処ç†ãŒåœæ­¢ã•れるãŸã‚ã€ãƒ­ã‚°ãŒå®Œå…¨ã«æ›´æ–°ã•れãªã„å ´åˆãŒã‚りã¾ã™ã€‚ Importing LoTW ADIF file... LoTW ADIFファイルã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ... There is more than one log in this logfile. ã“ã®ãƒ­ã‚°ãƒ•ァイルã«ã¯ã€è¤‡æ•°ã®ãƒ­ã‚°ãŒå­˜åœ¨ã—ã¾ã™ã€‚ All logs will be imported into the current log. ã™ã¹ã¦ã®ãƒ­ã‚°ãŒç¾åœ¨ã®ãƒ­ã‚°ã«å–り込ã¾ã‚Œã¾ã™ã€‚ Do you want to continue? 続行ã—ã¾ã™ã‹ï¼Ÿ Do you want to add dupe QSOs to your local log? 自分ã®ãƒ­ãƒ¼ã‚«ãƒ«ãƒ­ã‚°ã«é‡è¤‡ QSOを追加ã—ãŸã„ã§ã™ã‹ï¼Ÿ There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date. ã“ã®ãƒ­ã‚°ãƒ•ァイルã®ä¸­ã«ã¯ã€ã‚³ãƒ¼ãƒ«ã€ãƒãƒ³ãƒ‰ã€ãƒ¢ãƒ¼ãƒ‰ãŒåŒã˜ã§ã€æ—¥ä»˜ã‚‚éžå¸¸ã«è¿‘ã„ãŸã‚ã€ãƒ€ãƒ–ã£ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹QSOã‚‚ã‚りã¾ã™ã€‚ Importing ADIF file... ADIFファイルã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ... KLog - Duplicated QSOs KLog - é‡è¤‡ã—ãŸQSO Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. 「ã¯ã„ã€ã‚’クリックã™ã‚‹ã¨ã€åŒæ§˜ã®å•題を抱ãˆã‚‹ã™ã¹ã¦ã®QSOã«ãƒ‡ãƒ•ォルトã®%1 forモード%2ãŒè¿½åŠ ã•れã¾ã™ã€‚ KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO with %1 on %2: KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO on %1: Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. ã“ã®ãƒ­ã‚°ã®ã„ãã¤ã‹ã®QSO (例: %1) ã§ã¯ã€RST-RX情報ãŒä¸è¶³ã—ã¦ã„るよã†ã§ã™ã€‚ KLog - Apply to all QSOs in this log? KLog - ã“ã®ãƒ­ã‚°ã®ã™ã¹ã¦ã®QSOã«é©ç”¨ã—ã¾ã™ã‹ï¼Ÿ KLog - No Station callsign entered. KLog - ステーションコールサインãŒå…¥åŠ›ã•れã¦ã„ã¾ã›ã‚“。 KLog - QSO without Station Callsign KLog - å±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ãªã—ã®QSO It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) インãƒãƒ¼ãƒˆã—ã¦ã„ã‚‹ADIFファイルã®ä¸­ã«ã€é‡è¤‡ã™ã‚‹QSOãŒã‚るよã†ã§ã™ã€‚ã“ã®ã¾ã¾ç¶šã‘ã¾ã™ã‹ï¼Ÿ(é‡è¤‡ã—ãŸQSOã¯ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•れã¾ã›ã‚“)。 This QSO is not including the minimum data to consider a QSO as valid! ã“ã®QSOã«ã¯ã€QSOを有効ã¨ã¿ãªã™ãŸã‚ã®æœ€ä½Žé™ã®ãƒ‡ãƒ¼ã‚¿ãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“ï¼ - The mode missing and the following call: - The date missing and the following call: - The time missing and the following call: KLog: Not all required data found! KLog; データã®ä¸è¶³ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ! KLog: No RST TX found! KLog: RST TXãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“! KLog: No RST RX found! KLog: RST RXãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“! HamLibNetworkConfigWidget Enter the hostname or address of the radio. 無線機ã®ãƒ›ã‚¹ãƒˆåã¾ãŸã¯ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’入力ã—ã¦ãã ã•ã„。 Set de network port of the radio. 無線機ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒãƒ¼ãƒˆã‚’設定ã—ã¾ã™ã€‚ Host/Address ホスト/アドレス Port Enter the port of the radio. 無線機ã®ãƒãƒ¼ãƒˆã‚’入力ã—ã¾ã™ã€‚ HamLibSerialConfigWidget Bauds Select the serial port speed. シリアルãƒãƒ¼ãƒˆã®é€Ÿåº¦ã‚’é¸æŠžã—ã¾ã™ã€‚ Port Select the serial port. Only the serial ports that are detected are shown. シリアルãƒãƒ¼ãƒˆã‚’é¸æŠžã—ã¾ã™ã€‚検出ã•れãŸã‚·ãƒªã‚¢ãƒ«ãƒãƒ¼ãƒˆã®ã¿ãŒè¡¨ç¤ºã•れã¾ã™ã€‚ Scan スキャン Click to identify the serial ports available in your computer. クリックã™ã‚‹ã¨ã€ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ューターã§åˆ©ç”¨å¯èƒ½ãªã‚·ãƒªã‚¢ãƒ«ãƒãƒ¼ãƒˆãŒè¡¨ç¤ºã•れã¾ã™ã€‚ 5 bits 6 bits 7 bits 8 bits Data bits Select the serial data bits. None ãªã— Hardware Software XON/XOFF Flow control Select the serial flow control シリアルフローコントロールã®é¸æŠž No parity Even Odd Space Mark Parity Select the serial parity. 1 bit 1.5 bits 2 bits Stop bits Select the serial stop bits. シリアルストップビットã®é¸æŠž InfoWidget 10M 15M 20M 40M 80M 160M 2M 6M 12M 17M 30M 70CM Continent 大陸å Prefix プリフィクス CQ CQ ITU Short Path ショートパス Long Path ロングパス Deg Miles マイル Km IntroPage Welcome to KLog! KLogã«ã‚ˆã†ã“ã! Welcome to KLog! - brought to you under the terms of the GPL! よã†ã“ãã€KLogã«! - GPLæ¡é …ã«ã‚‚ã¨ã¥ã„ã¦ãŠå±Šã‘ã—ã¾ã™! Welcome to KLog KLog ã«ã‚ˆã†ã“ã KLogã«ã‚ˆã†ã“ã This looks like it's the first time you've run KLog on this computer. ã“ã®ã‚³ãƒ³ãƒ”ューターã§KLogを実行ã™ã‚‹ã®ã¯åˆã‚ã¦ã®ã‚ˆã†ã§ã™. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. KLogã¯ã€GNU/Linuxã€macOSã€Windowsã§å‹•作ã™ã‚‹ãƒ•リーã®ãƒãƒ ãƒ©ã‚¸ã‚ªãƒ­ã‚°ãƒ—ログラムã§ã™ã€‚ KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. It is designed to provide general purpose DX, and contest logging. 一般的ãªDXã€ã‚³ãƒ³ãƒ†ã‚¹ãƒˆã®ãƒ­ã‚®ãƒ³ã‚°ãŒã§ãるよã†ã«è¨­è¨ˆã•れã¦ã„ã¾ã™ã€‚ It supports QSL management, import and export of ADIF QSL管ç†ã€ADIFã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆãƒ»ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã™ and Cabrillo file formats and many other features... ã¾ãŸQSLカードã®ç®¡ç†ãªã©ã€å¤šãã®æ©Ÿèƒ½ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã™... Before you can start using KLog, you will be asked to: KLogを使ã„å§‹ã‚ã‚‹å‰ã«ã€ä»¥ä¸‹ã®è³ªå•ã«ãŠç­”ãˆãã ã•ã„: Acknowledge to the terms of the license. ライセンスæ¡é …ã¸ã®åŒæ„. Download the DX entities information. DXã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ã®æƒ…報をダウンロード Enter your callsign, CQ zone, etc. and main configuration. コールサインã€CQゾーンã€ãã®ä»–ã€å¤šãã®è¨­å®šé …目。 Enjoy KLog and contact the development team if you have any suggestions! KLogã‚’ãŠæ¥½ã—ã¿ãã ã•ã„. ã”ææ¡ˆãªã©ãŒã‚れã°ã€é–‹ç™ºãƒãƒ¼ãƒ ã«ã”連絡ãã ã•ã„! LicPage KLog License information KLogライセンス情報 Welcome to KLog!- brought to you under the terms of the GPL! よã†ã“ãã€KLogã«! - GPLæ¡é …ã«ã‚‚ã¨ã¥ã„ã¦ãŠå±Šã‘ã—ã¾ã™! Acknowledge åŒæ„ã—ã¾ã™ Be aware that KLog is free software. KLogã¯ãƒ•リーソフトウェアã§ã™. LoTWUtilities KLog - LoTW password needed KLog - LoTWã®ãƒ‘スワードãŒå¿…è¦ Please enter your LoTW password: LoTWã®ãƒ‘スワードを入力ã—ã¦ãã ã•ã„ Are you sure that you want to use that station callsign (%1)? 本当ã«ãã®å±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ï¼ˆ%1)を使ã„ãŸã„ã®ã§ã™ã‹ï¼Ÿ There is a file already existing with the name that will be used. 使用ã•れるåå‰ã®ãƒ•ァイルãŒã™ã§ã«å­˜åœ¨ã—ã¦ã„ã¾ã™ã€‚ The file %1 already exist. Do you want to overwrite? ファイル %1 ã¯ã™ã§ã«å­˜åœ¨ã—ã¦ã„ã¾ã™ã€‚上書ãã—ã¾ã™ã‹ï¼Ÿ KLog was not able to save the file %1. Error returned: %2 KLog ã¯ãƒ•ァイル %1 ã‚’ä¿å­˜ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ エラーãŒè¿”ã•れã¾ã—ãŸ: %2 Downloading data to file: %1. データをファイルã«ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¦ã„ã¾ã™ã€‚%1. KLog - LoTW download KLog - LoTW ダウンロード This is the first date of a QSO with the callsign %1 in this log If you think that in LoTW you may have previous QSOs, answer No. ã“れã¯ã€ã“ã®ãƒ­ã‚°ã§ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³%1ã®QSOを行ã£ãŸæœ€åˆã®æ—¥ä»˜ã§ã™ ã‚‚ã—ã€LoTWã§ã¯ä»¥å‰ã®QSOãŒã‚ã‚‹ã‹ã‚‚ã—れãªã„ã¨æ€ã†ãªã‚‰ã€Noã¨ç­”ãˆã¦ãã ã•ã„。 Do you want to use this date (%1) as start date? ã“ã®æ—¥ä»˜ (%1) ã‚’é–‹å§‹æ—¥ã¨ã—ã¦ä½¿ç”¨ã—ã¾ã™ã‹ï¼Ÿ The remote server redirected our connection to %1 リモート・サーãƒãŒæŽ¥ç¶šã‚’ %1 ã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã—ã¾ã—㟠Do you want to follow the redirection? リダイレクションã«å¾“ã„ã¾ã™ã‹ï¼Ÿ It was not possible for find the file %1 that has been just downloaded. ダウンロードã•れãŸã°ã‹ã‚Šã®ãƒ•ァイル %1 を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ It seems that LoTW has no QSO with the Station Callsign you are using (%1). ã‚ãªãŸãŒä½¿ç”¨ã—ã¦ã„ã‚‹å±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ï¼ˆ%1)ã§ã®QSOãŒã€LoTWã«ã¯ãªã„よã†ã§ã™ã€‚ Try again and send the downloaded file (%1) to the KLog developer for analysis. ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ã€ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ãŸãƒ•ァイル(%1)ã‚’KLog開発者ã«é€ã£ã¦è§£æžã—ã¦ãã ã•ã„。 KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data? KLog 㯠%1 QSO ã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã«æˆåŠŸã—ã¾ã—ãŸã€‚ダウンロードã—ãŸãƒ‡ãƒ¼ã‚¿ã§ãƒ­ã‚°ã‚’æ›´æ–°ã—ã¾ã™ã‹ï¼Ÿ KLog - LoTW File already exists KLog - LoTWãƒ•ã‚¡ã‚¤ãƒ«ã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™ Double click on the date that you want to use as the start date for downloading QSOs. QSOダウンロードã®é–‹å§‹æ—¥ã¨ã—ã¦ä½¿ç”¨ã—ãŸã„日付をダブルクリックã—ã¾ã™ã€‚ KLog - LoTW Station callsign KLog - LoTWステーションã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ There is not a single QSO in the log with that station callsign. ãã®å±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã§ã®QSOã¯ä¸€åº¦ã‚‚ãƒ­ã‚°ã«æ®‹ã£ã¦ã„ãªã„。 KLog - LoTW Can't write the file KLog - LoTW ãƒ•ã‚¡ã‚¤ãƒ«ã®æ›¸ãè¾¼ã¿ãŒã§ããªã„ The file %1 already exists. ファイル %1 ã¯æ—¢ã«å­˜åœ¨ã—ã¦ã„ã¾ã™ã€‚ KLog - LoTW Start date selection KLog - LoTW é–‹å§‹æ—¥é¸æŠž KLog - LoTW Download error KLog - LoTW ダウンロードエラー There was an error (%1) while downloading the file from LoTW. LoTWã‹ã‚‰ãƒ•ァイルをダウンロード中ã«ã‚¨ãƒ©ãƒ¼ï¼ˆ%1)ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ The downloading error details are: %1 ダウンロードエラーã®è©³ç´°ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™ã€‚%1 KLog - LoTW Redirection found KLog - LoTWリダイレクション発見 KLog - LoTW File not found KLog - LoTW ファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ KLog can't find the downloaded file. KLogã¯ã€ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ãŸãƒ•ァイルを見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 KLog - LoTW user/password error KLog - LoTWã®ãƒ¦ãƒ¼ã‚¶ãƒ¼/パスワードエラー LoTW server did not recognized your user/password LoTWサーãƒãƒ¼ãŒã‚ãªãŸã®ãƒ¦ãƒ¼ã‚¶ãƒ¼/パスワードをèªè­˜ã—ã¾ã›ã‚“ã§ã—㟠Check your user and password and ensure your are using the right one before trying again. ユーザーåã¨ãƒ‘スワードを確èªã—ã€æ­£ã—ã„ã‚‚ã®ã‚’使用ã—ã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ãŸä¸Šã§ã€å†åº¦ãŠè©¦ã—ãã ã•ã„。 KLog - LoTW No QSOs KLog - LoTW No QSOs LoTW sent no QSOs LoTWã¯QSOã‚’é€ã‚‰ãªã‹ã£ãŸ KLog - LoTW Unknown error KLog - LoTW Unknownエラー KLog can't recognize the file that has been downloaded from LoTW. KLogã¯ã€LoTWã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ãŸãƒ•ァイルをèªè­˜ã§ãã¾ã›ã‚“。 Now KLog will process the downloaded QSO and update your local log. ã“れã§ã€KLogã¯ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ãŸQSOを処ç†ã—ã€ãƒ­ãƒ¼ã‚«ãƒ«ãƒ­ã‚°ã‚’æ›´æ–°ã—ã¾ã™ã€‚ LogWindow QSL Send QSLカードã®é€ä»˜ QSL Rcvd QSLå—é ˜çŠ¶æ³ &Delete 削除(&D) Delete a QSO QSOã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚’削除ã—ã¾ã™ &Edit QSO QSOã®ç·¨é›†(&E) Edit this QSO QSOã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚’編集ã—ã¾ã™ Via &bureau ビューロー経由(&b) Send this QSL via bureau QSLカードをビューロー経由ã§é€ã‚Šã¾ã™ D&irect ダイレクト(&i) Send this QSL via direct QSLカードをダイレクトã§é€ã‚Šã¾ã™ Via bureau ビューロー経由 QSL &received via bureau QSLカードをビューロー経由ã§å—ã‘å–りã¾ã—ãŸã€‚(&r) Direct ダイレクト QSL received via direc&t QSLカードをダイレクトã§å—ã‘å–りã¾ã—ãŸã€‚(&t) Check in QRZ.com QRZ.comã§ãƒã‚§ãƒƒã‚¯ Check this callsign in QRZ.com æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’自動ã§ãƒã‚§ãƒƒã‚¯ã™ã‚‹ (&C) Check in DXHeat.com DXHeat.comã«ãƒã‚§ãƒƒã‚¯ã‚¤ãƒ³ Check this callsign in DXHeat.com DXHeat.comã§ã“ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’確èªã™ã‚‹ Delete selected QSOs é¸æŠžã—ãŸQSOã®å‰Šé™¤ Delete the selected QSOs é¸æŠžã—ãŸQSOã®å‰Šé™¤ Export to ADIF ADIFã¸ã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ Export the selected QSOs to an ADIF file. é¸æŠžã—ãŸQSOã‚’ADIFãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ã出ã™ã€‚ Upload to LoTW LoTWã¸ã®ã‚¢ãƒƒãƒ—ロード Upload the selected QSOs to LoTW é¸ã‚“ã QSOã‚’LoTWã«ã‚¢ãƒƒãƒ—ロード Upload to ClubLog Clublogã¸ã®ã‚¢ãƒƒãƒ—ロード Upload the selected QSOs to ClubLog é¸ã‚“ã QSOã‚’ClubLogã«ã‚¢ãƒƒãƒ—ロード Upload to eQSL.cc eQSL.ccã¸ã®ã‚¢ãƒƒãƒ—ロード Upload the selected QSOs to eQSL.cc é¸æŠžã—ãŸQSOã‚’eQSL.ccã«ã‚¢ãƒƒãƒ—ロードã™ã‚‹ Send these QSLs via bureau ã“れらã®QSLをビューロー経由ã§é€ã‚‹ Send these QSLs via direct ã“れらã®QSLをダイレクトã«é€ã‚‹ QSLs received via bureau ビューロー経由ã§å—ä¿¡ã—ãŸQSL QSLs received via direc&t QSLã¯direc&tã§å—信。 Select none é¸æŠžè§£é™¤ Remove all selections ã™ã¹ã¦ã®é¸æŠžé …目を削除 Select all ã™ã¹ã¦é¸æŠž Select all the QSOs ã™ã¹ã¦ã®QSOã‚’é¸æŠž MainQSOEntryWidget &Add 追加(&A) &Clear クリア(&C) Callsign of the QSO. QSOã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ Band of the QSO. QSOã®ãƒãƒ³ãƒ‰ Mode of the QSO. QSOã®ãƒ¢ãƒ¼ãƒ‰ã€‚ Date of the QSO. QSOã®æ—¥ä»˜ã€‚ Time of the QSO. QSOã®æ™‚間。 Add the QSO to the log. QSOをログã«è¿½åŠ ã™ã‚‹ã€‚ Clears the QSO entry. QSOエントリーをクリアã—ã¾ã™ã€‚ Look up info about the current callsign on qrz.com KLog will show real time if enabled. KLogãŒæœ‰åйã«ãªã£ã¦ã„れã°ã€ãƒªã‚¢ãƒ«ã‚¿ã‚¤ãƒ ã§è¡¨ç¤ºã•れã¾ã™ã€‚ Real time リアルタイム Stop wsjt-x and hamlib from automatically updating QSO information. Manual Mode Callsign コールサイン &Save &Cancel キャンセル(&C) DUPE Translator: DUPE is a common world for hams. Do not translate of not sure DUPE MainWindow Starting KLog KLogã®é–‹å§‹ DX Entity DX エンティティ &Log Window &Logウィンドウ KLog KLog It seems that you have never done a backup or exported your log to ADIF. ログã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‚„ADIFã¸ã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã‚’ã—ãŸã“ã¨ãŒãªã„よã†ã§ã™ã­ã€‚ It was not possible to open the debug file for writing. No debug log will be saved! 書ãè¾¼ã¿ç”¨ã®ãƒ‡ãƒãƒƒã‚°ãƒ•ァイルを開ãã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚デãƒãƒƒã‚°ãƒ­ã‚°ã¯ä¿å­˜ã•れã¾ã›ã‚“ Status bar ... ステータスãƒãƒ¼ ... It was not possible to define the KLog folder. Some functions may not work properly! KLog - CTY.dat update KLog - CTY.datã®æ›´æ–° It seems that the latest backup you did is older than one month. ã‚ãªãŸãŒè¡Œã£ãŸæœ€æ–°ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¯ã€1ヶ月よりもå¤ã„よã†ã§ã™ã€‚ Log backup recommended! ログã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—を推奨ã—ã¾ã™ã€‚ It is a good practice to backup your full log regularly to avoid loosing data in case of a problem. Once you export your log to an ADIF file, you should copy that file to a safe place, like an USB drive, cloud drive, another computer, ... KLog will remind you to backup on a monthly basis. å•題ãŒç™ºç”Ÿã—ãŸã¨ãã«ãƒ‡ãƒ¼ã‚¿ãŒå¤±ã‚れãªã„よã†ã«ã€ãƒ•ルログを定期的ã«ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ ログをADIFファイルã«ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã—ãŸã‚‰ã€ãã®ãƒ•ァイルをUSBドライブã€ã‚¯ãƒ©ã‚¦ãƒ‰ãƒ‰ãƒ©ã‚¤ãƒ–ã€åˆ¥ã®ã‚³ãƒ³ãƒ”ューターãªã©ã€å®‰å…¨ãªå ´æ‰€ã«ã‚³ãƒ”ーã—ã¦ãã ã•ã„...。 KLogã¯æ¯Žæœˆãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‚’å–るよã†ã«ä¿ƒã—ã¦ãれã¾ã™ã€‚ KLog - Backup KLog - ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ— KLog - New version detected! KLog - æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’検出ã—ã¾ã—㟠Ready 使用å¯èƒ½ An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: QSOをログã«è¿½åŠ ã—よã†ã¨ã—ãŸã¨ãã«äºˆæœŸã›ã¬ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ãれã§ã‚‚å•題ãŒè§£æ±ºã—ãªã„å ´åˆã¯ã€é–‹ç™ºè€…ã«é€£çµ¡ã—ã¦è§£æžã‚’ä¾é ¼ã—ã¦ãã ã•ã„。 KLog - Not valid call KLog - 無効ãªé€šè©± Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. 有効ã§ãªã„通話をログã«è¿½åŠ ã™ã‚‹ã¨ã€ã‚¢ãƒ¯ãƒ¼ãƒ‰ã®ç”³è«‹ã‚„ADIFファイルを他ã®ã‚·ã‚¹ãƒ†ãƒ ã‚„アプリケーションã«ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã™ã‚‹éš›ã«å•題ãŒç™ºç”Ÿã™ã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚ You have selected an entity: ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ã‚’é¸æŠžã—ã¾ã—ãŸã€‚ that is different from the KLog proposed entity: KLogææ¡ˆã®ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ã¨ã¯ç•°ãªã‚‹ã‚‚ã®ã§ã™ã€‚ Click on the prefix of the correct entity or Cancel to edit the QSO again. æ­£ã—ã„エンティティã®ãƒ—レフィックスをクリックã™ã‚‹ã‹ã€ã€Œã‚­ãƒ£ãƒ³ã‚»ãƒ«ã€ã‚’クリックã—ã¦QSOã‚’å†åº¦ç·¨é›†ã—ã¾ã™ã€‚ No DXCC DXCCãªã— None ãªã— Click on the prefix of the right entity or Cancel to correct. æ­£ã—ã„ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ã®æŽ¥é ­è¾žã‚’ã‚¯ãƒªãƒƒã‚¯ã™ã‚‹ã‹ã€ä¿®æ­£ã™ã‚‹å ´åˆã¯ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã—ã¦ãã ã•ã„。 KLog - ClubLog error KLog - ClubLogã®ã‚¨ãƒ©ãƒ¼ KLog - eQSL error KLog - eQSLエラー KLog - %1 KLog - %1 Settings ... 設定 ... Queue all QSOs from this log to be sent Download from LoTW ... LoTWã‹ã‚‰ã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ ... Download the full log from LoTW ... LoTWã‹ã‚‰ãƒ•ルログをダウンロード ... ClubLog tools ... Clublogツール ... Upload the queued QSOs to ClubLog ... キューイングã•れãŸQSOã‚’ClubLogã«ã‚¢ãƒƒãƒ—ロードã™ã‚‹ ... eQSL tools ... eQSLツール ... Upload the queued QSOs to eQSL.cc ... キューイングã•れãŸQSOã‚’eQSL.ccã«ã‚¢ãƒƒãƒ—ロード ... QRZ.com tools ... QRZ.comã®ãƒ„ール ... Do you really want to mark ALL the QSOs of this log to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. 本当ã«ã“ã®ãƒ­ã‚°ã®å…¨ã¦ã®QSOをアップロードã™ã‚‹ã‚ˆã†ã«ãƒžãƒ¼ã‚¯ã—ã¾ã™ã‹ï¼Ÿã“ã®QSOã‚’åˆã‚ã¦LoTWã«ã‚¢ãƒƒãƒ—ロードã™ã‚‹å ´åˆã®ã¿ã€è¡Œã†å¿…è¦ãŒã‚りã¾ã™ã€‚ Your log has been updated with the LoTW downloaded QSOs. ã‚ãªãŸã®ãƒ­ã‚°ã«ã¯ã€LoTWダウンロードã—ãŸQSOãŒæ›´æ–°ã•れã¦ã„ã¾ã™ã€‚ KLog has updated %1 QSOs from LoTW. KLogã¯ã€LoTWã‹ã‚‰ã®QSOã‚’%1æ›´æ–°ã—ã¾ã—ãŸã€‚ Do you really want to mark ALL pending QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. 本当ã«ã™ã¹ã¦ã®ä¿ç•™ä¸­ã®QSOをアップロードã™ã‚‹ã‚ˆã†ã«ãƒžãƒ¼ã‚¯ã—ã¾ã™ã‹ï¼Ÿåˆã‚ã¦LoTWã«ã‚¢ãƒƒãƒ—ロードã™ã‚‹å ´åˆã®ã¿è¡Œã£ã¦ãã ã•ã„。 There was a problem to mark all pending QSOs as queued for LoTW! ä¿ç•™ä¸­ã®ã™ã¹ã¦ã®QSOã‚’LoTWã®ã‚­ãƒ¥ãƒ¼ã«å…¥ã‚Œã‚‹ã“ã¨ã«å•題ãŒã‚りã¾ã—ãŸã€‚ All queued QSOs of this log has been marked as sent to LoTW! ã“ã®ãƒ­ã‚°ã®ã™ã¹ã¦ã®ã‚­ãƒ¥ãƒ¼ã‚¤ãƒ³ã‚°ã•れãŸQSOã¯ã€LoTWã«é€ä¿¡ã•れãŸã‚‚ã®ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã•れã¦ã„ã¾ã™ã€‚ There was a problem to mark all queued QSOs as sent to LoTW! キューã«å…¥ã£ã¦ã„ã‚‹ã™ã¹ã¦ã®QSOã‚’LoTWã¸ã®é€ä¿¡ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã™ã‚‹å•題ãŒã‚りã¾ã—ãŸã€‚ No QSOs have been exported to ADIF. ADIFã«ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã•れãŸQSOã¯ã‚りã¾ã›ã‚“。 KLog has exported %1 QSOs to the ADIF file: %2 KLog ã¯ã€%1 QSO ã‚’ ADIF ファイルã«ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã—ã¾ã—ãŸã€‚%2 You need to select one station callsign to be able to send your log to LoTW. LoTWã«ãƒ­ã‚°ã‚’é€ä¿¡ã™ã‚‹ãŸã‚ã«ã¯ã€1å±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’é¸æŠžã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ There was an error while updating to Yes the LoTW QSL sent information. LoTWã®QSLé€ä¿¡æƒ…報をYesã«æ›´æ–°ã™ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ KLog - Select the Station Callsign. KLog - ステーションã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’é¸æŠžã—ã¾ã™ã€‚ The log is ready to be uploaded to QRZ.com. ã“れã§ãƒ­ã‚°ã‚’QRZ.comã«ã‚¢ãƒƒãƒ—ロードã™ã‚‹æº–å‚™ãŒæ•´ã„ã¾ã—ãŸã€‚ All the QSOs in this log has been marked as Modified in the QRZ.com status field ã“ã®ãƒ­ã‚°ã®ã™ã¹ã¦ã®QSOã¯ã€QRZ.comã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹æ¬„ã«ã€ŒModifiedã€ã¨è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚ KLog could not mark the full log to be sent to QRZ.com KLogã¯QRZ.comã«é€ä¿¡ã™ã‚‹ãƒ•ルログをマークã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ To upload QSOs you need a qrz.com subscription. If you have one, go to Setup->QRZ.com tab to enable it. RSTrx å—ä¿¡RST RSTtx é€ä¿¡RST Do you really want to exit KLog? 本当ã«KLogを終了ã—ãŸã„ã®ã§ã™ã‹ï¼Ÿ KLog - File not open KLog - ファイルãŒé–‹ã‹ãªã„ KLog - Unexpected error KLog - 予期ã›ã¬ã‚¨ãƒ©ãƒ¼ KLog - Select correct entity KLog - æ­£ã—ã„エンティティã®é¸æŠž KLog - Exit KLog - Exit &File &ファイル Import an ADIF file into the current log. ADIFファイルをカレントログã«å–り込む。 Export the current log to an ADIF logfile. ç¾åœ¨ã®ãƒ­ã‚°ã‚’ADIFログファイルã«ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. ã™ã¹ã¦ã®QSOã‚’1ã¤ã®ADIFファイルã«ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã—ã€ã™ã¹ã¦ã®ãƒ­ã‚°ã®QSOをマージã—ã¾ã™ã€‚ Print your log. ログをå°åˆ·ã™ã‚‹ã€‚ KLog folder KLogフォルダ Opens the data folder of KLog. KLogã®ãƒ‡ãƒ¼ã‚¿ãƒ•ォルダを開ãã¾ã™ã€‚ E&xit 終了(&x) &Tools ツール Fill in QSO data QSOデータã®è¨˜å…¥ Go through the log reusing previous QSOs to fill missing information in other QSOs. éŽåŽ»ã®QSOã‚’å†åˆ©ç”¨ã—ã¦ã€ä»–ã®QSOã§ä¸è¶³ã—ã¦ã„る情報を埋ã‚ã‚‹ãŸã‚ã«ã€ãƒ­ã‚°ã‚’確èªã™ã‚‹ã€‚ Shows QSOs for which you should send your QSL and request the DX QSL. ã‚ãªãŸãŒQSLã‚’é€ã‚‹ã¹ãQSOを表示ã—ã€DX QSLã‚’è¦æ±‚ã—ã¾ã™ã€‚ Find My-QSLs pending to send é€ä¿¡å¾…ã¡ã®My-QSLを探㙠Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! QSLé€ä¿¡ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒä¿ç•™ã•れã¦ã„ã‚‹QSOを表示ã—ã¾ã™ã€‚ã“ã®ã‚­ãƒ¥ãƒ¼ã¯ç©ºã«ã—ã¦ãŠãã¹ãã§ã™! Mark all queued QSOs in this log as sent to LoTW. ã“ã®ãƒ­ã‚°ã®ã™ã¹ã¦ã®ã‚­ãƒ¥ãƒ¼ã‚¤ãƒ³ã‚°ã•れãŸQSOã‚’ã€LoTWã¸ã®é€ä¿¡ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã—ã¾ã™ã€‚ Mark all queued QSOs as sent to LoTW. キューã«å…¥ã£ã¦ã„ã‚‹ã™ã¹ã¦ã®QSOã‚’ã€LoTWã¸ã®é€ä¿¡ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã—ã¾ã™ã€‚ For updated DX-Entity data, update cty.csv. DX-Entityã®ãƒ‡ãƒ¼ã‚¿ã‚’æ›´æ–°ã™ã‚‹ã«ã¯ã€cty.csvã‚’æ›´æ–°ã—ã¦ãã ã•ã„。 Stats ステータス Show the statistics of your radio activity. ã‚ãªãŸã®ãƒ©ã‚¸ã‚ªæ´»å‹•ã®çµ±è¨ˆæƒ…報を表示ã—ã¾ã™ã€‚ &Help ヘルプ Upload the queued QSOs to LoTW キューイングã•れãŸQSOã‚’LoTWã«ã‚¢ãƒƒãƒ—ロードã™ã‚‹ KLog needs to update the Entities database. KLogã¯Entitiesデータベースを更新ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. ã“ã®æ“作を行ã†ã¨ã€é¸æŠžã—ãŸQSOã¨ãã®é–¢é€£ãƒ‡ãƒ¼ã‚¿ãŒã™ã¹ã¦æ¶ˆåŽ»ã•れã€äºŒåº¦ã¨å¾©å…ƒã§ããªããªã‚Šã¾ã™ã€‚ The QRZ.com upload process has finished with an error and the log was possibly not uploaded. QRZ.comã®ã‚¢ãƒƒãƒ—ロード処ç†ãŒã‚¨ãƒ©ãƒ¼ã§çµ‚了ã—ã¦ã—ã¾ã„ã€ãƒ­ã‚°ãŒã‚¢ãƒƒãƒ—ロードã•れãªã‹ã£ãŸå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? QRZ.comã«ã‚¢ãƒƒãƒ—ロードã—ãŸã™ã¹ã¦ã®QSOを「アップロード完了ã€ã«ã—ã¾ã™ã‹ï¼Ÿ KLog - QRZ.com KLog - QRZ.com There was an error while updating to Yes the QRZ.com QSO upload information. QRZ.comã®QSOアップロード情報をYesã«æ›´æ–°ã™ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ The QRZ.com upload process has finished successfully QRZ.comã®ã‚¢ãƒƒãƒ—ロード処ç†ãŒæ­£å¸¸ã«çµ‚了ã—ã¾ã—ãŸã€‚ Call not found in QRZ.com コールã¯QRZ.comã§ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 KLog - QRZ.com error KLog - QRZ.comã®ã‚¨ãƒ©ãƒ¼ KLog has received an error from QRZ.com. KLogã¯QRZ.comã‹ã‚‰ã‚¨ãƒ©ãƒ¼ãŒå‡ºã¾ã—ãŸã€‚ Queue all the QSOs to be uploaded アップロードã•れるã™ã¹ã¦ã®QSOをキューã«å…¥ã‚Œã‚‹ Queue all the QSO to be uploaded アップロードã•れるã™ã¹ã¦ã®QSOをキューã«å…¥ã‚Œã‚‹ KLog - TQSL KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. TQSLãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ãªã„ã‹ã€KLogãŒTQSLを見ã¤ã‘られã¾ã›ã‚“。設定を確èªã—ã¦ãã ã•ã„。 Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded. エラー1:ユーザーã«ã‚ˆã£ã¦å‡¦ç†ãŒã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•れãŸã‹ã€TQSLãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“ã§ã—ãŸã€‚QSOã¯ã‚¢ãƒƒãƒ—ロードã•れã¾ã›ã‚“ã§ã—ãŸã€‚ Error #2: Upload was rejected by LoTW, please check your data. エラー2:アップロードã¯LoTWã«ã‚ˆã£ã¦æ‹’å¦ã•れã¾ã—ãŸã€‚データをãƒã‚§ãƒƒã‚¯ã—ã¦ãã ã•ã„。 Error #3: The TQSL server returned an unexpected response. エラー3: TQSLサーãƒãŒäºˆæœŸã›ã¬ãƒ¬ã‚¹ãƒãƒ³ã‚¹ã‚’è¿”ã—ã¦ãã¾ã—ãŸã€‚ Error #4: There was a TQSL error. エラー4:TQSLã®ã‚¨ãƒ©ãƒ¼ãŒã‚りã¾ã—ãŸã€‚ Error #5: There was a TQSLLib error. エラー5:TQSLLibã®ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ Error #6: It was not possible to open the input file. エラー6:入力ファイルを開ãã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ Error #7: It was not possible to open the ouput file. エラー7:出力ファイルを開ãã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ Error #8: No QSOs were processed since some QSOs were duplicates or out of date range. エラー8:ã„ãã¤ã‹ã®QSOãŒé‡è¤‡ã—ã¦ã„ãŸã‚Šã€æ—¥ä»˜ã®ç¯„囲外ã§ã‚ã£ãŸãŸã‚ã€QSOãŒå‡¦ç†ã•れã¾ã›ã‚“ã§ã—ãŸã€‚ Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range. エラー9:ã„ãã¤ã‹ã®QSOãŒå‡¦ç†ã•れã€ã„ãã¤ã‹ã®QSOãŒé‡è¤‡ã‚„日付範囲外ã®ãŸã‚ã«ç„¡è¦–ã•れã¾ã—ãŸã€‚ Error #10: Command syntax error. KLog sent a bad syntax command. エラー10:コマンド構文エラー。KLogã¯ä¸æ­£ãªæ§‹æ–‡ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’é€ä¿¡ã—ã¾ã—ãŸã€‚ Error #11: LoTW Connection error (no network or LoTW is unreachable). エラー11:LoTW 接続エラー(ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãŒãªã„ã€ã¾ãŸã¯ LoTW ãŒåˆ°é”ã§ããªã„)。 Error #00: Unexpected error. Please contact the development team. エラー#00: 予期ã›ã¬ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚開発ãƒãƒ¼ãƒ ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 The log that you have selected contains more than just one station callsign. é¸æŠžã—ãŸãƒ­ã‚°ã«ã¯ã€1ã¤ä»¥ä¸Šã®å±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ Please select the station callsign you want to mark as sent to LoTW: LoTWã¸ã®é€ä¿¡ã‚’マークã—ãŸã„å±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’é¸æŠžã—ã¦ãã ã•ã„。 Station Callsign: ç„¡ç·šå±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³(&S) Define Station Callsign 無線局コールサインã®å®šç¾© Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: ã“ã®ãƒ­ã‚°ã«ä½¿ç”¨ã™ã‚‹ç„¡ç·šå±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’入力ã™ã‚‹ã‹ã€ç„¡ç·šå±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ãŒå®šç¾©ã•れã¦ã„ãªã„QSOã®å ´åˆã¯ç©ºæ¬„ã«ã—ã¦ãã ã•ã„。 You have selected no callsign. KLog will complete the QSOs without a station callsign defined and those with the callsign you are entering here. コールサインãªã—ã‚’é¸æŠžã—ã¦ã„ã¾ã™ã€‚KLogã¯ã€å±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ãŒå®šç¾©ã•れã¦ã„ãªã„QSOã¨ã€ã‚ãªãŸãŒã“ã“ã§å…¥åŠ›ã—ãŸã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’æŒã¤QSOを完了ã—ã¾ã™ã€‚ KLog - No station selected KLog - é¸æŠžã•れã¦ã„ãªã„å±€ No station callsign has been selected and therefore no log will be marked ç„¡ç·šå±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ãŒé¸æŠžã•れã¦ã„ãªã„ãŸã‚ã€ãƒ­ã‚°ãŒè¡¨ç¤ºã•れã¾ã›ã‚“。 Congratulations! ãŠã‚ã§ã¨ã†ã”ã–ã„ã¾ã™! You already have the latest version. 最新ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’入手ã—ã¾ã—ãŸ. You can find the KLog data folder here: KLogã®ãƒ‡ãƒ¼ã‚¿ãƒ•ォルダã¯ã“ã¡ã‚‰ã«ã‚りã¾ã™ã€‚ start スタート stop ストップ The selection you have done does not include any QSO The selection you have done does not include any QSO. If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. データベースã«QSOãŒå«ã¾ã‚Œã¦ã„ã‚‹ã®ã¯ç¢ºã‹ãªã®ã«ã€KLogãŒãれを見ã¤ã‘られãªã„å ´åˆã¯ã€é–‹ç™ºè€…(「KLogã«ã¤ã„ã¦ã€å‚照)ã«å•ã„åˆã‚ã›ã¦ãã ã•ã„。 TQSL finished with no error. Do you want to mark as Sent all the QSOs uploaded to LoTW? TQSLã¯ãƒŽãƒ¼ã‚¨ãƒ©ãƒ¼ã§çµ‚了。 LoTWã«ã‚¢ãƒƒãƒ—ロードã•れãŸå…¨ã¦ã®QSOã‚’Sentã¨ã—ã¦ãƒžãƒ¼ã‚¯ã—ã¾ã™ã‹ï¼Ÿ Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1 本当ã«ã™ã¹ã¦ã® QSO をアップロードã™ã‚‹ã‚ˆã†ã«ãƒžãƒ¼ã‚¯ã—ãŸã„ã§ã™ã‹ï¼Ÿåˆã‚ã¦%1ã«QSOをアップロードã™ã‚‹å ´åˆã®ã¿ã€è¡Œã†å¿…è¦ãŒã‚りã¾ã™ã€‚ ClubLog KLog - QRZ.COM QRZ.COM KLog - QSO received Duplicated QSOs have to match another existing QSO with the same call, band, mode, date and time, taking into account the period that can be defined in the settings. 複製ã•れãŸQSOã¯ã€åŒã˜ã‚³ãƒ¼ãƒ«ã€ãƒãƒ³ãƒ‰ã€ãƒ¢ãƒ¼ãƒ‰ã€æ—¥æ™‚ã®æ—¢å­˜ã®QSOã¨ä¸€è‡´ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“ãŒã€è¨­å®šã§å®šç¾©ã§ãる期間を考慮ã—ã¦ãã ã•ã„。 QSO logged from WSJT-X: It seems that you are running this version of KLog for the first time. ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®KLogã‚’åˆã‚ã¦ãŠä½¿ã„ã«ãªã‚‹ã‚ˆã†ã§ã™ã­ã€‚ The setup will be open to allow you to do any new setup you may need. セットアップã¯ã€å¿…è¦ãªæ–°ã—ã„セットアップãŒã§ãるよã†ã«ã‚ªãƒ¼ãƒ—ンã«ã—ã¾ã™ã€‚ You have requested to delete the QSO with: %1 Are you sure? 本当ã«ã‚ˆã‚ã—ã„ã§ã™ã‹ï¼Ÿ Check always the current callsign in QRZ.com QRZ.comã§ç¾åœ¨ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’常ã«ç¢ºèªã™ã‚‹ã€‚ You can update the entities database in Tools->Update cty.csv ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®æ›´æ–°ã¯ã€ã€Œãƒ„ールã€â†’「アップデート cty.csv〠Do you want to do it now? 今ã™ãã«ã§ã‚‚やりãŸã„ã¨æ€ã„ã¾ã™ã‹ï¼Ÿ The backup was done successfully ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¯æ­£å¸¸ã«è¡Œã‚れã¾ã—ãŸã€‚ KLog will remind you to backup your data again in aprox one month. KLogã¯ç´„1ヶ月後ã«ãƒ‡ãƒ¼ã‚¿ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—を促ã—ã¾ã™ã€‚ The backup was not properly done. ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ãŒé©åˆ‡ã«è¡Œã‚れã¦ã„ãªã‹ã£ãŸã€‚ It is recommended to backup your data periodically to prevent lose or corruption of your log. ãƒ­ã‚°ã®æ¶ˆå¤±ã‚„ç ´æã‚’防ããŸã‚ã€å®šæœŸçš„ã«ãƒ‡ãƒ¼ã‚¿ã‚’ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ The callsign %1 is not a valid call. Do you really want to add this callsign to the log? コールサイン %1 ã¯æœ‰åйãªã‚³ãƒ¼ãƒ«ã§ã¯ã‚りã¾ã›ã‚“。本当ã«ã“ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’ログã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ KLog - Not valid callsign KLog - 無効ãªã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ The callsign %1 is not a valid callsign. Do you really want to add this callsign to the log? コールサイン %1 ã¯æœ‰åйãªã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã§ã¯ã‚りã¾ã›ã‚“。本当ã«ã“ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’ログã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ You have requested to delete several QSOs ã„ãã¤ã‹ã®QSOã®å‰Šé™¤ã‚’è¦æ±‚ã•れã¾ã—㟠The ClubLog upload process has finished with an error and the log was possibly not uploaded. Clublogã®ã‚¢ãƒƒãƒ—ロード処ç†ãŒã‚¨ãƒ©ãƒ¼ã§çµ‚了ã—ã€ãƒ­ã‚°ãŒã‚¢ãƒƒãƒ—ロードã•れãªã‹ã£ãŸå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 èªè¨¼æƒ…å ±ã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šã€Clublogアカウントを確èªã—ã¦ãã ã•ã„。å—ä¿¡ã—ãŸã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™ï¼š %1 Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? ClubLogã«ã‚¢ãƒƒãƒ—ロードã—ãŸã™ã¹ã¦ã®QSOを「アップロード済ã¿ã€ã«ã—ã¾ã™ã‹ï¼Ÿ KLog - ClubLog KLog - ClubLog KLog - Stop the war in Ukraine! KLog - Stop the war in Ukraine! You are using a Russian call (%1). You can probably help to stop the Russian war, people are dying. Please call your leaders to stop the war. You are using an Ukranian call. Please take care and protect yourself and your family. The KLog developers wish you the best of luck in this very difficult moment. People are dying in the war of Russia against Ukraine. You can help to stop the Russian war against Ukraine. Please show your disagreement to your leaders, or in your social network to stop the war. Always check the current callsign in QRZ.com Upload queued QSOs to LoTW KLog - KLog folder not found Do you want to update now? You seem to have never backed up or exported your log to ADIF. Your latest backup seems older than one month. Regular backups prevent data loss and are good operator practice. Once exported, copy your ADIF file to a safe place such as a USB drive, cloud drive or other offsite computer. KLog will remind you to backup on a monthly basis. Backup completed successfully KLog will remind you again in approximately one month. Backup failed. Periodic data backups are recommended to prevent data loss and corruption of your log. This version of KLog requires that the DXCC database is updated. The database will be updated. The setup will now open to allow you to change your settings. KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 There was an error while updating to Yes the ClubLog QSO upload information. ClubLog QSOã‚¢ãƒƒãƒ—ãƒ­ãƒ¼ãƒ‰æƒ…å ±ã®æ›´æ–°æ™‚ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ The ClubLog upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? ClubLogã®ã‚¢ãƒƒãƒ—ロード処ç†ãŒçµ‚了ã—ã€KLogフォルダã«ãƒ•ァイル(%1)ãŒä½œæˆã•れã¾ã—ãŸã€‚ KLogã«ãã®ãƒ•ァイルを削除ã•ã›ã¾ã™ã‹ï¼Ÿ The file has not been removed. ファイルã¯å‰Šé™¤ã•れã¦ã„ã¾ã›ã‚“。 It seems that there was something that prevented KLog from removing the file You can remove it manually. KLogãŒãƒ•ァイルを削除ã™ã‚‹ã®ã‚’妨ã’る何ã‹ãŒã‚ã£ãŸã‚ˆã†ã§ã™ãŒ 手動ã§å‰Šé™¤ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ The eQSL upload process has finished with an error and the log was possibly not uploaded. eQSLã®ã‚¢ãƒƒãƒ—ロード処ç†ãŒã‚¨ãƒ©ãƒ¼ã§çµ‚了ã—ã€ãƒ­ã‚°ãŒã‚¢ãƒƒãƒ—ロードã•れãªã‹ã£ãŸå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1 èªè¨¼æƒ…å ±ã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šã€eQSLアカウントを確èªã—ã¦ãã ã•ã„。å—ä¿¡ã—ãŸã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™ï¼š %1 Do you want to mark as Uploaded all the QSOs uploaded to eQSL? eQSLã«ã‚¢ãƒƒãƒ—ロードã—ãŸã™ã¹ã¦ã®QSOを「アップロード済ã¿ã€ã«ã—ã¾ã™ã‹ï¼Ÿ There was an error while updating to Yes the eQSL QSO upload information. ã¯ã„eQSL QSOã‚¢ãƒƒãƒ—ãƒ­ãƒ¼ãƒ‰æƒ…å ±ã®æ›´æ–°æ™‚ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ The eQSL upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? eQSLã®ã‚¢ãƒƒãƒ—ロード処ç†ãŒçµ‚了ã—ã€KLogãŒKLogフォルダã«ãƒ•ァイル(%1)を作æˆã—ã¾ã—ãŸã€‚ KLogã«ãã®ãƒ•ァイルを削除ã•ã›ã¾ã™ã‹ï¼Ÿ KLog - QRZ.com warning QRZ.com has returned a non-subcribed error and queries to QRZ.com will be disabled. Please check your QRZ.com subcription or credentials. You need to activate the %1 service in the eLog preferences. eLogã®ç’°å¢ƒè¨­å®šã§%1 sサービスを有効ã«ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ The logfile has been modified. ログファイルãŒå¤‰æ›´ã•れã¾ã—ãŸã€‚ Do you want to save your changes? 変更内容をä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ KLog - ADIF export KLog - ADIFエクスãƒãƒ¼ãƒˆ It is important to export to ADIF and save a copy as a backup. ADIFã«ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã—ã¦ã€ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¨ã—ã¦ã‚³ãƒ”ーをä¿å­˜ã™ã‚‹ã“ã¨ãŒé‡è¦ã§ã™ã€‚ Saving the log was done successfully. ログã®ä¿å­˜ã¯æ­£å¸¸ã«è¡Œã‚れã¾ã—ãŸã€‚ The ADIF export was not properly done. ADIFã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆãŒé©åˆ‡ã«è¡Œã‚れãªã‹ã£ãŸã€‚ &Import from ADIF ... ADIFã‹ã‚‰ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ ... Export to ADIF ... ADIFã¸ã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ ... Export all logs to ADIF ... ã™ã¹ã¦ã®ãƒ­ã‚°ã‚’ADIFã«ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ ... &Print Log ... &Print Log ... QSL tools ... QSLツール ... Find QSO to QSL QSOã‹ã‚‰QSLを探㙠Find DX-QSLs pending to receive Shows DX-QSLs for which requests or QSLs have been sent with no answer. DX-QSLã®ã†ã¡ã€ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚„QSLã‚’é€ã£ã¦ã‚‚返事ãŒãªã„ã‚‚ã®ã‚’表示ã—ã¾ã™ã€‚ Find requested pending to receive ä¾é ¼ã•れãŸä¿ç•™åœ°ã‚’探㙠Shows the DX-QSLs that have been requested. リクエストã®ã‚ã£ãŸDX-QSLを表示ã—ã¾ã™ã€‚ LoTW tools ... LoTWツール ... Queue all QSLs from this log to be sent ã“ã®ãƒ­ã‚°ã‹ã‚‰ã®ã™ã¹ã¦ã®QSLをキューã«å…¥ã‚Œã¦é€ä¿¡ã™ã‚‹ Mark all non-sent QSOs in this log as queued to be uploaded. ã“ã®ãƒ­ã‚°ã®ã™ã¹ã¦ã®æœªé€ä¿¡ã®QSOã‚’ã€ã‚¢ãƒƒãƒ—ロード待ã¡ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã—ã¾ã™ã€‚ Queue all QSLs to be sent ã™ã¹ã¦ã®QSLã‚’é€ä¿¡ã™ã‚‹ãŸã‚ã®ã‚­ãƒ¥ãƒ¼ Put all the non-sent QSOs in the queue to be uploaded. é€ä¿¡ã—ã¦ã„ãªã„QSOã‚’ã™ã¹ã¦ã‚¢ãƒƒãƒ—ロードã™ã‚‹ãŸã‚ã®ã‚­ãƒ¥ãƒ¼ã«å…¥ã‚Œã‚‹ã€‚ Mark all queued QSOs from this log as sent ã“ã®ãƒ­ã‚°ã®ã‚­ãƒ¥ãƒ¼ã‚¤ãƒ³ã‚°ã•れãŸQSOã‚’ã™ã¹ã¦é€ä¿¡æ¸ˆã¿ã«ã™ã‚‹ Mark all queued QSOs as sent キューã«å…¥ã£ã¦ã„ã‚‹ã™ã¹ã¦ã®QSOã‚’é€ä¿¡æ¸ˆã¿ã«ã™ã‚‹ Check the current callsign in QRZ.com QRZ.comã§ç¾åœ¨ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’確èªã™ã‚‹ Upload the queued QSOs to QRZ.com ... キューイングã•れãŸQSOã‚’QRZ.comã«ã‚¢ãƒƒãƒ—ロードã™ã‚‹ ... Update cty.csv cty.csvã®æ›´æ–° Update Satellite Data è¡›æ˜Ÿãƒ‡ãƒ¼ã‚¿ã®æ›´æ–° Show Map Online manual (F1) ... オンラインマニュアル(F1) ... &Tips ... &Tips ... &Debug ... &Debug ... &About ... KLogã«ã¤ã„㦠About Qt ... Qtã«ã¤ã„㦠... Check updates ... 更新情報を確èªã™ã‚‹ ... All pending QSOs of this log has been marked as queued for LoTW! ã“ã®ãƒ­ã‚°ã®ã™ã¹ã¦ã®ä¿ç•™ä¸­ã®QSOã¯ã€LoTWã®ã‚­ãƒ¥ãƒ¼ã«å…¥ã£ã¦ã„ã¾ã™ã€‚ Now you can upload them to LoTW. ã“れã§ã€LoTWã«ã‚¢ãƒƒãƒ—ロードã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ There was a problem to mark all pending QSOs of this log as queued for LoTW! ã“ã®ãƒ­ã‚°ã®ã™ã¹ã¦ã®ä¿ç•™ä¸­ã®QSOã‚’LoTWã®ã‚­ãƒ¥ãƒ¼ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã™ã‚‹å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ Your log has not been updated. ã‚ãªãŸã®ãƒ­ã‚°ã¯æ›´æ–°ã•れã¦ã„ã¾ã›ã‚“。 No QSO was updated with the data coming from LoTW. This may be because of errors in the logfile or simply because your log was already updated. LoTWã‹ã‚‰ã®ãƒ‡ãƒ¼ã‚¿ã§æ›´æ–°ã•れãŸQSOã¯ã‚りã¾ã›ã‚“。ã“れã¯ã€ãƒ­ã‚°ãƒ•ァイルã«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹ãŸã‚ã‹ã€ã‚ã‚‹ã„ã¯å˜ã«ã‚ãªãŸã®ãƒ­ã‚°ãŒã™ã§ã«æ›´æ–°ã•れã¦ã„ã‚‹ãŸã‚ã‹ã‚‚ã—れã¾ã›ã‚“。 All pending QSOs has been marked as queued for LoTW! ã™ã¹ã¦ã®ä¿ç•™ä¸­ã®QSOã¯ã€LoTWã®ãŸã‚ã®ã‚­ãƒ¥ãƒ¼ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã•れã¦ã„ã¾ã™ã€‚ All queued QSOs has been marked as sent to LoTW! キューイングã•れãŸã™ã¹ã¦ã®QSOã¯ã€LoTWã«é€ä¿¡ã•れãŸã‚‚ã®ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã•れã¦ã„ã¾ã™ã€‚ There was a problem to mark all queued QSOs of this log as sent to LoTW! ã“ã®ãƒ­ã‚°ã®ã™ã¹ã¦ã®ã‚­ãƒ¥ãƒ¼ã‚¤ãƒ³ã‚°ã•れãŸQSOã‚’ã€LoTWã«é€ä¿¡ã•れãŸã‚‚ã®ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã™ã‚‹å•題ãŒã‚りã¾ã—㟠About ... About ... KLog - Update checking result KLog - æ›´æ–°ãƒã‚§ãƒƒã‚¯çµæžœ UDP Server error The UDP server failed to %1. start or stop UDP サーãƒã®ã‚¨ãƒ©ãƒ¼ UDP サーãƒãŒ %1 ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ It seems that there are no QSOs in the database. データベースã«QSOãŒç™»éŒ²ã•れã¦ã„ãªã„よã†ã§ã™ã€‚ Status of the DX entity. DXエンティティã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ Name of the DX entity. DXエンティティã®å称。 QSO QSO QSL QSL eQSL eQSL Comment コメント Others ãã®ä»– My Data è‡ªå±€ã®æƒ…å ± Satellite サテライト通信 You need to select one station callsign to be able to send your log to ClubLog. ClubLogã«ãƒ­ã‚°ã‚’é€ä¿¡ã™ã‚‹ãŸã‚ã«ã¯ã€1å±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’é¸æŠžã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ Do you want to add this QSOs to your ClubLog existing log? ã“ã®QSOã‚’ClubLogã®æ—¢å­˜ã®ãƒ­ã‚°ã«è¿½åŠ ã—ãŸã„ã§ã™ã‹ï¼Ÿ If you don't agree, this upload will overwrite your current ClubLog existing log. åŒæ„ã—ãªã„å ´åˆã€ã“ã®ã‚¢ãƒƒãƒ—ロードã¯ç¾åœ¨ã®ClubLogã®æ—¢å­˜ã®ãƒ­ã‚°ã‚’上書ãã—ã¾ã™ã€‚ KLog - eQSL KLog - eQSL You need to select one station callsign to be able to send your log to eQSL.cc. eQSL.ccã«ãƒ­ã‚°ã‚’é€ä¿¡ã™ã‚‹ãŸã‚ã«ã¯ã€1å±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’é¸æŠžã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ Select the Station Callsign to use when quering LoTW: LoTWを利用ã™ã‚‹éš›ã«ä½¿ç”¨ã™ã‚‹ã‚¹ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’é¸æŠžã—ã¾ã™ã€‚ Please check the LoTW setup LoTWã®è¨­å®šã‚’ã”確èªãã ã•ã„。 You have not defined a LoTW user or a proper Station Callsign. Open the LoTW tab in the Setup and configure your LoTW connection. LoTWã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒå®šç¾©ã•れã¦ã„ãªã„ã‹ã€ã‚¹ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ãŒé©åˆ‡ã§ãªã„。 Setupã®LoTWタブを開ã„ã¦ã€LoTWã®æŽ¥ç¶šã‚’è¨­å®šã—ã¦ãã ã•ã„。 The log is ready to be uploaded to ClubLog. ログをClubLogã«ã‚¢ãƒƒãƒ—ロードã™ã‚‹æº–å‚™ãŒæ•´ã„ã¾ã—ãŸã€‚ All the QSOs in this log has been marked as Modified in the ClubLog status field ã“ã®ãƒ­ã‚°ã®ã™ã¹ã¦ã®QSOã¯ã€ClubLogã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹æ¬„ã«ã€ŒModifiedã€ã¨è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚ KLog could not mark the full log to be sent to ClubLog KLogãŒClubLogã«é€ä¿¡ã™ã‚‹ãƒ•ルログをマークã§ããªã‹ã£ãŸ Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers. 何らã‹ã®åŽŸå› ã§KLogãŒQSOを修正済ã¿ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚KLogã®é–‹ç™ºè€…ã«é€£çµ¡ã™ã‚‹å‰ã«ï¼ŒKLogã‚’å†èµ·å‹•ã—ã¦ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ã¿ã¦ãã ã•ã„. The log is ready to be uploaded to eQSL.cc. ã“ã®ãƒ­ã‚°ã¯eQSL.ccã«ã‚¢ãƒƒãƒ—ロードã™ã‚‹æº–å‚™ãŒã§ãã¦ã„ã¾ã™ã€‚ All the QSOs in this log has been marked as Modified in the eQSL.cc status field ã“ã®ãƒ­ã‚°ã®ã™ã¹ã¦ã®QSOã¯ã€eQSL.ccã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹æ¬„ã«ã€ŒModifiedã€ã¨è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚ KLog could not mark the full log to be sent to eQSL KLogã¯eQSLã«é€ä¿¡ã™ã‚‹ãƒ•ルログをマークã§ããªã‹ã£ãŸ You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. eLogã®ç’°å¢ƒè¨­å®šã§ã€QRZ.comログブック用ã®é©åˆ‡ãªAPIキーを定義ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ Filling QSOs ... QSOを埋ã‚ã‚‹... Date/Time 日付/時刻 Callsign コールサイン Printing the log ... ログã®å°åˆ· ... Station Callsign ç„¡ç·šå±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ Operator Callsign オペレーターã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ KLog - WSJTX Dupe QSO KLog - WSJTX Dupe QSO This QSO seems to be duplicated. Do you want to save or discard it? ã“ã®QSOã¯é‡è¤‡ã—ã¦ã„るよã†ã§ã™ã€‚ä¿å­˜ã—ã¾ã™ã‹ã€ç ´æ£„ã—ã¾ã™ã‹ï¼Ÿ KLog - Non-supported mode KLog - éžå¯¾å¿œãƒ¢ãƒ¼ãƒ‰ A new mode not supported by KLog has been received from an external program or radio: KLogãŒã‚µãƒãƒ¼ãƒˆã—ã¦ã„ãªã„æ–°ã—ã„モードを外部ã®ç•ªçµ„やラジオã‹ã‚‰å—ä¿¡ã—ãŸã€‚ Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) ã“ã®ã‚¢ãƒ©ãƒ¼ãƒˆã‚’å—ä¿¡ã—ç¶šã‘ã¾ã™ã‹ï¼Ÿ(ã“れらã®ã‚¢ãƒ©ãƒ¼ãƒˆã‚’無効ã«ã™ã‚‹ã¨ã€ç„¡åйãªãƒ¢ãƒ¼ãƒ‰ãŒæ¤œå‡ºã•れãªããªã‚Šã¾ã™) Native Error Recommendation: Periodically export your data to ADIF to prevent a potential data loss. 定期的ã«ãƒ‡ãƒ¼ã‚¿ã‚’ADIFã«ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã™ã‚‹ã“ã¨ã§ã€ãƒ‡ãƒ¼ã‚¿æå¤±ã®å¯èƒ½æ€§ã‚’防ãã“ã¨ãŒã§ãã¾ã™ã€‚ DXCC DXCC Info Awards Search Log DX-Cluster DXクラスター Save ADIF File ADIFファイルã®ä¿å­˜ The LoTW upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? LoTWã®ã‚¢ãƒƒãƒ—ロード処ç†ãŒçµ‚了ã—ã€KLogã®ãƒ•ォルダã«ãƒ•ァイル(%1)ãŒä½œæˆã•れã¾ã—ãŸã€‚ KLogã«ãã®ãƒ•ァイルを削除ã•ã›ã¾ã™ã‹ï¼Ÿ The file has been removed. ファイルã¯å‰Šé™¤ã•れã¾ã—ãŸã€‚ KLog - LoTW KLog - LoTW Open File ファイルを開ã - Needed for DXMarathon Abort filling Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: Number Band ãƒãƒ³ãƒ‰ Mode モード Print Log Abort printing å°åˆ·ã‚’中止ã™ã‚‹ Printing the log... QSO: The following QSO data has been received from WSJT-X to be logged: WSJT-Xã‹ã‚‰ä»¥ä¸‹ã®QSOデータをå—ä¿¡ã—ã¾ã—ãŸã®ã§ã€è¨˜éŒ²ã—ã¾ã™ã€‚ Freq 周波数 Time On Time Off RST TX RST RX DX-Grid Local-Grid If the received mode is correct, please contact KLog development team and request support for that mode å—ä¿¡ã—ãŸãƒ¢ãƒ¼ãƒ‰ãŒæ­£ã—ã„å ´åˆã¯ã€KLog開発ãƒãƒ¼ãƒ ã«é€£çµ¡ã—ã€ãã®ãƒ¢ãƒ¼ãƒ‰ã®ã‚µãƒãƒ¼ãƒˆã‚’è¦æ±‚ã—ã¦ãã ã•ã„。 KLog - QSO Dupe A dupe QSO has been detected in the file and will not be added to the log. Please check the QSO information file and ensure it is properly added. KLog - Duplicated satellite A duplicated satellite has been detected in the file and will not be imported. ファイル内ã«é‡è¤‡ã—ãŸè¡›æ˜ŸãŒæ¤œå‡ºã•れãŸãŸã‚ã€ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•れã¾ã›ã‚“。 Please check the satellite information file and ensure it is properly populated. 衛星情報ファイルを確èªã—ã€æ­£ã—ã入力ã•れã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 Now you will see a more detailed error that can be used for debugging... ã“れã§ã€ãƒ‡ãƒãƒƒã‚°ã«ä½¿ãˆã‚‹ã‚ˆã‚Šè©³ç´°ãªã‚¨ãƒ©ãƒ¼ãŒè¡¨ç¤ºã•れるよã†ã«ãªã‚Šã¾ã—ãŸ...。 An unexpected error ocurred!! 想定外ã®ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸï¼ï¼ If the problem persists, please contact the developers ãれã§ã‚‚å•題ãŒè§£æ±ºã—ãªã„å ´åˆã¯ã€é–‹ç™ºè€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 for analysis: Error in function Error text Failed query KLog - Show errors Do you want to keep showing errors? MainWindowInputComment Comment コメント Add a comment for this QSO. Keep this data ã“ã®ãƒ‡ãƒ¼ã‚¿ã‚’ä¿æŒ Data entered in this tab will be copied into the next QSO. ã“ã®ã‚¿ãƒ–ã§å…¥åŠ›ã—ãŸãƒ‡ãƒ¼ã‚¿ã¯ã€æ¬¡ã®QSOã«ã‚³ãƒ”ーã•れã¾ã™ã€‚ MainWindowInputEQSL Date of the ClubLog upload. ClubLogã«ã‚¢ãƒƒãƒ—ロードã—ãŸæ—¥ä»˜ Date of the QRZ.com upload. QRZ.comã‚¢ãƒƒãƒ—ãƒ­ãƒ¼ãƒ‰ã®æ—¥ä»˜ã€‚ Date of the eQSL sending. eQSLã‚’é€ä»˜ã—ãŸæ—¥ä»˜ Date of the eQSL reception. eQSLã‚’å—é ˜ã—ãŸæ—¥ä»˜ Date of the LoTW sending. LoTWã®é€ä¿¡æ—¥ã€‚ Date of the LoTW reception. LoTWå—ä¿¡ã®æ—¥ä»˜ã€‚ Status on QRZ.com. QRZ.comã§ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ Status of the LoTW sending. LoTWã®é€ä¿¡çжæ³ã€‚ Status of the LoTW reception. LoTWå—ä¿¡ã®çŠ¶æ…‹ã€‚ QRZ.com QRZ.com LoTW Sent LoTWé€ä¿¡ LoTW Rec LoTW Rec Status on ClubLog. ClubLogã®çŠ¶æ³ Status of the eQSL sending. eQSLã®é€ä»˜çŠ¶æ³ Status of the eQSL reception. eQSLã®å—é ˜çŠ¶æ³ ClubLog eQSL Sent eQSLé€ä»˜ eQSL Rec eQSLå—é ˜ MainWindowInputOthers Primary Div Secondary Div IOTA Entity エンティティ Propagation mode 伿’­ãƒ¢ãƒ¼ãƒ‰ Others ãã®ä»– Keep propagation mode Select the primary division for this QSO. Select the secondary division for this QSO. Select the entity for this QSO. 今回ã®QSOã®ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ã‚’é¸æŠžã—ã¾ã™ã€‚ Select the propagation mode for this QSO. 今回ã®QSOã®ä¼æ¬ãƒ¢ãƒ¼ãƒ‰ã‚’é¸æŠžã—ã¾ã™ã€‚ Select the IOTA continent for this QSO. 今回ã®QSOã§ä½¿ç”¨ã™ã‚‹IOTAå¤§é™¸ã‚’é¸æŠžã—ã¾ã™ã€‚ Select the IOTA reference number for this QSO. ã“ã®QSOã®IOTAå‚照番å·ã‚’é¸æŠžã—ã¾ã™ã€‚ Keeps the same propagation mode for next QSO. 次ã®QSOã§ã‚‚åŒã˜ä¼æ¬ãƒ¢ãƒ¼ãƒ‰ã‚’ç¶­æŒã—ã¾ã™ã€‚ Select the appropriate ADIF field for this QSO. ã“ã®QSOã«é©ã—ãŸADIFãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã‚’é¸æŠžã—ã¾ã™ã€‚ Value for the selected ADIF field. é¸æŠžã•れãŸADIFフィールドã®å€¤ã€‚ Not Identified 䏿˜Ž Not - Not Identified Not - 䏿˜Ž SOTA Ref Age VUCC grids Distance MainWindowInputQSL QSL Sent QSLé€ä»˜ QSL Rec QSLå—é ˜ QSL Via QSL Msg Status of the QSL sending. QSLカードã®é€ä»˜çŠ¶æ³ Status of the QSL reception. QSLカードã®å—é ˜çŠ¶æ³ QSL sending information. QSLカードã®é€ä»˜å…ˆã®æƒ…å ± QSL reception information. QSLカードã®å—é ˜å…ƒã®æƒ…å ± Date of the QSL sending. QSLカードをé€ä»˜ã—ãŸæ—¥ä»˜ Date of the QSL reception. QSLカードをå—é ˜ã—ãŸæ—¥ä»˜ Message of the QSL. QSLカードã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ QSL via information. QSLカード経由先ãªã©ã®æƒ…å ± MainWindowInputQSO TX RST. RX RST. TX Frequency in MHz. TX周波数(MHz)。 RX Frequency in MHz. RX周波数(MHz)。 Power used by the contacted station. 接触ã—ãŸã‚¹ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ãŒä½¿ç”¨ã™ã‚‹é›»åŠ› Name of the contacted operator. 繋ãŒã£ãŸã‚ªãƒšãƒ¬ãƒ¼ã‚¿ãƒ¼ã®åå‰ QTH of the contacted station. 連絡をå—ã‘ãŸå±€ã®QTH。 Locator of the contacted station. 接触ã—ãŸå±€ã®ãƒ­ã‚±ãƒ¼ã‚¿ãƒ¼ Watts MHz Split Translator: Split is a common hamradio term. Do not translate unless you are sure. Name åå‰ QTH DX Locator Power(rx) RST TX RX Frequency DX QTH locator. DX QTHロケーター。 DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. TX Frequency in MHz. Frequency is not in a hamradio band! TXã®å‘¨æ³¢æ•°ï¼ˆMHz)ã§ã™ã€‚ 周波数ã¯ãƒãƒ ãƒ©ã‚¸ã‚ªã®ãƒãƒ³ãƒ‰ã§ã¯ã‚りã¾ã›ã‚“。 RX Frequency in MHz. Frequency is not in a hamradio band! RXã®å‘¨æ³¢æ•°ï¼ˆMHz)ã§ã™ã€‚ 周波数ã¯ãƒãƒ ãƒ©ã‚¸ã‚ªã®ãƒãƒ³ãƒ‰ã§ã¯ã‚りã¾ã›ã‚“。 MainWindowMyDataTab Watts Keep this data ã“ã®ãƒ‡ãƒ¼ã‚¿ã‚’ä¿æŒ My QTH locator. 自局QTHã®ã‚°ãƒªãƒƒãƒ‰ãƒ­ã‚±ãƒ¼ã‚¿ãƒ¼ Power é€ä¿¡å‡ºåŠ› Operator callsign オペレーターã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ Station Callsign ç„¡ç·šå±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ My Locator 自局ã®ã‚°ãƒªãƒƒãƒ‰ãƒ­ã‚±ãƒ¼ã‚¿ãƒ¼ My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. My Rig ç§ã®ãƒªã‚° My Antenna ç§ã®ã‚¢ãƒ³ãƒ†ãƒŠ My SOTA_Ref ç§ã®SOTA_Ref My VUCC_GRIDS ç§ã®VUCC_GRIDS MainWindowSatTab Keep this data ã“ã®ãƒ‡ãƒ¼ã‚¿ã‚’ä¿æŒ Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). リストã«ãªã„å ´åˆã¯ã‚µãƒ†ãƒ©ã‚¤ãƒˆã®åå‰ã€‚ã‚’é¸æŠžã—ã¦ãã ã•ã„。"%1 "ã‚’é¸æŠžã™ã‚‹ã¨ã€ã“ã®ãƒœãƒƒã‚¯ã‚¹ãŒæœ‰åйã«ãªã‚Šã¾ã™ã€‚(AO-51ã®ã‚ˆã†ãªãƒ•ォーマット)。 Satellite mode used. 使用ã—ãŸã‚µãƒ†ãƒ©ã‚¤ãƒˆãƒ¢ãƒ¼ãƒ‰ Select the satellite you are using. ãŠä½¿ã„ã®è¡›æ˜Ÿã‚’é¸æŠžã—ã¦ãã ã•ã„。 UpLink band. アップリンクãƒãƒ³ãƒ‰ã€‚ DownLink band. ダウンリンクãƒãƒ³ãƒ‰ã€‚ Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. DXステーションã®ãƒ­ã‚±ãƒ¼ã‚¿ãƒ¼ã€‚ã“ã®ãƒœãƒƒã‚¯ã‚¹ã¯ã€QSOタブã®ãƒ­ã‚±ãƒ¼ã‚¿ãƒ¼ãƒœãƒƒã‚¯ã‚¹ã¨åŒæœŸã—ã¦ã„ã¾ã™ã€‚ UpLink アップリンク DownLink ダウンリンク Satellite サテライト通信 Mode モード Other ãã®ä»– Not Sat QSO 衛星QSOã§ã¯ãªã„ KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. 識別ä¸å¯èƒ½ãªè¡›æ˜Ÿã®åç§°ãŒå…¥åŠ›ã•れã¦ã„ã‚‹ã®ã‚’発見ã—ã¾ã—ãŸ. 別ã®åç§°ã§ã‚‚呼ã°ã‚Œã¦ãŠã‚Šã€ãã®åç§°ãŒãƒªã‚¹ãƒˆã«ã‚ã‚‹ãªã‚‰ã°ã€ãã®å称を使ã£ã¦ãã ã•ã„. ã‚‚ã—ãã¯é–‹ç™ºãƒãƒ¼ãƒ ã«ã“ã®æ–°ã—ã„衛星ã®å称を加ãˆã‚‹ã‚ˆã†é€£çµ¡ã—ã¦ãã ã•ã„. Please be aware that the satellite name will not be saved if it is not in the list, so that information may be lost! リストã«ãªã„å ´åˆã¯è¡›æ˜ŸåãŒä¿å­˜ã•れãªã„ãŸã‚ã€æƒ…å ±ãŒå¤±ã‚れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã®ã§ã”注æ„ãã ã•ã„。 RX Frequency in MHz. Frequency is not in a hamradio band! RXã®å‘¨æ³¢æ•°ï¼ˆMHz)ã§ã™ã€‚ 周波数ã¯ãƒãƒ ãƒ©ã‚¸ã‚ªã®ãƒãƒ³ãƒ‰ã§ã¯ã‚りã¾ã›ã‚“。 RX Frequency in MHz. RX周波数(MHz)。 TX Frequency in MHz. Frequency is not in a hamradio band! TXã®å‘¨æ³¢æ•°ï¼ˆMHz)ã§ã™ã€‚ 周波数ã¯ãƒãƒ ãƒ©ã‚¸ã‚ªã®ãƒãƒ³ãƒ‰ã§ã¯ã‚りã¾ã›ã‚“。 TX Frequency in MHz. TX周波数(MHz)。 Other - Sat not in the list ãã®ä»–ã€ãƒªã‚¹ãƒˆã«ãªã„衛星 Data entered in this tab will be copied into the next QSO. ã“ã®ã‚¿ãƒ–ã§å…¥åŠ›ã—ãŸãƒ‡ãƒ¼ã‚¿ã¯ã€æ¬¡ã®QSOã«ã‚³ãƒ”ーã•れã¾ã™ã€‚ The satellite you have in your QSO is: QSO情報ã«è¨˜éŒ²ã•れãŸè¡›æ˜Ÿã®åç§°ã¯ä»¥ä¸‹ã®ã‚‚ã®ã§ã™: MapWindowWidget Select QSOs in this band. Select QSOs in this mode. Select QSOs in this propagation mode. Select QSOs using this Satellite. Only confirmed Select only confirmed QSOs. All bands Show nothing All modes All propagation modes All satellites OnlineMessageWidget The server returned the following error: %1 サーãƒã‹ã‚‰æ¬¡ã®ã‚¨ãƒ©ãƒ¼ãŒè¿”ã•れã¾ã—ãŸ: %1 Not identified 䏿˜Ž QObject Database Error データベース エラー KLog DB needs to be upgraded. KLog DBã‚’æ›´æ–°ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™. Do you want to upgrade it now? ã„ã¾æ›´æ–°ã—ã¾ã™ã‹? If DB is not upgraded KLog may not work properly. DBã‚’æ›´æ–°ã—ãªã„ã¨KLogã¯æ­£ã—ã動作ã—ãªã„å¯èƒ½æ€§ãŒã‚りã¾ã™. Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea. ソフトウェアをアップグレードã™ã‚‹ã¨ã€å•題ãŒç™ºç”Ÿã™ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚アップグレードã™ã‚‹å‰ã«ã€DBã‚’ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã—ã¦ãŠãã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ Do you want to backup your DB now? 今ã™ãDBã‚’ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã—ã¾ã™ã‹ï¼Ÿ The backup finished successfully. ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¯æ­£å¸¸ã«çµ‚了ã—ã¾ã—ãŸã€‚ You can find the backup in this file: %1 ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¯ã“ã®ãƒ•ァイルã§ç¢ºèªã§ãã¾ã™ã€‚%1 The backup was not properly done. ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ãŒé©åˆ‡ã«å®Œäº†ã—ãªã‹ã£ãŸã€‚ You will be sent back to the starting point. ã‚¹ã‚¿ãƒ¼ãƒˆåœ°ç‚¹ã«æˆ»ã•れã¾ã™ã€‚ KLog - DB can't be updated automatically KLog - DBãŒè‡ªå‹•æ›´æ–°ã•れãªã„ You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version. å¤ã™ãŽã‚‹KLogã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‹ã‚‰ã‚¢ãƒƒãƒ—グレードã—ã¦ãŠã‚Šã€ã“ã®ã‚¢ãƒƒãƒ—グレードã¯ãã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‹ã‚‰è‡ªå‹•çš„ã«ã‚¢ãƒƒãƒ—グレードã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 KLog - DB update KLog - DBアップデート KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. DBã®ä¸­ã«ä»¥å‰ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ãƒ­ã‚°ã‚’発見ã—ã¾ã—ãŸã€‚ã™ã¹ã¦ã®ãƒ‡ãƒ¼ã‚¿ã‚’æ–°ã—ã作æˆã•れるDXタイプã®ãƒ­ã‚°ã«ç§»è¡Œã—ã¾ã™ã€‚ KLog: Enter Station callsign KLog: ç„¡ç·šå±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’入力ã—ã¦ãã ã•ã„ Enter the station callsign used in this log ã“ã®ãƒ­ã‚°ã§ä½¿ç”¨ã™ã‚‹ç„¡ç·šå±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’入力ã—ã¦ãã ã•ã„ Station Callsign ç„¡ç·šå±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? 更新を中止ã™ã‚‹ã¨ãƒ‡ãƒ¼ã‚¿ã«çŸ›ç›¾ãŒç”Ÿã˜ãŸã‚Šã€ãƒ‡ãƒ¼ã‚¿ãŒå¤±ã‚れるå¯èƒ½æ€§ãŒã‚りã¾ã™.  更新を中止ã—ã¾ã™ã‹ï¼Ÿ Progress: 進æ—状æ³: Updating DXCC award information... DXCCã‚¢ãƒ¯ãƒ¼ãƒ‰æƒ…å ±ã®æ›´æ–°... Updating DXCC Award information... DXCCã‚¢ãƒ¯ãƒ¼ãƒ‰æƒ…å ±ã®æ›´æ–°... Updating WAZ award information... WAZã‚¢ãƒ¯ãƒ¼ãƒ‰æƒ…å ±ã®æ›´æ–°... Updating WAZ Award information... WAZã‚¢ãƒ¯ãƒ¼ãƒ‰æƒ…å ±ã®æ›´æ–°... Updating mode information... ãƒ¢ãƒ¼ãƒ‰ã®æƒ…報を更新ã—ã¦ã„ã¾ã™... The process to upgrade is: - Using an old KLog version export your log to ADIF. - Remove your logbook.dat file from your KLog folder. - Install the new KLog version. - Import your ADIF file. KLog will finish when you click on OK. ã‚¢ãƒƒãƒ—ã‚°ãƒ¬ãƒ¼ãƒ‰ã®æ‰‹é †ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™ã€‚ - å¤ã„KLogã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’使ã£ã¦ã€ãƒ­ã‚°ã‚’ADIFã«ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã™ã‚‹ã€‚ - KLogフォルダã‹ã‚‰logbook.datファイルを削除ã—ã¾ã™ã€‚ - æ–°ã—ã„ KLog ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’インストールã—ã¾ã™ã€‚ - ADIFファイルをインãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ OKをクリックã™ã‚‹ã¨ã€KLogãŒçµ‚了ã—ã¾ã™ã€‚ All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay. ã™ã¹ã¦ã®ãƒ‡ãƒ¼ã‚¿ãŒæ­£ã—ã移行ã•れã¾ã—ãŸã€‚ã“ã“ã§ã€ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—->設定->ログã«ç§»å‹•ã—ã¦ã€ã™ã¹ã¦ãŒå•題ãªã„ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 Abort updating æ›´æ–°ã®ä¸­æ­¢ Updating bands information... ãƒãƒ³ãƒ‰ã®æƒ…報を更新ã—ã¦ã„ã¾ã™... Updating bands information in %1 status... %1 用ã®ãƒãƒ³ãƒ‰ã®æƒ…報を更新ã—ã¦ã„ã¾ã™... Updating mode information in %1 status... %1 用ã®ãƒ¢ãƒ¼ãƒ‰ã®æƒ…報を更新ã—ã¦ã„ã¾ã™... New One, work it! New Oneã§ã™. 交信ã™ã¹ã—! Needed, work it! 交信ã™ã¹ã—! Worked but not confirmed 交信済ã ãŒæœªã‚³ãƒ³ãƒ•ァーム Confirmed コンファーム済 Not identified 䏿˜Ž KLog is already running. KLogã¯ã™ã§ã«èµ·å‹•ã—ã¦ã„ã¾ã™ã€‚ It is allowed to run only one instance. 1ã¤ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®ã¿ã‚’実行ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ Install wizard was canceled before completing... ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚¦ã‚£ã‚¶ãƒ¼ãƒ‰ã¯æ“作完了å‰ã«ä¸­æ–­ã•れã¾ã—ãŸ... Do you want to remove the KLog dir from your disk? KLog ディレクトリーをディスクドライブã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹? Your KLog dir has been removed KLog ディレクトリã¯å‰Šé™¤ã•れã¾ã—㟠I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. KLog ディレクトリーãŒå‰Šé™¤ã§ãã¾ã›ã‚“ã§ã—ãŸ. ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã‹ã‚‰å‰Šé™¤ã—ãŸã„å ´åˆã¯æ‰‹å‹•ã§å‰Šé™¤ã—ã¦ãã ã•ã„. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. KLog ディレクトリーãŒå‰Šé™¤ã§ãã¾ã›ã‚“ã§ã—ãŸ. ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã‹ã‚‰å‰Šé™¤ã—ãŸã„å ´åˆã¯æ‰‹å‹•ã§å‰Šé™¤ã—ã¦ãã ã•ã„. Remember that your KLog dir is on your system... KLog ディレクトリーã¯ã‚·ã‚¹ãƒ†ãƒ ä¸­ã«æ®‹ã£ãŸã¾ã¾ã§ã™... Thank you for running KLog! KLogを使用ã—ã¦ãã ã•りã‚りãŒã¨ã†ã”ã–ã„ã¾ã™! Updating information... 情報を更新ã™ã‚‹... Updating DXCC and Continent information... DXCCã¨å¤§é™¸æƒ…å ±ã®æ›´æ–°... A wrong callsign has been found: %1. Please enter a new callsign or confirm that the current one is a good callsign. é–“é•ã£ãŸã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ: %1。新ã—ã„コールサインを入力ã™ã‚‹ã‹ã€ç¾åœ¨ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ãŒæ­£ã—ã„ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 An empty callsign has been detected. If it is possible, please enter the right call. 空ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ãŒæ¤œå‡ºã•れã¾ã—ãŸã€‚å¯èƒ½ã§ã‚れã°ã€æ­£ã—ã„コールを入力ã—ã¦ãã ã•ã„。 KLog - Not valid callsign found KLog - 有効ãªã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 Date 日付 Call RSTtx é€ä¿¡RST RSTrx å—ä¿¡RST Band ãƒãƒ³ãƒ‰ Comment コメント Mode モード CQz ITUz DXCC DXCC Address Age County A_Index Ant_Az Ant_El Ant_Path ARRL_SECT Award_Submitted Award_granted Band_RX CheckContest Class ClubLog SDate ClubLog status Continent 大陸å Contest Id Country Credit Submitted Credit granted Dark Dok Do not translate if unsure, common hamradio term. Fists Do not translate if unsure, common hamradio term. Fists CC Do not translate if unsure, common hamradio term. My Fists Do not translate if unsure, common hamradio term. Nr bursts Do not translate if unsure, common hamradio term. Nr pings Do not translate if unsure, common hamradio term. Sat mode SWL Do not translate if unsure, common hamradio term. Ten-Ten Do not translate, it is a hamradio group name. Distance Contacted_Op Email EQ_Call eQSL RDate eQSL SDate eQSL Rcvd eQSL Sent eQSLé€ä»˜ Force Init Freq 周波数 Freq RX Gridsquare HRDLog SDate HRDLog status IOTA IOTA Island id K Index Lat Lon LoTW RDate LoTW SDate LoTW Rcvd LoTW Sent LoTWé€ä¿¡ Max Bursts MS Shower My Antenna ç§ã®ã‚¢ãƒ³ãƒ†ãƒŠ My City My Cnty My Country My CQz My DXCC My Gridsquare My IOTA My IOTA island id My ITUz My Lat My Lon My Name My Postal code My Rig ç§ã®ãƒªã‚° My Sig My Sig Info My SOTA ref My State My Street My USACA counties My VUCC grids Name åå‰ Notes Operator Owner Callsign Pfx Precedence Prop Mode Public Key QRZcom SDate QRZcom status QSL msg QSL RDate QSL SDate QSL Rcvd QSLå—é ˜çŠ¶æ³ QSL Sent QSLé€ä»˜ QSL rcvd via QSL sent via QSL via QSO complete QSO random QTH Region Rig RX Pwr Sat name SFI Sig Sig Info Silent key Do not translate if unsure, common hamradio term. SKCC SOTA Ref SRX String SRX STX String State Submode UKSMG USACA counties VE prov VUCC grids TX Pwr Web QSO Date off Log number SearchWidget &Clear クリア(&C) &Select All ã™ã¹ã¦é¸æŠž(&S) &Search 検索(&S) &Export Highlighted é¸æŠžã—ãŸé …目をエクスãƒãƒ¼ãƒˆ(&E) All logs ã™ã¹ã¦ã®ãƒ­ã‚° Clear the searches. æ¤œç´¢çµæžœã‚’クリアã—ã¾ã™. Export the search result to an ADIF file. æ¤œç´¢çµæžœã‚’ADIFファイルã«ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã—ã¾ã™. Select/Unselect all the QSOs shown. 表示ã•れãŸQSOã™ã¹ã¦ã‚’é¸æŠžãƒ»é¸æŠžè§£é™¤ã—ã¾ã™. Search in the log. ログを検索ã—ã¾ã™. Search in all logs. ã™ã¹ã¦ã®ãƒ­ã‚°ã‚’検索ã—ã¾ã™. You have requested to delete the QSO with: %1 Select the Station Callsign used to do this QSO. ã“ã®QSOを行ã†ãŸã‚ã«ä½¿ç”¨ã—ãŸå±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’é¸æŠžã—ã¾ã™ã€‚ Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs! 検索ã™ã‚‹ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’入力ã—ã¾ã™ã€‚ã™ã¹ã¦ã®QSOを表示ã™ã‚‹ã«ã¯ã€Œ*ã€ã‚’入力ã—ã¦ãã ã•ã„...大ããªãƒ­ã‚°ã§ã¯é…ã„ã‹ã‚‚ã—れã¾ã›ã‚“! All in log Not defined 定義ã•れã¦ã„ã¾ã›ã‚“ &Clear selection é¸æŠžã‚’ã‚¯ãƒªã‚¢(&C) Save File ファイルã«ä¿å­˜ Are you sure? 本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ SearchWindow Date/Time 日付/時刻 Band ãƒãƒ³ãƒ‰ Mode モード QSL Sent QSLé€ä»˜ QSL Rcvd QSLå—é ˜çŠ¶æ³ Station Callsign ç„¡ç·šå±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ ID Call Date/time 日付/時刻 Station callsign ç„¡ç·šå±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ QSL Send QSLカードã®é€ä»˜ &Delete 削除(&D) Delete a QSO QSOã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚’削除ã—ã¾ã™ &Edit QSO QSOã®ç·¨é›†(&E) Edit this QSO QSOã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚’編集ã—ã¾ã™ Via &bureau ビューロー経由(&b) Send this QSL via bureau QSLカードをビューロー経由ã§é€ã‚Šã¾ã™ D&irect ダイレクト(&i) Send this QSL via direct QSLカードをダイレクトã§é€ã‚Šã¾ã™ Via bureau ビューロー経由 QSL &received via bureau QSLカードをビューロー経由ã§å—ã‘å–りã¾ã—ãŸã€‚(&r) Direct ダイレクト QSL received via direc&t QSLカードをダイレクトã§å—ã‘å–りã¾ã—ãŸã€‚(&t) Check in QRZ.com QRZ.comã§ãƒã‚§ãƒƒã‚¯ Check this callsign in QRZ.com QRZ.comã§ã“ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’ãƒã‚§ãƒƒã‚¯ Check in DXHeat.com DXHeat.comã«ãƒã‚§ãƒƒã‚¯ã‚¤ãƒ³ Check this callsign in DXHeat.com DXHeat.comã§ã“ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’確èªã™ã‚‹ &Request my QSL 自分ã®QSLカードãŒãƒªã‚¯ã‚¨ã‚¹ãƒˆã•れ㟠(&R) Mark my QSL as requested QSLカードãŒãƒªã‚¯ã‚¨ã‚¹ãƒˆã•れã¦ã„ã‚‹ã¨ãƒžãƒ¼ã‚¯ã—ã¾ã™ Via Direct and mark DX QSL as requested Send this QSL via direct and mark DX QSL as requested Via Bureau and mark DX QSL as requested Send this QSL via bureau and mark DX QSL as requested &Request the QSL QSLカードãŒãƒªã‚¯ã‚¨ã‚¹ãƒˆã•れ㟠(&R) Mark the QSL as requested QSLカードãŒãƒªã‚¯ã‚¨ã‚¹ãƒˆã•れã¦ã„ã‚‹ã“ã¨ã‚’マークã—ã¾ã™ Via bureau and mark my QSL as requested QSL received via bureau and mark my QSL as requested Direc&t and mark as my QSL requested QSL received via direct and mark my QSL as requested Needed QSO to send the QSL QSLカードé€ä»˜ã®å¿…è¦ãŒã‚ã‚‹QSO My QSL requested to be sent 自分ã®QSLカードãŒãƒªã‚¯ã‚¨ã‚¹ãƒˆã•れã¦ã„ã‚‹ DX QSL pending to be received 相手局ã®QSLカードをã¾ã å—ã‘å–ã£ã¦ã„ãªã„ SetupDialog Bands/Modes ãƒãƒ³ãƒ‰ã¨ãƒ¢ãƒ¼ãƒ‰ DX-Cluster DXクラスター Colors 表示色 Misc ãã®ä»– World Editor ワールドエディター Logs ログ Satellites HamLib Cancel キャンセル eLog OK OK User data ユーザー情報 Log widget D&X-Cluster D&Xクラスター WSJT-X Settings You need to enter at least one log in the Logs tab. 「ログã€ã‚¿ãƒ–ã§å°‘ãªãã¨ã‚‚ã²ã¨ã¤ãƒ­ã‚°ã‚’入力ã—ã¦ãã ã•ã„. Do you want to add one log in the Logs tab or exit KLog? (Click Yes to add a log or No to exit KLog) Logsタブã«1ã¤ã®ãƒ­ã‚°ã‚’追加ã™ã‚‹ã‹ã€KLogを終了ã—ã¾ã™ã‹ï¼Ÿ (ログを追加ã™ã‚‹å ´åˆã¯Yesã‚’ã€KLogを終了ã™ã‚‹å ´åˆã¯Noをクリックã—ã¦ãã ã•ã„) World ワールド DB has not been moved to new path. DBã¯æ–°ã—ã„パスã«ç§»å‹•ã—ã¦ã„ã¾ã›ã‚“。 Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. 「ãã®ä»–ã€ã‚¿ãƒ–ã‚’é–‹ãã€ã€ŒMove DBã€ã‚’クリックã™ã‚‹ をクリックã—ãªã„ã¨ã€DBãŒæ–°ã—ã„場所ã«ç§»å‹•ã•れã¾ã›ã‚“。 You need to enter at least a valid callsign. å°‘ãªãã¨ã‚‚有効ãªã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’入力ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ Go to the User tab and enter valid callsign. ユーザーã€ã‚¿ãƒ–ã‚’é–‹ãã€æœ‰åйãªã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’入力ã—ã¾ã™ã€‚ You have not selected the kind of log you want. ログã®ç¨®é¡žãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“. You will be redirected to the Log tab. Please add and select the kind of log you want to use. ã“ã®å¾Œã€ã€Œãƒ­ã‚°ã€ã‚¿ãƒ–ã«èª˜å°Žã•れã¾ã™. 使用ã—ãŸã„ログã®ç¨®é¡žã‚’é¸æŠžãƒ»è¿½åŠ ã—ã¦ãã ã•ã„. SetupEntityDialog Entity エンティティ CQ CQ ITU Latitude 緯度 Longitude 経度 UTC Main prefix 主ãªãƒ—リフィクス ARRL ID Comma separated possible prefixes, e.g. EA1, EA2, ... ãã®ä»–ã®ä½¿ç”¨ã•れるå¯èƒ½æ€§ã®ã‚るプリフィクスをコンマã§åŒºåˆ‡ã£ã¦å…¥åŠ›. 例 JA1, JA2,... Prefixes ãã®ä»–ã®ãƒ—リフィクス Name of the Entity. CQ zone. ITU zone. Longitude of the Entity. Local time difference to UTC. Main prefix of the entity. ARRL ID. Date of the deletion. Deleted 消滅 Cancel キャンセル Ok OK Entity Dialog エンティティ設定ウィンドウ SetupPageBandMode Bands ãƒãƒ³ãƒ‰ Modes モード SetupPageColors New One Needed in this band ã“ã®ãƒãƒ³ãƒ‰ã§æœªäº¤ä¿¡ Worked in this band ã“ã®ãƒãƒ³ãƒ‰ã§äº¤ä¿¡æ¸ˆ Confirmed in this band ã“ã®ãƒãƒ³ãƒ‰ã§ã‚³ãƒ³ãƒ•ァーム済 Default デフォルト WSJT-X palette Default palette Dark Mode Color when the DXCC is an ATNO (All Time New One). DXCC is confirmed in this band. Default color. Sets a palette of colors similar to the one used in WSJT-X. Sets the default palette. Light Mode This DXCC was worked before in another band but not in the selected band. It may be needed due to the CQ, ITU, Grid, ... ã“ã®DXCCã¯ä»–ã®ãƒãƒ³ãƒ‰ã§ä»¥å‰ã«é‹ç”¨ã•れã¦ã„ãŸãŒã€é¸æŠžã—ãŸãƒãƒ³ãƒ‰ã§ã¯é‹ç”¨ã•れã¦ã„ãªã„。CQã€ITUã€ã‚°ãƒªãƒƒãƒ‰ãªã©ã®é–¢ä¿‚ã§å¿…è¦ã«ãªã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚ Worked DXCC, but not confirmed in this band. DXCCã®æ´»å‹•を行ã„ã¾ã—ãŸãŒã€ã“ã®ãƒãƒ³ãƒ‰ã§ã¯ç¢ºèªã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ Sets the Dark Mode Choose a color 色ã®é¸æŠž SetupPageDxCluster Add 追加 Delete 削除 Show &HF spots Show HF spots &HFスãƒãƒƒãƒˆæƒ…報を表示 Show V/&UHF spots Show V/UHF spots V/&UHFスãƒãƒƒãƒˆæƒ…報を表示 Show W&ARC spots Show WARC spots W&ARCスãƒãƒƒãƒˆæƒ…報を表示 Show &worked spots Show worked spots 交信済ã®ã‚¹ãƒãƒƒãƒˆæƒ…報を表示(&w) Show &confirmed spots Show confirmed spots コンファーム済ã®ã‚¹ãƒãƒƒãƒˆæƒ…報を表示(&c) Show ANN/&FULL messages Show ANN/FULL messages ANN/&FULLメッセージを表示 Show WW&V messages Show WWV messages WW&Vメッセージを表示 Show WC&Y messages Show WCY messages WC&Yメッセージを表示 Save DX Cluster activity DX Cluster活動ã®ä¿å­˜ Saves all the DX-Cluster activity to a file in the KLog folder ã™ã¹ã¦ã®DX-Cluster活動をKLogフォルダ内ã®ãƒ•ァイルã«ä¿å­˜ã™ã‚‹ Send DX Spots to the map Sends the received DX Spots to the map to know where is the activity. DX Spots DXスãƒãƒƒãƒˆ Others ãã®ä»– Messages メッセージ KLog: Add a DXCluster server KLog: DXクラスターサーãƒãƒ¼ã‚’追加 Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: アドレスã¨ãƒãƒ¼ãƒˆç•ªå·ã‚’指定 例: dxfun.com: 8000 ãƒãƒ¼ãƒˆç•ªå·ã®æŒ‡å®šãŒãªã„ã¨ãã¯ã€ãƒ‡ãƒ•ォルトã§41112を使用 SetupPageELog ClubLog password ClubLogã®ãƒ‘スワード ClubLog App password ClubLog email ClubLogã®ãƒ¡ãƒ¼ãƒ« Enter the email you used to register in ClubLog. ClubLogã«ç™»éŒ²ã—ãŸemailを入力ã—ã¦ãã ã•ã„. Enter your password ClubLog here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) パスワードを入力ã™ã‚‹ ClubLog ã¯ã“ã¡ã‚‰è­¦å‘Šã€‚パスワードã¯KLog設定ファイルã®ã‚¯ãƒªã‚¢æ™‚ã«ä¿å­˜ã•れã¾ã™!!!(パスワードを入力ã—ãŸããªã„å ´åˆã¯ã€å¿…è¦ã«ãªã£ãŸã¨ãã«KLogãŒèžã„ã¦ãã¾ã™) Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!! Send QSOs in real time リアルタイムã§ã®QSOé€ä¿¡ Activate ClubLog ClubLogã‚’èµ·å‹•ã™ã‚‹ Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. KLogã§è¿½åŠ ï¼ˆä¿®æ­£ï¼‰ã•れãŸå„QSOをリアルタイムã§ClubLogã«é€ä¿¡ã—ã¾ã™ã€‚ Starts the ClubLog support in KLog. KLogã®ClubLog対応を開始ã—ã¾ã™ã€‚ Activate eQSL.cc eQSL.ccをアクティベートã™ã‚‹ Enter your username of eQSL.cc. eQSL.ccã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åを入力ã—ã¦ãã ã•ã„。 Enter your password eQSL.cc here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) パスワードeQSL.ccã‚’ã“ã“ã«å…¥åŠ›ã—ã¦ãã ã•ã„。警告。パスワードã¯KLogã®è¨­å®šãƒ•ァイルã®ã‚¯ãƒªã‚¢æ™‚ã«ä¿å­˜ã•れã¾ã™!!!(パスワードを入力ã—ãŸããªã„å ´åˆã¯ã€ãƒ‘スワードãŒå¿…è¦ã«ãªã£ãŸã¨ãã«KLogãŒèžã„ã¦ãã¾ã™) eQSL.cc password eQSL.ccパスワード eQSL.cc user eQSL.ccユーザー ClubLog eQSL.cc QRZ.com QRZ.com Enter the user of your QRZ.com account. You need to be subscribed to QRZ.com to use this service. ã‚ãªãŸã®QRZ.comアカウントã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’入力ã—ã¦ãã ã•ã„。ã“ã®ã‚µãƒ¼ãƒ“スを利用ã™ã‚‹ã«ã¯ã€QRZ.comã«åŠ å…¥ã—ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ User Enter your password QRZ.com here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) パスワードを入力ã—ã¦ãã ã•ã„ QRZ.comã¯ã“ã¡ã‚‰è­¦å‘Šã€‚パスワードã¯KLogã®è¨­å®šãƒ•ァイルã®ã‚¯ãƒªã‚¢æ™‚ã«ä¿å­˜ã•れã¾ã™!(パスワードを入力ã—ãŸããªã„å ´åˆã¯ã€å¿…è¦ã«ãªã£ãŸã¨ãã«KLogãŒèžã„ã¦ãã¾ã™ã€‚) Password Activate QRZ.com Check automatically Check in Qrz.com all Calls as they are entered Paying Subscriber Check it if you are paying for a qrz.com subscription LogBook Key LogBook Key for QSO uploading. You can get this key in your QRZ.com logbook webpage. Remember that you need a QRZ.com subscription to use this feature. QSOアップロード用ã®ãƒ­ã‚°ãƒ–ックキーã§ã™ã€‚ã“ã®ã‚­ãƒ¼ã¯ã€QRZ.comã®ãƒ­ã‚°ãƒ–ックã®ã‚¦ã‚§ãƒ–ページã§å…¥æ‰‹ã§ãã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã‚’使用ã™ã‚‹ã«ã¯ã€QRZ.comã®å¥‘ç´„ãŒå¿…è¦ã§ã‚ã‚‹ã“ã¨ã‚’覚ãˆã¦ãŠã„ã¦ãã ã•ã„。 LoTW Upload Download TQSL path Use TQSL LoTW password LoTW user Enter your LoTW user. Enter your password LoTW here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) ã“ã“ã«ãƒ‘スワードLoTWを入力ã—ã¦ãã ã•ã„。警告。パスワードã¯KLogã®è¨­å®šãƒ•ァイルã®ã‚¯ãƒªã‚¢æ™‚ã«ä¿å­˜ã•れã¾ã™!!!!(パスワードを入力ã—ãŸããªã„å ´åˆã¯ã€ãƒ‘スワードãŒå¿…è¦ã«ãªã£ãŸã¨ãã«KLogãŒèžã„ã¦ãã¾ã™) Path to the TQSL software. TQSLソフトウェアã¸ã®ãƒ‘ス。 Enable the LoTW integration with TQSL. You will need to have TQSL installed TQSLã¨ã®LoTW連æºã‚’有効ã«ã—ã¾ã™ã€‚TQSLãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ Select File ãƒ•ã‚¡ã‚¤ãƒ«é¸æŠž SetupPageHamLib Activate HamLib HamLibã®èµ·å‹• Activates the hamlib support that will enable the connection to a radio. 無線機ã¨ã®æŽ¥ç¶šã‚’å¯èƒ½ã«ã™ã‚‹hamlibサãƒãƒ¼ãƒˆã‚’有効ã«ã—ã¾ã™ã€‚ Read-Only mode Read-Onlyモード If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio. 有効ã«ã™ã‚‹ã¨ã€KLogã¯ç„¡ç·šæ©Ÿã‹ã‚‰Freq/Modeを読ã¿å–りã¾ã™ãŒã€ç„¡ç·šæ©Ÿã«ã‚³ãƒžãƒ³ãƒ‰ã‚’é€ä¿¡ã™ã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“。 Radio Select your rig. ãƒªã‚°ã‚’é¸æŠžã—ã¦ãã ã•ã„。 Serial Network Defines the interval to poll the radio in msecs. 無線機をãƒãƒ¼ãƒªãƒ³ã‚°ã™ã‚‹é–“隔をmsecå˜ä½ã§å®šç¾©ã—ã¾ã™ã€‚ Poll interval ãƒãƒ¼ãƒ«ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒ« Test: OK Test: NOK Test Click to test the connection to the radio クリックã—ã¦ç„¡ç·šæ©Ÿã¸ã®æŽ¥ç¶šã‚’テストã™ã‚‹ SetupPageLogView Fields SetupPageLogs &New New æ–°è¦ãƒ­ã‚°(&N) &Edit 編集(&E) &Remove 削除(&R) KLog KLog Do you really want to remove this log? ã“ã®ãƒ­ã‚°ã‚’本当ã«å‰Šé™¤ã—ã¾ã™ã‹? Operators オペレータ An error has occurred showing the following error code: 次ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ãŒç™ºç”Ÿã—ã¾ã—ãŸ: Log has not been removed. (#3) ログãŒå‰Šé™¤ã•れã¾ã›ã‚“ã§ã—ãŸ(#3) Log has not been removed. (#2) ログãŒå‰Šé™¤ã•れã¾ã›ã‚“ã§ã—ãŸ(#2) Log has not been removed. (#1) ログãŒå‰Šé™¤ã•れã¾ã›ã‚“ã§ã—ãŸ(#1) QSOs QSOç·æ•° The new log could not be created. æ–°ã—ã„ログを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ KLog - SetupPageLogs Date 日付 Add a new log. æ–°ã—ã„ログを追加ã—ã¾ã™ã€‚ Edit the selected log. é¸æŠžã—ãŸãƒ­ã‚°ã‚’編集ã—ã¾ã™ã€‚ Remove the selected log. é¸æŠžã—ãŸãƒ­ã‚°ã‚’削除ã—ã¾ã™ã€‚ All the QSOs from this log will also be deleted... ID Station Callsign ç„¡ç·šå±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ Comments コメント SetupPageLogsNew &Ok &Cancel キャンセル(&C) &Date 日付(&D) &Station Callsign ç„¡ç·šå±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³(&S) &Operators オペレーター(&O) Comm&ent コメント(&e) Callsign used for this log. Comma separated list of operators: callsign1, callsign2. コンマã§åŒºåˆ‡ã‚‰ã‚ŒãŸã‚ªãƒšãƒ¬ãƒ¼ã‚¿ãƒ¼ã®ãƒªã‚¹ãƒˆ: callsign1, callsign2. {1,?} Start date of this log. ã“ã®ãƒ­ã‚°ã®é–‹å§‹æ—¥ã€‚ Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. ã“ã®ãƒ­ã‚°ã«é–¢ã™ã‚‹ã‚³ãƒ¡ãƒ³ãƒˆã‚’追加ã—ã¾ã™ã€‚記入ã•れãŸå ´åˆã€ãƒ­ã‚°ã‚’識別ã™ã‚‹ãŸã‚ã«KLogã®ãƒ¡ã‚¤ãƒ³ã‚¿ã‚¤ãƒˆãƒ«ã«è¡¨ç¤ºã•れã¾ã™ã€‚ You need to enter a valid callsign in the Station Callsign box. The log will not be opened. Station Callsignã€ã®æ¬„ã«æœ‰åйãªã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’入力ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ ã“ã®å ´åˆã€ãƒ­ã‚°ã¯é–‹ãã¾ã›ã‚“。 SetupPageMisc &Imperial system Imperial system インãƒãƒ»ãƒ¤ãƒ¼ãƒ‰è¡¨è¨˜(&I) &Log in real time Log in real time ç¾åœ¨æ™‚刻ã§ãƒ­ã‚°ã‚’記録(&L) &Time in UTC Time in UTC 時刻ã®UTC表記(&T) &Save ADIF on exit Save ADIF on exit 終了時ã«ADIFã‚’ä¿å­˜(&S) Use this &default filename Use this default filename 次ã®ãƒ‡ãƒ•ォルトã®ãƒ•ァイルåを使用(&d) Mark &QSO to send QSL when QSL is received Mark QSO to send QSL when QSL is received &QSLカードå—領時ã«ç™ºé€ã«ãƒžãƒ¼ã‚¯ã™ã‚‹ Complete QSO with previous data 以å‰ã®ãƒ‡ãƒ¼ã‚¿ã‚’使ã£ã¦QSOã®é …目を埋ã‚ã‚‹ Manage DX-Marathon DX-Marathonã®ç®¡ç† Activate the application debug log アプリケーションデãƒãƒƒã‚°ãƒ­ã‚°ã®æœ‰åŠ¹åŒ– &Delete always temp ADIF file after uploading QSOs QSOをアップロードã—ãŸå¾Œã€å¸¸ã«ä¸€æ™‚çš„ãªADIFファイルを削除ã™ã‚‹ã€‚ In seconds, enter the time range to consider a duplicate if same call, band and mode is entered. åŒã˜ã‚³ãƒ¼ãƒ«ã€ãƒãƒ³ãƒ‰ã€ãƒ¢ãƒ¼ãƒ‰ãŒå…¥åŠ›ã•れãŸå ´åˆã«é‡è¤‡ã¨ã¿ãªã™æ™‚間範囲を秒å˜ä½ã§å…¥åŠ›ã—ã¾ã™ã€‚ If you disable this checkbox KLog will not check callsigns to identify wrong callsigns. The search box will also show the callsign on the air to do the QSO. 検索ボックスã«ã¯ã€QSOを行ã†ãŸã‚ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚‚表示ã•れã¾ã™ã€‚ If new version checking is selected, KLog will send the developer your callsign, KLog version and Operating system to help in improving KLog. æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ãƒã‚§ãƒƒã‚¯ãŒé¸æŠžã•れãŸå ´åˆã€KLogã¯é–‹ç™ºè€…ã«ã‚ãªãŸã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã€KLogã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã€ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ã‚’é€ä¿¡ã—ã€KLogã®æ”¹å–„ã«å½¹ç«‹ã¦ã¾ã™ã€‚ Check it for Imperial system (Miles instead of Kilometers). インペリアル方å¼ï¼ˆã‚­ãƒ­ãƒ¡ãƒ¼ã‚¿ãƒ¼ã§ã¯ãªãマイル)ã«ãªã£ã¦ã„ã‚‹ã‹ç¢ºèªã—ã¦ãã ã•ã„。 Select to use the following name for the logfile without being asked for it again. ログファイルã«ã¯æ¬¡ã®ãƒ•ァイルåを用ã„ã€ä»¥å¾Œã€å°‹ã­ã‚‰ã‚Œãªã„よã†ã«ã™ã‚‹ã«ã¯ã€ãƒã‚§ãƒƒã‚¯ã‚’ã„れã¦ãã ã•ã„. Select if you want to manage DX-Marathon. DX-Marathonã®ç®¡ç†ã‚’行ã†ã‹ã©ã†ã‹ã‚’é¸æŠžã—ã¾ã™ã€‚ This is the default file where ADIF data will be saved. ADIFå½¢å¼ã§ãƒ•ァイルをä¿å­˜ã™ã‚‹ã¨ãã®ãƒ‡ãƒ•ォルトã®ãƒ•ァイルå. Activates the application debug log. This may be useful if something is not working as expected. A debug file will be created in the KLog directory. アプリケーションã®ãƒ‡ãƒãƒƒã‚°ãƒ­ã‚°ã‚’有効ã«ã—ã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã¯ã€ä½•ã‹ãŒæœŸå¾…通りã«å‹•作ã—ãªã„å ´åˆã«å½¹ç«‹ã¡ã¾ã™ã€‚KLogディレクトリã«ãƒ‡ãƒãƒƒã‚°ãƒ•ァイルãŒä½œæˆã•れã¾ã™ã€‚ Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default. クリックã™ã‚‹ã¨ã€ã™ã¹ã¦ã®æ–°è¦QSOã«ãŠã‘ã‚‹ã™ã¹ã¦ã®eQSL(LoTWã¨eQSL)ãŒãƒ‡ãƒ•ォルトã§Queued(é€ä¿¡äºˆå®šï¼‰ã«ãªã‚Šã¾ã™ã€‚ Delete Always the adif file created after uploading QSOs QSOã®ã‚¢ãƒƒãƒ—ロード後ã«ä½œæˆã•れãŸadifファイルを常ã«å‰Šé™¤ã™ã‚‹ Dupe time range: Please specify an existing directory where the database (logbook.dat) will be saved. データベース (logbook.dat) ãŒä¿å­˜ã•れる既存ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãƒ¼ã‚’指定ã—ã¦ãã ã•ã„. Show the Station &Callsign used in the search box æ¤œç´¢çµæžœã«ä½¿ç”¨ã—ãŸç„¡ç·šå±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚‚表示ã™ã‚‹(&C) &Check for new versions automatically æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’自動ã§ãƒã‚§ãƒƒã‚¯ã™ã‚‹ (&C) QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. 相手局ã®QSLカードをå—é ˜ã—ã¦ã€ã‹ã¤è‡ªåˆ†ã®QSLカードをé€ä»˜ã—ã¦ã„ãªã‘れã°ã€QSLカードã®é€ä»˜å¾…ã¡ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã‚’ã—ã¾ã™. Check if there is a new release of KLog available every time you start KLog. KLogã®èµ·å‹•æ™‚ã«æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒãƒªãƒªãƒ¼ã‚¹ã•れã¦ã„ã‚‹ã‹ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¾ã™. &Provide Info for statistics 統計情報をæä¾›ã™ã‚‹ (&P) Mark sent eQSL && LoTW in new QSO as queued Move DB DBを移動 Select to use real time. ç¾åœ¨æ™‚刻ã®ãƒ­ã‚°è¨˜å…¥ã‚’行ã†å ´åˆã€ãƒã‚§ãƒƒã‚¯ã‚’ã„れã¦ãã ã•ã„ Select to use UTC time. 時刻ã®UTC表記を行ã†å ´åˆã€ãƒã‚§ãƒƒã‚¯ã‚’入れã¦ãã ã•ã„ Select if you want to save to ADIF on exit. 終了時ã«ADIFå½¢å¼ã§ä¿å­˜ã—ãŸã„å ´åˆã€ãƒã‚§ãƒƒã‚¯ã‚’ã„れã¦ãã ã•ã„ Complete the current QSO with previous QSO data. ç¾åœ¨ã®QSOã®å„項目を埋ã‚ã‚‹ã®ã«ã€ä»¥å‰ã®QSOã®ãƒ‡ãƒ¼ã‚¿ã‚’使用ã—ã¾ã™. This is the directory where the database (logbook.dat) will be saved. ã“ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãƒ¼ã«ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ (logbook.dat) ãŒä¿å­˜ã•れã¾ã™. Click to change the path of the database. データベースã®ãƒ‘スを変更ã™ã‚‹ã«ã¯ã‚¯ãƒªãƒƒã‚¯. This is the directory where DB (logbook.dat) will be saved. ã“ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãƒ¼ã«DB (logbook.dat) ãŒä¿å­˜ã•れã¾ã™. Click to change the default ADIF file. デフォルトã®ADIFファイルを変更ã™ã‚‹ã«ã¯ã‚¯ãƒªãƒƒã‚¯ã—ã¦ãã ã•ã„. Check non-valid calls Show seconds Show seconds in the QSO editor Click to move the DB to the new directory. DBã‚’æ–°ã—ã„ディレクトリーã«ç§»å‹•ã™ã‚‹ã«ã¯ã‚¯ãƒªãƒƒã‚¯ã—ã¦ãã ã•ã„. Select the application debug log level. This may be useful if something is not working as expected. A debug file will be created in the KLog directory and/or shown with Help->Debug menu. Log level Select Directory ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãƒ¼ã‚’é¸æŠž KLog - Move DB File moved ファイルを移動ã—ã¾ã—㟠File copied ファイルをコピーã—ã¾ã—㟠File already exist. The destination file already exist and KLog will not replace it. Please remove the file from the destination folder before moving the file with KLog to make sure KLog can copy the file. File NOT copied ファイルãŒã‚³ãƒ”ーã•れã¾ã›ã‚“ã§ã—㟠The file was not copied due to an unknown problem. The target directory does not exist. Please select an existing directory. 移動先ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãƒ¼ãŒå­˜åœ¨ã—ã¾ã›ã‚“. 既存ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãƒ¼ã‚’指定ã—ã¦ãã ã•ã„. Browse å‚ç…§ Open File ファイルを開ã SetupPageSats &New æ–°è¦ãƒ­ã‚°(&N) &Edit 編集(&E) &Remove 削除(&R) &Import E&xport Add a new satellite. æ–°ã—ã„衛星を追加ã—ã¾ã™ã€‚ Edit the selected satellite. é¸æŠžã—ãŸè¡›æ˜Ÿã‚’編集ã—ã¾ã™ã€‚ Remove the selected satellite. é¸æŠžã—ãŸè¡›æ˜Ÿã‚’削除ã—ã¾ã™ã€‚ Export your current satellites to a file. ç¾åœ¨ã®è¡›æ˜Ÿã‚’ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ã出ã™ã“ã¨ãŒã§ãã¾ã™ã€‚ Select the sat you want to open. é–‹ããŸã„è¡›æ˜Ÿã‚’é¸æŠžã—ã¾ã™ã€‚ KLog KLog Do you really want to remove this satellite? 本当ã«ã“ã®è¡›æ˜Ÿã‚’削除ã—ãŸã„ã®ã§ã™ã‹ï¼Ÿ Import a satellites file. It will replace the satellites you have in the current list. 衛星ファイルをインãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ç¾åœ¨ã®ãƒªã‚¹ãƒˆã«å…¥ã£ã¦ã„るサテライトãŒç½®ãæ›ãˆã‚‰ã‚Œã¾ã™ã€‚ This satellite will no be longer available to be selected ... Sat has not been removed. (#3) Sat has not been removed. (#2) Sat has not been removed. (#1) ID Short Name åå‰ Uplink Downlink Modes モード An error has occurred showing the following error code: 次ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ãŒç™ºç”Ÿã—ã¾ã—ãŸ: KLog - SetupPageSats Open Satellites File 衛星ファイルを開ã KLog warning An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. 衛星データã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆæ™‚ã«äºˆæœŸã›ã¬ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ インãƒãƒ¼ãƒˆã—よã†ã¨ã—ã¦ã„るファイルã®å½¢å¼ãŒæ­£ã—ããªã„ã“ã¨ãŒåŽŸå› ã®ã‚ˆã†ã§ã™ã€‚ Please check the format or contact the developer for analysis with the error code: フォーマットを確èªã™ã‚‹ã‹ã€ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã§é–‹ç™ºè€…ã«è§£æžã‚’ä¾é ¼ã—ã¦ãã ã•ã„。 Save Satellites File 衛星ファイルã®ä¿å­˜ SetupPageSatsNew Short name Sat name UpLink アップリンク DownLink ダウンリンク Modes モード &Ok &Cancel キャンセル(&C) Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. ショートãƒãƒ¼ãƒ ã‚’入力ã—ã¾ã™ã€‚QSOã®å¾Œã«LoTWã«ã‚¢ãƒƒãƒ—ロードã§ãるよã†ã«ã€LoTWã®ã‚·ãƒ§ãƒ¼ãƒˆãƒãƒ¼ãƒ ã‚’使ã†ã‚ˆã†ã«ã—ã¦ãã ã•ã„。 Enter the name of the satellite. 衛星ã®åå‰ã‚’入力ã—ã¦ãã ã•ã„。 Enter the uplink frequencies in this format: 144.300 アップリンクã®å‘¨æ³¢æ•°ã‚’ã“ã®ãƒ•ォーマットã§å…¥åŠ›ã—ã¦ãã ã•ã„:144.300 Enter the downlink frequencies in this format: 144.300 ダウンリンクã®å‘¨æ³¢æ•°ã‚’ã“ã®ãƒ•ォーマットã§å…¥åŠ›ã—ã¦ãã ã•ã„:144.300 Enter the modes in this format: USB ã“ã®å½¢å¼ã§ãƒ¢ãƒ¼ãƒ‰ã‚’入力ã—ã¾ã™ï¼šUSB Some of the data you have entered is not correct; the satellite can't be added. 入力ã—ãŸãƒ‡ãƒ¼ã‚¿ã®ä¸€éƒ¨ãŒæ­£ã—ããªã„ãŸã‚ã€è¡›æ˜Ÿã‚’追加ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 SetupPageSubdivisionNew &Date 日付(&D) &Station Callsign ç„¡ç·šå±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³(&S) &Operators オペレーター(&O) Comm&ent コメント(&e) &Ok &Cancel キャンセル(&C) Callsign used for this log. Comma separated list of operators: callsign1, callsign2. コンマã§åŒºåˆ‡ã‚‰ã‚ŒãŸã‚ªãƒšãƒ¬ãƒ¼ã‚¿ãƒ¼ã®ãƒªã‚¹ãƒˆ: callsign1, callsign2. {1,?} Start date of this log. ã“ã®ãƒ­ã‚°ã®é–‹å§‹æ—¥ã€‚ Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. ã“ã®ãƒ­ã‚°ã«é–¢ã™ã‚‹ã‚³ãƒ¡ãƒ³ãƒˆã‚’追加ã—ã¾ã™ã€‚記入ã•れãŸå ´åˆã€ãƒ­ã‚°ã‚’識別ã™ã‚‹ãŸã‚ã«KLogã®ãƒ¡ã‚¤ãƒ³ã‚¿ã‚¤ãƒˆãƒ«ã«è¡¨ç¤ºã•れã¾ã™ã€‚ You need to enter a valid callsign in the Station Callsign box. The log will not be opened. ç„¡ç·šå±€ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã®æ¬„ã«æœ‰åйãªã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’入力ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ ã“ã®å ´åˆã€ãƒ­ã‚°ã¯é–‹ãã¾ã›ã‚“。 SetupPageSubdivisions &Remove 削除(&R) Import new Import an AWA file with the subdivision details. Remove the selected references. é¸æŠžã—ãŸãƒªãƒ•ァレンスを削除ã—ã¾ã™ã€‚ Select the references you want to open. é–‹ããŸã„ãƒªãƒ•ã‚¡ãƒ¬ãƒ³ã‚¹ã‚’é¸æŠžã—ã¾ã™ã€‚ KLog KLog Do you really want to remove the data of this entity? 本当ã«ã“ã®ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ã®ãƒ‡ãƒ¼ã‚¿ã‚’削除ã—ãŸã„ã®ã§ã™ã‹ï¼Ÿ All the subdivision information for this entity will be deleted... Log has not been removed. (#3) ログãŒå‰Šé™¤ã•れã¾ã›ã‚“ã§ã—ãŸ(#3) Log has not been removed. (#2) ログãŒå‰Šé™¤ã•れã¾ã›ã‚“ã§ã—ãŸ(#2) Log has not been removed. (#1) ログãŒå‰Šé™¤ã•れã¾ã›ã‚“ã§ã—ãŸ(#1) ID Name åå‰ Short Name CQ Zone CQゾーン ITU Zone ITUゾーン Deleted 消滅 Start Date End Date DXCC DXCC An error has occurred showing the following error code: 次ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ãŒç™ºç”Ÿã—ã¾ã—ãŸ: KLog - SetupPageSubdivisions SetupPageUDP Start UDP Server UDPサーãƒãƒ¼ã®èµ·å‹• Automatically log QSOs from WSJT-X WSJT-Xã‹ã‚‰ã®QSOを自動的ã«è¨˜éŒ²ã™ã‚‹ Allow WSJT-X to send logged QSOs to KLog WSJT-XãŒãƒ­ã‚°ã—ãŸQSOã‚’KLogã«é€ä¿¡ã§ãるよã†ã«ã™ã‚‹ã€‚ QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected WSJT-Xã«è¨˜éŒ²ã•れãŸQSOã¯KLogã«é€ä¿¡ã•れã€KLogã¯"%1 "ãŒé¸æŠžã•れãªã„é™ã‚Šã€KLogã«ãƒ­ã‚°ã‚¤ãƒ³ã™ã‚‹å‰ã«å°‹ã­ã¦ãã¾ã™ã€‚ KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. KLogã¯ã€WSJT-Xã‹ã‚‰ã®QSOã‚’ã€æ‰‹å‹•ã§ç¢ºèªã™ã‚‹ã“ã¨ãªãã€è‡ªå‹•çš„ã«è¨˜éŒ²ã—ã¾ã™ã€‚ Update status information from WSJT-X WSJT-Xã‹ã‚‰ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹æƒ…å ±ã®æ›´æ–° KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...) KLogã¯ã€WSJT-Xã‹ã‚‰ã®ãƒ‡ãƒ¼ã‚¿ï¼ˆDXコールサインã€ãƒ¬ãƒãƒ¼ãƒˆã€ãƒ¢ãƒ¼ãƒ‰ãªã©ï¼‰ã‚’自動的ã«è¡¨ç¤ºãƒ»æ›´æ–°ã—ã¾ã™ã€‚ UDP port number where the UDP Server will listen for packets. UDPサーãƒãƒ¼ãŒãƒ‘ケットをリッスンã™ã‚‹UDPãƒãƒ¼ãƒˆç•ªå·ã€‚ Make sure it is the same port that the other programs are sending the data to. Default port is 2237. ä»–ã®ãƒ—ログラムãŒãƒ‡ãƒ¼ã‚¿ã‚’é€ä¿¡ã—ã¦ã„ã‚‹ã®ã¨åŒã˜ãƒãƒ¼ãƒˆã§ã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。デフォルトã®ãƒãƒ¼ãƒˆã¯2237ã§ã™ã€‚ UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. UDPサーãƒãƒ¼ã¯ã€WSJT-Xãªã©ã®ä»–ã®ãƒ—ログラムã‹ã‚‰é€ä¿¡ã•れãŸQSOã‚’å—ä¿¡ã—ã€ãれらã®ãƒ—ログラムã‹ã‚‰è‡ªå‹•çš„ã«KLogã«ãƒ­ã‚°ã‚¤ãƒ³ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ UDP Port UDPãƒãƒ¼ãƒˆ Select the interface to listen for UDP datagrams coming from WSJT-X. WSJT-Xã‹ã‚‰é€ã‚‰ã‚Œã¦ãã‚‹UDPデータグラムをリッスンã™ã‚‹ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’é¸æŠžã—ã¾ã™ã€‚ Network interface ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェース QSOs notification timeout (milisecs) QSOs通知タイムアウト(ミリ秒) Miliseconds that the notification of QSOs received from WSJTX will be shown. WSJTXã‹ã‚‰å—ä¿¡ã—ãŸQSOã®é€šçŸ¥ãŒè¡¨ç¤ºã•れるミリ秒。 SetupPageUserDataPage &Personal data Personal data å€‹äººã®æƒ…å ±(&P) Station &data Station data ç„¡ç·šå±€ã®æƒ…å ±(&d) &Name Name åå‰(&N) &Address Address 使‰€(&A) Cit&y City 市町æ‘(&y) &Zip Code Zip Code 郵便番å·(&Z) Pro&v/State Prov/State 厳密ã«ã¯Prov/Stateã˜ã‚ƒãªã„ã§ã™ã‘㩠都é“府県(&v) Countr&y Country 国(&y) Enter your information for rig ãƒªã‚°ã®æƒ…報を入力ã—ã¦ãã ã•ã„ Enter your information for antenna ã‚¢ãƒ³ãƒ†ãƒŠã®æƒ…報を入力ã—ã¦ãã ã•ã„ Enter your name. åå‰ã‚’入力ã—ã¦ãã ã•ã„。 Enter your address - 1st line. 使‰€ã‚’入力 - 1行目 Enter your address - 2nd line. 使‰€ã‚’入力-2行目 Enter your address - 3rd line. 使‰€ã‚’入力 - 3行目 Enter your address - 4th line. 使‰€ã‚’入力 - 4行目 Enter your city. 都市åを入力ã—ã¦ãã ã•ã„。 Enter your zip code. 郵便番å·ã‚’入力ã—ã¦ãã ã•ã„。 Enter your province or state. 都é“府県åを入力ã—ã¦ãã ã•ã„。 Enter your country. ã‚ãªãŸã®å›½ã‚’入力ã—ã¦ãã ã•ã„。 Enter your power information. 出力を入力ã—ã¦ãã ã•ã„。 &Rig 1 リグ 1(&R) R&ig 2 リグ 2(&i) Ri&g 3 リグ 3(&g) Antenna &1 アンテナ &1 Antenna &2 アンテナ &2 Antenna &3 アンテナ &3 Po&wer é€ä¿¡å‡ºåŠ›(&w) Enter the station callsign that will be used for logging. ロギングã«ä½¿ç”¨ã™ã‚‹å±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’入力ã—ã¾ã™ã€‚ Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. 自局ã®ã‚°ãƒªãƒƒãƒ‰ãƒ­ã‚±ãƒ¼ã‚¿ãƒ¼ã‚’入力ã—ã¦ãã ã•ã„. 入力ã•れãªã‘れã°KLogã¯ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã®æƒ…報をもã¨ã«ã‚°ãƒªãƒƒãƒ‰ãƒ­ã‚±ãƒ¼ã‚¿ãƒ¼ã‚’推測ã—ã¦è¡¨ç¤ºã—ã¾ã™. &Callsign コールサイン &Operators オペレーター(&O) &CQ Zone CQゾーン(&C) &ITU Zone ITUゾーン(&I) &Locator グリッドロケーター(&L) &Locator (not valid) グリッドロケーター(ä¸é©åˆï¼‰(&L) Enter the operators (comma separated if more than one). オペレーターåを入力ã—ã¦ãã ã•ã„。(複数ã®å ´åˆã¯ã‚³ãƒ³ãƒžã§åŒºåˆ‡ã£ã¦å…¥åŠ›ã—ã¦ãã ã•ã„。) SetupPageWorldEditor Add 追加 Delete 削除 Edit Export World Import World Still not implemented. ã¾ã å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“。 Import a new cty.csv file æ–°ã—ã„ cty.csv ファイルã®èª­ã¿è¾¼ã¿ An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. DXCC情報å–å¾—ã®ãƒ•ァイル (cty.csv) ãŒKLogフォルダーã«è¦‹ã¤ã‹ã‚Šã¾ã—ãŸ. ファイルをロードã—ã¾ã™. No entities information file (cty.csv) has been detected in your KLog folder. DXCC情報å–å¾—ã®ãƒ•ァイル (cty.csv) ãŒKLogフォルダーã«è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“. KLog will not be able to show entities information. KLogã¯DXCC情報ã®è¡¨ç¤ºãŒã§ãã¾ã›ã‚“. Prefix プリフィクス Entity エンティティ ARRL ID Continent 大陸å CQ Zone CQゾーン ITU Zone ITUゾーン UTC Latitude 緯度 Longitude 経度 Deleted 消滅 Since Date 交信有効期間ã¯ã˜ã‚ To Date 交信有効期間ãŠã‚り Open File ファイルを開ã BigCTY (*.csv) Entities information has been updated. DXCCæƒ…å ±ãŒæ›´æ–°ã•れã¾ã—ãŸ. Entities information has not been updated. DXCCæƒ…å ±ãŒæ›´æ–°ã•れã¾ã›ã‚“ã§ã—ãŸ. ShowAdifImportWidget The following QSOs are those QSOs that you have received the LoTW confirmation. 以下ã®QSOã¯ã€ã‚ãªãŸãŒLoTWã®ç¢ºèªã‚’å—ã‘ãŸQSOã§ã™ã€‚ Ok OK DX DX Date/Time 日付/時刻 Band ãƒãƒ³ãƒ‰ Mode モード ShowErrorDialog KLog Message KLog メッセージ SoftwareUpdateDialog Ok OK KLog update KLogã®æ›´æ–° <center><h2>KLog new version (%1) is available! </h2></center><br>There is a new version of KLog available.<br><br><b>You can get the new version from:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> <center><h2>KLogã®æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³(%1)ãŒå…¬é–‹ã•れã¾ã—ãŸã€‚ </h2></center><br>KLogã®æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã‚りã¾ã™ã€‚<br><br><b>ã‹ã‚‰æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’入手ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<br><br><center>&lt;a href=https://www.klog.xyz&gt;https://www.klog.xyz</a></center> Congratulations! ãŠã‚ã§ã¨ã†ã”ã–ã„ã¾ã™! Your KLog has been updated. ãŠä½¿ã„ã® KLog ã¯æ›´æ–°ã•れã¾ã—ãŸ. You already have the latest version. 最新ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’入手ã—ã¾ã—ãŸ. StartWizard KLog - The free hamradio logging program フリーãªã‚¢ãƒžãƒãƒ¥ã‚¢ç„¡ç·šç”¨ãƒ­ã‚°ã‚½ãƒ•ト KLog Quit Setup 設定ã®ä¸­æ­¢ Setup is not complete yet. Are you sure you want to quit setup? 設定ã¯å®Œäº†ã—ã¦ã„ã¾ã›ã‚“。本当ã«è¨­å®šã‚’中止ã—ã¾ã™ã‹? StatisticsWidget QSO per year å¹´é–“QSO DXCC per year å¹´é–“ã®DXCC CQ zones per year å¹´é–“ã®CQゾーン QSO per band ãƒãƒ³ãƒ‰ã”ã¨ã®QSO QSO per mode モードã”ã¨ã®QSO QSO per DXCC DXCCã”ã¨ã®QSO QSO per Continent 大陸ã”ã¨ã®QSO QSO per hour 時間ã‚ãŸã‚Šã®QSO QSO per month 月ã‚ãŸã‚Šã®QSO Worked / Confirmed status Worked / Sent status Sent / Confirmed status Satellite grid status Satellite DXCC status Grids per band status DXCC per band status StatsCQZPerYearBarChartWidget CQ Zones per year 1å¹´ã‚ãŸã‚Šã®CQ Zone Reading data ... データã®èª­ã¿è¾¼ã¿ ... Abort reading 読込ã¿ã®ä¸­æ­¢ CQ zones CQ zones per year 1å¹´ã‚ãŸã‚Šã®CQ Zone Reading data ... データã®èª­ã¿è¾¼ã¿ ... Years: %1/%2 StatsDXCCOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Callsign コールサイン Date 日付 Band ãƒãƒ³ãƒ‰ Mode モード DXCC DXCC Satellite サテライト通信 Confirmed コンファーム済 No ã„ã„㈠StatsEntitiesPerYearBarChartWidget Chart title Reading data ... データã®èª­ã¿è¾¼ã¿ ... Abort reading 読込ã¿ã®ä¸­æ­¢ DXCC Entities Reading data ... データã®èª­ã¿è¾¼ã¿ ... Entities: エンティティ: StatsFieldPerBandWidget All ã™ã¹ã¦ã®ãƒ­ã‚° Mode: Band ãƒãƒ³ãƒ‰ Worked Confirmed コンファーム済 StatsGridsOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Callsign コールサイン Date 日付 Band ãƒãƒ³ãƒ‰ Mode モード Grid Satellite サテライト通信 Confirmed コンファーム済 No ã„ã„㈠StatsQSOsPerBandBarChartWidget QSOs per band Reading data ... データã®èª­ã¿è¾¼ã¿ ... Abort reading 読込ã¿ã®ä¸­æ­¢ Bands ãƒãƒ³ãƒ‰ QSOs per band distribution ãƒãƒ³ãƒ‰ã”ã¨ã®QSOæ•°ã®åˆ†å¸ƒ Reading data ... データã®èª­ã¿è¾¼ã¿ ... Bands: StatsQSOsPerContinentBarChartWidget QSOs per continent 大陸ã”ã¨ã®QSO Reading data ... データã®èª­ã¿è¾¼ã¿ ... Abort reading 読込ã¿ã®ä¸­æ­¢ Continents 大陸 Reading data ... データã®èª­ã¿è¾¼ã¿ ... Hours: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC DXCCã”ã¨ã®QSO Reading data ... データã®èª­ã¿è¾¼ã¿ ... Abort reading 読込ã¿ã®ä¸­æ­¢ Reading data... データã®èª­ã¿è¾¼ã¿... DXCC DXCC Top ten DXCC per QSO StatsQSOsPerHourBarChartWidget QSOs per hour 1時間ã‚ãŸã‚Šã®QSOæ•° Reading data ... データã®èª­ã¿è¾¼ã¿ ... Abort reading 読込ã¿ã®ä¸­æ­¢ Hours QSOs at hour Reading data ... データã®èª­ã¿è¾¼ã¿ ... Hours: StatsQSOsPerModeBarChartWidget QSOs per mode モードã‚ãŸã‚Šã®QSO Reading data ... データã®èª­ã¿è¾¼ã¿ ... Abort reading 読込ã¿ã®ä¸­æ­¢ Modes モード QSOs per mode distribution モード別QSO数分布 Reading data ... データã®èª­ã¿è¾¼ã¿ ... Modes: StatsQSOsPerMonthBarChartWidget QSOs per month 月間QSOæ•° Reading data ... データã®èª­ã¿è¾¼ã¿ ... Abort reading 読込ã¿ã®ä¸­æ­¢ Jan 1月 Feb 2月 Mar 3月 Apr 4月 May 5月 Jun 6月 Jul 7月 Sep 9月 Oct 10月 Nov 11月 Dec 12月 Aug 8月 Months 月 QSOs at Month 月間QSOæ•° Reading data ... データã®èª­ã¿è¾¼ã¿ ... Months: StatsQSOsPerYearBarChartWidget Reading data ... データã®èª­ã¿è¾¼ã¿ ... Abort reading 読込ã¿ã®ä¸­æ­¢ QSOs QSOç·æ•° QSOs per year å¹´é–“QSOæ•° Reading data ... データã®èª­ã¿è¾¼ã¿ ... QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Confirmed - %2 Sent / Confirmed status StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Confirmed - %2 Worked / Confirmed status StatsWorkedSentPieChartWidget Worked - %1 Sent - %2 Worked / Sent status TipsDialog KLog tips Next 次㸠Previous å‰ã¸ <b>Tip #1:</b><br>Do you know...<br>You can use <a href="#ToolsFillInQSO">Tools->Fill in QSO data</a> to automatically read the full log to fill the DXCC, CQ, ITU zones and continent? Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in QSO data <b>ヒント1</b><br>知ã£ã¦ã„ã¾ã™ã‹...<br> <a href="#ToolsFillInQSO">ツールã€â†’「QSOデータã®å…¥åŠ›</a>ã€ã‚’使ã†ã¨ã€è‡ªå‹•çš„ã«ãƒ­ã‚°å…¨ä½“を読ã¿è¾¼ã‚“ã§ã€DXCCã€CQã€ITUゾーンã€å¤§é™¸ã‚’入力ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚</br> <b>Tip #3:</b><br>Do you know...<br>You can use <a href="#ToolsFindQSO2QSL">Tools->QSL tools...->Find QSO to QSL</a> to look for all those QSO that you should send your QSL because you still need to confirm that DXCC and you have still not send your QSL card? Translator: Please make sure that the name of the link is coherent with the menu Tools->QSL tools...->Find QSO to QSL <b>ヒントãã®3。</b><br>知ã£ã¦ã„ã¾ã™ã‹...<br> <a href="#ToolsFindQSO2QSL">ツールã€â†’「QSLツールã€...→「QSLã™ã‚‹QSOを探ã™</a>ã€ã‚’使ã†ã¨ã€DXCCを確èªã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã®ã«QSLカードをã¾ã é€ã£ã¦ã„ãªã„ãŸã‚ã«QSLã‚’é€ã‚‹ã¹ãQSOã‚’ã™ã¹ã¦æŽ¢ã™ã“ã¨ãŒã§ãã¾ã™ã€‚</br> <b>Tip #2:</b><br>Do you know...<br>You can find the QSLs that you still need to send with <a href="#ToolsSendPendingQSL">Tools->QSL tools...->Find My-QSLs pending to send</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Requested</i>. Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in DXCC data <b>ヒント2:</b><br>知ã£ã¦ã„ã¾ã™ã‹...<br> <a href="#ToolsSendPendingQSL">ツール-&gt;QSLツール...-&gt;Find My-QSLs pending to send</a>ã§ã€ã¾ã é€ã‚‰ãªã‘れã°ãªã‚‰ãªã„QSLを見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<bR>ã“ã®ãƒ„ールã¯ã€ã€ŒQSL-Sentã€ãŒ<i>「Requested</i>ã€ã¨ãªã£ã¦ã„ã‚‹ã™ã¹ã¦ã®QSOを検索ボックスã«è¡¨ç¤ºã—ã¾ã™ã€‚</bR></br> <b>Tip #4:</b><br>Do you know...<br>You can enter a '*' in the search box, in the search window to search for all the QSOs done with one specific station callsign? Translator: Please make sure that the name of the link is coherent with the menu File->Export Requested QSL to ADIF... <b>ヒントãã®4。</b><br>知ã£ã¦ã„ã¾ã™ã‹...<br>æ¤œç´¢çª“ã®æ¤œç´¢ãƒœãƒƒã‚¯ã‚¹ã«ã€Œ*ã€ã‚’入力ã™ã‚‹ã¨ã€ã‚る特定ã®å±€ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã§è¡Œã‚れãŸã™ã¹ã¦ã®QSOを検索ã§ãã‚‹ã“ã¨ã‚’?</br> <b>Tip #5:</b><br>Do you know...<br>You can find the file containing all your log and other information in the logbook.dat file and the klogrc file, containing the KLog config file in the KLog folder by opening the <a href="#FileOpenKLogFolder">File->KLog folder</a> menu? <b>ヒントãã®5。</b><br>ã‚ãªãŸã¯çŸ¥ã£ã¦ã„ã¾ã™ã‹...<br> <a href="#FileOpenKLogFolder">ファイルã€â†’「KLogã€ãƒ•ォルダã®</a>メニューを開ãã¨ã€KLogフォルダã®ä¸­ã«ã€ã™ã¹ã¦ã®ãƒ­ã‚°ã‚„ãã®ä»–ã®æƒ…報をå«ã‚€ãƒ•ァイル「logbook.datã€ã¨ã€KLogã®è¨­å®šãƒ•ァイルをå«ã‚€ã€Œklogrcã€ãƒ•ァイルãŒã‚ã‚‹ã®ã‚’?</br> <b>Tip #6:</b><br>Do you know...<br>You can upload your QSO marked as queued to LoTW via TQSL with <a href="#ToolsUploadLoTW">Tools->LoTW tools ...->Sends the log to LoTW calling TQSL.</a> ?<br><br>You have to configure TQSL in the preferences to be able to use this functionality. Translator: Please make sure that the name of the link is coherent with the menu File->KLog folder <b>ヒント6</b><br>知ã£ã¦ã„ã¾ã™ã‹...<br> <a href="#ToolsUploadLoTW">Tools-&gt;LoTW tools ...-&gt;Sends the log to LoTW calling TQSL</a>ã§ã€ã‚­ãƒ¥ãƒ¼ã‚¤ãƒ³ã‚°ã¨ãƒžãƒ¼ã‚¯ã•れãŸQSOã‚’TQSL経由ã§LoTWã«ã‚¢ãƒƒãƒ—ロードã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚?<br><br>ã“ã®æ©Ÿèƒ½ã‚’使用ã™ã‚‹ã«ã¯ã€ç’°å¢ƒè¨­å®šã§TQSLを設定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚</br></br></br> <b>Tip #7:</b><br>Do you know...<br>You can see the QSO that confirms one specific DXCC entity in one specific band by poiting your mouse over that band in the DXCC widget? Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find My-QSLs pending to send <b>ヒントãã®7。</b><br>知ã£ã¦ã„ã¾ã™ã‹...<br>DXCCウィジェットã§ç‰¹å®šã®ãƒãƒ³ãƒ‰ã«ãƒžã‚¦ã‚¹ã‚’ç½®ãã¨ã€ãã®ãƒãƒ³ãƒ‰ã§ç‰¹å®šã®DXCCエンティティを確èªã—ãŸQSOを見るã“ã¨ãŒã§ãã¾ã™ã€‚</br> <b>Tip #8:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceivePendingQSL">Tools->QSL tools...->Find DX-QSLs pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Sent</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find DX-QSLs pending to receive <b>ヒント8</b><br>知ã£ã¦ã„ã¾ã™ã‹...<br> <a href="#ToolsReceivePendingQSL">ツール-&gt;QSLツール...-&gt;Find DX-QSLs pending to receive</a>を使ãˆã°ã€ã¾ã å¾…ã£ã¦ã„ã‚‹QSLを見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<bR>ã“ã®ãƒ„ールã¯ã€QSL-SentãŒ<i>Sent</i>ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã•れã¦ã„ã‚‹ãŒã€ã¾ã DXã‹ã‚‰QSLカードをå—ã‘å–ã£ã¦ã„ãªã„å…¨ã¦ã®QSOを検索ボックスã«ãƒªã‚¹ãƒˆã‚¢ãƒƒãƒ—ã—ã¦ãれã¾ã™ã€‚</bR></br> <b>Tip #9:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceiveRecPendingQSL">Tools->QSL tools...->Find requested pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Rec marked as <i>Requested</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find requested pending to receive <b>ヒント9</b><br>知ã£ã¦ã„ã¾ã™ã‹...<br> <a href="#ToolsReceiveRecPendingQSL">ツール-&gt;QSLツール...-&gt;Find requested pending to receive</a>ã§ã€ã¾ã å¾…ã£ã¦ã„ã‚‹QSLを見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚<bR>ã“ã®ãƒ„ールã¯ã€QSL-RecãŒ<i>Requested</i>ã¨ãªã£ã¦ã„ã‚‹ãŒã€ã¾ã DXã‹ã‚‰QSLカードをå—ã‘å–ã£ã¦ã„ãªã„ã™ã¹ã¦ã®QSOを検索ボックスã«ãƒªã‚¹ãƒˆã‚¢ãƒƒãƒ—ã—ã¾ã™ã€‚</bR></br> <b>Tip #10:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/klogchat>English KLog Telegram group</a> to discuss about KLog in English? <b>ヒント10</b><br>ã‚ãªãŸã¯çŸ¥ã£ã¦ã„ã¾ã™ã‹...<br><a>&lt;a href=https://t.me/klogchat&gt;英語版KLog Telegramグループã«ç™»éŒ²ã—</a>ã¦ã€è‹±èªžã§KLogã«ã¤ã„ã¦è­°è«–ã™ã‚‹<a>ã“ã¨ãŒã§ã</a>ã¾ã™ã‹ï¼Ÿ</br> <b>Tip #11:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/KLogES>Spanish Telegram group</a> to discuss about KLog in Spanish? <b>ヒント #11</b><br>ã‚ãªãŸã¯çŸ¥ã£ã¦ã„ã¾ã™ã‹...<br><a>ã‚ãªãŸã¯ã€&lt;a href=https://t.me/KLogES&gt;スペイン語Telegramグループã«ç™»éŒ²ã—</a>ã¦ã€ã‚¹ãƒšã‚¤ãƒ³èªžã§KLogã«ã¤ã„ã¦è­°è«–ã™ã‚‹<a>ã“ã¨ãŒã§ã</a>ã¾ã™ã‹ï¼Ÿ</br> <b>Tip #12:</b><br>Do you know...<br>You can subscribe to <a href=https://groups.io/g/klog>KLog mailing list</a> to discuss via email about KLog in English? <b>ヒント#12</b><br>ã‚ãªãŸã¯çŸ¥ã£ã¦ã„ã¾ã™ã‹...<br><a>&lt;a href=https://groups.io/g/klog&gt;KLogメーリングリスト&lt;/a&gt;ã«ç™»éŒ²</a>ã™ã‚‹ã¨ã€KLogã«ã¤ã„ã¦è‹±èªžã§é›»å­ãƒ¡ãƒ¼ãƒ«ã‚’使ã£ã¦è­°è«–ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚</br> <b>Tip #13:</b><br>Do you know...<br>You can <a href=https://twitter.com/_ea4k>follow EA4K on twitter</a> to get updates about KLog? <b>ヒント #13</b><br>ã‚ãªãŸã¯çŸ¥ã£ã¦ã„ã¾ã™ã‹...<br><a>ã‚ãªãŸã¯ã€&lt;a href=https://twitter.com/_ea4k&gt;follow EA4K on twitter</a>to get updates about KLog?</br> <b>Tip #14:</b><br>Do you know...<br>You can write your own <a href=https://www.eham.net/reviews/detail/3118>review in eHam.net about KLog</a> to help other users to decide to use KLog? <b>ヒント #14</b><br>ã‚ãªãŸã¯çŸ¥ã£ã¦ã„ã¾ã™ã‹...<br>ã‚ãªãŸã¯ã€ä»–ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒKLogã®ä½¿ç”¨ã‚’決定ã™ã‚‹ã®ã‚’助ã‘ã‚‹ãŸã‚ã«ã€<a>KLogã«ã¤ã„ã¦eHam.netã«ã‚ãªãŸè‡ªèº«ã®&lt;a href=https://www.eham.net/reviews/detail/3118&gt;レビューを書ãã“ã¨ãŒã§ã</a>ã¾ã™ã‹ï¼Ÿ</br> <b>Tip #15:</b><br>Do you know...<br>You can join the development team by simply <a href=https://www.klog.xyz/contact>Contacting us</a>? <b>ヒント #15</b><br>ã‚ãªãŸã¯çŸ¥ã£ã¦ã„ã¾ã™ã‹...<br><a>ã‚ãªãŸã¯ã€å˜ã«&lt;a href=https://www.klog.xyz/contact&gt;ãŠå•ã„åˆã‚ã›&lt;/a&gt;開発ãƒãƒ¼ãƒ ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ã</a>ã¾ã™ã‹ï¼Ÿ</br> <b>Tip #16:</b><br>Do you know...<br>That there are many ways to contribute to KLog and some of them are listed in the <a href=https://www.klog.xyz/contrib>KLog Contribute</a> page? <b>ヒント #16</b><br>知ã£ã¦ã„ã¾ã™ã‹...<br><a>KLogã«è²¢çŒ®ã™ã‚‹æ–¹æ³•ã¯ãŸãã•ã‚“ã‚りã€ãã®ã†ã¡ã®ã„ãã¤ã‹ã¯&lt;a href=https://www.klog.xyz/contrib&gt;KLog Contribute</a>&lt;/a&gt;ã®ãƒšãƒ¼ã‚¸<a>ã«æŽ²è¼‰ã•</a>れã¦ã„ã¾ã™ã€‚</br> <b>Tip #17:</b><br>Do you know...<br>You can support translating KLog into your language? Please check <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a> page. <b>ヒント #17</b><br>ã‚ãªãŸã¯çŸ¥ã£ã¦ã„ã¾ã™ã‹...<br><a>KLogã®ã‚ãªãŸã®è¨€èªžã¸ã®ç¿»è¨³ã‚’サãƒãƒ¼ãƒˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚&lt;a href=https://www.klog.xyz/contrib/translations&gt;KLog 翻訳</a>ページ&lt;/a&gt;<a>ã‚’ã”覧ãã ã•ã„</a>。</br> <b>Tip #18:</b><br>Do you know...<br>You can double-click on an entity name in the DXCC table and all the QSOs with that DXCC Entity will be shown in the search box? <b>ヒント #18</b><br>知ã£ã¦ã„ã¾ã™ã‹...<br>DXCCテーブルã®ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£åをダブルクリックã™ã‚‹ã¨ã€ãã®DXCCエンティティを使用ã—ãŸã™ã¹ã¦ã®QSOãŒæ¤œç´¢ãƒœãƒƒã‚¯ã‚¹ã«è¡¨ç¤ºã•れるã“ã¨ã‚’?</br> <b>Tip #19:</b><br>Do you know...<br>You can right-click on a QSO and select <i>Check in QRZ.com</i> to check that callsign in QRZ.com? <b>ヒント #19</b><br>知ã£ã¦ã„ã¾ã™ã‹...<br>QSOã®ä¸Šã§å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦<i>「QRZ.comã§ç¢ºèª</i>ã€ã‚’é¸æŠžã™ã‚‹ã¨ã€ãã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ã‚’QRZ.comã§ç¢ºèªã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚</br> UpdateSatsData Reading Satellites data file... 衛星データファイルã®èª­ã¿è¾¼ã¿... Abort reading 読込ã¿ã®ä¸­æ­¢ The Satellites information has been updated. ã‚µãƒ†ãƒ©ã‚¤ãƒˆã®æƒ…報を更新ã—ã¾ã—ãŸã€‚ Open File ファイルを開ã Sat Data 衛星データ UpdateSettings KLog - Settings update The settings system has been changed and KLog will update your settings file. World Entity エンティティ Continent 大陸å Abort reading 読込ã¿ã®ä¸­æ­¢ Reading cty.csv... cty.csvを読ã¿ã“ã‚“ã§ã„ã¾ã™â€¦ eLogClubLog Host not found! ホストãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“! Timeout error! タイムアウトエラー! This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO. ã“ã®ã‚¨ãƒ©ãƒ¼ã¯ã€QSOãŒé‡è¤‡ã—ã¦ã„ã‚‹å ´åˆã‚„ã€å‰Šé™¤ã™ã‚‹å ´åˆã¯å­˜åœ¨ã—ãªã„QSOを削除ã—よã†ã¨ã—ãŸå ´åˆã«ç™ºç”Ÿã—ã¾ã™ã€‚ Undefined error number (#%1)... 未定義ã®ã‚¨ãƒ©ãƒ¼ç•ªå·(#%1)... KLog - ClubLog KLog - ClubLog QSO dupe or not existing (#%1)... QSOã®ãƒ€ãƒ–りや存在ã—ãªã„(#%1)... We have received an undefined error from Clublog (%1) Clublog (%1) ã‹ã‚‰æœªå®šç¾©ã®ã‚¨ãƒ©ãƒ¼ã‚’å—ã‘å–りã¾ã—ãŸã€‚ Undefined error... 未定義ã®ã‚¨ãƒ©ãƒ¼... Callsign missing コールサインãŒãªã„ Invalid callsign æ­£ã—ããªã„コールサイン Skipping SWL callsign SWLナンãƒãƒ¼ã‚’スキップ Callsign is your own call コールサインãŒè‡ªåˆ†è‡ªèº«ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ Invalid callsign with no DXCC mapping DXCCã§å‰²ã‚Šå½“ã¦ã•れã¦ã„ãªã„コールサイン Updated QSO æ›´æ–°ã•れãŸQSO Invalid ADIF record æ­£ã—ããªã„ADIFレコード Missing ADIF record ADIFレコードãŒãªã„ Test mode - parameters ok, no action taken テストモード - パラメータã¯OK.ã€å‹•作ã¯è¡Œã‚れã¾ã›ã‚“ Please check your config in the setup and contact the KLog development team if you can't fix it. ClubLog uploads will be disabled. セットアップã§è¨­å®šã‚’確èªã—ã€è§£æ±ºã§ããªã„å ´åˆã¯KLog開発ãƒãƒ¼ãƒ ã¾ã§ã”連絡ãã ã•ã„。ClubLogã®ã‚¢ãƒƒãƒ—ロードãŒã§ããªããªã‚Šã¾ã™ã€‚ It seems to be a CREDENTIALS ERROR; check your email and password. It seems that your ClubLog credentials are not correct. Please check your credentials in the setup. ClubLog uploads will be disabled. Excessive API Usage API呼ã³å‡ºã—ãŒéŽå‰° Internal Error 内部エラー Rejected æ‹’å¦ QSO Duplicate QSOãŒé‡è¤‡ QSO Modified QSO内容ãŒå¤‰æ›´ Missing Login ログインã—ã¦ã„ãªã„ QSO OK QSO OK Upload denied ã‚¢ãƒƒãƒ—ãƒ­ãƒ¼ãƒ‰ãŒæ‹’å¦ No callsign selected コールサインãŒé¸æŠžã•れã¦ã„ãªã„ No match found 一致ã™ã‚‹ã‚‚ã®ãŒè¦‹ã¤ã‹ã‚‰ãªã„ Dropped QSO ドロップアウトã—ãŸQSO OK OK Login rejected ãƒ­ã‚°ã‚¤ãƒ³ãŒæ‹’å¦ Rejected: Callsign is your own call æ‹’å¦ï¼š コールサインãŒè‡ªåˆ†è‡ªèº«ã®ã‚³ãƒ¼ãƒ«ã‚µã‚¤ãƒ³ eLogQrzLog Host not found! ホストãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“! Timeout error! タイムアウトエラー! Undefined error number (#%1) 未定義ã®ã‚¨ãƒ©ãƒ¼ç•ªå·(#%1) We have received the following error from QRZ.com (%1) QRZ.com (%1) ã‹ã‚‰ä»¥ä¸‹ã®ã‚¨ãƒ©ãƒ¼ã‚’å—ã‘å–りã¾ã—ãŸã€‚ You are not subscribed to QRZ.com. Not valid KEY found 無効ãªKEYãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚ Please configure your QRZ.com API key. You will find it in your QRZ.com Logbook settings webpage. You need a QRZ.com subscription to use this feature. QRZ.comã®APIキーを設定ã—ã¦ãã ã•ã„。ã“ã®ã‚­ãƒ¼ã¯QRZ.comログブックã®è¨­å®šãƒšãƒ¼ã‚¸ã§è¦‹ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®æ©Ÿèƒ½ã‚’使用ã™ã‚‹ã«ã¯ã€QRZ.comã®å¥‘ç´„ãŒå¿…è¦ã§ã™ã€‚ KLog - QRZ.com password needed KLog - QRZ.comã®ãƒ‘スワードãŒå¿…è¦ã§ã™ Please enter your QRZ.com password: QRZ.comã®ãƒ‘スワードを入力ã—ã¦ãã ã•ã„。 KLog - QRZ.com KLog - QRZ.com Callsign missing コールサインãŒãªã„ eQSLUtilities Host not found! ホストãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“! Timeout error! タイムアウトエラー! Undefined error number (#%1)... 未定義ã®ã‚¨ãƒ©ãƒ¼ç•ªå·(#%1)... KLog - eQSL KLog - eQSL eQSL has sent the following message: %1 eQSLã¯ã€ä»¥ä¸‹ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã—ã¾ã—ãŸã€‚ %1 We have received an undefined error from eQSL (%1) eQSL (%1) ã‹ã‚‰æœªå®šç¾©ã®ã‚¨ãƒ©ãƒ¼ã‚’å—ã‘å–りã¾ã—ãŸã€‚ Please check your config in the setup and contact the KLog development team if you can't fix it. eQSL uploads will be disabled. セットアップã§ã®è¨­å®šã‚’確èªã—ã€ä¿®æ­£ã§ããªã„å ´åˆã¯KLog開発ãƒãƒ¼ãƒ ã«é€£çµ¡ã—ã¦ãã ã•ã„。eQSLã®ã‚¢ãƒƒãƒ—ロードãŒã§ããªããªã‚Šã¾ã™ã€‚ eQSL Error: User or password incorrect eQSLエラー。ユーザーåã¾ãŸã¯ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰ãŒæ­£ã—ãã‚りã¾ã›ã‚“。 eQSL Warning: At least one of the uplodaded QSOs is duplicated. eQSL警告。アップロードã•れãŸQSOã®ã†ã¡ã€å°‘ãªãã¨ã‚‚1ã¤ã¯é‡è¤‡ã—ã¦ã„ã¾ã™ã€‚ eQSL: All the QSOs were properly uploaded. eQSL:ã™ã¹ã¦ã®QSOãŒæ­£ã—ãアップロードã•れã¾ã—ãŸã€‚ KLog - eQSL.cc password needed KLog - eQSL.ccã®ãƒ‘スワードãŒå¿…è¦ã§ã™ã€‚ Please enter your eQSL.cc password: eQSL.ccã®ãƒ‘スワードを入力ã—ã¦ãã ã•ã„。 klog-2.3.3/translations/klog_fi.ts0000644000015700001710000141000614542412415017042 0ustar jenkinsjenkins AboutDialog About KLog Tietoja KLogista By Tekijä KLog is a free logbook for hamradio operators. KLog on ilmainen päiväkirja radioamatööreille. Please be aware that this is a development release and it may contain many bugs.<br>Backup your data before using this software! Since 0.6.2, KLog has been fully rewritten to provide a cross-platform application that runs on all major operating systems (GNU/Linux, macOS and Windows) and to support new functionality. Please provide your review in KLog's eHam review page: Anna arvostelusi KLogin eHam-arvostelusivulla: Find more information and the latest release at Lisätietoja ja viimeisin ohjelmistoversio löytyy osoitteesta Author Tekijä today tänään Main developer Pääkehittäjä KLog is developed by a very small team and you are invited to join! KLogia kehittää erittäin pieni ryhmä ihmisiä ja sinut on kutsuttu mukaan! If you want to provide support you are welcome to join the <a href="https://groups.io/g/klog">KLog mailing list</a>! Be aware that you can enable/disable this feature from the Misc tab in the Setup page. Tiedäthän että tämän ominaisuuden voi ottaa käyttöön tai poistaa käytöstä asetukset valikon sekalaiset välilehdeltä. You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Voit auttaa meitä myös lähettämällä virheilmoituksia tai ohjelmointiapua, ideoita tai mitä vain, mikä mielestäsi voisi parantaa KLogia. Authors Tekijät Translators bring KLog into your language. They are really an important part of the KLog development team. Kääntäjät tuovat KLogin kielellesi, ja he ovat todella tärkeä osa KLog-kehitystiimiä. If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://groups.io/g/klog">KLog mailing list</a>! Translators Kääntäjät Privacy advisory Tietosuojakäytäntö KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account users' needs. KLog kehittäjät ovat sisällyttäneet ominaisuuden käyttäjätietojen raportoimiseksi KLog palvelimelle. Tämän tiedon ainoa tarkoitus on, asennettujen ohjelmaversioiden määrän tunnistaminen jotta, kehiystyötä voidaan kohdentaa suuntaan tai toiseen, käyttäjien tarpeet huomioiden. At present, the data that is provided is the following: Tällä hetkellä toimitettavat tiedot ovat seuraavat: Callsign Kutsutunnus KLog version KLog versio Operating system Käyttöjärjestelmä KLog KLog Privacy Tietosuoja AdifLoTWExportWidget Select the Station Callsign that you want to use to upload the log. Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign. Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign. Station callsign My Locator Minun lokaattori Start date End date Ok Ok Cancel Peru DX Date/Time Päivämäärä/aika Band Taajuusalue Mode Tila Not defined ALL QSOs: %1/%2 All Kaikki KLog - QSOs to be uploaded to LoTW. This table shows the QSOs that will be sent to LoTW. KLog - QSOs to be uploaded to ClubLog. This table shows the QSOs that will be sent to ClubLog. KLog - QSOs to be uploaded to eQSL.cc. This table shows the QSOs that will be sent to eQSL.cc. KLog - QSOs to be uploaded to QRZ.com. This table shows the QSOs that will be sent to QRZ.com. This table shows the QSOs that will be exported to ADIF. AwardsWidget Recalculate Laske uudelleen Click to recalculate the award status. Napsauta laskeaksesi palkintotilanne uudestaan. Select the year you want to check. Valitse vuosi jonka haluat nähdä. QSOs QSO:t DXCC DXCC CQ CQ Award Palkinto Confirmed Vahvistettu Worked Työstetty WAZ WAZ Score Pisteet Annual Vuotuinen Number of confirmed DXCC entities. Vahvistettujen DXCC-yksiköiden määrä. Number of worked DXCC entities. Työstettyjen DXCC-yksiköiden määrä. Number of confirmed WAZ zones. Vahvistettujen WAZ vyöhykkeiden määrä. Number of worked WAZ zones. Työstettyjen WAZ vyöhykkeiden määrä. Number of confirmed QSOs. Vahvistettujen QSO:iden määrä. Number of worked QSOs. Työstettyjen QSO:iden määrä. Number of QSOs worked in the selected year. Työstettyjen QSO:iden määrä valittuna vuotena. Number of DXCCs worked in the selected year. Työstettyjen DXCC:n määrä valittuna vuotena. Number of CQ Zones worked in the selected year. Työstettyjen CQ alueiden määrä valittuna vuotena. Score for the DXMarathon in the selected year. DXMarathon pisteet valittuna vuotena DX-Marathon DX-Maratoni CTYPage Country data download Maakohtaisten tietojen lataus KLog needs country data... KLog tarvitsee maakohtaiset tiedot... &Download &Lataa &Ignore &Ohita Country data needed Maakohtaiset tiedot tarvitaan KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. KLog käyttää cty.csv tiedostoa lähteestä https://www.country-files.com/ saadakseen DXCC informaation. You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do. Sinun tulee ladata cty.csv tiedosto, jos haluat että KLog näyttää tehtyjen QSO:iden maat, lokaattorin, jne, Click on Download to download now. Napsauta Lataa ladataksesi nyt. KLog KLog I can't find the host. Please check your network and try again Do you want to try again? En löydä palvelinta. Tarkista verkkoyhteys ja yritä uudelleen Haluatko yrittää uudelleen? DXCCStatusWidget Update Päivitä It seems that the DXCC status in your database is not updated and KLog can't find any dxcc information. You can try to fix this by updating the log. Do you want to update your DXCC status? Entity Yksikkö Prefix Etuliite Pref: CQ: CQ: ITU: ITU: Beam: Entity not worked in this band. Ei työstetty tällä taajuusalueella DXClusterWidget Click on Connect to connect to the DX-Cluster server Napsauta yhdistä, kun haluat muodostaa yhteyden DX-klusteripalvelimeen Connect Yhdistä Clear Tyhjennä Check in QRZ.com Tarkista QRZ.com:ssa Check this callsign in QRZ.com Tarkista tämä kutsutunnus QRZ.com:ssa Click on connect to connect to the DX-Cluster Napsauta yhdistä muodostaaksesi yhteyden DX-klusteriin Trying to connect to the server Muodostetaan yhteyttä palvelimeen KLog DXCluster KLog DXKlusteri The host was not found. Please check: Isäntää ei löytynyt. Tarkista: - your network connection; - the host name and port settings. - verkkoyhteytesi; - isäntänimi ja porttiasetukset. The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. Yhteys vertaisverkkoon evättiin. Varmista, että DX Klusteripalvelin on käynnissä ja tarkista, että isäntänimi ja porttiasetukset ovat oikein. The following error occurred: %1. Tapahtui seuraava virhe: %1. Connected to server Yhdistetty palvelimeen KLog message KLog viesti Enter your callsign to connect to the cluster: Syötä kutsutunnuksesi liittyäksesi klusteriin: Enter your password to connect to the cluster: (Just hit enter for no password) Syötä salasanasi yhteyden muodostamiseksi klusteriin: (Paina enter jättääksesi salasanan tyhjäksi) Disconnect Katkaise yhteys Not logged on, you may need to enter your callsign again. Et ole kirjautunut sisään, sinun on ehkä annettava kutsutunnuksesi uudelleen. Enter here the commands to be sent to the DX-Cluster server. Syötä tähän komennot, jotka lähetetään DX-klusteripalvelimelle Connection closed by the server Palvelin katkaisi yhteyden Click on Connect to connect to the DX-Cluster server. Napsauta yhdistä, muodostaaksesi yhteyden DX-klusteriin Send Lähetä It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! DataProxy_SQLite Software version in DB is null Ohjelmistoversio tietokannassa on tyhjä Query didn't failed Aircraft Scatter Common term in hamradio, do not translate if not sure Lentokonehajonta Aurora Revontulet Aurora-E Revontuliheijastukset Back scatter Common term in hamradio, do not translate if not sure Takasironta Earth-Moon-Earth Maa-Kuu-Maa Sporadic E Satunnaisheijastukset Field Aligned Irregularities Common term in hamradio, do not translate if not sure Kenttäsuuntainen hajonta F2 Reflection Common term in hamradio, do not translate if not sure F2 Heijastus Internet-assisted Internet-avusteinen Ionoscatter Common term in hamradio, do not translate if not sure Ionosfäärisironta Meteor scatter Common term in hamradio, do not translate if not sure Meteorisironta Terrestrial or atmospheric repeater or transponder Maanpäällinen tai ilmakehässä oleva toistin tai transponderi Rain scatter Common term in hamradio, do not translate if not sure Sadesironta Satellite Satelliitti Trans-equatorial Common term in hamradio, do not translate if not sure Päiväntasaajan ylittävä Tropospheric ducting Common term in hamradio, do not translate if not sure Troposfäärikanavat Yes Kyllä No Ei Requested Pyydetty Ignore/Invalid Hylkää/Mitätön Validated Vahvistettu Queued Jonossa Uploaded Lähetetty Do not upload Älä lähetä Modified Muokattu Bureau Common term in hamradio, do not translate if not sure Bureau Direct Direct Electronic Elektrooninen Manager Common term in hamradio, do not translate if not sure Hallinta KLog DXCC KLog DXCC All QSOs have been updated with a DXCC and the Continent. Kaikki QSO:t on päivitetty DXCC:llä ja mantereella. KLog - Invalid call detected An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported ADIF record? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. DownLoadCTY Download of cty.csv failed with the following error code: cty.csv:n lataus epäonnistui virhekoodilla: Download of cty.csv done. cty.csv:n lataus valmis. There is already a cty.csv file in the folder but it will be replaced with the new one. Kansiossa on jo cty.csv-tiedosto, mutta se korvataan uudella. Could not open %1 for writing Ei voitu avata %1 kirjoittamista varten FileAwardManager Open Award file Award files (*.awa) Award file not opened KLog was not able to read the award file It was not possible to open the file %1 for reading. AWA wrong format The AWA file does not have the right format AWA file does not have an <EOH> field KLog - %1 FileManager Writing ADIF file... Kirjoitetaan ADIF-tiedostoa... Abort writing Keskeytä kirjoitus QSO: QSO: Writing ADIF file... QSO: Kirjoitetaan ADIF-tiedostoon... QSO: You have canceled the file export. The file will be removed and no data will be exported. Olet peruuttanut tiedoston viennin. Tiedosto poistetaan, eikä tietoja viedä. KLog - Error KLog - Virhe The selected log does not exist, please check it again. Valittua lokia ei ole olemassa, tarkista uudestaan. The file %1 can't be opened. Tiedostoa %1 ei voida avata. KLog - Invalid call detected An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported log file? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log file? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. You can, however, edit the ADIF file once the export process is finished. KLog - User cancelled KLog - Käyttäjä keskeytti Do you still want to cancel? Haluatko varmasti peruuttaa? The selected callsign (%1) is not valid, please check it again to export the log. KLog - File not opened It was not possible to open the file %1 for reading. KLog was not able to read the LoTW file Processing LoTW ADIF file... Abort processing LoTW reading KLog - Add new QSOs? Do you want to add non existing QSOs to your local log? There are some QSOs in the LoTW log that are not in your local log. Processing LoTW ADIF file...... QSO: %1 / %2 You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated. Reading LoTW file... Luetaan LoTW-tiedostoa... Abort reading Keskeytä lukeminen Importing LoTW ADIF file... KLog - Log selection KLog - Lokin valinta There is more than one log in this logfile. Tässä lokitiedostossa on enemmän kuin yksi loki. All logs will be imported into the current log. Kaikki lokit tuodaan nykyiseen lokiin. Do you want to continue? Haluatko jatkaa? Reading ADIF file... Luetaan ADIF-tiedostoa... Do you want to add dupe QSOs to your local log? There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date. Importing ADIF file... Tuodaan ADIF-tiedostoa... KLog - Duplicated QSOs KLog - QSO päällekkäisyyksiä It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) ADIF-tiedostossa jota olet tuomassa, on päällekkäisiä QSO:ita. Haluatko jatkaa? (Duplikaatti QSO:ita ei tuoda) Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO with %1 on %2: KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO on %1: KLog - Don't ask again Do you want to reuse your answer? KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again. <ul><li>Date/Time:</i> %1</li><li>Callsign: %2</li><li>Band: %3</li><li>Mode: %4</li></ul> KLog - QSO not found Do you want to add this QSO to the log?: We have found a QSO coming from LoTW that is not in your local log. Do you want KLog to add this QSO to the log? You have canceled the file import. The file will be removed and no data will be imported. Olet peruuttanut tiedoston tuonnin. Tiedosto poistetaan, tietoja ei tuoda. There are no QSOs pending to be exported with that station callsign. Export Exporting ADIF file... QSO: %1 / %2 Export progress Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information. Joistakin tämän lokin QSO:ista, (esim.: %1) näkyy puuttuvan RST-TX tieto. If you select NO, maybe the QSO will not be imported. Jos valitset EI, voi olla että QSO:ta ei tuoda. Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. Joistakin tämän lokin QSO:ista, (esim.: %1) näkyy puuttuvan RST-TX tieto. KLog - Apply to all QSOs in this log? KLog - Käytä kaikissa tämän lokin QSO:issa. Please edit the ADIF file and make sure that it include at least: Muokkaa ADIF-tiedostoa ja varmista, että se sisältää ainakin: and ja This QSO had: Tässä QSO:ssa oli: This QSO is not including the minimum data to consider a QSO as valid! Tässä QSO:ssa ei ole vähimmäistietoja jotta QSO voidaan todeta oikeaksi! - The band missing and the following call: - Taajuusalue puuttuu ja seuraava kutsu: - The mode missing and the following call: - Tila puuttuu ja seuraava kutsu: - The date missing and the following call: - Päiväys puuttuu ja seuraava kutsu: - The time missing and the following call: - Aika puuttuu ja seuraava kutsu: Do you want to continue with the current file? Haluatko jatkaa nykyisen tiedoston kanssa? KLog: Not all required data found! KLog: kaikkia vaadittavia tietoja ei löydetty! KLog - No Station callsign entered. KLog - Aseman kutsutunnusta ei ole syötetty, KLog - QSO without Station Callsign KLog - QSO josta puuttuu aseman kutsutunnus KLog: No RST TX found! KLog: RST TX:ää ei löydy! KLog: No RST RX found! KLog: RST RX:ää ei löydy! HamLibNetworkConfigWidget Enter the hostname or address of the radio. Set de network port of the radio. Host/Address Port Portti Enter the port of the radio. HamLibSerialConfigWidget Bauds Baudia Select the serial port speed. Valitse sarjaportin nopeus. Port Portti Select the serial port. Only the serial ports that are detected are shown. Valitse sarjaportti. Vain tunnistetut sarjaportit näytetään. Scan Skannaa Click to identify the serial ports available in your computer. Klikkaa tunnistaaksesi saatavilla olevat sarjaportit. 5 bits 5 bittiä 6 bits 6 bittiä 7 bits 7 bittiä 8 bits 8 bittiä Data bits Data bittejä Select the serial data bits. Valitse databittien määrä. None Ei mitään Hardware Laitteisto Software XON/XOFF Ohjelmisto XON/XOFF Flow control Sarjadatan ohjaus Select the serial flow control Valitse sarjadatan ohjausmenetelmä. No parity Ei pariteettia Even Parillinen Odd Pariton Space Tyhjä Mark Merkki Parity Pariteetti Select the serial parity. Valitse sarjadatan pariteetti. 1 bit 1 bitti 1.5 bits 1.5 bittiä 2 bits 2 bittiä Stop bits Stop bitit Select the serial stop bits. Valitse sarjadatan stop bitit. InfoWidget 10M 10M 15M 15M 20M 20M 40M 40M 80M 80M 160M 160M 2M 2M 6M 6M 12M 12M 17M 17M 30M 30M 70CM 70CM Continent Manner Prefix Etuliite CQ CQ ITU ITU Short Path Lyhyt reitti Long Path Pitkä reitti Deg Astetta Miles Mailia Km Km IntroPage Welcome to KLog! Tervetuloa KLog:iin! Welcome to KLog! - brought to you under the terms of the GPL! Tervetuloa KLog:iin! - tuotu sinulle GPL:n ehtojen mukaisesti! Welcome to KLog Tervetuloa Klog:iin This looks like it's the first time you've run KLog on this computer. Näyttää siltä, että käynnistit KLog:in ensimmäistä kertaa tällä tietokoneella. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. It is designed to provide general purpose DX, and contest logging. Se on suunniteltu tarjoamaan yleisttä DX, sekä kilpailu lokinpitoa. It supports QSL management, import and export of ADIF Se tarjoaa QSL hallintaa, sekä ADIF tuontia ja vientiä and Cabrillo file formats and many other features... ja Cabrillo-tiedostomuotoja, sekä paljon muita ominaisuuksia... Before you can start using KLog, you will be asked to: Ennen kuin voit aloittaa KLog:in käytön, sinua pyydetään: Acknowledge to the terms of the license. Hyväksymään lisenssin ehdot. Download the DX entities information. Lataamaan DX-yksiköiden tiedot. Enter your callsign, CQ zone, etc. and main configuration. Antamaan kutsutunnuksesi, CQ-vyöhykeesi, jne. sekä pääkokoonpanosi. Enjoy KLog and contact the development team if you have any suggestions! Nauttimaan KLogista ja ottamaan yhteyttä kehitystiimiin, jos sinulla on ehdotuksia! LicPage KLog License information KLogin käyttöoikeustiedot Welcome to KLog!- brought to you under the terms of the GPL! Tervetuloa KLog:iin! - tuotu sinulle GPL:n ehtojen mukaisesti! Acknowledge Hyväksy Be aware that KLog is free software. Huomioi, että KLog on ilmainen ohjelmisto. LoTWUtilities KLog - LoTW password needed Please enter your LoTW password: Are you sure that you want to use that station callsign (%1)? There is a file already existing with the name that will be used. The file %1 already exist. Do you want to overwrite? KLog was not able to save the file %1. Error returned: %2 Downloading data to file: %1. KLog - LoTW download This is the first date of a QSO with the callsign %1 in this log If you think that in LoTW you may have previous QSOs, answer No. Do you want to use this date (%1) as start date? The remote server redirected our connection to %1 Do you want to follow the redirection? It was not possible for find the file %1 that has been just downloaded. It seems that LoTW has no QSO with the Station Callsign you are using (%1). Try again and send the downloaded file (%1) to the KLog developer for analysis. KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data? KLog - LoTW File already exists Double click on the date that you want to use as the start date for downloading QSOs. KLog - LoTW Station callsign There is not a single QSO in the log with that station callsign. KLog - LoTW Can't write the file The file %1 already exists. KLog - LoTW Start date selection KLog - LoTW Download error There was an error (%1) while downloading the file from LoTW. The downloading error details are: %1 KLog - LoTW Redirection found KLog - LoTW File not found KLog can't find the downloaded file. KLog - LoTW user/password error LoTW server did not recognized your user/password Check your user and password and ensure your are using the right one before trying again. KLog - LoTW No QSOs LoTW sent no QSOs KLog - LoTW Unknown error KLog can't recognize the file that has been downloaded from LoTW. Now KLog will process the downloaded QSO and update your local log. LogWindow QSL Send QSL Lähetys QSL Rcvd QSL Vastaanotettu &Delete &Poista Delete a QSO Poista QSO &Edit QSO &Muokkaa QSO:ta Edit this QSO Muokkaa tätä QSO:ta Via &bureau &Bureau:n kautta Send this QSL via bureau Lähetä tämä QSO bureau:n kautta D&irect D&irect Send this QSL via direct Lähetä tämä QSO Direct:in kautta Via bureau Bureau:n kautta QSL &received via bureau QSL &vastaanotettu bureau:n kautta Direct Direct QSL received via direc&t QSL vastaanotettu Direc&t:in kautta Check in QRZ.com Tarkista QRZ.com:ssa Check this callsign in QRZ.com Tarkista tämä kutsutunnus QRZ.com:ssa Check in DXHeat.com Tarkista DXHeat.com:ssa Check this callsign in DXHeat.com Tarkista kutsutunnus DXHeat.com:ssa Delete selected QSOs Delete the selected QSOs Export to ADIF Export the selected QSOs to an ADIF file. Upload to LoTW Lataa LoTW:iin Upload the selected QSOs to LoTW Upload to ClubLog Upload the selected QSOs to ClubLog Upload to eQSL.cc Upload the selected QSOs to eQSL.cc Send these QSLs via bureau Send these QSLs via direct QSLs received via bureau QSLs received via direc&t Select none Remove all selections Select all Select all the QSOs MainQSOEntryWidget &Add &Lisää &Clear T&yhjennä Callsign of the QSO. Band of the QSO. QSO:n taajuusalue. Mode of the QSO. QSO:n moodi. Date of the QSO. QSO:n päivämäärä. Time of the QSO. QSO:n aika. Add the QSO to the log. Lisää QSO lokiin. Clears the QSO entry. Poistaa QSO merkinnän. Look up info about the current callsign on qrz.com KLog will show real time if enabled. Real time Stop wsjt-x and hamlib from automatically updating QSO information. Manual Mode Callsign Kutsutunnus &Save &Cancel DUPE Translator: DUPE is a common world for hams. Do not translate of not sure MainWindow Starting KLog Käynnistetään KLog DX Entity DX Yksikkö &Log Window &Loki ikkuna KLog KLog Ready Valmis An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: Tapahtui odottamaton virhe, kun yritit lisätä QSO:n lokiin. Jos ongelma jatkuu, ota yhteyttä kehittäjään analyysiä varten: You have selected an entity: Olet valinnut yksikön: that is different from the KLog proposed entity: joka eroaa KLog:in ehdotetusta kokoonpanosta: Click on the prefix of the correct entity or Cancel to edit the QSO again. Napsauta oikean yksikön etuliitettä tai Peruuta, jos haluat muokata QSO:ta uudelleen. Click on the prefix of the right entity or Cancel to correct. Napsauta oikean yksikön etuliitettä tai paina Peruuta korjataksesi. RSTrx RSTrx RSTtx RSTtx Do you really want to exit KLog? Haluatko varmasti poistua KLogi:sta? &File &Tiedosto Import an ADIF file into the current log. Tuo ADIF-tiedosto nykyiseen lokiin. Export the current log to an ADIF logfile. Vie nykyinen loki ADIF lokitiedostoon. Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Vie kaikki QSO:t yhteen ADIF-tiedostoon, yhdistäen QSO:t kaikista lokeista. Print your log. Tulosta lokisi. KLog folder KLog-kansio Opens the data folder of KLog. Avaa KLog:in tallennuskansion. E&xit Ulo&s &Tools &Työkalut Fill in QSO data Täytä QSO:n tiedot Go through the log reusing previous QSOs to fill missing information in other QSOs. Käy loki läpi käyttäen edellisiä QSO:ita täyttämään puuttuvat tiedot muissa QSO:issa. Shows QSOs for which you should send your QSL and request the DX QSL. Näyttää QSO:t joita varten sinun tulisi lähettää QSL ja pyytää DX QSL:ää. Find My-QSLs pending to send Etsi Minun QSL:t jotka odottavat lähetystä Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Näyttää QSO:t joilla on odottavia pyyntöjä lähettää QSL:iä. Tämä jono tulisi pitää tyhjänä! Mark all queued QSOs in this log as sent to LoTW. Merkitse kaikki tämän lokin jonossa olevat QSO:t lähetetyiksi LoTW:iin. Mark all queued QSOs as sent to LoTW. Merkitse kaikki jonossa olevat QSO:t lähetetyiksi LoTW:iin. For updated DX-Entity data, update cty.csv. Päivitettyjä DX-yksikkö tietoja varten, päivitä cty.csv. Settings ... Always check the current callsign in QRZ.com Upload queued QSOs to LoTW It was not possible to define the KLog folder. Some functions may not work properly! Do you want to update now? You seem to have never backed up or exported your log to ADIF. Your latest backup seems older than one month. Regular backups prevent data loss and are good operator practice. Once exported, copy your ADIF file to a safe place such as a USB drive, cloud drive or other offsite computer. KLog will remind you to backup on a monthly basis. Backup completed successfully KLog will remind you again in approximately one month. Backup failed. Periodic data backups are recommended to prevent data loss and corruption of your log. The setup will now open to allow you to change your settings. Stats Tilastot Show the statistics of your radio activity. Näytä radio aktiviteettisi tilastot. &Help &Ohjeet Do you really want to mark ALL the QSOs of this log to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. Your log has not been updated. No QSO was updated with the data coming from LoTW. This may be because of errors in the logfile or simply because your log was already updated. Do you really want to mark ALL pending QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. KLog - TQSL KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. TQSL ei ole asennettu, tai KLog ei löydä sitä. Tarkista asetukset. Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded. Virhe #1: Käyttäjä keskeytti toiminnon tai TQSL ei ole määritetty. QSO:ita ei lähetetty. Error #2: Upload was rejected by LoTW, please check your data. Virhe #2: Lähetys evättiin LoTW:n toimesta, tarkista tiedot. Error #3: The TQSL server returned an unexpected response. Virhe #3: TQSL palvelin palautti odottamattoman vastauksen. Error #4: There was a TQSL error. Virhe 4#: Tapahtui TQSL virhe. Error #5: There was a TQSLLib error. Virhe #5: Tapahtui TQSLlib virhe. Error #6: It was not possible to open the input file. Virhe #6: Lähdetiedostoa ei voitu avata. Error #7: It was not possible to open the ouput file. Virhe #7: Kohdetiedostoa ei voitu avata. Error #8: No QSOs were processed since some QSOs were duplicates or out of date range. Virhe #8: QSO:ita ei käsitelty sillä osa QSO:ista oli kopioita tai aikajakson ulkopuolella. Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range. Virhe #9: Osa QSO:ista käsiteltiin ja osa ohitettiin sillä ne olivat kopioita tai aikajakson ulkopuolella. Error #10: Command syntax error. KLog sent a bad syntax command. Virhe #10: Komentosyntaksivirhe. KLog lähetti virheellisen syntaksikomennon. Error #11: LoTW Connection error (no network or LoTW is unreachable). Virhe #11: LoTW yhteysvirhe (Ei verkkoyhteyttä, tai LoTW on tavoittamattomissa). Error #00: Unexpected error. Please contact the development team. Virhe #00: Odottamaton virhe. Otathan yhteyttä kehitystiimiin. The log that you have selected contains more than just one station callsign. Valitsemasi loki sisältää enemmän kuin vain yhden aseman kutsutunnuksen. Please select the station callsign you want to mark as sent to LoTW: Valitse aseman kutsutunnus, jonka haluat merkata ladatuksi LoTW:iin: Station Callsign: Aseman kutsutunnus: Define Station Callsign Määritä aseman kutsutunnus Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Syötä tässä lokissa käytettävä aseman kutsutunnus, tai jätä se tyhjäksi QSO:lle ilman määritettyä aseman kutsutunnusta: KLog - No station selected KLog - Ei valittua asemaa No station callsign has been selected and therefore no log will be marked Aseman kutsutunnusta ei ole valittu, joten lokia ei merkata Congratulations! Onnittelut! You already have the latest version. Sinulla on jo viimeisin versio. You can find the KLog data folder here: KLog talletuskansio löytyy täältä: You need to select one station callsign to be able to send your log to LoTW. TQSL finished with no error. Do you want to mark as Sent all the QSOs uploaded to LoTW? Select the Station Callsign to use when quering LoTW: Please check the LoTW setup You have not defined a LoTW user or a proper Station Callsign. Open the LoTW tab in the Setup and configure your LoTW connection. Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1 ClubLog ClubLog KLog - QRZ.COM QRZ.COM The log is ready to be uploaded to QRZ.com. All the QSOs in this log has been marked as Modified in the QRZ.com status field KLog could not mark the full log to be sent to QRZ.com You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. KLog - QSO received Duplicated QSOs have to match another existing QSO with the same call, band, mode, date and time, taking into account the period that can be defined in the settings. QSO logged from WSJT-X: QSO kirjattu WSJT-X:stä: start käynnistys KLog - File not open KLog - Tiedosto ei auki Status bar ... Tilapalkki ... It seems that you have never done a backup or exported your log to ADIF. Näyttää siltä että et ole koskaan varmuuskopioinut tai vienyt lokiasi ADIF:iin. It seems that the latest backup you did is older than one month. Näyttää siltä että vanhin varmuuskopiosi on yli kuukauden vanha. Log backup recommended! Lokin varmuuskopiointia suositellaan! It is a good practice to backup your full log regularly to avoid loosing data in case of a problem. Once you export your log to an ADIF file, you should copy that file to a safe place, like an USB drive, cloud drive, another computer, ... KLog will remind you to backup on a monthly basis. On hyvä varmuuskopioida täysi lokisi säännöllisesti, tiedon menettettämisen välttämiseksi ongelmatilanteissa. Kun loki viedään ADIF tiedostoon, se tulisi kopioida turvalliseen paikkaan, USB-tikulle, pilvipalveluun, toiselle tietokoneelle, ... KLog muistuttaa sinua varmuuskopioimaan tiedot kuukausittain. It seems that you are running this version of KLog for the first time. Näyttää siltä että käytät tätä KLog versiota ensikertaa. The setup will be open to allow you to do any new setup you may need. Asetukset aukeavat jotta voit tehdä tarvittavat muutokset. KLog - Unexpected error KLog - Odottamaton virhe KLog - Not valid call Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. KLog - Select correct entity KLog - Vakitse oikea yksikkö None Ei mitään You have requested to delete the QSO with: %1 Olet pyytänyt poistettaviksi QSO:t joissa on: %1 Are you sure? Oletko varma? Check always the current callsign in QRZ.com You can update the entities database in Tools->Update cty.csv The callsign %1 is not a valid call. Do you really want to add this callsign to the log? You have requested to delete several QSOs The ClubLog upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? KLog - ClubLog KLog - ClubLog There was an error while updating to Yes the ClubLog QSO upload information. The ClubLog upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The file has not been removed. It seems that there was something that prevented KLog from removing the file You can remove it manually. The eQSL upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1 Do you want to mark as Uploaded all the QSOs uploaded to eQSL? There was an error while updating to Yes the eQSL QSO upload information. The eQSL upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The QRZ.com upload process has finished with an error and the log was possibly not uploaded. Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? KLog - QRZ.com There was an error while updating to Yes the QRZ.com QSO upload information. The QRZ.com upload process has finished successfully Call not found in QRZ.com KLog - QRZ.com error KLog has received an error from QRZ.com. You need to activate the %1 service in the eLog preferences. KLog - Exit KLog - Poistu KLog - ADIF export It is important to export to ADIF and save a copy as a backup. Saving the log was done successfully. The ADIF export was not properly done. &Import from ADIF ... Export to ADIF ... Export all logs to ADIF ... &Print Log ... QSL tools ... Find QSO to QSL Find DX-QSLs pending to receive Shows DX-QSLs for which requests or QSLs have been sent with no answer. Näyttää DX-QSL:t joiden pyynnöt tai QSL:t on lähetetty mutta vastausta ei saatu. Find requested pending to receive Shows the DX-QSLs that have been requested. Näyttää pyydetyt DX-QSL:t. LoTW tools ... Queue all QSLs from this log to be sent Aseta kaikki tämän lokin QSL:t lähetysjonoon. Mark all non-sent QSOs in this log as queued to be uploaded. Merkitse kaikki tämän lokin lähettämättömät QSO:t lähetysjonoon. Queue all QSLs to be sent Aseta kaikki QSL:t lähetysjonoon Put all the non-sent QSOs in the queue to be uploaded. Aseta kaikki jonossa olevat lähettämättömät QSO:t lähetettäväksi. Mark all queued QSOs from this log as sent Mark all queued QSOs as sent Merkitse kaikki jonossa olevat QSO:t lähetetyiksi Check the current callsign in QRZ.com Online manual (F1) ... &Debug ... All pending QSOs of this log has been marked as queued for LoTW! Kaikki tämän lokin odottavat QSO:t on merkattu LoTW jonoon! There was a problem to mark all pending QSOs of this log as queued for LoTW! Ilmeni ongelmia kaikkien QSO:iden asettamisessa LoTW jonoon! Your log has been updated with the LoTW downloaded QSOs. KLog has updated %1 QSOs from LoTW. All pending QSOs has been marked as queued for LoTW! Kaikki odottavat QSO:t on asetettu LoTW jonoon! All queued QSOs has been marked as sent to LoTW! Kaikki jonossa olevat QSO;t on merkattu LoTW:iin lähetetyiksi! There was a problem to mark all queued QSOs of this log as sent to LoTW! Ilmeni ongelmia kaikkien tämän lokin jonossa olevien QSO:iden LoTW:iin lähetetyiksi merkkaamisessa! KLog - Update checking result stop pysäytys No QSOs have been exported to ADIF. KLog has exported %1 QSOs to the ADIF file: %2 You need to select one station callsign to be able to send your log to ClubLog. Do you want to add this QSOs to your ClubLog existing log? If you don't agree, this upload will overwrite your current ClubLog existing log. KLog - eQSL KLog - Stop the war in Ukraine! KLog - Stop the war in Ukraine! You are using a Russian call (%1). You can probably help to stop the Russian war, people are dying. Please call your leaders to stop the war. You are using an Ukranian call. Please take care and protect yourself and your family. The KLog developers wish you the best of luck in this very difficult moment. People are dying in the war of Russia against Ukraine. You can help to stop the Russian war against Ukraine. Please show your disagreement to your leaders, or in your social network to stop the war. KLog - KLog folder not found KLog needs to update the Entities database. KLog - Backup KLog - New version detected! This version of KLog requires that the DXCC database is updated. The database will be updated. KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 KLog - ClubLog error KLog - eQSL error KLog - QRZ.com warning QRZ.com has returned a non-subcribed error and queries to QRZ.com will be disabled. Please check your QRZ.com subcription or credentials. KLog - %1 Queue all QSOs from this log to be sent Download from LoTW ... Download the full log from LoTW ... ClubLog tools ... Upload the queued QSOs to ClubLog ... eQSL tools ... Upload the queued QSOs to eQSL.cc ... QRZ.com tools ... Upload the queued QSOs to QRZ.com ... Update cty.csv Update Satellite Data Show Map &Tips ... &About ... About Qt ... Check updates ... Now you can upload them to LoTW. There was a problem to mark all pending QSOs as queued for LoTW! You have selected no callsign. KLog will complete the QSOs without a station callsign defined and those with the callsign you are entering here. All queued QSOs of this log has been marked as sent to LoTW! There was a problem to mark all queued QSOs as sent to LoTW! About ... The selection you have done does not include any QSO The selection you have done does not include any QSO. KLog - Select the Station Callsign. The log is ready to be uploaded to ClubLog. All the QSOs in this log has been marked as Modified in the ClubLog status field KLog could not mark the full log to be sent to ClubLog Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers. The log is ready to be uploaded to eQSL.cc. All the QSOs in this log has been marked as Modified in the eQSL.cc status field KLog could not mark the full log to be sent to eQSL To upload QSOs you need a qrz.com subscription. If you have one, go to Setup->QRZ.com tab to enable it. Filling QSOs ... Date/Time Päivämäärä/aika Callsign Kutsutunnus Printing the log ... Station Callsign Aseman kutsutunnus Operator Callsign KLog - WSJTX Dupe QSO This QSO seems to be duplicated. Do you want to save or discard it? KLog - Non-supported mode KLog - Ei tuettu tila A new mode not supported by KLog has been received from an external program or radio: Uusi ei tuettu tila on vastaanotettu ulkoisesta ohjelmasta tai radiosta: Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) Haluatko saada jatkossa tämän ilmoituksen? (Tämän ilmoituksen poistaminen estää epäsopivien tilojen tunnistamisen) Native Error Recommendation: Suositus: Periodically export your data to ADIF to prevent a potential data loss. Vie tiedot säännöllisesti ADIF:iin, tietojen menettämisen estämiseksi. If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. Jos olet varma että tietokannassa on QSO:ita ja KLog ei löydä niitä, voit ottaa yhteyttä kehittäjiin saadaksesi apua (katso valikon kohta Tietoja KLogista) It seems that there are no QSOs in the database. Näyttää siltä ettei tietokannassa ole yhtään QSO:ta. There was an error while updating to Yes the LoTW QSL sent information. Tapahtui virhe QSL:n lataamisessa LoTW:iin? The LoTW upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? Tietojen lähetys LoTW:iin on valmis ja KLog on luonut tiedoston (%1) KLog kansioosi. Haluatko että KLog poistaa tiedoston? The file has been removed. Tiedosto poistettu. KLog - LoTW KLog - LoTW The logfile has been modified. Lokia on muokattu. It was not possible to open the debug file for writing. No debug log will be saved! KLog - CTY.dat update This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. Do you want to save your changes? Haluatko tallentaa muutokset? Queue all the QSOs to be uploaded Queue all the QSO to be uploaded UDP Server error The UDP server failed to %1. start or stop UDP-palvelinvirhe UDP-palvelin ei onnistunut %1. Status of the DX entity. DX yksikön tila. Name of the DX entity. DX yksikön nimi. QSO QSO QSL QSL eQSL eQSL Comment Kommentti Others Muut My Data Minun tiedot Satellite Satelliitti DXCC DXCC Info Info Awards Palkinnot Search Etsi Log Loki DX-Cluster DX-Klusteri Save ADIF File Tallenna ADIF-tiedosto Open File Avaa Tiedosto - Needed for DXMarathon - Tarvitaan DXMarathon:iin Abort filling Keskeytä täyttäminen Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: Täytetään DXCC, CQz, ITUz ja Manner QSO:ihin... QSO: Number Numero Band Taajuusalue Mode Tila Print Log Tulosta loki Abort printing Keskeytä tulostus Printing the log... QSO: Tulostetaan lokia... QSO: The following QSO data has been received from WSJT-X to be logged: Seuraavat QSO tiedot vastaanotettu WSJT-X:ltä kirjattaviksi: Freq Taajuus Time On Lähetys alkaa Time Off Lähetys päättyy RST TX RST TX RST RX RST RX DX-Grid DX-Verkko Local-Grid Paikallisverkko If the received mode is correct, please contact KLog development team and request support for that mode Mikäli vastaanotettu tila on oikea, ota yhteyttä KLog-kehitystiimiin ja pyydä tukea kyseiselle tilalle KLog - QSO Dupe A dupe QSO has been detected in the file and will not be added to the log. Please check the QSO information file and ensure it is properly added. KLog - Duplicated satellite KLog - Päällekkäinen satelliitti A duplicated satellite has been detected in the file and will not be imported. Tiedostossa havaittiin päällekkäinen satelliitti, eikä sitä tuoda. Please check the satellite information file and ensure it is properly populated. Tarkista satelliitti tiedot-tiedosto ja varmista ettö siellä on kaikki tarvittava. Now you will see a more detailed error that can be used for debugging... Nyt näet tarkemmat virhetiedot joita voidaan käyttää vianmäärityksessä... An unexpected error ocurred!! Odottamaton virhe tapahtui!! If the problem persists, please contact the developers Jos ongelma jatkuu, ota yhteyttä kehitystiimiin for analysis: analysointia varten: Error in function Virhe funktiossa Error text Virheteksti Failed query Epäonnistunut kysely KLog - Show errors KLog - Näytä virheet Do you want to keep showing errors? Haluatko jatkaa virheiden näyttämistä? MainWindowInputComment Comment Kommentti Add a comment for this QSO. Lisää tämän QSO:n kommentti. Keep this data Säilytä nämä tiedot Data entered in this tab will be copied into the next QSO. Tähän välilehteen syötetyt tiedot kopioidaan seuraavaan QSO:n. MainWindowInputEQSL Date of the ClubLog upload. ClubLog:in lähetyksen päivämäärä. Date of the QRZ.com upload. Date of the eQSL sending. eQSL lähetyksen päivämäärä. Date of the eQSL reception. eQSL:n vastaanoton päivämäärä. Date of the LoTW sending. LoTW:n lähetyksen päivämäärä. Date of the LoTW reception. LoTW vastaanoton päivämäärä. Status on ClubLog. ClubLog:n tilanne. Status on QRZ.com. Status of the eQSL sending. eQSL lähetyksen tilanne. Status of the eQSL reception. eQSL vastaanoton tilanne. Status of the LoTW sending. LoTW lähetyksren tila. Status of the LoTW reception. LoTW vastaanoton tila. ClubLog ClubLog QRZ.com eQSL Sent eQSL Sent eQSL Rec eQSL Vastaanotto LoTW Sent LoTW lähetetty LoTW Rec LoTW Vastaanotto MainWindowInputOthers Primary Div Ensisijainen hallinnollinen alue Secondary Div Toissijainen hallinnollinen alue IOTA IOTA Entity Yksikkö Propagation mode Etenemistapa Others Muut Keep propagation mode Select the primary division for this QSO. Valitse tämän QSO:n päädivisioona. Select the secondary division for this QSO. Valitse tämän QSO:n toissijainen divisioona. Select the entity for this QSO. Valitse tämän QSO:n yksikkö. Select the propagation mode for this QSO. Valitse tämän QSO:n etenemistapa. Select the IOTA continent for this QSO. Valitse tämän QSO:n IOTA-manner. Select the IOTA reference number for this QSO. Valitse tämän QSO:n IOTA-referenssinumero. Keeps the same propagation mode for next QSO. Select the appropriate ADIF field for this QSO. Value for the selected ADIF field. Not Identified Ei tunnistettu Not - Not Identified Ei - Ei tunnistettu SOTA Ref Age VUCC grids Distance MainWindowInputQSL QSL Sent QSL lähetetty QSL Rec QSL Vastaanotto QSL Via QSL -kautta QSL Msg QSL Viesti Status of the QSL sending. QSL lähetyksen tila. Status of the QSL reception. QSL vastaanoton tila. QSL sending information. QSL lähetyksen tiedot. QSL reception information. QSL vastaanoton tiedot. Date of the QSL sending. QSL lähetyksen päivämäärä. Date of the QSL reception. QSL vastaanoton päivämäärä. Message of the QSL. QSL:n viesti. QSL via information. QSL -kautta tieto. MainWindowInputQSO TX RST. TX RST. RX RST. RX RST. TX Frequency in MHz. TX Taajuus MHz:inä. RX Frequency in MHz. RX Taajuus MHz:inä. Power used by the contacted station. Name of the contacted operator. QTH of the contacted station. Locator of the contacted station. Watts Wattia MHz MHz Split Translator: Split is a common hamradio term. Do not translate unless you are sure. Name Nimi QTH QTH DX Locator DX lokaattori Power(rx) Teho(rx) RST TX RX Frequency RST(tx) RST(tx) RST(rx) RST(rx) Freq TX TX Taajuus Freq RX RX Taajuus DX QTH locator. DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. TX Frequency in MHz. Frequency is not in a hamradio band! TX Taajuus MHz. Taajuus ei ole oikealla taajuusalueella! RX Frequency in MHz. Frequency is not in a hamradio band! RX Taajuus MHz. Taajuus ei ole oikealla taajuusalueella! MainWindowMyDataTab Watts Wattia Keep this data Säilytä nämä tiedot My QTH locator. Minun QTH lokaattori. Power Teho Operator callsign Station Callsign Aseman kutsutunnus My Locator Minun lokaattori My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. Minun QTH lokaattori. Tulisi olla muotoa Maidenhead, kuten IN70AA, enintään 10 merkkiä. My Rig My Antenna My SOTA_Ref My VUCC_GRIDS MainWindowSatTab Keep this data Säilytä nämä tiedot Other - Sat not in the list Muut - Satelliitti ei ole listalla Data entered in this tab will be copied into the next QSO. Tähän välilehteen syötetyt tiedot kopioidaan seuraavaan QSO:n. Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Satelliitin nimi, jos ei löydy listalta. Aktivoi tämä ruutu valitsemalla: "1%" (nimi on muodossa: A0-51). Satellite mode used. Satelliitti tilaa käytetty. Select the satellite you are using. Valitse satelliitti jota käytät. UpLink band. Lähetyslinkin taajuusalue. DownLink band. Vastaanottolinkin taajuusalue. Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. DX aseman lokaattori. Tämä ruutu on sykronisoitu QSO välilehden, lokaattori ruudun kanssa. UpLink Lähetyslinkki DownLink Vastaanottolinkki Satellite Satelliitti Mode Tila DX Locator DX lokaattori Other Muuta MHz MHz Locator of the DX station. Format should be Maidenhead like IN70AA up to 10 characters. DX aseman lokaattori. Tulisi olla muotoa Maidenhead, kuten IN70AA, enintään 10 merkkiä. Not Sat QSO Ei Satelliitti QSO KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. KLog on havainnut satelliitin nimen, jota se ei tunnista. Jos sen tulisi sen sijaan käyttää jotain tunnettujen satelliittien nimistä sen sijaan, valitse se luettelosta. Vaihtoehtoisesti, voit ottaa yhteyttä kehitystiimiin lisätäksesi uuden satelliitin nimen. The satellite you have in your QSO is: QSO:ssa oleva satelliitti on: Please be aware that the satellite name will not be saved if it is not in the list, so that information may be lost! Huomaathat että satelliitin nimeä ei tallenneta, ellei sitä löydy listasta, joten tämä tieto saattaa hävitä! RX Frequency in MHz. Frequency is not in a hamradio band! RX Taajuus MHz. Taajuus ei ole oikealla taajuusalueella! RX Frequency in MHz. RX Taajuus MHz:inä. TX Frequency in MHz. Frequency is not in a hamradio band! TX Taajuus MHz. Taajuus ei ole oikealla taajuusalueella! TX Frequency in MHz. TX Taajuus MHz:inä. MapWindowWidget Select QSOs in this band. Select QSOs in this mode. Select QSOs in this propagation mode. Select QSOs using this Satellite. Only confirmed Select only confirmed QSOs. All bands Show nothing All modes All propagation modes All satellites OnlineMessageWidget The server returned the following error: %1 Not identified Ei tunnistettu QObject New One, work it! Uusi, wörki se! Needed, work it! Tarvitaan, wörki se! Worked but not confirmed Wörkitty, mutta ei vahvistettu Confirmed Vahvistettu Not identified Ei tunnistettu Database Error Tietokantavirhe KLog DB needs to be upgraded. KLog tietokanta pitää päivittää uudempaan. Do you want to upgrade it now? Haluatko päivittää uudempaan nyt? If DB is not upgraded KLog may not work properly. Jos tietokantaa ei päivitetä, KLog ei välttämättä toimi oikein. Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea. Do you want to backup your DB now? The backup finished successfully. You can find the backup in this file: %1 The backup was not properly done. You will be sent back to the starting point. KLog - DB can't be updated automatically You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version. The process to upgrade is: - Using an old KLog version export your log to ADIF. - Remove your logbook.dat file from your KLog folder. - Install the new KLog version. - Import your ADIF file. KLog will finish when you click on OK. KLog - DB update KLog - tietokantapäivitys KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. KLog on havainnut aikaisemman lokin tietokannassa. Kaikki tiedot siirretään juuri luotuun DX tyyppiseen lokiin. KLog: Enter Station callsign KLog: Syötä aseman kutsutunnus Enter the station callsign used in this log Syötä tässä lokissa käytetty aseman kutsutunnus Station Callsign Aseman kutsutunnus All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay. Kaikki tiedot siirrettiin oikein. Sinun tulisi nyt mennä Asetukset->Määritykset(Preferences)->Lokit(Logs) ja tarkistaa että kaikki on kunnossa. Updating mode information... Päivitetään tilatietoja... Abort updating Keskeytä päivittäminen QSO: QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? Tämän päivityksen peruuttaminen aiheuttaa epäjohdonmukaisuuksia ja mahdollisen tietojen menettämisen. Haluatko silti peruuttaa? Updating bands information... Päivitetään taajuusalue tiedot... Updating bands information in %1 status... Päivitetään taajuusalue tiedot %1 tila... Progress: Eteneminen: Updating mode information in %1 status... Päivitetään tilatiedot %1 tila... Updating DXCC award information... Updating DXCC Award information... Updating WAZ award information... Updating WAZ Award information... Updating information... Tietoja päivitetään... Updating DXCC and Continent information... Päivitetään DXCC- ja manner-tietoja... KLog is already running. It is allowed to run only one instance. Install wizard was canceled before completing... Asennusohjelma keskeytettiin ennen valmistumista... Do you want to remove the KLog dir from your disk? Haluatko poistaa KLog-kansion kiintolevyltä? Your KLog dir has been removed KLog-kansio on poistettu Thank you for running KLog! Kiitos KLogin käyttämisestä! I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. En voinut poistaa KLog-kansiota. Sinun tulee tehdä se manuaalisesti, jos haluat poistaa sen kiintolevyltä. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. KLog-kansiota ei voitu poistaa. Sinun tulee tehdä se manuaalisesti, jos haluat poistaa sen kiintolevyltä. Remember that your KLog dir is on your system... Muista että KLog-kansio on kiintolevyllä... A wrong callsign has been found: %1. Please enter a new callsign or confirm that the current one is a good callsign. An empty callsign has been detected. If it is possible, please enter the right call. KLog - Not valid callsign found Date Päivämäärä Call Kutsutunnus RSTtx RSTtx RSTrx RSTrx Band Taajuusalue Comment Kommentti Mode Tila CQz ITUz DXCC DXCC Address Age County A_Index Ant_Az Ant_El Ant_Path ARRL_SECT Award_Submitted Award_granted Band_RX CheckContest Class ClubLog SDate ClubLog status Continent Manner Contest Id Country Credit Submitted Credit granted Dark Dok Do not translate if unsure, common hamradio term. Fists Do not translate if unsure, common hamradio term. Fists CC Do not translate if unsure, common hamradio term. My Fists Do not translate if unsure, common hamradio term. Nr bursts Do not translate if unsure, common hamradio term. Nr pings Do not translate if unsure, common hamradio term. Sat mode SWL Do not translate if unsure, common hamradio term. Ten-Ten Do not translate, it is a hamradio group name. Distance Contacted_Op Email EQ_Call eQSL RDate eQSL SDate eQSL Rcvd eQSL Sent eQSL Sent Force Init Freq Taajuus Freq RX RX Taajuus Gridsquare HRDLog SDate HRDLog status IOTA IOTA IOTA Island id K Index Lat Lon LoTW RDate LoTW SDate LoTW Rcvd LoTW Sent LoTW lähetetty Max Bursts MS Shower My Antenna My City My Cnty My Country My CQz My DXCC My Gridsquare My IOTA My IOTA island id My ITUz My Lat My Lon My Name My Postal code My Rig My Sig My Sig Info My SOTA ref My State My Street My USACA counties My VUCC grids Name Nimi Notes Operator Owner Callsign Pfx Precedence Prop Mode Public Key QRZcom SDate QRZcom status QSL msg QSL RDate QSL SDate QSL Rcvd QSL Vastaanotettu QSL Sent QSL lähetetty QSL rcvd via QSL sent via QSL via QSO complete QSO random QTH QTH Region Rig RX Pwr Sat name Satelliitin tunnus SFI Sig Sig Info Silent key Do not translate if unsure, common hamradio term. SKCC SOTA Ref SRX String SRX STX String State Submode UKSMG USACA counties VE prov VUCC grids TX Pwr Web QSO Date off Log number SearchWidget &Clear T&yhjennä &Export Highlighted &Vie Korostetut &Select All Valitse &kaikki &Search &Etsi Clear the searches. Tyhjennä etsinnät Export the search result to an ADIF file. Vie etsinnän tulokset ADIF-tiedostoon. Select/Unselect all the QSOs shown. Valitse/Poista valinnasta kaikki näkyvillä olevat QSO:t. Search in the log. Etsi lokista. Search in all logs. Etsi kaikista lokeista. Select the Station Callsign used to do this QSO. All in log Not defined &Clear selection T&yhjennä valinta Save File Tallenna tiedosto All logs Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs! You have requested to delete the QSO with: %1 Olet pyytänyt poistettaviksi QSO:t joissa on: %1 Are you sure? Oletko varma? SearchWindow Date/Time Päivämäärä/aika Band Taajuusalue Mode Tila QSL Sent QSL lähetetty QSL Rcvd QSL Vastaanotettu Station Callsign Aseman kutsutunnus ID ID Call Kutsutunnus Date/time Station callsign QSL Send QSL Lähetys &Delete &Poista Delete a QSO Poista QSO &Edit QSO &Muokkaa QSO:ta Edit this QSO Muokkaa tätä QSO:ta Via &bureau &Bureau:n kautta Send this QSL via bureau Lähetä tämä QSO bureau:n kautta D&irect D&irect Send this QSL via direct Lähetä tämä QSO Direct:in kautta Via bureau Bureau:n kautta QSL &received via bureau QSL &vastaanotettu bureau:n kautta Direct Direct QSL received via direc&t QSL vastaanotettu Direc&t:in kautta Check in QRZ.com Tarkista QRZ.com:ssa Check this callsign in QRZ.com Tarkista tämä kutsutunnus QRZ.com:ssa Check in DXHeat.com Tarkista DXHeat.com:ssa Check this callsign in DXHeat.com Tarkista kutsutunnus DXHeat.com:ssa &Request my QSL Pyy&dä minun QSL Mark my QSL as requested Merkitse minun QSL pyydetyksi Via Direct and mark DX QSL as requested Directin kautta ja merkitse DX QSL pyydetyksi Send this QSL via direct and mark DX QSL as requested Lähetä tämä QSL directin kautta ja merkitse DX QSL pyydetyksi Via Bureau and mark DX QSL as requested Bureau:n kautta ja merkitse DX QSL pyydetyksi Send this QSL via bureau and mark DX QSL as requested Lähetä tämä QSL bureau:n kautta ja merkitse DX QSL pyydetyksi &Request the QSL Pyydä QSL Mark the QSL as requested Merkitse QSL pyydetyksi Via bureau and mark my QSL as requested Bureau:n kautta ja merkitse minun QSL pyydetyksi QSL received via bureau and mark my QSL as requested QSL saapunut bureau:n kautta ja merkitse minun QSL pyydetyksi Direc&t and mark as my QSL requested Direc&t ja merkitse minun QSL pyydetty QSL received via direct and mark my QSL as requested QSL saapunut direct:in kautta ja merkitse minun QSL pyydetyksi Needed QSO to send the QSL Tarvittava QSO, QSL:n lähetystä varten My QSL requested to be sent QSL pyydetty lähetettäväksi DX QSL pending to be received DX QSL odottaa vastaanottoa SetupDialog Bands/Modes Taajuusalueet/Moodit DX-Cluster DX-Klusteri Colors Värit Log widget Misc Sekalaiset World Editor Maailma Editori Logs Lokit Satellites Satelliitit HamLib HamLib Cancel Peru OK OK You need to enter at least a valid callsign. Go to the User tab and enter valid callsign. User data Käyttäjätiedot D&X-Cluster D&X-Klusteri WSJT-X WSJT-X Settings You need to enter at least one log in the Logs tab. Ainakin yksi loki on syötettävä Lokit -välilehdellä. Do you want to add one log in the Logs tab or exit KLog? (Click Yes to add a log or No to exit KLog) Haluatko lisätä yhden lokin 'Lokit' välilehdelle, vaiko poistua KLog:sta? (Napsauta Kyllä lisätäksesi loki tai Ei poistuaksesi) World Maailma Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Siirry sekalaiset-välilehdelle ja napsauta "siirrä tietokanta" muulloin tietokantaa ei siirretä uuteen paikkaan. eLog DB has not been moved to new path. You have not selected the kind of log you want. Et ole valinnut minkälaisen lokin haluat. You will be redirected to the Log tab. Please add and select the kind of log you want to use. Sinut ohjataan lokit -välilehdelle. Lisää, ja valitse millaista lokia haluat käyttää. SetupEntityDialog Entity Yksikkö CQ CQ ITU ITU Latitude Leveysaste Longitude Pituusaste UTC UTC Main prefix Ensisijainen etuliite ARRL ID ARRL ID Prefixes Etuliitteet Comma separated possible prefixes, e.g. EA1, EA2, ... Mahdolliset etuliitteet, pilkulla eroteltuina, esim. OH1, OH2, ... Ok Ok Name of the Entity. Yksikön nimi. CQ zone. CQ-vyöhyke. ITU zone. ITU-vyöhyke. Longitude of the Entity. Yksikön pituuspiiri. Local time difference to UTC. Paikallinen aikaero UTC:n. Main prefix of the entity. Yksikön ensisijainen etuliite. ARRL ID. ARRL ID. Date of the deletion. Poistamisen päivämäärä. Deleted Poistettu Cancel Peru Entity Dialog Yksikköasetukset SetupPageBandMode Bands Taajuusalueet Modes Moodit SetupPageColors New One Uusi Needed in this band Tarvittu tällä taajuussalueella Worked in this band Työstetty tällä taajuusalueella Confirmed in this band Vahvistettu tällä taajuusalueella Default Oletus WSJT-X palette WSJT-X väripaletti Default palette Oletusväripaletti Dark Mode Color when the DXCC is an ATNO (All Time New One). Väri kun DXCC on tyyppiä ATNO (All Time New One). DXCC is confirmed in this band. DXCC on vahvistettu tällä taajuusalueella. Default color. Oletusväri. Sets a palette of colors similar to the one used in WSJT-X. Asettaa väripaletin samankaltaiseksi kuin on käytetty WSJT-X:ssä Sets the default palette. Asettaa oletusväripaletin. Light Mode This DXCC was worked before in another band but not in the selected band. It may be needed due to the CQ, ITU, Grid, ... Tämä DXCC on työstetty aiemmin eri taajuusalueella mutta ei valitulla taajuusalueella. Tämä saattaa olla tarpeellista CQ, ITU, Verkko, ... Worked DXCC, but not confirmed in this band. Työstetty DXCC, mutta ei vahvistettu tällä taajuusalueella. Sets the Dark Mode Choose a color Valitse väri SetupPageDxCluster Add Lisää Delete Poista Show &HF spots Näytä &HF Spotit Show V/&UHF spots Näytä V/&UHF spotit Show W&ARC spots Näytä W&ARC spotit Show &worked spots Näytä &työstetyt spotit Show &confirmed spots Näytä &vahvistetut spotit Show ANN/&FULL messages Näytä ANN/&FULL viestit Show WW&V messages Näytä WW&V viestit Show WC&Y messages Näytä WC&Y viestit Save DX Cluster activity Tallenna DX klusterin aktiviteetit Saves all the DX-Cluster activity to a file in the KLog folder Tallentaa kaikki DX-klusterin aktiviteetit tiedostoon KLog kansiossa Send DX Spots to the map Sends the received DX Spots to the map to know where is the activity. DX Spots DX Spotit Others Muut Messages Viestit KLog: Add a DXCluster server KLog: Lisää DX-Klusteripalvelin Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Lisää osoite ja :portti Esimerkiksi: dxfun.com:8000 Jos porttia ei määritetä, Käytetään oletusarvoa 41112: SetupPageELog ClubLog password ClubLog App password ClubLog email Enter the email you used to register in ClubLog. Syötä sähköposti jota käytit ClubLog:in rekisteröitymiseen. Enter your password ClubLog here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!! Send QSOs in real time Activate ClubLog Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Lähetä QSO:t ClubLogiin reaaliajassa, kun niitä lisätään (tai muokataan) KLogissa. Starts the ClubLog support in KLog. Käynnistää ClubLog tuen KLogissa. Activate eQSL.cc Enter your username of eQSL.cc. Enter your password eQSL.cc here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) eQSL.cc password eQSL.cc user ClubLog ClubLog eQSL.cc QRZ.com Enter the user of your QRZ.com account. You need to be subscribed to QRZ.com to use this service. User Enter your password QRZ.com here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Password Activate QRZ.com Check automatically Check in Qrz.com all Calls as they are entered Paying Subscriber Check it if you are paying for a qrz.com subscription LogBook Key LogBook Key for QSO uploading. You can get this key in your QRZ.com logbook webpage. Remember that you need a QRZ.com subscription to use this feature. LoTW LoTW Upload Download TQSL path Use TQSL Käytä TQSL:ää LoTW password LoTW user Enter your LoTW user. Enter your password LoTW here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Path to the TQSL software. TQSL ohjelmiston polku. Enable the LoTW integration with TQSL. You will need to have TQSL installed Ota käyttöön LoTW integraatio TQSL:n. TQSL tulee olla asennettu. Select File Valitse tiedosto SetupPageHamLib Activate HamLib Aktivoi HamLib Activates the hamlib support that will enable the connection to a radio. Aktivoi hamlib tuen joka mahdollistaa yhteyden radioon. Read-Only mode Vain-Luku tila If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio. Jos otettu käyttöön, KLog lukee Taajuuden/Moodin radiolta, mutta ei koskaan lähetä komentoja radiolle. Radio Radio Select your rig. Valitse kokoonpanosi. Serial Network Defines the interval to poll the radio in msecs. Poll interval Test: OK Test: NOK Test Click to test the connection to the radio SetupPageLogView Fields SetupPageLogs &New &Uusi &Edit &Muokkaa &Remove &Poista Add a new log. Lisää uusi loki. Edit the selected log. Muokkaa valittua lokia. Remove the selected log. Poista valittu loki. KLog KLog Do you really want to remove this log? Haluatko varmasti poistaa tämän lokin? All the QSOs from this log will also be deleted... Kaikki tämän lokin QSO:t tullaan myös poistamaan... Log has not been removed. (#3) Lokia ei ole poistettu (#3) Log has not been removed. (#2) Lokia ei ole poistettu (#2) Log has not been removed. (#1) Lokia ei ole poistettu (#1) ID ID Date Päivämäärä Station Callsign Aseman kutsutunnus Operators Operaattorit Comments Kommentit QSOs QSO:t The new log could not be created. An error has occurred showing the following error code: On tapahtunut virhe seuraavalla koodilla: KLog - SetupPageLogs KLog - Lokisivujen asetus SetupPageLogsNew &Date P&äivämäärä &Station Callsign A&seman kutsutunnus &Operators &Operaattorit Comm&ent Komm&entti &Ok &Ok &Cancel Peru Callsign used for this log. Tässä lokissa käytettävä kutsutunnus. Comma separated list of operators: callsign1, callsign2. Pilkulla eroteltu lista operaattoreista: kutsutunnus1, kutsutunnus2. Start date of this log. Tämän lokin aloituspäivämäärä. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. SetupPageMisc &Imperial system &Empiirinen järjestelmä &Log in real time &Kirjaa lokiin reaaliajassa &Time in UTC UTC &Aika &Save ADIF on exit &Tallenna ADIF kun ohjelma suljetaan Use this &default filename Käytä tätä &oletus tiedostonimeä Mark &QSO to send QSL when QSL is received Merkitse &QSO läheettämään QSL kun QSL on vastaanotettu Complete QSO with previous data Täydennä QSO edellisillä tiedoilla Show the Station &Callsign used in the search box Näytä hakukentässä käytetty &Asematunnus &Check for new versions automatically &Tarkista automaattisesti uusien versioiden varalta &Provide Info for statistics &Jaa tietoja tilastointia varten Manage DX-Marathon Hallinnoi DX Marathonia Activate the application debug log Aktivoi ohjelman vianhakuloki Mark sent eQSL && LoTW in new QSO as queued Merkitse lähetetyiksi eQSL && LoTW uusissa QSO:issa kun ne asetetaan jonoon Browse Selaa Move DB Siirrä tietokanta QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. QSO:t merkataan QSL:n lähetystä odottaviksi, jos DX QSL on saapunut, etkä ole lähettänyt omaasi. The search box will also show the callsign on the air to do the QSO. Hakupalkki näyttää kutsutunnuksen QSO:ta tehdessä myös lähetyksessä. If new version checking is selected, KLog will send the developer your callsign, KLog version and Operating system to help in improving KLog. Jos version tarkistus on valittu, KLog lähettää kehittäjälle kutsutunnuksen, KLog version, sekä käyttöjärjestelmän, KLog:in kehittämistä varten. Select the application debug log level. This may be useful if something is not working as expected. A debug file will be created in the KLog directory and/or shown with Help->Debug menu. Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default. Napsauta merkataksesi lähetysjonoon kaikki eQSL:t (LoTW ja eQSL) kaikissa uusissa QSO:issa oletuksena. Check if there is a new release of KLog available every time you start KLog. Tarkista KLog päivitysten varalta joka käynnistyskerralla. Check non-valid calls Show seconds &Delete always temp ADIF file after uploading QSOs In seconds, enter the time range to consider a duplicate if same call, band and mode is entered. Show seconds in the QSO editor If you disable this checkbox KLog will not check callsigns to identify wrong callsigns. Check it for Imperial system (Miles instead of Kilometers). Tarkista imperiaalisen järjestelmän varalta (Mailit kilometrien sijaan). Select to use real time. Valitse käyttääksesi oikeaa aikaa. Select to use UTC time. Valitse käyttääksesi UTC -aikaa Select if you want to save to ADIF on exit. Valitse jos haluat tallentaa ADIF-tiedostoon kun ohjelma suljetaan. Select to use the following name for the logfile without being asked for it again. Valitse käyttääksesi seuraavaa lokitiedoston nimeä ilman että sitä kysytään joka kerta. Complete the current QSO with previous QSO data. Täydennä nykyinen QSO edellisen QSO:n tiedoilla. Select if you want to manage DX-Marathon. Valitse jos haluat hallinnoida DX Marathonia. This is the default file where ADIF data will be saved. Tämä on oletustiedosto johon ADIF tiedot tallennetaan. This is the directory where the database (logbook.dat) will be saved. Tämä on kansio johon tietokanta (logbook.dat) tallennetaan. Click to change the default ADIF file. Napsauta vaihtaaksesi oletus ADIF-tiedostoa. Click to change the path of the database. Napsauta vaihtaaksesi tietokannan sijainti. Click to move the DB to the new directory. Napsauta Siirtääksesi tietokanta uuteen kansioon. Activates the application debug log. This may be useful if something is not working as expected. A debug file will be created in the KLog directory. Aktivoi ohjelman vianhakulokin. Tästä voi olla hyötyä jos jokin ei toimi odotetulla tavalla. Vikaloki luodaan KLog kansioon. Delete Always the adif file created after uploading QSOs Log level Dupe time range: Open File Avaa tiedosto Select Directory Valitse Kansio This is the directory where DB (logbook.dat) will be saved. Tämä on kansio johon tietokanta (logbook.dat) tallennetaan. Please specify an existing directory where the database (logbook.dat) will be saved. Määritä olemassaoleva kansio johon tietokanta (lokbook.dat) tallennetaan. KLog - Move DB File moved Tiedosto on siirretty File copied Tiedosto on kopioitu File already exist. The destination file already exist and KLog will not replace it. Please remove the file from the destination folder before moving the file with KLog to make sure KLog can copy the file. File NOT copied Tiedostoa EI ole kopioitu The file was not copied due to an unknown problem. The target directory does not exist. Please select an existing directory. Kohdekansiota ei ole olemassa. Valitse olemassaoleva kansio. SetupPageSats &New &Uusi &Edit &Muokkaa &Remove &Poista &Import &Tuo E&xport &Vie Add a new satellite. Lisää uusi satelliitti. Edit the selected satellite. Muokkaa valittua satelliittia. Remove the selected satellite. Poista valittu satelliitti. Export your current satellites to a file. Vie nykyiset satelliitit tiedostoon. Select the sat you want to open. Valitse satelliitti jonka haluat avata. KLog KLog Do you really want to remove this satellite? Haluatko todella poistaa tämän satelliitin? Import a satellites file. It will replace the satellites you have in the current list. Tuo satelliittitiedosto. Tämä korvaa satelliitit jotka ovat nykyisessä listassa. This satellite will no be longer available to be selected ... Tämä satelliitti ei ole enään valittavissa ... Sat has not been removed. (#3) Satelliittia ei ole poistettu. (#3) Sat has not been removed. (#2) Satelliittia ei ole poistettu. (#2) Sat has not been removed. (#1) Satelliittia ei ole poistettu. (#1) ID ID Short Lyhyt tunnus Name Nimi Uplink Lähetys Downlink Vastaanotto Modes Moodit An error has occurred showing the following error code: On tapahtunut virhe seuraavalla koodilla: KLog - SetupPageSats KLog - AsetussivunTilastot Open Satellites File Avaa satelliittitiedosto KLog warning KLog varoitus An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Tapahtui odottamaton virhe satelliittidataa tuodessa. Se voi johtua siitä, että tuotava tiedosto on väärän tyyppinen. Please check the format or contact the developer for analysis with the error code: Tarkista tiedostotyyppi tai ota yhteyttä kehittäjään, tarkempaa selvitystä varten, virhekoodilla: Save Satellites File Tallenna Satelliittitiedosto SetupPageSatsNew Short name Lyhyt tunnus Sat name Satelliitin tunnus UpLink Lähetyslinkki DownLink Vastaanottolinkki Modes Moodit &Ok &Ok &Cancel P&eru Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Syötä lyhyt tunnus. Yritä käyttää LoTW tunnusta, jotta voit ladata QSO:si LoTW:iin jälkeenpäin. Enter the name of the satellite. Syötä satelliitin tunnus. Enter the uplink frequencies in this format: 144.300 Syötä lähetystaajuudet muodossa: 144.300 Enter the downlink frequencies in this format: 144.300 Syötä vastaanottotaajuudet muodossa: 144.300 Enter the modes in this format: USB Syötä moodit muodossa: USB Some of the data you have entered is not correct; the satellite can't be added. Osa syötetyistä tiedoista ei ole oikein; satelliittia ei voida lisätä. SetupPageSubdivisionNew &Date P&äivämäärä &Station Callsign A&seman kutsutunnus &Operators &Operaattorit Comm&ent Komm&entti &Ok &Ok &Cancel Callsign used for this log. Tässä lokissa käytettävä kutsutunnus. Comma separated list of operators: callsign1, callsign2. Pilkulla eroteltu lista operaattoreista: kutsutunnus1, kutsutunnus2. Start date of this log. Tämän lokin aloituspäivämäärä. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. SetupPageSubdivisions &Remove &Poista Import new Import an AWA file with the subdivision details. Remove the selected references. Select the references you want to open. KLog KLog Do you really want to remove the data of this entity? All the subdivision information for this entity will be deleted... Log has not been removed. (#3) Lokia ei ole poistettu (#3) Log has not been removed. (#2) Lokia ei ole poistettu (#2) Log has not been removed. (#1) Lokia ei ole poistettu (#1) ID ID Name Nimi Short Name CQ Zone CQ Vyöhyke ITU Zone ITU Vyöhyke Deleted Poistettu Start Date End Date DXCC DXCC An error has occurred showing the following error code: On tapahtunut virhe seuraavalla koodilla: KLog - SetupPageSubdivisions SetupPageUDP Start UDP Server Käynnistä UDP-palvelin Automatically log QSOs from WSJT-X Kirjaa QSO:t WSJT-X:stä automaattisesti Allow WSJT-X to send logged QSOs to KLog Salli WSJT-X:n lähettää kirjatut QSO:t KLog:iin QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected WSJT-X:ssä kirjatut QSO:t lähetetään KLog:iin, KLog kysyy vahvistusta ennen KLog:iin kirjaamista ellei "%1" ole valittuna KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. KLog kirjaa automaattisesti kaikki QSO:t jotka tulevat WSJT-X:ltä, ilman manuaalista vahvistusta. Update status information from WSJT-X KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...) UDP port number where the UDP Server will listen for packets. UDP-portti jolla UDP-palvelin kuuntelee paketteja. Make sure it is the same port that the other programs are sending the data to. Default port is 2237. Varmista että se on sama portti johon muut ohjelmat lähettävät tiedot. Oletus on 2237. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. UDP-palvelin vastaanottaa toisista ohjelmista lähetetyt QSO:t. Kuten WSJT-X, mahdollistaen sinulle automaattisen kirjaamisen näistä ohjelmista KLogiin. UDP Port UDP-portti Select the interface to listen for UDP datagrams coming from WSJT-X. Network interface QSOs notification timeout (milisecs) QSO:n ilmoitus aikakatkaisu (ms) Miliseconds that the notification of QSOs received from WSJTX will be shown. Aika jonka QSO:t vastaanotettu WSJT-X:ltä ilmoitus näytetään, millisekunneissa. SetupPageUserDataPage &Personal data &Henkilökohtaiset tiedot Station &data Aseman &tiedot Enter your name. Syötä nimesi. Enter your address - 1st line. Syötä osoitteesi - ensimmäinen rivi. Enter your address - 2nd line. Syötä osoitteesi - toinen rivi. Enter your address - 3rd line. Syötä osoitteesi - kolmas rivi. Enter your address - 4th line. Syötä osoitteesi - neljäs rivi. Enter your city. Syötä kaupunki. Enter your zip code. Syötä postinumero. Enter your province or state. Syötä maakunta tai osavaltio. Enter your country. Syötä maa. &Name &Nimi &Address &Osoite Cit&y &Kaupunki &Zip Code &Postinumero Pro&v/State Maak&unta Countr&y &Maa Enter your information for rig Syötä laitekokoonpanosi tiedot Enter your information for antenna Syötä antennitiedot Enter your power information. Syötä tiedot tehonlähteestäsi. Enter the station callsign that will be used for logging. Syötä kirjaamiseen käytettävä aseman kutsutunnus. &Rig 1 Kokoonpano 1 R&ig 2 Kokoonpano 2 Ri&g 3 Kokoonpano 3 Antenna &1 Antenni &1 Antenna &2 Antenni &2 Antenna &3 Antenni &3 Po&wer Vi&rtalähde Enter the operators (comma separated if more than one). Syötä operaattorit (pilkulla eroteltuina jos useita). Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Syötä aseman lokaattori. Vaihtoehtoisesti KLog voi käyttää arvioitua lokaattoria kutsutunnuksesi perusteella. &Callsign &Operators &Operaattorit &CQ Zone &CQ Alue &ITU Zone &ITU Alue &Locator &Lokaattori &Locator (not valid) &Lokaattori (virheellinen) SetupPageWorldEditor Add Lisää Delete Poista Edit Muokkaa Export World Vie maailma Import World Tuo maailma Still not implemented. Vielä toteuttamatta. Import a new cty.csv file Tuo uusi cty.csv-tiedosto An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. KLog kansiostasi löytyy yksikkötiedot-tiedosto (cty.csv)joka ladataan. No entities information file (cty.csv) has been detected in your KLog folder. KLog kansiostasi ei löydy yksikkötiedot-tiedostoa (cty.csv). KLog will not be able to show entities information. KLog ei pysty näyttämään yksikkötietoja. Prefix Etuliite Entity Yksikkö ARRL ID ARRL ID Continent Manner CQ Zone CQ Vyöhyke ITU Zone ITU Vyöhyke UTC UTC Latitude Leveysaste Longitude Pituusaste Deleted Poistettu Since Date Lähtien päivämäärästä To Date Päivämäärään asti Open File Avaa Tiedosto BigCTY (*.csv) BigCTY (*.csv) Entities information has been updated. Yksikkötiedot on päivitetty. Entities information has not been updated. Yksikkötietoja ei ole päivitetty. ShowAdifImportWidget The following QSOs are those QSOs that you have received the LoTW confirmation. Ok Ok DX Date/Time Päivämäärä/aika Band Taajuusalue Mode Tila ShowErrorDialog KLog Message KLog viesti SoftwareUpdateDialog Ok Ok KLog update KLog päivitys <center><h2>KLog new version (%1) is available! </h2></center><br>There is a new version of KLog available.<br><br><b>You can get the new version from:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> Congratulations! Onnittelut! Your KLog has been updated. KLog on päivitetty. You already have the latest version. Sinulla on jo viimeisin versio. StartWizard KLog - The free hamradio logging program KLog - Ilmainen amatööriradio kirjausohjelma Quit Setup Lopeta asennus Setup is not complete yet. Are you sure you want to quit setup? Asennus ei ole vielä valmis. Oletko varma että haluat lopettaa? StatisticsWidget QSO per year QSO:ta vuodessa DXCC per year DXCC:tä vuodessa CQ zones per year CQ vyöhykkeitä vuodessa QSO per band QSO:ta taajuusalueittain QSO per mode QSO:ta moodeittain QSO per DXCC QSO:ta DXCCittäin QSO per Continent QSO:ta mantereittain QSO per hour QSO:ta tunneittain QSO per month QSO:ta kuukausittain Worked / Confirmed status Workitty / Vahvistettu tila Worked / Sent status Workitty / Lähetetty tila Sent / Confirmed status Lähetetty / Vahvistettu tila Satellite grid status Satellite DXCC status Grids per band status DXCC per band status StatsCQZPerYearBarChartWidget CQ Zones per year CQ Vyöhykkeitä vuodessa Reading data ... Luetaan tietoja ... Abort reading Peruuta lukeminen CQ zones CQ vyöhykkeet CQ zones per year CQ vyöhykkeitä vuodessa Reading data ... Luetaan tietoja ... Years: %1/%2 Vuodet: %1%2 StatsDXCCOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Numero Callsign Kutsutunnus Date Päivämäärä Band Taajuusalue Mode Tila DXCC DXCC Satellite Satelliitti Confirmed Vahvistettu No Ei StatsEntitiesPerYearBarChartWidget Chart title Listan otsikko Reading data ... Luetaan tietoja ... Abort reading Peruuta lukeminen DXCC Entities DXCC Yksiköitä DXCC Entities per year DXCC Yksiköitä vuosittain Reading data ... Luetaan tietoja ... Entities: Yksiköitä StatsFieldPerBandWidget All Kaikki Mode: Band Taajuusalue Worked Työstetty Confirmed Vahvistettu StatsGridsOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Numero Callsign Kutsutunnus Date Päivämäärä Band Taajuusalue Mode Tila Grid Satellite Satelliitti Confirmed Vahvistettu No Ei StatsQSOsPerBandBarChartWidget QSOs per band QSO:t taajuusalueittain Reading data ... Luetaan tietoja ... Abort reading Peruuta lukeminen Bands Taajuusalueet QSOs per band distribution QSO:t taajuuksia kohden jakauma Reading data ... Luetaan tietoja ... Bands: Taajuusalueet: StatsQSOsPerContinentBarChartWidget QSOs per continent QSO:t mantereittain Reading data ... Luetaan tietoja ... Abort reading Peruuta lukeminen Continents Mantereet Reading data ... Luetaan tietoja ... Hours: Tunnit: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC QSO:ta DXCC:tä kohti Reading data ... Luetaan tietoja ... Abort reading Peruuta lukeminen Reading data... Luetaan tietoja... DXCC DXCC Top ten DXCC per QSO Kymmenen parasta DXCC:tä QSOittain StatsQSOsPerHourBarChartWidget QSOs per hour QSO:t tunneittain Reading data ... Luetaan tietoja ... Abort reading Peruuta lukeminen Hours Tunnit QSOs at hour QSO:t tunnissa Reading data ... Luetaan tietoja ... Hours: Tunnit: StatsQSOsPerModeBarChartWidget QSOs per mode QSO:t moodeittain Reading data ... Luetaan tietoja ... Abort reading Peruuta lukeminen Modes Moodit QSOs per mode distribution QSO:t moodia kohden jakauma Reading data ... Luetaan tietoja ... Modes: Moodit: StatsQSOsPerMonthBarChartWidget QSOs per month QSO:t kuukausittain Reading data ... Luetaan tietoja ... Abort reading Peruuta lukeminen Jan Tammi Feb Helmi Mar Maalis Apr Huhti May Touko Jun Kesä Jul Heinä Sep Syys Oct Loka Nov Marras Dec Joulu Aug Elo Months Kuukaudet QSOs at Month QSO:t kuukaudessa Reading data ... Luetaan tietoja ... Months: Kuukaudet: StatsQSOsPerYearBarChartWidget Reading data ... Luetaan tietoja ... Abort reading Peruuta lukeminen QSOs QSO:t QSOs per year QSO:ta vuodessa Reading data ... Luetaan tietoja ... QSO: %1/%2 QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Lähetetty - %1 Confirmed - %2 Vahvistettu - %2 Sent / Confirmed status Lähetetty / Vahvistettu tila StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Wörkitty, ei vahvistettu - %1 Confirmed - %2 Vahvistettu - %2 Worked / Confirmed status Workitty / Vahvistettu tila StatsWorkedSentPieChartWidget Worked - %1 Wörkitty - %1 Sent - %2 Lähetetty - %2 Worked / Sent status Workitty / Lähetetty tila TipsDialog KLog tips KLog vinkit Next Seuraava Previous Edellinen <b>Tip #1:</b><br>Do you know...<br>You can use <a href="#ToolsFillInQSO">Tools->Fill in QSO data</a> to automatically read the full log to fill the DXCC, CQ, ITU zones and continent? Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in QSO data <b>Vinkki #1:</b><br>Tiesitkö....<br>Voit käyttää <a href="#ToolsFillInQSO">Tools->Fill in QSO data</a> lukeaksesi automaattisesti koko lokin ja täyttääksesi DXCC, CQ, ITU vyöhykkeet ja mantereen? <b>Tip #3:</b><br>Do you know...<br>You can use <a href="#ToolsFindQSO2QSL">Tools->QSL tools...->Find QSO to QSL</a> to look for all those QSO that you should send your QSL because you still need to confirm that DXCC and you have still not send your QSL card? Translator: Please make sure that the name of the link is coherent with the menu Tools->QSL tools...->Find QSO to QSL <b>Vinkki #3:</b><br>Tiesitkö....<br>Voit käyttää <a href="#ToolsFindQSO2QSL">Tools->QSL tools...->Find QSO to QSL</a> etsiäksesi kaikkia QSO:ita joiden DXCC tulee vielä vahvistaa etkä vielä ole lähettänyt QSL korttia? <b>Tip #2:</b><br>Do you know...<br>You can find the QSLs that you still need to send with <a href="#ToolsSendPendingQSL">Tools->QSL tools...->Find My-QSLs pending to send</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Requested</i>. Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in DXCC data <b>Vinkki #7:</b><br>Tiesitkö....<br>Löydät QSL:t jotka ovat vielä lähettämättä <a href="#ToolsSendPendingQSL">Tools->QSL tools...->Find My-QSLs pending to send</a>.<bR>Tämä työkalu listaa hakukenttään kaikki QSO:t merkittyinä QSL <i>Pyydetty</i>. {2:?} <b>Tip #4:</b><br>Do you know...<br>You can enter a '*' in the search box, in the search window to search for all the QSOs done with one specific station callsign? Translator: Please make sure that the name of the link is coherent with the menu File->Export Requested QSL to ADIF... <b>Tip #5:</b><br>Do you know...<br>You can find the file containing all your log and other information in the logbook.dat file and the klogrc file, containing the KLog config file in the KLog folder by opening the <a href="#FileOpenKLogFolder">File->KLog folder</a> menu? <b>Vinkki #6:</b><br>Tiesitkö....<br>Löydät tiedoston joka sisältää kaikki lokit ja muun tiedon logbook.dat tiedostosta ja .klogrc tiedoston, joka sisältää KLog asetustiedoston KLog kansiossa avaamalla <a href="#FileOpenKLogFolder">File->KLog folder</a> valikon? {5:?} <b>Tip #6:</b><br>Do you know...<br>You can upload your QSO marked as queued to LoTW via TQSL with <a href="#ToolsUploadLoTW">Tools->LoTW tools ...->Sends the log to LoTW calling TQSL.</a> ?<br><br>You have to configure TQSL in the preferences to be able to use this functionality. Translator: Please make sure that the name of the link is coherent with the menu File->KLog folder <b>Tip #7:</b><br>Do you know...<br>You can see the QSO that confirms one specific DXCC entity in one specific band by poiting your mouse over that band in the DXCC widget? Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find My-QSLs pending to send <b>Vinkki #20:</b><br>Tiesitkö...<br>Voit nähdä QSO:n joka sisältää tietyn DXCC yksikön tietyllä taajuusalueella osoittamalla taajuusaluetta DXCC työkalussa? {7:?} <b>Tip #8:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceivePendingQSL">Tools->QSL tools...->Find DX-QSLs pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Sent</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find DX-QSLs pending to receive <b>Vinkki #8:</b><br>Tiesitkö....<br>Löydät QSL:t joita vielä odotat <a href="#ToolsReceivePendingQSL">Tools->QSL tools...->Find DX-QSLs pending to receive</a>.<bR>Tämä työkalu listaa etsintäkenttään kaikki QSO:t jotka merkitty QSL <i>Lähetetty</i> mutta ei ole vielä saanut QSL korttia DX:ltä. <b>Tip #9:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceiveRecPendingQSL">Tools->QSL tools...->Find requested pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Rec marked as <i>Requested</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find requested pending to receive <b>Vinkki #9:</b><br>Tiesitkö....<br>Löydät QSL:t joita vielä odotat menemällä <a href="#ToolsReceiveRecPendingQSL">Tools->QSL tools...->Find requested pending to receive</a>.<bR>Tämä työkalu listaa etsintäkentään kaikki QSO:t joissa QSL-rec on merkitty <i>Pyydetty</i> mutta ei ole saanut QSL korttia DX:ltä. <b>Tip #10:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/klogchat>English KLog Telegram group</a> to discuss about KLog in English? <b>Vinkki #10:</b><br>Tiesitkö....<br>Voit liittyä ryhmään <a href=https://t.me/klogchat>English KLog Telegram group</a> keskustellaksesi KLog:sta englanniksi? <b>Tip #11:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/KLogES>Spanish Telegram group</a> to discuss about KLog in Spanish? <b>Vinkki #11:</b><br>Tiesitkö...<br>Voit liittyä ryhmään <a href=https://t.me/KLogES>Spanish Telegram group</a> keskustellaksesi KLog:sta espanjaksi? <b>Tip #12:</b><br>Do you know...<br>You can subscribe to <a href=https://groups.io/g/klog>KLog mailing list</a> to discuss via email about KLog in English? <b>Tip #13:</b><br>Do you know...<br>You can <a href=https://twitter.com/_ea4k>follow EA4K on twitter</a> to get updates about KLog? <b>Vinkki #13:</b><br>Tiesitkö...<br>Voit <a href=https://twitter.com/_ea4k>seurata EA4K:ta twitterissä</a> saadaksesi uusimmat tiedot KLog:sta? <b>Tip #14:</b><br>Do you know...<br>You can write your own <a href=https://www.eham.net/reviews/detail/3118>review in eHam.net about KLog</a> to help other users to decide to use KLog? <b>Vinkki #14:</b><br>Tiesitkö...<br>Voit kirjoittaa oman <a href=https://www.eham.net/reviews/detail/3118>arvostelun KLog:sta sivustolla eHam.net </a> auttaaksesi muita käyttäjiä löytämään KLog:in? <b>Tip #15:</b><br>Do you know...<br>You can join the development team by simply <a href=https://www.klog.xyz/contact>Contacting us</a>? <b>Vinkki #15:</b><br>Tiesitkö...<br>Voit liittyä kehitystiimiin yksinkertaisesti <a href=https://www.klog.xyz/contact>Ottamalla yhteyttä</a>? <b>Tip #16:</b><br>Do you know...<br>That there are many ways to contribute to KLog and some of them are listed in the <a href=https://www.klog.xyz/contrib>KLog Contribute</a> page? <b>Vinkki #16:</b><br>Tiesitkö...<br>On monia tapoja antaa oma panoksesi KLog:iin jotkin niistä on mainittu tällä sivulla: <a href=https://www.klog.xyz/contrib>KLog Contribute</a> ? <b>Tip #17:</b><br>Do you know...<br>You can support translating KLog into your language? Please check <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a> page. <b>Vinkki #17:</b><br>Tiesitkö...<br>Voit auttaa kääntämään KLog:in omalle kielellesi? Käy katsomassa: <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a> . <b>Tip #18:</b><br>Do you know...<br>You can double-click on an entity name in the DXCC table and all the QSOs with that DXCC Entity will be shown in the search box? <b>Vinkki #18:</b><br>Tiesitkö...<br>Voit kaksoisnapsauttaa yksikön nimeä DXCC listassa ja kaikki kyseisen DXCC yksikön QSO:t näytetään etsintäkentässä? <b>Tip #19:</b><br>Do you know...<br>You can right-click on a QSO and select <i>Check in QRZ.com</i> to check that callsign in QRZ.com? <b>Vinkki #19:</b><br>Tiesitkö...<br>Voit napauttaa QSO:ta oikealla hiiren napilla ja valita <i>Check in QRZ.com</i> nähdäksesi kutsutunnuksen QRZ.com:ssa? UpdateSatsData Reading Satellites data file... Luetaan satelliitti tiedot-tiedostoa... Abort reading Peruuta lukeminen The Satellites information has been updated. Satelliitti tiedot päivitetty. Open File Avaa tiedosto Sat Data Satelliittitiedot UpdateSettings KLog - Settings update The settings system has been changed and KLog will update your settings file. World Entity Yksikkö Continent Manner Reading cty.csv... Luetaan cty.csv... Abort reading Keskeytä luku eLogClubLog Host not found! Isäntää ei löydy! Timeout error! Aikakatkaisu virhe! KLog - ClubLog KLog - ClubLog Undefined error... Määrittelemätön virhe... Undefined error number (#%1)... It seems to be a CREDENTIALS ERROR; check your email and password. It seems that your ClubLog credentials are not correct. Please check your credentials in the setup. ClubLog uploads will be disabled. QSO dupe or not existing (#%1)... We have received an undefined error from Clublog (%1) This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO. Please check your config in the setup and contact the KLog development team if you can't fix it. ClubLog uploads will be disabled. Callsign missing Kutsutunnus puuttuu Invalid callsign Väärä kutsutunnus Skipping SWL callsign Ohitetaan SWL kutsutunnus Callsign is your own call Kutsutunnus on oma kutsusi Invalid callsign with no DXCC mapping Virheellinen kutsutunnus, ilman DXCC kartoitusta Updated QSO QSO päivitetty Invalid ADIF record Virheellinen ADIF tieto Missing ADIF record Puuttuva ADIF tieto Test mode - parameters ok, no action taken Testitila - parametrit ok, toimintoja ei tehty Excessive API Usage Liiallinen API:n käyttö Internal Error Sisäinen Virhe Rejected Hylätty QSO Duplicate QSO Duplikaatti QSO Modified QSO muokattu Missing Login Puuttuva sisäänkirjaus QSO OK QSO OK Upload denied Lataus kielletty No callsign selected Ei valittua kutsutunnusta No match found Vastaavuutta ei löytynyt Dropped QSO Pudotettu QSO OK OK Login rejected Sisäänkirjautuminen evätty Rejected: Callsign is your own call Hylätty: Kutsutunnus on oma kutsusi eLogQrzLog Host not found! Isäntää ei löydy! Timeout error! Aikakatkaisu virhe! Undefined error number (#%1) We have received the following error from QRZ.com (%1) You are not subscribed to QRZ.com. Not valid KEY found Please configure your QRZ.com API key. You will find it in your QRZ.com Logbook settings webpage. You need a QRZ.com subscription to use this feature. KLog - QRZ.com password needed Please enter your QRZ.com password: KLog - QRZ.com Callsign missing Kutsutunnus puuttuu eQSLUtilities Host not found! Isäntää ei löydy! Timeout error! Aikakatkaisu virhe! Undefined error number (#%1)... eQSL Error: User or password incorrect eQSL Warning: At least one of the uplodaded QSOs is duplicated. eQSL: All the QSOs were properly uploaded. KLog - eQSL.cc password needed Please enter your eQSL.cc password: KLog - eQSL eQSL has sent the following message: %1 We have received an undefined error from eQSL (%1) Please check your config in the setup and contact the KLog development team if you can't fix it. eQSL uploads will be disabled. klog-2.3.3/translations/klog_hr.ts0000644000015700001710000142373414542412415017071 0ustar jenkinsjenkins AboutDialog About KLog O KLogu You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. TakoÄ‘er nam možete pomoći Å¡aljući izvješća o greÅ¡kama ili malih doprinosa u programskom kodu ili bilo Å¡to Å¡to mislite da može unaprijediti KLog. Authors Autori By Od Author Autor KLog is a free logbook for hamradio operators. KLog je slobodna dnevniÄka aplikacija za radio-amatere operatere. Please provide your review in KLog's eHam review page: Molimo ocijenite KLog na eHamovoj stranici za ocjene: Find more information and the latest release at Potražite viÅ¡e informacija i najnoviju inaÄicu na today danas Main developer Glavni razvijatelj programa KLog is developed by a very small team and you are invited to join! Klog razvija vrlo mali tim i pozvani ste da se pridružite! KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account users' needs. KLog razvijatelji programskog koda razvili su opciju koja Å¡alje neke korisniÄke podatke na KLogov poslužitelj kojima je osnovna svrha identificiranje broja instaliranih inaÄica, kako bi razvoj mogao biti usmjeren u jednom ili drugom smijeru, uzevÅ¡i u obzir korisniÄke potrebe. At present, the data that is provided is the following: Trenutno, podaci koji se Å¡alju su: Translators bring KLog into your language. They are really an important part of the KLog development team. Prevoditelji donose KLog u vaÅ¡ jezik. Oni su važan dio tima koji razvija KLog. Please be aware that this is a development release and it may contain many bugs.<br>Backup your data before using this software! Budite svjesni da je ovo razvojna inaÄica i da može imati puno programskih greÅ¡aka.<br>Napravite sigurnosnu kopiju vaÅ¡ih podataka prije koriÅ¡tenja ovog softvera! Since 0.6.2, KLog has been fully rewritten to provide a cross-platform application that runs on all major operating systems (GNU/Linux, macOS and Windows) and to support new functionality. If you want to provide support you are welcome to join the <a href="https://groups.io/g/klog">KLog mailing list</a>! If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://groups.io/g/klog">KLog mailing list</a>! Translators Prevoditelji Privacy advisory Upozorenje o privatnosti Callsign Pozivni znak KLog version InaÄica KLoga Operating system Operacijski sustav Be aware that you can enable/disable this feature from the Misc tab in the Setup page. Ova opcija može biti omogućena/onemogućena iz izbornika Razno na stranici Postavke. KLog KLog Privacy Privatnost AdifLoTWExportWidget Select the Station Callsign that you want to use to upload the log. Izaberite pozivni znak koji želite koristiti za uÄitavanje dnevnika. Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign. Izaberite poÄetni datum za izvoz QSOa. Zadani datum je datum prvog QSOa sa ovim pozivnim znakom. Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign. Izaberite krajnji datum za izvoz QSOa. Zadani datum je datum posljednjeg QSOa sa ovim pozivnim znakom. Station callsign Pozivni znak postaje My Locator Moj lokator Start date PoÄetni datum End date Krajnji datum Ok Ok Cancel PoniÅ¡ti DX DX Date/Time Datum/Vrijeme Band Pojas Mode NaÄin rada Not defined Nije definiran ALL QSOs: %1/%2 All Svi QSOs: QSOi: KLog - QSOs to be uploaded to LoTW. This table shows the QSOs that will be sent to LoTW. Ova tablica prikazuje sve QSOe koji će biti poslani u LoTW. KLog - QSOs to be uploaded to ClubLog. This table shows the QSOs that will be sent to ClubLog. KLog - QSOs to be uploaded to eQSL.cc. This table shows the QSOs that will be sent to eQSL.cc. KLog - QSOs to be uploaded to QRZ.com. This table shows the QSOs that will be sent to QRZ.com. This table shows the QSOs that will be exported to ADIF. Ova tablica prikazuje sve QSOe koji će biti izvezeni u ADIF. AwardsWidget Recalculate PreraÄunaj Click to recalculate the award status. Kliknite za preraÄunavanje statusa priznanja. Select the year you want to check. Izaberite godinu koju želite provjeriti. QSOs QSOi DXCC DXCC CQ CQ Award Priznanje Confirmed PotvrÄ‘eno Worked RaÄ‘eno WAZ WAZ Score Zbroj Annual GodiÅ¡nje Number of confirmed DXCC entities. Broj potvrÄ‘enih DXCC entiteta. Number of worked DXCC entities. Broj raÄ‘enih DXCC entiteta. Number of confirmed WAZ zones. Broj potvrÄ‘enih WAZ zona. Number of worked WAZ zones. Broj raÄ‘enih WAZ zona. Number of confirmed QSOs. Broj potvrÄ‘enih QSOa. Number of worked QSOs. Broj raÄ‘enih QSOa. Number of QSOs worked in the selected year. Broj QSOa raÄ‘enih u izabranoj godini. Number of DXCCs worked in the selected year. Broj DXCCa raÄ‘enih u izabranoj godini. Number of CQ Zones worked in the selected year. Broj CQ zona raÄ‘enih u izabranoj godini. Score for the DXMarathon in the selected year. Zbroj za DXMarathon u izabranoj godini. DX-Marathon DX-Marathon CTYPage Country data download Preuzmi podatke o zemljama KLog needs country data... KLog treba podatke o zemljama... &Download &Preuzmi &Ignore &Zanemari Country data needed Potrebni su potaci o zemljama KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. KLog koristi cty.csv datoteku s http://www.country-files.com/ za dobivanje DXCC informacija. You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do. Trebate preuzeti cty.csv datoteku ako želite da vam KLog prikaže zemlje, lokator, itd. QSOa koje radite. Click on Download to download now. Kliknite na Preuzmi za trenutno preuzimanje. KLog KLog I can't find the host. Please check your network and try again Do you want to try again? Ne mogu naći stroj. Molim provjerite mrežu i pokuÅ¡ajte ponovo Želite li probati ponovo? DXCCStatusWidget Update Ažuriraj It seems that the DXCC status in your database is not updated and KLog can't find any dxcc information. You can try to fix this by updating the log. Do you want to update your DXCC status? Entity Entitet Prefix Prefiks Pref: Pref: CQ: CQ: ITU: ITU: Beam: Snop: Entity not worked in this band. Entitet nije raÄ‘en na ovom pojasu. DXClusterWidget Connect Spoji Clear IzbriÅ¡i Click on connect to connect to the DX-Cluster Kliknite spoji za spajanje na DX-Cluster Trying to connect to the server PokuÅ¡avam se spojiti na poslužitelj KLog DXCluster Kontest DXCluster KLog DXCluster Click on Connect to connect to the DX-Cluster server Kliknite Spoji za spajanje na DX-Cluster poslužitelj Check in QRZ.com Provjeri u QRZ.com Check this callsign in QRZ.com Provjeri ovaj pozivni znak u QRZ.com The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. Stroj odbija spajanje. Osigurajte da DXCluster poslužitelj radi i provjerite jesu li ime stroja i port ispravni. The following error occurred: %1. Dogodila se greÅ¡ka: %1. Connected to server Spojen na poslužitelj KLog message Kontest message Poruka KLoga Enter your callsign to connect to the cluster: Unesite pozivni znak za spajanje na klaster: Enter your password to connect to the cluster: (Just hit enter for no password) Unesite zaporku za spajanje na klaster: (samo Enter ako nemate zaporke) Not logged on, you may need to enter your callsign again. Niste prijavljeni, možda ćete trebati ponovo unijeti svoj pozivni znak. Enter here the commands to be sent to the DX-Cluster server. Unesite naredbu za poslati DX-Clusteru. It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! Nije bilo moguće otvoriti datoteku za spremanje DX zapažanja za pisanje. Aktivnost na DX-Clusteru neće biti spremljena! Disconnect Odspoji The host was not found. Please check: Poslužitelj nije pronaÄ‘en. Molim provjerite: - your network connection; - the host name and port settings. - vaÅ¡ spoj na mrežu; - ime poslužitelja i port. Connection closed by the server Poslužitelj je prekinuo vezu Click on Connect to connect to the DX-Cluster server. Kliknite Spoji za spajanje na DX-Cluster poslužitelj. Send PoÅ¡alji DataProxy_SQLite Software version in DB is null InaÄica softvera u bazi je null Aircraft Scatter Common term in hamradio, do not translate if not sure Aircraft Scatter Aurora Aurora Aurora-E Aurora-E Back scatter Common term in hamradio, do not translate if not sure Back scatter Earth-Moon-Earth Earth-Moon-Earth Sporadic E Sporadic E Internet-assisted Potpomognuto Internetom Ionoscatter Common term in hamradio, do not translate if not sure Ionoscatter Meteor scatter Common term in hamradio, do not translate if not sure Meteor scatter Terrestrial or atmospheric repeater or transponder Zemaljski ili zraÄni repetitor ili transponder Rain scatter Common term in hamradio, do not translate if not sure Rain scatter Satellite Satelit Bureau Common term in hamradio, do not translate if not sure Biro Manager Common term in hamradio, do not translate if not sure Manager All QSOs have been updated with a DXCC and the Continent. Svi QSOi su bili nadopunjeni DXCCom i kontinentom. Field Aligned Irregularities Common term in hamradio, do not translate if not sure Field Aligned Irregularities Query didn't failed Does this mean the query succeeded? Upit nije neuspio F2 Reflection Common term in hamradio, do not translate if not sure F2 Reflection Trans-equatorial Common term in hamradio, do not translate if not sure Trans-equatorial Tropospheric ducting Common term in hamradio, do not translate if not sure Tropospheric ducting Yes Da No Ne Requested I've opted for neutral gender but whether this is correct depends on the context in which this word is used. Zatraženo Ignore/Invalid Zanemari/Nevaljalo Validated Provjereno Queued Poredano Uploaded UÄitano Do not upload Ne uÄitavaj Modified Ažurirano Direct Izravno Electronic ElektroniÄki KLog DXCC KLog DXCC KLog - Invalid call detected KLog - Otkriven nevaljani pozivni znak An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported ADIF record? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. DownLoadCTY Download of cty.csv failed with the following error code: Preuzimanje cty.csv je neuspjelo s kodom greÅ¡ke: Download of cty.csv done. Preuzimanje cty.csv zavrÅ¡eno. There is already a cty.csv file in the folder but it will be replaced with the new one. Postojeća cty.csv datoteka u mapi bit će zamijenjena s novom. Could not open %1 for writing Nisam mogao otvoriti %1 za pisanje FileAwardManager Open Award file Award files (*.awa) Award file not opened KLog was not able to read the award file It was not possible to open the file %1 for reading. Nije bilo moguće otvoriti datoteku %1 za Äitanje. AWA wrong format The AWA file does not have the right format AWA file does not have an <EOH> field KLog - %1 FileManager Reading ADIF file... ÄŒitam ADIF datoteku... Abort reading Prekini Äitanje Writing ADIF file... Zapisujem ADIF datoteku... Abort writing Prekini pisanje KLog - Don't ask again KLog - Ne pitaj ponovo Do you want to reuse your answer? Želite li iskoristiti vaÅ¡ odgovor? KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again. KLog će automatski koristiti vaÅ¡ prijaÅ¡nji odgovor za sva sliÄna pitanja, ako ih bude, bez da vas ponovo pita. <ul><li>Date/Time:</i> %1</li><li>Callsign: %2</li><li>Band: %3</li><li>Mode: %4</li></ul> <ul><li>Datum/Vrijeme:</i> %1</li><li>Pozivni znak: %2</li><li>Frekvencijski pojas: %3</li><li>NaÄin rada: %4</li></ul> KLog - QSO not found KLog - QSO nije pronaÄ‘en Do you want to add this QSO to the log?: Želite li dodati ovaj QSO u dnevnik: We have found a QSO coming from LoTW that is not in your local log. Do you want KLog to add this QSO to the log? PronaÅ¡li smo QSO koji dolazi iz LoTWa a koji nije u vaÅ¡em lokalnom dnevniku. Želite li da KLog doda ovaj QSO u dnevnik? KLog - Invalid call detected KLog - Otkriven nevaljani pozivni znak An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported log file? Otkriven je prazan pozivni znak. Želite li svejedno izvesti ovaj QSO (kliknite na Da) ili odstraniti polje iz izvezene dnevniÄke datoteke? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log file? Otkriven je nevaljali pozivni znak %1. Želite li svejedno izvesti ovaj pozivni znak (kliknite na Da) ili odstraniti pozivni znak iz izvezene dnevniÄke datoteke? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. You can, however, edit the ADIF file once the export process is finished. Izvoz nevaljalih pozivnih znakova može izazvati probleme u aplikacijama u koje ćete možda uvesti ovu dnevniÄku datoteku. No, to može biti i valjani pozivni znak koji je KLog pogreÅ¡no identificirao kao nevaljali. Svakako možete urediti ADIF datoteku nakon Å¡to je proces izvoza zavrÅ¡en. The selected callsign (%1) is not valid, please check it again to export the log. Izabrani pozivni znak (%1) nije valjan, molim provjerite joÅ¡ jednom kako bi izvezli datoteku. There are no QSOs pending to be exported with that station callsign. Nema QSOa sa tim pozivnim znakom za koje je izvoz u tijeku. Export Izvoz Export progress Napredak izvoza Writing ADIF file... QSO: Zapisujem ADIF datoteku ... QSO: KLog - File not opened KLog - Datoteka nije otvorena It was not possible to open the file %1 for reading. Nije bilo moguće otvoriti datoteku %1 za Äitanje. KLog was not able to read the LoTW file KLog nije mogao proÄitati LoTW datoteku Processing LoTW ADIF file... Abort processing LoTW reading KLog - Add new QSOs? Do you want to add non existing QSOs to your local log? There are some QSOs in the LoTW log that are not in your local log. Processing LoTW ADIF file...... QSO: %1 / %2 You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated. Reading LoTW file... ÄŒitam LoTW datoteku... Importing LoTW ADIF file... Uvozim LoTW datoteku... You have canceled the file import. The file will be removed and no data will be imported. Prekinuli ste uvoz datoteke. Datoteka će biti izbrisana i nijedan podatak neće biti uvezen. Do you want to add dupe QSOs to your local log? There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date. This QSO is not including the minimum data to consider a QSO as valid! Ovaj QSO ne sadrži minimalne podatke da bi se smatrao valjanim QSOom! Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO with %1 on %2: KLog je naÅ¡ao jedan QSO bez pozivnog znaka postaje. Unesite pozivni znak postaje pod kojim je uraÄ‘en ovaj QSO sa %1 na %2: KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO on %1: KLog je naÅ¡ao jedan QSO bez pozivnog znaka postaje. Unesite pozivni znak postaje pod kojim je uraÄ‘en ovaj QSO na %1: Do you want to continue with the current file? Želite li nastaviti s trenutnom datotekom? Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information. Nekim QSOima u ovoj datoteci, (npr.: %1) izgleda nedostaje RST-TX informacija. If you select NO, maybe the QSO will not be imported. Ako izaberete Ne, QSO možda neće biti uvezen. Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. Nekim QSOima u ovoj datoteci, (npr.: %1) izgleda nedostaje RST-RX informacija. KLog - Apply to all QSOs in this log? KLog - Primjeni na sve QSOe u ovom dnevniku? - The band missing and the following call: - Frekvencijski pojas nedostaje i sljedeći pozivni znak: - The mode missing and the following call: - NaÄin rada nedostaje i sljedeći pozivni znak: - The date missing and the following call: - Datum nedostaje i sljedeći pozivni znak: - The time missing and the following call: - Vrijeme nedostaje i sljedeći pozivni znak: You have canceled the file export. The file will be removed and no data will be exported. Prekinuli ste izvoz datoteke. Datoteka će biti izbrisana i podaci neće biti izvezeni. Do you still want to cancel? Želite li joÅ¡ uvijek prekinuti? QSO: QSO: KLog - Log selection KLog - Izbor dnevnika There is more than one log in this logfile. U ovoj dnevniÄkoj datoteci nalazi se viÅ¡e od jednog dnevnika. All logs will be imported into the current log. Svi dnevnici bit će uvezeni u trenutni dnevnik. Do you want to continue? Želite li nastaviti? Importing ADIF file... Uvozim ADIF datoteku... It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) Izgleda da imate duplikate QSOa u ADIF datoteci koju uvozite. Želite li nastaviti? (Duplicirani QSOi neće biti uvezeni) KLog - Error KLog - PogreÅ¡ka The selected log does not exist, please check it again. Izabrani dnevnik ne postoji, molim provjerite joÅ¡ jednom. The file %1 can't be opened. Datoteka %1 ne može biti otvorena. KLog - User cancelled KLog - Korisnik poniÅ¡tio Exporting ADIF file... QSO: %1 / %2 Izvozim ADIF datoteku... QSO: %1 / %2 KLog - Duplicated QSOs KLog - Duplicirani QSOi Please edit the ADIF file and make sure that it include at least: Molim uredite ADIF datoteku tako da ukljuÄuje barem: and i This QSO had: Ovaj QSO je imao: KLog: Not all required data found! KLog: Nisu pronaÄ‘eni svi obavezni podaci! KLog: No RST TX found! KLog: Nije naÄ‘en RST TX! KLog: No RST RX found! KLog: Nije naÄ‘en RST RX! KLog - No Station callsign entered. KLog - pozivni znak nije uneÅ¡en. KLog - QSO without Station Callsign KLog - QSO bez pozivnog znaka stanice HamLibNetworkConfigWidget Enter the hostname or address of the radio. Set de network port of the radio. Host/Address Port Port Enter the port of the radio. HamLibSerialConfigWidget Bauds Bauda Select the serial port speed. Izaberite brzinu serijskog porta. Port Port Select the serial port. Only the serial ports that are detected are shown. Izaberi setijski port. Samo detektirani portovi su prikazani. Scan Pretraži Click to identify the serial ports available in your computer. Kliknite da bi oznaÄili raspoložive serijske portove na vaÅ¡em raÄunalu. 5 bits 5 bita 6 bits 6 bita 7 bits 7 bita 8 bits 8 bita Data bits Podatkovnih bitova Select the serial data bits. Izaberite broj serijskih podatkovnih bitova. None Nijedan Hardware Sklopovlje Software XON/XOFF Softverski XON/XOFF Flow control Kontrola toka Select the serial flow control Izaberite kontrolu serijskog toka No parity Bez pariteta Even Paran Odd Neparan Space Space Mark Mark Parity Paritet Select the serial parity. Izaberite paritet serijskog porta. 1 bit 1 bit 1.5 bits 1,5 bita 2 bits 2 bita Stop bits Stop bita Select the serial stop bits. Izaberite broj serijskih stop bita. InfoWidget 10M 10M 15M 15M 20M 20M 40M 40M 80M 80M 160M 160M 2M 2M 6M 6M 12M 12M 17M 17M 30M 30M 70CM 70Cm Continent Kontinent Prefix Prefiks CQ CQ ITU ITU Short Path Kratki put Long Path Dugi put Deg Stu Miles Milje Km Km IntroPage Welcome to KLog! Welcome to Kontest! DobrodoÅ¡li u KLog! Welcome to KLog! - brought to you under the terms of the GPL! DobrodoÅ¡li u KLog! - vama pružen pod odredbama GPLa! Welcome to KLog DobrodoÅ¡li u KLog This looks like it's the first time you've run KLog on this computer. Izgleda da je ovo prvi put da ste pokrenuli KLog na ovom raÄunalu. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. It is designed to provide general purpose DX, and contest logging. Namijenjen je općenitom, DX i zapisivanju kontesta. It supports QSL management, import and export of ADIF Podržava baratanje QSLima, uvoz i izvoz ADIF and Cabrillo file formats and many other features... i Cabrilo datoteÄnih formata i mnoge druge funkcije... Before you can start using KLog, you will be asked to: Prije nego poÄnete koristiti KLog bit ćete upitani da: Acknowledge to the terms of the license. Prihvatite uvjete licence. Download the DX entities information. Preuzmete listu DX entiteta. Enter your callsign, CQ zone, etc. and main configuration. Unesete vaÅ¡ pozivni znak, CQ zonu, itd. i glavnu konfiguraciju. Enjoy KLog and contact the development team if you have any suggestions! Uživajte u KLogu i javite se razvojnom timu ako imate kakvih prijedloga! LicPage KLog License information KLog podaci o licenci Welcome to KLog!- brought to you under the terms of the GPL! DobrodoÅ¡li u KLog! - vama pružen pod odredbama GPLa! Acknowledge Prihvati Be aware that KLog is free software. Uzmite u obzir da je KLog slobodan softver. LoTWUtilities KLog - LoTW password needed KLog - trebam LoTW zaporku Please enter your LoTW password: Molim unesite vaÅ¡u LoTW zaporku: There is a file already existing with the name that will be used. Datoteka sa tim imenom već postoji. The file %1 already exist. Do you want to overwrite? Datoteka %1 već postoji. Želite li je prebrisati? KLog was not able to save the file %1. Error returned: %2 KLog nije mogao spremiti datoteku %1. GreÅ¡ka: %2 Downloading data to file: %1. Preuzimam podatke u datoteku: %1. KLog - LoTW download KLog - preuzimanje LoTW datoteke This is the first date of a QSO with the callsign %1 in this log If you think that in LoTW you may have previous QSOs, answer No. Do you want to use this date (%1) as start date? The remote server redirected our connection to %1 Server je preusmjerio naÅ¡u vezu na %1 Do you want to follow the redirection? Želite li slijediti preusmjeravanje? It was not possible for find the file %1 that has been just downloaded. Nije bilo moguće pronaći datoteku %1 koja je bila upravo preuzeta. It seems that LoTW has no QSO with the Station Callsign you are using (%1). Izgleda da LoTW nema niti jedan QSO sa pozivnim znakom koji koristite (%1). Try again and send the downloaded file (%1) to the KLog developer for analysis. PokuÅ¡ajte ponovo i poÅ¡aljite spremljenu datoteku (%1) razvijatelju KLoga na analizu. KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data? Klog je uspjeÅ¡no spremio %1 QSOa. Želite li ažurirati vaÅ¡ dnevnik sa preuzetim podatcima? Double click on the date that you want to use as the start date for downloading QSOs. KLog - LoTW Station callsign There is not a single QSO in the log with that station callsign. Are you sure that you want to use that station callsign (%1)? KLog - LoTW File already exists KLog - LoTW Can't write the file The file %1 already exists. Datoteka %1 već postoji. KLog - LoTW Start date selection KLog - LoTW Download error There was an error (%1) while downloading the file from LoTW. The downloading error details are: %1 KLog - LoTW Redirection found KLog - LoTW File not found KLog can't find the downloaded file. KLog ne može pronaći preuzetu datoteku. KLog - LoTW user/password error KLog - PogreÅ¡ka sa LoTW korisniÄkim imenom/zaporkom LoTW server did not recognized your user/password LoTW poslužitelj nije prepoznao vaÅ¡e korisniÄko ime/zaporku Check your user and password and ensure your are using the right one before trying again. Provjerite korisniÄko ime i zaporku prije nego ponovo pokuÅ¡ate. KLog - LoTW No QSOs KLog - Nema QSOa u LoTWu LoTW sent no QSOs LoTW nije poslao niti jedan QSO KLog - LoTW Unknown error KLog - Nepoznata LoTW pogreÅ¡ka KLog can't recognize the file that has been downloaded from LoTW. KLog ne može prepoznati datoteku preuzetu s LoTWa. Now KLog will process the downloaded QSO and update your local log. KLog će sada obraditi preuzeti QSO i ažurirati vaÅ¡ lokalni dnevnik. LogWindow QSL Send QSL Poslana QSL Rcvd QSL Primljena &Delete Iz&briÅ¡i Delete a QSO IzbriÅ¡i QSO &Edit QSO &Uredi QSO Edit this QSO Uredi ovaj QSO Via &bureau Preko &biroa Send this QSL via bureau PoÅ¡alji ovu QSL preko biroa D&irect &Izravno Send this QSL via direct PoÅ¡alji ovu QSL izravno Via bureau Preko biroa QSL &received via bureau QSL p&rimljena preko biroa Direct Izravno QSL received via direc&t QSL primljena &izravno Check in QRZ.com Provjeri u QRZ.com Check this callsign in QRZ.com Provjeri ovaj pozivni znak u QRZ.com Check in DXHeat.com Provjeri u DXHeat.com Check this callsign in DXHeat.com Provjeri ovaj pozivni znak u DXHeat.com Delete selected QSOs Delete the selected QSOs Export to ADIF Export the selected QSOs to an ADIF file. Upload to LoTW UÄitaj u LoTW Upload the selected QSOs to LoTW Upload to ClubLog Upload the selected QSOs to ClubLog Upload to eQSL.cc Upload the selected QSOs to eQSL.cc Send these QSLs via bureau Send these QSLs via direct QSLs received via bureau QSLs received via direc&t Select none Remove all selections Select all Select all the QSOs MainQSOEntryWidget &Add &Dodaj &Clear &IzbriÅ¡i Callsign of the QSO. Band of the QSO. Frekvencijski pojas QSOa. Mode of the QSO. NaÄin rada QSOa. Date of the QSO. Datum QSOa. Time of the QSO. Vrijeme QSOa. Add the QSO to the log. Dodaj QSO u dnevnik. Clears the QSO entry. IzbriÅ¡i unos QSOa. Look up info about the current callsign on qrz.com KLog will show real time if enabled. KLog će pokazati stvarno vrijeme ako je omogućeno. Real time Stop wsjt-x and hamlib from automatically updating QSO information. Manual Mode Callsign Pozivni znak &Save &Cancel &PoniÅ¡ti DUPE Translator: DUPE is a common world for hams. Do not translate of not sure DUPLI MainWindow Starting KLog Pokrećem KLog DX Entity DX entitet &Log Window &DnevniÄki prozor KLog KLog It seems that you have never done a backup or exported your log to ADIF. Izgleda da nikad niste napravili sigurnosnu kopiju ili izvezli vaÅ¡ dnevnik u ADIF. KLog - File not open KLog - Datoteka nije otvorena It was not possible to open the debug file for writing. No debug log will be saved! Nije bilo moguće otvoriti datoteku za pomoć pri otkrivanju greÅ¡ki za pisanje. Datoteka za pomoć pri otkrivanju greÅ¡ki neće biti spremljena! Status bar ... Traka statusa ... KLog - CTY.dat update It seems that the latest backup you did is older than one month. Izgleda da je vaÅ¡a posljednja sigurnosna kopija podataka starija od mjesec dana. Log backup recommended! Sigurnosne kopije dnevnika su preporuÄene! It is a good practice to backup your full log regularly to avoid loosing data in case of a problem. Once you export your log to an ADIF file, you should copy that file to a safe place, like an USB drive, cloud drive, another computer, ... KLog will remind you to backup on a monthly basis. Dobra praksa je napraviti sigurnosnu kopiju vaÅ¡eg cijelog dnevnika redovno kako bi izbjegli gubitak podataka u sluÄaju nekog problema. Jednom kad izvezete vaÅ¡ dnevnik u ADIF datoteku, kopirajte tu datoteku na sigurno mjesto, kao na primjer USB disk, cloud disk, drugo raÄunalo, ... KLog će vas potsjetiti da napravite sigurnosnu kopiju svakog mjeseca. KLog - Backup KLog - New version detected! Ready Spreman KLog - Unexpected error KLog - NeoÄekivana pogreÅ¡ka An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: Dogodila se neoÄekivana pogreÅ¡ka prilikom dodavanja QSOa u vaÅ¡ dnevnik. Ako se ovaj problem opetuje, molim kontaktirajte razvijatelje softvera radi analize: KLog - Not valid call KLog - Nevaljali pozivni znak Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. Dodavanje nevaljalih pozivnih znakova u dnevnik vam može izazvati probleme prilikom apliciranja za nagrade, izvoza ADIF datoteka za druge sustave ili aplikacije. KLog - Select correct entity KLog - Izaberite ispravan entitet You have selected an entity: Izabrali ste entitet: that is different from the KLog proposed entity: koji se razlikuje od entiteta predloženog u KLogu: Click on the prefix of the correct entity or Cancel to edit the QSO again. Kliknite na prefiks ispravnog entiteta ili PoniÅ¡ti kako bi ponovo ureÄ‘ivali QSO. No DXCC Translated in a sense "it is not a DXCC". If the context is "there is no DXCC" the translation should say "Nema DXCCa". Nije DXCC None Nijedan Click on the prefix of the right entity or Cancel to correct. "right" translated as in "correct"/"valid" (rather than "to the right of") Kliknite na prefiks ispravnog entiteta ili PoniÅ¡ti za ispravku. KLog - ClubLog error KLog - eQSL error KLog - %1 RSTrx RSTrx RSTtx RSTtx Do you really want to exit KLog? Želite li zaista izaći iz KLoga? &File &Datoteka Import an ADIF file into the current log. Uvezi ADIF datoteku u trenutni dnevnik. Export the current log to an ADIF logfile. Izvezi trenutni dnevnik u ADIF dnevniÄku datoteku. Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Izvezi SVE QSOe u jednu ADIF datoteku, ujedinjujući QSOe iz svih datoteka. Print your log. IspiÅ¡ite vaÅ¡ dnevnik. KLog folder KLog mapa Opens the data folder of KLog. Otvara mapu s KLog podacima. E&xit &Izlaz &Tools &Alati Fill in QSO data Popuni QSO podatke Go through the log reusing previous QSOs to fill missing information in other QSOs. ProÄ‘i kroz dnevnik i iskoristi prijaÅ¡nje QSOe kako bi popunio podatke koji nedostaju u drugim QSOima. Shows QSOs for which you should send your QSL and request the DX QSL. Prikazuje QSOe za koje trebate poslati vaÅ¡u QSLku i zatražiti DX QSLku. Find My-QSLs pending to send NaÄ‘i Moje-QSL za koje je slanje neodluÄeno Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Prikazuje QSOe sa neodluÄenim zahtjevima za slanje QSLke. Trebali biste ovaj red držati prazim! Your log has not been updated. VaÅ¡ dnevnik nije bio ažuriran. No QSO was updated with the data coming from LoTW. This may be because of errors in the logfile or simply because your log was already updated. Niti jedan QSO nije bio ažuriran sa podacima iz LoTWa. To može biti zbog pogreÅ¡aka u dnevniÄkoj datoteci ili jednostavno zato Å¡to ste već ažurirali vaÅ¡ dnevnik. You need to select one station callsign to be able to send your log to ClubLog. Do you want to add this QSOs to your ClubLog existing log? If you don't agree, this upload will overwrite your current ClubLog existing log. KLog - eQSL KLog needs to update the Entities database. The backup was not properly done. Spremanje sigurnosne kopije nije bilo uspjeÅ¡no. This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. The QRZ.com upload process has finished with an error and the log was possibly not uploaded. Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? KLog - QRZ.com There was an error while updating to Yes the QRZ.com QSO upload information. The QRZ.com upload process has finished successfully Call not found in QRZ.com KLog - QRZ.com error KLog - Stop the war in Ukraine! KLog - Stop the war in Ukraine! You are using a Russian call (%1). You can probably help to stop the Russian war, people are dying. Please call your leaders to stop the war. You are using an Ukranian call. Please take care and protect yourself and your family. The KLog developers wish you the best of luck in this very difficult moment. People are dying in the war of Russia against Ukraine. You can help to stop the Russian war against Ukraine. Please show your disagreement to your leaders, or in your social network to stop the war. Always check the current callsign in QRZ.com Upload queued QSOs to LoTW KLog - KLog folder not found Do you want to update now? You seem to have never backed up or exported your log to ADIF. Your latest backup seems older than one month. Regular backups prevent data loss and are good operator practice. Once exported, copy your ADIF file to a safe place such as a USB drive, cloud drive or other offsite computer. KLog will remind you to backup on a monthly basis. Backup completed successfully KLog will remind you again in approximately one month. Backup failed. Periodic data backups are recommended to prevent data loss and corruption of your log. This version of KLog requires that the DXCC database is updated. The database will be updated. The setup will now open to allow you to change your settings. KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 KLog - QRZ.com warning QRZ.com has returned a non-subcribed error and queries to QRZ.com will be disabled. Please check your QRZ.com subcription or credentials. KLog has received an error from QRZ.com. You need to activate the %1 service in the eLog preferences. KLog - ADIF export It is important to export to ADIF and save a copy as a backup. Saving the log was done successfully. The ADIF export was not properly done. &Import from ADIF ... Export to ADIF ... Export all logs to ADIF ... &Print Log ... Settings ... QSL tools ... Find QSO to QSL Find DX-QSLs pending to receive Find requested pending to receive LoTW tools ... Queue all QSOs from this log to be sent Queue all the QSOs to be uploaded Queue all the QSO to be uploaded Show Map Online manual (F1) ... Now you can upload them to LoTW. There was a problem to mark all pending QSOs as queued for LoTW! You have selected no callsign. KLog will complete the QSOs without a station callsign defined and those with the callsign you are entering here. All queued QSOs of this log has been marked as sent to LoTW! There was a problem to mark all queued QSOs as sent to LoTW! KLog - Update checking result TQSL finished with no error. Do you want to mark as Sent all the QSOs uploaded to LoTW? The selection you have done does not include any QSO The selection you have done does not include any QSO. Select the Station Callsign to use when quering LoTW: Izaberite pozivni znak koji želite koristiti prilikom upita u LoTW: Please check the LoTW setup Molim provjerite LoTW postavke You have not defined a LoTW user or a proper Station Callsign. Open the LoTW tab in the Setup and configure your LoTW connection. Niste definirali LoTW korisnika ili valjani pozivni znak. Otvorite LoTW sekciju u Postavke i konfigurirajte podatke za LoTW. Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1 ClubLog ClubLog The log is ready to be uploaded to ClubLog. All the QSOs in this log has been marked as Modified in the ClubLog status field KLog could not mark the full log to be sent to ClubLog Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers. The log is ready to be uploaded to eQSL.cc. All the QSOs in this log has been marked as Modified in the eQSL.cc status field KLog could not mark the full log to be sent to eQSL KLog - QRZ.COM QRZ.COM The log is ready to be uploaded to QRZ.com. All the QSOs in this log has been marked as Modified in the QRZ.com status field KLog could not mark the full log to be sent to QRZ.com To upload QSOs you need a qrz.com subscription. If you have one, go to Setup->QRZ.com tab to enable it. You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. Filling QSOs ... Date/Time Datum/Vrijeme Printing the log ... KLog - QSO received Station Callsign Pozivni znak postaje Operator Callsign Pozivni znak operatera KLog - WSJTX Dupe QSO This QSO seems to be duplicated. Do you want to save or discard it? KLog - Non-supported mode KLog - NaÄin rada nije podržan A new mode not supported by KLog has been received from an external program or radio: Novi naÄin rada koji nije podržan u KLogu primljen je iz vanjskog softvera: Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) Želite li nastaviti primati ovu obavijest? (ako onemogućite ovu obavijest nećete moći otkriti nevažeće naÄine rada) Native Error Recommendation: Preporuka: Periodically export your data to ADIF to prevent a potential data loss. Povremeno izvezite podatke u ADIF kako bi sprijeÄili potencijalni gubitak podataka. Mark all queued QSOs in this log as sent to LoTW. OznaÄi sve poredane QSOe u ovom dnevniku kao poslane u LoTW. Mark all queued QSOs as sent to LoTW. OznaÄi sve poredane QSOe kao poslane u LoTW. Shows DX-QSLs for which requests or QSLs have been sent with no answer. Prikazuje DX QSL za koje je QSL bio zatražen ili je bio poslan ali odgovor nije stigao. It was not possible to define the KLog folder. Some functions may not work properly! Shows the DX-QSLs that have been requested. Prikaži DX QSLke koje su zatražene. Queue all QSLs from this log to be sent Stavi sve QSLe iz ovog dnevnika u red za slanje Mark all non-sent QSOs in this log as queued to be uploaded. OznaÄi sve ne-poslane QSOe u ovom dnevniku kao poredane za uÄitavanje. Queue all QSLs to be sent Poredaj sve QSLke za slanje Put all the non-sent QSOs in the queue to be uploaded. Stavi sve neposlane QSOe u red za uÄitavanje. Mark all queued QSOs as sent OznaÄi sve poredane QSOe kao poslane For updated DX-Entity data, update cty.csv. Za osvježene podatke o DX entitetima, osvježite cty.csv. Stats Statistike Show the statistics of your radio activity. Prikazuje statistike vaÅ¡e radio aktivnosti. &Help &Pomoć Do you really want to mark ALL the QSOs of this log to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. Do you really want to mark ALL pending QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. KLog - TQSL KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. TQSL nije instaliran ili ga KLog ne može naći. Molim provjerite konfiguraciju. Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded. GreÅ¡ka #1: Korisnik je prekinuo proces ili TQSL nije bio konfiguriran. Nijedan QSO nije bio uÄitan. Error #2: Upload was rejected by LoTW, please check your data. GreÅ¡ka #2: LotW je odbio uÄitavanje, molim provjerite vaÅ¡e podatke. Error #3: The TQSL server returned an unexpected response. GreÅ¡ka #3: TQSL poslužitelj odgovorio je neoÄekivanim odgovorom. Error #4: There was a TQSL error. GreÅ¡ka #4: Dogodila se TQSL greÅ¡ka. Error #5: There was a TQSLLib error. GreÅ¡ka #5: Dogodila se TQSLLib greÅ¡ka. Error #6: It was not possible to open the input file. GreÅ¡ka #6: Nije bilo moguće otvoriti ulaznu datoteku. Error #7: It was not possible to open the ouput file. GreÅ¡ka #7: Nije bilo moguće otvoriti izlaznu datoteku. Error #8: No QSOs were processed since some QSOs were duplicates or out of date range. GreÅ¡ka #8: Nijedan QSO nije bio obraÄ‘en jer su neki QSOi bili duplikati ili izvan granica nadnevaka. Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range. GreÅ¡ka #9: Neki QSOi su bili obraÄ‘eni, a neki ignorirani zbog toga Å¡to su bili duplikati ili izvan granica nadnevaka. Error #10: Command syntax error. KLog sent a bad syntax command. GreÅ¡ka #10: GreÅ¡ka sintakse naredbe. KLog je poslao naredbu sa pogreÅ¡nom sintaksom. Error #11: LoTW Connection error (no network or LoTW is unreachable). GreÅ¡ka #11: GreÅ¡ka spajanja na LoTW (mreža nije dostupna ili LoTW nije dostupan). Error #00: Unexpected error. Please contact the development team. GreÅ¡ka #00: NeoÄekivana greÅ¡ka. Molimo kontaktirajte razvijatelje programa. The log that you have selected contains more than just one station callsign. Dnevnik koji ste izabrali sadrži viÅ¡e od samo jednog pozivnog znaka. Please select the station callsign you want to mark as sent to LoTW: Molim izaberite pozivni znak postaje za koju želite oznaÄiti kao poslano u LoTW: Station Callsign: Pozivni znak postaje: Define Station Callsign Odrediti pozivni znak postaje Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Unesite pozivni znak za ovaj dnevnik ili ga ostavite praznim za QSO bez definiranog pozivnog znaka postaje: KLog - No station selected KLog - Nijedna postaja nije izabrana No station callsign has been selected and therefore no log will be marked Niti jedan pozivni znak nije izabran i kao takav niti jedan dnevnik neće biti oznaÄen Congratulations! ÄŒestitke! You already have the latest version. Već imate najnoviju inaÄicu. There was an error while updating to Yes the LoTW QSL sent information. Dogodila se greÅ¡ka prilikom postavljanja LoTW QSL poslana podatka na Da. You can find the KLog data folder here: KLog mapa s podacima je ovdje: start pokrenuti stop zaustaviti If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. Ako ste sigurni da baza podataka sadrži QSOe i KLog ih nije uspio pronaći, molimo kontaktirajte razvijatelje programa (vidite O Klogu) za pomoć. Download from LoTW ... Download the full log from LoTW ... ClubLog tools ... Upload the queued QSOs to ClubLog ... eQSL tools ... Upload the queued QSOs to eQSL.cc ... QRZ.com tools ... Upload the queued QSOs to QRZ.com ... Update cty.csv Update Satellite Data &Tips ... &About ... About Qt ... Check updates ... About ... No QSOs have been exported to ADIF. Nijedan QSO nije bio izvezen u ADIF. KLog has exported %1 QSOs to the ADIF file: %2 KLog je izvezao %1 QSOa u ADIF datoteku: %2 You need to select one station callsign to be able to send your log to LoTW. Trebate izabrati jedan pozivni znak postaje kako biste mogli poslati vaÅ¡ dnevnik u LoTW. KLog - Select the Station Callsign. KLog - Izaberitie pozivni znak postaje. You have requested to delete the QSO with: %1 Zatražili ste da izbriÅ¡ete QSO sa: %1 Are you sure? Jeste li sigurni? You have requested to delete several QSOs Check always the current callsign in QRZ.com You can update the entities database in Tools->Update cty.csv The callsign %1 is not a valid call. Do you really want to add this callsign to the log? The ClubLog upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? KLog - ClubLog KLog - ClubLog There was an error while updating to Yes the ClubLog QSO upload information. The ClubLog upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The file has not been removed. It seems that there was something that prevented KLog from removing the file You can remove it manually. The eQSL upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1 Do you want to mark as Uploaded all the QSOs uploaded to eQSL? There was an error while updating to Yes the eQSL QSO upload information. The eQSL upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? KLog - Exit KLog - Izlaz Mark all queued QSOs from this log as sent Check the current callsign in QRZ.com &Debug ... All pending QSOs of this log has been marked as queued for LoTW! Svi QSOi u tijeku u ovom dnevniku oznaÄeni su kao poredani za LoTW! There was a problem to mark all pending QSOs of this log as queued for LoTW! Nastao je problem prilikom oznaÄavanja svih porednih QSOa u ovom dnevniku kao poredanih za LoTW! Your log has been updated with the LoTW downloaded QSOs. VaÅ¡ dnevnik je ažuriran podacima QSOa preuzetih iz LoTWa. KLog has updated %1 QSOs from LoTW. KLog je ažurirao %1 QSOa iz LOTWa. All pending QSOs has been marked as queued for LoTW! Svi poredani QSOi su oznaÄeni kao poredani za LoTW! All queued QSOs has been marked as sent to LoTW! Svi QSOi u tijeku su oznaÄeni kao poslani u LoTW! There was a problem to mark all queued QSOs of this log as sent to LoTW! Nastao je problem prilikom oznaÄavanja svih porednih QSOa u ovom dnevniku kao poslanih u LoTW! It seems that there are no QSOs in the database. Izgleda da u ovoj bazi podataka nema nijednog QSOa. Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: Popunjavam DXCC, CQz, ITUz, Kontinent u QSOima... QSO: Callsign Pozivni znak QSO logged from WSJT-X: QSO zabilježen iz WSJT-X: It seems that you are running this version of KLog for the first time. Izgleda da izvrÅ¡avate ovu inaÄicu KLoga po prvi put. The setup will be open to allow you to do any new setup you may need. Postavke će biti otvotene kako biste imali priliku da podesite sve Å¡to biste mogli trebati. The logfile has been modified. DnevniÄka datoteka je bila izmijenjena. Do you want to save your changes? Želite li spremiti svoje izmjene? UDP Server error The UDP server failed to %1. start or stop GreÅ¡ka UDP poslužitelja UDP poslužitelj nije %1. Status of the DX entity. Status DX entiteta. Name of the DX entity. Ime DX entiteta. QSO QSO QSL QSL eQSL eQSL Comment Komentar Others Drugi My Data Moji podaci Satellite Satelit DXCC DXCC Info Podaci Awards Priznanja Search Traži Log Dnevnik DX-Cluster DX-Cluster Save ADIF File Spremi ADIF datoteku The LoTW upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? LoTW uÄitavanje je zavrÅ¡eno i KLog je napravio datoteku (%1) u vaÅ¡oj KLog mapi. Želite li da KLog izbriÅ¡e tu datoteku? The file has been removed. Datoteka je izbrisana. KLog - LoTW KLog - LoTW Open File Otvori datoteku - Needed for DXMarathon - Potrebno za DXMarathon Abort filling Prekini ispunjavanje Number Broj Band Pojas Mode NaÄin rada Print Log IspiÅ¡i dnevnik Abort printing Prekini ispis Printing the log... QSO: Ispisujem dnevnik... QSO: The following QSO data has been received from WSJT-X to be logged: QSO sa slijedećim podacima je primljen iz WSJT-Xa kako bi bilo zapisan u dnevnik: Freq Frekv Time On Vrijeme poÄetka Time Off Vrijeme kraja RST TX RST TX RST RX RST RX DX-Grid DX koordinata Local-Grid Lokalna koordinata Duplicated QSOs have to match another existing QSO with the same call, band, mode, date and time, taking into account the period that can be defined in the settings. If the received mode is correct, please contact KLog development team and request support for that mode Ako je ovaj naÄin rada valjan, molimo javite razvijateljima KLoga i zatražite podrÅ¡ku za ovaj naÄin rada KLog - QSO Dupe A dupe QSO has been detected in the file and will not be added to the log. Please check the QSO information file and ensure it is properly added. KLog - Duplicated satellite KLog - Dupliciran satelit A duplicated satellite has been detected in the file and will not be imported. Duplicirani satelit je otkriven u datoteci i neće biti uvezen. Please check the satellite information file and ensure it is properly populated. Molim provjerite datoteku s podacima o satelitima i osigurajte da je ispravno popunjena. Now you will see a more detailed error that can be used for debugging... Sada ćete vidjeti detaljnije greÅ¡ke koje možete koristiti za otklanjanje neispravnosti... An unexpected error ocurred!! Dogodila se nepredviÄ‘ena greÅ¡ka!! If the problem persists, please contact the developers Ako problem i dalje traje, molimo javite razvijateljima programa for analysis: za analizu: Error in function GreÅ¡ka u funkciji Error text Tekst greÅ¡ke Failed query Neuspio upit KLog - Show errors KLog - Prikaži pogreÅ¡ke Do you want to keep showing errors? Želite li nastaviti viÄ‘ati greÅ¡ke? MainWindowInputComment Comment Komentar Add a comment for this QSO. Dodaj komentar za ovaj QSO. Keep this data Spremiti ove podatke Data entered in this tab will be copied into the next QSO. Podaci uneseni u ovu karticu biti će kopirani u sljedeći QSO. MainWindowInputEQSL Date of the ClubLog upload. Datum ClubLog uÄitavanja. Date of the QRZ.com upload. Date of the eQSL sending. Datum slanja eQSLa. Date of the eQSL reception. Datum prijema eQSLa. Date of the LoTW sending. Datum slanja LoTWa. Date of the LoTW reception. Datum prijema LoTWa. Status on QRZ.com. Status of the LoTW sending. Status slanja LOTWa. Status of the LoTW reception. Status prijema LoTWa. QRZ.com LoTW Sent LoTW Posl LoTW Rec LoTW Prim Status on ClubLog. Status u ClubLogu. Status of the eQSL sending. Status eQSL slanja. Status of the eQSL reception. Status eQSL prijema. ClubLog ClubLog eQSL Sent eQSL poslana eQSL Rec eQSL primljena MainWindowInputOthers Primary Div Primarni Pod Secondary Div Sekundarni Pod IOTA IOTA Entity Entitet Propagation mode Propagacijski mod Others Drugi Keep propagation mode Select the primary division for this QSO. Izaberi primarnu podjelu za ovaj QSO. Select the secondary division for this QSO. Izaberi sekundrnu podjelu za ovaj QSO. Select the entity for this QSO. Izaberi entitet za ovaj QSO. Select the propagation mode for this QSO. Izaberi propagaciju za ovaj QSO. Select the IOTA continent for this QSO. Izaberi IOTA kontinent za ovaj QSO. Select the IOTA reference number for this QSO. Izaberi IOTA referentni broj za ovaj QSO. Keeps the same propagation mode for next QSO. Select the appropriate ADIF field for this QSO. Value for the selected ADIF field. Not Identified Nije identificiran Not - Not Identified Nije - Nije identificiran SOTA Ref Age VUCC grids Distance MainWindowInputQSL QSL Sent QSL Poslana QSL Rec QSL Prim QSL Via QSL Preko QSL Msg QSL Por Status of the QSL sending. Status slanja QSLa. Status of the QSL reception. Status prijema QSLa. QSL sending information. Informacija slanja QSLa. QSL reception information. Informacija prijema QSLa. Date of the QSL sending. Datum slannja QSLa. Date of the QSL reception. Datum prijema QSLa. Message of the QSL. QSL poruka. QSL via information. QSL preko podaci. MainWindowInputQSO TX RST. TX RST. RX RST. RX RST. TX Frequency in MHz. TX frekvencija u MHz. RX Frequency in MHz. RX frekvencija u MHz. Power used by the contacted station. Name of the contacted operator. QTH of the contacted station. Locator of the contacted station. Watts Wata MHz MHz Split Translator: Split is a common hamradio term. Do not translate unless you are sure. Name Ime QTH QTH DX Locator DX lokator Power(rx) Snaga(rx) RST TX RX Frequency RST(tx) RST(tx) RST(rx) RST(rx) Freq TX Frekv TX Freq RX Frekv RX DX QTH locator. DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. TX Frequency in MHz. Frequency is not in a hamradio band! TX frekvencija u MHz. Frekvencija nije u radioamaterskom frekvencijskom pojasu! RX Frequency in MHz. Frequency is not in a hamradio band! RX frekvencija u MHz. Frekvencija nije u radioamaterskom frekvencijskom pojasu! MainWindowMyDataTab Watts Wata Keep this data Spremiti ove podatke My QTH locator. Moj QTH lokator. Power Snaga Operator callsign Station Callsign Pozivni znak postaje My Locator Moj lokator My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. Moj QTH lokator. Format bi trebao biti Maidenhead kao IN70AA do 10 znakova. My Rig My Antenna My SOTA_Ref My VUCC_GRIDS MainWindowSatTab Keep this data Spremiti ove podatke Other - Sat not in the list Drugo - Satelit nije na listi Data entered in this tab will be copied into the next QSO. Podaci uneseni u ovu karticu biti će kopirani u sljedeći QSO. Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Ime satelita ako nije na popisu. Odaberite "%1" kako bi omogućili ovu opciju (formata kao AO-51). Satellite mode used. Satelitski naÄin rada koriÅ¡ten. Select the satellite you are using. Izaberite satelit koji koristite. UpLink band. UpLink frekvencijski pojas. DownLink band. DownLink frekvencijski pojas. Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. Lokator DX postaje. Ova kućica sinkronizirana je sa kućicom Lokator u QSO odjeljku. UpLink UpLink DownLink DownLink Satellite Satelit Mode NaÄin rada DX Locator DX lokator Other Drugo MHz MHz Locator of the DX station. Format should be Maidenhead like IN70AA up to 10 characters. Lokator DX postaje. Format bi trebao biti Maidenhead kao npr. IN70AA do 10 znakova. Not Sat QSO Nije satelitski QSO KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. KLog je otkrio satelit Äije ime ne poznaje. Ako je rijeÄ o nekom od poznatih satelita, molim izaberite ga s liste. InaÄe, molim kontaktirajte razvojni tim da dodaju ime novog satelita. The satellite you have in your QSO is: Satelit kojeg imate u QSOu je: Please be aware that the satellite name will not be saved if it is not in the list, so that information may be lost! Pripazite na to da ime satelita neće biti spremljeno ako nije na popisu, tako da informacija može biti izgubljena! RX Frequency in MHz. Frequency is not in a hamradio band! RX frekvencija u MHz. Frekvencija nije u radioamaterskom frekvencijskom pojasu! RX Frequency in MHz. RX frekvencija u MHz. TX Frequency in MHz. Frequency is not in a hamradio band! TX frekvencija u MHz. Frekvencija nije u radioamaterskom frekvencijskom pojasu! TX Frequency in MHz. TX frekvencija u MHz. MapWindowWidget Select QSOs in this band. Select QSOs in this mode. Select QSOs in this propagation mode. Select QSOs using this Satellite. Only confirmed Select only confirmed QSOs. All bands Show nothing All modes All propagation modes All satellites OnlineMessageWidget The server returned the following error: %1 Not identified Nije identificiran QObject Database Error GreÅ¡ka baze podataka KLog DB needs to be upgraded. Klog baza treba se nadograditi. Do you want to upgrade it now? Želite li nadograditi sada? If DB is not upgraded KLog may not work properly. Ako baza podataka nije nadograÄ‘ena KLog možda neće ispravno raditi. Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea. Nadogradnja softvera može potencijalno izazvati probleme. Spremanje sigurnosne kopije vaÅ¡e datoteke prije nadogradnje je uvijek dobra ideja. Do you want to backup your DB now? Želite li spremiti sigurnosnu kopiju vaÅ¡e baze podataka sad? The backup finished successfully. Spremanje sigurnosne kopije je bilo uspjeÅ¡no. You can find the backup in this file: %1 Sigurnosnu kopiju možete naći u datoteci: %1 The backup was not properly done. Spremanje sigurnosne kopije nije bilo uspjeÅ¡no. You will be sent back to the starting point. Bit ćete poslani na poÄetak. KLog - DB can't be updated automatically KLog - Baza podataka ne može biti automatski nadograÄ‘ena You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version. NadograÄ‘ujete KLog iz inaÄice koja je prestara i ova nadogradnja se ne može izvrÅ¡iti automatski iz te inaÄice. KLog - DB update KLog - ažuriranje baze podataka KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. KLog je otkrio prijaÅ¡nji dnevnik u bazi. Svi podaci bit će preneÅ¡eni u novi dnevnik DX tipa. KLog: Enter Station callsign KLog: Unesite pozivni znak postaje Enter the station callsign used in this log Unesite pozivni znak koji će biti koriÅ¡ten u ovom dnevniku Station Callsign Pozivni znak postaje QSO: QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? Prekid ove nadogradnje proizvest će nekonzistentne podatke i mogući gubitak podataka. Želite li joÅ¡ uvijek prekinuti? Progress: Napredak: Updating DXCC award information... Updating DXCC Award information... Updating WAZ award information... Updating WAZ Award information... Updating mode information... Ažuriram podatke o naÄinu rada... The process to upgrade is: - Using an old KLog version export your log to ADIF. - Remove your logbook.dat file from your KLog folder. - Install the new KLog version. - Import your ADIF file. KLog will finish when you click on OK. Proces nadogradnje je: - Koristeći staru inaÄicu KLoga izvezite datoteku u ADIF. - IzbriÅ¡ite logbook.dat datoteku iz vaÅ¡e KLog mape. - Instalirajte novu inaÄicu KLoga. - Uvezite vaÅ¡u ADIF datoteku. KLog će izaći kad kliknete na OK. All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay. Svi podaci su ispravno preneÅ¡eni. Idite u Postavljanje->Postavke->Dnevnici i provjerite da je sve u redu. Abort updating Prekini ažuriranje Updating bands information... Ažuriram podatke o frekvencijskim pojasevima... Updating bands information in %1 status... Ažuriram podatke o frekvencijskim pojasevima za %1 status... Updating mode information in %1 status... Ažuriram podatke o naÄinu rada za %1 status... New One, work it! nNew One, work it! Novi, odradite! Needed, work it! Treba, odradite! Worked but not confirmed RaÄ‘en ali nije potvrÄ‘en Confirmed PotvrÄ‘eno Not identified Nije identificiran KLog is already running. It is allowed to run only one instance. Install wizard was canceled before completing... Instalacijski Äarobnjak prekinut je prije kraja... Do you want to remove the KLog dir from your disk? Želite li izbrisati KLog mapu s vaÅ¡eg diska? Your KLog dir has been removed VaÅ¡a KLog mapa je uklonjena I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. Nisam mogao ukloniti vaÅ¡u KLog mapu. IzbriÅ¡ite je ruÄno ako je želite ukloniti s vaÅ¡eg Ävrstog diska. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. VaÅ¡a KLog mapa nije mogla biti izbrisana. UÄinite to ruÄno ako je želite ukloniti s vaÅ¡eg Ävrstog diska. Remember that your KLog dir is on your system... Podsjetite se da je vaÅ¡a KLog mapa na vaÅ¡em sustavu... Thank you for running KLog! Hvala Å¡to koristite KLog! Updating information... Ažuriram podatke... Updating DXCC and Continent information... Ažuriram podatke o DXCC i kontinentima... A wrong callsign has been found: %1. Please enter a new callsign or confirm that the current one is a good callsign. An empty callsign has been detected. If it is possible, please enter the right call. Otkriven je prazan pozivni znak. Ako ste u mogućnosti, molim unesite ispravan pozivni znak. KLog - Not valid callsign found KLog - PronaÄ‘en nevaljali pozivni znak Date Datum Call Znak RSTtx RSTtx RSTrx RSTrx Band Pojas Comment Komentar Mode NaÄin rada CQz ITUz DXCC DXCC Address Age County A_Index Ant_Az Ant_El Ant_Path ARRL_SECT Award_Submitted Award_granted Band_RX CheckContest Class ClubLog SDate ClubLog status Continent Kontinent Contest Id Country Credit Submitted Credit granted Dark Dok Do not translate if unsure, common hamradio term. Fists Do not translate if unsure, common hamradio term. Fists CC Do not translate if unsure, common hamradio term. My Fists Do not translate if unsure, common hamradio term. Nr bursts Do not translate if unsure, common hamradio term. Nr pings Do not translate if unsure, common hamradio term. Sat mode SWL Do not translate if unsure, common hamradio term. Ten-Ten Do not translate, it is a hamradio group name. Distance Contacted_Op Email EQ_Call eQSL RDate eQSL SDate eQSL Rcvd eQSL Sent eQSL poslana Force Init Freq Frekv Freq RX Frekv RX Gridsquare HRDLog SDate HRDLog status IOTA IOTA IOTA Island id K Index Lat Lon LoTW RDate LoTW SDate LoTW Rcvd LoTW Sent LoTW Posl Max Bursts MS Shower My Antenna My City My Cnty My Country My CQz My DXCC My Gridsquare My IOTA My IOTA island id My ITUz My Lat My Lon My Name My Postal code My Rig My Sig My Sig Info My SOTA ref My State My Street My USACA counties My VUCC grids Name Ime Notes Operator Owner Callsign Pfx Precedence Prop Mode Public Key QRZcom SDate QRZcom status QSL msg QSL RDate QSL SDate QSL Rcvd QSL Primljena QSL Sent QSL Poslana QSL rcvd via QSL sent via QSL via QSO complete QSO random QTH QTH Region Rig RX Pwr Sat name Ime satelita SFI Sig Sig Info Silent key Do not translate if unsure, common hamradio term. SKCC SOTA Ref SRX String SRX STX String State Submode UKSMG USACA counties VE prov VUCC grids TX Pwr Web QSO Date off Log number SearchWidget &Clear &IzbriÅ¡i &Select All OznaÄi &sve &Search &Traži &Export Highlighted Izv&ezi oznaÄeno All logs Svi dnevnici Clear the searches. OÄisti potrage. Export the search result to an ADIF file. Izvezi rezultat potraga u ADIF datoteku. Select/Unselect all the QSOs shown. OznaÄi/neoznaÄi sve prikazane QSOe. Search in the log. Traži u dnevniku. Search in all logs. Traži u svim dnevnicima. Select the Station Callsign used to do this QSO. Unesite pozivni znak koriÅ¡ten za ovaj QSO. All in log Sve u dnevniku Not defined Nije definiran &Clear selection &IzbriÅ¡i selekciju Save File Spremi Datoteku You have requested to delete the QSO with: %1 Zatražili ste da izbriÅ¡ete QSO sa: %1 Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs! Are you sure? Jeste li sigurni? SearchWindow Date/Time Datum/Vrijeme Band Pojas Mode NaÄin rada QSL Sent QSL Poslana QSL Rcvd QSL Primljena Station Callsign Pozivni znak postaje ID ID Call Znak Date/time Datum/vrijeme Station callsign Pozivni znak postaje QSL Send PoÅ¡alji QSL &Delete Iz&briÅ¡i Delete a QSO IzbriÅ¡i QSO &Edit QSO &Uredi QSO Edit this QSO Uredi ovaj QSO Via &bureau Preko &biroa Send this QSL via bureau PoÅ¡alji ovu QSL preko biroa D&irect &Izravno Send this QSL via direct PoÅ¡alji ovu QSL izravno Via bureau Preko biroa QSL &received via bureau QSL p&rimljena preko biroa Direct Izravno QSL received via direc&t QSL primljena &izravno Check in QRZ.com Provjeri u QRZ.com Check this callsign in QRZ.com Provjeri ovaj pozivni znak u QRZ.com Check in DXHeat.com Provjeri u DXHeat.com Check this callsign in DXHeat.com Provjeri ovaj pozivni znak u DXHeat.com &Request my QSL Za&traži moju QSL Mark my QSL as requested OznaÄi moju QSL kao zatraženu Via Direct and mark DX QSL as requested Izravno i oznaÄi DX QSL kao zatraženu Send this QSL via direct and mark DX QSL as requested PoÅ¡alji ovu QSL izravno i oznaÄi DX QSL kao zatraženu Via Bureau and mark DX QSL as requested Preko biroa i oznaÄi DX QSL kao zatraženu Send this QSL via bureau and mark DX QSL as requested PoÅ¡alji ovu QSL preko biroa i oznaÄi DX QSL kao zatraženu &Request the QSL Za&traži QSL Mark the QSL as requested OznaÄi QSL zatraženom Via bureau and mark my QSL as requested Preko biroa i oznaÄi moju QSL kao zatraženu QSL received via bureau and mark my QSL as requested QSL primljena preko biroa i oznaÄi moju QSL kao zatraženu Direc&t and mark as my QSL requested &Izravno i oznaÄi moju QSL kao zatraženu QSL received via direct and mark my QSL as requested QSL primljena izravno i oznaÄi moju QSL kao zatraženu Needed QSO to send the QSL QSO za koji treba poslati QSL My QSL requested to be sent Moja QSL zatražena za slanje DX QSL pending to be received Prijem DX QSLa u tijeku SetupDialog User data KorisniÄki podaci Bands/Modes Frekvencijski pojasevi/NaÄini rada DX-Cluster DX-Cluster Colors Boje Misc Razno World Editor Urednik svijeta Satellites Sateliti HamLib HamLib Do you want to add one log in the Logs tab or exit KLog? (Click Yes to add a log or No to exit KLog) Želite li dodati jednu dnevniÄku datoteku u kartici Dnevnici ili izići iz KLoga? (Kliknite da za dodavanje datoteke ili Ne za izlaz iz KLoga) DB has not been moved to new path. Baza podataka nije bila pomaknuta u novu putanju. Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Idite u karticu Razno i kliknite na Makni bazu ili baza podataka neće biti pomaknuta na novu lokaciju. Cancel PoniÅ¡ti OK OK D&X-Cluster D&X-Cluster Log widget eLog WSJT-X WSJT-X Settings You need to enter at least one log in the Logs tab. Trebate unijeti barem jedan dnevnik na kartici Dnevnici. You need to enter at least a valid callsign. Go to the User tab and enter valid callsign. You have not selected the kind of log you want. Niste izabrali kakvu vrstu dnevnika želite. You will be redirected to the Log tab. Please add and select the kind of log you want to use. Bit ćete preusmjereni na karticu Dnevnici. Izaberite vrstu dnevnika kakvu želite koristiti. Logs Dnevnici World Svijet SetupEntityDialog Entity Entitet CQ CQ ITU ITU Latitude Zemljopisna Å¡irina Longitude Zemljopisna dužina UTC UTC Main prefix Glavni prefiks ARRL ID ARRL ID Comma separated possible prefixes, e.g. EA1, EA2, ... Mogući prefiksi odvojeni zarezom, npr. EA1, EA2, ... Prefixes Prefiksi Name of the Entity. Ime entiteta. CQ zone. CQ Zona. ITU zone. ITU Zona. Longitude of the Entity. Zemljopisna dužina entiteta. Local time difference to UTC. Razlika lokalnog vremena od UTCa. Main prefix of the entity. Primarni prefiks entiteta. ARRL ID. ARRL ID. Date of the deletion. Datum brisanja. Deleted Izbrisan Cancel PoniÅ¡ti Ok Ok Entity Dialog Dialog entiteta SetupPageBandMode Bands Frekvencijski pojasevi Modes NaÄini rada SetupPageColors New One Novi Needed in this band Potrebno na ovom frekvencijskom pojasu Worked in this band RaÄ‘en na ovom frekvencijskom pojasu Confirmed in this band Confirmed PotvrÄ‘eno na ovom frekvencijskom pojasu Default Zadano WSJT-X palette WSJT-X paleta Default palette UobiÄajena paleta Dark Mode Color when the DXCC is an ATNO (All Time New One). Boja kad je DXCC ATNO (All Time New One). DXCC is confirmed in this band. DXCC je potvrÄ‘en na ovom pojasu. Default color. UobiÄajena boja. Sets a palette of colors similar to the one used in WSJT-X. Postavlja paletu boja sliÄnu onoj koriÅ¡tenoj u WSJT-X. Sets the default palette. Postavlja uobiÄajenu paletu. Light Mode This DXCC was worked before in another band but not in the selected band. It may be needed due to the CQ, ITU, Grid, ... DXCC je već uraÄ‘ena na drugom frekvencijskom pojasu. Možda je potrebna zbog CQ, ITU, lokatora, ... Worked DXCC, but not confirmed in this band. DXCC odraÄ‘en, ali nije potvrÄ‘en na ovom opsegu. Sets the Dark Mode Choose a color Izaberite boju SetupPageDxCluster Add Dodaj Delete IzbriÅ¡i Show &HF spots Show HF spots Prikazati &HF zapažanja Show V/&UHF spots Show V/UHF spots Prikazati V/&UHF zapažanja Show W&ARC spots Show WARC spots Prikazati W&ARC zapažanja Show &worked spots Show worked spots Prikazati od&raÄ‘ena zapažanja Show &confirmed spots Show confirmed spots Prikazati p&otvrÄ‘ena zapažanja Show ANN/&FULL messages Show ANN/FULL messages Prikazati ANN/&FULL poruke Show WW&V messages Show WWV messages Prikatati &WWV poruke Show WC&Y messages Show WCY messages Prikazati WC&Y poruke Save DX Cluster activity Spremi aktivnost na DX klasteru Saves all the DX-Cluster activity to a file in the KLog folder Sprema svu aktivnost na DX klasteru u datuteku u KLogovoj mapi Send DX Spots to the map Sends the received DX Spots to the map to know where is the activity. DX Spots DX zapažanja Others Drugi Messages Poruke KLog: Add a DXCluster server Kontest: Add a DXCluster server KLog: Dodaj DX-Cluster poslužitelj Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default.: Dodaj adresu iza koje je :port Primjer: dxfun.com:8000 Ako ne dodate port, 41112 se podrazumijeva: SetupPageELog ClubLog password ClubLog App password ClubLog email Enter the email you used to register in ClubLog. Unesite e-mail s kojim ste registrirani u ClubLogu. Enter your password ClubLog here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!! Send QSOs in real time Activate ClubLog Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Å alji svaki QSO u ClubLog u realnom vremenu, kako su dodavani (ili mijenjani) u KLogu. Starts the ClubLog support in KLog. Pokreće ClubLog podrÅ¡ku u KLogu. Activate eQSL.cc Enter your username of eQSL.cc. Enter your password eQSL.cc here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) eQSL.cc password eQSL.cc user ClubLog ClubLog eQSL.cc QRZ.com Enter the user of your QRZ.com account. You need to be subscribed to QRZ.com to use this service. User Enter your password QRZ.com here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Password Activate QRZ.com Check automatically Check in Qrz.com all Calls as they are entered Paying Subscriber Check it if you are paying for a qrz.com subscription LogBook Key LogBook Key for QSO uploading. You can get this key in your QRZ.com logbook webpage. Remember that you need a QRZ.com subscription to use this feature. LoTW LoTW Upload Download TQSL path Use TQSL Koristi TQSL LoTW password LoTW user Enter your LoTW user. Enter your password LoTW here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Unesite zaporku za LoTW. Upozorenje: Zaporka će biti spremljena neÅ¡ifrirana u KLog-ovoj datoteci s postavkama! (Ako ne želite unijeti zaporku, KLog će vas pitati kad je bude trebao.) Path to the TQSL software. Putanja do TQSL programa. Enable the LoTW integration with TQSL. You will need to have TQSL installed Omogući LoTW integraciju preko TQSLa. Morate imati TQSL instaliran Select File Izaberite datoteku SetupPageHamLib Activate HamLib Aktiviraj HamLib Activates the hamlib support that will enable the connection to a radio. Aktivira hamlib podrÅ¡ku koja omogućava spajanje na radio. Read-Only mode Samo Äitaj If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio. Ako je omogućeno, KLog će Äitati frekvenciju i naÄin rada od radija ali mu nikad neće slati nikakvu naredbu. Radio Radio Select your rig. Izaberite vaÅ¡ ureÄ‘aj. Serial Network Defines the interval to poll the radio in msecs. Definira interval provjere radio ureÄ‘aja u milisekundama. Poll interval Interval provjere Test: OK Test: NOK Test Click to test the connection to the radio SetupPageLogView Fields SetupPageLogs &New New &Novo &Edit Ur&edi &Remove Izb&risati KLog KLog Do you really want to remove this log? Želite li zaista ukloniti ovaj dnevnik? Operators Operateri An error has occurred showing the following error code: Nastupila je greÅ¡ka sa sljedećim kodom: Log has not been removed. (#3) Dnevnik nije bio izbrisan (#3) Add a new log. Dodaj novi dnevnik. Edit the selected log. Uredi izabrani dnevnik. Remove the selected log. IzbriÅ¡i izabrani dnevnik. All the QSOs from this log will also be deleted... Svi QSOi iz ovog dnevnika će biti izbrisani... Log has not been removed. (#2) Dnevnik nije bio izbrisan (#2) Log has not been removed. (#1) Dnevnik nije bio izbrisan (#1) QSOs QSOi The new log could not be created. Nije bilo moguće otvoriti novi dnevnik. KLog - SetupPageLogs KLog - SetupPageLogs ID ID Station Callsign Pozivni znak postaje Comments Komentari Date Datum SetupPageLogsNew &Ok &Ok &Cancel &PoniÅ¡ti &Date &Datum &Station Callsign Pozivni znak po&staje &Operators &Operateri Comm&ent Kom&entar Callsign used for this log. Pozivni znak koriÅ¡ten za ovaj dnevnik. Comma separated list of operators: callsign1, callsign2. Lista operatera odvojenih zarezom: pozivni1, pozivni2. Start date of this log. Datum poÄetka ovog dnevnika. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. Unesite komentar o ovom dnevniku. Ako je uneÅ¡en, bit će prikazan u KLogu za identifikaciju dnevnika. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. SetupPageMisc &Imperial system Imperial system &Imperialni sustav &Log in real time Log in real time &Dnevnik u stvarnom vremenu &Time in UTC Time in UTC Vrijeme u U&TC &Save ADIF on exit Save ADIF on exit &Spremi ADIF Datoteku pri izlasku Use this &default filename Use this default filename Koristi ovu &podrazumijevanu datoteku Mark &QSO to send QSL when QSL is received Mark QSO to send QSL when QSL is received OznaÄi &QSO za slanje QSL kad je QSL primljena Complete QSO with previous data Popuni QSO prijaÅ¡njim podacima Manage DX-Marathon Upravljanje DX Marathonom Activate the application debug log Aktivirajte poruke za otkrivanje greÅ¡ki u aplikaciji &Delete always temp ADIF file after uploading QSOs Move DB Makni bazu podataka In seconds, enter the time range to consider a duplicate if same call, band and mode is entered. If you disable this checkbox KLog will not check callsigns to identify wrong callsigns. Check it for Imperial system (Miles instead of Kilometers). OznaÄite za imperijalni sustav (milje umjesto kilometara). Select to use the following name for the logfile without being asked for it again. OznaÄite za koriÅ¡tenje sljedećeg imena za dnevniÄku datoteku bez da ste za to ponovo upitani. Select if you want to manage DX-Marathon. OznaÄite ako želite upravljati DX Marathonom. This is the default file where ADIF data will be saved. Ovo je zadana datoteka u koju će se spremati ADIF podaci. This is the directory where the database (logbook.dat) will be saved. Ovo je mapa u koju će se spremiti baza podataka (logbook.dat). Click to change the path of the database. Kliknite za promjenu putanje baze podataka. Activates the application debug log. This may be useful if something is not working as expected. A debug file will be created in the KLog directory. Aktivira poruke za otkrivanje greÅ¡ki u aplikaciji. Ovo može biti korisno ako neÅ¡to ne radi kako treba. Datoteka će biti zapisana u KLogovoj mapi. Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default. Kliknite kako bi uobiÄajeno oznaÄili kao poredane (za slanje) sve eQSL (LoTW i eQSL) u svim novim QSOima. Delete Always the adif file created after uploading QSOs Dupe time range: Please specify an existing directory where the database (logbook.dat) will be saved. Molim odaberite postojeću mapu gdje će baza podataka (logbook.dat) biti spremljena. This is the directory where DB (logbook.dat) will be saved. Ovo je mapa u koju će baza podataka (logbook.dat) biti spremljena. Check non-valid calls Show seconds Mark sent eQSL && LoTW in new QSO as queued OznaÄite poslane eQSL i LoTW u novim QSOima kao poredane Show seconds in the QSO editor Click to change the default ADIF file. Kliknite za promjenu zadane ADIF datoteke. Click to move the DB to the new directory. Kliknite za micanje baze podataka u novu mapu. Select the application debug log level. This may be useful if something is not working as expected. A debug file will be created in the KLog directory and/or shown with Help->Debug menu. Log level Select Directory Izaberite mapu KLog - Move DB KLog - Pomakni bazu podataka File moved Datoteka maknuta File copied Datoteka kopirana File already exist. Datoteka već postoji. The destination file already exist and KLog will not replace it. Please remove the file from the destination folder before moving the file with KLog to make sure KLog can copy the file. OdrediÅ¡na datoteka već postoji i KLog je neće prebrisati. Molim izbriÅ¡ite odrediÅ¡nu datoteku prije micanja datoteke u KLogu kako biste osigurali da KLog može kopirati datoteku. File NOT copied Datoteka NIJE kopirana The file was not copied due to an unknown problem. Datoteka nije kopirana uslijed nepoznatog problema. The target directory does not exist. Please select an existing directory. Ciljna mapa ne postoji. Molim izaberite postojeću mapu. Show the Station &Callsign used in the search box Pokazati pozivni znakl &postaju koriÅ¡tenu u kućici za pretraživanje &Check for new versions automatically &Provjeri za nove verzije automatski QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. QSOi će biti oznaÄeni kao nerijeÅ¡eni za slanje QSLke ako primite DX QSLku a niste poslali vaÅ¡u. Check if there is a new release of KLog available every time you start KLog. Provjeri je li dostupna nova inaÄica KLoga svaki put kad pokreneÅ¡ KLog. &Provide Info for statistics &Pruži podatke za statistiku The search box will also show the callsign on the air to do the QSO. Polje za pretraživanje će takoÄ‘er pokazati pozivnu oznaku u eteru za uraditi QSO. If new version checking is selected, KLog will send the developer your callsign, KLog version and Operating system to help in improving KLog. Ako oznaÄite provjeru nove inaÄice, KLog će razvijatelju progama poslati vaÅ¡u pozivnu oznaku, inaÄicu KLoga i operacijski sustav u svrhu unaprijeÄ‘ivanja KLoga. Select to use real time. OznaÄite da koristite stvarno vrijeme. Select to use UTC time. Izaberite za koriÅ¡tenje UTC vremena. Select if you want to save to ADIF on exit. OznaÄite ako želite snimiti u ADIF formatu prije izlaska. Complete the current QSO with previous QSO data. Popuni trenutni QSO podacima prijaÅ¡njeg QSOa. Browse Razgledavanje Open File Otvori datoteku SetupPageSats &New &Novo &Edit Ur&edi &Remove Izb&risati &Import &Uvoz E&xport &Izvoz Add a new satellite. Dodaj novi satelit. Edit the selected satellite. Uredi izabrani satelit. Remove the selected satellite. IzbriÅ¡i izabrani satelit. Export your current satellites to a file. Izvezite vaÅ¡e trenutne satelite u datoteku. Select the sat you want to open. Izaberite satelit koji želite otvoriti. KLog KLog Do you really want to remove this satellite? Želite li zaista izbrisati ovaj satelit? Import a satellites file. It will replace the satellites you have in the current list. Uvezi datoteku sa satelitima. To će zamijeniti satelite koje trenutno imate na listi. This satellite will no be longer available to be selected ... Ovaj satelit viÅ¡e neće moći biti izabran ... Sat has not been removed. (#3) Satelit nije bio izbrisan (#3) Sat has not been removed. (#2) Satelit nije bio izbrisan (#2) Sat has not been removed. (#1) Satelit nije bio izbrisan (#1) ID ID Short Kratko Name Ime Uplink Leaving original here makes more sense Uplink Downlink Leaving original here makes more sense Downlink Modes NaÄini rada An error has occurred showing the following error code: Nastupila je greÅ¡ka sa sljedećim kodom: KLog - SetupPageSats KLog - SetupPageSats Open Satellites File Otvori datoteku sa satelitima KLog warning Klog upozorenje An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Dogodila se neoÄekivana pogreÅ¡ka prilikom uvoza podataka o satelitima. Moguće je da datoteka koju pokuÅ¡avate uvesti nije u ispravnom obliku. Please check the format or contact the developer for analysis with the error code: Molim provjerite format ili kontaktirajte razvijatelja za analizu koda greÅ¡ke: Save Satellites File Spremi datoteku sa satelitima SetupPageSatsNew Short name Kratko ime Sat name Ime satelita UpLink UpLink DownLink DownLink Modes NaÄini rada &Ok &Ok &Cancel &PoniÅ¡ti Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Unesite kratko ime. PokuÅ¡ajte koristiti kratko ime sa LoTWa kako biste poslije mogli uÄitati QSOe u LoTW. Enter the name of the satellite. Unesite ime satelita. Enter the uplink frequencies in this format: 144.300 Unesite uplink frekvenciju u ovom formatu: 144.300 Enter the downlink frequencies in this format: 144.300 Unesite downlink frekvenciju u ovom formatu: 144.300 Enter the modes in this format: USB Unesite naÄine rada u ovom formatu: USB Some of the data you have entered is not correct; the satellite can't be added. Neki od podataka koje ste unijeli nije valjan; satelit ne može biti dodan. SetupPageSubdivisionNew &Date &Datum &Station Callsign Pozivni znak po&staje &Operators Comm&ent Kom&entar &Ok &Ok &Cancel &PoniÅ¡ti Callsign used for this log. Pozivni znak koriÅ¡ten za ovaj dnevnik. Comma separated list of operators: callsign1, callsign2. Lista operatera odvojenih zarezom: pozivni1, pozivni2. Start date of this log. Datum poÄetka ovog dnevnika. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. Unesite komentar o ovom dnevniku. Ako je uneÅ¡en, bit će prikazan u KLogu za identifikaciju dnevnika. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. SetupPageSubdivisions &Remove Izb&risati Import new Import an AWA file with the subdivision details. Remove the selected references. Select the references you want to open. KLog KLog Do you really want to remove the data of this entity? All the subdivision information for this entity will be deleted... Log has not been removed. (#3) Dnevnik nije bio izbrisan (#3) Log has not been removed. (#2) Dnevnik nije bio izbrisan (#2) Log has not been removed. (#1) Dnevnik nije bio izbrisan (#1) ID ID Name Ime Short Name CQ Zone CQ Zona ITU Zone ITU Zona Deleted Start Date End Date DXCC DXCC An error has occurred showing the following error code: Nastupila je greÅ¡ka sa sljedećim kodom: KLog - SetupPageSubdivisions SetupPageUDP Start UDP Server Pokreni UDP poslužitelj Automatically log QSOs from WSJT-X Automatski zapisuj QSOe iz WSJT-X Allow WSJT-X to send logged QSOs to KLog Dozvoli WSJT-X da Å¡alje QSOe za zapisivanje u KLog QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected QSOi zapisani u WSJT-X biti će poslani u KLog i KLog će pitati prije upisivanja u KLog osim ako je "%1" oznaÄeno KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. Klog će automatski zapisivati nadolazeće QSOe iz WSJT-X bez ikakve ruÄne potvrde. Update status information from WSJT-X Obnovi informaciju o statusu iz WSJT-X KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...) KLog će automatski prikazati i ažurirati podatke koji dolaze iz WSJT-X (DX pozivni znak, izvjeÅ¡taj, naÄin rada...) UDP port number where the UDP Server will listen for packets. UDP port na kojem će UDP poslužitelj sluÅ¡ati za pakete. Make sure it is the same port that the other programs are sending the data to. Default port is 2237. Budite sigurni da je isto port na koji i ostali programi Å¡alju podatke. UobiÄajeni port je 2237. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. UDP poslužitelj će primiti QSOe poslane iz drugih programa kao na primjer WSJT-X Å¡to će vam omogućiti automatsko zapisivanje iz tih programa u KLog. UDP Port UDP Port Select the interface to listen for UDP datagrams coming from WSJT-X. Network interface QSOs notification timeout (milisecs) Istek QSO obavijesti (milisekunde) Miliseconds that the notification of QSOs received from WSJTX will be shown. Milisekunde za koje će obavijest QSOa pristiglih iz QSJTX biti prikazana. SetupPageUserDataPage &Personal data Personal data Osobni &podaci Station &data Station data Podaci &postaje &Name Name &Ime &Address Address &Adresa Cit&y City &Grad &Zip Code Zip Code &PoÅ¡tanski kod Pro&v/State Prov/State Županija/&Regija Countr&y Country &Zemlja Enter your information for rig Unesite podatke o vaÅ¡oj postaji Enter your information for antenna Unesite podatke o vaÅ¡oj anteni Enter your name. Unesite vaÅ¡e ime. Enter your address - 1st line. Unesite vaÅ¡u adresu - 1. red. Enter your address - 2nd line. Unesite vaÅ¡u adresu - 2. red. Enter your address - 3rd line. Unesite vaÅ¡u adresu - 3. red. Enter your address - 4th line. Unesite vaÅ¡u adresu - 4. red. Enter your city. Unesite vaÅ¡ grad. Enter your zip code. Unesite vaÅ¡ poÅ¡tanski kod. Enter your province or state. In Croatian language both "country" and "state" translate to "država", there is no concept similar to that of US states as being parts of the country. Unesite vaÅ¡u pokrajinu ili županiju. Enter your country. Unesite vaÅ¡u državu. Enter your power information. Unesite potatke o vaÅ¡oj snazi. &Rig 1 &Radio ureÄ‘aj 1 R&ig 2 R&adio ureÄ‘aj 2 Ri&g 3 Ra&dio ureÄ‘aj 3 Antenna &1 Antena &1 Antenna &2 Antena &2 Antenna &3 Antena &3 Po&wer &Snaga Enter the station callsign that will be used for logging. Unesite pozivni znak postaje koji će biti koriÅ¡ten za zapisivanje dnevnika. Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Unesite lokator vaÅ¡e postaje. Alternativno, KLog može koristiti približan lokator na osnovu vaÅ¡eg pozivnog znaka. &Callsign &Operators &Operatori &CQ Zone &CQ Zona &ITU Zone &ITU Zona &Locator &Lokator &Locator (not valid) &Lokator (neispravan) Enter the operators (comma separated if more than one). Unesite operatere (odvojene zarezom ako je viÅ¡e od jednog). SetupPageWorldEditor KLog will not be able to show entities information. KLog neće moći prikazati podatke o entitetima. Prefix Prefiks Entity Entitet An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. Datoteka s podacima o entitetima (cty.csv) pronaÄ‘ena u vaÅ¡oj KLog mapi bit će uÄitana. Add Dodaj Delete IzbriÅ¡i Edit Uredi Export World Izvezi svijet Import World Uvezi svijet Still not implemented. JoÅ¡ neimplementirano. Import a new cty.csv file Uvezi novu cty.csv datoteku No entities information file (cty.csv) has been detected in your KLog folder. Datoteka s podacima o entitetima (cty.csv) ne postoji u vaÅ¡oj KLog mapi. ARRL ID ARRL ID Continent Kontinent CQ Zone CQ Zona ITU Zone ITU Zona UTC UTC Latitude Å irina Longitude Dužina Deleted Izbrisano Since Date Od datuma To Date Do datuma Open File Otvori datoteku BigCTY (*.csv) VelikiCTY (*.csv) Entities information has been updated. Podaci o entitetima su ažurirani. Entities information has not been updated. Podaci o entitetima nisu ažurirani. ShowAdifImportWidget The following QSOs are those QSOs that you have received the LoTW confirmation. Za ove QSOe ste primili LoTW potvrdu. Ok Ok DX DX Date/Time Datum/Vrijeme Band Pojas Mode NaÄin rada ShowErrorDialog KLog Message KLog poruka SoftwareUpdateDialog Ok Ok KLog update KLog nadogradnja <center><h2>KLog new version (%1) is available! </h2></center><br>There is a new version of KLog available.<br><br><b>You can get the new version from:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> Congratulations! ÄŒestitke! Your KLog has been updated. VaÅ¡ KLog je ažuriran. You already have the latest version. Već imate najnoviju inaÄicu. StartWizard KLog - The free hamradio logging program KLog - slobodna dnevniÄka aplikacija za radio-amatere Quit Setup IzaÄ‘i iz postavljanja Setup is not complete yet. Are you sure you want to quit setup? Postavljanje nije zavrÅ¡eno. Jeste li sigurni da želite izaći iz postavljanja? StatisticsWidget QSO per year QSOi po godini DXCC per year DXCC po godini CQ zones per year CQ zone po godini QSO per band QSOi po frekv. pojasu QSO per mode QSOi po naÄinu rada QSO per DXCC QSOi po DXCCu QSO per Continent QSOi po kontinentu QSO per hour QSOi po satu QSO per month QSOi po mjesecu Worked / Confirmed status OdraÄ‘en / potvrÄ‘en status Worked / Sent status OdraÄ‘en / poslan status Sent / Confirmed status Poslan / potvrÄ‘en status Satellite grid status Satellite DXCC status Grids per band status DXCC per band status StatsCQZPerYearBarChartWidget CQ Zones per year CQ zona po godini Reading data ... UÄitavam podatke ... Abort reading Prekini Äitanje CQ zones CQ zone CQ zones per year CQ zone po godini Reading data ... UÄitavam podatke ... Years: %1/%2 Godine: %1/%2 StatsDXCCOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Broj Callsign Pozivni znak Date Datum Band Pojas Mode NaÄin rada DXCC DXCC Satellite Satelit Confirmed PotvrÄ‘eno No Ne StatsEntitiesPerYearBarChartWidget Chart title Naslov dijagrama Reading data ... UÄitavam podatke ... Abort reading Prekini Äitanje DXCC Entities DXCC Entiteti DXCC Entities per year DXCC Entiteti po godini Reading data ... UÄitavam podatke ... Entities: Entiteti: StatsFieldPerBandWidget All Svi Mode: Band Pojas Worked RaÄ‘eno Confirmed PotvrÄ‘eno StatsGridsOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Broj Callsign Pozivni znak Date Datum Band Pojas Mode NaÄin rada Grid Satellite Satelit Confirmed PotvrÄ‘eno No Ne StatsQSOsPerBandBarChartWidget QSOs per band QSOi po pojasu Reading data ... UÄitavam podatke ... Abort reading Prekini Äitanje Bands Pojasevi QSOs per band distribution Raspodjela QSOa po opsezima Reading data ... UÄitavam podatke ... Bands: Pojasevi: StatsQSOsPerContinentBarChartWidget QSOs per continent QSOi po kontinentu Reading data ... UÄitavam podatke ... Abort reading Prekini Äitanje Continents Kontinenti Reading data ... UÄitavam podatke ... Hours: Sati: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC QSOa po DXCC Reading data ... UÄitavam podatke ... Abort reading Prekini Äitanje Reading data... UÄitavam podatke ... DXCC DXCC Top ten DXCC per QSO Gornjih deset DXCCa po QSOu StatsQSOsPerHourBarChartWidget QSOs per hour QSOa po satu Reading data ... UÄitavam podatke ... Abort reading Prekini Äitanje Hours Sati QSOs at hour QSOa na sat Reading data ... UÄitavam podatke ... Hours: Sati: StatsQSOsPerModeBarChartWidget QSOs per mode QSOi po naÄinu rada Reading data ... UÄitavam podatke ... Abort reading Prekini Äitanje Modes NaÄini rada QSOs per mode distribution Raspodjela QSOa po naÄinu rada Reading data ... UÄitavam podatke ... Modes: NaÄini rada: StatsQSOsPerMonthBarChartWidget QSOs per month QSOa po mjesecu Reading data ... UÄitavam podatke ... Abort reading Prekini Äitanje Jan Sij Feb Velj Mar Ožu Apr Tra May Svi Jun Lip Jul Srp Sep Ruj Oct Lis Nov Stu Dec Pro Aug Kol Months Mjeseci QSOs at Month QSOi na mjesec Reading data ... UÄitavam podatke ... Months: Mjeseci: StatsQSOsPerYearBarChartWidget Reading data ... UÄitavam podatke ... Abort reading Prekini Äitanje QSOs QSOi QSOs per year QSOi po godini Reading data ... UÄitavam podatke ... QSO: %1/%2 QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Poslano - %1 Confirmed - %2 PotvrÄ‘eno - %2 Sent / Confirmed status Poslan / potvrÄ‘en status StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 OdraÄ‘eno, nije potvrÄ‘eno - %1 Confirmed - %2 PotvrÄ‘eno - %2 Worked / Confirmed status OdraÄ‘en / potvrÄ‘en status StatsWorkedSentPieChartWidget Worked - %1 RaÄ‘eno - %1 Sent - %2 Poslano - %2 Worked / Sent status OdraÄ‘en / poslan status TipsDialog KLog tips KLog savjeti Next Idući Previous Prethodni <b>Tip #1:</b><br>Do you know...<br>You can use <a href="#ToolsFillInQSO">Tools->Fill in QSO data</a> to automatically read the full log to fill the DXCC, CQ, ITU zones and continent? Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in QSO data <b>Savjet #1:</b><br>Znate li...<br>Možete koristiti <a href="#ToolsFillInQSO">Alati->Popuni QSO podatke</a>kako bi automatski proÄitali cijeli dnevnik i popunili DXCC, CQ, ITU zone i kontinent? <b>Tip #3:</b><br>Do you know...<br>You can use <a href="#ToolsFindQSO2QSL">Tools->QSL tools...->Find QSO to QSL</a> to look for all those QSO that you should send your QSL because you still need to confirm that DXCC and you have still not send your QSL card? Translator: Please make sure that the name of the link is coherent with the menu Tools->QSL tools...->Find QSO to QSL <b>Savjet #3:</b><br>Znate li...<br>Možete koristiti <a href="#ToolsFindQSO2QSL">Alati->NaÄ‘i QSO za QSL</a> za pronalaženje svih QSOa za koje bi trebali poslati vaÅ¡u QSLku jer joÅ¡ uvijek trebate potvrditi taj DXCC a joÅ¡ uvijek niste poslali vaÅ¡u QSL kartu? <b>Tip #2:</b><br>Do you know...<br>You can find the QSLs that you still need to send with <a href="#ToolsSendPendingQSL">Tools->QSL tools...->Find My-QSLs pending to send</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Requested</i>. Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in DXCC data <b>Savjet #7:</b><br>Znate li...<br>Možete naći QSLe koje joÅ¡ uvijek trebate poslati koriÅ¡tenjem <a href="#ToolsSendPendingQSL">Alati->QSL alati...->NaÄ‘i Moje-QSL za koje je slanje neodluÄeno</a>.<bR>Ovaj će vam alat pokazati u kućici za pretraživanje sve QSOe sa QSL-Poslana oznaÄenim kao <i>Zatražena</i>. {2:?} <b>Tip #4:</b><br>Do you know...<br>You can enter a '*' in the search box, in the search window to search for all the QSOs done with one specific station callsign? Translator: Please make sure that the name of the link is coherent with the menu File->Export Requested QSL to ADIF... <b>Savjet #5:</b><br>Znate li...<br>Možete unijeti '*' u polje za pretragu, u prozoru za pretragu kako biste naÅ¡li sve QSOe sa odreÄ‘enom postajom? {4:?} <b>Tip #5:</b><br>Do you know...<br>You can find the file containing all your log and other information in the logbook.dat file and the klogrc file, containing the KLog config file in the KLog folder by opening the <a href="#FileOpenKLogFolder">File->KLog folder</a> menu? <b>Savjet #6:</b><br>Znate li...<br>Možete naći datoteku koja sadrži vaÅ¡ dnevnik i ostale podatke u datoteci logbook.dat i klogrc datoteku, koja sadrži KLog konfiguraciju u KLog mapi otvarajući izbornik <a href="#FileOpenKLogFolder">Datoteka->KLog mapa</a>? {5:?} <b>Tip #6:</b><br>Do you know...<br>You can upload your QSO marked as queued to LoTW via TQSL with <a href="#ToolsUploadLoTW">Tools->LoTW tools ...->Sends the log to LoTW calling TQSL.</a> ?<br><br>You have to configure TQSL in the preferences to be able to use this functionality. Translator: Please make sure that the name of the link is coherent with the menu File->KLog folder <b>Tip #7:</b><br>Do you know...<br>You can see the QSO that confirms one specific DXCC entity in one specific band by poiting your mouse over that band in the DXCC widget? Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find My-QSLs pending to send <b>Savjet #20:</b><br>Jeste li znali...<br>Možete vidjeti QSO koji potvrÄ‘uje odreÄ‘eni DXCC entitet na odreÄ‘enom frekvencijskom pojasu držeći miÅ¡a iznad tog frekvencijskog pojasa u DXCC alatki? {7:?} <b>Tip #8:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceivePendingQSL">Tools->QSL tools...->Find DX-QSLs pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Sent</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find DX-QSLs pending to receive <b>Savjet #8:</b><br>Znate li...<br>Možete naći QSLke koje joÅ¡ uvijek oÄekujete koriÅ¡tenjem <a href="#ToolsReceivePendingQSL">Alati->QSL alati...->NaÄ‘i DX-QSL za koje je prijem neodluÄen</a>.<bR>Ovaj će vam alat pokazati u kućici za pretraživanje sve QSOe sa QSL-Poslana oznaÄene kao <i>Poslana</i> za koje joÅ¡ niste primili QSL karticu od DX postaje. <b>Tip #9:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceiveRecPendingQSL">Tools->QSL tools...->Find requested pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Rec marked as <i>Requested</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find requested pending to receive <b>Savjet #9:</b><br>Znate li...<br>Možete naći QSLke koje joÅ¡ uvijek oÄekujete koriÅ¡tenjem <a href="#ToolsReceiveRecPendingQSL">Alati->QSL alati...->NaÄ‘i zatražene neodluÄene za prijem</a>.<bR>Ovaj će vam alat pokazati u kućici za pretraživanje sve QSOe sa QSL-Primljena oznaÄene kao <i>Zatražena</i> za koje joÅ¡ niste primili QSL karticu od DX postaje. <b>Tip #10:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/klogchat>English KLog Telegram group</a> to discuss about KLog in English? <b>Savjet #10:</b><br>Znate li...<br>Možete se pretplatiti na <a href=https://t.me/klogchat>englesku KLog Telegram grupu</a> za diskusije o KLogu na engleskom jeziku? <b>Tip #11:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/KLogES>Spanish Telegram group</a> to discuss about KLog in Spanish? <b>Savjet #11:</b><br>Znate li...<br>Možete se pretplatiti na <a href=https://t.me/KLogES>Å¡panjolsku KLog Telegram grupu</a> za diskusije o KLogu na Å¡panjolskom jeziku? <b>Tip #12:</b><br>Do you know...<br>You can subscribe to <a href=https://groups.io/g/klog>KLog mailing list</a> to discuss via email about KLog in English? <b>Tip #13:</b><br>Do you know...<br>You can <a href=https://twitter.com/_ea4k>follow EA4K on twitter</a> to get updates about KLog? <b>Savjet #13:</b><br>Znate li...<br>Možete <a href=https://twitter.com/_ea4k>pratiti EA4K na twitteru</a> kako bi dobili obavijesti o KLogu? <b>Tip #14:</b><br>Do you know...<br>You can write your own <a href=https://www.eham.net/reviews/detail/3118>review in eHam.net about KLog</a> to help other users to decide to use KLog? <b>Savjet #14:</b><br>Znate li..<br>Možete napisati vlastitu <a href=https://www.eham.net/reviews/detail/3118>recenziju o KLogu na eHam.net</a> kako bi pomogli drugim korisnicima odluÄiti da koriste KLog? <b>Tip #15:</b><br>Do you know...<br>You can join the development team by simply <a href=https://www.klog.xyz/contact>Contacting us</a>? <b>Savjet #15:</b><br>Znate li...<br>Možete se pridružiti razvojnom timu jednostavno tako da nas <a href=https://www.klog.xyz/contact>Kontaktirate</a>? <b>Tip #16:</b><br>Do you know...<br>That there are many ways to contribute to KLog and some of them are listed in the <a href=https://www.klog.xyz/contrib>KLog Contribute</a> page? <b>Savjet #16:</b><br>Znate li...<br>Postoji mnogo naÄina na koje možete doprinijeti KLogu a neki od njih navedeni su na <a href=https://www.klog.xyz/contrib>KLog Doprinesi</a> stranici? <b>Tip #17:</b><br>Do you know...<br>You can support translating KLog into your language? Please check <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a> page. <b>Savjet #17:</b><br>Znate li...<br>Možete pomoći prijevodu KLoga na vaÅ¡ jezik? Molim pogledajte <a href=https://www.klog.xyz/contrib/translations>KLog Prijevodi</a> stranicu. <b>Tip #18:</b><br>Do you know...<br>You can double-click on an entity name in the DXCC table and all the QSOs with that DXCC Entity will be shown in the search box? <b>Savjet #18:</b><br>Znate li...<br>Možete dvostruko kliknuti na ime entiteta u DXCC tablici i svi QSOi s tim DXCC entitetom bit će prikazani u kućici za pretraživanje? <b>Tip #19:</b><br>Do you know...<br>You can right-click on a QSO and select <i>Check in QRZ.com</i> to check that callsign in QRZ.com? <b>Savjet #19:</b><br>Jeste li znali...<br>Možete napraviti desni klik na QSO i izabrati <i>Provjeri na QRZ.com</i> kako biste provjerili taj pozivni znak na QRZ.com? UpdateSatsData Reading Satellites data file... UÄitavam podatke o satelitima... Abort reading Prekini Äitanje The Satellites information has been updated. Podatci o satelitima su ažurirani. Open File Otvori datoteku Sat Data Sat podaci UpdateSettings KLog - Settings update The settings system has been changed and KLog will update your settings file. World Entity Entitet Continent Kontinent Abort reading Prekini Äitanje Reading cty.csv... ÄŒitam cty.csv... eLogClubLog Host not found! Stroj nije naÄ‘en! Timeout error! GreÅ¡ka prekoraÄenja vremena! This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO. Undefined error number (#%1)... KLog - ClubLog KLog - clublog KLog - ClubLog QSO dupe or not existing (#%1)... We have received an undefined error from Clublog (%1) Undefined error... Nedefinirana pogreÅ¡ka... Callsign missing Nedostaje pozivni znak Invalid callsign Nevaljali pozivni znak Skipping SWL callsign PreskaÄem SWL pozivni znak Callsign is your own call Callsign is your ow call Pozivni znak je vaÅ¡ vlastiti pozivni znak Invalid callsign with no DXCC mapping Nevaljali pozivni znak bez DXCC veze Updated QSO QSO ažuriran Invalid ADIF record Nevaljali ADIF zapis Missing ADIF record Nedostajeći ADIF zapis Test mode - parameters ok, no action taken Test naÄin rada - parametri su u redu, nikakva akcija nije poduzeta Please check your config in the setup and contact the KLog development team if you can't fix it. ClubLog uploads will be disabled. It seems to be a CREDENTIALS ERROR; check your email and password. It seems that your ClubLog credentials are not correct. Please check your credentials in the setup. ClubLog uploads will be disabled. Excessive API Usage Prekomjereno koriÅ¡tenje APIa Internal Error Interna pogreÅ¡ka Rejected I am not sure about the context, this is the masculine version of "rejected" OdbaÄen QSO Duplicate Duplicirani QSO QSO Modified QSO ažuriran Missing Login Nedostaje Login QSO OK QSO OK Upload denied Snimanje podataka na poslužitelj odbijeno No callsign selected Niti jedan pozivni znak nije oznaÄen No match found NiÅ¡ta podudarajuće nije naÄ‘eno Dropped QSO IspuÅ¡ten QSO OK OK Login rejected Login odbijen Rejected: Callsign is your own call Odbijeno: pozivni znak je vaÅ¡ vlastiti pozivni znak eLogQrzLog Host not found! Stroj nije naÄ‘en! Timeout error! GreÅ¡ka prekoraÄenja vremena! Undefined error number (#%1) We have received the following error from QRZ.com (%1) You are not subscribed to QRZ.com. Not valid KEY found Please configure your QRZ.com API key. You will find it in your QRZ.com Logbook settings webpage. You need a QRZ.com subscription to use this feature. KLog - QRZ.com password needed Please enter your QRZ.com password: KLog - QRZ.com Callsign missing Nedostaje pozivni znak eQSLUtilities Host not found! Stroj nije naÄ‘en! Timeout error! GreÅ¡ka prekoraÄenja vremena! Undefined error number (#%1)... eQSL Error: User or password incorrect eQSL Warning: At least one of the uplodaded QSOs is duplicated. eQSL: All the QSOs were properly uploaded. KLog - eQSL.cc password needed Please enter your eQSL.cc password: KLog - eQSL eQSL has sent the following message: %1 We have received an undefined error from eQSL (%1) Please check your config in the setup and contact the KLog development team if you can't fix it. eQSL uploads will be disabled. klog-2.3.3/translations/klog_de.ts0000644000015700001710000136013014542412415017036 0ustar jenkinsjenkins AboutDialog About KLog Über KLog By von KLog is a free logbook for hamradio operators. KLog ist ein freies Programm für Amateurradio-Operatoren. Please be aware that this is a development release and it may contain many bugs.<br>Backup your data before using this software! Since 0.6.2, KLog has been fully rewritten to provide a cross-platform application that runs on all major operating systems (GNU/Linux, macOS and Windows) and to support new functionality. Please provide your review in KLog's eHam review page: Bitte geben Sie Ihre Bewertung auf der eHam-Seite für KLog an: Find more information and the latest release at Weitere Informationen und die neueste Version auf Author Autor today 2018 Main developer Hauptentwickler KLog is developed by a very small team and you are invited to join! KLog wird von einer kleinen Gruppe entwickelt, machen Sie mit. If you want to provide support you are welcome to join the <a href="https://groups.io/g/klog">KLog mailing list</a>! Be aware that you can enable/disable this feature from the Misc tab in the Setup page. You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. .Senden Sie Fehlerberichte oder kleine Korrekturen des Quelltextes, Ideen oder alles, was KLog verbessern könnte. Authors Autoren Translators bring KLog into your language. They are really an important part of the KLog development team. Übersetzer bringen KLog in Ihre Sprache. Sie sind wirklich ein wichtiger Bestandteil. des KLog-Entwicklungsteams. If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://groups.io/g/klog">KLog mailing list</a>! Translators Übersetzer Privacy advisory Hinweis zur Privatsphäre KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account users' needs. At present, the data that is provided is the following: Zurzeit werden folgende Daten übertragen: Callsign Rufzeichen KLog version KLog-Version Operating system Betriebssystem KLog KLog Privacy Privatsphäre AdifLoTWExportWidget Select the Station Callsign that you want to use to upload the log. Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign. Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign. Station callsign My Locator Mein Locator Start date End date Ok OK Cancel Abbrechen DX Date/Time Datum/Zeit Band Band Mode Modus Not defined ALL QSOs: %1/%2 All Alle KLog - QSOs to be uploaded to LoTW. This table shows the QSOs that will be sent to LoTW. KLog - QSOs to be uploaded to ClubLog. This table shows the QSOs that will be sent to ClubLog. KLog - QSOs to be uploaded to eQSL.cc. This table shows the QSOs that will be sent to eQSL.cc. KLog - QSOs to be uploaded to QRZ.com. This table shows the QSOs that will be sent to QRZ.com. This table shows the QSOs that will be exported to ADIF. AwardsWidget Recalculate Neu berechnen Click to recalculate the award status. Klicken Sie, um den Diplom-Status neu zu berechnen. Select the year you want to check. Wählen Sie das Jahr, das Sie überprüfen möchten. QSOs QSOs DXCC DXCC CQ CQ Award Diplom Confirmed Bestätigt Worked Bearbeitet WAZ WAZ Score Bewertung Annual Number of confirmed DXCC entities. Anzahl der bestätigten DXCC-Einträge. Number of worked DXCC entities. Anzahl der bearbeiteten DXCC-Einträge. Number of confirmed WAZ zones. Anzahl der bestätigten WAZ-Zonen. Number of worked WAZ zones. Anzahl der bearbeiteten WAZ-Zonen. Number of confirmed QSOs. Anzahl der bestätigten QSOs. Number of worked QSOs. Anzahl der bearbeiteten QSOs. Number of QSOs worked in the selected year. Number of DXCCs worked in the selected year. Number of CQ Zones worked in the selected year. Score for the DXMarathon in the selected year. DX-Marathon DX-Marathon CTYPage Country data download Länderdaten herunterladen KLog needs country data... KLog benötigt Länderdaten ... &Download &Herunterladen &Ignore &Ignorieren Country data needed Länderdaten erforderlich KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do. Click on Download to download now. Klicken Sie zum Starten auf Herunterladen. KLog KLog I can't find the host. Please check your network and try again Do you want to try again? Der Rechner wurde nicht gefunden. Bitte überprüfen Sie Ihr Netzwerk und versuchen Sie es erneut Möchten Sie es erneut versuchen? DXCCStatusWidget Update Aktualisieren It seems that the DXCC status in your database is not updated and KLog can't find any dxcc information. You can try to fix this by updating the log. Do you want to update your DXCC status? Entity Eintrag Prefix Präfix Pref: CQ: ITU: Beam: Entity not worked in this band. Eintrag in diesem Band nicht bearbeitet. DXClusterWidget Click on Connect to connect to the DX-Cluster server Klicken Sie auf „Verbinden“, um die Verbindung zum DX-Clusterserver herzustellen Connect Verbinden Clear Löschen Check in QRZ.com Check this callsign in QRZ.com Click on connect to connect to the DX-Cluster Klicken Sie auf „Verbinden“, um die Verbindung zum DX-Clusterserver herzustellen Trying to connect to the server Es wird versucht, mit dem Server zu verbinden KLog DXCluster KLog-DX-Cluster The host was not found. Please check: Der Rechner wurde nicht gefunden, bitte überprüfen Sie: - your network connection; - the host name and port settings. - ihre Netzwerkverbindung - den Rechnernamen und Port-Einstellungen. The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. Die Verbindung ist von der Gegenstelle abgelehnt worden. Überprüfen Sie, dass der DX-Clusterserver erreichbar ist und dass der Rechnername und Port korrekt sind. The following error occurred: %1. Der folgende Fehler ist aufgetreten: %1. Connected to server Mit Server verbunden KLog message KLog-Nachricht Enter your callsign to connect to the cluster: Geben Sie Ihr Rufzeichen für die Verbindung zum DX-Cluster ein: Enter your password to connect to the cluster: (Just hit enter for no password) Geben Sie Ihr Passwort für die Verbindung zum Cluster ein: Oder drücken Sie die Eingabetaste für ein leeres Passwort Disconnect Verbindung trennen Not logged on, you may need to enter your callsign again. Sie sind nicht angemeldet, bitte geben Sie Ihr Rufzeichen nochmal ein. Enter here the commands to be sent to the DX-Cluster server. Geben Sie hier die Befehle ein, die an den DX-Cluster-Server gesendet werden. Connection closed by the server Verbindung durch den Server beendet Click on Connect to connect to the DX-Cluster server. Klicken Sie auf „Verbinden“, um die Verbindung zum DX-Clusterserver herzustellen. Send Senden It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! DataProxy_SQLite Software version in DB is null Keine Softwareversion für die Datenbank vorhanden Aircraft Scatter Common term in hamradio, do not translate if not sure Reflexion an Flugzeugen Aurora Aurora-E Back scatter Common term in hamradio, do not translate if not sure Earth-Moon-Earth Erde-Mond-Erde Sporadic E Internet-assisted Ionoscatter Common term in hamradio, do not translate if not sure Meteor scatter Common term in hamradio, do not translate if not sure Streuung durch Meteore Terrestrial or atmospheric repeater or transponder Terrestrische oder atmosphärische Reklektion oder Transponder Rain scatter Common term in hamradio, do not translate if not sure Streuung durch Regen Satellite Satellit Bureau Common term in hamradio, do not translate if not sure Büro Manager Common term in hamradio, do not translate if not sure Manager All QSOs have been updated with a DXCC and the Continent. Field Aligned Irregularities Common term in hamradio, do not translate if not sure Query didn't failed F2 Reflection Common term in hamradio, do not translate if not sure F2-Reflexion Trans-equatorial Common term in hamradio, do not translate if not sure Tropospheric ducting Common term in hamradio, do not translate if not sure Yes Ja No Nein Requested Angefordert Ignore/Invalid Ignoriert/Ungültig Validated Geprüft Queued Eingereiht Uploaded Hochgeladen Do not upload Nicht hochladen Modified Geändert Direct Direkt Electronic Elektronik KLog DXCC KLog-DXCC KLog - Invalid call detected An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported ADIF record? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. DownLoadCTY Download of cty.csv failed with the following error code: Das Herunterladen von cty.csv ist mit folgendem Fehler fehlgeschlagen: Download of cty.csv done. Das Herunterladen von cty.csv ist abgeschlossen. There is already a cty.csv file in the folder but it will be replaced with the new one. Es gibt bereits eine Datei cty.file im Ordner, sie wird durch die neue Datei ersetzt. Could not open %1 for writing %1 lässt sich nicht zum Schreiben öffnen FileAwardManager Open Award file Award files (*.awa) Award file not opened KLog was not able to read the award file It was not possible to open the file %1 for reading. AWA wrong format The AWA file does not have the right format AWA file does not have an <EOH> field KLog - %1 FileManager Writing ADIF file... ADIF-Datei wird geschrieben ... Abort writing Schreiben abbrechen QSO: QSO: Writing ADIF file... QSO: ADIF-Datei wird geschrieben ... QSO: You have canceled the file export. The file will be removed and no data will be exported. Sie haben der Export der Datei abgebrochen. Die Datei wird entfernt und es werden keine Daten exportiert. KLog - Error The selected log does not exist, please check it again. The file %1 can't be opened. KLog - Don't ask again Do you want to reuse your answer? KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again. <ul><li>Date/Time:</i> %1</li><li>Callsign: %2</li><li>Band: %3</li><li>Mode: %4</li></ul> KLog - QSO not found Do you want to add this QSO to the log?: We have found a QSO coming from LoTW that is not in your local log. Do you want KLog to add this QSO to the log? KLog - Invalid call detected An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported log file? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log file? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. You can, however, edit the ADIF file once the export process is finished. KLog - User cancelled Do you still want to cancel? Möchten Sie immer noch abbrechen? The selected callsign (%1) is not valid, please check it again to export the log. KLog - File not opened It was not possible to open the file %1 for reading. KLog was not able to read the LoTW file Processing LoTW ADIF file... Abort processing LoTW reading KLog - Add new QSOs? Do you want to add non existing QSOs to your local log? There are some QSOs in the LoTW log that are not in your local log. Processing LoTW ADIF file...... QSO: %1 / %2 You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated. Reading LoTW file... LoTW-Datei wird gelesen ... Abort reading Lesen abbrechen Importing LoTW ADIF file... KLog - Log selection There is more than one log in this logfile. Es gibt mehrere Protokolle in dieser Protokolldatei. All logs will be imported into the current log. Alle Protokolle werden in die aktuelle Protokolldatei importiert. Do you want to continue? Möchten Sie fortfahren? Reading ADIF file... ADIF-Datei wird gelesen ... Do you want to add dupe QSOs to your local log? There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date. Importing ADIF file... ADIF-Datei wird importiert ... KLog - Duplicated QSOs It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) Offensichtlich gibt es einige doppelte QSOs in der ADIF-Datei, die Sie importieren möchten. Möchten Sie fortfahren? (Duplikate von QSOs werden nicht importiert) Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO with %1 on %2: KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO on %1: You have canceled the file import. The file will be removed and no data will be imported. There are no QSOs pending to be exported with that station callsign. Export Exporting ADIF file... QSO: %1 / %2 Export progress Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information. If you select NO, maybe the QSO will not be imported. Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. KLog - Apply to all QSOs in this log? Please edit the ADIF file and make sure that it include at least: Bearbeiten Sie die ADIF-Datei und überprüfen Sie, ob sie mindesten Folgendes enthält: and und This QSO had: In diesem QSO-Eintrag: This QSO is not including the minimum data to consider a QSO as valid! - The band missing and the following call: - Das Band fehlt bei dem folgenden Rufzeichen: - The mode missing and the following call: - Der Modus fehlt bei dem folgenden Rufzeichen: - The date missing and the following call: - Das Datum fehlt bei dem folgenden Rufzeichen: - The time missing and the following call: - Die Zeit fehlt bei dem folgenden Rufzeichen: Do you want to continue with the current file? Möchten Sie mit der aktuellen Datei fortfahren? KLog: Not all required data found! KLog: Es wurden nicht alle benötigten Daten gefunden KLog - No Station callsign entered. KLog - QSO without Station Callsign KLog: No RST TX found! KLog: Es wurden keine RST-TX-Daten gefunden KLog: No RST RX found! KLog: Es wurden keine RST-RX-Daten gefunden HamLibNetworkConfigWidget Enter the hostname or address of the radio. Set de network port of the radio. Host/Address Port Enter the port of the radio. HamLibSerialConfigWidget Bauds Select the serial port speed. Port Select the serial port. Only the serial ports that are detected are shown. Scan Click to identify the serial ports available in your computer. 5 bits 6 bits 7 bits 8 bits Data bits Select the serial data bits. None Hardware Software XON/XOFF Flow control Select the serial flow control No parity Even Odd Space Mark Parity Select the serial parity. 1 bit 1.5 bits 2 bits Stop bits Select the serial stop bits. InfoWidget 10M 10 m 15M 15 m 20M 20 m 40M 40 m 80M 80 m 160M 160 m 2M 2 m 6M 6 m 12M 12 m 17M 17 m 30M 30 m 70CM 70 cm Continent Kontinent Prefix Präfix CQ CQ ITU ITU Short Path Kurzer Weg Long Path Langer Weg Deg Grad Miles Meilen Km km IntroPage Welcome to KLog! Willkommen bei KLog Welcome to KLog! - brought to you under the terms of the GPL! Willkommen bei KLog - veröffentlicht unter den Bedingungen der GPL Welcome to KLog Willkommen bei KLog This looks like it's the first time you've run KLog on this computer. Anscheinend führen Sie KLog zum ersten Mal auf diesem Rechner aus. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. It is designed to provide general purpose DX, and contest logging. It supports QSL management, import and export of ADIF Es unterstützt die Verwaltung von QSLs und Import sowie Export von ADIF-Dateien and Cabrillo file formats and many other features... Export in das Cabrillo-Dateiformat und viele weitere Funktionen ... Before you can start using KLog, you will be asked to: Ehe Sie KLog verwenden können, müssen Sie folgendes eingeben: Acknowledge to the terms of the license. Den Lizenzbedingungen zustimmen. Download the DX entities information. Informationen über DX-Einträge herunterladen. Enter your callsign, CQ zone, etc. and main configuration. Rufzeichen, CQ-Zone usw. eingeben und die wichtigsten Einstellungen vornehmen. Enjoy KLog and contact the development team if you have any suggestions! Viel Spaß mit KLog und kontaktieren Sie das Entwicklungsteam, wenn Sie Vorschläge zur Verbesserung haben. LicPage KLog License information Lizenz-Information für KLog Welcome to KLog!- brought to you under the terms of the GPL! Willkommen bei KLog - veröffentlicht unter den Bedingungen der GPL Acknowledge Zustimmen Be aware that KLog is free software. KLog ist freie Software. LoTWUtilities KLog - LoTW password needed Please enter your LoTW password: Are you sure that you want to use that station callsign (%1)? There is a file already existing with the name that will be used. The file %1 already exist. Do you want to overwrite? KLog was not able to save the file %1. Error returned: %2 Downloading data to file: %1. KLog - LoTW download This is the first date of a QSO with the callsign %1 in this log If you think that in LoTW you may have previous QSOs, answer No. Do you want to use this date (%1) as start date? The remote server redirected our connection to %1 Do you want to follow the redirection? It was not possible for find the file %1 that has been just downloaded. It seems that LoTW has no QSO with the Station Callsign you are using (%1). Try again and send the downloaded file (%1) to the KLog developer for analysis. KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data? KLog - LoTW File already exists Double click on the date that you want to use as the start date for downloading QSOs. KLog - LoTW Station callsign There is not a single QSO in the log with that station callsign. KLog - LoTW Can't write the file The file %1 already exists. KLog - LoTW Start date selection KLog - LoTW Download error There was an error (%1) while downloading the file from LoTW. The downloading error details are: %1 KLog - LoTW Redirection found KLog - LoTW File not found KLog can't find the downloaded file. KLog - LoTW user/password error LoTW server did not recognized your user/password Check your user and password and ensure your are using the right one before trying again. KLog - LoTW No QSOs LoTW sent no QSOs KLog - LoTW Unknown error KLog can't recognize the file that has been downloaded from LoTW. Now KLog will process the downloaded QSO and update your local log. LogWindow QSL Send QSL gesendet QSL Rcvd QSL empfangen &Delete &Löschen Delete a QSO QSO löschen &Edit QSO OSO b&earbeiten Edit this QSO Diese QSO bearbeiten Via &bureau Über &Büro Send this QSL via bureau Diesen QSL-Eintrag über das Büro senden D&irect D&irekt Send this QSL via direct Diesen QSL-Eintrag direkt senden Via bureau Über Büro QSL &received via bureau Empfangene QSL über Büro Direct Direkt QSL received via direc&t Direk&t empfangene QSL Check in QRZ.com Check this callsign in QRZ.com Check in DXHeat.com Check this callsign in DXHeat.com Delete selected QSOs Delete the selected QSOs Export to ADIF Export the selected QSOs to an ADIF file. Upload to LoTW Upload the selected QSOs to LoTW Upload to ClubLog Upload the selected QSOs to ClubLog Upload to eQSL.cc Upload the selected QSOs to eQSL.cc Send these QSLs via bureau Send these QSLs via direct QSLs received via bureau QSLs received via direc&t Select none Remove all selections Select all Select all the QSOs MainQSOEntryWidget &Add &Hinzufügen &Clear &Löschen Callsign of the QSO. Band of the QSO. Band des QSO-Eintrags. Mode of the QSO. Modus des QSO-Eintrags. Date of the QSO. Datum des QSO-Eintrags. Time of the QSO. Zeit des QSO-Eintrags. Add the QSO to the log. QSO zum Protokoll hinzufügen Clears the QSO entry. Löscht den QSO-Eintrag. Look up info about the current callsign on qrz.com KLog will show real time if enabled. Real time Stop wsjt-x and hamlib from automatically updating QSO information. Manual Mode Callsign Rufzeichen &Save &Cancel &Abbrechen DUPE Translator: DUPE is a common world for hams. Do not translate of not sure Duplikat MainWindow Starting KLog KLog wird gestartet DX Entity DX-Eintrag &Log Window &Protokollfenster KLog KLog KLog - File not open Status bar ... Log backup recommended! It seems that you are running this version of KLog for the first time. Ready Bereit An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: Es ist ein unerwarteter Fehler beim Hinzufügen der QSO-Daten zu Ihrer Protokolldatei aufgetreten. Bitte senden Sie einen Fehlerbericht an die Entwickler zur Analyse, falls das Problem weiterhin besteht. KLog - Select correct entity You have selected an entity: Sie haben folgenden Eintrag ausgewählt: that is different from the KLog proposed entity: Dieser Eintrag unterscheidet sich von dem durch KLog vorgeschlagenen Eintrag: Click on the prefix of the correct entity or Cancel to edit the QSO again. Klicken Sie auf das Präfix, um den Eintrag zu korrigieren oder drücken Sie Abbrechen, um den QSO-Eintrag erneut zu bearbeiten. Click on the prefix of the right entity or Cancel to correct. Klicken Sie auf das Präfix rechts vom Eintrag oder drücken Sie „Abbrechen“ zur Korrektur. RSTrx RSTtx KLog - Select the Station Callsign. Do you really want to exit KLog? &File &Datei Import an ADIF file into the current log. Importiert eine ADIF-Datei in das aktuelle Protokoll. Export the current log to an ADIF logfile. Exportiert das aktuelle Protokoll in eine ADIF-Protokolldatei. Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Exportiert alle QSOs in eine ADIF-Datei, dabei werden QSOs aus allen Protokollen zusammengeführt. Print your log. Druckt ein Protokoll. KLog folder KLog-Ordner Opens the data folder of KLog. Öffnen den Datenordner von KLog. E&xit &Beenden &Tools E&xtras Fill in QSO data QSO-Daten ausfüllen Go through the log reusing previous QSOs to fill missing information in other QSOs. Im Protokoll Daten früherer QSO-Einträge zum Ausfüllen fehlender Informationen in anderen QSO-Einträgen verwenden. Shows QSOs for which you should send your QSL and request the DX QSL. Anzeige von QSO-Einträgen, für die Sie Ihre QSLs versenden und die DX-QSL anfordern sollten. Find My-QSLs pending to send Ausstehende DX-QSLs zum Senden suchen Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Zeigt die QSL-Einträge mit ausstehenden Anforderungen zum Senden von QSLs. Diese Warteschlange sollten Sie bearbeiten. Mark all queued QSOs in this log as sent to LoTW. Alle eingereihten QSO-Einträge in diesem Protokoll als versendet zu LoTW markieren. Mark all queued QSOs as sent to LoTW. Alle eingereihten QSO-Einträge als versendet zu LoTW markieren. It was not possible to open the debug file for writing. No debug log will be saved! KLog - Not valid call Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. You have requested to delete the QSO with: %1 Sie haben das Löschen dieser QSO mit %1angefordert Are you sure? Sind Sie sicher? KLog needs to update the Entities database. You have requested to delete several QSOs The ClubLog upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? KLog - ClubLog KLog - Club Log There was an error while updating to Yes the ClubLog QSO upload information. The ClubLog upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The file has not been removed. It seems that there was something that prevented KLog from removing the file You can remove it manually. The eQSL upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1 Do you want to mark as Uploaded all the QSOs uploaded to eQSL? There was an error while updating to Yes the eQSL QSO upload information. The eQSL upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The QRZ.com upload process has finished with an error and the log was possibly not uploaded. Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? KLog - QRZ.com KLog - Stop the war in Ukraine! KLog - Stop the war in Ukraine! You are using a Russian call (%1). You can probably help to stop the Russian war, people are dying. Please call your leaders to stop the war. You are using an Ukranian call. Please take care and protect yourself and your family. The KLog developers wish you the best of luck in this very difficult moment. People are dying in the war of Russia against Ukraine. You can help to stop the Russian war against Ukraine. Please show your disagreement to your leaders, or in your social network to stop the war. Always check the current callsign in QRZ.com Upload queued QSOs to LoTW KLog - KLog folder not found Do you want to update now? You seem to have never backed up or exported your log to ADIF. Your latest backup seems older than one month. Regular backups prevent data loss and are good operator practice. Once exported, copy your ADIF file to a safe place such as a USB drive, cloud drive or other offsite computer. KLog will remind you to backup on a monthly basis. Backup completed successfully KLog will remind you again in approximately one month. Backup failed. Periodic data backups are recommended to prevent data loss and corruption of your log. This version of KLog requires that the DXCC database is updated. The database will be updated. The setup will now open to allow you to change your settings. KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 KLog - QRZ.com warning QRZ.com has returned a non-subcribed error and queries to QRZ.com will be disabled. Please check your QRZ.com subcription or credentials. There was an error while updating to Yes the QRZ.com QSO upload information. The QRZ.com upload process has finished successfully Call not found in QRZ.com You need to activate the %1 service in the eLog preferences. It is important to export to ADIF and save a copy as a backup. Saving the log was done successfully. The ADIF export was not properly done. &Import from ADIF ... Export to ADIF ... Export all logs to ADIF ... &Print Log ... Settings ... QSL tools ... Find QSO to QSL Find DX-QSLs pending to receive Shows DX-QSLs for which requests or QSLs have been sent with no answer. Find requested pending to receive Shows the DX-QSLs that have been requested. LoTW tools ... Mark all non-sent QSOs in this log as queued to be uploaded. Queue all QSLs to be sent Put all the non-sent QSOs in the queue to be uploaded. Mark all queued QSOs from this log as sent Mark all queued QSOs as sent Check the current callsign in QRZ.com For updated DX-Entity data, update cty.csv. Zur Aktualisierung der DX-Einträge laden Sie bitte die Datei „cty.csv“ erneut herunter. Stats Statistik Show the statistics of your radio activity. Zeigt eine Statistik Ihrer Funkaktivitäten. Show Map &Help &Hilfe &Debug ... Do you really want to mark ALL the QSOs of this log to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. Do you really want to mark ALL pending QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded. Error #2: Upload was rejected by LoTW, please check your data. Error #3: The TQSL server returned an unexpected response. Error #4: There was a TQSL error. Error #5: There was a TQSLLib error. Error #6: It was not possible to open the input file. Error #7: It was not possible to open the ouput file. Error #8: No QSOs were processed since some QSOs were duplicates or out of date range. Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range. Error #10: Command syntax error. KLog sent a bad syntax command. Error #11: LoTW Connection error (no network or LoTW is unreachable). Error #00: Unexpected error. Please contact the development team. The log that you have selected contains more than just one station callsign. Das ausgewählte Protokoll enthält mehrere Stations-Rufzeichen. Please select the station callsign you want to mark as sent to LoTW: Bitte wählen Sie das Stations-Rufzeichen, dass Sie als versendet zu LoTW markieren möchten: Station Callsign: Stations-Rufzeichen: Define Station Callsign Stations-Rufzeichen eingeben Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Geben Sie das Stations-Rufzeichen für dieses Protokoll ein oder lassen das Rufzeichen weg für QSOs ohne Stations-Rufzeichen: You have selected no callsign. KLog will complete the QSOs without a station callsign defined and those with the callsign you are entering here. KLog - No station selected No station callsign has been selected and therefore no log will be marked Es wurde kein Stations-Rufzeichen ausgewählt, daher wird kein Protokoll markiert Congratulations! Glückwunsch You already have the latest version. Sie haben bereits die neueste Version. TQSL finished with no error. Do you want to mark as Sent all the QSOs uploaded to LoTW? There was an error while updating to Yes the LoTW QSL sent information. You can find the KLog data folder here: Hier finden Sie den KLog-Datenordner: start Starten stop Anhalten If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. Enthält die Datenbank tatsächlich QSOs, sie werden aber nicht gefunden, nehmen Sie mit den KLog.Entwicklern Kontakt auf, siehe Über KLog. Select the Station Callsign to use when quering LoTW: Please check the LoTW setup You have not defined a LoTW user or a proper Station Callsign. Open the LoTW tab in the Setup and configure your LoTW connection. KLog - Exit Check always the current callsign in QRZ.com It was not possible to define the KLog folder. Some functions may not work properly! KLog - CTY.dat update You can update the entities database in Tools->Update cty.csv KLog - Backup KLog - New version detected! The callsign %1 is not a valid call. Do you really want to add this callsign to the log? KLog - ClubLog error KLog - eQSL error KLog - %1 KLog - ADIF export Queue all QSOs from this log to be sent Download from LoTW ... Download the full log from LoTW ... ClubLog tools ... Upload the queued QSOs to ClubLog ... eQSL tools ... Upload the queued QSOs to eQSL.cc ... QRZ.com tools ... Upload the queued QSOs to QRZ.com ... Update cty.csv Update Satellite Data Online manual (F1) ... &Tips ... &About ... About Qt ... Check updates ... All pending QSOs of this log has been marked as queued for LoTW! Now you can upload them to LoTW. There was a problem to mark all pending QSOs of this log as queued for LoTW! Your log has not been updated. No QSO was updated with the data coming from LoTW. This may be because of errors in the logfile or simply because your log was already updated. All pending QSOs has been marked as queued for LoTW! All queued QSOs has been marked as sent to LoTW! There was a problem to mark all queued QSOs of this log as sent to LoTW! About ... KLog - Update checking result It seems that there are no QSOs in the database. You need to select one station callsign to be able to send your log to ClubLog. Do you want to add this QSOs to your ClubLog existing log? If you don't agree, this upload will overwrite your current ClubLog existing log. KLog - eQSL This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. KLog - QRZ.com error KLog has received an error from QRZ.com. Queue all the QSOs to be uploaded Queue all the QSO to be uploaded The log is ready to be uploaded to ClubLog. All the QSOs in this log has been marked as Modified in the ClubLog status field KLog could not mark the full log to be sent to ClubLog Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers. The log is ready to be uploaded to eQSL.cc. All the QSOs in this log has been marked as Modified in the eQSL.cc status field KLog could not mark the full log to be sent to eQSL The log is ready to be uploaded to QRZ.com. All the QSOs in this log has been marked as Modified in the QRZ.com status field KLog could not mark the full log to be sent to QRZ.com You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. Filling QSOs ... Date/Time Datum/Zeit Callsign Rufzeichen Printing the log ... KLog - QSO received Station Callsign Stations-Rufzeichen Operator Callsign KLog - WSJTX Dupe QSO This QSO seems to be duplicated. Do you want to save or discard it? QSO logged from WSJT-X: Protokollierte QSO von WSJT-X: The logfile has been modified. Die Protokolldatei wurde verändert. Do you want to save your changes? Möchten Sie Ihre Änderungen speichern? Your log has been updated with the LoTW downloaded QSOs. KLog has updated %1 QSOs from LoTW. UDP Server error The UDP server failed to %1. start or stop UDP-Serverfehler Der UDP-Server kann %1 nicht ausführen. Status of the DX entity. Status des DX-Eintrags. Name of the DX entity. Name des DX-Eintrags. QSO QSO QSL QSL eQSL eQSL Comment Kommentar Others Sonstige My Data Meine Daten Satellite Satellit DXCC DXCC Info Information Awards Diplome Search Suchen Log Protokoll DX-Cluster DX-Cluster No QSOs have been exported to ADIF. KLog has exported %1 QSOs to the ADIF file: %2 Save ADIF File ADIF-Datei speichern You need to select one station callsign to be able to send your log to LoTW. The LoTW upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The file has been removed. KLog - LoTW There was a problem to mark all pending QSOs as queued for LoTW! All queued QSOs of this log has been marked as sent to LoTW! There was a problem to mark all queued QSOs as sent to LoTW! The selection you have done does not include any QSO The selection you have done does not include any QSO. Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1 ClubLog Club Log KLog - QRZ.COM QRZ.COM To upload QSOs you need a qrz.com subscription. If you have one, go to Setup->QRZ.com tab to enable it. Open File Datei öffnen - Needed for DXMarathon - Erforderlich für den DX-Marathon Abort filling Ausfüllen abbrechen Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: Number Anzahl Band Band Mode Modus Print Log Protokoll drucken Abort printing Drucken abbrechen Printing the log... QSO: Das Protokoll wird gedruckt ... QSO: The following QSO data has been received from WSJT-X to be logged: Die folgenden QSO-Daten wurden von WSJT-X zum protokollieren empfangen: Freq Frequenz Time On Time Off RST TX RST RX DX-Grid Local-Grid Duplicated QSOs have to match another existing QSO with the same call, band, mode, date and time, taking into account the period that can be defined in the settings. KLog - Non-supported mode A new mode not supported by KLog has been received from an external program or radio: Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) KLog - QSO Dupe A dupe QSO has been detected in the file and will not be added to the log. Please check the QSO information file and ensure it is properly added. Native Error Recommendation: Periodically export your data to ADIF to prevent a potential data loss. If the received mode is correct, please contact KLog development team and request support for that mode Wenn der Empfangsmodus korrekt ist, nehmen Sie bitte Kontakt mit den KLog-Entwicklern auf und bitten Sie um Unterstützung für diesen Modus. KLog - Duplicated satellite A duplicated satellite has been detected in the file and will not be imported. In der Datei wurde ein doppelter Satellit gefunden, er wird nicht importiert. Please check the satellite information file and ensure it is properly populated. Bitte überprüfen Sie die Datei mit den Informationen über Satelliten. Now you will see a more detailed error that can be used for debugging... Jetzt wird eine ausführlichere Fehlermeldung angezeigt, die für die Fehlersuche verwendet werden kann .. An unexpected error ocurred!! Es ist ein unerwarteter Fehler aufgetreten. If the problem persists, please contact the developers Bitte senden Sie einen Fehlerbericht, falls das Problem weiterhin besteht for analysis: für die Analyse: Error in function Fehler in Funktion Error text Fehlertext Failed query Abfrage fehlgeschlagen KLog - Show errors Do you want to keep showing errors? Möchten Sie Fehler weiter anzeigen? MainWindowInputComment Comment Kommentar Add a comment for this QSO. Fügen Sie einen Kommentar für diesen QSO-Eintrag hinzu Keep this data Diese Daten behalten Data entered in this tab will be copied into the next QSO. Die auf dieser Karteikarte eingegebenen Daten werden in den nächsten QSO-Eintrag kopiert. MainWindowInputEQSL Date of the ClubLog upload. Datum des Hochladens zu Club Log. Date of the QRZ.com upload. Date of the eQSL sending. eQSL-Sendedatum Date of the eQSL reception. eQSL-Empfangsdatum Date of the LoTW sending. LoTW-Sendedatum Date of the LoTW reception. LoTW-Empfangsdatum Status on ClubLog. Status auf Club Log. Status on QRZ.com. Status of the eQSL sending. Status des eQSL-Versands. Status of the eQSL reception. Status des eQSL-Empfangs. Status of the LoTW sending. Status des LoTW-Versands. Status of the LoTW reception. Status des LoTW-Empfangs. ClubLog Club Log QRZ.com eQSL Sent eQSL gesendet eQSL Rec eQSL empfangen LoTW Sent LoTW versendet LoTW Rec LoTW empfangen MainWindowInputOthers Primary Div Secondary Div IOTA IOTA Entity Eintrag Propagation mode Others Sonstige Keep propagation mode Select the primary division for this QSO. Select the secondary division for this QSO. Select the entity for this QSO. Wählen Sie den Eintrag für diese QSO. Select the propagation mode for this QSO. Select the IOTA continent for this QSO. Wählen Sie den IOTA-Kontinent für diese QSO. Select the IOTA reference number for this QSO. Wählen Sie den IOTA-Referenznummer für diese QSO. Keeps the same propagation mode for next QSO. Select the appropriate ADIF field for this QSO. Value for the selected ADIF field. Not Identified Nicht identifiziert Not - Not Identified Nicht - Nicht identifiziert SOTA Ref Age VUCC grids Distance MainWindowInputQSL QSL Sent QSL gesendet QSL Rec QSL empfangen QSL Via QSL über QSL Msg QSL-Nachricht Status of the QSL sending. Status des QSL-Versands. Status of the QSL reception. Status des QSL-Empfangs. QSL sending information. QSL-Sendeinformation QSL reception information. QSL-Empfangsinformation Date of the QSL sending. QSL-Sendedatum Date of the QSL reception. QSL-Empfangsdatum Message of the QSL. QSL-Nachricht QSL via information. QSL-Information über den Versand. MainWindowInputQSO TX RST. RX RST. TX Frequency in MHz. TX-Frequenz in MHz. RX Frequency in MHz. RX-Frequenz in MHz. Power used by the contacted station. Name of the contacted operator. QTH of the contacted station. Locator of the contacted station. Watts Watt MHz MHz Split Translator: Split is a common hamradio term. Do not translate unless you are sure. Name Name QTH QTH DX Locator DX-Locator Power(rx) Leistung (RX) RST TX RX Frequency Freq TX TX-Frequenz Freq RX RX-Frequenz DX QTH locator. DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. TX Frequency in MHz. Frequency is not in a hamradio band! RX Frequency in MHz. Frequency is not in a hamradio band! MainWindowMyDataTab Watts Watt Keep this data Diese Daten behalten My QTH locator. Mein QTH-Locator Power Leistung Operator callsign Station Callsign Stations-Rufzeichen My Locator Mein Locator My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. My Rig My Antenna My SOTA_Ref My VUCC_GRIDS MainWindowSatTab Keep this data Diese Daten behalten Other - Sat not in the list Sonstige - Satellit nicht in der Liste Data entered in this tab will be copied into the next QSO. Die auf dieser Karteikarte eingegebenen Daten werden in den nächsten QSO-Eintrag kopiert. Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Name des Satelliten, der nicht in der Liste vorhanden ist. Wählen Sie „%1“, um dieses Feld zu aktivieren. Verwenden Sie ein Format wie AO-51. Satellite mode used. Der Satellitenmodus wird verwendet. Select the satellite you are using. Wählen Sie einen Satelliten aus. UpLink band. DownLink band. UpLink DownLink Satellite Satellit Mode Modus DX Locator DX-Locator Other Sonstige MHz MHz Not Sat QSO Kein Satellit zum QSO-Eintrag KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. KLog hat einen unbekannten Satellitennamen gefunden. Wenn stattdessen ein bekannter Satellitenname verwendet werden soll, wählen Sie ihn aus der Liste. Nehmen Sie alternativ Kontakt mit den Entwicklern auf, damit der neue Satellitenname in KLog aufgenommen werden kann. The satellite you have in your QSO is: Der Satellit in Ihren QSO-Daten: Please be aware that the satellite name will not be saved if it is not in the list, so that information may be lost! RX Frequency in MHz. RX-Frequenz in MHz. TX Frequency in MHz. TX-Frequenz in MHz. MapWindowWidget Select QSOs in this band. Select QSOs in this mode. Select QSOs in this propagation mode. Select QSOs using this Satellite. Only confirmed Select only confirmed QSOs. All bands Show nothing All modes All propagation modes All satellites OnlineMessageWidget The server returned the following error: %1 Not identified Nicht identifiziert QObject New One, work it! Neu, wird bearbeitet. Needed, work it! Benötigt, wird bearbeitet. Worked but not confirmed Bearbeitet aber nicht bestätigt Confirmed Bestätigt Not identified Nicht identifiziert Database Error Datenbankfehler KLog DB needs to be upgraded. Die KLog-Datenbank muss aktualisiert werden. Do you want to upgrade it now? Möchten Sie sie jetzt aktualisieren? If DB is not upgraded KLog may not work properly. Wenn die Datenbank nicht aktualisiert wird, kann KLog nicht richtig funktionieren. Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea. Do you want to backup your DB now? The backup finished successfully. You can find the backup in this file: %1 The backup was not properly done. You will be sent back to the starting point. KLog - DB can't be updated automatically You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version. KLog - DB update KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. Es wurden vorherige Protokolle in der Datenbank gefunden. Alle Daten werden in den neu erstellten DX-Protokolltyp migriert. KLog: Enter Station callsign KLog: Stations-Rufzeichen eingeben Enter the station callsign used in this log Geben Sie das Stations-Rufzeichen ein, das in diesem Protokoll verwendet wird Station Callsign Stations-Rufzeichen Updating DXCC award information... Updating DXCC Award information... Updating WAZ award information... Updating WAZ Award information... The process to upgrade is: - Using an old KLog version export your log to ADIF. - Remove your logbook.dat file from your KLog folder. - Install the new KLog version. - Import your ADIF file. KLog will finish when you click on OK. All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay. Updating mode information... Modusinformation wird aktualisiert ... Abort updating Aktualisierung abbrechen QSO: QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? Das Abbrechen dieser Aktualisierung führt zu inkonsistenten Daten und möglicherweise zu Datenverlust. Möchten Sie immer noch abbrechen? Updating bands information... Bandinformation wird aktualisiert ... Updating bands information in %1 status... Band-Information im Status %1 wird aktualisiert ... Progress: Fortschritt: Updating mode information in %1 status... Modus-Information im Status %1 wird aktualisiert ... Updating information... Updating DXCC and Continent information... DXCC- und Kontinent-Informationen werden aktualisiert ... KLog is already running. It is allowed to run only one instance. Install wizard was canceled before completing... Der Installationsassistent wurde abgebrochen, bevor die Installation abgeschlossen wurde ... Do you want to remove the KLog dir from your disk? Möchten Sie den KLog-Ordner von Ihrer Festplatte löschen? Your KLog dir has been removed Ihr KLog-Ordner wurde gelöscht Thank you for running KLog! Vielen Dank für die Nutzung von KLog. I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. Ihr KLog-Ordner kann nicht entfernt werden. Sie müssen diesen Ordner manuell löschen. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. Ihr KLog-Ordner kann nicht entfernt werden. Sie müssen diesen Ordner manuell löschen. Remember that your KLog dir is on your system... Ihr KLog-Ordner ist immer noch auf Ihren System vorhanden ... A wrong callsign has been found: %1. Please enter a new callsign or confirm that the current one is a good callsign. An empty callsign has been detected. If it is possible, please enter the right call. KLog - Not valid callsign found Date Datum Call Ruf RSTtx RSTrx Band Band Comment Kommentar Mode Modus CQz ITUz DXCC DXCC Address Age County A_Index Ant_Az Ant_El Ant_Path ARRL_SECT Award_Submitted Award_granted Band_RX CheckContest Class ClubLog SDate ClubLog status Continent Kontinent Contest Id Country Credit Submitted Credit granted Dark Dok Do not translate if unsure, common hamradio term. Fists Do not translate if unsure, common hamradio term. Fists CC Do not translate if unsure, common hamradio term. My Fists Do not translate if unsure, common hamradio term. Nr bursts Do not translate if unsure, common hamradio term. Nr pings Do not translate if unsure, common hamradio term. Sat mode SWL Do not translate if unsure, common hamradio term. Ten-Ten Do not translate, it is a hamradio group name. Distance Contacted_Op Email EQ_Call eQSL RDate eQSL SDate eQSL Rcvd eQSL Sent eQSL gesendet Force Init Freq Frequenz Freq RX RX-Frequenz Gridsquare HRDLog SDate HRDLog status IOTA IOTA IOTA Island id K Index Lat Lon LoTW RDate LoTW SDate LoTW Rcvd LoTW Sent LoTW versendet Max Bursts MS Shower My Antenna My City My Cnty My Country My CQz My DXCC My Gridsquare My IOTA My IOTA island id My ITUz My Lat My Lon My Name My Postal code My Rig My Sig My Sig Info My SOTA ref My State My Street My USACA counties My VUCC grids Name Name Notes Operator Owner Callsign Pfx Precedence Prop Mode Public Key QRZcom SDate QRZcom status QSL msg QSL RDate QSL SDate QSL Rcvd QSL empfangen QSL Sent QSL gesendet QSL rcvd via QSL sent via QSL via QSO complete QSO random QTH QTH Region Rig RX Pwr Sat name Satellitenname SFI Sig Sig Info Silent key Do not translate if unsure, common hamradio term. SKCC SOTA Ref SRX String SRX STX String State Submode UKSMG USACA counties VE prov VUCC grids TX Pwr Web QSO Date off Log number SearchWidget &Clear &Löschen &Export Highlighted Hervorgehobene &Exportieren &Select All &Alles auswählen &Search &Suchen Clear the searches. Suchen löschen Export the search result to an ADIF file. Exportiert alle Suchergebnisse in eine ADIF-Datei. Select/Unselect all the QSOs shown. Alle angezeigten QSO-Daten aus- oder abwählen.- Search in the log. Suchen im Protokoll. Search in all logs. Suchen in allen Protokollen. All logs Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs! Select the Station Callsign used to do this QSO. All in log Not defined &Clear selection &Auswahl aufheben Save File Datei speichern You have requested to delete the QSO with: %1 Sie haben das Löschen dieser QSO mit %1angefordert Are you sure? Sind Sie sicher? SearchWindow Date/Time Datum/Zeit Band Band Mode Modus QSL Sent QSL gesendet QSL Rcvd QSL empfangen Station Callsign Stations-Rufzeichen ID Kennung Call Ruf Date/time Station callsign QSL Send QSL gesendet &Delete &Löschen Delete a QSO QSO löschen &Edit QSO OSO b&earbeiten Edit this QSO Diese QSO bearbeiten Via &bureau Über &Büro Send this QSL via bureau Diesen QSL-Eintrag über das Büro senden D&irect D&irekt Send this QSL via direct Diesen QSL-Eintrag direkt senden Via bureau Über Büro QSL &received via bureau Empfangene QSL über Büro Direct Direkt QSL received via direc&t Direk&t empfangene QSL Check in QRZ.com Check this callsign in QRZ.com Check in DXHeat.com Check this callsign in DXHeat.com &Request my QSL Meine QSL anfo&rdern Mark my QSL as requested Meine QSL als angefordert markieren Via Direct and mark DX QSL as requested Send this QSL via direct and mark DX QSL as requested Via Bureau and mark DX QSL as requested Send this QSL via bureau and mark DX QSL as requested &Request the QSL QSL anfo&rdern Mark the QSL as requested QSL als angefordert markieren Via bureau and mark my QSL as requested QSL received via bureau and mark my QSL as requested Direc&t and mark as my QSL requested QSL received via direct and mark my QSL as requested Needed QSO to send the QSL Um die QSL zu senden, sind die QSO-Daten nötig. My QSL requested to be sent Meine QSL, die gesendet werden sollen DX QSL pending to be received Zum Empfang ausstehende DX-QSL SetupDialog Bands/Modes Bänder/Modi DX-Cluster DX-Cluster Colors Farben Log widget Misc Verschiedenes World Editor World-Editor Logs Protokolle Satellites Satelliten HamLib Cancel Abbrechen OK OK You need to enter at least a valid callsign. Go to the User tab and enter valid callsign. User data Benutzerdaten D&X-Cluster D&X-Cluster WSJT-X WSJT-X Settings You need to enter at least one log in the Logs tab. Sie müssen mindestens ein Protokoll auf der Karteikarte Protokolle eingeben. Do you want to add one log in the Logs tab or exit KLog? (Click Yes to add a log or No to exit KLog) World Welt Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Wählen Sie auf der Karteikarte Verschiedenes „Datenbank verschieben„ oder die Datenbank wird nicht an den neuen Ort verschoben. eLog DB has not been moved to new path. You have not selected the kind of log you want. Sie haben die Art des Protokolls nicht ausgewählt. You will be redirected to the Log tab. Please add and select the kind of log you want to use. Sie werden zur Karteikarte Protokolle weitergeleitet. Geben Sie die Art des Protokolls an oder wählen Sie ein Protokoll aus. SetupEntityDialog Entity Eintrag CQ CQ ITU ITU Latitude Breitengrad Longitude Längengrad UTC UTC Main prefix Haupt-Präfix ARRL ID ARRL-Kennung Prefixes Präfixe Comma separated possible prefixes, e.g. EA1, EA2, ... Durch Komma getrennte mögliche Präfixe wie zum Beispiel EA1, EA2, ... Ok OK Name of the Entity. Name des Eintrags. CQ zone. CQ-Zone ITU zone. ITU-Zone Longitude of the Entity. Längengrad des Eintrags. Local time difference to UTC. Lokale Zeitdifferenz zu UTC. Main prefix of the entity. Haupt-Präfix des Eintrags. ARRL ID. ARRL-Kennung. Date of the deletion. Datum der Löschung. Deleted Gelöscht Cancel Abbrechen Entity Dialog Eintragsdialog SetupPageBandMode Bands Bänder Modes Modi SetupPageColors New One Neu Needed in this band In diesem Band erforderlich Worked in this band In diesem Band bearbeitet Confirmed in this band In diesem Band bestätigt Default Standard WSJT-X palette Default palette Dark Mode Color when the DXCC is an ATNO (All Time New One). DXCC is confirmed in this band. Default color. Sets a palette of colors similar to the one used in WSJT-X. Sets the default palette. Light Mode This DXCC was worked before in another band but not in the selected band. It may be needed due to the CQ, ITU, Grid, ... Worked DXCC, but not confirmed in this band. Sets the Dark Mode Choose a color Wählen Sie eine Farbe SetupPageDxCluster Add Hinzufügen Delete Löschen Show &HF spots &HF-Spots anzeigen Show V/&UHF spots V/&UHF-Spots anzeigen Show W&ARC spots W&ARC-Spots anzeigen Show &worked spots &Bearbeitete Spots anzeigen Show &confirmed spots Bestätigte &Spots anzeigen Show ANN/&FULL messages Show WW&V messages WW&V-Meldungen anzeigen Show WC&Y messages WC&Y-Meldungen anzeigen Save DX Cluster activity Saves all the DX-Cluster activity to a file in the KLog folder Send DX Spots to the map Sends the received DX Spots to the map to know where is the activity. DX Spots DX-Spots Others Sonstige Messages Meldungen KLog: Add a DXCluster server KLog: DX-Clusterserver hinzufügen Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Geben Sie URL und Port an Beispiel: dxfun.com:8000 Ist kein Port angegeben, wird der Vorgabewert 41112 benutzt: SetupPageELog ClubLog password ClubLog App password ClubLog email Enter the email you used to register in ClubLog. Geben Sie Ihr Passwort ein, das Sie für die Registrierung bei Club Log verwendet haben. Enter your password ClubLog here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!! Send QSOs in real time Activate ClubLog Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Sendet jeden QSO-Eintrag direkt zu Club Log, wenn sie in KLog hinzugefügt oder geändert werden. Starts the ClubLog support in KLog. Startet die Unterstützung für Club Log in KLog. Activate eQSL.cc Enter your username of eQSL.cc. Enter your password eQSL.cc here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) eQSL.cc password eQSL.cc user ClubLog Club Log eQSL.cc QRZ.com Enter the user of your QRZ.com account. You need to be subscribed to QRZ.com to use this service. User Enter your password QRZ.com here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Password Activate QRZ.com Check automatically Check in Qrz.com all Calls as they are entered Paying Subscriber Check it if you are paying for a qrz.com subscription LogBook Key LogBook Key for QSO uploading. You can get this key in your QRZ.com logbook webpage. Remember that you need a QRZ.com subscription to use this feature. LoTW Upload Download TQSL path Use TQSL LoTW password LoTW user Enter your LoTW user. Enter your password LoTW here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Path to the TQSL software. Enable the LoTW integration with TQSL. You will need to have TQSL installed Select File SetupPageHamLib Activate HamLib Activates the hamlib support that will enable the connection to a radio. Read-Only mode If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio. Radio Select your rig. Serial Network Defines the interval to poll the radio in msecs. Poll interval Test: OK Test: NOK Test Click to test the connection to the radio SetupPageLogView Fields SetupPageLogs &New &Neu &Edit &Bearbeiten &Remove &Entfernen Add a new log. Fügt ein neues Protokoll hinzu. Edit the selected log. Bearbeitet das ausgewählte Protokoll. Remove the selected log. Entfernt das ausgewählte Protokoll. KLog KLog Do you really want to remove this log? Möchten Sie dieses Protokoll wirklich entfernen? All the QSOs from this log will also be deleted... QSOs QSOs The new log could not be created. Log has not been removed. (#3) Das Protokoll wurde nicht entfernt. (#3) Log has not been removed. (#2) Das Protokoll wurde nicht entfernt. (#2) Log has not been removed. (#1) Das Protokoll wurde nicht entfernt. (#1) ID Kennung Date Datum Station Callsign Stations-Rufzeichen Operators Operatoren Comments Kommentare An error has occurred showing the following error code: Es ist ein Fehler mit folgendem Fehlercode aufgetreten: KLog - SetupPageLogs KLog - Einrichtung der Protokolle SetupPageLogsNew &Date &Datum &Station Callsign &Stations-Rufzeichen &Operators &Operatoren Comm&ent Komm&entar &Ok &OK &Cancel &Abbrechen Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. Callsign used for this log. Rufzeichen für dieses Protokoll. Comma separated list of operators: callsign1, callsign2. Durch Komma getrennte Liste von Operatoren: rufzeichen1, rufzeichen2. Start date of this log. Anfangsdatum dieses Protokolls. SetupPageMisc &Imperial system &Imperiales System &Log in real time Sofort protoko&llieren &Time in UTC &Zeit in UTC &Save ADIF on exit ADIF-Datei beim Beenden &speichern Use this &default filename &Standard-Dateinamen verwenden Mark &QSO to send QSL when QSL is received &QSO zum Senden der QSL markieren, wenn die QSL empfangen wird Complete QSO with previous data QSO mit vorherigen Daten vervollständigen Show the Station &Callsign used in the search box Stations-Rufzeichen für das Suchfeld anzeigen &Check for new versions automatically Automatisch nach neuen Versionen su&chen &Provide Info for statistics &Statistik-Informationen bereitstellen Manage DX-Marathon Mark sent eQSL && LoTW in new QSO as queued Browse Durchsuchen Move DB Datenbank verschieben QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. Die QSO-Einträge werden markiert, um eine QSL zu senden, wenn Sie eine DX-QSL empfangen und Ihre Daten nicht gesendet haben. The search box will also show the callsign on the air to do the QSO. Select the application debug log level. This may be useful if something is not working as expected. A debug file will be created in the KLog directory and/or shown with Help->Debug menu. Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default. Check if there is a new release of KLog available every time you start KLog. Überprüft beim Programmstart, ob eine neue Version von KLog veröffentlicht wurde. Check non-valid calls Show seconds &Delete always temp ADIF file after uploading QSOs In seconds, enter the time range to consider a duplicate if same call, band and mode is entered. Show seconds in the QSO editor If you disable this checkbox KLog will not check callsigns to identify wrong callsigns. Check it for Imperial system (Miles instead of Kilometers). Aktivieren Sie diese Einstellung, um das imperiale Maßsystem (Meilen statt Kilometer) zu verwenden. Select to use real time. Aktivieren Sie diese Einstellung, um die lokale Zeit zu benutzen. Select to use UTC time. Aktivieren Sie diese Einstellung, um die UTC-Zeit zu benutzen. Select if you want to save to ADIF on exit. Wählen Sie dies aus, wenn Sie die ADIF-Datei beim Beenden speichern möchten. Select to use the following name for the logfile without being asked for it again. Ist dies aktiviert, wird der Standard-Dateiname ohne weitere Nachfrage für die Protokolldatei verwendet. Complete the current QSO with previous QSO data. Der aktuelle QSO-Eintrag wird mit vorherigen QSO-Daten vervollständigt Select if you want to manage DX-Marathon. This is the default file where ADIF data will be saved. Dies ist die Standarddatei, in der ADIF-Daten gespeichert werden. This is the directory where the database (logbook.dat) will be saved. Dies ist der Ordner, in dem die Datenbank „logbook.dat“ gespeichert wird. Click to change the default ADIF file. Klicken Sie, um die Standard-ADIF-Datei zu ändern. Click to change the path of the database. Klicken Sie, um den Pfad zur Datenbank zu ändern. Click to move the DB to the new directory. Klicken Sie, um die Datenbank in den neuen Ordner zu verschieben. Delete Always the adif file created after uploading QSOs Log level Dupe time range: Open File Datei öffnen Select Directory Ordner auswählen This is the directory where DB (logbook.dat) will be saved. Dies ist der Ordner, in dem die Datenbank „logbook.dat“ gespeichert wird. Please specify an existing directory where the database (logbook.dat) will be saved. Geben Sie bitte einen existierenden Ordner an, in dem die Datenbank „logbook.dat“ gespeichert wird. KLog - Move DB File moved Datei verschoben File copied Datei kopiert File already exist. The destination file already exist and KLog will not replace it. Please remove the file from the destination folder before moving the file with KLog to make sure KLog can copy the file. File NOT copied Datei nicht kopiert The file was not copied due to an unknown problem. The target directory does not exist. Please select an existing directory. Der Zielordner existiert nicht, bitte wählen Sie einen existierenden Ordner. SetupPageSats &New &Neu &Edit &Bearbeiten &Remove &Entfernen &Import &Importieren E&xport E&xportieren Add a new satellite. Fügt einen neuen Satelliten hinzu. Edit the selected satellite. Bearbeitet den ausgewählten Satelliten. Remove the selected satellite. Entfernt den ausgewählten Satelliten. Export your current satellites to a file. Exportiert die aktuellen Satellitendaten in eine Datei. Select the sat you want to open. Wählen Sie die Satellitendaten, den Sie öffnen möchten. KLog KLog Do you really want to remove this satellite? Möchten Sie diese Satellitendaten wirklich entfernen? Import a satellites file. It will replace the satellites you have in the current list. This satellite will no be longer available to be selected ... Sat has not been removed. (#3) Die Satellitendaten wurde nicht entfernt. (#3) Sat has not been removed. (#2) Die Satellitendaten wurde nicht entfernt. (#2) Sat has not been removed. (#1) Die Satellitendaten wurde nicht entfernt. (#1) ID Kennung Short Kurz Name Name Uplink Downlink Modes Modi An error has occurred showing the following error code: Es ist ein Fehler mit folgendem Fehlercode aufgetreten: KLog - SetupPageSats KLog - Einrichtungsseite Satelliten Open Satellites File Satellitendatei öffnen KLog warning KLog-Warnung An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Please check the format or contact the developer for analysis with the error code: Save Satellites File Satellitendatei speichern SetupPageSatsNew Short name Kurzname Sat name Satellitenname UpLink DownLink Modes Modi &Ok &OK &Cancel &Abbrechen Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Enter the name of the satellite. Geben Sie den Namen des Satelliten ein. Enter the uplink frequencies in this format: 144.300 Enter the downlink frequencies in this format: 144.300 Enter the modes in this format: USB Geben Sie die Modi in diesem Format ein: USB Some of the data you have entered is not correct; the satellite can't be added. SetupPageSubdivisionNew &Date &Datum &Station Callsign &Stations-Rufzeichen &Operators &Operatoren Comm&ent Komm&entar &Ok &OK &Cancel &Abbrechen Callsign used for this log. Rufzeichen für dieses Protokoll. Comma separated list of operators: callsign1, callsign2. Durch Komma getrennte Liste von Operatoren: rufzeichen1, rufzeichen2. Start date of this log. Anfangsdatum dieses Protokolls. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. SetupPageSubdivisions &Remove &Entfernen Import new Import an AWA file with the subdivision details. Remove the selected references. Select the references you want to open. KLog KLog Do you really want to remove the data of this entity? All the subdivision information for this entity will be deleted... Log has not been removed. (#3) Das Protokoll wurde nicht entfernt. (#3) Log has not been removed. (#2) Das Protokoll wurde nicht entfernt. (#2) Log has not been removed. (#1) Das Protokoll wurde nicht entfernt. (#1) ID Kennung Name Name Short Name CQ Zone CQ-Zone ITU Zone ITU-Zone Deleted Gelöscht Start Date End Date DXCC DXCC An error has occurred showing the following error code: Es ist ein Fehler mit folgendem Fehlercode aufgetreten: KLog - SetupPageSubdivisions SetupPageUDP Start UDP Server UDP-Server starten Automatically log QSOs from WSJT-X Allow WSJT-X to send logged QSOs to KLog QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. Update status information from WSJT-X KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...) UDP port number where the UDP Server will listen for packets. UDP-Portnummer, auf der der UDP-Server auf Pakete lauscht. Make sure it is the same port that the other programs are sending the data to. Default port is 2237. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. Der UDP-Server empfängt QSOs, die von anderen Programmen wie WSJT-X, die in KLog automatisch protokolliert werden können. UDP Port UDP-Port Select the interface to listen for UDP datagrams coming from WSJT-X. Network interface QSOs notification timeout (milisecs) Miliseconds that the notification of QSOs received from WSJTX will be shown. SetupPageUserDataPage &Personal data &Persönliche Daten Station &data Stations&daten Enter your name. Geben Sie ihren Namen ein. Enter your address - 1st line. Geben Sie ihre Adresse ein - 1. Zeile. Enter your address - 2nd line. Geben Sie ihre Adresse ein - 2. Zeile. Enter your address - 3rd line. Geben Sie ihre Adresse ein - 3. Zeile. Enter your address - 4th line. Geben Sie ihre Adresse ein - 4. Zeile. Enter your city. Geben Sie ihre Stadt ein. Enter your zip code. Geben Sie ihre Postleitzahl ein. Enter your province or state. Geben Sie das Bundesland oder den Staat ein. Enter your country. Geben Sie ihr Land ein. &Name &Name &Address &Adresse Cit&y &Stadt &Zip Code &Postleitzahl Pro&v/State &Bundesland/Staat Countr&y &Land Enter your information for rig Geben Sie Ihre Informationen über die Anlage (Rig) ein Enter your information for antenna Geben Sie Ihre Informationen über die Antenne ein Enter your power information. Geben Informationen über die Leistung ein. Enter the station callsign that will be used for logging. Geben Sie das Stations-Rufzeichen ein, das in den Protokollen verwendet wird. &Rig 1 &Rig 1 R&ig 2 R&ig 2 Ri&g 3 Ri&g 3 Antenna &1 Antenne &1 Antenna &2 Antenne &2 Antenna &3 Antenne &3 Po&wer &Leistung Enter the operators (comma separated if more than one). Geben Sie die Operatoren ein und verwenden Sie das Komma als Trennzeichen bei mehreren Operatoren. Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Geben Sie den Locator für Ihre Station ein. Alternativ kann in KLog ein geschätzter Locator auf der Basis Ihres Rufzeichens verwendet werden. &Callsign &Operators &Operatoren &CQ Zone &CQ-Zone &ITU Zone &ITU-Zone &Locator &Locator &Locator (not valid) &Locator (ungültig) SetupPageWorldEditor Add Hinzufügen Delete Löschen Edit Bearbeiten Export World Import World Still not implemented. Noch nicht implementiert. Import a new cty.csv file Eine neue datei cty.csv importieren An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. Eine Datei „cty.csv“ mit Einträgen wurde in Ihrem KLog-Ordner gefunden. No entities information file (cty.csv) has been detected in your KLog folder. Es wurde keine Datei „cty.csv“ mit Einträgen in Ihrem KLog-Ordner gefunden. KLog will not be able to show entities information. KLog kann keine Informationen über Einträge anzeigen. Prefix Präfix Entity Eintrag ARRL ID ARRL-Kennung Continent Kontinent CQ Zone CQ-Zone ITU Zone ITU-Zone UTC UTC Latitude Breitengrad Longitude Längengrad Deleted Gelöscht Since Date Seit Datum To Date Bis Datum Open File Datei öffnen BigCTY (*.csv) BigCTY (*.csv) Entities information has been updated. Die Informationen über Einträge wurden aktualisiert. Entities information has not been updated. Die Informationen über Einträge wurden nicht aktualisiert. ShowAdifImportWidget The following QSOs are those QSOs that you have received the LoTW confirmation. Ok OK DX Date/Time Datum/Zeit Band Band Mode Modus ShowErrorDialog KLog Message KLog-Nachricht SoftwareUpdateDialog Ok OK KLog update KLog-Aktualisierung <center><h2>KLog new version (%1) is available! </h2></center><br>There is a new version of KLog available.<br><br><b>You can get the new version from:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> Congratulations! Glückwunsch Your KLog has been updated. Ihr KLog ist aktualisiert worden. You already have the latest version. Sie haben bereits die neueste Version. StartWizard KLog - The free hamradio logging program KLog - das freie Programm für Amateurradio-Protokolle Quit Setup Einstellungen beenden Setup is not complete yet. Are you sure you want to quit setup? Die Einrichtung ist nicht vollständig. Möchten Sie wirklich abbrechen? StatisticsWidget QSO per year QSO pro Jahr DXCC per year DXCC pro Jahr CQ zones per year CQ-Zonen pro Jahr QSO per band QSO pro Band QSO per mode QSO pro Modus QSO per DXCC QSO pro DXCC QSO per Continent QSOs je Kontinent QSO per hour QSO pro Stunde QSO per month QSO pro Monat Worked / Confirmed status Status Bearbeitet / Bestätigt Worked / Sent status Status Bearbeitet / Bestätigt Sent / Confirmed status Status Versendet / Bestätigt Satellite grid status Satellite DXCC status Grids per band status DXCC per band status StatsCQZPerYearBarChartWidget CQ Zones per year CQ-Zonen pro Jahr Reading data ... Daten werden gelesen ... Abort reading Lesen abbrechen CQ zones CQ-Zonen CQ zones per year CQ-Zonen pro Jahr Reading data ... Daten werden gelesen ... Years: %1/%2 Jahre: %1/%2 StatsDXCCOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Anzahl Callsign Rufzeichen Date Datum Band Band Mode Modus DXCC DXCC Satellite Satellit Confirmed Bestätigt No Nein StatsEntitiesPerYearBarChartWidget Chart title Diagrammtitel Reading data ... Daten werden gelesen ... Abort reading Lesen abbrechen DXCC Entities DXCC-Einträge DXCC Entities per year DXCC-Einträge pro Jahr Reading data ... Daten werden gelesen ... Entities: Einträge: StatsFieldPerBandWidget All Alle Mode: Band Band Worked Bearbeitet Confirmed Bestätigt StatsGridsOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Anzahl Callsign Rufzeichen Date Datum Band Band Mode Modus Grid Satellite Satellit Confirmed Bestätigt No Nein StatsQSOsPerBandBarChartWidget QSOs per band QSOs pro Band Reading data ... Daten werden gelesen ... Abort reading Lesen abbrechen Bands Bänder QSOs per band distribution Reading data ... Daten werden gelesen ... Bands: Bänder: StatsQSOsPerContinentBarChartWidget QSOs per continent QSOs je Kontinent Reading data ... Daten werden gelesen ... Abort reading Lesen abbrechen Continents Kontinente Reading data ... Daten werden gelesen ... Hours: Stunden: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC QSOs pro DXCC Reading data ... Daten werden gelesen ... Abort reading Lesen abbrechen Reading data... Daten werden gelesen ... DXCC DXCC Top ten DXCC per QSO Erste zehn DXCC pro QSO StatsQSOsPerHourBarChartWidget QSOs per hour QSOs pro Stunde Reading data ... Daten werden gelesen ... Abort reading Lesen abbrechen Hours Stunden QSOs at hour QSOs je Stunde Reading data ... Daten werden gelesen ... Hours: Stunden: StatsQSOsPerModeBarChartWidget QSOs per mode QSOs pro Modus Reading data ... Daten werden gelesen ... Abort reading Lesen abbrechen Modes Modi QSOs per mode distribution Reading data ... Daten werden gelesen ... Modes: Modi: StatsQSOsPerMonthBarChartWidget QSOs per month QSOs je Monat Reading data ... Daten werden gelesen ... Abort reading Lesen abbrechen Jan Jan. Feb Feb. Mar März Apr Apr. May Mai Jun Jun. Jul Jul. Sep Sep. Oct Okt. Nov Nov. Dec Dez. Aug Aug. Months Monate QSOs at Month QSOs je Monat Reading data ... Daten werden gelesen ... Months: Monate: StatsQSOsPerYearBarChartWidget Reading data ... Daten werden gelesen ... Abort reading Lesen abbrechen QSOs QSOs QSOs per year QSOs pro Jahr Reading data ... Daten werden gelesen ... QSO: %1/%2 QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Versendet - %1 Confirmed - %2 Bestätigt - %2 Sent / Confirmed status Status Versendet / Bestätigt StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Bearbeitet, nicht bestätigt - %1 Confirmed - %2 Bestätigt - %2 Worked / Confirmed status Status Bearbeitet / Bestätigt StatsWorkedSentPieChartWidget Worked - %1 Bearbeitet - %1 Sent - %2 Versendet - %2 Worked / Sent status Status Bearbeitet / Bestätigt TipsDialog KLog tips Next Previous <b>Tip #1:</b><br>Do you know...<br>You can use <a href="#ToolsFillInQSO">Tools->Fill in QSO data</a> to automatically read the full log to fill the DXCC, CQ, ITU zones and continent? Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in QSO data <b>Tip #3:</b><br>Do you know...<br>You can use <a href="#ToolsFindQSO2QSL">Tools->QSL tools...->Find QSO to QSL</a> to look for all those QSO that you should send your QSL because you still need to confirm that DXCC and you have still not send your QSL card? Translator: Please make sure that the name of the link is coherent with the menu Tools->QSL tools...->Find QSO to QSL <b>Tip #2:</b><br>Do you know...<br>You can find the QSLs that you still need to send with <a href="#ToolsSendPendingQSL">Tools->QSL tools...->Find My-QSLs pending to send</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Requested</i>. Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in DXCC data <b>Tip #4:</b><br>Do you know...<br>You can enter a '*' in the search box, in the search window to search for all the QSOs done with one specific station callsign? Translator: Please make sure that the name of the link is coherent with the menu File->Export Requested QSL to ADIF... <b>Tip #5:</b><br>Do you know...<br>You can find the file containing all your log and other information in the logbook.dat file and the klogrc file, containing the KLog config file in the KLog folder by opening the <a href="#FileOpenKLogFolder">File->KLog folder</a> menu? <b>Tip #6:</b><br>Do you know...<br>You can upload your QSO marked as queued to LoTW via TQSL with <a href="#ToolsUploadLoTW">Tools->LoTW tools ...->Sends the log to LoTW calling TQSL.</a> ?<br><br>You have to configure TQSL in the preferences to be able to use this functionality. Translator: Please make sure that the name of the link is coherent with the menu File->KLog folder <b>Tip #7:</b><br>Do you know...<br>You can see the QSO that confirms one specific DXCC entity in one specific band by poiting your mouse over that band in the DXCC widget? Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find My-QSLs pending to send <b>Tip #8:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceivePendingQSL">Tools->QSL tools...->Find DX-QSLs pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Sent</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find DX-QSLs pending to receive <b>Tip #9:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceiveRecPendingQSL">Tools->QSL tools...->Find requested pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Rec marked as <i>Requested</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find requested pending to receive <b>Tip #10:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/klogchat>English KLog Telegram group</a> to discuss about KLog in English? <b>Tip #11:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/KLogES>Spanish Telegram group</a> to discuss about KLog in Spanish? <b>Tip #12:</b><br>Do you know...<br>You can subscribe to <a href=https://groups.io/g/klog>KLog mailing list</a> to discuss via email about KLog in English? <b>Tip #13:</b><br>Do you know...<br>You can <a href=https://twitter.com/_ea4k>follow EA4K on twitter</a> to get updates about KLog? <b>Tip #14:</b><br>Do you know...<br>You can write your own <a href=https://www.eham.net/reviews/detail/3118>review in eHam.net about KLog</a> to help other users to decide to use KLog? <b>Tip #15:</b><br>Do you know...<br>You can join the development team by simply <a href=https://www.klog.xyz/contact>Contacting us</a>? <b>Tip #16:</b><br>Do you know...<br>That there are many ways to contribute to KLog and some of them are listed in the <a href=https://www.klog.xyz/contrib>KLog Contribute</a> page? <b>Tip #17:</b><br>Do you know...<br>You can support translating KLog into your language? Please check <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a> page. <b>Tip #18:</b><br>Do you know...<br>You can double-click on an entity name in the DXCC table and all the QSOs with that DXCC Entity will be shown in the search box? <b>Tip #19:</b><br>Do you know...<br>You can right-click on a QSO and select <i>Check in QRZ.com</i> to check that callsign in QRZ.com? UpdateSatsData Reading Satellites data file... Datei mit Satellitendaten wird gelesen ... Abort reading Lesen abbrechen The Satellites information has been updated. Die Informationen über Satelliten wurden aktualisiert. Open File Datei öffnen Sat Data Satellitendaten UpdateSettings KLog - Settings update The settings system has been changed and KLog will update your settings file. World Entity Eintrag Continent Kontinent Reading cty.csv... Die Datei „“cty.csv wird gelesen ... Abort reading Lesen abbrechen eLogClubLog Host not found! Rechner nicht gefunden Timeout error! Zeitüberschreitung KLog - ClubLog KLog - Club Log Undefined error... Undefinierter Fehler ... Undefined error number (#%1)... It seems to be a CREDENTIALS ERROR; check your email and password. It seems that your ClubLog credentials are not correct. Please check your credentials in the setup. ClubLog uploads will be disabled. QSO dupe or not existing (#%1)... We have received an undefined error from Clublog (%1) This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO. Please check your config in the setup and contact the KLog development team if you can't fix it. ClubLog uploads will be disabled. Callsign missing Rufzeichen fehlt Invalid callsign Ungültiges Rufzeichen Skipping SWL callsign SWL-Rufzeichen wird übersprungen Callsign is your own call Dies ist Ihr eigenes Rufzeichen Invalid callsign with no DXCC mapping Ungültiges Rufzeichen, Zuordnung zu DXCC fehlt Updated QSO QSO aktualisiert Invalid ADIF record Ungültiger ADIF-Eintrag Missing ADIF record Fehlender ADIF-Eintrag Test mode - parameters ok, no action taken Testmodus - Parameter sind korrekt, es wird keine Aktion ausgeführt Excessive API Usage Excessive API-Benutzung Internal Error Interner Fehler Rejected Abgelehnt QSO Duplicate QSO-Duplikat QSO Modified QSO geändert Missing Login Anmeldung fehlt QSO OK QSO in Ordnung Upload denied Hochladen abgelehnt No callsign selected Kein Rufzeichen ausgewählt No match found Keine Übereinstimmungen gefunden Dropped QSO QSO verworfenen OK OK Login rejected Anmeldung abgelehnt Rejected: Callsign is your own call Abgelehnt: Dies ist Ihr eigenes Rufzeichen eLogQrzLog Host not found! Rechner nicht gefunden Timeout error! Zeitüberschreitung Undefined error number (#%1) We have received the following error from QRZ.com (%1) You are not subscribed to QRZ.com. Not valid KEY found Please configure your QRZ.com API key. You will find it in your QRZ.com Logbook settings webpage. You need a QRZ.com subscription to use this feature. KLog - QRZ.com password needed Please enter your QRZ.com password: KLog - QRZ.com Callsign missing Rufzeichen fehlt eQSLUtilities Host not found! Rechner nicht gefunden Timeout error! Zeitüberschreitung Undefined error number (#%1)... eQSL Error: User or password incorrect eQSL Warning: At least one of the uplodaded QSOs is duplicated. eQSL: All the QSOs were properly uploaded. KLog - eQSL.cc password needed Please enter your eQSL.cc password: KLog - eQSL eQSL has sent the following message: %1 We have received an undefined error from eQSL (%1) Please check your config in the setup and contact the KLog development team if you can't fix it. eQSL uploads will be disabled. klog-2.3.3/translations/klog_ca.ts0000644000015700001710000146537114542412415017046 0ustar jenkinsjenkins AboutDialog About KLog Quant al KLog You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. També ens podeu ajudar enviant informes d'error o col·laboracions petites de codi, idees o el que penseu que podria millorar el KLog. Authors Autors By Per Author Autor KLog is a free logbook for hamradio operators. El KLog és un llibre de registre lliure per a operadors de radioafició. Please provide your review in KLog's eHam review page: Si us plau, proporcioneu comentaris a la pàgina de revisions del KLog a eHam: today avui Main developer Desenvolupador principal KLog is developed by a very small team and you are invited to join! El KLog està desenvolupat per un equip molt petit i esteu convidat a unir-vos-hi! KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account users' needs. Els desenvolupadors del KLog han inclòs una funcionalitat que informa de diverses dades de l'usuari al servidor del KLog amb l'únic propòsit d'identificar el nombre de versions instal·lades, per tal d'enfocar el desenvolupament en una direcció o una altra tenint en compte les necessitats dels usuaris. At present, the data that is provided is the following: Actualment, les dades proporcionades són les següents: Translators bring KLog into your language. They are really an important part of the KLog development team. Els traductors adapten el KLog al vostre idioma. Són una part important de l'equip de desenvolupament del KLog. Find more information and the latest release at Podeu trobar més informació i l'últim llançament a Please be aware that this is a development release and it may contain many bugs.<br>Backup your data before using this software! Tingueu en compte que aquest és un llançament de desenvolupament i pot contenir molts errors.<br>Feu una còpia de seguretat de les dades abans d'usar aquest programari! Since 0.6.2, KLog has been fully rewritten to provide a cross-platform application that runs on all major operating systems (GNU/Linux, macOS and Windows) and to support new functionality. Des de la versió 0.6.2, el KLog s'ha reescrit completament per a proporcionar una aplicació multiplataforma que s'executa a tots els sistemes operatius principals (GNU/Linux, macOS i Windows) i per a implementar funcionalitats noves. If you want to provide support you are welcome to join the <a href="https://groups.io/g/klog">KLog mailing list</a>! Si us agradaria col·laborar, agrairem que us subscriviu a la <a href="https://groups.io/g/klog">llista de correu del KLog</a>! If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://groups.io/g/klog">KLog mailing list</a>! Si el KLog encara no està en el vostre idioma i voleu ajudar-nos, agrairem que contacteu amb la <a href="https://groups.io/g/klog">llista de correu del KLog</a>! Translators Traductors Privacy advisory Avís de privadesa Callsign Indicatiu KLog version Versió del KLog Operating system Sistema operatiu Be aware that you can enable/disable this feature from the Misc tab in the Setup page. Tingueu en compte que podeu activar/desactivar aquesta funcionalitat des de la pestanya Varis de la pàgina de Configuració. KLog KLog Privacy Privadesa AdifLoTWExportWidget Select the Station Callsign that you want to use to upload the log. Seleccioneu l'indicatiu de l'estació de la qual voleu usar per pujar el registre. Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign. Seleccioneu la data d'inici a exportar els QSO. La data predeterminada és la data del primer QSO amb aquest indicatiu d'estació. Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign. Seleccioneu la data de fi a exportar els QSO. La data predeterminada és la data del darrer QSO amb aquest indicatiu d'estació. Station callsign Indicatiu de l'estació My Locator El meu localitzador Start date Data d'inici End date Data final Ok D'acord Cancel Cancel·la DX DX Date/Time Data/hora Band Banda Mode Mode Not defined No s'ha definit ALL TOT QSOs: %1/%2 QSO: %1/%2 All Tot QSOs: QSO: KLog - QSOs to be uploaded to LoTW. KLog - QSO que es pujaran a LoTW. This table shows the QSOs that will be sent to LoTW. Aquesta taula mostra els QSO que s'enviaran al LoTW. KLog - QSOs to be uploaded to ClubLog. KLog - QSO que es pujaran a ClubLog. This table shows the QSOs that will be sent to ClubLog. Aquesta taula mostra els QSO que s'enviaran a ClubLog. KLog - QSOs to be uploaded to eQSL.cc. KLog - QSO que es pujaran a l'eQSL.cc. This table shows the QSOs that will be sent to eQSL.cc. Aquesta taula mostra els QSO que s'enviaran a l'eQSL.cc. KLog - QSOs to be uploaded to QRZ.com. KLog - QSO que es pujaran al QRZ.com. This table shows the QSOs that will be sent to QRZ.com. Aquesta taula mostra els QSO que s'enviaran a QRZ.com. This table shows the QSOs that will be exported to ADIF. Aquesta taula mostra els QSO que s'exportaran a ADIF. AwardsWidget Recalculate Torna a calcular Click to recalculate the award status. Cliqueu per tornar a calcular l'estat dels diplomes. Select the year you want to check. Seleccioneu l'any que voleu comprovar. QSOs QSO DXCC DXCC CQ CQ Award Diploma Confirmed Confirmat Worked Treballat WAZ WAZ Score Puntuació Annual Anual Number of confirmed DXCC entities. Nombre d'entitats DXCC confirmades. Number of worked DXCC entities. Nombre d'entitats DXCC treballades. Number of confirmed WAZ zones. Nombre de zones WAZ confirmades. Number of worked WAZ zones. Nombre de zones WAZ treballades. Number of confirmed QSOs. Nombre de QSO confirmats. Number of worked QSOs. Nombre de QSO treballats. Number of QSOs worked in the selected year. Nombre de QSO treballats durant l'any seleccionat. Number of DXCCs worked in the selected year. Nombre de DXCC treballades durant l'any seleccionat. Number of CQ Zones worked in the selected year. Nombre de zones CQ treballades durant l'any seleccionat. Score for the DXMarathon in the selected year. Puntuació per al DXMarathon a l'any seleccionat. DX-Marathon DX-Marathon CTYPage Country data download Baixa les dades de països KLog needs country data... El KLog necessita dades de països... &Download &Baixa &Ignore &Ignora Country data needed Cal les dades de països KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. El KLog usa el fitxer «cty.csv» de https://www.country-files.com/ per aconseguir la informació de les DXCC. You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do. Cal baixar el fitxer «cty.csv» si voleu que el KLog mostri els països, el localitzador, etc. dels QSO que feu. Click on Download to download now. Cliqueu a Baixa per baixar ara. KLog KLog I can't find the host. Please check your network and try again Do you want to try again? No s'ha pogut trobar la màquina. Reviseu la configuració de xarxa i proveu de nou Voleu tornar-ho a intentar? DXCCStatusWidget Update Actualitza It seems that the DXCC status in your database is not updated and KLog can't find any dxcc information. You can try to fix this by updating the log. Sembla que l'estat dels DXCC a la base de dades no està actualitzat i el KLog no ha pogut trobar cap informació dels DXCC. Podeu intentar corregir això actualitzant el registre. Do you want to update your DXCC status? Voleu actualitzar l'estat dels DXCC? Entity Entitat Prefix Prefix Pref: Pref: CQ: CQ: ITU: ITU: Beam: Raig: Entity not worked in this band. L'entitat no ha treballat en aquesta banda. DXClusterWidget Connect Connecta Clear Neteja Click on connect to connect to the DX-Cluster Cliqueu a Connecta per connectar al DX-Cluster KLog DXCluster Kontest DXCluster DXCluster del KLog Click on Connect to connect to the DX-Cluster server Cliqueu a Connecta per connectar al servidor de DX-Cluster Check in QRZ.com Comprova a QRZ.com Check this callsign in QRZ.com Comprova aquest identificador a QRZ.com Trying to connect to the server S'intenta connectar amb el servidor The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. La connexió ha estat rebutjada pel servidor. Assegureu-vos que el servidor de DXCluster està executant-se i comproveu que la configuració del nom de la màquina i el port sigui correcta. The following error occurred: %1. Ha ocorregut el següent error: %1. Connected to server Connectat al servidor KLog message Kontest message Missatge del KLog Enter your callsign to connect to the cluster: Introduïu el vostre indicatiu per connectar al clúster: Enter your password to connect to the cluster: (Just hit enter for no password) Introduïu la contrasenya per connectar al clúster: (premeu retorn si no hi ha contrasenya) Not logged on, you may need to enter your callsign again. No esteu connectat, cal tornar a introduir el vostre indicatiu un altre cop. Enter here the commands to be sent to the DX-Cluster server. Introduïu aquí les ordres a enviar al servidor DX-Cluster. It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! No ha estat possible obrir per escriptura el fitxer a on desar els avisos de DX. No es desarà l'activitat del DX-Cluster! Disconnect Desconnecta The host was not found. Please check: No s'ha trobat la màquina. Comproveu: - your network connection; - the host name and port settings. - la connexió de xarxa; - la configuració del nom de màquina i el port. Connection closed by the server Connexió tancada pel servidor Click on Connect to connect to the DX-Cluster server. Feu clic a Connecta per connectar al servidor DX-Cluster. Send Envia DataProxy_SQLite Software version in DB is null La versió del programari a la BD és nul Aircraft Scatter Common term in hamradio, do not translate if not sure Aircraft Scatter Aurora Aurora Aurora-E Aurora-E Back scatter Common term in hamradio, do not translate if not sure Back scatter Earth-Moon-Earth Terra-Lluna-Terra Sporadic E Sporadic E Internet-assisted Assistit per Internet Ionoscatter Common term in hamradio, do not translate if not sure Ionoscatter Meteor scatter Common term in hamradio, do not translate if not sure Meteor scatter Terrestrial or atmospheric repeater or transponder Repetidor o transponedor terrestre o atmosfèric Rain scatter Common term in hamradio, do not translate if not sure Rain scatter Satellite Satèl·lit Bureau Common term in hamradio, do not translate if not sure Bureau Manager Common term in hamradio, do not translate if not sure Manager All QSOs have been updated with a DXCC and the Continent. S'han actualitzat tots els QSO amb un DXCC i el continent. Field Aligned Irregularities Common term in hamradio, do not translate if not sure Field Aligned Irregularities Query didn't failed No ha fallat la consulta F2 Reflection Common term in hamradio, do not translate if not sure F2 Reflection Trans-equatorial Common term in hamradio, do not translate if not sure Trans-equatorial Tropospheric ducting Common term in hamradio, do not translate if not sure Tropospheric ducting Yes Sí No No Requested Sol·licitat Ignore/Invalid Ignora/No vàlid Validated Validat Queued En cua Uploaded Pujat Do not upload No pujat Modified Modificat Direct Directe Electronic Electrònic KLog DXCC DXCC del KLog KLog - Invalid call detected KLog - S'ha detectat un indicatiu no vàlid An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported ADIF record? S'ha detectat un indicatiu buit. Voleu exportar igualment aquest QSO (clic a Sí) o eliminar el camp del registre ADIF exportat? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log? S'ha detectat un indicatiu no vàlid %1. Voleu exportar igualment aquest indicatiu (clic a Sí) o eliminar l'indicatiu del fitxer de registre exportat? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. L'exportació d'indicatius incorrectes pot crear problemes potencials a les aplicacions a les quals s'importa aquest fitxer de registre. Tanmateix, podria ser un indicatiu correcte que el KLog ha identificat incorrectament com a no vàlid. DownLoadCTY Download of cty.csv failed with the following error code: La baixada del «cty.csv» ha fallat amb el codi d'error següent: Download of cty.csv done. La baixada de «cty.csv» ha finalitzat. There is already a cty.csv file in the folder but it will be replaced with the new one. Ja hi ha un fitxer «cty.csv» a la carpeta, però se substituirà pel nou. Could not open %1 for writing No s'ha pogut obrir %1 per a escriptura FileAwardManager Open Award file Obre un fitxer de diplomes Award files (*.awa) Fitxers de diplomes (*.awa) Award file not opened El fitxer de diplomes no s'ha obert KLog was not able to read the award file El KLog no ha pogut llegir el fitxer de diplomes It was not possible to open the file %1 for reading. No ha estat possible obrir el fitxer %1 per a lectura. AWA wrong format Format AWA incorrecte The AWA file does not have the right format El fitxer AWA no té el format correcte AWA file does not have an <EOH> field El fitxer AWA no té un camp <EOH> KLog - %1 KLog - %1 FileManager Reading ADIF file... S'està llegint el fitxer ADIF... Abort reading Interromp la lectura Writing ADIF file... Escrivint el fitxer ADIF... Abort writing Interromp l'escriptura Processing LoTW ADIF file... S'està processant el fitxer ADIF de LoTW... Abort processing S'interromp el procés LoTW reading Lectura de LoTW KLog - Add new QSOs? KLog - Afegeixo els QSO nous? Do you want to add non existing QSOs to your local log? Voleu afegir els QSO no existents al vostre registre local? There are some QSOs in the LoTW log that are not in your local log. Hi ha diversos QSO en el registre del LoTW que no estan el vostre registre local. Processing LoTW ADIF file...... QSO: %1 / %2 S'està processant el fitxer ADIF de LoTW...... QSO: %1 / %2 You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated. Heu cancel·lat el procés de LoTW. El procés s'aturarà i el vostre registre podria no estar completament actualitzat. Do you want to add dupe QSOs to your local log? Voleu afegir els QSO duplicats al vostre registre local? There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date. Hi ha diversos QSO en aquest fitxer de registre que poden ser duplicats atès que tenen el mateix indicatiu, banda i mode i una data molt propera. Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. Feu clic a Sí per afegir un %1 predeterminat per al mode %2 a tots els QSO amb un problema semblant. KLog - Don't ask again KLog - No ho tornis a preguntar Do you want to reuse your answer? Voleu reutilitzar la resposta? KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again. El KLog usarà automàticament la resposta anterior per a altres ocurrències similars, si n'hi ha, sense tornar-ho a preguntar. <ul><li>Date/Time:</i> %1</li><li>Callsign: %2</li><li>Band: %3</li><li>Mode: %4</li></ul> <ul><li>Data/Hora:</i> %1</li><li>Indicatiu: %2</li><li>Banda: %3</li><li>Mode: %4</li></ul> KLog - QSO not found KLog - No s'ha trobat el QSO Do you want to add this QSO to the log?: Voleu afegir aquest QSO al registre?: We have found a QSO coming from LoTW that is not in your local log. Do you want KLog to add this QSO to the log? S'ha trobat un QSO que ve del LoTW que no és al vostre registre local. Voleu que el KLog afegeixi aquest QSO al registre? KLog - Invalid call detected KLog - S'ha detectat un indicatiu no vàlid An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported log file? S'ha detectat un indicatiu buit. Voleu exportar igualment aquest QSO (clic a Sí) o eliminar el camp del fitxer de registre exportat? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log file? S'ha detectat un indicatiu no vàlid %1. Voleu exportar igualment aquest indicatiu (clic a Sí) o eliminar l'indicatiu del fitxer de registre exportat? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. You can, however, edit the ADIF file once the export process is finished. L'exportació d'indicatius incorrectes pot crear problemes potencials a les aplicacions a les quals s'importa aquest fitxer de registre. Tanmateix, podria ser un indicatiu correcte que el KLog ha identificat incorrectament com a no vàlid. En qualsevol cas podreu editar el fitxer ADIF una vegada acabi el procés d'exportació. The selected callsign (%1) is not valid, please check it again to export the log. L'indicatiu (%1) seleccionat no és vàlid, comproveu-ho de nou per a exportar el registre. There are no QSOs pending to be exported with that station callsign. No hi ha cap QSO pendent d'exportar amb aquest indicatiu d'estació. Export Exporta Export progress Progrés de l'exportació Writing ADIF file... QSO: S'està escrivint el fitxer ADIF... QSO: Reading LoTW file... S'està llegint el fitxer LoTW... You have canceled the file import. The file will be removed and no data will be imported. Heu cancel·lat la importació del fitxer. El fitxer s'eliminarà i no s'importarà cap dada. This QSO is not including the minimum data to consider a QSO as valid! Aquest QSO no inclou les dades mínimes per a considerar-se un QSO vàlid! Do you want to continue with the current file? Voleu continuar amb el fitxer actual? - The band missing and the following call: - Manca la banda i l'indicatiu següent: - The mode missing and the following call: - Manca el mode i l'indicatiu següent: - The date missing and the following call: - Manca la data i l'indicatiu següent: - The time missing and the following call: - Manca l'hora i l'indicatiu següent: You have canceled the file export. The file will be removed and no data will be exported. Heu cancel·lat l'exportació del fitxer. El fitxer s'eliminarà i no s'exportarà cap dada. KLog - Error KLog - Error The selected log does not exist, please check it again. El registre seleccionat no existeix, comproveu-ho de nou. The file %1 can't be opened. El fitxer «%1» no s'ha pogut obrir. KLog - User cancelled KLog - L'usuari ha cancel·lat Do you still want to cancel? Encara voleu cancel·lar? QSO: QSO: KLog - File not opened KLog - Fitxer no obert It was not possible to open the file %1 for reading. No ha estat possible obrir el fitxer %1 per a lectura. KLog was not able to read the LoTW file El KLog no ha pogut llegir el fitxer del LoTW Importing LoTW ADIF file... S'està important el fitxer ADIF del LoTW... KLog - Log selection KLog - Selecció de registre There is more than one log in this logfile. Hi ha més d'un registre en aquest fitxer de registre. All logs will be imported into the current log. S'importaran tots els registres al registre actual. Do you want to continue? Voleu continuar? Importing ADIF file... S'està important el fitxer ADIF... KLog - Duplicated QSOs KLog - QSO duplicats It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) Sembla que hi ha diversos QSO duplicats al fitxer ADIF que s'està important. Voleu continuar? (Els QSO duplicats no s'importaran) KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO with %1 on %2: El KLog ha trobat un QSO sense un identificador definit d'estació. Introduïu l'identificador d'estació que es va usar per fer aquest QSO amb %1 a %2: KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO on %1: El KLog ha trobat un QSO sense un identificador definit d'estació. Introduïu l'identificador d'estació que es va usar per fer aquest QSO a %1: Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information. Sembla que manca la informació RST-TX a diversos QSO d'aquest registre (p. ex.: %1). Exporting ADIF file... QSO: %1 / %2 S'està exportant el fitxer ADIF... QSO: %1 / %2 If you select NO, maybe the QSO will not be imported. Si seleccioneu No, potser no s'importaran els QSO. Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. Sembla que manca la informació RST-RX a diversos QSO d'aquest registre (p. ex.: %1). KLog - Apply to all QSOs in this log? KLog - Aplico a totes els QSO d'aquest registre? Please edit the ADIF file and make sure that it include at least: Editeu el fitxer ADIF i assegureu-vos que inclou, com a mínim: and i This QSO had: Aquest QSO té: KLog: Not all required data found! KLog: No s'han trobat totes les dades necessàries! KLog: No RST TX found! KLog: No s'ha trobat RST TX! KLog: No RST RX found! KLog: No s'ha trobat RST RX! KLog - No Station callsign entered. KLog - No s'ha introduït l'identificador de l'estació. KLog - QSO without Station Callsign KLog - QSO sense identificador de l'estació HamLibNetworkConfigWidget Enter the hostname or address of the radio. Introduïu el nom de la màquina o l'adreça de la ràdio. Set de network port of the radio. Estableix el port de xarxa de la ràdio. Host/Address Màquina/Adreça Port Port Enter the port of the radio. Introduïu el port de la ràdio. HamLibSerialConfigWidget Bauds Bauds Select the serial port speed. Seleccioneu la velocitat del port sèrie. Port Port Select the serial port. Only the serial ports that are detected are shown. Seleccioneu el port sèrie. Només es mostren els ports sèrie detectats. Scan Escaneja Click to identify the serial ports available in your computer. Feu clic per identificar els ports sèrie disponibles a l'ordinador. 5 bits 5 bits 6 bits 6 bits 7 bits 7 bits 8 bits 8 bits Data bits Bits de dades Select the serial data bits. Seleccioneu els bits de dades del sèrie. None Sense Hardware Maquinari Software XON/XOFF Programari XON/XOFF Flow control Control de flux Select the serial flow control Seleccioneu el control de flux del sèrie No parity Sense paritat Even Parells Odd Senars Space Espai Mark Marca Parity Paritat Select the serial parity. Seleccioneu la paritat del sèrie. 1 bit 1 bit 1.5 bits 1.5 bits 2 bits 2 bits Stop bits Bits d'aturada Select the serial stop bits. Seleccioneu els bits d'aturada del sèrie. InfoWidget 10M 10M 15M 15M 20M 20M 40M 40M 80M 80M 160M 160M 2M 2M 6M 6M 12M 12M 17M 17M 30M 30M 70CM 70CM Continent Continent Prefix Prefix CQ CQ ITU ITU Short Path Camí curt Long Path Camí llarg Deg Graus Miles Milles Km Km IntroPage Welcome to KLog! Welcome to Kontest! Us donem la benvinguda al KLog! Welcome to KLog! - brought to you under the terms of the GPL! Us donem la benvinguda al KLog! - Distribuït segons els termes de la GPL! Welcome to KLog Us donem la benvinguda al KLog This looks like it's the first time you've run KLog on this computer. Sembla que aquesta és la primera vegada que s'executa el KLog en aquest ordinador. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. El KLog és un programa lliure d'enregistrament de radioafició que es pot executar en el GNU/Linux, macOS, i Windows. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. It is designed to provide general purpose DX, and contest logging. Està dissenyat per proporcionar un enregistrament de caràcter general de DX i per a concursos. It supports QSL management, import and export of ADIF Permet la gestió de QSL, importació i exportació d'ADIF and Cabrillo file formats and many other features... de fitxer ADIF i Cabrillo, i moltes altres funcionalitats... Before you can start using KLog, you will be asked to: Abans de començar a usar el KLog, us demanarem: Acknowledge to the terms of the license. Reconeixement dels termes de la llicència. Download the DX entities information. Baixada de la informació de les entitats DX. Enter your callsign, CQ zone, etc. and main configuration. Introduïu el vostre identificador, zona CQ, etc. i configuració principal. Enjoy KLog and contact the development team if you have any suggestions! Gaudiu del KLog i contacteu amb l'equip de desenvolupament si teniu qualsevol suggeriment! LicPage KLog License information Informació de la llicència del KLog Welcome to KLog!- brought to you under the terms of the GPL! Us donem la benvinguda al KLog! - Distribuït segons els termes de la GPL! Acknowledge Reconeixement Be aware that KLog is free software. Tingueu present que el KLog és programari lliure. LoTWUtilities KLog - LoTW password needed KLog - Cal la contrasenya del LoTW Please enter your LoTW password: Introduïu la contrasenya del LoTW: There is a file already existing with the name that will be used. Ja hi ha un fitxer existent amb el nom que s'usarà. The file %1 already exist. Do you want to overwrite? El fitxer %1 ja existeix. Voleu sobreescriure'l? KLog was not able to save the file %1. Error returned: %2 El KLog no ha pogut desar el fitxer %1. Error retornat: %2 Downloading data to file: %1. S'estan baixant les dades al fitxer: %1. KLog - LoTW download KLog - Baixada del LoTW This is the first date of a QSO with the callsign %1 in this log If you think that in LoTW you may have previous QSOs, answer No. Aquesta és la primera data d'un QSO amb l'indicatiu %1 en aquest registre. Si penseu que podeu tenir QSO anteriors al LoTW, contesteu No. Do you want to use this date (%1) as start date? Voleu usar aquesta data (%1) com a data d'inici? The remote server redirected our connection to %1 El el servidor remot ha redireccionat la connexió a %1 Do you want to follow the redirection? Voleu seguir la redirecció? It was not possible for find the file %1 that has been just downloaded. No ha estat possible trobar el fitxer %1 que s'acaba de baixar. It seems that LoTW has no QSO with the Station Callsign you are using (%1). Sembla que el LoTW no té cap QSO amb l'indicatiu d'estació que esteu usant (%1). Try again and send the downloaded file (%1) to the KLog developer for analysis. Torneu a intentar-ho i envieu el fitxer baixat (%1) al desenvolupador del KLog per a la seva anàlisi. KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data? El KLog ha baixat correctament %1 QSO. Voleu actualitzar el registre amb les dades baixades? Double click on the date that you want to use as the start date for downloading QSOs. Feu clic doble a la data que vulgueu usar com a data d'inici per a baixar els QSO. KLog - LoTW Station callsign KLog - Indicatiu d'estació del LoTW There is not a single QSO in the log with that station callsign. No hi ha cap QSO individual al registre amb aquest indicatiu d'estació. Are you sure that you want to use that station callsign (%1)? Segur que voleu usar aquest indicatiu d'estació (%1)? KLog - LoTW File already exists KLog - El fitxer del LoTW ja existeix KLog - LoTW Can't write the file KLog - No s'ha pogut escriure el fitxer del LoTW The file %1 already exists. El fitxer %1 ja existeix. KLog - LoTW Start date selection KLog - Selecció de la data d'inici del LoTW KLog - LoTW Download error KLog - Error de baixada del LoTW There was an error (%1) while downloading the file from LoTW. S'ha produït un error (%1) en baixar el fitxer des del LoTW. The downloading error details are: %1 Els detalls de l'error de la baixada són: %1 KLog - LoTW Redirection found KLog - S'ha trobat una redirecció del LoTW KLog - LoTW File not found KLog - No s'ha trobat el fitxer del LoTW KLog can't find the downloaded file. No s'ha pogut trobar el fitxer baixat. KLog - LoTW user/password error KLog - Error d'usuari/contrasenya del LoTW LoTW server did not recognized your user/password El servidor LoTW no ha reconegut l'usuari/contrasenya Check your user and password and ensure your are using the right one before trying again. Verifiqueu l'usuari i la contrasenya i assegureu-vos que esteu usant els correctes abans de tornar a provar-ho. KLog - LoTW No QSOs KLog - LoTW no QSO LoTW sent no QSOs El LoTW no ha enviat cap QSO KLog - LoTW Unknown error KLog - Error desconegut del LoTW KLog can't recognize the file that has been downloaded from LoTW. El KLog no ha pogut reconèixer el fitxer que s'ha baixat des del LoTW. Now KLog will process the downloaded QSO and update your local log. Ara el KLog processarà els QSO baixats i actualitzarà el registre local. LogWindow QSL Send QSL enviada QSL Rcvd QSL rebuda &Delete &Suprimeix Delete a QSO Suprimeix un QSO &Edit QSO &Edita QSO Edit this QSO Edita aquest QSO Via &bureau Via &bureau Send this QSL via bureau Envia aquesta QSL via bureau D&irect D&irecta Send this QSL via direct Envia aquesta QSL via directa Via bureau Via bureau QSL &received via bureau QSL &rebuda via bureau Direct Directa QSL received via direc&t QSL rebuda via direc&ta Check in QRZ.com Comprova a QRZ.com Check this callsign in QRZ.com Comprova aquest identificador a QRZ.com Check in DXHeat.com Comprova a DXHeat.com Check this callsign in DXHeat.com Comprova aquest identificador a DXHeat.com Delete selected QSOs Suprimeix els QSO seleccionats Delete the selected QSOs Suprimeix els QSO seleccionats Export to ADIF Exporta a ADIF Export the selected QSOs to an ADIF file. Exporta els QSO seleccionats a un fitxer ADIF. Upload to LoTW Puja al LoTW Upload the selected QSOs to LoTW Puja els QSO seleccionats al LoTW Upload to ClubLog Puja a ClubLog Upload the selected QSOs to ClubLog Puja els QSO seleccionats a ClubLog Upload to eQSL.cc Puja a l'eQSL.cc Upload the selected QSOs to eQSL.cc Puja els QSO seleccionats a l'eQSL.cc Send these QSLs via bureau Envia aquestes QSL via bureau Send these QSLs via direct Envia aquestes QSL via directa QSLs received via bureau QSL rebudes via bureau QSLs received via direc&t QSL rebudes via direc&ta Select none No en seleccionis cap Remove all selections Elimina totes les seleccions Select all Selecciona-ho tot Select all the QSOs Selecciona tots els QSO MainQSOEntryWidget &Add &Afegeix &Clear &Neteja Callsign of the QSO. Indicatiu del QSO. Band of the QSO. Banda del QSO. Mode of the QSO. Mode del QSO. Date of the QSO. Data del QSO. Time of the QSO. Hora del QSO. Add the QSO to the log. Afegeix el QSO al registre. Clears the QSO entry. Neteja l'entrada QSO. Look up info about the current callsign on qrz.com KLog will show real time if enabled. El KLog mostrarà l'hora real si està activada. Real time Temps real Stop wsjt-x and hamlib from automatically updating QSO information. Atura l'actualització automàtica de la informació dels QSO per part del WSJT-X i la «hamlib». Manual Mode Mode manual Callsign Indicatiu &Save De&sa &Cancel &Cancel·la DUPE Translator: DUPE is a common world for hams. Do not translate of not sure DUPE MainWindow Starting KLog S'està iniciant el KLog DX Entity Entitat DX &Log Window &Finestra del registre KLog KLog It seems that you have never done a backup or exported your log to ADIF. Sembla que mai s'ha fet una còpia de seguretat o s'ha exportat el registre a ADIF. It seems that the latest backup you did is older than one month. Sembla que la darrera còpia de seguretat que s'ha fet és anterior a un mes. Log backup recommended! Es recomana una còpia de seguretat del registre! It is a good practice to backup your full log regularly to avoid loosing data in case of a problem. Once you export your log to an ADIF file, you should copy that file to a safe place, like an USB drive, cloud drive, another computer, ... KLog will remind you to backup on a monthly basis. És una bona pràctica fer regularment una còpia de seguretat del registre complet per a evitar perdre dades en cas d'algun problema. Un cop feta l'exportació del registre a una fitxer ADIF, caldria copiar aquest fitxer en un lloc segur, com una unitat USB, una unitat al núvol, un altre ordinador,... El KLog us recordarà que feu una còpia de seguretat mensualment. Ready Llest An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: S'ha produït un error inesperat en intentar afegir el QSO al registre. Si el problema persisteix, contacteu amb el desenvolupador per a una anàlisi: You have selected an entity: Heu seleccionat una entitat: that is different from the KLog proposed entity: que és diferent de l'entitat proposada pel KLog: Click on the prefix of the correct entity or Cancel to edit the QSO again. Feu clic al prefix de l'entitat correcta o Cancel·la per tornar a editar el QSO. Click on the prefix of the right entity or Cancel to correct. Feu clic al prefix de l'entitat correcta o Cancel·la per corregir. Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1 Segur que voleu marcar TOTS els vostres QSO per a ser PUJATS? NOMÉS cal fer-ho SI AQUESTA ÉS LA PRIMERA VEGADA que pugeu QSO al %1 ClubLog ClubLog KLog - QRZ.COM KLog - QRZ.COM QRZ.COM QRZ.com Filling QSOs ... Omplint els QSO... RSTrx RSTrx RSTtx RSTtx Select the Station Callsign to use when quering LoTW: Seleccioneu l'indicatiu d'estació a usar per consultar el LoTW: Please check the LoTW setup Comproveu la configuració del LoTW You have not defined a LoTW user or a proper Station Callsign. Open the LoTW tab in the Setup and configure your LoTW connection. No s'ha definit cap usuari del LoTW o un indicatiu d'estació adequat. Obriu la pestanya del LoTW a l'arranjament i configureu la connexió del LoTW. Do you really want to exit KLog? Esteu segur que voleu sortir del KLog? KLog - CTY.dat update KLog - Actualització de CTY.dat KLog - Backup KLog - Còpia de seguretat KLog - New version detected! KLog - S'ha detectat una versió nova! &File &Fitxer Import an ADIF file into the current log. Importa un fitxer ADIF al registre actual. Export the current log to an ADIF logfile. Exporta el registre actual a un fitxer ADIF. Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Exporta tots els QSO a un fitxer ADIF, fusionant els QSO de tots els registres. Print your log. Imprimeix el registre. KLog folder Carpeta del KLog Opens the data folder of KLog. Obre la carpeta de dades del KLog. E&xit S&urt &Tools &Eines Fill in QSO data Omple les dades QSO Go through the log reusing previous QSOs to fill missing information in other QSOs. Recorre el registre reutilitzant els QSO anteriors per omplir informació que manqui en altres QSO. Shows QSOs for which you should send your QSL and request the DX QSL. Mostra els QSO pels quals cal enviar la vostra QSL i sol·licitar la DX QSL. Find My-QSLs pending to send Cerca les meves QSL pendents d'enviar Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Mostra els QSO amb sol·licituds pendents d'enviar les QSL. Cal mantenir buida aquesta cua! Mark all queued QSOs in this log as sent to LoTW. Marca tots els QSO posats en cua d'aquest registre com a enviats al LoTW. Mark all queued QSOs as sent to LoTW. Marca tots els QSO posats en cua com a enviats al LoTW. For updated DX-Entity data, update cty.csv. Per a dades DX-Entity actualitzades, actualitzeu el «cty.csv». Check always the current callsign in QRZ.com Comprova sempre l'indicatiu actual a QRZ.com It was not possible to define the KLog folder. Some functions may not work properly! No s'ha pogut definir la carpeta del KLog. Algune sfunciones no funcionaran correctament! You can update the entities database in Tools->Update cty.csv Podeu actualitzar la base de dades d'entitats a Eines -> Actualitza el «cty.csv» Do you want to do it now? Voleu fer-ho ara? The callsign %1 is not a valid call. Do you really want to add this callsign to the log? L'indicatiu %1 no és un indicatiu vàlid. Esteu segur que voleu afegir aquest indicatiu al registre? KLog - Not valid callsign KLog - Indicatiu no vàlid The callsign %1 is not a valid callsign. Do you really want to add this callsign to the log? L'indicatiu %1 no és un indicatiu vàlid. Esteu segur que voleu afegir aquest indicatiu al registre? Stats Estadístiques Show the statistics of your radio activity. Mostra les estadístiques de la vostra activitat de ràdio. &Help &Ajuda Do you really want to mark ALL the QSOs of this log to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. Segur que voleu marcar TOTS els QSO d'aquest registre per a ser PUJATS? NOMÉS cal fer-ho SI AQUESTA ÉS LA PRIMERA VEGADA que pugeu aquests QSO al LoTW. Do you really want to mark ALL pending QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. Segur que voleu marcar TOTS els QSO pendents per a ser PUJATS? NOMÉS cal fer-ho SI AQUESTA ÉS LA PRIMERA VEGADA que pugeu aquests QSO al LoTW. KLog - TQSL KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. El TQSL no està instal·lat o el KLog no l'ha pogut trobar. Comproveu la configuració. Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded. Error núm. 1: L'usuari ha cancel·lat el procés o el TQSL no estava configurat. No s'ha pujat cap QSO. Error #2: Upload was rejected by LoTW, please check your data. Error núm. 2: El LoTW ha rebutjat la pujada, comproveu les dades. Error #3: The TQSL server returned an unexpected response. Error núm. 3: El servidor TQSL ha retornat una resposta inesperada. Error #4: There was a TQSL error. Error núm. 4: Hi ha hagut un error del TQSL. Error #5: There was a TQSLLib error. Error núm. 5: Hi ha hagut un error del TQSLLib. Error #6: It was not possible to open the input file. Error núm. 6: No ha estat possible obrir el fitxer d'entrada. Error #7: It was not possible to open the ouput file. Error núm. 7: No ha estat possible obrir el fitxer de sortida. Error #8: No QSOs were processed since some QSOs were duplicates or out of date range. Error núm. 8: No s'ha processat cap QSO ja que alguns QSO estaven duplicats o fora de l'interval de dates. Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range. Error núm. 9: S'han processat alguns QSO, i alguns QSO s'han ignorat perquè estaven duplicats o fora de l'interval de dates. Error #10: Command syntax error. KLog sent a bad syntax command. Error núm. 10: Error de sintaxi de l'ordre. El KLog ha enviat una ordre amb sintaxi incorrecta. Error #11: LoTW Connection error (no network or LoTW is unreachable). Error núm. 11: Error de connexió al LoTW (no hi ha xarxa o el LoTW no és accessible). Error #00: Unexpected error. Please contact the development team. Error núm. 00: Error inesperat. Contacteu amb l'equip de desenvolupament. The log that you have selected contains more than just one station callsign. El registre que heu seleccionat conté més d'un indicatiu d'estació. Please select the station callsign you want to mark as sent to LoTW: Seleccioneu l'indicatiu d'estació que voleu marcar com enviat a LoTW: Station Callsign: Indicatiu d'estació: Define Station Callsign Defineix l'indicatiu d'estació Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Introduïu l'indicatiu d'estació emprat en aquest registre o deixeu-ho buit pels QSO sense indicatiu d'estació definit: KLog - No station selected KLog - No s'ha seleccionat cap estació No station callsign has been selected and therefore no log will be marked No s'ha seleccionat cap indicatiu, i per tant no es marcarà cap registre Congratulations! Enhorabona! You already have the latest version. Ja teniu la versió més recent. You can find the KLog data folder here: Podeu trobar la carpeta de dades del KLog aquí: start començar stop aturar If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. Si esteu segur que la base de dades conté QSO i el KLog no és capaç de trobar-los, contacteu amb els desenvolupadors (vegeu Quant al KLog) per sol·licitar ajuda. You need to select one station callsign to be able to send your log to LoTW. Cal seleccionar un indicatiu d'estació per ser capaç d'enviar el vostre registre al LoTW. You need to select one station callsign to be able to send your log to ClubLog. Cal seleccionar un indicatiu d'estació per ser capaç d'enviar el vostre registre a ClubLog. Do you want to add this QSOs to your ClubLog existing log? Voleu afegir aquests QSO al vostre registre existent del ClubLog? If you don't agree, this upload will overwrite your current ClubLog existing log. Si no hi esteu d'acord, aquesta pujada sobreescriurà el vostre registre actual existent a ClubLog. KLog - eQSL KLog - eQSL You need to select one station callsign to be able to send your log to eQSL.cc. Cal seleccionar un indicatiu d'estació per ser capaç d'enviar el vostre registre a l'eQSL.cc. KLog - Select the Station Callsign. KLog - Selecció de l'indicatiu d'estació. The log is ready to be uploaded to ClubLog. Aquest registre està preparat per pujar-se al ClubLog. All the QSOs in this log has been marked as Modified in the ClubLog status field Tots els QSO d'aquest registre s'han marcat com a Modificats en el camp s'estat del ClubLog KLog could not mark the full log to be sent to ClubLog El KLog no ha pogut marcar el registre complet per a enviar al ClubLog Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers. Quelcom ha evitat que el KLog marqui els QSO com a modificats. Reinicieu el KLog i torneu-ho a provar abans de contactar amb els desenvolupadors del KLog. The log is ready to be uploaded to eQSL.cc. Aquest registre està preparat per pujar-se a l'eQSL.cc. All the QSOs in this log has been marked as Modified in the eQSL.cc status field Tots els QSO d'aquest registre s'han marcat com a Modificats en el camp s'estat de l'eQSL.cc KLog could not mark the full log to be sent to eQSL El KLog no ha pogut marcar el registre complet per a enviar a l'eQSL QSO logged from WSJT-X: QSO enregistrat des del WSJT-X: It seems that you are running this version of KLog for the first time. Sembla que esteu executant aquesta versió del KLog per primera vegada. The setup will be open to allow you to do any new setup you may need. S'obrirà la configuració per permetre establir qualsevol paràmetre nou que calgui. KLog - ClubLog error KLog - Error del ClubLog KLog - eQSL error KLog - Error d'eQSL KLog - %1 KLog - %1 The logfile has been modified. El fitxer de registre s'ha modificat. Do you want to save your changes? Voleu desar els canvis? KLog - ADIF export KLog - Exportació ADIF Download from LoTW ... Baixa des del LoTW... Download the full log from LoTW ... Baixa el registre complet des del LoTW... ClubLog tools ... Eines del ClubLog... Upload the queued QSOs to ClubLog ... Puja els QSO en la cua a ClubLog... eQSL tools ... Eines d'eQSL... Upload the queued QSOs to eQSL.cc ... Puja els QSO en la cua a l'eQSL.cc... QRZ.com tools ... Eines de QRZ.com... Upload the queued QSOs to QRZ.com ... Puja els QSO en la cua a QRZ.com... Update cty.csv Actualitza el «cty.csv» Update Satellite Data Actualitza les dades dels satèl·lits Online manual (F1) ... Manual en línia (F1)... &Tips ... &Consells... &About ... &Quant a... About Qt ... Quant a les Qt... Check updates ... Comprova si hi ha actualitzacions... Your log has been updated with the LoTW downloaded QSOs. El registre s'ha actualitzat amb els QSO baixats del LoTW. KLog has updated %1 QSOs from LoTW. El KLog ha actualitzat %1 QSO des del LoTW. You have selected no callsign. KLog will complete the QSOs without a station callsign defined and those with the callsign you are entering here. No heu seleccionat cap indicatiu. El KLog marcarà els QSO sense cap indicatiu d'estació definit i aquells amb l'indicatiu que introduïu aquí. About ... Quant a... KLog - Update checking result KLog - Resultat de la comprovació d'actualitzacions UDP Server error The UDP server failed to %1. start or stop Error del servidor UDP El servidor UDP ha fallat en %1. Status of the DX entity. Estat de l'entitat DX. Name of the DX entity. Nom de l'entitat DX. QSO QSO QSL QSL eQSL eQSL Comment Comentari Others Altres My Data Les meves dades Satellite Satèl·lit DXCC DXCC Info Informació KLog - File not open KLog - Fitxer no obert It was not possible to open the debug file for writing. No debug log will be saved! No s'ha pogut obrir per escriptura el fitxer de depuració. No es desarà cap fitxer de depuració! Status bar ... Barra d'estat... KLog - Unexpected error KLog - Error inesperat KLog - Not valid call KLog - Indicatiu no vàlid Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. Afegir indicatius no vàlids al registre pot crear problemes en sol·licitar diplomes, exportar a fitxers ADIF o a altres sistemes o aplicacions. KLog - Select correct entity KLog - Seleccioneu l'entitat correcta No DXCC Sense DXCC None Sense You have requested to delete the QSO with: %1 Heu demanat suprimir el QSO amb: %1 Are you sure? Esteu segur? KLog needs to update the Entities database. Cal actualitzar la base de dades d'entitats del KLog. You have requested to delete several QSOs Heu sol·licitat suprimir diversos QSO The ClubLog upload process has finished with an error and the log was possibly not uploaded. El procés de pujada al ClubLog ha finalitzat amb un error i possiblement el registre no s'ha pujat. Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 Comproveu les vostres credencials, la connexió a Internet i el vostre compte al ClubLog. El codi d'error ha estat: %1 Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? Voleu marcar com a pujats tots els QSO pujats al ClubLog? KLog - ClubLog KLog - ClubLog Always check the current callsign in QRZ.com Upload queued QSOs to LoTW Do you want to update now? You seem to have never backed up or exported your log to ADIF. Your latest backup seems older than one month. Regular backups prevent data loss and are good operator practice. Once exported, copy your ADIF file to a safe place such as a USB drive, cloud drive or other offsite computer. KLog will remind you to backup on a monthly basis. Backup completed successfully KLog will remind you again in approximately one month. Backup failed. Periodic data backups are recommended to prevent data loss and corruption of your log. The setup will now open to allow you to change your settings. There was an error while updating to Yes the ClubLog QSO upload information. Hi ha hagut un error en actualitzar a Sí la informació de pujada del QSO al ClubLog. The ClubLog upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? El procés de pujada al ClubLog ha finalitzat i el KLog ha creat un fitxer (%1) a la carpeta del KLog. Voleu que el KLog elimini aquest fitxer? The file has not been removed. El fitxer no s'ha eliminat. It seems that there was something that prevented KLog from removing the file You can remove it manually. Sembla que hi ha hagut quelcom que ha evitat que el KLog elimini el fitxer El podeu eliminar manualment. The eQSL upload process has finished with an error and the log was possibly not uploaded. El procés de pujada a l'eQSL ha finalitzat amb un error i possiblement el registre no s'ha pujat. Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1 Comproveu les vostres credencials, la connexió a Internet i el vostre compte a l'eQSL. El codi d'error ha estat: %1 Do you want to mark as Uploaded all the QSOs uploaded to eQSL? Voleu marcar com a pujats tots els QSO pujats a l'eQSL? There was an error while updating to Yes the eQSL QSO upload information. Hi ha hagut un error en actualitzar a Sí la informació de pujada del QSO a l'eQSL. The eQSL upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? El procés de pujada a l'eQSL ha finalitzat i el KLog ha creat un fitxer (%1) a la carpeta del KLog. Voleu que el KLog elimini aquest fitxer? KLog - Exit KLog - Sortida &Import from ADIF ... &Importa des d'ADIF... Export to ADIF ... Exporta a ADIF... Export all logs to ADIF ... Exporta tots els registres a ADIF... &Print Log ... Im&primeix el registre... QSL tools ... Eines QSL... Find QSO to QSL Cerca QSO a les QSL Find DX-QSLs pending to receive Cerca les DX-QSL pendents de rebre Shows DX-QSLs for which requests or QSLs have been sent with no answer. Mostra les DX-QSL que s'han sol·licitat o els QSL enviats que no tenen resposta. Find requested pending to receive Cerca sol·licituds pendents de rebre Shows the DX-QSLs that have been requested. Mostra les DX-QSL que s'han sol·licitat. LoTW tools ... Eines LoTW... Queue all QSLs from this log to be sent Posa a la cua per a enviar tots els QSL d'aquest registre Mark all non-sent QSOs in this log as queued to be uploaded. Marca tots els QSO no enviats en aquest registre com a posats en cua per pujar. Queue all QSLs to be sent Posa a la cua per a enviar tots els QSL Put all the non-sent QSOs in the queue to be uploaded. Posa tots els QSO no enviats a la cua per pujar. Mark all queued QSOs from this log as sent Marca tots els QSO posats en cua d'aquest registre com a enviats Mark all queued QSOs as sent Marca tots els QSO posats en cua com a enviats Check the current callsign in QRZ.com Comprova l'indicatiu actual a QRZ.com &Debug ... &Depura... All pending QSOs of this log has been marked as queued for LoTW! Tots els QSO pendents d'aquest registre s'han marcat com a posats en cua per al LoTW! There was a problem to mark all pending QSOs of this log as queued for LoTW! Hi ha hagut un problema en marcar tots els QSO pendents d'aquest registre com a posats en cua per al LoTW! Your log has not been updated. El registre no s'ha actualitzat. No QSO was updated with the data coming from LoTW. This may be because of errors in the logfile or simply because your log was already updated. No s'ha actualitzat cap QSO amb les dades provinents del LoTW. Això pot passar per errors al fitxer de registre o senzillament perquè el registre ja estava actualitzat. All pending QSOs has been marked as queued for LoTW! Tots els QSO pendents s'han marcat com a posats en cua per al LoTW! All queued QSOs has been marked as sent to LoTW! Tots els QSO posats en cua s'han marcat com a enviats al LoTW! There was a problem to mark all queued QSOs of this log as sent to LoTW! Hi ha hagut un problema en marcar tots els QSO posats en cua d'aquest registre com a enviats al LoTW! It seems that there are no QSOs in the database. Sembla que no hi ha cap QSO a la base de dades. Awards Diplomes Search Cerca Log Registre DX-Cluster DX-Cluster No QSOs have been exported to ADIF. No s'ha exportat cap QSO a ADIF. KLog has exported %1 QSOs to the ADIF file: %2 El KLog ha exportat %1 QSO al fitxer ADIF: %2 Save ADIF File Desa el fitxer ADIF There was an error while updating to Yes the LoTW QSL sent information. Hi ha hagut un error en actualitzar a Sí la informació d'enviament QSL al LoTW. The LoTW upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? El procés de pujada al LoTW ha finalitzat i el KLog ha creat un fitxer (%1) a la carpeta del KLog. Voleu que el KLog elimini aquest fitxer? The file has been removed. El fitxer s'ha eliminat. Date/Time Data/hora KLog - QSO received KLog - S'ha rebut un QSO Station Callsign Indicatiu de l'estació Operator Callsign Indicatiu de l'operador Duplicated QSOs have to match another existing QSO with the same call, band, mode, date and time, taking into account the period that can be defined in the settings. Els QSO duplicats cal que coincideixin amb un altre QSO existent amb el mateix indicatiu, banda, mode, data i hora, atenint en compte que el període es pot definir a la configuració. KLog - Non-supported mode KLog - Mode no implementat A new mode not supported by KLog has been received from an external program or radio: El KLog ha rebut un mode nou no admès des d'un programa extern o ràdio: Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) Voleu mantenir la recepció d'aquestes alertes? (la desactivació d'aquestes alertes evitarà que es detectin els modes no vàlids) Native Error Error nadiu Recommendation: Recomanació: Periodically export your data to ADIF to prevent a potential data loss. Exporteu periòdicament les dades a ADIF per a evitar la pèrdua potencial de les dades. KLog - LoTW KLog - LoTW Upload the queued QSOs to LoTW Puja els QSO en la cua a LoTW The backup was done successfully La còpia de seguretat s'ha efectuat correctament KLog will remind you to backup your data again in aprox one month. El KLog us recordarà que feu una còpia de seguretat de les dades aproximadament dins un mes. The backup was not properly done. La còpia de seguretat no s'ha efectuat correctament. It is recommended to backup your data periodically to prevent lose or corruption of your log. És recomanable fer periòdicament còpia de seguretat de les dades per a evitar la pèrdua o la corrupció del registre. This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. Aquesta operació eliminarà definitivament els QSO seleccionats i les dades associades i no les podreu tornar a recuperar. The QRZ.com upload process has finished with an error and the log was possibly not uploaded. El procés de pujada a QRZ.com ha finalitzat amb un error i possiblement el registre no s'ha pujat. Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? Voleu marcar com a pujats tots els QSO pujats a QRZ.com? KLog - QRZ.com KLog - QRZ.com There was an error while updating to Yes the QRZ.com QSO upload information. Hi ha hagut un error en actualitzar a Sí la informació de pujada del QSO a QRZ.com. The QRZ.com upload process has finished successfully El procés de pujada a QRZ.com ha finalitzat correctament Call not found in QRZ.com Indicatiu no trobat a QRZ.com KLog - QRZ.com error KLog - Error de QRZ.com KLog - Stop the war in Ukraine! KLog - Aturem la guerra a Ucraïna! KLog - Stop the war in Ukraine! KLog - Aturem la guerra a Ucraïna! You are using a Russian call (%1). You can probably help to stop the Russian war, people are dying. Please call your leaders to stop the war. Esteu empreant un idenficador rus (%1). Probablement podeu ajudar a aturar la guerra russa, la gent està morint. Demaneu als vostres líders que aturin la guerra. You are using an Ukranian call. Please take care and protect yourself and your family. The KLog developers wish you the best of luck in this very difficult moment. Esteu emprant un identificador ucraïnès. Tingueu cura i protegiu-vos, també a la vostra família. Els desenvolupadors del KLog us desitgen molta sort en aquest moment tan difícil. People are dying in the war of Russia against Ukraine. You can help to stop the Russian war against Ukraine. Please show your disagreement to your leaders, or in your social network to stop the war. La gent està morint a la guerra de Rússia contra Ucraïna. Podeu ajudar la guerra russa contra Ucraïna. Mostre el vostre desacord amb els vostres líders, o en les vostres xarxes socials per a aturar la guerra. KLog - KLog folder not found KLog - No s'ha trobat la carpeta del KLog KLog - Settings update KLog - Actualització de la configuració The settings system has been changed and KLog will update your settings file. El sistema de configuració ha canviat i el KLog actualitzarà el fitxer de configuració. This version of KLog requires that the DXCC database is updated. Aquesta versió del KLog requereix que la base de dades DXCC s'actualitzi. The database will be updated. La base de dades s'actualitzarà. KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Llibre de registre de %2 - QSO: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 KLog-%1 - Llibre de registre de %2 - Indicatiu d'estació: %3 - QSO: %4 KLog - QRZ.com warning KLog - Avís de QRZ.com QRZ.com has returned a non-subcribed error and queries to QRZ.com will be disabled. QRZ.com ha retornat un error de no subscrit i s'han desactivat les consultes a QRZ.com. Please check your QRZ.com subcription or credentials. Comproveu la vostra subscripció a QRZ.com o les credencials. KLog has received an error from QRZ.com. El KLog ha rebut un error des de QRZ.com. You need to activate the %1 service in the eLog preferences. Cal activar el servei %1 a les preferències de l'eLog. It is important to export to ADIF and save a copy as a backup. És important exportar a ADIF i desar una còpia com a còpia de seguretat. Saving the log was done successfully. El desament del registre s'ha fet correctament. The ADIF export was not properly done. El desament ADIF no s'ha efectuat correctament. Settings ... Configuració... Queue all QSOs from this log to be sent Posa a la cua tots els QSO d'aquest registre per a enviar-los Queue all the QSOs to be uploaded Posa a la cua tots els QSO per a pujar Queue all the QSO to be uploaded Posa a la cua tots els QSO per a pujar Show Map Mostra el mapa Now you can upload them to LoTW. Ara els podeu pujar al LoTW. There was a problem to mark all pending QSOs as queued for LoTW! Hi ha hagut un problema en marcar tots els QSO pendents com a posats en cua per al LoTW! All queued QSOs of this log has been marked as sent to LoTW! Tots els QSO posats en cua d'aquest registre s'han marcat com a enviats al LoTW! There was a problem to mark all queued QSOs as sent to LoTW! Hi ha hagut un problema en marcar tots els QSO posats en cua com a enviats al LoTW! TQSL finished with no error. Do you want to mark as Sent all the QSOs uploaded to LoTW? El TQSL ha finalitzat sense cap error. Voleu marcar com a enviats tots els QSO pujats al LoTW? The selection you have done does not include any QSO The selection you have done does not include any QSO. La selecció que heu fet no inclou cap QSO. The log is ready to be uploaded to QRZ.com. Aquest registre està preparat per pujar-se a QRZ.com. All the QSOs in this log has been marked as Modified in the QRZ.com status field Tots els QSO d'aquest registre s'han marcat com a Modificats en el camp s'estat de QRZ.com KLog could not mark the full log to be sent to QRZ.com El KLog no ha pogut marcar el registre complet per a enviar a QRZ.com To upload QSOs you need a qrz.com subscription. If you have one, go to Setup->QRZ.com tab to enable it. Per pujar els QSO cal una subscripció a QRZ.com. Si en teniu una, aneu a la pestanya Configuració->QRZ.com per activar-la. You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. Cal definir una clau adequada de l'API per al vostre llibre de registre de QRZ.com a les preferències de l'eLog. Open File Obre un fitxer - Needed for DXMarathon - Necessari per DXMarathon Abort filling Interromp l'ompliment Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: S'està omplint DXCC, CQz, ITUz, continent al QSO... QSO: Number Número Callsign Indicatiu Band Banda Mode Mode Print Log Imprimeix el registre Abort printing Interromp la impressió Printing the log ... S'està imprimint el registre... Printing the log... QSO: S'està imprimint el registre... QSO: The following QSO data has been received from WSJT-X to be logged: S'han rebut les dades QSO següents des del WSJT-X per a enregistrar: Freq Freq Time On Hora d'inici Time Off Hora final RST TX RST TX RST RX RST RX DX-Grid DX-Grid Local-Grid Local-Grid KLog - WSJTX Dupe QSO KLog - QSO duplicat del WSJTX This QSO seems to be duplicated. Do you want to save or discard it? Sembla que aquest QSO és duplicat. El voleu desar o descartar? If the received mode is correct, please contact KLog development team and request support for that mode Si el mode rebut és correcte, contacteu amb l'equip de desenvolupament del KLog i sol·liciteu la implementació d'aquest mode KLog - QSO Dupe A dupe QSO has been detected in the file and will not be added to the log. Please check the QSO information file and ensure it is properly added. KLog - Duplicated satellite KLog - Satèl·lit duplicat A duplicated satellite has been detected in the file and will not be imported. S'ha detectat un satèl·lit duplicat al fitxer i no s'importarà. Please check the satellite information file and ensure it is properly populated. Comproveu el fitxer d'informació del satèl·lit i assegureu que estigui correctament omplert. Now you will see a more detailed error that can be used for debugging... Ara veureu un error més detallat que es pot usar per a la depuració... An unexpected error ocurred!! Hi ha hagut un error inesperat!! If the problem persists, please contact the developers Si el problema persisteix, contacteu amb els desenvolupadors for analysis: per a l'anàlisi: Error in function Error a la funció Error text Text de l'error Failed query Ha fallat la consulta KLog - Show errors KLog - Mostra els errors Do you want to keep showing errors? Voleu mantenir la visualització dels errors? MainWindowInputComment Comment Comentari Add a comment for this QSO. Afegeix un comentari per a aquest QSO. Keep this data Mantén aquestes dades Data entered in this tab will be copied into the next QSO. Les dades introduïdes en aquesta pestanya es copiaran en el QSO següent. MainWindowInputEQSL Date of the ClubLog upload. Data de la pujada al ClubLog. Date of the QRZ.com upload. Data de la pujada a QRZ.com. Date of the eQSL sending. Data de l'enviament de la eQSL. Date of the eQSL reception. Data de la recepció de la eQSL. Date of the LoTW sending. Data de l'enviament del LoTW. Date of the LoTW reception. Data de la recepció del LoTW. Status on QRZ.com. Estat al QRZ.com. Status of the LoTW sending. Estat de l'enviament del LoTW. Status of the LoTW reception. Estat de la recepció del LoTW. QRZ.com QRZ.com LoTW Sent LoTW enviat LoTW Rec LoTW rebut Status on ClubLog. Estat al ClubLog. Status of the eQSL sending. Estat de l'enviament de la eQSL. Status of the eQSL reception. Estat de la recepció de la eQSL. ClubLog ClubLog eQSL Sent eQSL enviada eQSL Rec eQSL rebuda MainWindowInputOthers Primary Div Div principal Secondary Div Div secundària IOTA IOTA Entity Entitat Propagation mode Mode de propagació Others Altres Keep propagation mode Mantén el mode de propagació Select the primary division for this QSO. Selecciona la divisió primària per aquest QSO. Select the secondary division for this QSO. Selecciona la divisió secundària per aquest QSO. Select the entity for this QSO. Selecciona l'entitat per aquest QSO. Select the propagation mode for this QSO. Selecciona el mode de propagació per aquest QSO. Select the IOTA continent for this QSO. Seleccioneu el continent IOTA per aquest QSO. Select the IOTA reference number for this QSO. Seleccioneu el número de referència IOTA per aquest QSO. Keeps the same propagation mode for next QSO. Mantén el mateix mode de propagació per al QSO següent. Select the appropriate ADIF field for this QSO. Selecciona el camp apropiat de l'ADIF per a aquest QSO. Value for the selected ADIF field. Valor per al camp ADIF seleccionat. Not Identified No identificat Not - Not Identified Not - No identificat SOTA Ref Referència SOTA Age Antiguitat VUCC grids Quadrícules VUCC Distance Distància MainWindowInputQSL QSL Sent QSL enviada QSL Rec QSL rebuda QSL Via QSL via QSL Msg Missatge QSL Status of the QSL sending. Estat de l'enviament de la QSL. Status of the QSL reception. Estat de la recepció de la QSL. QSL sending information. Informació d'enviament de la QSL. QSL reception information. Informació de recepció de la QSL. Date of the QSL sending. Data de l'enviament de la QSL. Date of the QSL reception. Data de la recepció de la QSL. Message of the QSL. Missatge de la QSL. QSL via information. QSL via informació. MainWindowInputQSO TX RST. TX RST. RX RST. RX RST. TX Frequency in MHz. Freqüència de TX en MHz. RX Frequency in MHz. Freqüència de RX en MHz. Power used by the contacted station. Potència usada per l'estació contactada. Name of the contacted operator. Nom de l'operador contactat. QTH of the contacted station. QTH de l'estació contactada. Locator of the contacted station. Localitzador de l'estació contactada. Watts Watts MHz MHz Split Translator: Split is a common hamradio term. Do not translate unless you are sure. Split Name Nom QTH QTH DX Locator Localitzador DX Power(rx) Potència (rx) RST TX RX Frequency Freqüència RST(tx) RST (tx) RST(rx) RST(rx) Freq TX Freq TX Freq RX Freq RX DX QTH locator. Localitzador QTH de DX. DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. Localitzador DX QTH. El format hauria de ser «Maidenhead» semblant a IN70AA de fins a 10 caràcters. TX Frequency in MHz. Frequency is not in a hamradio band! Freqüència TX en MHz. La freqüència no es en una banda de radioafició! RX Frequency in MHz. Frequency is not in a hamradio band! Freqüència RX en MHz. La freqüència no es en una banda de radioafició! MainWindowMyDataTab Watts Watts Keep this data Mantén aquestes dades My QTH locator. El meu localitzador QTH. Power Potència Operator callsign Indicatiu de l'operador Station Callsign Indicatiu de l'estació My Locator El meu localitzador My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. El meu localitzador QTH. El format hauria de ser «Maidenhead» (p. ex. IN70AA) de fins a 10 caràcters. My Rig El meu equip My Antenna La meva antena My SOTA_Ref La meva referència SOTA My VUCC_GRIDS Les meves Quadrícules_VUCC MainWindowSatTab Keep this data Mantén aquestes dades Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Nom del satèl·lit si no és a la llista. Seleccioneu: «%1» per activar aquest quadre. (format semblant AO-51). Satellite mode used. Mode usat de satèl·lit. Select the satellite you are using. Seleccioneu el satèl·lit que esteu usant. UpLink band. Banda de pujada (UpLink). DownLink band. Banda de baixada (DownLink). Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. Localitzador de l'estació DX. Aquest quadre està sincronitzat amb el quadre Localitzador de la pestanya QSO. UpLink Pujada DownLink Baixada Satellite Satèl·lit Mode Mode DX Locator Localitzador DX Other Altres MHz MHz Locator of the DX station. Format should be Maidenhead like IN70AA up to 10 characters. Localitzador de l'estació DX. El format hauria de ser «Maidenhead» (p. ex. IN70AA) de fins a 10 caràcters. Not Sat QSO QSO sense satèl·lit KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. El KLog ha detectat un nom de satèl·lit que no reconeix. En el seu lloc, caldria usar un dels noms coneguts de satèl·lit. Seleccioneu-lo de la llista. Alternativament, contacteu amb l'equip de desenvolupament per afegir el nom nou de satèl·lit. Please be aware that the satellite name will not be saved if it is not in the list, so that information may be lost! Tingueu en compte que el nom del satèl·lit no es desarà si no és a la llista, i per tant, aquesta informació es podria perdre! RX Frequency in MHz. Frequency is not in a hamradio band! Freqüència RX en MHz. La freqüència no es en una banda de radioafició! RX Frequency in MHz. Freqüència de RX en MHz. TX Frequency in MHz. Frequency is not in a hamradio band! Freqüència TX en MHz. La freqüència no es en una banda de radioafició! TX Frequency in MHz. Freqüència de TX en MHz. Other - Sat not in the list Altres - El satèl·lit no és a la llista Data entered in this tab will be copied into the next QSO. Les dades introduïdes en aquesta pestanya es copiaran en el QSO següent. The satellite you have in your QSO is: El satèl·lit que hi ha al QSO és: MapWindowWidget Select QSOs in this band. Selecciona els QSO d'aquesta banda. Select QSOs in this mode. Selecciona els QSO d'aquest mode. Select QSOs in this propagation mode. Selecciona els QSO d'aquest mode de propagació. Select QSOs using this Satellite. Selecciona els QSO que usin aquest satèl·lit. Only confirmed Només els confirmats Select only confirmed QSOs. Selecciona només els QSO confirmats. All bands Totes les bandes Show nothing No mostris res All modes Tots els modes All propagation modes Tots els modes de propagació All satellites Tots els satèl·lits OnlineMessageWidget The server returned the following error: %1 El servidor ha retornat l'error següent: %1 Not identified No identificat QObject Database Error Error de base de dades KLog DB needs to be upgraded. La BD del KLog necessita actualitzar-se. Do you want to upgrade it now? La voleu actualitzar ara? If DB is not upgraded KLog may not work properly. Si la BD no s'actualitza, el KLog podria no funcionar adequadament. Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea. L'actualització de programari pot provocar problemes potencials. Sempre és una bona idea fer un còpia de seguretat de la BD. Do you want to backup your DB now? Voleu fer ara una còpia de seguretat de la BD? The backup finished successfully. La còpia de seguretat ha finalitzat correctament. You can find the backup in this file: %1 Podeu trobar la còpia de seguretat en aquest fitxer: %1 The backup was not properly done. La còpia de seguretat no s'ha efectuat correctament. You will be sent back to the starting point. Retornareu al punt d'inici. KLog - DB can't be updated automatically KLog - No s'ha pogut actualitzar automàticament la BD You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version. S'està actualitzant des d'una versió massa antiga del KLog i aquesta actualització no es pot fer automàticament des d'aquesta versió. KLog - DB update KLog - Actualitza la BD KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. El KLog ha detectat un registre anterior a la BD. Es migraran totes les dades a un registre de tipus DX creat de nou. KLog: Enter Station callsign KLog: Introduïu l'indicatiu de l'estació Enter the station callsign used in this log Introduïu l'indicatiu emprat en aquest registre Station Callsign Indicatiu de l'estació QSO: QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? La cancel·lació d'aquesta actualització provocarà inconsistència de dades i possiblement pèrdua de dades. Encara voleu cancel·lar? Progress: Progrés: Updating DXCC award information... Actualització de la informació dels diplomes DXCC... Updating DXCC Award information... Actualització de la informació dels diplomes DXCC... Updating WAZ award information... Actualització de la informació dels diplomes WAZ... Updating WAZ Award information... Actualització de la informació dels diplomes WAZ... Updating mode information... Actualitzant informació del mode... The process to upgrade is: - Using an old KLog version export your log to ADIF. - Remove your logbook.dat file from your KLog folder. - Install the new KLog version. - Import your ADIF file. KLog will finish when you click on OK. El procés per actualitzar és: - Usant una versió antiga del KLog, exportar el registre a ADIF. - Eliminar el fitxer «logbook.dat» de la carpeta del KLog. - Instal·lar la versió nova del KLog. - Importar el fitxer ADIF. El KLog finalitzarà quan feu clic a D'acord. All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay. Totes les dades s'han migrat correctament. Ara cal anar a Configuració -> Preferències -> Registres per a comprovar que tot és correcte. Abort updating Interromp l'actualització Updating bands information... Actualitzant informació de bandes... Updating bands information in %1 status... Actualitzant informació de bandes en %1... Updating mode information in %1 status... Actualitzant informació dels modes en %1... New One, work it! nNew One, work it! Un de nou, treballeu-ho! Needed, work it! Necessari, treballeu-ho! Worked but not confirmed Treballat però no confirmat Confirmed Confirmat Not identified No identificat KLog is already running. KLog ja s'està executant. It is allowed to run only one instance. Es permet executar només una instància. Install wizard was canceled before completing... L'assistent d'instal·lació s'ha cancel·lat abans de finalitzar... Do you want to remove the KLog dir from your disk? Voleu eliminar el directori del KLog del disc? Your KLog dir has been removed S'ha eliminat el directori del KLog I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. No s'ha pogut eliminar el directori del KLog. Caldria fer-ho manualment si el voleu eliminar del disc dur. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. No s'ha pogut eliminar el directori del KLog. Caldria fer-ho manualment si el voleu eliminar del disc dur. Remember that your KLog dir is on your system... Recordeu que el directori del KLog és al vostre sistema... Thank you for running KLog! Moltes gràcies per usar el KLog! Updating information... S'està actualitzant la informació... Updating DXCC and Continent information... S'està actualitzant la informació dels DXCC i del continent... A wrong callsign has been found: %1. Please enter a new callsign or confirm that the current one is a good callsign. S'ha trobat un indicatiu incorrecte: %1. Introduïu un indicatiu nou o confirmeu que l'actual és un indicatiu correcte. An empty callsign has been detected. If it is possible, please enter the right call. S'ha detectat un indicatiu buit. Introduïu l'indicatiu correcte, si és possible. KLog - Not valid callsign found KLog - S'ha trobat un indicatiu no vàlid Date Data Call Indicatiu RSTtx RSTtx RSTrx RSTrx Band Banda Comment Comentari Mode Mode CQz CQz ITUz ITUz DXCC DXCC Address Adreça Age Antiguitat County Comtat A_Index A_Ãndex Ant_Az Ant_Az Ant_El Ant_El Ant_Path Ant_Camí ARRL_SECT ARRL_SECT Award_Submitted Diploma_enviat Award_granted Diploma_atorgat Band_RX Banda_RX CheckContest ComprovacióConcurs Class Classe ClubLog SDate ClubLog SDate ClubLog status ClubLog estat Continent Continent Contacted Op OP Contactat Contest Id ID concurs Country País Credit Submitted Crèdit Enviat Credit granted Crèdit Atorgat Dark Dok Do not translate if unsure, common hamradio term. Dark Dok Fists Do not translate if unsure, common hamradio term. Fists Fists CC Do not translate if unsure, common hamradio term. Fists CC My Fists Do not translate if unsure, common hamradio term. My Fists Nr bursts Do not translate if unsure, common hamradio term. Nr bursts Nr pings Do not translate if unsure, common hamradio term. Nr pings Sat mode Mode de satèl·lit SWL Do not translate if unsure, common hamradio term. SWL Ten-Ten Do not translate, it is a hamradio group name. Ten-Ten Distance Distància Contacted_Op OP_contactat Email Correu electrònic EQ_Call EQ_Call eQSL RDate eQSL RDate eQSL SDate eQSL SDate eQSL Rcvd eQSL rebuda eQSL Sent eQSL enviada Force Init Force Init Freq Freq Freq RX Freq RX Gridsquare Gridsquare Guest OP OP convidat HRDLog SDate HRDLog SDate HRDLog status HRDLog estat IOTA IOTA IOTA Island id ID illa IOTA K Index K Ãndex Lat Lat Lon Lon LoTW RDate LoTW RDate LoTW SDate LoTW SDate LoTW Rcvd LoTW rebut LoTW Sent LoTW enviat Max Bursts Màx ràfegues MS Shower Pluja MS My Antenna La meva antena My City La meva ciutat My Cnty El meu comtat My Country El meu país My CQz La meva CQz My DXCC El meu DXCC My Gridsquare El meu Gridsquare My IOTA El meu IOTA My IOTA island id El meu ID d'illa IOTA My ITUz La meva ITUz My Lat La meva Lat My Lon La meva Lon My Name El meu nom My Postal code El meu codi postal My Rig El meu equip My Sig El meu SIG My Sig Info La informació del meu SIG My SOTA ref La meva referència SOTA My State El meu estat My Street El meu carrer My USACA counties El meu comtats USACA My VUCC grids Les meves quadrícules VUCC Name Nom Notes Notes Operator Operador Owner Callsign Indicatiu de l'operador Pfx Pfx Precedence Precedència Prop Mode Mode prop Public Key Clau pública QRZcom SDate QRZcom SDate QRZcom status QRZcom estat QSL msg Missatge QSL QSL RDate QSL RDate QSL SDate QSL SDate QSL Rcvd QSL rebuda QSL Sent QSL enviada QSL rcvd via QSL rebuda via QSL sent via QSL enviada via QSL via QSL via QSO complete QSO completa QSO random QSO aleatòria QTH QTH Region Regió Rig Equip RX Pwr Potència RX Sat name Nom sat SFI SFI Sig SIG Sig Info Info del SIG Silent key Do not translate if unsure, common hamradio term. Silent key SKCC SKCC SOTA Ref Referència SOTA SRX String Cadena SRX SRX SRX STX String Cadena STX State Estat Submode Submode UKSMG UKSMG USACA counties Comtats USACA VE prov VE prov VUCC grids Quadrícules VUCC TX Pwr Potència TX Web Web QSO Date off Data fi QSO Log number Número de registre SearchWidget &Clear &Neteja &Select All &Selecciona-ho tot &Search &Cerca &Export Highlighted &Exporta els ressaltats All logs Tots els registres Clear the searches. Neteja les cerques. Export the search result to an ADIF file. Exporta el resultat de la cerca a un fitxer ADIF. Select/Unselect all the QSOs shown. Selecciona/Desselecciona tots els QSO mostrats. Search in the log. Cerca al registre. Search in all logs. Cerca a tots els registres. Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs! Introduïu l'indicatiu a cercar. Introduïu «*» per a mostrar tots els QSO... pot ser lent als registres grans! Select the Station Callsign used to do this QSO. Seleccioneu l'indicatiu d'estació usat per fer aquest QSO. All in log A tot el registre Not defined No s'ha definit &Clear selection &Neteja la selecció Save File Desa fitxer You have requested to delete the QSO with: %1 Heu demanat suprimir el QSO amb: %1 Are you sure? Esteu segur? SearchWindow Date/Time Data/hora Band Banda Mode Mode QSL Sent QSL enviada QSL Rcvd QSL rebuda Station Callsign Indicatiu de l'estació ID ID Call Trucada Date/time Data/hora Station callsign Indicatiu de l'estació QSL Send QSL enviada &Delete &Suprimeix Delete a QSO Suprimeix un QSO &Edit QSO &Edita QSO Edit this QSO Edita aquest QSO Via &bureau Via &bureau Send this QSL via bureau Envia aquesta QSL via bureau D&irect D&irecta Send this QSL via direct Envia aquesta QSL via directa Via bureau Via bureau QSL &received via bureau QSL &rebuda via bureau Direct Directa QSL received via direc&t QSL rebuda via direc&ta Check in QRZ.com Comprova a QRZ.com Check this callsign in QRZ.com Comprova aquest identificador a QRZ.com Check in DXHeat.com Comprova a DXHeat.com Check this callsign in DXHeat.com Comprova aquest identificador a DXHeat.com &Request my QSL &Sol·licita la meva QSL Mark my QSL as requested Marca la meva QSL com a sol·licitada Via Direct and mark DX QSL as requested Via directa i marca la DX QSL com a sol·licitada Send this QSL via direct and mark DX QSL as requested Envia aquesta QSL via directa i marca la DX QSL com a sol·licitada Via Bureau and mark DX QSL as requested Via bureau i marca la DX QSL com a sol·licitada Send this QSL via bureau and mark DX QSL as requested Envia aquesta QSL via bureau i marca la DX QSL com a sol·licitada &Request the QSL &Sol·licita la QSL Mark the QSL as requested Marca la QSL com a sol·licitada Via bureau and mark my QSL as requested Via bureau i marca la meva QSL com a sol·licitada QSL received via bureau and mark my QSL as requested QSL rebuda via bureau i marca la meva QSL com a sol·licitada Direc&t and mark as my QSL requested Direc&ta i marca la meva QSL com a sol·licitada QSL received via direct and mark my QSL as requested QSL rebuda via directa i marca la meva QSL com a sol·licitada Needed QSO to send the QSL QSO necessari per enviar la QSL My QSL requested to be sent La meva QSL sol·licitada per enviar DX QSL pending to be received QSL del DX pendent de rebre SetupDialog User data Dades de l'usuari Bands/Modes Bandes/modes DX-Cluster DX-Cluster Colors Colors Misc Varis World Editor Editor mundial Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Aneu a la pestanya Varis i feu clic a Mou la BD o la BD no es mourà a la ubicació nova. Cancel Cancel·la Satellites Satèl·lits HamLib HamLib eLog eLog OK D'acord D&X-Cluster D&X-Cluster Log widget Giny de registre WSJT-X WSJT-X Settings Configuració You need to enter at least one log in the Logs tab. Com a mínim cal introduir un registre a la pestanya Registres. Do you want to add one log in the Logs tab or exit KLog? (Click Yes to add a log or No to exit KLog) Voleu afegir un registre a la pestanya de Registres o sortir del KLog? (Feu clic a Sí per afegir un registre o No per a sortir del KLog) DB has not been moved to new path. La BD no s'ha mogut al camí nou. You need to enter at least a valid callsign. Com a mínim cal introduir un indicatiu vàlid com a mínim. Go to the User tab and enter valid callsign. Aneu a la pestanya Usuari i introduïu un indicatiu vàlid. You will be redirected to the Log tab. Please add and select the kind of log you want to use. Sereu redirigit a la pestanya Registre. Afegiu i seleccioneu la classe de registre que voleu usar. You have not selected the kind of log you want. No heu seleccionat la classe de registre que voleu. Logs Registres World Mundial SetupEntityDialog Entity Entitat CQ CQ ITU ITU Latitude Latitud Longitude Longitud UTC UTC Main prefix Prefix principal ARRL ID ARRL ID Comma separated possible prefixes, e.g. EA1, EA2, ... Prefixos possibles separats per comes, p. ex. EA1, EA2, ... Prefixes Prefixos Name of the Entity. Nom de l'entitat. CQ zone. Zona CQ. ITU zone. Zona ITU. Longitude of the Entity. Longitud de l'entitat. Local time difference to UTC. Diferència de l'hora local respecte a UTC. Main prefix of the entity. Prefix principal de l'entitat. ARRL ID. ARRL ID. Date of the deletion. Data de la supressió. Deleted Suprimit Cancel Cancel·la Ok D'acord Entity Dialog Diàleg d'entitat SetupPageBandMode Bands Bandes Modes Modes SetupPageColors New One Un de nou Needed in this band Necessari en aquesta banda Worked in this band Treballat en aquesta banda Confirmed in this band Confirmed Confirmat en aquesta banda Default Predeterminat WSJT-X palette Paleta WSJT-X Default palette Paleta predeterminada Dark Mode Mode fosc Color when the DXCC is an ATNO (All Time New One). Color quan el DXCC és un ATNO («All Time New One», Un de nou de tots els temps ). DXCC is confirmed in this band. El DXCC està confirmat en aquesta banda. Default color. Color predeterminat. Sets a palette of colors similar to the one used in WSJT-X. Estableix una paleta de colors semblant a la usada al WSJT-X. Sets the default palette. Estableix la paleta predeterminada. Light Mode Mode clar This DXCC was worked before in another band but not in the selected band. It may be needed due to the CQ, ITU, Grid, ... Aquest DXCC va funcionar abans en una altra banda però no en la banda seleccionada. Pot haver estat necessari pel CQ, ITU, Grid, ... Worked DXCC, but not confirmed in this band. DXCC treballat, però no confirmat en aquesta banda. Sets the Dark Mode Estableix el mode fosc Choose a color Escolliu un color SetupPageDxCluster Add Afegeix Delete Suprimeix Show &HF spots Show HF spots Mostra els avisos en &HF Show V/&UHF spots Show V/UHF spots Mostra els avisos en V/&UHF Show W&ARC spots Show WARC spots Mostra els avisos en W&ARC Show &worked spots Show worked spots Mostra els a&visos treballats Show &confirmed spots Show confirmed spots Mostra els avisos &confirmats Show ANN/&FULL messages Show ANN/FULL messages Mostra els missatges ANN/&FULL Show WW&V messages Show WWV messages Mostra els missatges WW&V Show WC&Y messages Show WCY messages Mostra els missatges WC&Y Save DX Cluster activity Desa l'activitat del DX Cluster Saves all the DX-Cluster activity to a file in the KLog folder Desa tota l'activitat del DX Cluster a un fitxer a la carpeta del KLog Send DX Spots to the map Envia els avisos DX al mapa Sends the received DX Spots to the map to know where is the activity. Envia els avisos DX rebuts al mapa per a conèixer a on és l'activitat. DX Spots Avisos DX Others Altres Messages Missatges KLog: Add a DXCluster server Kontest: Add a DXCluster server KLog: Afegeix un servidor DXCluster Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default.: Afegeix l'adreça seguida de :port Exemple: dxfun.com:8000 Si no s'especifica port, s'usarà 41112 de forma predeterminada: SetupPageELog ClubLog password Contrasenya del ClubLog ClubLog App password Contrasenya de l'aplicació ClubLog ClubLog email Correu electrònic del ClubLog Enter the email you used to register in ClubLog. Introduïu el correu electrònic usat per registrar-se al ClubLog. Enter your password ClubLog here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Introduïu aquí la contrasenya per al ClubLog. Avís: La contrasenya es desarà en text tal qual al fitxer de configuració del KLog! (Si no voleu introduir la contrasenya, el KLog la preguntarà quan sigui necessària) Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!! Introduïu aquí la contrasenya de l'aplicació ClubLog. Es pot obtenir al ClubLog (menú Configuració -> Contrasenyes d'aplicacions). Avís: la contrasenya de l'aplicació es desarà en clar al fitxer de configuració del KLog!! Send QSOs in real time Envia els QSO en temps real Activate ClubLog Activa el ClubLog Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Envia cada QSO al ClubLog en temps real, quan s'afegeixin (o es modifiquin) en el KLog. Starts the ClubLog support in KLog. Inicia l'admissió del ClubLog al KLog. Activate eQSL.cc Activa l'eQSL.cc Enter your username of eQSL.cc. Introduïu el nom d'usuari de l'eQSL.cc. Enter your password eQSL.cc here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Introduïu aquí la contrasenya per a l'eQSL.cc. Avís: La contrasenya es desarà en text tal qual al fitxer de configuració del KLog! (Si no voleu introduir la contrasenya, el KLog la preguntarà quan sigui necessària) eQSL.cc password Contrasenya de l'eQSL.cc eQSL.cc user Usuari de l'eQSL.cc ClubLog ClubLog eQSL.cc eQSL.cc QRZ.com QRZ.com Enter the user of your QRZ.com account. You need to be subscribed to QRZ.com to use this service. Introduïu l'usuari del vostre compte a QRZ.com. Cal estar subscrit a QRZ.com per a usar aquest servei. User Usuari Enter your password QRZ.com here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Introduïu aquí la contrasenya per a QRZ.com. Avís: La contrasenya es desarà en text tal qual al fitxer de configuració del KLog! (Si no voleu introduir la contrasenya, el KLog la preguntarà quan sigui necessària) Password Contrasenya Activate QRZ.com Activa QRZ.com Check automatically Comprova automàticament Check in Qrz.com all Calls as they are entered Comprova a QRZ.com tots els indicatius a mesura que s'entrin Paying Subscriber Subscriptor de pagament Check it if you are paying for a qrz.com subscription Comproveu si esteu pagant una subscripció a QRZ.com LogBook Key Clau del LogBook LogBook Key for QSO uploading. You can get this key in your QRZ.com logbook webpage. Remember that you need a QRZ.com subscription to use this feature. Clau del LogBook per a pujar QSO. Aquesta clau es pot aconseguir a la pàgina web del vostre «logbook» de QRZ.com. Recordeu que cal una subscripció a QRZ.com per a usar aquesta funcionalitat. LoTW LoTW Upload Pujada Download Baixada TQSL path Camí al TQSL Use TQSL Usa el TQSL LoTW password Contrasenya de LoTW LoTW user Usuari de LoTW Enter your LoTW user. Introduïu l'usuari de LoTW. Enter your password LoTW here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Introduïu aquí la contrasenya per al LoTW. Avís: La contrasenya es desarà en text tal qual al fitxer de configuració del KLog! (Si no voleu introduir la contrasenya, el KLog la preguntarà quan sigui necessària) Path to the TQSL software. Camí al programari del TQSL. Enable the LoTW integration with TQSL. You will need to have TQSL installed Activa la integració LoTW amb el TQSL. Cal tenir instal·lat el TQSL Select File Selecció de fitxer SetupPageHamLib Activate HamLib Activa la HamLib Activates the hamlib support that will enable the connection to a radio. Activa la implementació de la «hamlib» que activarà la connexió a la ràdio. Read-Only mode Mode de només lectura If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio. Si està activat, el KLog llegirà la freqüència i el mode des de la ràdio però mai enviarà cap ordre a la ràdio. Radio Ràdio Select your rig. Seleccioneu el vostre equip. Serial Sèrie Network Xarxa Defines the interval to poll the radio in msecs. Defineix l'interval de sondeig de la ràdio en ms. Poll interval Interval de sondeig Test: OK Prova: Correcta Test: NOK Prova: No correcta Test Prova Click to test the connection to the radio Feu clic per a provar la connexió a la ràdio SetupPageLogView Fields Camps SetupPageLogs &New New &Nou &Edit &Edita &Remove &Elimina KLog KLog Do you really want to remove this log? Esteu segur que voleu eliminar aquest registre? Operators Operadors QSOs QSO An error has occurred showing the following error code: Hi ha hagut un error en mostrar el codi d'error següent: Log has not been removed. (#3) No s'ha eliminat el registre. (#3) Add a new log. Afegeix un registre nou. Edit the selected log. Edita el registre seleccionat. Remove the selected log. Elimina el registre seleccionat. All the QSOs from this log will also be deleted... Tots els QSO d'aquest registre també se suprimiran... Log has not been removed. (#2) No s'ha eliminat el registre. (#2) Log has not been removed. (#1) No s'ha eliminat el registre. (#1) The new log could not be created. No s'ha pogut crear el registre nou. KLog - SetupPageLogs KLog - SetupPageLogs ID ID Station Callsign Indicatiu de l'estació Comments Comentaris Date Data SetupPageLogsNew &Ok D'ac&ord &Cancel &Cancel·la &Date &Data &Station Callsign Indicatiu d'e&stació &Operators &Operadors Comm&ent Com&entari Callsign used for this log. Indicatiu usat per aquest registre. Comma separated list of operators: callsign1, callsign2. Llista separada per comes dels operadors: indicatiu1, indicatiu2. Start date of this log. Data inicial d'aquest registre. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. Afegiu un comentari quant a aquest registre. Si està omplert, es mostrarà al títol principal del KLog per a identificar el registre. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. Cal introduir un indicatiu vàlid a la casella d'indicatiu d'estació. El registre no s'obrirà. SetupPageMisc &Imperial system Imperial system Sistema &imperial &Log in real time Log in real time &Registre en temps real &Time in UTC Time in UTC Hora en U&TC &Save ADIF on exit Save ADIF on exit De&sa l'ADIF en sortir Use this &default filename Use this default filename Usa aquest nom de fitxer pre&determinat Mark &QSO to send QSL when QSL is received Mark QSO to send QSL when QSL is received Marca el &QSO per enviar QSL quan es rebi la QSL Complete QSO with previous data Completa QSO amb dades prèvies Manage DX-Marathon Gestiona una marató DX Activate the application debug log Activa el registre de depuració de l'aplicació &Delete always temp ADIF file after uploading QSOs &Suprimeix sempre el fitxer ADIF temporal després de pujar els QSO Move DB Mou la BD In seconds, enter the time range to consider a duplicate if same call, band and mode is entered. Introduïu l'interval horari, en segons, per a considerar un duplicat si s'introdueix els mateixos indicatius, bandes i modes. If you disable this checkbox KLog will not check callsigns to identify wrong callsigns. Si desactiveu aquesta casella de verificació, el KLog no comprovarà els indicatius per a identificar indicatius erronis. Check it for Imperial system (Miles instead of Kilometers). Activeu-ho per al sistema imperial (milles en lloc de kilòmetres). Select to use the following name for the logfile without being asked for it again. Seleccioneu l'ús del nom següent com a fitxer de registre sense tornar-ho a preguntar. Select if you want to manage DX-Marathon. Seleccioneu si voleu gestionar la marató DX. This is the default file where ADIF data will be saved. Aquests és el fitxer predeterminat a on es desaran les dades ADIF. This is the directory where the database (logbook.dat) will be saved. Aquest és el directori a on es desarà la base de dades (logbook.dat). Click to change the path of the database. Cliqueu per canviar el camí a la base de dades. Activates the application debug log. This may be useful if something is not working as expected. A debug file will be created in the KLog directory. Activa el registre de depuració de l'aplicació. Això pot ser útil si hi ha quelcom que no funciona com s'espera. Es crearà un fitxer de depuració en el directori del KLog. Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default. Cliqueu per canviar com a posat a la cua (per enviar) tots els eQSL (LoTW i eQSL) a tots els QSO nous de manera predeterminada. Delete Always the adif file created after uploading QSOs Suprimeix sempre el fitxer ADIF creat després de pujar els QSO Dupe time range: Interval de temps dels «dupe»: Please specify an existing directory where the database (logbook.dat) will be saved. Especifiqueu un directori existent a on es desarà la base de dades (logbook.dat). This is the directory where DB (logbook.dat) will be saved. Aquest és el directori a on es desarà la BD (logbook.dat). Check non-valid calls Comprova els indicatius no vàlids Show seconds Mostra els segons Mark sent eQSL && LoTW in new QSO as queued Marca els eQSL enviats i LoTW als QSO nous com a posats a la cua Show seconds in the QSO editor Mostra els segons a l'editor de QSO Click to change the default ADIF file. Cliqueu per canviar el fitxer ADIF predeterminat. Click to move the DB to the new directory. Cliqueu per moure la BD a un directori nou. Select the application debug log level. This may be useful if something is not working as expected. A debug file will be created in the KLog directory and/or shown with Help->Debug menu. Selecciona el nivell de registre de depuració de l'aplicació. Això pot ser útil si hi ha quelcom que no funciona com s'espera. Es crearà un fitxer de depuració en el directori del KLog i/o es mostra amb el menú Ajuda->Depura. Log level Nivell de registre Select Directory Selecció de directori KLog - Move DB KLog - Mou la BD File moved S'ha mogut el fitxer File copied S'ha copiat el fitxer File already exist. El fitxer ja existeix. The destination file already exist and KLog will not replace it. Please remove the file from the destination folder before moving the file with KLog to make sure KLog can copy the file. El fitxer de destinació ja existeix i el KLog no el substituirà. Suprimiu el fitxer de la carpeta de destinació abans de moure el fitxer amb el KLog per assegurar que el KLog pot copiar el fitxer. File NOT copied NO s'ha copiat el fitxer The file was not copied due to an unknown problem. No s'ha copiat el fitxer degut a un problema desconegut. The target directory does not exist. Please select an existing directory. El directori de destinació no existeix. Seleccioneu un directori existent. Show the Station &Callsign used in the search box Mostra l'indi&catiu d'estació usat al quadre de cerca &Check for new versions automatically &Comprova automàticament si hi ha versions noves QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. Els QSO es marcaran com a pendents d'enviar una QSL si rebeu el DX QSL i no heu enviat el vostre. Check if there is a new release of KLog available every time you start KLog. Comprova si hi ha un llançament nou disponible del KLog cada vegada que s'iniciï el KLog. &Provide Info for statistics &Proporciona informació per a estadístiques The search box will also show the callsign on the air to do the QSO. El quadre de cerca també mostrà l'indicatiu a l'aire per fer el QSO. If new version checking is selected, KLog will send the developer your callsign, KLog version and Operating system to help in improving KLog. Si s'ha seleccionat la comprovació de versió nova, el KLog enviarà al desenvolupador el vostre indicatiu, la versió del KLog i el sistema operatiu per ajudar a millorar el KLog. Select to use real time. Seleccioneu-ho per emprar temps real. Select to use UTC time. Seleccioneu-ho per emprar l'hora UTC. Select if you want to save to ADIF on exit. Seleccioneu si voleu desar a l'ADIF en sortir. Complete the current QSO with previous QSO data. Completa el QSO actual amb dades de QSO anteriors. Browse Explora Open File Obre fitxer SetupPageSats &New &Nou &Edit &Edita &Remove &Elimina &Import &Importa E&xport E&xporta Add a new satellite. Afegeix un satèl·lit nou. Edit the selected satellite. Edita el satèl·lit seleccionat. Remove the selected satellite. Elimina el satèl·lit seleccionat. Export your current satellites to a file. Exporta els satèl·lits actuals a un fitxer. Select the sat you want to open. Seleccioneu el satèl·lit que voleu obrir. KLog KLog Do you really want to remove this satellite? Esteu segur que voleu eliminar aquest satèl·lit? Import a satellites file. It will replace the satellites you have in the current list. Importa un fitxer de satèl·lits. Substituirà els satèl·lits que hi ha a la llista actual. This satellite will no be longer available to be selected ... Aquest satèl·lit ja no tornarà a estar disponible per a ser seleccionat... Sat has not been removed. (#3) No s'ha eliminat el satèl·lit. (#3) Sat has not been removed. (#2) No s'ha eliminat el satèl·lit. (#2) Sat has not been removed. (#1) No s'ha eliminat el satèl·lit. (#1) ID ID Short Curt Name Nom Uplink Pujada Downlink Baixada Modes Modes An error has occurred showing the following error code: Hi ha hagut un error en mostrar el codi d'error següent: KLog - SetupPageSats KLog - Pàgina de configuració de satèl·lits Open Satellites File Obre el fitxer de satèl·lits KLog warning Avís del KLog An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Hi ha hagut un error inesperat en importar les dades dels satèl·lits. Pot ser degut a que el fitxer que esteu intentant importar no té el format correcte. Please check the format or contact the developer for analysis with the error code: Verifiqueu el format o contacteu amb el desenvolupador per a un anàlisi amb el codi d'error: Save Satellites File Desa el fitxer de satèl·lits SetupPageSatsNew Short name Nom curt Sat name Nom del satèl·lit UpLink Pujada DownLink Baixada Modes Modes &Ok D'ac&ord &Cancel &Cancel·la Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Introduïu el nom curt. Intenteu usar el nom curt LoTW per a que pugueu pujar després el QSO a LoTW. Enter the name of the satellite. Introduïu el nom del satèl·lit. Enter the uplink frequencies in this format: 144.300 Introduïu les freqüències de pujada en aquest format: 144.300 Enter the downlink frequencies in this format: 144.300 Introduïu les freqüències de baixada en aquest format: 144.300 Enter the modes in this format: USB Introduïu els modes aquest format: USB Some of the data you have entered is not correct; the satellite can't be added. Alguna dada que heu introduït no és correcta; no s'ha pogut afegir el satèl·lit. SetupPageSubdivisionNew &Date &Data &Station Callsign Indicatiu d'e&stació &Operators &Operadors Comm&ent Com&entari &Ok D'ac&ord &Cancel &Cancel·la Callsign used for this log. Indicatiu usat per aquest registre. Comma separated list of operators: callsign1, callsign2. Llista separada per comes dels operadors: indicatiu1, indicatiu2. Start date of this log. Data inicial d'aquest registre. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. Afegiu un comentari quant a aquest registre. Si està omplert, es mostrarà al títol principal del KLog per a identificar el registre. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. Cal introduir un indicatiu vàlid a la casella d'indicatiu d'estació. El registre no s'obrirà. SetupPageSubdivisions &Remove &Elimina Import new Importa nou Import an AWA file with the subdivision details. Importa un fitxer AWA amb detalls de les subdivisions. Remove the selected references. Elimina les referències seleccionades. Select the references you want to open. Seleccioneu les referències que voleu obrir. KLog KLog Do you really want to remove the data of this entity? Esteu segur que voleu eliminar les dades d'aquesta entitat? All the subdivision information for this entity will be deleted... S'eliminarà tota la informació de subdivisions d'aquesta entitat... Log has not been removed. (#3) No s'ha eliminat el registre. (#3) Log has not been removed. (#2) No s'ha eliminat el registre. (#2) Log has not been removed. (#1) No s'ha eliminat el registre. (#1) ID ID Name Nom Short Name Nom curt CQ Zone Zona CQ ITU Zone Zona ITU Deleted Suprimit Start Date Data d'inici End Date Data final DXCC DXCC An error has occurred showing the following error code: Hi ha hagut un error en mostrar el codi d'error següent: KLog - SetupPageSubdivisions KLog - SetupPageSubdivisions SetupPageUDP Start UDP Server Inicia el servidor UDP Automatically log QSOs from WSJT-X Registra automàticament els QSO des del WSJT-X Allow WSJT-X to send logged QSOs to KLog Permet que el WSJT-X enviï QSO enregistrats al KLog QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected Els QSO enregistrats al WSJT-X s'enviaran al KLog i el KLog preguntarà abans d'enregistrar al KLog a menys que se seleccioni «%1» KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. El KLog enregistrarà automàticament qualsevol QSO provinent del WSJT-X sense cap confirmació manual. Update status information from WSJT-X Actualitza la informació d'estat des del WSJT-X KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...) El KLog mostrarà i actualitzarà automàticament les dades provinents del WSJT-X (indicatiu DX, informe, mode, ...) UDP port number where the UDP Server will listen for packets. Número de port UDP a on el servidor UDP escoltarà els paquets. Make sure it is the same port that the other programs are sending the data to. Default port is 2237. Assegureu-vos que és el mateix port al qual els altres programes estan les dades. El port predeterminat és 2237. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. El servidor UDP rebrà els QSO enviats des d'altres programes com el WSJT-X, permetent enregistrar-los automàticament al KLog des d'aquests programes. UDP Port Port UDP Select the interface to listen for UDP datagrams coming from WSJT-X. Seleccioneu la interfície a escoltar els datagrames UDP provinents de WSJT-X. Network interface Interfície de xarxa QSOs notification timeout (milisecs) Temps d'expiració de les notificacions dels QSO (mil·lisegons) Miliseconds that the notification of QSOs received from WSJTX will be shown. Mil·lisegons en que es mostrarà la notificació dels QSO rebuts des del WSJTX. SetupPageUserDataPage &Personal data Personal data Dades &personals Station &data Station data &Dades de l'estació &Name Name &Nom &Address Address &Adreça Cit&y City Ci&utat &Zip Code Zip Code Codi &postal Pro&v/State Prov/State Pro&v/Estat Countr&y Country Paí&s Enter your information for rig Introduïu la informació de l'equip Enter your information for antenna Introduïu la informació de l'antena Enter your name. Introduïu el vostre nom. Enter your address - 1st line. Introduïu l'adreça - 1a línia. Enter your address - 2nd line. Introduïu l'adreça - 2a línia. Enter your address - 3rd line. Introduïu l'adreça - 3a línia. Enter your address - 4th line. Introduïu l'adreça - 4a línia. Enter your city. Introduïu la ciutat. Enter your zip code. Introduïu el codi postal. Enter your province or state. Introduïu la província o l'estat. Enter your country. Introduïu el país. Enter your power information. Introduïu la informació de potència. &Rig 1 &Equip 1 R&ig 2 E&quip 2 Ri&g 3 Eq&uip 3 Antenna &1 Antena &1 Antenna &2 Antena &2 Antenna &3 Antena &3 Po&wer Po&tència Enter the station callsign that will be used for logging. Introduïu l'indicatiu de l'estació que s'usarà per l'enregistrament. Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Introduïu l'indicatiu de la vostra estació. Alternativament, el KLog pot usar un indicatiu aproximat a partir del vostre indicatiu. &Callsign Indi&catiu &Operators &Operadors &CQ Zone Zona &CQ &ITU Zone Zona &ITU &Locator &Localitzador &Locator (not valid) &Localitzador (no vàlid) Enter the operators (comma separated if more than one). Introduïu els operadors (separats per comes si hi ha més d'un). SetupPageWorldEditor KLog will not be able to show entities information. El KLog no serà capaç de mostra la informació de les entitats. Prefix Prefix Entity Entitat An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. S'ha detectat un fitxer d'informació d'entitats (cty.csv) a la carpeta del KLog i es carregarà. Add Afegeix Delete Suprimeix Edit Edita Export World Exporta el món Import World Importa el món Still not implemented. Encara no està implementat. Import a new cty.csv file Importa un fitxer «cty.csv» nou No entities information file (cty.csv) has been detected in your KLog folder. No s'ha detectat cap fitxer d'informació d'entitats (cty.csv) a la carpeta del KLog. ARRL ID ARRL ID Continent Continent CQ Zone Zona CQ ITU Zone Zona ITU UTC UTC Latitude Latitud Longitude Longitud Deleted Suprimit Since Date Des de la data To Date Fins a la data Open File Obre fitxer BigCTY (*.csv) BigCTY (*.csv) Entities information has been updated. S'ha actualitzat la informació de les entitats. Entities information has not been updated. No s'ha actualitzat la informació de les entitats. ShowAdifImportWidget The following QSOs are those QSOs that you have received the LoTW confirmation. Els QSO següents són els que heu rebut la confirmació LoTW. Ok D'acord DX DX Date/Time Data/hora Band Banda Mode Mode ShowErrorDialog KLog Message Missatge del KLog SoftwareUpdateDialog Ok D'acord KLog update Actualització del KLog <center><h2>KLog new version (%1) is available! </h2></center><br>There is a new version of KLog available.<br><br><b>You can get the new version from:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> <center><h2>Hi ha una versió (%1) nova disponible del KLog! </h2></center><br>Hi ha una versió nova disponible del KLog.<br><br><b>Podeu aconseguir la versió nova a:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> Congratulations! Enhorabona! Your KLog has been updated. S'ha actualitzat el KLog. You already have the latest version. Ja teniu la versió més recent. StartWizard KLog - The free hamradio logging program KLog - El programa lliure d'enregistrament de radioafició Quit Setup Surt de la configuració Setup is not complete yet. Are you sure you want to quit setup? La configuració encara no està completa. Esteu segur que voleu sortir de la configuració? StatisticsWidget QSO per year QSO per any DXCC per year DXCC per any CQ zones per year Zones CQ per any QSO per band QSO per banda QSO per mode QSO per mode QSO per DXCC QSO per DXCC QSO per Continent QSO per continent QSO per hour QSO per hora QSO per month QSO per mes Worked / Confirmed status Estat Treballat / Confirmat Worked / Sent status Estat Treballat / Enviat Sent / Confirmed status Estat Enviat / Confirmat Satellite grid status Estat de la quadrícula dels satèl·lits Satellite DXCC status Estat de la DXCC dels satèl·lits Grids per band status Quadrícules per estat de la banda DXCC per band status DXCC per estat de la banda StatsCQZPerYearBarChartWidget CQ Zones per year Zones CQ per any Reading data ... S'estan llegint les dades... Abort reading Interromp la lectura CQ zones Zones CQ CQ zones per year Zones CQ per any Reading data ... S'estan llegint les dades... Years: %1/%2 Anys: %1/%2 StatsDXCCOnSatsWidget Show confirmed only Mostra només els confirmats Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Només el satèl·lits LEO Number Número Callsign Indicatiu Date Data Band Banda Mode Mode DXCC DXCC Satellite Satèl·lit Confirmed Confirmat No No StatsEntitiesPerYearBarChartWidget Chart title Títol del gràfic Reading data ... S'estan llegint les dades... Abort reading Interromp la lectura DXCC Entities Entitats DXCC DXCC Entities per year Entitats DXCC per any Reading data ... S'estan llegint les dades... Entities: Entitats: StatsFieldPerBandWidget All Tot Mode: Mode: Band Banda Worked Treballat Confirmed Confirmat StatsGridsOnSatsWidget Show confirmed only Mostra només els confirmats Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Només el satèl·lits LEO Number Número Callsign Indicatiu Date Data Band Banda Mode Mode Grid Quadrícula Satellite Satèl·lit Confirmed Confirmat No No StatsQSOsPerBandBarChartWidget QSOs per band QSO per banda Reading data ... S'estan llegint les dades... Abort reading Interromp la lectura Bands Bandes QSOs per band distribution QSO per distribució de banda Reading data ... S'estan llegint les dades... Bands: Bandes: StatsQSOsPerContinentBarChartWidget QSOs per continent QSO per continent Reading data ... S'estan llegint les dades... Abort reading Interromp la lectura Continents Continents Reading data ... S'estan llegint les dades... Hours: Hores: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC QSO per DXCC Reading data ... S'estan llegint les dades... Abort reading Interromp la lectura Reading data... S'estan llegint les dades... DXCC DXCC Top ten DXCC per QSO Els deu DXCC més importants per QSO StatsQSOsPerHourBarChartWidget QSOs per hour QSO per hora Reading data ... S'estan llegint les dades... Abort reading Interromp la lectura Hours Hores QSOs at hour QSO per hora Reading data ... S'estan llegint les dades... Hours: Hores: StatsQSOsPerModeBarChartWidget QSOs per mode QSO per mode Reading data ... S'estan llegint les dades... Abort reading Interromp la lectura Modes Modes QSOs per mode distribution QSO per distribució de mode Reading data ... S'estan llegint les dades... Modes: Modes: StatsQSOsPerMonthBarChartWidget QSOs per month QSO per mes Reading data ... S'estan llegint les dades... Abort reading Interromp la lectura Jan Gen Feb Feb Mar Mar Apr Abr May Mai Jun Jun Jul Jul Sep Set Oct Oct Nov Nov Dec Des Aug Ago Months Mesos QSOs at Month QSO per mes Reading data ... S'estan llegint les dades... Months: Mesos: StatsQSOsPerYearBarChartWidget Reading data ... S'estan llegint les dades... Abort reading Interromp la lectura QSOs QSO QSOs per year QSO per any Reading data ... S'estan llegint les dades... QSO: %1/%2 QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Enviat - %1 Confirmed - %2 Confirmat - %2 Sent / Confirmed status Estat Enviat / Confirmat StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Treballat, no confirmat - %1 Confirmed - %2 Confirmat - %2 Worked / Confirmed status Estat Treballat / Confirmat StatsWorkedSentPieChartWidget Worked - %1 Treballat - %1 Sent - %2 Enviat - %2 Worked / Sent status Estat Treballat / Enviat TipsDialog KLog tips Consells del KLog Next Següent Previous Anterior <b>Tip #1:</b><br>Do you know...<br>You can use <a href="#ToolsFillInQSO">Tools->Fill in QSO data</a> to automatically read the full log to fill the DXCC, CQ, ITU zones and continent? Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in QSO data <b>Consell núm. 1:</b><br>Sabíeu que...<br>poseu usar <a href="#ToolsFillInQSO">Eines -> Omple les dades QSO</a> per llegir automàticament el registre complet per a omplir les zones DXCC, CQ, ITU i el continent? <b>Tip #3:</b><br>Do you know...<br>You can use <a href="#ToolsFindQSO2QSL">Tools->QSL tools...->Find QSO to QSL</a> to look for all those QSO that you should send your QSL because you still need to confirm that DXCC and you have still not send your QSL card? Translator: Please make sure that the name of the link is coherent with the menu Tools->QSL tools...->Find QSO to QSL <b>Consell núm. 3:</b><br>Sabíeu que...<br>podeu usar <a href="#ToolsFindQSO2QSL">Eines->Eines QSL...->Cerca QSO a les QSL</a> per cercar tots aquells QSO als que hauríeu d'enviar la vostra QSL perquè encara cal confirmar que el DXCC i vós encara no heu enviat la targeta QSL? <b>Tip #13:</b><br>Do you know...<br>You can <a href=https://twitter.com/_ea4k>follow EA4K on twitter</a> to get updates about KLog? <b>Consell núm. 13:</b><br>Sabíeu que...<br>podeu <a href=https://twitter.com/_ea4k>seguir a EA4K al Twitter</a> per aconseguir notícies quant al KLog? <b>Tip #18:</b><br>Do you know...<br>You can double-click on an entity name in the DXCC table and all the QSOs with that DXCC Entity will be shown in the search box? <b>Consell núm. 18:</b><br>Sabíeu que...<br>podeu fer un clic doble a un nom d'entitat a la taula de DXCC i tots els QSO amb una entitat DXCC es mostraran al quadre de cerca? <b>Tip #19:</b><br>Do you know...<br>You can right-click on a QSO and select <i>Check in QRZ.com</i> to check that callsign in QRZ.com? <b>Consell núm. 19:</b><br>Sabíeu que...<br>podeu fer clic amb el botó dret a un QSO i seleccionar <i>Comprova a QRZ.com</i> per comprovar aquest identificador a QRZ.com? <b>Tip #2:</b><br>Do you know...<br>You can find the QSLs that you still need to send with <a href="#ToolsSendPendingQSL">Tools->QSL tools...->Find My-QSLs pending to send</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Requested</i>. Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in DXCC data <b>Consell núm. 2:</b><br>Sabíeu que...<br>podeu trobar les QSL que encara cal enviar amb <a href="#ToolsSendPendingQSL">Eines->Eines QSL...->Cerca les meves QSL pendents d'enviar</a>.<bR>Aquesta eina llistarà al quadre de cerca tots els QSO amb la QSL-Sent marcada com a <i>Sol·licitada</i>. <b>Tip #4:</b><br>Do you know...<br>You can enter a '*' in the search box, in the search window to search for all the QSOs done with one specific station callsign? Translator: Please make sure that the name of the link is coherent with the menu File->Export Requested QSL to ADIF... <b>Consell núm. 4:</b><br>Sabíeu que...<br>podeu introduir un «*» al quadre de cerca de la finestra de cerca per a cercar tots els QSO efectuats amb un indicatiu d'estació específic? <b>Tip #5:</b><br>Do you know...<br>You can find the file containing all your log and other information in the logbook.dat file and the klogrc file, containing the KLog config file in the KLog folder by opening the <a href="#FileOpenKLogFolder">File->KLog folder</a> menu? <b>Consell núm. 5:</b><br>Sabíeu que...<br>podeu trobar el fitxer que conté tot el vostre registre i altra informació al fitxer «logbook.dat», i al «klogrc» que conté el fitxer de configuració del KLog, a la carpeta del KLog obrint el menú <a href="#FileOpenKLogFolder">Fitxer->Carpeta del KLog</a>? <b>Tip #6:</b><br>Do you know...<br>You can upload your QSO marked as queued to LoTW via TQSL with <a href="#ToolsUploadLoTW">Tools->LoTW tools ...->Sends the log to LoTW calling TQSL.</a> ?<br><br>You have to configure TQSL in the preferences to be able to use this functionality. Translator: Please make sure that the name of the link is coherent with the menu File->KLog folder <b>Consell núm. 6:</b><br>Sabíeu que...<br>podeu pujar els QSO marcats com a posats en cua del LoTW via el TQSL amb <a href="#ToolsUploadLoTW">Eines->Eines LoTW...->Envia el registre al LoTW cridant el TQSL.</a> ?<br><br>Cal configurar el TQSL a les preferències per a poder usar aquesta característica. <b>Tip #7:</b><br>Do you know...<br>You can see the QSO that confirms one specific DXCC entity in one specific band by poiting your mouse over that band in the DXCC widget? Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find My-QSLs pending to send <b>Consell núm. 7:</b><br>Sabíeu que...<br>podeu veure el QSO que confirma una entitat DXCC específica a una banda específica apuntant el ratolí sobre aquesta banda al giny del DXCC? <b>Tip #8:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceivePendingQSL">Tools->QSL tools...->Find DX-QSLs pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Sent</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find DX-QSLs pending to receive <b>Consell núm. 8:</b><br>Sabíeu que...<br>podeu trobar les QSL que encara esteu esperant amb <a href="#ToolsReceivePendingQSL">Eines->Eines QSL...->Cerca les DX-QSL pendents de rebre</a>.<bR>Aquesta eina llistarà al quadre de cerca tots els QSO amb la QSL-Sent marcada com a <i>Enviada</i> però que encara no heu rebut la targeta QSL des del DX. <b>Tip #9:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceiveRecPendingQSL">Tools->QSL tools...->Find requested pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Rec marked as <i>Requested</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find requested pending to receive <b>Consell núm. 9:</b><br>Sabíeu que...<br>podeu trobar les QSL que encara esteu esperant amb <a href="#ToolsReceiveRecPendingQSL">Eines->Eines QSL...->Cerca sol·licituds pendents de rebre</a>.<bR>Aquesta eina llistarà al quadre de cerca tots els QSO amb la QSL-Rec marcada com a <i>Sol·licitada</i> però que encara no heu rebut la targeta QSL des del DX. <b>Tip #10:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/klogchat>English KLog Telegram group</a> to discuss about KLog in English? <b>Consell núm. 10:</b><br>Sabíeu que...<br>podeu subscriure's al <a href=https://t.me/klogchat>grup de Telegram del KLog en anglès</a> per conversar en anglès quant al KLog? <b>Tip #11:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/KLogES>Spanish Telegram group</a> to discuss about KLog in Spanish? <b>Consell núm. 11:</b><br>Sabíeu que...<br>podeu subscriure's al <a href=//https://t.me/KLogES>grup de Telegram en castellà</a> per conversar en castellà quant al KLog? <b>Tip #12:</b><br>Do you know...<br>You can subscribe to <a href=https://groups.io/g/klog>KLog mailing list</a> to discuss via email about KLog in English? <b>Consell núm. 12:</b><br>Sabíeu que...<br>podeu subscriure's a la <a href=https://groups.io/g/klog>llista de correu del KLog</a> per a conversar a través del correu quant al KLog en anglès? <b>Tip #14:</b><br>Do you know...<br>You can write your own <a href=https://www.eham.net/reviews/detail/3118>review in eHam.net about KLog</a> to help other users to decide to use KLog? <b>Consell núm. 14:</b><br>Sabíeu que...<br>podeu escriure els vostres propis <a href=https://www.eham.net/reviews/detail/3118>comentaris a eHam.net quant al KLog</a> per ajudar als altres a decidir-se a usar el KLog? <b>Tip #15:</b><br>Do you know...<br>You can join the development team by simply <a href=https://www.klog.xyz/contact>Contacting us</a>? <b>Consell núm. 15:</b><br>Sabíeu que...<br>podeu unir-vos a l'equip de desenvolupament senzillament <a href=https://www.klog.xyz/contact>contactant-nos</a>? <b>Tip #16:</b><br>Do you know...<br>That there are many ways to contribute to KLog and some of them are listed in the <a href=https://www.klog.xyz/contrib>KLog Contribute</a> page? <b>Consell núm. 16:</b><br>Sabíeu que...<br>hi ha moltes maneres de col·laborar amb el KLog i varies estan llistades a la pàgina de <a href=https://www.klog.xyz/contrib>col·laboració del KLog</a>? <b>Tip #17:</b><br>Do you know...<br>You can support translating KLog into your language? Please check <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a> page. <b>Consell núm. 17:</b><br>Sabíeu que...<br>podeu ajudar a traduir el KLog al vostre idioma? Si us plau, reviseu la pàgina de <a href=https://www.klog.xyz/contrib/translations>traduccions del KLog</a>. UpdateSatsData Reading Satellites data file... S'estan llegint el fitxer de les dades de satèl·lits... Abort reading Interromp la lectura The Satellites information has been updated. S'ha actualitzat la informació dels satèl·lits. Open File Obre un fitxer Sat Data Dades de satèl·lit UpdateSettings KLog - Settings update KLog - Actualització de la configuració The settings system has been changed and KLog will update your settings file. El sistema de configuració ha canviat i el KLog actualitzarà el fitxer de configuració. World Entity Entitat Continent Continent Abort reading Interromp la lectura Reading cty.csv... S'està llegint el «cty.csv»... eLogClubLog Host not found! No s'ha trobat la màquina! Timeout error! Error de temps excedit! This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO. Aquest error pot estar provocat per una duplicitat del QSO, o si s'elimina, intenteu eliminar un QSO inexistent. Undefined error number (#%1)... Número d'error indefinit (#%1)... KLog - ClubLog KLog - clublog KLog - ClubLog QSO dupe or not existing (#%1)... QSO duplicat o no existent (#%1)... We have received an undefined error from Clublog (%1) S'ha rebut un error no definit des del Clublog (%1) Undefined error... Error no definit... Callsign missing Manca l'indicatiu Invalid callsign Indicatiu no vàlid Skipping SWL callsign S'omet l'indicatiu SWL Callsign is your own call Callsign is your ow call L'indicatiu és el vostre propi indicatiu Invalid callsign with no DXCC mapping Indicatiu no vàlid sense correspondència amb DXCC Updated QSO QSO actualitzat Invalid ADIF record Enregistrament ADIF no vàlid Missing ADIF record Manca enregistrament ADIF Test mode - parameters ok, no action taken Mode Test - paràmetres correctes, sense acció Please check your config in the setup and contact the KLog development team if you can't fix it. ClubLog uploads will be disabled. Si us plau, comproveu la configuració a la configuració i contacteu amb l'equip de desenvolupament del KLog si no ho podeu corregir. Les pujades al ClubLog es desactivaran. It seems to be a CREDENTIALS ERROR; check your email and password. Sembla que hi ha un error de credencials, verifiqueu el vostre correu i contrasenya. It seems that your ClubLog credentials are not correct. Sembla que les vostres credencials del ClubLog no són correctes. Please check your credentials in the setup. ClubLog uploads will be disabled. Verifiqueu les vostres credencials a la configuració. Les pujades al ClubLog estan desactivades. Excessive API Usage Ús excessiu de l'API Internal Error Error intern Rejected Rebutjat QSO Duplicate QSO duplicat QSO Modified QSO modificat Missing Login Manca inici de sessió QSO OK QSO OK Upload denied Pujada denegada No callsign selected No s'ha seleccionat cap indicatiu No match found Cap coincidència Dropped QSO QSO eliminat OK D'acord Login rejected S'ha rebutjat l'inici de sessió Rejected: Callsign is your own call Rebutjat: L'indicatiu és el vostre propi indicatiu eLogQrzLog Host not found! No s'ha trobat la màquina! Timeout error! Error de temps excedit! Undefined error number (#%1) Número d'error indefinit (#%1) We have received the following error from QRZ.com (%1) S'ha rebut l'error següents des de QRZ.com (%1) You are not subscribed to QRZ.com. No esteu subscrit a QRZ.com. Not valid KEY found No s'ha trobat cap clau vàlida Please configure your QRZ.com API key. You will find it in your QRZ.com Logbook settings webpage. You need a QRZ.com subscription to use this feature. Configureu la clau API de QRZ.com. La trobareu a la pàgina web de configuració del vostre «logbook» de QRZ.com. Cal una subscripció a QRZ.com per a usar aquesta funcionalitat. KLog - QRZ.com password needed KLog - Cal la contrasenya de QRZ.com Please enter your QRZ.com password: Introduïu la contrasenya de QRZ.com: KLog - QRZ.com KLog - QRZ.com Callsign missing Manca l'indicatiu eQSLUtilities Host not found! No s'ha trobat la màquina! Timeout error! Error de temps excedit! Undefined error number (#%1)... Número d'error indefinit (#%1)... eQSL Error: User or password incorrect Error d'eQSL: Usuari o contrasenya incorrectes eQSL Warning: At least one of the uplodaded QSOs is duplicated. Avís d'eQSL: Com a mínim hi ha un QSO pujat que està duplicat. eQSL: All the QSOs were properly uploaded. eQSL: Tots els QSO s'han pujat adequadament. KLog - eQSL.cc password needed KLog - Cal la contrasenya d'eQSL.cc Please enter your eQSL.cc password: Introduïu la contrasenya d'eQSL.cc: KLog - eQSL KLog - eQSL eQSL has sent the following message: %1 eQSL ha enviat el missatge següent: %1 We have received an undefined error from eQSL (%1) S'ha rebut un error no definit des de l'eQSL (%1) Please check your config in the setup and contact the KLog development team if you can't fix it. eQSL uploads will be disabled. Si us plau, comproveu la configuració a la configuració i contacteu amb l'equip de desenvolupament del KLog si no ho podeu corregir Les pujades a l'eQSL es desactivaran. klog-2.3.3/translations/klog_es.ts0000644000015700001710000145641714542412415017073 0ustar jenkinsjenkins AboutDialog About KLog Acerca de KLog Please be aware that this is a development release and it may contain many bugs.<br>Backup your data before using this software! Tenga en cuenta que se trata de una versión en desarrollo y puede tener muchos fallos. <br>Haga una copia de seguridad de sus datos antes de usar este programa. If you want to provide support you are welcome to join the <a href="https://groups.io/g/klog">KLog mailing list</a>! Si quiere proporcionar soporte, puede unirse a la <a href="https://groups.io/g/klog">Lista de KLog</a>. Authors Autores By Por Author Autor KLog is a free logbook for hamradio operators. KLog es un software libre de log para radioaficionados. Please provide your review in KLog's eHam review page: Por favor, escriba su crítica en la página de críticas de eHam: Find more information and the latest release at Más información y la última versión en today hoy Main developer Desarrollador principal KLog is developed by a very small team and you are invited to join! ¡KLog está desarrollado por un equipo muy pequeño y está invitado a unirse! You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Puede ayudarnos reportando errores o pequeñas contribuciones de código, ideas o cualquier otra cosa que crea que puede mejorar KLog. KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account users' needs. Los desarrolladores de KLog han incluido una función que reporta algunos datos del usuario al servidor de KLog con el único objetivo de saber el número de versiones instaladas y poder centrar el desarrollo en una u otra dirección en función de las necesidades de los usuarios. At present, the data that is provided is the following: Hoy, los datos que se proporcionan son los siguientes: Translators bring KLog into your language. They are really an important part of the KLog development team. Los traductores traen KLog a su idioma. Son una parte realmente importante del equipo de desarrollo de KLog. Since 0.6.2, KLog has been fully rewritten to provide a cross-platform application that runs on all major operating systems (GNU/Linux, macOS and Windows) and to support new functionality. KLog fue reescrito completamente en su versión 0.6.2 para hacerlo multiplataforma de forma que pudiera ejecutarse en los sistemas operativos principales (GNU/Linux, macOS & Windows) y proveer funcionalidades nuevas que aun no se proveían. If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://groups.io/g/klog">KLog mailing list</a>! Si KLog no está aun en su idioma y quiere ayudarnos, puede contactarnos en la <a href="https://groups.io/g/klog">Lista de KLog</a>. Translators Traductores Privacy advisory Aviso de privacidad Callsign Indicativo KLog version Versión de KLog Operating system Sistema operativo Be aware that you can enable/disable this feature from the Misc tab in the Setup page. Sepa que puede habilitar/deshabilitar esta función en la pestaña de Varios de la página de configuración. KLog KLog Privacy Privacidad AdifLoTWExportWidget Select the Station Callsign that you want to use to upload the log. Por favor seleccione el indicativo de estación que quiere usar para subir el log. Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign. Seleccione la fecha de inicio para exportar QSOs. La fecha predeterminada es la fecha del primer QSO con este indicativo de estación. Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign. Seleccione la fecha de fin para exportar QSOs. La fecha predeterminada es la fecha del último QSO con este indicativo de estación. Station callsign Indicativo de estación My Locator Mi locator Start date Fecha de inicio End date Fecha final Ok Ok Cancel Cancelar DX DX Date/Time Fecha/Hora Band Banda Mode Modo Not defined Sin definir ALL Todos QSOs: %1/%2 QSOs: %1/%2 All Todos QSOs: QSOs: KLog - QSOs to be uploaded to LoTW. KLog - QSOs para enviar a LoTW. This table shows the QSOs that will be sent to LoTW. Esta tabla muestra los QSOs que serán enviados a LoTW. KLog - QSOs to be uploaded to ClubLog. KLog - QSOs para enviar a ClubLog. This table shows the QSOs that will be sent to ClubLog. Esta tabla muestra los QSOs que se enviarán a ClubLog. KLog - QSOs to be uploaded to eQSL.cc. KLog - QSOs para enviar a eQSL.cc. This table shows the QSOs that will be sent to eQSL.cc. Esta tabla muestra los QSOs que serán enviados a eQSL.cc. KLog - QSOs to be uploaded to QRZ.com. KLog - QSOs para enviar a QRZ.com. This table shows the QSOs that will be sent to QRZ.com. Esta tabla muestra los QSOs que serán enviados a QRZ.com. This table shows the QSOs that will be exported to ADIF. Esta tabla muestra los QSOs que serán exportados a ADIF. AwardsWidget Recalculate Recalcular Click to recalculate the award status. Pulsar para recalcular el estado de los diplomas. Select the year you want to check. Seleccione el año que quiere comprobar. QSOs QSOs DXCC DXCC CQ CQ Award Diploma Confirmed Confirmado Worked Trabajado WAZ WAZ Score Puntuación Annual Anual Number of confirmed DXCC entities. Número de entidades DXCC confirmadas. Number of worked DXCC entities. Número de entidades DXCC trabajadas. Number of confirmed WAZ zones. Número de zonas WAZ confirmadas. Number of worked WAZ zones. Número de zonas WAZ trabajadas. Number of confirmed QSOs. Número de QSOs confirmados. Number of worked QSOs. Número de QSOs trabajados. Number of QSOs worked in the selected year. Número de QSOs trabajados en el año seleccionado. Number of DXCCs worked in the selected year. Número de entidades DXCC trabajadas en el año seleccionado. Number of CQ Zones worked in the selected year. Número de zonas CQ trabajadas en el año seleccionado. Score for the DXMarathon in the selected year. Puntuación de DXMarathon en el año seleccionado. DX-Marathon DX-Marathon CTYPage Country data download Descargar datos de entidades KLog needs country data... KLog necesita datos de las entidades ... &Download &Descargar &Ignore &Ignorar Country data needed Información de entidades KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. KLog usa el fichero cty.csv de http://www.country-files.com/ para obtener la información del DXCC. You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do. Necesita descargar el cty.csv si quiere que KLog muestre información de entidad, locator, ... de los QSOs que haga. Click on Download to download now. Pulse en Descargar para descargar ahora. KLog KLog I can't find the host. Please check your network and try again Do you want to try again? No se pudo encontrar la máaquina. Revise su configuración de red y pruebe de nuevo ¿Quiere volverlo a intentar? DXCCStatusWidget Update Actualizar It seems that the DXCC status in your database is not updated and KLog can't find any dxcc information. You can try to fix this by updating the log. Parece que el estado de DXCC no está actualizado en la base de datos y KLog no puede encontrar información de DXCC. Puede intentar arreglarlo actualizando el log. Do you want to update your DXCC status? ¿Quiere actualizar el estado de DXCC? Entity Entidad Prefix Prefijo Pref: Pref: CQ: CQ: ITU: ITU: Beam: Azimuth: Entity not worked in this band. Entidad no trabajada en esta banda. DXClusterWidget Connect Conectar Clear Limpiar Click on connect to connect to the DX-Cluster Pulse en conectar para conectar al DX-Cluster KLog DXCluster Kontest DXCluster DXCluster de KLog Click on Connect to connect to the DX-Cluster server Pulse en Conectar para conectar al servidor de DX-Cluster Check in QRZ.com Consultar en QRZ.com Check this callsign in QRZ.com Consulta este indicativo en QRZ.com. Trying to connect to the server Intentando conectar con el servidor The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. La conexióon fue rechazada por el servidor. Asegúrese de que el servidor de DXCluster estáa ejecutáandose y compruebe el nombre de máquina y puerto. The following error occurred: %1. El siguiente error ha tenido lugar: %1. Connected to server Conectado al servidor KLog message Kontest message Mensaje de KLog Enter your callsign to connect to the cluster: Introduzca su indicativo para conectar al cluster: Enter your password to connect to the cluster: (Just hit enter for no password) Introduzca su contraseña para conectar al cluster: (pulse enter si no hay contraseña) Not logged on, you may need to enter your callsign again. No identificado, puede introducir su contraseña de nuevo. Enter here the commands to be sent to the DX-Cluster server. Introduzca aquí los comandos a enviar al servidor de DX-Cluster. It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! No fue posible abrir el fichero para guardar los avisos de DX. La actividad del DX-Cluster no se guardará. Disconnect Desconectar The host was not found. Please check: No se ha encontrado el servidor. Por favor revise: - your network connection; - the host name and port settings. - la conexión de red; - el nombre de máquina y puerto. Connection closed by the server Conexión cerrada por el servidor Click on Connect to connect to the DX-Cluster server. Pulse en Conectar para conectar al servidor de DX-Cluster. Send Enviar DataProxy_SQLite Software version in DB is null La versión de software de la BBDD es nulo Aircraft Scatter Common term in hamradio, do not translate if not sure Aircraft Scatter Aurora Aurora Aurora-E Aurora-E Back scatter Common term in hamradio, do not translate if not sure Back scatter Earth-Moon-Earth Rebote Lunar Sporadic E Esporádica E Internet-assisted Asistido por Internet Ionoscatter Common term in hamradio, do not translate if not sure Ionoscatter Meteor scatter Common term in hamradio, do not translate if not sure Meteor scatter Terrestrial or atmospheric repeater or transponder Terrestre, repetidor atmosférico o transpondedor Rain scatter Common term in hamradio, do not translate if not sure Rain scatter Satellite Satélite Bureau Common term in hamradio, do not translate if not sure Bureau Manager Common term in hamradio, do not translate if not sure Manager All QSOs have been updated with a DXCC and the Continent. Todos los QSO se han actualizado con un DXCC y un continente. Field Aligned Irregularities Common term in hamradio, do not translate if not sure Irregularidades alineadas con el Campo (FAI) Query didn't failed No falló ninguna query F2 Reflection Common term in hamradio, do not translate if not sure Reflexión F2 Trans-equatorial Common term in hamradio, do not translate if not sure Trans-ecuatorial Tropospheric ducting Common term in hamradio, do not translate if not sure Conducto troposférico Yes Sí No No Requested Solicitada Ignore/Invalid Ignorar/No válida Validated Validada Queued En cola Uploaded Subida Do not upload No subir Modified Modificado Direct Directa Electronic Electrónica KLog DXCC KLog DXCC KLog - Invalid call detected KLog - Indicativo no válido detectado An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported ADIF record? Se ha detectado un indicativo vacío. ¿Quiere exportar este QSO de todas formas (Pulsar en Si) o eliminar este campo del log exportado? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log? Se ha detectado un indicativo no válido (%1). ¿Quiere exportar este indicativo de todas formas (Pulsar en Si) o eliminar este indicativo del log exportado? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. Exportar indicativos erróneos puede traer problemas en las aplicaciones en las que potencialmente importará el log. Puede ser de todas formas un buen indicativo que KLog haya detectado como erróneo. DownLoadCTY Download of cty.csv failed with the following error code: La descarga de cty.csv falló con el siguiente código de error: Download of cty.csv done. Descarga de CTY.CSV finalizada. There is already a cty.csv file in the folder but it will be replaced with the new one. Ya hay un cty.csv en la carpeta pero será reemplazado por el nuevo. Could not open %1 for writing No se puede abrir %1 para escritura FileAwardManager Open Award file Abrir fichero de diplomas Award files (*.awa) Fichero de diplomas (*.awa) Award file not opened Fichero de diplomas no abierto KLog was not able to read the award file KLog no puedo abrir el fichero de diplomas It was not possible to open the file %1 for reading. No fue posible abrir el fichero %1 para su lectura. AWA wrong format Formato AWA erróneo The AWA file does not have the right format El fichero AWA no tiene el formato adecuado AWA file does not have an <EOH> field El fichero AWA no tiene un campo <EOH> KLog - %1 KLog - %1 FileManager Reading ADIF file... Leyendo fichero ADIF... Abort reading Cancelar lectura Writing ADIF file... Escribiendo fichero ADIF... Abort writing Cancelar escritura KLog - Invalid call detected KLog - Indicativo no válido detectado An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported log file? Se ha detectado un indicativo vacío. ¿Quiere exportar este QSO de todas formas (Pulsar en Si) o eliminar este campo del log exportado? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log file? Se ha detectado un indicativo no válido (%1). ¿Quiere exportar este indicativo de todas formas (Pulsar en Si) o eliminar este indicativo del log exportado? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. You can, however, edit the ADIF file once the export process is finished. Exportar un indicativo erróneo puede traer problemas en las aplicaciones en las que potencialmente importará el log. Puede ser de todas formas un buen indicativo que KLog haya detectado como erróneo. Puede, de todas formas, editar el fichero ADIF tras el proceso de exportación. KLog - User cancelled KLog - Cancelación de usuario The selected callsign (%1) is not valid, please check it again to export the log. El indicativo seleccionado (%1) no es válido, revíselo de nuevo para exportar el log. Writing ADIF file... QSO: Escribiendo fichero ADIF ... QSO: KLog - File not opened KLog - Archivo no abierto It was not possible to open the file %1 for reading. No fue posible abrir el fichero %1 para su lectura. KLog was not able to read the LoTW file KLog no pudo leer el fichero de LoTW Processing LoTW ADIF file... Procesando fichero ADIF de LoTW... Abort processing Cancelar proceso LoTW reading Leyendo LoTW KLog - Add new QSOs? KLog - ¿Añadir QSOs nuevos? Do you want to add non existing QSOs to your local log? ¿Quiere añadir QSOs que no existan en el log local? There are some QSOs in the LoTW log that are not in your local log. Hay algunos QSOs en el log de LoTW que no existen en el log local. Processing LoTW ADIF file...... QSO: %1 / %2 Procesando fichero ADIF de LoTW ... QSO: %1 / %2 You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated. Ha cancelado el proceso de LoTW. El proceso se parará y puede que su log no se actualice del todo. Reading LoTW file... Leyendo fichero LoTW... Importing LoTW ADIF file... Importando archivo ADIF de LoTW... KLog - Log selection KLog - Selección de log Do you want to add dupe QSOs to your local log? ¿Quiere añadir QSOs duplicados al log local? There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date. Hay algunos QSOs en este fichero de log que pueden ser duplicados al tener el mismo indicativo, banda, modo y una fecha y hora muy próxima. KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO with %1 on %2: KLog ha encontrado un QSO sin Indicativo de Estación. Introduzca el indicativo de estación que fue usado en este QSO con %1 en %2: KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO on %1: KLog ha encontrado un QSO sin Indicativo de Estación. Introduzca el indicativo de estación que fue usado en este QSO en %1: You have canceled the file import. The file will be removed and no data will be imported. Ha cancelado la importación del fichero. El fichero se eliminará y no se importará ningún dato. There are no QSOs pending to be exported with that station callsign. No hay QSOs pendientes para exportar con ese indicativo de estación. Export Exportar Exporting ADIF file... QSO: %1 / %2 Exportando fichero ADIF... QSO: %1 / %2 Export progress Progreso de exportado This QSO is not including the minimum data to consider a QSO as valid! ¡Este QSO no incluye la información mínima para considerarse un QSO válido! Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information. Algunos QSOs de este log, (ej: %1) parece que no tienen la información de RST-TX. If you select NO, maybe the QSO will not be imported. Si selecciona No, el QSO puede no ser importado. Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. Pulsar en Si para añadir un %1 de forma predeterminada para el modo %2 en todos los QSOs con un problema similar. Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. Algunos QSOs de este log, (ej: %1) parece que no tienen la información de RST-RX. KLog - No Station callsign entered. KLog - Sin indicativo de estación. KLog - Apply to all QSOs in this log? KLog - ¿Aplicar a todos los QSOs de este log? KLog - QSO without Station Callsign KLog - QSO sin Indicativo de Estación KLog - Don't ask again KLog - No preguntar de nuevo Do you want to reuse your answer? ¿Quiere reutilizar la respuesta? KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again. KLog usará automáticamente la respuesta anterior para cualquier ocurrencia similar, sin preguntar de nuevo. <ul><li>Date/Time:</i> %1</li><li>Callsign: %2</li><li>Band: %3</li><li>Mode: %4</li></ul> <ul><li>Fecha/hora:</i> %1</li><li>Indicativo: %2</li><li>Banda: %3</li><li>Modo: %4</li></ul> KLog - QSO not found KLog - QSO no encontrado Do you want to add this QSO to the log?: ¿Quiere añadir este QSO al log?: We have found a QSO coming from LoTW that is not in your local log. Do you want KLog to add this QSO to the log? Hemos encontrado un QSO llegado de LoTW que no está en el log local. ¿Quiere añadir este QSO al log? KLog - Duplicated QSOs KLog - QSOs duplicados Do you want to continue with the current file? ¿Quiere continuar con el fichero actual? - The band missing and the following call: - La banda inexistente pero el siguiente indicativo: - The mode missing and the following call: - El modo inexistente pero el siguiente indicativo: - The date missing and the following call: - La fecha inexistente pero el siguiente indicativo: - The time missing and the following call: - La hora inexistente pero el siguiente indicativo: You have canceled the file export. The file will be removed and no data will be exported. Ha cancelado la exportación del fichero. El fichero se eliminará y no se exportará ningún dato. KLog - Error KLog - Error The selected log does not exist, please check it again. El log seleccionado no existe, por favor reviselo de nuevo. The file %1 can't be opened. No se pudo abrir el fichero %1 . Do you still want to cancel? ¿Aun quiere cancelar? QSO: QSO: There is more than one log in this logfile. Hay más de un log en este fichero. All logs will be imported into the current log. Todos los logs se importarán en el log actual. Do you want to continue? ¿Quiere continuar? Importing ADIF file... Importando fichero ADIF... It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) Parece que hay algunos QSO duplicados en el fichero ADIF que está importando. ¿Quiere continuar? (los QSO duplicados no se importarán) Please edit the ADIF file and make sure that it include at least: Por favor, edite el fichero ADIF y asegúrese de que incluye al menos: and y This QSO had: Este QSO tenía: KLog: Not all required data found! KLog: ¡No se encontraron todos los datos necesarios! KLog: No RST TX found! KLog: ¡No se encontró RST TX! KLog: No RST RX found! KLog: ¡No se encontró RST RX! HamLibNetworkConfigWidget Enter the hostname or address of the radio. Introduzca el nombre de máquina o dirección de la radio. Set de network port of the radio. Define el puerto de red de la radio. Host/Address Servidor/Dirección Port Puerto Enter the port of the radio. Introduzca el puerto de la radio. HamLibSerialConfigWidget Bauds Baudios Select the serial port speed. Seleccionar la velocidad del puerto serie. Port Puerto Select the serial port. Only the serial ports that are detected are shown. Seleccione el puerto serie. Solo se muestran los puertos que se pueden detectar. Scan Buscar Click to identify the serial ports available in your computer. Pulsar para identificar los puertos disponibles en el ordenador. 5 bits 5 bits 6 bits 6 bits 7 bits 7 bits 8 bits 8 bits Data bits Bits de datos Select the serial data bits. Seleccionar los bits de datos. None Ninguno Hardware Hardware Software XON/XOFF Software XON/XOFF Flow control Control de flujo Select the serial flow control Seleccione el control de flujo del puerto serie. No parity Sin paridad Even Par Odd Impar Space Espacio Mark Marca Parity Paridad Select the serial parity. Seleccione la paridad del puerto serie. 1 bit 1 bit 1.5 bits 1.5 bits 2 bits 2 bits Stop bits Bits de parada Select the serial stop bits. Seleccionar los bits de parada. InfoWidget 10M 10M 15M 15M 20M 20M 40M 40M 80M 80M 160M 160M 2M 2M 6M 6M 12M 12M 17M 17M 30M 30M 70CM 70Cm Continent Continente Prefix Prefijo CQ CQ ITU ITU Short Path Salto corto Long Path Salto largo Deg Grad Miles Millas Km Km IntroPage Welcome to KLog! Welcome to Kontest! ¡Bienvenido a KLog! Welcome to KLog! - brought to you under the terms of the GPL! ¡Bienvenido a KLog - disponible gracias a los términos de la GPL! Welcome to KLog Bienvenido a KLog This looks like it's the first time you've run KLog on this computer. Parece que es la primera vez que ejecuta KLog en este ordenador. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. KLog es un programa libre de log de radioaficionados que puede correr en Linux, macOS y Windows. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. KLog es un programa libre de log de radioaficionados que puede correr en Linux, macOS y Windows. It is designed to provide general purpose DX, and contest logging. Está diseñado para proveer de log de propósito general, DX y concursos. It supports QSL management, import and export of ADIF Soporta gestión de QSL, importa y exporta formato ADIF and Cabrillo file formats and many other features... y Cabrillo y otras otras muchas funcionalidades... Before you can start using KLog, you will be asked to: Antes de empezar a usar KLog, se le pedirá que: Acknowledge to the terms of the license. Conocer los térmimos de la licencia. Download the DX entities information. Descargar los datos de entidades DX. Enter your callsign, CQ zone, etc. and main configuration. Introduzca el indicativo, zona CQ, etc y la configuración principal. Enjoy KLog and contact the development team if you have any suggestions! ¡Disfrute de KLog y contacte con el equipo de desarrollo si tiene alguna sugerencia! LicPage KLog License information Información de licencia de KLog Welcome to KLog!- brought to you under the terms of the GPL! ¡Bienvenido a KLog - disponible gracias a los términos de la GPL! Acknowledge Aceptar Be aware that KLog is free software. Sepa que KLog es software libre. LoTWUtilities KLog - LoTW password needed KLog - Contraseña de LoTW requerida Please enter your LoTW password: Introduzca su contraseña de LoTW: There is a file already existing with the name that will be used. Ya hay un fichero existente con el nombre a usar. The file %1 already exist. Do you want to overwrite? El fichero %1 ya existe. ¿Quiere sobreescribirlo? KLog was not able to save the file %1. Error returned: %2 KLog no pudo guardar el fichero %1. Error: #2 Downloading data to file: %1. Descargando datos al fichero: %1. KLog - LoTW download KLog - Descarga de LoTW This is the first date of a QSO with the callsign %1 in this log If you think that in LoTW you may have previous QSOs, answer No. Esta es la primera fecha de un QSO con el indicativo %1 en este log. Si piensa que en LoTW debe haber QSOs anteriores, conteste No. Do you want to use this date (%1) as start date? ¿Quiere usar esta fecha (%1) como fecha de inicio? The remote server redirected our connection to %1 El servidor remoto redirigió nuestra conexión a %1 Do you want to follow the redirection? ¿Quiere seguir esa redirección? It was not possible for find the file %1 that has been just downloaded. No es posible encontrar el archivo %1 que acaba de descargarse. It seems that LoTW has no QSO with the Station Callsign you are using (%1). Parece que en LoTW no hay ningún QSO con el indicativo de estación que está usando (%1). Try again and send the downloaded file (%1) to the KLog developer for analysis. Intentar otra vez y enviar el fichero descargado (%1) a los desarrolladores de KLog para su análisis. KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data? KLog descargó %1 correctamente: ¿Quiere actualizar su log con los datos descargados? Double click on the date that you want to use as the start date for downloading QSOs. Haga doble click en la fecha que quiere usar como fecha de inicio para la descarga de QSOs. KLog - LoTW Station callsign KLog - LoTW Indicativo de estación There is not a single QSO in the log with that station callsign. No hay ningún QSO en el log con ese indicativo de estación. Are you sure that you want to use that station callsign (%1)? ¿Está seguro de usar ese indicativo de estación(%1)? KLog - LoTW File already exists KLog - El fichero de LoTW ya existe KLog - LoTW Can't write the file KLog - No pudo escribirse el fichero de LoTW The file %1 already exists. El fichero %1 ya existe. KLog - LoTW Start date selection KLog - LoTW Fecha de inicio KLog - LoTW Download error KLog - Error de descarga de LoTW There was an error (%1) while downloading the file from LoTW. Hubo un error (%1) al descargar el archivo desde LoTW. The downloading error details are: %1 Los detalles del error de descarga es: %1 KLog - LoTW Redirection found KLog - Redirección encontrada en LoTW KLog - LoTW File not found KLog - Fichero de LoTW no encontrado KLog can't find the downloaded file. KLog no pudo encontrar el fichero descargado. KLog - LoTW user/password error KLog - Error de usuario/contraseña de LoTW LoTW server did not recognized your user/password El servidor de LoTW no reconoció su usuario/contraseña Check your user and password and ensure your are using the right one before trying again. Compruebe su usuario y contraseña y asegúrese de usar el correcto antes de intentarlo de nuevo. KLog - LoTW No QSOs KLog - Sin QSOs en LoTW LoTW sent no QSOs LoTW no envió QSOs KLog - LoTW Unknown error KLog - Error desconocido de LoTW KLog can't recognize the file that has been downloaded from LoTW. KLog no puede reconocer el archivo que ha sido descargado de LoTW. Now KLog will process the downloaded QSO and update your local log. Ahora KLog procesará los QSOs descargados y actualizará su log local. LogWindow QSL Send Enviar QSL QSL Rcvd QSL Recibida &Delete &Borrar Delete a QSO Borrar un QSO &Edit QSO &Editar QSO Edit this QSO Edita este QSO Via &bureau Vía &bureau Send this QSL via bureau Envía esta QSL vía bureau D&irect D&irecta Send this QSL via direct Envía esta QSL vía directa Via bureau Vía bureau QSL &received via bureau QSL &recibida vía bureau Direct Directa QSL received via direc&t QSL recibida vía direc&ta Check in QRZ.com Consultar en QRZ.com Check this callsign in QRZ.com Consulta este indicativo en QRZ.com. Check in DXHeat.com Consultar en DXHeat.com Check this callsign in DXHeat.com Consulta este indicativo en DXHeat.com. Delete selected QSOs Eliminar QSOs seleccionados Delete the selected QSOs Elimina los QSO seleccionados Export to ADIF Exportar a ADIF Export the selected QSOs to an ADIF file. Exportar los QSOs seleccionados a un fichero ADIF. Upload to LoTW Enviar a LoTW Upload the selected QSOs to LoTW Envía los QSOs seleccionados a LoTW Upload to ClubLog Enviar a ClubLog Upload the selected QSOs to ClubLog Envia los QSOs seleccionados a ClubLog Upload to eQSL.cc Enviar a eQSL.cc Upload the selected QSOs to eQSL.cc Envía los QSOs seleccionados a eQSL.cc Send these QSLs via bureau Enviar estas QSLs via bureau Send these QSLs via direct Enviar estas QSLs via directa QSLs received via bureau QSLs recibidas via bureau QSLs received via direc&t QSLs recibidas vía direc&ta Select none Anular selección Remove all selections Elimina todas las selecciones Select all Seleccionar todo Select all the QSOs Selecciona todos los QSOs MainQSOEntryWidget &Add &Añadir &Clear &Limpiar Callsign of the QSO. Indicativo del QSO. Band of the QSO. Banda del QSO. Mode of the QSO. Modo del QSO. Date of the QSO. Fecha del QSO. Time of the QSO. Hora del QSO. Add the QSO to the log. Añadir QSO al log. Clears the QSO entry. Limpia la entrada de QSO. Look up info about the current callsign on qrz.com Buscar información sobre el indicativo actual en qrz.com KLog will show real time if enabled. KLog mostrará tiempo real si se habilita. Real time Tiempo real Stop wsjt-x and hamlib from automatically updating QSO information. Evita que WSJT-X y Hamlib actualicen información automáticamente. Manual Mode Modo Manual Callsign Indicativo &Save &Guardar &Cancel &Cancelar DUPE Translator: DUPE is a common world for hams. Do not translate of not sure DUPE MainWindow Starting KLog Iniciando KLog DX Entity Entidad DX &Log Window Ventana de &Log KLog KLog Ready Listo An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: Ha ocurrido un error inesperado al intentar añadir el QSO al log. Si el problema persiste, contacte con el desarrollador para que lo analice: You have selected an entity: Ha seleccionado la entidad: that is different from the KLog proposed entity: que es distinta de la que propone KLog: Click on the prefix of the correct entity or Cancel to edit the QSO again. Pulse en el prefijo de la entidad correcta o Cancelar para editar el QSO de nuevo. Click on the prefix of the right entity or Cancel to correct. Pulse en el prefijo de la entidad correcta o Cancelar para corregir. RSTrx RSTrx RSTtx RSTtx KLog - CTY.dat update KLog - Actualización de CTY.dat KLog - Backup KLog - Copia de seguridad KLog - New version detected! KLog - ¡Se ha detectado una versión nueva de KLog! KLog - ClubLog error KLog - Error de ClubLog KLog - eQSL error KLog - Error de eQSL KLog - %1 KLog - %1 Do you really want to exit KLog? ¿Realmente quiere salir de KLog? &File &Archivo Import an ADIF file into the current log. Importar un fichero ADIF al log actual. Export the current log to an ADIF logfile. Exportar ellog actual al un fichero de log ADIF. Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Exportar TODOS los QSO a un fichero ADIF, mezclando los QSOs de todos los logs. Print your log. Imprime el log. KLog folder Carpeta KLog Opens the data folder of KLog. Abre la carpeta de datos de KLog. E&xit Sali&r &Tools Herramien&tas Fill in QSO data Completar QSOs Go through the log reusing previous QSOs to fill missing information in other QSOs. Revisar el log, reutilizando datos de QSOs anteriores para completar información que falte en otros QSOs. Shows QSOs for which you should send your QSL and request the DX QSL. Muestra QSOs para los que tenga que enviat la QSL y solicitar la QSL del DX. Find My-QSLs pending to send Buscar mis QSL pendientes de envío Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Muestra los QSOs que tienen QSL pendiente de enviar. ¡Debería mantener esta cola vacía! Mark all queued QSOs in this log as sent to LoTW. Marcar como encolados los QSOs de este log como enviados a LoTW. Mark all queued QSOs as sent to LoTW. Marca todos los QSOs encolados como enviados por LoTW. KLog - Update checking result KLog - Resultado de la comprobación de actualizaciones de KLog For updated DX-Entity data, update cty.csv. Actualizar cty.csv para actualizar los datos de entidades DX. Stats Estadísticas Show the statistics of your radio activity. Muestra estadísticas de la actividad en radio. &Help &Ayuda KLog - TQSL KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. TQSL no está instalado o KLog no puede encontrarlo. Por favor, revise la confirguración. Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded. Error #1: El proceso ha sido cancelado por el usuario o TQSL no estaba configurado. No se han subido los QSO. Error #2: Upload was rejected by LoTW, please check your data. Error #2: La subida de QSO fue rechazada por LoTW, por favor revise sus datos. Error #3: The TQSL server returned an unexpected response. Error #3: El servidor TQSL ha devuelto una respuesta inesperada. Error #4: There was a TQSL error. Error #4: Ha habido un error de TQSL. Error #5: There was a TQSLLib error. Error #5: Ha habido un error de TQSLLib. Error #6: It was not possible to open the input file. Error #6: No ha sido posible abrir el fichero de entrada. Error #7: It was not possible to open the ouput file. Error #7: No ha sido posible abrir el fichero de salida. Error #8: No QSOs were processed since some QSOs were duplicates or out of date range. Error #8: No se procesaron los QSO ya que algunos de ellos eran duplicados o estaban fuera de rango. Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range. Error #9: Se procesaron algunos QSO y otros se han ignorado porque eran duplicados o fuera de rango de fecha. Error #10: Command syntax error. KLog sent a bad syntax command. Error #10: Error de sintaxis en los comandos. KLog envió un comando con sintáxis errónea. Error #11: LoTW Connection error (no network or LoTW is unreachable). Error #11: Error de conexión a LoTW (no hay red o LoTW no está alcanzable). Error #00: Unexpected error. Please contact the development team. Error #00: Error inesperado. Por favor contacte con el equipo de desarrollo. The log that you have selected contains more than just one station callsign. El log que ha seleccionado contiene más de un sólo indicativo de estación. Please select the station callsign you want to mark as sent to LoTW: Por favor seleccione el indicativo de estación que quiere marcar como enviado a LoTW: Station Callsign: Indicativo de la estación: Define Station Callsign Definir indicativo de estación Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Introduzca el indicativo de estación para usar en este log o déjelo vacío para poner un QSO sin un indicativo de estación definido: KLog - No station selected KLog - No se ha seleccionado estación No station callsign has been selected and therefore no log will be marked No se ha seleccionado indicativo de estación por lo que no se exportará ningún log Congratulations! ¡Enhorabuena! You already have the latest version. Ya cuenta con la última versión. It seems that there are no QSOs in the database. Parece que no hay QSOs en la base de datos. There was an error while updating to Yes the LoTW QSL sent information. Hubo un error al actualizar a Si la información de envío de QSL por LoTW. You can find the KLog data folder here: Puede encontrar la carpeta de KLog aquí: start arrancar stop parar If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. Si está seguro de que la base de datos contiene QSOs y KLog no es capaz de encontrarlo, por favor contacte con los desarrolladores (mirar en Acerca de KLog) para obtener ayuda. KLog - File not open KLog - Fichero no abierto It was not possible to open the debug file for writing. No debug log will be saved! No fue posible abrir el fichero de depuración para escritura. No se guardará log de depuración. Your log has been updated with the LoTW downloaded QSOs. Su log ha sido actualizado con los datos de los QSOs descargados de LoTW. KLog has updated %1 QSOs from LoTW. KLog ha actualizado %1 QSOs de LoTW. Download from LoTW ... Descargar de LoTW ... Download the full log from LoTW ... Descargar de LoTW el log completo ... ClubLog tools ... Herramientas de ClubLog ... Upload the queued QSOs to ClubLog ... Envia los QSOs seleccionados a ClubLog ... eQSL tools ... Herramientas de eQSL ... Upload the queued QSOs to eQSL.cc ... Envia los QSOs seleccionados a eQSL.cc ... QRZ.com tools ... Herramientas de QRZ.com ... Upload the queued QSOs to QRZ.com ... Enviar QSOs en cola a QRZ.com ... Update cty.csv Actualizar cty.csv Update Satellite Data Actualizar datos de satélites &Tips ... Conse&jos ... &About ... &Acerca de ... About Qt ... Acerca de Qt ... Check updates ... Comprobar actualizaciones ... About ... Acerca de ... No QSOs have been exported to ADIF. No se han exportado QSOs a ADIF. KLog has exported %1 QSOs to the ADIF file: %2 KLog ha exportado %1 QSOs al fichero ADIF: %2 You need to select one station callsign to be able to send your log to ClubLog. Necesita seleccionar un indicativo de estación para poder mandar el log a ClubLog. Do you want to add this QSOs to your ClubLog existing log? ¿Quiere añadir estos QSOs a su log de Clublog ya existente? If you don't agree, this upload will overwrite your current ClubLog existing log. Si no acepta, este envío sobreescribirá su log existente en ClubLog. KLog - eQSL KLog - eQSL You need to select one station callsign to be able to send your log to eQSL.cc. Necesita seleccionar un indicativo de estación para poder mandar el log a eQSL. KLog - Select the Station Callsign. KLog - Seleccione indicativo de estación. Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: Rellenando DXCC, CQz, ITUz Continente en los QSOs... QSO: QSO logged from WSJT-X: QSO guardado desde WSJT-X: Status bar ... Barra de estado ... Upload the queued QSOs to LoTW Enviar QSOs en cola a LoTW KLog needs to update the Entities database. KLog necesita actualizar la base de datos de entidades. It seems that you have never done a backup or exported your log to ADIF. Parece que no ha hecho nunca una copia de seguridad o exportado su log a ADIF. It seems that the latest backup you did is older than one month. Parece que la última copia de seguridad que hizo fue hace más de un mes. Log backup recommended! ¡Se recomienda hacer una copia de seguridad! It is a good practice to backup your full log regularly to avoid loosing data in case of a problem. Once you export your log to an ADIF file, you should copy that file to a safe place, like an USB drive, cloud drive, another computer, ... KLog will remind you to backup on a monthly basis. Hacer copias de seguridad de todo el log de forma regular es una buena práctica para evitar la pérdida de datos en caso de problemas. Una vez se haya exportado el log aun fichero ADIF, ese fichero debería guardarse en un lugar seguro como un disco USB, carpeta en cloud, otro ordenador, ... KLog recordará hacer una copia de seguridad una vez al mes. The backup was done successfully La copia de seguridad se realizó correctamente. KLog will remind you to backup your data again in aprox one month. KLog no le recordará de nuevo, en un mes, que debe realizar la copia de seguridad. The backup was not properly done. La copia de seguridad no se hizo correctamente. It is recommended to backup your data periodically to prevent lose or corruption of your log. Se recomienda hacer una copia de seguridad de forma periódica para prevenir una potencial pérdida de datos. It seems that you are running this version of KLog for the first time. Parece que está ejecutando esta versión de KLog por primera vez. The setup will be open to allow you to do any new setup you may need. Se abrirá la el menú de configuración para que pueda hacer cualquier nueva configuración que pueda necesitar. KLog - Unexpected error KLog - Error inesperado KLog - Not valid call KLog - Indicativo no válido Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. Añadir indicativos no válidos al log puede crear problemas al optar a diplomas, exportar ficheros ADIF a otros sistemas o aplicaciones. KLog - Select correct entity KLog - Seleccione la entidad correcta No DXCC NO DXCC None Ninguno This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. Esta operación eliminará definitivamente todos los QSOs seleccionados y datos asociados y no será posible recuperarlos de nuevo. You have requested to delete the QSO with: %1 Ha solicitado eliminar un QSO con: %1 Are you sure? ¿Está seguro? Check always the current callsign in QRZ.com Comprobar siempre el indicativo actual en QRZ.com You can update the entities database in Tools->Update cty.csv Puede actualizar la base de datos de entidades en Herramientas->Actualizar cty.csv Do you want to do it now? ¿Quiere hacerlo ahora? The callsign %1 is not a valid call. Do you really want to add this callsign to the log? El indicativo %1 no es un indicativo válido. ¿Quiere realmente añadir este indicativo al log? KLog - Not valid callsign KLog - Indicativo no válido The callsign %1 is not a valid callsign. Do you really want to add this callsign to the log? El indicativo %1 no es un indicativo válido. ¿Quiere realmente añadir este indicativo al log? You have requested to delete several QSOs Ha seleccionado eliminar varios QSOs The ClubLog upload process has finished with an error and the log was possibly not uploaded. El proceso de subida de datos a ClubLog terminó con un error y es posible que no se haya subido el log. Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 Por favor, compruebe sus credenciales, su conexión a Internet y su cuenta de Clublog. El error recibido fue: %1 Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? ¿Quiere marcar como enviados todos los QSOs enviados a ClubLog? KLog - ClubLog KLog - ClubLog There was an error while updating to Yes the ClubLog QSO upload information. Hubo un problema al marcar como enviados los QSO enviados a ClubLog. The ClubLog upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? El proceso de subida de ClubLog ha terminado y KLog ha creado un fichero (%1) en su carpeta de KLog. ¿Quiere eliminar ese fichero? The file has not been removed. No se ha eliminado el fichero. It seems that there was something that prevented KLog from removing the file You can remove it manually. Nos e pudo eliminar el fichero. Puede eliminarlo manualmente. The eQSL upload process has finished with an error and the log was possibly not uploaded. El proceso de subida de datos a eQSL terminó con un error y es posible que no se haya subido el log. Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1 Por favor, compruebe sus credenciales, su conexión a Internet y su cuenta de eQSL. El error recibido fue: %1 Do you want to mark as Uploaded all the QSOs uploaded to eQSL? ¿Quiere marcar como enviados todos los QSOs enviados a eQSL? There was an error while updating to Yes the eQSL QSO upload information. Hubo un problema al marcar como enviados los QSO enviados a eQSL. The eQSL upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? El proceso de subida de eQSL ha terminado y KLog ha creado un fichero (%1) en su carpeta de KLog. ¿Quiere eliminar ese fichero? The QRZ.com upload process has finished with an error and the log was possibly not uploaded. El proceso de subida de datos a QRZ.com terminó con un error y es posible que no se haya subido el log. Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? ¿Quiere marcar como enviados todos los QSOs enviados a QRZ.com? KLog - QRZ.com KLog - QRZ.com There was an error while updating to Yes the QRZ.com QSO upload information. Hubo un problema al marcar como enviados los QSO enviados a QRZ.com. The QRZ.com upload process has finished successfully El proceso de envio a QRZ.com ha terminado satisfactoriamente. Call not found in QRZ.com Indicativo no encontrado en QRZ.com KLog - QRZ.com error KLog error de QRZ.com It was not possible to define the KLog folder. Some functions may not work properly! No fue posible definir la carpeta de KLog. Algunas funciones pueden no funcionar correctamente. KLog has received an error from QRZ.com. KLog ha recibido un error de QRZ.com. You need to activate the %1 service in the eLog preferences. Necesita activar el servicio %1 en las preferencias de eLog. KLog - Exit KLog - Salir The logfile has been modified. Se ha modificado el log. Do you want to save your changes? ¿Quiere guardar los cambios? KLog - ADIF export KLog - Exportado de ADIF It is important to export to ADIF and save a copy as a backup. Es importante exportar a ADIF y guardar una copia de seguridad. Saving the log was done successfully. El proceso de salvado del log ha terminado satisfactoriamente. The ADIF export was not properly done. La exportación a ADIF no terminó correctamente. &Import from ADIF ... &Importar desde ADIF ... Export to ADIF ... Exportar a ADIF ... Export all logs to ADIF ... Exportar todos los logs a ADIF ... &Print Log ... Im&primir Log ... QSL tools ... Herramientas de QSL ... Find QSO to QSL Buscar QSO para enviar QSL Find DX-QSLs pending to receive Buscar QSL DX pendientes de recibir Shows DX-QSLs for which requests or QSLs have been sent with no answer. Muestra las QSLs de estaciones DX que se han solicitado o hemos enviado pero no tenemos respuesta. Find requested pending to receive Buscar solicitadas sin recibir Shows the DX-QSLs that have been requested. Muestra QSLs DX que se han solicitado. LoTW tools ... Herramientas LoTW ... Queue all QSLs from this log to be sent Encolar, para enviar, todos los QSOs de este log Mark all non-sent QSOs in this log as queued to be uploaded. Encolar, para enviar, todos los QSOs no enviados de este log Queue all QSLs to be sent Poner en la cola de envío todas las QSL Put all the non-sent QSOs in the queue to be uploaded. Pone todos los QSOs mp enviados en la cola para ser enviados. Mark all queued QSOs from this log as sent Marcar todos los QSOs de este log como enviados Mark all queued QSOs as sent Marcar como enviados todos los QSO de la cola Check the current callsign in QRZ.com Comprobar el indicativo actual en QRZ.com Queue all the QSO to be uploaded Marcar todos los QSOs para ser enviados Online manual (F1) ... Manual online (F1) ... &Debug ... &Debug ... Do you really want to mark ALL the QSOs of this log to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. ¿Quiere marcar TODOS los QSOs de este log para subir? Debería hacer esto SOLO SI ES LA PRIMERA VEZ que sube QSOs a LoTW. All pending QSOs of this log has been marked as queued for LoTW! Todos los QSO pendientes de este log se han añadido a la cola de LoTW. There was a problem to mark all pending QSOs of this log as queued for LoTW! ¡Hubo un problema al poner en la cola de LoTW los QSOs pendientes! Your log has not been updated. Su log no ha sido actualizado. No QSO was updated with the data coming from LoTW. This may be because of errors in the logfile or simply because your log was already updated. No se actualizó ningún QSO con los datos llegados de LoTW. Puede ser por errores en el fichero de log o simplemente porque el log ya estaba actualizado. Do you really want to mark ALL pending QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. ¿Quiere marcar TODOS los QSOs pendientes por subir? Debería hacer esto SOLO SI ES LA PRIMERA VEZ que sube QSOs a LoTW. All pending QSOs has been marked as queued for LoTW! Se han puesto en la cola de LoTW todos los QSOs pendientes. All queued QSOs has been marked as sent to LoTW! ¡Se han marcado como enviados a LoTW todos los QSOs en cola! There was a problem to mark all queued QSOs of this log as sent to LoTW! ¡Hubo un problema al marcar todos los QSO en cola de este log como enviados a LoTW! Always check the current callsign in QRZ.com Comprobar siempre el indicativo actual en QRZ.com Upload queued QSOs to LoTW Enviar QSOs en cola a LoTW Do you want to update now? ¿Quiere actualizar ahora? You seem to have never backed up or exported your log to ADIF. Parece que no ha hecho nunca una copia de seguridad o exportado su log a ADIF. Your latest backup seems older than one month. Parece que la última copia de seguridad que hizo fue hace más de un mes. Regular backups prevent data loss and are good operator practice. Once exported, copy your ADIF file to a safe place such as a USB drive, cloud drive or other offsite computer. KLog will remind you to backup on a monthly basis. Hacer copias de seguridad de todo el log de forma regular es una buena práctica para evitar la pérdida de datos en caso de problemas. Una vez se haya exportado el log aun fichero ADIF, ese fichero debería guardarse en un lugar seguro como un disco USB, carpeta en cloud, otro ordenador, ... KLog recordará hacer una copia de seguridad una vez al mes. Backup completed successfully La copia de seguridad se terminó correctamente. KLog will remind you again in approximately one month. KLog no le recordará de nuevo, en un mes, que debe realizar la copia de seguridad. Backup failed. Falló la copia de seguridad. Periodic data backups are recommended to prevent data loss and corruption of your log. Exporte periódicamente los datos a ADIF para prevenir una potencial pérdida de datos. The setup will now open to allow you to change your settings. Se abrirá la el menú de configuración para que pueda hacer cualquier nueva configuración que pueda necesitar. UDP Server error The UDP server failed to %1. start or stop Error del servidor UDP El servidor de UDP falló al %1. TQSL finished with no error. Do you want to mark as Sent all the QSOs uploaded to LoTW? El proceso de subida de TQSL terminó sin errores. ¿Quiere marcar como enviados todos los QSOs enviados a LoTW? The selection you have done does not include any qso-> La selección no incluye ningún QSO. Select the Station Callsign to use when quering LoTW: Seleccione el indicativo de estación a usar cuando se consulte a LoTW: Please check the LoTW setup Por favor revise la configuración de LoTW You have not defined a LoTW user or a proper Station Callsign. Open the LoTW tab in the Setup and configure your LoTW connection. No ha definido un usuario de LoTW o un indicativo de estación adecuado. Abra la pestaña de LoTW en las Preferencias y configure su conexión a LoTW. The log is ready to be uploaded to ClubLog. El log está listo para enviarse a ClubLog. All the QSOs in this log has been marked as Modified in the ClubLog status field Todos los QSOs de este log se han marcado, como modificados, para ser enviados a ClubLog. KLog could not mark the full log to be sent to ClubLog KLog no pudo marcar el log completo para ser enviado a ClubLog Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers. Algo evitó que KLog pudiera marcar los QSOs como modificados. Reinicie KLog y pruebe de nuevo antes de contactar con el equipo de desarrollo de KLog. The log is ready to be uploaded to eQSL.cc. El log está listo para enviarse a eQSL.cc. All the QSOs in this log has been marked as Modified in the eQSL.cc status field Todos los QSOs de este log se han marcado, como modificados, para ser enviados a eQSL.cc. KLog could not mark the full log to be sent to eQSL KLog no pudo marcar el log completo para ser enviado a eQSL The log is ready to be uploaded to QRZ.com. El log está listo para enviarse a QRZ.com. All the QSOs in this log has been marked as Modified in the QRZ.com status field Todos los QSOs de este log se han marcado, como modificados, para ser enviados a QRZ.com. KLog could not mark the full log to be sent to QRZ.com KLog no pudo marcar el log completo para ser enviado a QRZ.com You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. Necesita introducir una clave API (API key) correcta para el libro de guardia de QRZ.com en las preferencias de eLog. Filling QSOs ... Completando QSOs ... Date/Time Fecha/Hora Callsign Indicativo Printing the log ... Imprimiendo el log ... KLog - QSO received KLog - QSO recibido Station Callsign Indicativo de la estación Operator Callsign Operador KLog - WSJTX Dupe QSO KLog - QSO duplicado de WSJTX This QSO seems to be duplicated. Do you want to save or discard it? Este QSO parece duplicado. ¿Quiere guardarlo o descartarlo? KLog - Non-supported mode KLog - Modo no soportado A new mode not supported by KLog has been received from an external program or radio: Se ha recibido un nuevo modo no soportado por KLog desde un programa externo o la radio: Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) ¿Quiere seguir recibiendo estas alertas? (deshabilitar esta alerta evitará que los modos no válidos se detecten) KLog - QSO Dupe KLog - QSO duplicado A dupe QSO has been detected in the file and will not be added to the log. Se ha detectado un QSO duplicado y no se añadirá al log. Please check the QSO information file and ensure it is properly added. Revise el fichero de información de QSO y asegúrese de que se ha añadido correctamente. Native Error Error nativo Recommendation: Recomendación: Periodically export your data to ADIF to prevent a potential data loss. Exporte periódicamente los datos a ADIF para prevenir una potencial pérdida de datos. Status of the DX entity. Estado de la entidad DX. Name of the DX entity. Nombre de la entidad DX. QSO QSO QSL QSL eQSL eQSL Comment Comentario Others Otros My Data Mis datos Satellite Satélite DXCC DXCC Info Info Awards Diplomas Search Buscar Log Log DX-Cluster DX-Cluster Save ADIF File Salvar fichero ADIF Queue all the QSOs to be uploaded Marcar todos los QSOs para ser enviados You need to select one station callsign to be able to send your log to LoTW. Necesita seleccionar un indicativo de estación para poder mandar el log a LoTW. The LoTW upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? El proceso de subida de LoTW ha terminado y KLog ha creado un fichero (%1) en su carpeta de KLog. ¿Quiere eliminar ese fichero? The file has been removed. Se ha eliminado el fichero. You have selected no callsign. KLog will complete the QSOs without a station callsign defined and those with the callsign you are entering here. No ha seleccionado un indicativo. KLog completará los QSOs sin un indicativo de estación con el indicativo que se introduzca aquí. KLog - LoTW KLog - LoTW KLog - Stop the war in Ukraine! KLog - Paremos la guerra de Ucrania! KLog - Stop the war in Ukraine! KLog - Paremos la guerra de Ucrania! You are using a Russian call (%1). You can probably help to stop the Russian war, people are dying. Please call your leaders to stop the war. Tiene un indicativo ruso (%1). Probablemente pueda ayudarnos a parar la guerra de Rusia, la gente está muriendo. Por favor haga un llamamiento a sus líderes para parar la guerra. You are using an Ukranian call. Please take care and protect yourself and your family. The KLog developers wish you the best of luck in this very difficult moment. Tiene un inficativo ucraniano. Tenga cuidado y protéjase usted y su familia. Los desarrolladores de KLog le desean la mejor de las suertes en este momento tan difícil. People are dying in the war of Russia against Ukraine. You can help to stop the Russian war against Ukraine. Please show your disagreement to your leaders, or in your social network to stop the war. La gente está muriendo en la guerra de Rusia contra Ucrania. Puede ayudar a parar la guerra de Rusia contra Ucrania. Muestre su descontento a sus líderes o a través de redes sociales para parar la guerra. KLog - KLog folder not found KLog - Carpeta de KLog no encontrada KLog - Settings update KLog - Actualización de configuración The settings system has been changed and KLog will update your settings file. El sistema de configuración ha cambiado y KLog debe actualizar el fichero de configuración. This version of KLog requires that the DXCC database is updated. Esta versión requiere que se actualice la base de datos del DXCC. The database will be updated. La base de datos se actualizará. KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Log de %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 KLog-%1 - Log de %2 - Estación: %3 QSOs: %4 KLog - QRZ.com warning KLog - Aviso de QRZ.com QRZ.com has returned a non-subcribed error and queries to QRZ.com will be disabled. QRZ.com ha devuelto un error de sin-subcripción y se deshabilitarán las peticiones a QRZ.com. Please check your QRZ.com subcription or credentials. Compruebe su subscripción a QRZ.com o sus credenciales. Settings ... Ajustes ... Queue all QSOs from this log to be sent Encolar todos los QSOs de este log para enviar Show Map Mostrar mapa Now you can upload them to LoTW. Puede enviarlos ahora a LoTW. There was a problem to mark all pending QSOs as queued for LoTW! ¡Hubo un problema al poner en la cola de LoTW los QSOs pendientes! All queued QSOs of this log has been marked as sent to LoTW! ¡Se han marcado como enviados a LoTW todos los QSOs en cola! There was a problem to mark all queued QSOs as sent to LoTW! ¡Hubo un problema al marcar todos los QSO en cola como enviados a LoTW! The selection you have done does not include any QSO La selección no incluye ningún QSO. The selection you have done does not include any QSO. La selección no incluye ningún QSO. Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1 ¿Quiere marcar TODOS los QSOs para subir? Debería hacer esto SOLO SI ES LA PRIMERA VEZ que sube QSOs a %1. ClubLog ClubLog KLog - QRZ.COM KLog - QRZ.com QRZ.COM QRZ.com To upload QSOs you need a qrz.com subscription. If you have one, go to Setup->QRZ.com tab to enable it. Para subir QSOs necesita una subscripción a QRZ.com. Si tiene una, vaya a Preferencias->QRZ.com para habilitarlo Open File Abrir fichero - Needed for DXMarathon - Necesitado para DXMarathon Abort filling Cancelar completado Number Número Band Banda Mode Modo Print Log Imprimir log Abort printing Cancelar impresión Printing the log... QSO: Imprimiendo el log ... QSO: The following QSO data has been received from WSJT-X to be logged: Se ha recibido el siguiente QSO desde WSJT-X para ser guardado: Freq Frec Time On Hora inicio Time Off Hora fin RST TX RST TX RST RX RST RX DX-Grid DX locator Local-Grid Locator local Duplicated QSOs have to match another existing QSO with the same call, band, mode, date and time, taking into account the period that can be defined in the settings. Los QSOs duplicados deben coincidir con otro QSO existente en el indicativo, banda, modo, fecha y hora, teniendo en cuenta el periodo que puede ser definido en las preferencias. If the received mode is correct, please contact KLog development team and request support for that mode So el modo recibido es correcto, contacte con el equipo de desarrollo de KLog y solicite soporte para ese modo KLog - Duplicated satellite KLog - Satélite duplicado A duplicated satellite has been detected in the file and will not be imported. Se ha detectado un satélite duplicado en el fichero y no se importará. Please check the satellite information file and ensure it is properly populated. Por favor, revise el fichero de la información de satélites y asegúrese de que está correctamente relleno. Now you will see a more detailed error that can be used for debugging... Ahora verá errores más detallados que pueden ser usados para depurar ... An unexpected error ocurred!! ¡Ha ocurrido un error inesperado! If the problem persists, please contact the developers Si el problema persiste contacte con los desarrolladores for analysis: para que lo analicen: Error in function Error en la función Error text Texto del error Failed query Consulta fallida KLog - Show errors KLog - Mostrar errores Do you want to keep showing errors? ¿Quiere seguir viendo los errores? MainWindowInputComment Comment Comentario Add a comment for this QSO. Añadir un comentario a este QSO. Keep this data Mantener estos datos Data entered in this tab will be copied into the next QSO. Los datos introducidos en esta pestaña se copiarán al próximo QSO. MainWindowInputEQSL Date of the ClubLog upload. Dato del envío a ClubLog. Date of the QRZ.com upload. Fecha del envío a QRZ.com. Date of the eQSL sending. Fecha del envío de eQSL. Date of the eQSL reception. Fecha de la recepción de eQSL. Date of the LoTW sending. Fecha del envío de LoTW. Date of the LoTW reception. Fecha de la recepción de LoTW. Status on QRZ.com. Estado en QRZ.com. Status of the LoTW sending. Estado del envío de LoTW. Status of the LoTW reception. Estado de la recepción de LoTW. QRZ.com QRZ.com LoTW Sent Envío LoTW LoTW Rec Recepción LoTW Status on ClubLog. Estado en ClubLog. Status of the eQSL sending. Estado de envío de eQSL. Status of the eQSL reception. Estado de recepción de eQSL. ClubLog ClubLog eQSL Sent Envío eQSL eQSL Rec Recepción eQSL MainWindowInputOthers Primary Div Div principal Secondary Div Div secundaria IOTA IOTA Entity Entidad Propagation mode Modo de propagación Others Otros Keep propagation mode Mantener modo de propagación Select the primary division for this QSO. Seleccionar la división principal de este QSO. Select the secondary division for this QSO. Seleccionar la división secundaria de este QSO. Select the entity for this QSO. Seleccionar la entidad de este QSO. Select the propagation mode for this QSO. Seleccionar el modo de propagación de este QSO. Select the IOTA continent for this QSO. Seleccionar el continente IOTA de este QSO. Select the IOTA reference number for this QSO. Seleccionar la referencia IOTA de este QSO. Keeps the same propagation mode for next QSO. Mantiene el mismo modo de propagación para el siguiente QSO. Select the appropriate ADIF field for this QSO. Seleccione el tipo ADIF adecuado para este QSO. Value for the selected ADIF field. Valor del tipo ADIF seleccionado. Not Identified Sin identificar Not - Not Identified No - Sin identificar SOTA Ref Ref SOTA Age Edad VUCC grids Locators VUCC Distance Distancia MainWindowInputQSL QSL Sent QSL Enviada QSL Rec QSL Rec QSL Via QSL Vía QSL Msg Msj QSL Status of the QSL sending. Estado del envío de QSL. Status of the QSL reception. Estado de la recepción de QSL. QSL sending information. Información de envío de QSL. QSL reception information. Información de recepción de QSL. Date of the QSL sending. Fecha del envío de QSL. Date of the QSL reception. Fecha de recepción de QSL. Message of the QSL. Mensaje de la QSL. QSL via information. Información de QSL via. MainWindowInputQSO TX RST. RST enviado. RX RST. RST recibido. TX Frequency in MHz. Frecuencia de TX en MHz. RX Frequency in MHz. Frecuencia de RX en MHz. Power used by the contacted station. Potencia usada por la estación contactada. Name of the contacted operator. Nombre del operador contactado. QTH of the contacted station. QTH de la estación contactada. Locator of the contacted station. Locator de la estación contactada. Watts Vatios MHz MHz Split Translator: Split is a common hamradio term. Do not translate unless you are sure. Split Name Nombre QTH QTH DX Locator Locator DX Power(rx) Potencia(rx) RST RST TX TX RX RX Frequency Frecuencia RST(tx) RST(tx) RST(rx) RST(rx) Freq TX Frec TX Freq RX Frec RX DX QTH locator. QTH locator de DX. DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. QTH locator de DX. ELformato debe ser Maidenhead como en IN70AA hasta 10 caracteres. TX Frequency in MHz. Frequency is not in a hamradio band! Frecuencia de TX en MHz. ¡La frecuencia no está en una banda de radioaficionados! RX Frequency in MHz. Frequency is not in a hamradio band! Frecuencia de RX en MHz. ¡La frecuencia no está en una banda de radioaficionados! MainWindowMyDataTab Watts Vatios Keep this data Mantener estos datos My QTH locator. Mi QTH locator. Power Potencia Operator callsign Indicativo del operador Station Callsign Indicativo de la estación My Locator Mi locator My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. Mi QTH Locator. El formato debe ser Maidenhead como en IN70AA y hasta 10 caracteres. My Rig Mi equipo My Antenna Mi antena My SOTA_Ref Mi ref SOTA My VUCC_GRIDS Mis locators VUCC MainWindowSatTab Keep this data Mantener estos datos Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Nombre del satélite si no está en la lista: Seleccione "%1" para habilitar este cuadro (formato como AO-51). Satellite mode used. Modo usado en el satélite. Select the satellite you are using. Selecciona el satélite que se está usando. UpLink band. Banda de subida (TX de la estación en tierra). DownLink band. Banda de bajada (RX de la estación en tierra). Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. Locator de la estación DX. Este cuadro se sincroniza con el cuadro de locator en la pestaña QSO. UpLink Subida DownLink Bajada Satellite Satélite Mode Modo DX Locator Locator DX Other Otro MHz MHz Locator of the DX station. Format should be Maidenhead like IN70AA up to 10 characters. Locator de la estación DX. El formato debe ser Maidenhead como en IN70AA y hasta 10 caracteres. Not Sat QSO QSO sin satélite KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. KLog ha detectado un nombre de satélite no reconocido. Si debería ser uno de los satélites conocidos, por favor seleccionelo de la lista. Alternativamente puede contactar con el equipo de desarrollo para que añadan el nuevo nombre de satélite. Please be aware that the satellite name will not be saved if it is not in the list, so that information may be lost! ¡Tenga en cuenta que el nombre del satélite no se guardará si no está en la lista y puede perder esa información! RX Frequency in MHz. Frequency is not in a hamradio band! Frecuencia de RX en MHz. ¡La frecuencia no está en una banda de radioaficionados! RX Frequency in MHz. Frecuencia de RX en MHz. TX Frequency in MHz. Frequency is not in a hamradio band! Frecuencia de TX en MHz. ¡La frecuencia no está en una banda de radioaficionados! TX Frequency in MHz. Frecuencia de TX en MHz. Other - Sat not in the list Otro - Satélite no en la lista Data entered in this tab will be copied into the next QSO. Los datos introducidos en esta pestaña se copiarán al próximo QSO. The satellite you have in your QSO is: El satélite que tiene en su QSO es: MapWindowWidget Select QSOs in this band. Seleccionar QSOs en esta banda. Select QSOs in this mode. Seleccionar QSOs en este modo. Select QSOs in this propagation mode. Seleccionar QSOs con este modo de propagación. Select QSOs using this Satellite. Seleccionar QSOs por satélite. Only confirmed Solo confirmados Select only confirmed QSOs. Selecciona sólo QSOs confirmados. All bands Todas las bandas Show nothing No mostrar nada All modes Todos los modos All propagation modes Todos los modos de propagación All satellites Todos los satélites OnlineMessageWidget The server returned the following error: %1 El servidor envió el siguiente error: %1 Not identified No identificado QObject Database Error Error de base de datos KLog DB needs to be upgraded. La BD de KLog necesita actualizarse. Do you want to upgrade it now? ¿Quiere actualizar ahora? If DB is not upgraded KLog may not work properly. Si no actualiza la base de datos es posible que KLog no funcione correctamente. Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea. Actualizar el programa puede, potencialmente, crear problemas. Hacer una copia de seguridad de su base de datos antes de actualizar es siempre una buena idea. Do you want to backup your DB now? ¿Quiere hacer una copia de seguridad de su base de datos ahora? The backup finished successfully. La copia de seguridad se terminó correctamente. You can find the backup in this file: %1 Puede encontrar la copia de seguridad en este fichero: %1 The backup was not properly done. La copia de seguridad no se hizo correctamente. You will be sent back to the starting point. Será enviado al punto de inicio. KLog - DB can't be updated automatically KLog - la BBDD no se puede actualizar automáticamente You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version. Está actualizando desde una versión de KLog demasiado antigua y esta actualización no puede hacerse automáticamente desde esa versión. KLog - DB update KLog - Actualización BBDD KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. KLog ha detectado un log anterior en la BD. Todos los datos serán migrados a un log tipo DX creado para usted. KLog: Enter Station callsign KLog: Introduzca indicativo Enter the station callsign used in this log Introduzca el indicativo usado en este log Station Callsign Indicativo de la estación QSO: QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? Cancelar esta actualización causará inconsistencia de datos y posible pérdida de datos. ¿Quiere cancelar? Progress: Progreso: Updating DXCC award information... Actualizando la información de DXCC ... Updating DXCC Award information... Actualizando la información de DXCC ... Updating WAZ award information... Actualizando la información de WAZ ... Updating WAZ Award information... Actualizando la información de WAZ ... Updating mode information... Actualizando información de modo... The process to upgrade is: - Using an old KLog version export your log to ADIF. - Remove your logbook.dat file from your KLog folder. - Install the new KLog version. - Import your ADIF file. KLog will finish when you click on OK. El proceso es el siguiente: - Usando una versión antigua de KLog exportar el log a un fichero ADIF. - Eliminar el fichero logbook.dat de la carpeta de KLog. - Instalar la nueva version de KLog. - Importar el fichero ADIF. KLog finalizará cuando pulse sobre OK. All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay. Todos los datos se han migrado de forma correcta. Ahora debería ir a Preferencias->Logs para comprobar que todo está bien. Abort updating Cancelar actualización Updating bands information... Actualizando información de bandas... Updating bands information in %1 status... Actualizando información de bandas en %1... Updating mode information in %1 status... Actualizando información de modos en %1... New One, work it! nNew One, work it! ¡Nuevo, trabájelo! Needed, work it! ¡Necesitado, trabájelo! Worked but not confirmed Trabajado pero no confirmado Confirmed Confirmado Not identified No identificado KLog is already running. KLog ya se está ejecutando. It is allowed to run only one instance. Solo puede ejecutarse una instancia a la vez. Install wizard was canceled before completing... El asistente de instalación fué cancelado antes de terminar... Do you want to remove the KLog dir from your disk? ¿Quiere eliminar la carpeta de KLog de su disco? Your KLog dir has been removed Su directorio de KLog ha sido eliminado I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. No se pudo eliminar su directorio de KLog. Debería eliminarlo manualmente si no lo quiere en su disco duro. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. No se pudo eliminar su directorio de KLog. Debería eliminarlo manualmente si no lo quiere en su disco duro. Remember that your KLog dir is on your system... Recuerde que la carpeta de KLog está en su sistema... Thank you for running KLog! ¡Gracias por usar KLog! Updating information... Actualizando información... Updating DXCC and Continent information... Actualizando la información de DXCC y continente... A wrong callsign has been found: %1. Please enter a new callsign or confirm that the current one is a good callsign. Se ha encontrado un indicativo incorrecto: %1. Introduzca el nuevo indicativo o confirme si el actual es correcto. An empty callsign has been detected. If it is possible, please enter the right call. Se ha detectado un indicativo vacío. Si es posible, introduzca el indicativo correcto. KLog - Not valid callsign found KLog - Indicativo no válido encontrado Date Fecha Call Indicativo RSTtx RSTtx RSTrx RSTrx Band Banda Comment Comentario Mode Modo CQz CQz ITUz ITUz DXCC DXCC Address Dirección Age Edad County Pais A_Index A_Index Ant_Az Azimuth Ant_El Elevación Ant_Path Paso ARRL_SECT Sección ARRL Award_Submitted Diploma enviado Award_granted Diploma concedido Band_RX Banda RX CheckContest Comprobacion Concurso Class Clase ClubLog SDate c ClubLog status Estado ClubLog Continent Continente Contacted Op Operador contactado Contest Id Id Concurso Country País Credit Submitted Credit enviado Credit granted Credit otorgado Dark Dok Do not translate if unsure, common hamradio term. DOK de DARC Fists Do not translate if unsure, common hamradio term. FISTS Fists CC Do not translate if unsure, common hamradio term. FISTS CC My Fists Do not translate if unsure, common hamradio term. Mi FISTS Nr bursts Do not translate if unsure, common hamradio term. Ráfagas Nr pings Do not translate if unsure, common hamradio term. Núm «pings» Sat mode Modo Sat SWL Do not translate if unsure, common hamradio term. SWL Ten-Ten Do not translate, it is a hamradio group name. Ten-Ten Distance Distancia Contacted_Op Operador contactado Email Correo-e EQ_Call EQ_Call eQSL RDate eQSL Fecha rec eQSL SDate eQSL Fecha env eQSL Rcvd eQSL recv eQSL Sent Envío eQSL Force Init Freq Frec Freq RX Frec RX Gridsquare Locator Guest OP Op invitado HRDLog SDate HRDLog Fecha env HRDLog status Estado HRDLog IOTA IOTA IOTA Island id Id isla IOTA K Index Ãndice K Lat Lat Lon Lon LoTW RDate LoTW Fecha rec LoTW SDate LoTW Fecha env LoTW Rcvd Recepción LoTW LoTW Sent Envío LoTW Max Bursts max ráfagas MS Shower Lluvia MS My Antenna Mi antena My City Mi ciudad My Cnty My condado My Country Mi país My CQz Mi zona CQ My DXCC Mi DXCC My Gridsquare Mi locator My IOTA Mi IOTA My IOTA island id Mi id isla IOTA My ITUz Mi zona ITU My Lat Mi Lat My Lon Mi Lon My Name Mi nombre My Postal code Mi código postal My Rig Mi equipo My Sig Mi Sig My Sig Info Mi info Sig My SOTA ref Mi ref SOTA My State Mi estado My Street Mi calle My USACA counties Mis condados USACA My VUCC grids Mis locator VUCC Name Nombre Notes Notas Operator Operador Owner Callsign Indicativo del dueño Pfx Pref Points Puntos Precedence Precedencia Prop Mode Modo de propagación Public Key Clave pública QRZcom SDate QRZcom Fecha env QRZcom status Estado en QRZ.com QSL msg Mensaje QSL QSL RDate QSL Fecha rec QSL SDate QSL Fecha env QSL Rcvd QSL Recibida QSL Sent QSL Enviada QSL rcvd via QSL rcvd via QSL sent via QSL enviada via QSL via QSL via QSO complete QSO completo QSO random QSO random QTH QTH Region Región Rig Equipo RX Pwr Potencia RX Sat name Nombre de Sat SFI SFI Sig Sig Sig Info Info de sig Silent key Do not translate if unsure, common hamradio term. Fallecido (SK) SKCC SKCC SOTA Ref Ref SOTA SRX String SRX texto SRX SRX STX String STX texto State Estado Submode Submodo UKSMG UKSMG USACA counties Condados USACA VE prov Provincias VE VUCC grids Locators VUCC TX Pwr Potencia TX Web Web QSO Date off Fecha fin QSO Log number Número de log SearchWidget &Clear &Limpiar &Select All &Seleccionar todos &Search Bu&scar &Export Highlighted &Exportar marcados All logs Todos los logs Clear the searches. Limpiar búsquedas. Export the search result to an ADIF file. Exporta el resultado de la búsqueda a un fichero ADIF. Select/Unselect all the QSOs shown. Selecione/Deseleccione todos los QSOs mostrados. Search in the log. Buscar en el log. Search in all logs. Buscar en todos los logs. Select the Station Callsign used to do this QSO. Seleccione el indicativo de estación usado en este QSO. All in log Todos los logs Not defined Sin definir &Clear selection &Limpiar selección Save File Guardar fichero You have requested to delete the QSO with: %1 Ha solicitado eliminar un QSO con: %1 Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs! Introduzca el indicativo a buscar. Introduzca '*' para mostrar todos los QSOs... puede ser lento en logs grandes! Are you sure? ¿Está seguro? SearchWindow Date/Time Fecha/Hora Band Banda Mode Modo QSL Sent QSL Enviada QSL Rcvd QSL Recibida Station Callsign Indicativo de la estación ID ID Call Indicativo Date/time Fecha/Hora Station callsign Indicativo de estación QSL Send Enviar QSL &Delete &Borrar Delete a QSO Borrar un QSO &Edit QSO &Editar QSO Edit this QSO Editar este QSO Via &bureau Vía &bureau Send this QSL via bureau Envía esta QSL vía bureau D&irect D&irecta Send this QSL via direct Envía esta QSL vía directa Via bureau Vía bureau QSL &received via bureau QSL &recibida vía bureau Direct Directa QSL received via direc&t QSL recibida vía direc&ta Check in QRZ.com Consultar en QRZ.com Check this callsign in QRZ.com Consulta este indicativo en QRZ.com. Check in DXHeat.com Consultar en DXHeat.com Check this callsign in DXHeat.com Consulta este indicativo en DXHeat.com. &Request my QSL &Requerir mi QSL Mark my QSL as requested Marcar mi QSL como solicitada Via Direct and mark DX QSL as requested Vía directa y marcar QSL DX como solicitada Send this QSL via direct and mark DX QSL as requested Enviar esta QSL vía directa y marcar QSL DX como solicitada Via Bureau and mark DX QSL as requested Vía Bureau y marcar QSL DX como solicitada Send this QSL via bureau and mark DX QSL as requested Enviar esta QSL vía bureau y marcar QSL DX como solicitada &Request the QSL &Requerir la QSL Mark the QSL as requested Marcar la QSL como solicitada Via bureau and mark my QSL as requested Vía Bureau y marcar mi QSL como solicitada QSL received via bureau and mark my QSL as requested QSL recibida vía bureau y marcar mi QSL como solicitada Direc&t and mark as my QSL requested Direc&ta y marcar mi QSL como solicitada QSL received via direct and mark my QSL as requested QSL recibida vía directa y marcar mi QSL como solicitada Needed QSO to send the QSL QSO al que es necesario enviar la QSL My QSL requested to be sent Se ha solicitado el envío de mi QSL DX QSL pending to be received QSL del DX pendiente de recibir SetupDialog User data Datos de usuario Bands/Modes Bandas/modos DX-Cluster DX-Cluster Colors Colores Misc Varios World Editor Editor de entidades Satellites Satélites HamLib HamLib Do you want to add one log in the Logs tab or exit KLog? (Click Yes to add a log or No to exit KLog) ¿Quiere añadir un log en la pestaña de Logs o salir de KLog? (Pulse Si para añadir un log o No para salir de KLog) DB has not been moved to new path. La base de datos se ha movido a un nuevo destino. Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Vaya a la pestaña Varios y pulse sobre Mover BBDD o la base de datos no se moverá a la nueva ubicación. Cancel Cancelar OK OK D&X-Cluster D&X-Cluster Log widget Visor de log eLog eLog WSJT-X WSJT-X Settings Preferencias You need to enter at least one log in the Logs tab. Debe introducir al menos un log en la pestaña de Logs. You need to enter at least a valid callsign. Debe introducir al menos un indicativo válido. Go to the User tab and enter valid callsign. Vaya a la pestaña Usuario e introduzca un indicativo válido. You have not selected the kind of log you want. No ha seleccionado el tipo de log que quiere. You will be redirected to the Log tab. Please add and select the kind of log you want to use. Será redirigido a la pestaña de Log. Añada y seleccione el tipo de log que quiere usar. Logs Logs World Entidades SetupEntityDialog Entity Entidad CQ CQ ITU ITU Latitude Latitud Longitude Longitud UTC UTC Main prefix Prefijo ARRL ID ARRL ID Comma separated possible prefixes, e.g. EA1, EA2, ... Lista separada por comas de prefijos posibles. Ej. EA1, EA2, ... Prefixes Prefijos Name of the Entity. Nombre de la entidad. CQ zone. Zona CQ. ITU zone. Zona ITU. Longitude of the Entity. Longitud de la entidad. Local time difference to UTC. DIferencia entre la hora local y la UTC. Main prefix of the entity. Prefijo principal de la entidad. ARRL ID. ID ARRL - Identificador numérico de la ARRL. Date of the deletion. Fecha de eliminación. Deleted Eliminado Cancel Cancelar Ok OK Entity Dialog Entidad SetupPageBandMode Bands Bandas Modes Modos SetupPageColors New One Nuevo Needed in this band Necesitado en esta banda Worked in this band Trabajado en esta banda Confirmed in this band Confirmed Confirmado en esta banda Default Predeterminado WSJT-X palette Paleta WSJT-X Default palette Paleta predeterminada Dark Mode Modo oscuro Color when the DXCC is an ATNO (All Time New One). Color cuando el DXCC es un ATNO (nuevo en cualquier banda y modo). DXCC is confirmed in this band. DXCC confirmado en esta banda. Default color. Color predeterminado. Sets a palette of colors similar to the one used in WSJT-X. Define una paleta de colores similar a la usada en WSJT-X. Sets the default palette. Define la paleta predeterminada. Light Mode Modo claro This DXCC was worked before in another band but not in the selected band. It may be needed due to the CQ, ITU, Grid, ... Este DXCC fue trabajado antes en otra banda pero no en la banda seleccionada. Puede ser necesitado debido a CQ, ITU, locator, ... Worked DXCC, but not confirmed in this band. DXCC trababajado pero no confirmado en esta banda. Sets the Dark Mode Configura el Modo oscuro Choose a color Elija un color SetupPageDxCluster Add Añadir Delete Borrar Show &HF spots Show HF spots Mostrar avisos en &HF Show V/&UHF spots Show V/UHF spots Mostrar avisos en V/&UHF Show W&ARC spots Show WARC spots Mostrar avisos en W&ARC Show &worked spots Show worked spots Mostrar a&visos trabajados Show &confirmed spots Show confirmed spots Mostrar avisos &confirmados Show ANN/&FULL messages Show ANN/FULL messages Mostrar mensajes ANN/&FULL Show WW&V messages Show WWV messages Mostrar mensajes &WWV Show WC&Y messages Show WCY messages Mostrar mensajes WC&Y Save DX Cluster activity Guardar actividad de DX Cluster Saves all the DX-Cluster activity to a file in the KLog folder Guarda toda la actividad de DX-Cluster en un fichero en la carpeta de KLog. Send DX Spots to the map Enviar avisos de DX al mapa Sends the received DX Spots to the map to know where is the activity. Envia los avisos de DX al mapa para saber dónde está la actividad. DX Spots Avisos DX Others Otros Messages Mensajes KLog: Add a DXCluster server Kontest: Add a DXCluster server KLog: Añadir servidor DX-Cluster Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default.: Añade la dirección seguida de :puerto Ejemplo: dxfun.com:8000 Si no se especifica puerto se usará 41112 de forma predeterminada: SetupPageELog ClubLog password Contraseña de ClubLog ClubLog email Correo electrónico de ClubLog Enter the email you used to register in ClubLog. Introduzca el correo-e que usó para registrarse en ClubLog. Enter your password ClubLog here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Introduzca aquí su contraseña de ClubLog. Aviso: La contraseña se almacenará en claro en el fichero de configuración de KLog. (Si no quiere introducir su contraseña, KLog se la preguntará cuando sea necesaria) Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!! Introduzca aquí su contraseña de aplicación de ClubLog. Aviso: La contraseña se almacenará en claro en el fichero de configuración de KLog. Send QSOs in real time Enviar QSOs en tiempo real Activate ClubLog Activar ClubLog Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Envía cada QSO a CLubLog en tiempo real, según se van añadiendo (o modificando) en KLog. Starts the ClubLog support in KLog. Inicia el soporte de ClubLog en KLog. Activate eQSL.cc Activar eQSL.cc Enter your username of eQSL.cc. Introduzca su usuario de eQSL.cc. Enter your password eQSL.cc here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Introduzca aquí su contraseña de eQSL. Aviso: La contraseña se almacenará en claro en el fichero de configuración de KLog. (Si no quiere introducir su contraseña, KLog se la preguntará cuando sea necesaria) eQSL.cc password Contraseña de eQSL.cc Check in Qrz.com all Calls as they are entered Comprobar en QRZ.com todos los indicativos según se van introduciendo. eQSL.cc user Usuario de eQSL.cc ClubLog App password Contraseña de aplicación Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Introducir la contraseña de aplicación de ClubLog. Puede obtenerse en ClubLog (Menú: Settings->App Password). Atención: La contraseña de aplicación se guardará en claro en el fichero de configuración. ClubLog ClubLog eQSL.cc eQSL.cc QRZ.com QRZ.com Enter the user of your QRZ.com account. You need to be subscribed to QRZ.com to use this service. Introduzca su usuario de QRZ.com. Necesitará estar subscrito a QRZ.com para usar este servicio. User Usuario Enter your password QRZ.com here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Introduzca aquí su contraseña de QRZ.com. Aviso: La contraseña se almacenará en claro en el fichero de configuración de KLog. (Si no quiere introducir su contraseña, KLog se la preguntará cuando sea necesaria) Password Contraseña Activate QRZ.com Activar QRZ.com Check automatically Validar automáticamente Paying Subscriber Subscriptor de pago Check it if you are paying for a qrz.com subscription Comprobar que tiene una subscripción de pago en QRZ.com LogBook Key Clave del libro de guardia LogBook Key for QSO uploading. You can get this key in your QRZ.com logbook webpage. Remember that you need a QRZ.com subscription to use this feature. Clave del libro de guardia para enviar QSOs. Puede obtener esta clave (LogBook Key) de la página de su libro de guardia en QRZ.com. Recuerde que se necesita una subscripción a QRZ.com para usar esta funcionalidad. LoTW LoTW Upload Subir Download Descargar TQSL path Ubicación de TQSL Use TQSL Usar TQSL LoTW password Contraseña de LoTW LoTW user Usuario LoTW Enter your LoTW user. Introduzca su usuario de LoTW. Enter your password LoTW here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Introduzca aquí su contraseña de LoTW. Aviso: La contraseña se almacenará en claro en el fichero de configuración de KLog. (Si no quiere introducir su contraseña, KLog se la preguntará cuando sea necesaria.) Path to the TQSL software. Ruta hasta el ejecutable de TQSL. Enable the LoTW integration with TQSL. You will need to have TQSL installed Habilita la integración de LoTW a traves de TQSL. Necesita tener TQSL instalado. Select File Seleccionar fichero SetupPageHamLib Activate HamLib Activar HamLib Activates the hamlib support that will enable the connection to a radio. Activa el soporte de hamlib que habilitará la conexión a una radio. Read-Only mode Modo solo lectura If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio. Si se habilita, KLog leerá la frecuencia y modo de la radio pero nunca enviará ningún comando a la radio. Radio Radio Select your rig. Seleccionar equipo. Serial Serie Network Red Defines the interval to poll the radio in msecs. Define el intervalo con el que se consulta a la radio en milisegundos. Poll interval Intervalo de actualización Test: OK Test: OK Test: NOK Test: NOK Test Test Click to test the connection to the radio Pulse para probar la conexión a la radio SetupPageLogView Fields Campos SetupPageLogs &New New &Nuevo &Edit &Editar &Remove Elimina&r KLog KLog Do you really want to remove this log? ¿Realmente quiere eliminar este log? Operators Operadores An error has occurred showing the following error code: Ha ocurrido un error que muestra el siguiente código de error: Log has not been removed. (#3) Log no eliminado (#3) Add a new log. Añade un nuevo log. Edit the selected log. Edita el log seleccionado. Remove the selected log. Elimina el log seleccionado. All the QSOs from this log will also be deleted... Todos los QSOs de este log también se eliminarán... Log has not been removed. (#2) Log no eliminado (#2) Log has not been removed. (#1) Log no eliminado (#1) QSOs QSOs The new log could not be created. No pudo crearse el nuevo log. KLog - SetupPageLogs KLog - SetupPageLogs ID ID Station Callsign Indicativo de la estación Comments Comentarios Date Fecha SetupPageLogsNew &Ok &Ok &Cancel &Cancelar &Date &Fecha &Station Callsign &Indicativo Estación &Operators &Operadores Comm&ent Com&entario Callsign used for this log. Indicativo usado en este log. Comma separated list of operators: callsign1, callsign2. Lista separada por comas de los operadores: indicativo1, indicativo2. Start date of this log. Fecha de inicio de este log. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. Añadir un comentario sobre el log. Si se rellena, se mostrará como título en la pantalla principal de KLog para identificar el log. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. Necesita introducir un indicativo válido en el cuadro de Indicativo de estación. El log no se abrirá. SetupPageMisc &Imperial system Imperial system Sistema &imperial &Log in real time Log in real time &Log en tiempo real &Time in UTC Time in UTC Hora en U&TC &Save ADIF on exit Save ADIF on exit Guardar ADIF al &salir Use this &default filename Use this default filename Usar este fichero &de forma predeterminada Mark &QSO to send QSL when QSL is received Mark QSO to send QSL when QSL is received Marcar como &QSL por enviar cuando se recibe la QSL Complete QSO with previous data Completar QSO con datos anteriores Manage DX-Marathon Gestionar DX-Marathon Activate the application debug log Activar el log de depuración de la aplicación Move DB Mover BBDD In seconds, enter the time range to consider a duplicate if same call, band and mode is entered. En segundos, introduzca el rango de tiempo a considerar como duplicado si coincide el mismo indicativo, banda y modo. If you disable this checkbox KLog will not check callsigns to identify wrong callsigns. Si lo deshabilita KLog no comprobará los indicativos en busca de indicativos erróneos. Check it for Imperial system (Miles instead of Kilometers). Marcar si se desea sistema imperial (millas en vez de kilómetros). Select to use the following name for the logfile without being asked for it again. Seleccione para usar el siguiente nombre de fichero y que no se le pregunte más. Select if you want to manage DX-Marathon. Seleccionar si quiere gestionar DX-Marathon. This is the default file where ADIF data will be saved. Este es el nombre de fichero predeterminado donde se guardará el fichero ADIF. This is the directory where the database (logbook.dat) will be saved. Este es el directorio donde la base de datos (logbook.dat) se guardará. Click to change the path of the database. Pulse para cambiar la ubicación de la base de datos. Activates the application debug log. This may be useful if something is not working as expected. A debug file will be created in the KLog directory. Activa el log de depuración de la aplicación. Puede ser útil si algo no funciona como se espera. Se creará un fichero de depuración en la carpeta de KLog. Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default. Habilitar para poner en la cola de envío todas las QSL-e (LoTW & eQSL) en todos los nuevos QSO de forma predeterminada. Dupe time range: Periodo de QSO dupe: Please specify an existing directory where the database (logbook.dat) will be saved. Por favor, especifique un directorio existente donde la base de datos (logbook.dat) se almacenará. This is the directory where DB (logbook.dat) will be saved. Este es el directorio donde la base de datos (logbook.dat) se guardará. Check non-valid calls Comprobar indicativos válidos Show seconds Mostrar segundos Mark sent eQSL && LoTW in new QSO as queued Marcar eQSL y LoTW como en cola en todos los QSO nuevos Show seconds in the QSO editor Mostrar los segundos en el editor de QSO Click to change the default ADIF file. Pulse para cambiar el nombre predeterminado del fichero ADIF. Click to move the DB to the new directory. Pulse para mover la BBDD al nuevo directorio. Select the application debug log level. This may be useful if something is not working as expected. A debug file will be created in the KLog directory and/or shown with Help->Debug menu. Seleccione el nivel de log de debug. Puede ser útil si algo nofunciona como debe. Se crea un fichero de depuración en la carpeta de KLog y/o mostrado en el menú Ayuda->Debug. Log level Nivel de depuración Select Directory Seleccionar directorio KLog - Move DB KLog - Movimiento de base de datos File moved Archivo movido File copied Archivo copiado File already exist. El fichero ya existe. The destination file already exist and KLog will not replace it. Please remove the file from the destination folder before moving the file with KLog to make sure KLog can copy the file. El fichero destino ya existe y KLog no lo reemplazará. Por favor elimine el archivo de la carpeta destino antes de mover el archivo con KLog para asegurarse de que KLog puede copiar el archivo. File NOT copied Archivo NO copiado The file was not copied due to an unknown problem. El archivo no se copió debido a un problema desconocido. The target directory does not exist. Please select an existing directory. El directorio destino no existe. Por favor, seleccione un directorio existente. Show the Station &Callsign used in the search box Mostrar indicativo usado en el &cuadro de búsqueda &Check for new versions automatically &Comprobar si hay nuevas versiones automáticamente QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. Los QSO se marcarán como pendientes de enviar si se recibe la tarjeta del DX y no ha enviado la suya. Check if there is a new release of KLog available every time you start KLog. Comprueba si hay una nueva versión de KLog disponible cada vez que inicia KLog. &Provide Info for statistics &Proporcionar datos para estadísticas The search box will also show the callsign on the air to do the QSO. El cuadro de búsqueda mostrará también el distintivo usado para hacer el QSO. If new version checking is selected, KLog will send the developer your callsign, KLog version and Operating system to help in improving KLog. Si se selecciona el comprobar nuevas versiones, KLog enviará al desarrollador el indicativo, la versión de KLog y el sistema operativo para ayudar a mejorar KLog. Select to use real time. Seleccione para usar tiempo real. Select to use UTC time. Seleccione para usar UTC. Select if you want to save to ADIF on exit. Seleccione si quiere guardar en ADIF al salir. Complete the current QSO with previous QSO data. Completar el QSO actual con datos de QSO anteriores. Browse Buscar Open File Abrir fichero &Delete always temp ADIF file after uploading QSOs Borrar siempre el archivo ADIF &temporal tras subir los QSOs Delete Always the adif file created after uploading QSOs Borrar el archivo ADIF temporal tras subir los QSOs SetupPageSats &New &Nuevo &Edit &Editar &Remove Elimina&r &Import &Importar E&xport E&xportar Add a new satellite. Añadir un nuevo satélite. Edit the selected satellite. Editar el satélite seleccionado. Remove the selected satellite. Eliminar el satélite seleccionado. Export your current satellites to a file. Exportar los satélites actuales a un fichero. Select the sat you want to open. Seleccione el satélite que quiere abrir. KLog KLog Do you really want to remove this satellite? ¿Realmente quiere eliminar este satélite? Import a satellites file. It will replace the satellites you have in the current list. Importa el fichero de satélites. Reemplazará los satélites que tiene ahora configurados. This satellite will no be longer available to be selected ... Este satélite dejara de estar disponible para ser seleccionado ... Sat has not been removed. (#3) El satélite no ha sido eliminado. (#3) Sat has not been removed. (#2) El satélite no ha sido eliminado. (#2) Sat has not been removed. (#1) El satélite no ha sido eliminado. (#1) ID ID Short Corto Name Nombre Uplink Subida Downlink Bajada Modes Modos An error has occurred showing the following error code: Ha ocurrido un error que muestra el siguiente código de error: KLog - SetupPageSats KLog - Configuración de satélites Open Satellites File Abrir fichero de satélites KLog warning Advertencia de KLog An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Ha ocurrido un error inesperado al importar los datos de satélites. Puede haber sido causado que el fichero que está intentando importar no tiene el formato adecuado. Please check the format or contact the developer for analysis with the error code: Por favor, compruebe el formato o contacte con el desarrollador para que analice el código de error: Save Satellites File Guardar fichero de satélites SetupPageSatsNew Short name Nombre corto Sat name Nombre UpLink Subida DownLink Bajada Modes Modos &Ok &Ok &Cancel &Cancelar Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Introduzca el nombre corto. Trate de usar el nombre corto del LoTW para poder subir los QSO a LoTW después. Enter the name of the satellite. Introduzca el nombre del satélite. Enter the uplink frequencies in this format: 144.300 Introduzca las frecuencias de subida en este formato: 144.300 Enter the downlink frequencies in this format: 144.300 Introduzca las frecuencias de bajada en este formato: 144.300 Enter the modes in this format: USB Introduzca los modos en este formato: USB Some of the data you have entered is not correct; the satellite can't be added. Alguno de los datos introducidos no son correctos, el satélite no puede ser añadido. SetupPageSubdivisionNew &Date &Fecha &Station Callsign &Indicativo Estación &Operators &Operadores Comm&ent Com&entario &Ok &Ok &Cancel &Cancelar Callsign used for this log. Indicativo usado en este log. Comma separated list of operators: callsign1, callsign2. Lista separada por comas de los operadores: indicativo1, indicativo2. Start date of this log. Fecha de inicio de este log. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. Añadir un comentario sobre el log. Si se rellena, se mostrará como título en la pantalla principal de KLog para identificar el log. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. Necesita introducir un indicativo válido en el cuadro de Indicativo de estación. El log no se abrirá. SetupPageSubdivisions &Remove Elimina&r Import new Importar nuevo Import an AWA file with the subdivision details. Importa un fichero AWA con la información de subdivisiones. Remove the selected references. Elimina las referencias seleccionadas. Select the references you want to open. Seleccione las referencias que quiere abrir. KLog KLog Do you really want to remove the data of this entity? ¿Quiere realmente eliminar los datos de esta entidad? All the subdivision information for this entity will be deleted... Se eliminará la información de subdivisiones de esta entidad... Log has not been removed. (#3) Log no eliminado (#3) Log has not been removed. (#2) Log no eliminado (#2) Log has not been removed. (#1) Log no eliminado (#1) ID ID Name Nombre Short Name Nombre corto CQ Zone Zona CQ ITU Zone Zona ITU Deleted Eliminado Start Date Fecha de inicio End Date Fecha final DXCC DXCC An error has occurred showing the following error code: Ha ocurrido un error que muestra el siguiente código de error: KLog - SetupPageSubdivisions KLog - SetupPageSubdivisions SetupPageUDP Start UDP Server Arrancar servidor UDP Automatically log QSOs from WSJT-X Registrar automáticamente los QSOs recibidos de WSJT-X Allow WSJT-X to send logged QSOs to KLog Permitir a WSJT-X enviar los QSO resgistrados a KLog QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected Los QSO hechos en WSJT-X serán enviados a KLog y KLog preguntará antes de guardarlo en KLog salvo que se seleccione "%1" KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. KLog registrará automáticamente cualquier QSO que llegue de WSJT-X sin ninguna confirmación manual. Update status information from WSJT-X Actualizar el estado desde WSJT-X KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...) KLog mostrará y actualizará automáticamente lo datos que llegan de WSJT-X (estación DX, reporte, modo,...) UDP port number where the UDP Server will listen for packets. Puerto UDP donde el servidor UDP espera los paquetes. Make sure it is the same port that the other programs are sending the data to. Default port is 2237. Asegúrese de que es el mismo puerto al que los otros programas están enviando datos. El puerto predeterminado es el 2237. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. El servidor UDP recibirá los QSO enviados desde otros programas como WSJT-X permitiendo registrar en KLog los contactos automáticamente desde esos programas. UDP Port Puerto UDP Select the interface to listen for UDP datagrams coming from WSJT-X. Seleccione el interterfaz para recibir los datagramas UDP que lleguen de WSJT-X. Network interface Interfaz de red QSOs notification timeout (milisecs) Tiempo de notificación de QSO (milisegundos) Miliseconds that the notification of QSOs received from WSJTX will be shown. Milisegundos que se mostrará la notificación de QSO recibida de WSJTX. SetupPageUserDataPage &Personal data Personal data Datos &personales Station &data Station data &Datos de la estación &Name Name &Nombre &Address Address &Dirección Cit&y City Ci&udad &Zip Code Zip Code Código &postal Pro&v/State Prov/State Pro&v/Estado Countr&y Country Paí&s Enter your information for rig Introduzca la información de su equipo/radio Enter your information for antenna Introduzca la información de su antena Enter your name. Introducir el nombre. Enter your address - 1st line. Introducir la dirección - linea 1. Enter your address - 2nd line. Introducir la dirección - linea 2. Enter your address - 3rd line. Introducir la dirección - linea 3. Enter your address - 4th line. Introducir la dirección - linea 4. Enter your city. Introducir la ciudad. Enter your zip code. Introducir el código postal. Enter your province or state. Introducir la provincia o estado. Enter your country. Introducir el país. Enter your power information. Introducir la información sobre la potencia. &Rig 1 &Equipo 1 R&ig 2 E&quipo 2 Ri&g 3 Eq&uipo 3 Antenna &1 Antena &1 Antenna &2 Antena &2 Antenna &3 Antena &3 Po&wer Po&tencia Enter the station callsign that will be used for logging. Introducir el indicativo de la estación que se usará en el log. Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Introduzca el locator de su estación. De forma alternativa, KLog puede proporcionarle uno aproximado basado en su indicativo. &Callsign Indi&cativo &Operators &Operadores &CQ Zone Zona &CQ &ITU Zone Zona &ITU &Locator &Locator &Locator (not valid) &Locator (no válido) Enter the operators (comma separated if more than one). Introduzca los operadores (separados por comas si hay más de uno). SetupPageWorldEditor KLog will not be able to show entities information. KLog no podrá mostrar información de entidades. Prefix Prefijo Entity Entidad An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. Se ha detectado un fichero de información de entidades (cty.csv) en su carpeta de KLog y se utilizará. Add Añadir Delete Borrar Edit Editar Export World Exportar mundo Import World Importar mundo Still not implemented. Sin implementar. Import a new cty.csv file Importar un nuevo fichero cty.csv No entities information file (cty.csv) has been detected in your KLog folder. No se ha detectado en su carpeta de KLog ningún fichero de información de entidades (cty.csv). ARRL ID ARRL ID Continent Continente CQ Zone Zona CQ ITU Zone Zona ITU UTC UTC Latitude Latitud Longitude Longitud Deleted Eliminado Since Date Desde fecha To Date Hasta fecha Open File Abrir fichero BigCTY (*.csv) BigCTY (*.csv) Entities information has been updated. La información de entidades ha sido actualizada. Entities information has not been updated. La información de entidades no ha sido actualizada. ShowAdifImportWidget The following QSOs are those QSOs that you have received the LoTW confirmation. Lo siguientes QSO son los QSO para los que ha recibido confirmación de LoTW. Ok Ok DX DX Date/Time Fecha/Hora Band Banda Mode Modo ShowErrorDialog KLog Message Mensaje de KLog SoftwareUpdateDialog Ok Ok KLog update Actualización de KLog <center><h2>KLog new version (%1) is available! </h2></center><br>There is a new version of KLog available.<br><br><b>You can get the new version from:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> <center><h2>¡Hay un nueva versión de KLog disponible! (%1)</h2></center><br>Hay una nueva versión de KLOg disponible.<br><br><b>Puede descargar la nueva versión desde:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> Congratulations! ¡Enhorabuena! Your KLog has been updated. Su KLog ha sido actualizado. You already have the latest version. Ya cuenta con la última versión. StartWizard KLog - The free hamradio logging program KLog - El programa libre de log de radioaficionados Quit Setup Salir Setup is not complete yet. Are you sure you want to quit setup? La configuración no está completa. ¿Está seguro de querer salir de la configuración? StatisticsWidget QSO per year QSO por año DXCC per year Entidades DXCC por año CQ zones per year Zonas CQ por año QSO per band QSOs por banda QSO per mode QSOs por modo QSO per DXCC QSOs por DXCC QSO per Continent QSO por Continente QSO per hour QSOs por hora QSO per month QSO por mes Worked / Confirmed status Trabajados / Confirmados Worked / Sent status Trabajados / Enviados Sent / Confirmed status Enviados / Confirmados Satellite grid status Locators en satélites Satellite DXCC status DXCC en satélites Grids per band status Estado de Locators por banda DXCC per band status Estado de DXCC por banda StatsCQZPerYearBarChartWidget CQ Zones per year Zonas CQ por año Reading data ... Leyendo datos ... Abort reading Cancelar lectura CQ zones Zonas CQ CQ zones per year Zonas CQ por año Reading data ... Leyendo datos ... Years: %1/%2 Años: %1/%2 StatsDXCCOnSatsWidget Show confirmed only Sólo confirmados Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Sólo satélites LEO Number Número Callsign Indicativo Date Fecha Band Banda Mode Modo DXCC DXCC Satellite Satélite Confirmed Confirmado No No StatsEntitiesPerYearBarChartWidget Chart title Título del gráfico Reading data ... Leyendo datos ... Abort reading Cancelar lectura DXCC Entities Entidades DXCC DXCC Entities per year Entidades DXCC por año Reading data ... Leyendo datos ... Entities: Entidades: StatsFieldPerBandWidget All Todos Mode: Modo: Band Banda Worked Trabajado Confirmed Confirmado StatsGridsOnSatsWidget Show confirmed only Sólo confirmados Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Sólo satelites LEO Number Número Callsign Indicativo Date Fecha Band Banda Mode Modo Grid Locator Satellite Satélite Confirmed Confirmado No No StatsQSOsPerBandBarChartWidget QSOs per band QSOs por banda Reading data ... Leyendo datos ... Abort reading Cancelar lectura Bands Bandas QSOs per band distribution Distribución de QSO por banda Reading data ... Leyendo datos ... Bands: Bandas: StatsQSOsPerContinentBarChartWidget QSOs per continent QSOs por continente Reading data ... Leyendo datos ... Abort reading Cancelar lectura Continents Continentes Reading data ... Leyendo datos ... Hours: Horas: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC QSOs por DXCC Reading data ... Leyendo datos ... Abort reading Cancelar lectura Reading data... Leyendo datos ... DXCC DXCC Top ten DXCC per QSO Top 10 de DXCC por QSO StatsQSOsPerHourBarChartWidget QSOs per hour QSOs por hora Reading data ... Leyendo datos ... Abort reading Cancelar lectura Hours Horas QSOs at hour QSO por hora Reading data ... Leyendo datos ... Hours: Horas: StatsQSOsPerModeBarChartWidget QSOs per mode QSOs por modo Reading data ... Leyendo datos ... Abort reading Cancelar lectura Modes Modos QSOs per mode distribution Distribución QSO por modo Reading data ... Leyendo datos ... Modes: Modos: StatsQSOsPerMonthBarChartWidget QSOs per month QSOs por mes Reading data ... Leyendo datos ... Abort reading Cancelar lectura Jan Ene Feb Feb Mar Mar Apr Abr May May Jun Jun Jul Jul Sep Sep Oct Oct Nov Nov Dec Dic Aug Ago Months Meses QSOs at Month QSOs en mes Reading data ... Leyendo datos ... Months: Meses: StatsQSOsPerYearBarChartWidget Reading data ... Leyendo datos ... Abort reading Cancelar lectura QSOs QSOs QSOs per year QSOs por año Qsos QSOs Reading data ... Leyendo datos ... QSO: %1/%2 QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Enviado - %1 Confirmed - %2 Confirmado - %2 Sent / Confirmed status Enviados / Confirmados StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Trabajados, no confirmados - %1 Confirmed - %2 Confirmado - %2 Worked / Confirmed status Trabajados / Confirmados StatsWorkedSentPieChartWidget Worked - %1 Trabajado - %1 Sent - %2 Enviado - %2 Worked / Sent status Trabajados / Enviados TipsDialog KLog tips Consejos de KLog Next Siguiente Previous Anterior <b>Tip #1:</b><br>Do you know...<br>You can use <a href="#ToolsFillInQSO">Tools->Fill in QSO data</a> to automatically read the full log to fill the DXCC, CQ, ITU zones and continent? Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in QSO data <b>Consejo #1:</b><br>¿Sabía que...<br>Puede usar <a href="#ToolsFillInQSO">Herramientas->Completar QSOs</a> para leer automáticamente todo el log y rellenar los campos DXCC, CQ, ITU y continente? <b>Tip #3:</b><br>Do you know...<br>You can use <a href="#ToolsFindQSO2QSL">Tools->QSL tools...->Find QSO to QSL</a> to look for all those QSO that you should send your QSL because you still need to confirm that DXCC and you have still not send your QSL card? Translator: Please make sure that the name of the link is coherent with the menu Tools->QSL tools...->Find QSO to QSL <b>Consejo #3:</b><br>¿Sabía que...<br>Puede usar <a href="#ToolsFindQSO2QSL">Herramientas->Herramientas de QSL ...->Buscar QSO para enviar QSL</a> buscar todos los QSO para los que debería enviar su QSL porque aun necesita confirmar ese DXCC y aun no ha enviado si tarjeta QSL? <b>Tip #11:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/KLogES>Spanish Telegram group</a> to discuss about KLog in Spanish? <b>Consejo #11:</b><br>¿Sabía que...<br>Puede subscribirse al <a href=https://t.me/KLogES>Grupo de Telegram en español</a> para discutir sobre KLog en español? <b>Tip #13:</b><br>Do you know...<br>You can <a href=https://twitter.com/_ea4k>follow EA4K on twitter</a> to get updates about KLog? <b>Consejo #13:</b><br>¿Sabía que...<br>Puede seguir a <a href=https://twitter.com/_ea4k>EA4K</a> en Twitter para recibir información sobre KLog? <b>Tip #8:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceivePendingQSL">Tools->QSL tools...->Find DX-QSLs pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Sent</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find DX-QSLs pending to receive <b>Consejo #8:</b><br>¿Sabía que...<br>Puede encontrar las QSLs que está esperando con <a href="#ToolsReceivePendingQSL">Herramientas->Herramientas de QSL...->Buscar QSL DX pendientes de recibir?</a>.<bR>Esta herramienta le mostrará, en el cuadro de búsqueda, todos los QSO con que tienen la opción de QSL enviada marcada como <i>Enviada</> pero aun no ha recibido la tarjeta del DX. <b>Tip #9:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceiveRecPendingQSL">Tools->QSL tools...->Find requested pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Rec marked as <i>Requested</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find requested pending to receive <b>Consejo #9:</b><br>¿Sabía que...<br>Puede encontrar las QSLs que está esperando con <a href="#ToolsReceiveRecPendingQSL">Herramientas->Herramientas de QSL...->Buscar solicitadas sin recibir</a>?.<bR>Esta herramienta le mostrará, en el cuadro de búsqueda, todos los QSO con que tienen la opción de QSL recibida marcada como <i>Solicitada</> pero aun no ha recibido la tarjeta del DX. <b>Tip #10:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/klogchat>English KLog Telegram group</a> to discuss about KLog in English? <b>Consejo #10:</b><br>¿Sabía que...<br>Puede subscribirse al <a href=https://t.me/klogchat>Grupo de Telegram en inglés</a> para discutir sobre KLog en inglés? <b>Tip #2:</b><br>Do you know...<br>You can find the QSLs that you still need to send with <a href="#ToolsSendPendingQSL">Tools->QSL tools...->Find My-QSLs pending to send</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Requested</i>. Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in DXCC data <b>Consejo #2:</b><br>¿Sabía que...<br>Puede encontrar las QSLs que necesita mandar con <a href="#ToolsSendPendingQSL">Herramientas->Herramientas de QSL...->Buscar mis QSL pendientes de envío?</a>.<bR>Esta herramienta la mostrará en el cuadro de búsqueda todos los QSO con la opción de enviar QSL como <i>Solicitada</i>. <b>Tip #4:</b><br>Do you know...<br>You can enter a '*' in the search box, in the search window to search for all the QSOs done with one specific station callsign? Translator: Please make sure that the name of the link is coherent with the menu File->Export Requested QSL to ADIF... <b>Consejo #4:</b><br>¿Sabía que ...<br>Puede introducir un '*' en el cuadro de búsqueda para que aparezcan todos los QSO hechos con un indicativo en concreto? <b>Tip #5:</b><br>Do you know...<br>You can find the file containing all your log and other information in the logbook.dat file and the klogrc file, containing the KLog config file in the KLog folder by opening the <a href="#FileOpenKLogFolder">File->KLog folder</a> menu? <b>Consejo #5:</b><br>¿Sabía que...<br>Puede el fichero logbook.dat es el fichero con todos sus logs y otras informaciones y el fichero klogrc es el fichero de configuración y se pueden encontrar en la carpeta de KLog, abriendo el menú <a href="#FileOpenKLogFolder">Archivo->Carpeta de KLog</a>? <b>Tip #6:</b><br>Do you know...<br>You can upload your QSO marked as queued to LoTW via TQSL with <a href="#ToolsUploadLoTW">Tools->LoTW tools ...->Sends the log to LoTW calling TQSL.</a> ?<br><br>You have to configure TQSL in the preferences to be able to use this functionality. Translator: Please make sure that the name of the link is coherent with the menu File->KLog folder <b>Consejo #6:</b><br>¿Sabía que...<br>Puede subir los QSOs marcados como en cola a LoTW a través de la aplicación TQSL con <a href="#ToolsUploadLoTW">Herramientas->Herramientas de LoTW ...->Enviar a LoTW</a>?<br><br>Tiene que configurar TQSL en las preferencias para poder usar esta funcionalidad? <b>Tip #7:</b><br>Do you know...<br>You can see the QSO that confirms one specific DXCC entity in one specific band by poiting your mouse over that band in the DXCC widget? Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find My-QSLs pending to send <b>Consejo #7:</b><br>¿Sabía que...<br>Puede ver qué QSO confirma una entidad DXCC en concreto? situando el puntero del ratón sobre la banda en el widget DXCC? <b>Tip #12:</b><br>Do you know...<br>You can subscribe to <a href=https://groups.io/g/klog>KLog mailing list</a> to discuss via email about KLog in English? <b>Consejo #12:</b><br>¿Sabía que...<br>Puede subscribirse a la <a href=https://groups.io/g/klog>Lista de KLog</a> para discutir sobre KLog en inglés? <b>Tip #14:</b><br>Do you know...<br>You can write your own <a href=https://www.eham.net/reviews/detail/3118>review in eHam.net about KLog</a> to help other users to decide to use KLog? <b>Consejo #14:</b><br>¿Sabía que...<br>Puede escribir su propia <a href=https://www.eham.net/reviews/detail/3118>opinión de KLog en eHam.net</a> para ayudar a otros usuarios a usar KLog? <b>Tip #15:</b><br>Do you know...<br>You can join the development team by simply <a href=https://www.klog.xyz/contact>Contacting us</a>? <b>Consejo #15:</b><br>¿Sabía que..<br>Puede unirse al equipo de desarrollo simplemente <a href=https://www.klog.xyz/contact>Contactando con nosotros</a>? <b>Tip #16:</b><br>Do you know...<br>That there are many ways to contribute to KLog and some of them are listed in the <a href=https://www.klog.xyz/contrib>KLog Contribute</a> page? <b>Consejo #16:</b><br>¿Sabía que...<br>Hay muchas formas de contribuir con KLog y algunas de ellas estan listadas en la página <a href=https://www.klog.xyz/contrib>Contribuir</a> de la web? <b>Tip #17:</b><br>Do you know...<br>You can support translating KLog into your language? Please check <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a> page. <b>Consejo #17:</b><br>¿Sabía que...<br>Puede ayudar a traducir KLog a su idioma? Por favor consulte la página <a href=https://www.klog.xyz/contrib/translations>Traducciones de KLog</a>. <b>Tip #18:</b><br>Do you know...<br>You can double-click on an entity name in the DXCC table and all the QSOs with that DXCC Entity will be shown in the search box? <b>Consejo #18:</b><br>¿Sabía que...<br>Puede hacer doble click en el nombre de una entidad en la tabla de DXCC todos los QSO con esa entidad aparecerán en el cuadro de búsqueda? <b>Tip #19:</b><br>Do you know...<br>You can right-click on a QSO and select <i>Check in QRZ.com</i> to check that callsign in QRZ.com? <b>Consejo #19:</b><br>¿Sabía que...<br>Puede click con el botón derecho en un QSO y seleccionar <i>Consultar en QRZ.com</i> para consultar ese indicativo en QRZ.com? UpdateSatsData Reading Satellites data file... Leyendo fichero de datos satélites ... Abort reading Cancelar lectura The Satellites information has been updated. Se ha actualizado la información de los satélites. Open File Abrir fichero Sat Data Datos de satélites UpdateSettings KLog - Settings update KLog - Actualización de configuración The settings system has been changed and KLog will update your settings file. El sistema de configuración ha cambiado y KLog debe actualizar el fichero de configuración. World Entity Entidad Continent Continente Abort reading Cancelar lectura Reading cty.csv... Leyendo cty.csv... eLogClubLog Host not found! ¡Máquina no encontrada! Timeout error! ¡Error de tiempo excedido! This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO. Este error puede ser causado por un QSO duplicado o, si estaba eliminando, porque no existiera anteriormente. Undefined error number (#%1)... Error no definido número (#%1)... KLog - ClubLog KLog - clublog KLog - ClubLog QSO dupe or not existing (#%1)... QSO repetido o no existente (#%1)... We have received an undefined error from Clublog (%1) Hemos recibido un error indefinido de Clublog (%1) Undefined error... Error no definido... Callsign missing Falta indicativo Invalid callsign Indicativo no válido Skipping SWL callsign Saltando indicativo SWL Callsign is your own call Callsign is your ow call El indicativo es su propio indicativo Invalid callsign with no DXCC mapping Indicativo no válido sin correspondencia con DXCC Updated QSO QSO actualizado Invalid ADIF record Registro ADIF no válido Missing ADIF record Falta registro ADIF Test mode - parameters ok, no action taken Modo Test - parámetros OK, sin acción Please check your config in the setup and contact the KLog development team if you can't fix it. ClubLog uploads will be disabled. Revise su configuración y contacte con el equipo de desarrollo de KLog si no puede solucionarlo. Se deshabilitarán los envios a ClubLog. It seems to be a CREDENTIALS ERROR; check your email and password. Parece haber un error con las credenciales; revise la dirección de correo electrónico y contraseña. It seems that your ClubLog credentials are not correct. Parece que las credenciales de CLubLog no son correctas. Please check your credentials in the setup. ClubLog uploads will be disabled. Revise las credenciales el la configuración. Se deshabilitan las subidas a ClubLog. Excessive API Usage Uso excesivo de API Internal Error Error interno Rejected Rechazado QSO Duplicate QSO duplicado QSO Modified QSO modificado Missing Login Falta login QSO OK QSO OK Upload denied Subida rechazada No callsign selected No se seleccionó indicativo No match found Sin coincidencia Dropped QSO QSO eliminado OK OK Login rejected Login rechazado Rejected: Callsign is your own call Rechazado: El indicativo es su propio indicativo eLogQrzLog Host not found! ¡Máquina no encontrada! Timeout error! ¡Error de tiempo excedido! Undefined error number (#%1) Error no definido número (#%1)... We have received the following error from QRZ.com (%1) Hemos recibido el siguiente error de QRZ.com (%1) You are not subscribed to QRZ.com. No está subscrito a QRZ.com. Not valid KEY found Clave no valida Please configure your QRZ.com API key. You will find it in your QRZ.com Logbook settings webpage. You need a QRZ.com subscription to use this feature. Por favor configure su clave API (API key) de QRZ.com. La encontrará en la pagina de configuración de su libro de guardia en QRZ.com. Necesita una subscripción para usar esta funcionalidad. KLog - QRZ.com password needed KLog - Contraseña de QRZ.com requerida Please enter your QRZ.com password: Introduzca su contraseña de QRZ.com: KLog - QRZ.com KLog - QRZ.com Callsign missing Falta indicativo eQSLUtilities eQSL has sent the following message: %1 eQSL ha enviado el siguiente mensaje: %1 Host not found! ¡Máquina no encontrada! Timeout error! ¡Error de tiempo excedido! Undefined error number (#%1)... Error no definido número (#%1)... eQSL Error: User or password incorrect KLog - Error de usuario/contraseña de eQSL eQSL Warning: At least one of the uplodaded QSOs is duplicated. Aviso eQSL: Al menos uno de los QSOs enviados está duplicado. eQSL: All the QSOs were properly uploaded. eQSL: Todos los QSOs se enviaron correctamente. KLog - eQSL.cc password needed KLog - Contraseña de eQSL.cc requerida Please enter your eQSL.cc password: Introduzca su contraseña de eQSL.cc: KLog - eQSL KLog - eQSL We have received an undefined error from eQSL (%1) Hemos recibido un error indefinido de eQSL (%1) Please check your config in the setup and contact the KLog development team if you can't fix it. eQSL uploads will be disabled. Revise su configuración y contacte con el equipo de desarrollo de KLog si no puede solucionarlo. Se deshabilitarán los envios a eQSL. klog-2.3.3/translations/klog_it.ts0000644000015700001710000144530714542412415017074 0ustar jenkinsjenkins AboutDialog About KLog About KLog You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Puoi essere di aiuto inviando bug report, contribuendo alla programmazione del software, o con idee o suggerimenti, o ogni altra cosa pensi possa essere utile per migliorare KLog. Authors Autori By Grazie a Author Autore KLog is a free logbook for hamradio operators. KLog è un logbook libero per operatori radio. Please provide your review in KLog's eHam review page: Per favore inserisci il tuo commento di utlizzo sulla maschera KLog dedicata ai commenti: today oggi Main developer Sviluppatore Senior KLog is developed by a very small team and you are invited to join! Klog è sviluppato da un esiguo numero di programmatori e tu sei invitato a partecipare! KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account users' needs. Gli sviluppatori KLog hanno incluso nel software uan funzionalità che invia alcuni dati utente ai server di KLog con l'unico scopo di contare il numero di installazioni, in modo da concentrare gli sforzi verso le effettive necessità degli utilizzatori. At present, the data that is provided is the following: Attualmente, i dati inviati sono esclusivamente i seguenti: Translators bring KLog into your language. They are really an important part of the KLog development team. I traduttori portano KLog nella tua lingua, pertanto sono parte integrante della squadra di sviluppo di KLog. Find more information and the latest release at Disponibili ulteriori informazioni sull'ultima versione presso Please be aware that this is a development release and it may contain many bugs.<br>Backup your data before using this software! Questa è una versione di sviluppo non definitiva e potrebbe contenere molti bug. <br>Fai backup frequenti durante l'uso di questo software! Since 0.6.2, KLog has been fully rewritten to provide a cross-platform application that runs on all major operating systems (GNU/Linux, macOS and Windows) and to support new functionality. A partire dalla versione 0.6.2, KLog è stato completamente riscritto per formire un'applicazione disponibile su tutti i magigori sistemi operativi (Gnu/Linux, macOS e Windows) e per inserire nuove funzionalità. If you want to provide support you are welcome to join the <a href="https://groups.io/g/klog">KLog mailing list</a>! Se vuoi aiutare puoi iscriverti a <a href="https://groups.io/g/klog">mailing listi di KLog</a>! If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://groups.io/g/klog">KLog mailing list</a>! Se KLog non è disponibile nella tua lingua e vuoi essere di aiuto sarebbe il massimo tu ci scrivessi sulla <a href="https://groups.io/g/klog">mailing list di KLog</a>! Translators Traduttori Privacy advisory Nota sul trattamento dei dati personali Callsign Nominativo KLog version Versione KLog Operating system Sistema operativo Be aware that you can enable/disable this feature from the Misc tab in the Setup page. In ogni momento puoi sempre abilitare/disabilitare questa funzione nella linguetta Altro della maschera di configurazione. KLog KLog Privacy Privacy AdifLoTWExportWidget Select the Station Callsign that you want to use to upload the log. Scegli il nominativo di stazione da usare durante il trasferimento del log. Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign. Scegli la data di inizio dei QSO da esportare. Se non specificato diversamente userò semplicemente il primo QSO disponibile con il nominativo indicato. Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign. Scegli la data di fine dei QSO da esportare. Se non specificato diversamente userò semplicemente l'ultimo QSO disponibile con il nominativo indicato. Station callsign Nominativo di stazione My Locator Il mio Locator Start date Data di inizio End date Data di fine Ok Ok Cancel Annulla DX DX Date/Time Data/Ora Band Banda Mode Modo Not defined Non specificato ALL QSOs: %1/%2 All Tutti QSOs: Elenco QSO: KLog - QSOs to be uploaded to LoTW. KLog - QSO da trasferire su LoTW. This table shows the QSOs that will be sent to LoTW. Questo elenco contiene i QSO trasferiti a LOTW. KLog - QSOs to be uploaded to ClubLog. KLog. QSO da trasferire su ClubLog. This table shows the QSOs that will be sent to ClubLog. Questo elenco contiene i QSO che saranno trasferiti a ClubLog. KLog - QSOs to be uploaded to eQSL.cc. KLog. QSO da trasferire su eQSL.cc. This table shows the QSOs that will be sent to eQSL.cc. Questo elenco contiene i QSO che saranno trasferiti su eQSL.cc. KLog - QSOs to be uploaded to QRZ.com. KLog. QSO da trasferire su QRZ.com. This table shows the QSOs that will be sent to QRZ.com. Questo elenco contiene i QSO che saranno trasferiti a QRZ.com. This table shows the QSOs that will be exported to ADIF. Questo elenco contiene i QSO esportati verso ADIF. AwardsWidget Recalculate Ricalcolo Click to recalculate the award status. Click per ricalcolare stato riconoscimenti. Select the year you want to check. Scegli quale anno vuoi controllare. QSOs Lista QSO DXCC DXCC CQ CQ Award Riconoscimento Confirmed Confermato Worked Processato WAZ WAZ Score Punteggio Annual Annuale Number of confirmed DXCC entities. Numero di collegamenti DXCC confermati. Number of worked DXCC entities. Numero di collegamenti DXCC processati. Number of confirmed WAZ zones. Numero di zone WAZ confermate. Number of worked WAZ zones. Numero di zone WAZ processate. Number of confirmed QSOs. Numero di QSO confermati. Number of worked QSOs. Numero di QSO processati. Number of QSOs worked in the selected year. Numero QSO processati durante l'anno indicato. Number of DXCCs worked in the selected year. Numero di DXCC processati durante l'anno indicato. Number of CQ Zones worked in the selected year. Numero di zone CQ processate durante l'anno indicato. Score for the DXMarathon in the selected year. Punteggio numerico nella DX marathon durante l'anno indicato. DX-Marathon DX-Marathon CTYPage Country data download Scarico Country KLog needs country data... Dati Country richiesti da KLog... &Download &Scarica &Ignore &Ignora Country data needed Dati Country richiesti KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. KLog utilizza il file cty.csv disponibile su https://www.country-files.com/ per ottenere informaizoni sui DXCC. You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do. Se vuoi che KLog mostri countries, locator, ecc nell'elenco QSO è indispensabile scaricare il file cty.cvs. Click on Download to download now. Clicca su Scarica per avviare immediatamente il trasferimento. KLog KLog I can't find the host. Please check your network and try again Do you want to try again? Il server è irraggiungibile. Verifica la conenssione di rete e riprova Vuoi riprovare? DXCCStatusWidget Update Aggiornamento It seems that the DXCC status in your database is not updated and KLog can't find any dxcc information. You can try to fix this by updating the log. Sembra che lo stato DXCC nel tuo database non sia aggiornato e qundi KLog non riesce a trovare alcuna informazione dxcc. Puoi provare a risolvere questo problema aggiornando il lof. Do you want to update your DXCC status? Vuoi aggiornare ul tuo status DXCC? Entity Elemento Prefix Prefisso Pref: Pref: CQ: CQ: ITU: ITU: Beam: Beam: Entity not worked in this band. Collegamento non processato per questa banda. DXClusterWidget Click on Connect to connect to the DX-Cluster server Clicca su Connetti per collegarti immediatamente al server DX-Cluter Connect Connetti Clear Pulisci Check in QRZ.com Controlla su QRZ.com Check this callsign in QRZ.com Controlla questo nominativo su QRZ.com Click on connect to connect to the DX-Cluster Clicca su Connetti per collegarti immediatamente al DX-Cluster Trying to connect to the server Tentativo di connessione al server in corso KLog DXCluster KLog DXCluster The host was not found. Please check: Server irraggiungibile. Controlla: - your network connection; - the host name and port settings. - la tua configurazione di rete; -la configurazione del nome del server ed il numero di porta. The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. La conenssione è stata rifiutata dall'altro lato. Verifica che il server DXCluster sia effettivamente in esecuzione, e controlla nome del server host e porta impostati. The following error occurred: %1. Appena verificato l'errore: %1. Connected to server Connesso al server KLog message Messaggio KLog Enter your callsign to connect to the cluster: Scegli il nominativo da usare per la connessione al cluster: Enter your password to connect to the cluster: (Just hit enter for no password) Inserisci la password di connessione al cluster: (dai direttamente Invio se non serve una password) Disconnect Scollega Not logged on, you may need to enter your callsign again. Non collegato, può essere necessario reinserire il nominativo. Enter here the commands to be sent to the DX-Cluster server. Inserisci i comandi da trasmettere al server DX-Clouster. Connection closed by the server Collegamento terminato dal server Click on Connect to connect to the DX-Cluster server. Clicca per avviare il collegamento al server DX-Cluster. Send Invia It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! Impossibile aprire il file per annotare i collegamenti DX sul server DX-Cluster! DataProxy_SQLite Software version in DB is null Versione software nel DB non inserita Aircraft Scatter Common term in hamradio, do not translate if not sure Aircraft Scatter Aurora Aurora Aurora-E Aurora-E Back scatter Common term in hamradio, do not translate if not sure Back scatter Earth-Moon-Earth Terra-Luna-Terra Sporadic E E sporadico Internet-assisted Internet-assisted Ionoscatter Common term in hamradio, do not translate if not sure Ionoscatter Meteor scatter Common term in hamradio, do not translate if not sure Meteor scatter Terrestrial or atmospheric repeater or transponder Terrestrial or atmospheric repeater or transponder Rain scatter Common term in hamradio, do not translate if not sure Rain scatter Satellite Satellite Bureau Common term in hamradio, do not translate if not sure Bureau Manager Common term in hamradio, do not translate if not sure Manager All QSOs have been updated with a DXCC and the Continent. Tutti i QSO e dil Continente aggiornati con DXCC. Field Aligned Irregularities Common term in hamradio, do not translate if not sure Field Aligned Irregularities Query didn't failed Query non fallita F2 Reflection Common term in hamradio, do not translate if not sure F2 Reflection Trans-equatorial Common term in hamradio, do not translate if not sure Trans-equatorial Tropospheric ducting Common term in hamradio, do not translate if not sure Tropospheric ducting Yes Sì No No Requested Richiesto Ignore/Invalid Ignorare/Invalido Validated Validato Queued In coda Uploaded Trasferito Do not upload Non trasferito Modified Modificato Direct Diretto Electronic Electronic KLog DXCC KLog-DXCC KLog - Invalid call detected KLog - Chiamata non valida rilevata An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported ADIF record? Nominativo bianco rilevato. Vuoi esportare comunque questo QSO (clicca su Sì) oppure vuoi cancellare l'elemento per non esportarlo su ADIF? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log? Un nominatico con formato non valido è stato rilevato %1, Vuoi esportare questo nominativo comunque (clocca su Sì) oppure vuoi evitare che sia esportato sul log? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. Esportare un nominativo sbagliato può causare concreti problemi nell'applicazione che importa questo log, sebbene sia sempre possibile che questo sia un nominativo valido erroneamente identificato da KLog. DownLoadCTY Download of cty.csv failed with the following error code: Scarico di cty.csv fallito con il codice di errore: Download of cty.csv done. Scarico di cty.cvs completato. There is already a cty.csv file in the folder but it will be replaced with the new one. E' già presente un file cty.cvs nella cartella ma sarà sovrascritto dal nuovo. Could not open %1 for writing Impossibile aprire %1 per scrittura FileAwardManager Open Award file Apre file Award Award files (*.awa) Files Award (*.awa) Award file not opened File Award non aperto KLog was not able to read the award file KLog non è riuscito a leggere il file award It was not possible to open the file %1 for reading. Non è stato possibile aprire il file %1 in lettura. AWA wrong format AWA formato sbagliato The AWA file does not have the right format Il file AWA non è composto nel corretto formato AWA file does not have an <EOH> field Il file AWA non ha un campo <EOH> KLog - %1 KLog - %1 FileManager Writing ADIF file... File ADIF in scrittura... Abort writing Scrittura annullata Writing ADIF file... QSO: File ADIF in scrittura... QSO: You have canceled the file export. The file will be removed and no data will be exported. Operazione di export annullata. File cancellato e niente export. KLog - Error KLog - Errore The selected log does not exist, please check it again. Non trovo il log scelto. Ricontrolla. The file %1 can't be opened. Impossibile aprire il file %1. Do you still want to cancel? Sei ancora convinto di annullare? QSO: QSO: KLog - User cancelled KLog - Annullato dall'utente Exporting ADIF file... QSO: %1 / %2 Export file ADIF... QSO: %1 / %2 Reading LoTW file... File LoTW in lettura... Reading ADIF file... File ADIF in lettura... KLog - Duplicated QSOs KLog - QSO duplicati Please edit the ADIF file and make sure that it include at least: Per favore correggi il file ADIF ed accertati che contenga almeno: and e This QSO had: Questo QSO aveva: KLog - No Station callsign entered. KLog - Nessun nominativo di stazione inserito. KLog - QSO without Station Callsign KLog - QSO senza nominativo di stazione definito Abort reading Annulla lettura There is more than one log in this logfile. Questo log file contiene più di 1 voce. All logs will be imported into the current log. Tutte le voci saranno importante nell'attuale log. Do you want to continue? Vuoi proseguire? Importing ADIF file... Import di file ADIF file in corso... It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) QSO duplicati nel file ADIF che stai importando. Vuoi continuare comunque? (i QSO duplicati non saranno importati) KLog - Log selection KLog - Log scelta You have canceled the file import. The file will be removed and no data will be imported. Import annullato. File rcancellato e nessun dato importato. There are no QSOs pending to be exported with that station callsign. Non ci sono QSO in attesa di export con il nominativo indicato. Export Export Export progress Progresso export Processing LoTW ADIF file... Lavorazione file LoTW ADIF... Abort processing Interruzione lavorazione LoTW reading Lettura LoTW KLog - Add new QSOs? KLog - Aggiunge nuovi QSO? Do you want to add non existing QSOs to your local log? Vuoi aggiungere i QSO non ancora presenti nel tuo log locale? There are some QSOs in the LoTW log that are not in your local log. Esistono QSO nel log LoTW assenti dal tuo log locale. Processing LoTW ADIF file...... QSO: %1 / %2 Lavorazione LoTW ADIF file.... QSO: %1 / %2 You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated. Hai annullato l'operazione LoTW. L'operazione sarà arestata e il tuo log potrebbe non essere completamente aggiornato. Do you want to add dupe QSOs to your local log? Vuoi aggiungere QSO duplicati al tuo log locale? There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date. Questo log file contiene QSO che possono essere duplicati in quanto con identico nominativbo, banda & modalità e una data molto ravvicinata. Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. Clicca su Sì per aggiungere una voce default %1 per il modo %2 a tutti i QSO con identico problema. KLog - Don't ask again KLog - Non chiedere ancora Do you want to reuse your answer? Vuoi riciclare la tua risposta? KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again. KLog utilizzerà automaticamente la tua precedente risposta per ogni altro riferimento simile, se trovato, senza richiedertelo. <ul><li>Date/Time:</i> %1</li><li>Callsign: %2</li><li>Band: %3</li><li>Mode: %4</li></ul> <ul><li>Data/Ora:</i> %1</li><li>Nominativo: %2</li><li>Banda: %3</li><li>Modo: %4</li></ul> KLog - QSO not found KLog - QSO non trovato Do you want to add this QSO to the log?: Aggiungo questo QSO al log?: We have found a QSO coming from LoTW that is not in your local log. Do you want KLog to add this QSO to the log? Trovato un QSO proveniente da LoTW assente dal tuo log locale. Aggiungo questo QSO al log? KLog - Invalid call detected KLog - Chiamata invalida trovata An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported log file? Manca il nominativo. Esporto comunque il QSO (clicca su Sì) o rimuove il campo dal file log esportato? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log file? Nominativo invalido trovato %1. Vuoi esportare questo nominativo comunque (scegli Sì) oppure vuoi rimuovere la voce dal file export? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. You can, however, edit the ADIF file once the export process is finished. Esportare chiamate invalide può provocare inconvenienti successivamente, quando poi il file sarà importato. Però un nominativo può essere corretto e Klog in errore. Pertanto è sempre possibile proseguire e correggere il nominativo successivamente, una volta completato l'export. The selected callsign (%1) is not valid, please check it again to export the log. Nominativo scelto invalido (%1), verificalo di nuovo prima di esportare il log. KLog - File not opened KLog - File non aperto It was not possible to open the file %1 for reading. Impossibile aprire il file %1 in lettura. KLog was not able to read the LoTW file Impossibile leggere il file LoTW Importing LoTW ADIF file... Import file loTW in corso... This QSO is not including the minimum data to consider a QSO as valid! Questo QSO non contiene il numero minimo di campi compilati necessari che rendono un QSO valido! - The band missing and the following call: - collegamento senza la banda specificata: KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO with %1 on %2: KLog ha trovato un QSO senza il nominativo di stazione caricato. Scegli il nominativo di stazione per questo QSO fra %1 e %2: KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO on %1: KLog ha trovato un QSO senza il nominativo di stazione caricato. Scegli il nominativo di stazione per questo QSO su %1: - The mode missing and the following call: - chiamata senza modo operativo specificato: - The date missing and the following call: - chiamata senza la data indicata: - The time missing and the following call: - chiamata senza l'ora indicata: Do you want to continue with the current file? Vuoi proseguire con il file corrente? KLog: Not all required data found! KLOg: Dati necessari mancanti! Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information. In alcuni QSO di questo log (es. %1) mancano le informazioni RST-TX. If you select NO, maybe the QSO will not be imported. Scegliendo No il QSO non sarà importato. Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. In alcuni QSO di questo log (es. %1) mancano le informazioni RST-RX. KLog - Apply to all QSOs in this log? KLog - Applica a tutti i QSO di questo log? KLog: No RST TX found! KLog: Non trovato RST TX! KLog: No RST RX found! KLog: Non trovato RST RX! HamLibNetworkConfigWidget Enter the hostname or address of the radio. Inserisci l'hostname o l'indirizzo della radio. Set de network port of the radio. Imposta la porta di rete della radio. Host/Address Host/Indirizzo Port Porta Enter the port of the radio. Inserisci la porta della radio. HamLibSerialConfigWidget Bauds Bauds Select the serial port speed. Seleziona la velocità di comunicazione con la porta seriale. Port Porta Select the serial port. Only the serial ports that are detected are shown. Seleziona la porta seriale. Solo le porte seriali realmente trovate sono in elenco. Scan Scansione Click to identify the serial ports available in your computer. Clicca per cercare quali porte seriali sono disponibili sul tuo computer. 5 bits 5 bit 6 bits 6 bit 7 bits 7 bit 8 bits 8 bit Data bits Data Bit Select the serial data bits. Seleziona il numero di bit usati nella comunicazione via seriale. None Vuoto Hardware Hardware Software XON/XOFF Software XON/XOFF Flow control Controllo di flusso (flow control) Select the serial flow control Seleziona il tipo di controllo di flusso No parity Nessuna parità Even Even Odd Odd Space Spazio Mark Mark Parity Parità Select the serial parity. Scegli il bit di parità sulla seriale. 1 bit 1 bit 1.5 bits 1,5 bits 2 bits 2 bits Stop bits Bit di stop Select the serial stop bits. Seleziona il numero di bit di stop della seriale. InfoWidget 10M 10m 15M 15m 20M 20m 40M 40m 80M 80m 160M 160m 2M 2m 6M 6m 12M 12m 17M 17m 30M 30m 70CM 70cm Continent Contienente Prefix Prefisso CQ CQ ITU ITU Short Path Percorso breve Long Path Percorso lungo Deg Deg Miles Miglia Km Km IntroPage Welcome to KLog! Benvenuto/a su KLog! Welcome to KLog! - brought to you under the terms of the GPL! Benvenuto/a su KLog! -Utilizzabile regolamentato come da licenza GPL! Welcome to KLog Benvenuto/a su KLog This looks like it's the first time you've run KLog on this computer. E' la prima esecuzione di KLog su questo sistema. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. KLog è un programma libero di log per uso radio che può funzionare su GNU/Linux, macOS, e Windows. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. It is designed to provide general purpose DX, and contest logging. E' pensato come generico supporto ai DX e log durante i contest. It supports QSL management, import and export of ADIF Questo software gestisce le QSL, e importa / esporta in formato ADIF and Cabrillo file formats and many other features... ed il formato Cabrillo e molto altro... Before you can start using KLog, you will be asked to: Prima di iniziare ad usare KLog, è necessario: Acknowledge to the terms of the license. Conferma dei termini di utilizzo descritti nella licenza. Download the DX entities information. Scarica collegamenti DX. Enter your callsign, CQ zone, etc. and main configuration. Inserisci nominativo di stazione, zona CQ e tutte le informazioni di base. Enjoy KLog and contact the development team if you have any suggestions! Buon lavoro con KLog. Puoi anche contattare lo staff di sviluppo per ogni eventuale proposta o suggerimento! LicPage KLog License information KLog informazioni sulla licenza Welcome to KLog!- brought to you under the terms of the GPL! Benvenuto/a su KLog! -Utilizzabile regolamentato come da licenza GPL! Acknowledge Conferma Be aware that KLog is free software. KLog è sviluppato come software libero. LoTWUtilities KLog - LoTW password needed KLog - password LoTW necessaria Please enter your LoTW password: Per favore inserisci la tua password LoTW: There is a file already existing with the name that will be used. Esiste già un file di nome identico a quello che vorresti usare. The file %1 already exist. Do you want to overwrite? Il file %1 esiste già. Posso sovrascriverlo? KLog was not able to save the file %1. Error returned: %2 KLog non riesce a salvare il file %1. Codice di errore restituito: %2 Downloading data to file: %1. Scarico informazioni nel file: %1. KLog - LoTW download KLog - Scarico LoTW This is the first date of a QSO with the callsign %1 in this log If you think that in LoTW you may have previous QSOs, answer No. Questa è la prima data di un QSO con il nominativo %1 nel log, se pensi che su LoTW possano esserci precedenti QSO, rispondi No. Do you want to use this date (%1) as start date? Vuoi utilizzare questa data (%1) come data di partenza? The remote server redirected our connection to %1 Redirezione connessione al server %1 Do you want to follow the redirection? Vuoi seguire la redirezione? It was not possible for find the file %1 that has been just downloaded. Il file %1 appena scaricato non risulta disponibile. It seems that LoTW has no QSO with the Station Callsign you are using (%1). Su LoTW non risulta nessun QSO con il nominativo in uso (%1). Try again and send the downloaded file (%1) to the KLog developer for analysis. Riprova e invia il file scaricato (%1) agli sviluppatori di KLog per analisi. KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data? KLog QSO correttamente scaricati %1. Vuoi inserire nel tuo log i nuovi QSO appena scaricati? Double click on the date that you want to use as the start date for downloading QSOs. Doppio click sulla data che vuoi usare come prima data nello scarico dei QSO. KLog - LoTW Station callsign KLog - Nominativo di stazione LoTW There is not a single QSO in the log with that station callsign. Non c'è un solo QSO sul log con questo nominativo di stazione. Are you sure that you want to use that station callsign (%1)? Sei sicuro di voler usare questo nominativo di stazione (%1)? KLog - LoTW File already exists KLog - File LoTW già presente KLog - LoTW Can't write the file KLog . LoTW non riesce a scrivere il file The file %1 already exists. Il file %1 è già presente. KLog - LoTW Start date selection KLog - Selezione data iniziale LoTW KLog - LoTW Download error KLog - Errore durante lo scaricamento LoTW There was an error (%1) while downloading the file from LoTW. Si è verificato un errore (%1) durante lo scarico del file da LoTW. The downloading error details are: %1 I dettagli dell'errore durante lo scarico sono: %1 KLog - LoTW Redirection found KLog - Rilevata redirezione LoTW KLog - LoTW File not found KLog - File LoTW non trovato KLog can't find the downloaded file. KLog non trova il file scaricato. KLog - LoTW user/password error KLog - Username / password LoTW rifiutate LoTW server did not recognized your user/password Il server LoTW non riconosce l'username/password inserito Check your user and password and ensure your are using the right one before trying again. Verifica che l'username/passowrd inseriti siano quelli giusti prima di riprovare ancora. KLog - LoTW No QSOs KLog - LoTW numero QSO LoTW sent no QSOs LoTW invio numero di QSO KLog - LoTW Unknown error KLog - LoTW Errore imprevisto KLog can't recognize the file that has been downloaded from LoTW. KLog non può verificare se il file è stato correttamente scaricato da LoTW. Now KLog will process the downloaded QSO and update your local log. KLog inserirà i QSO appena scaricati sul tuo log locale. LogWindow QSL Send Trasmetti QSL QSL Rcvd Ricevi QSL &Delete &Cancella Delete a QSO Cancella un QSO &Edit QSO &Modifica QSO Edit this QSO Modifica questo QSO Via &bureau Via &bureau Send this QSL via bureau Trasmetti questa QSL via bureau D&irect D&irect Send this QSL via direct Trasmetti questa QSL via direct Via bureau Via bureau QSL &received via bureau QSL &ricevuta via bureau Direct Direct QSL received via direc&t QSL ricevuta via direc&t Check in QRZ.com Controlla su QRZ.com Check this callsign in QRZ.com Controlla questo nominativo su QRZ.com Check in DXHeat.com Controlla su DXHeat.com Check this callsign in DXHeat.com Controlla questo nominativo su DXHeat.com Delete selected QSOs Cancella i QSO selezionati Delete the selected QSOs Cancella i QSO selezionati Export to ADIF Esporta su ADIF Export the selected QSOs to an ADIF file. Esporta i QSO selezionati su un file ADIF. Upload to LoTW Trasferisce a LoTW Upload the selected QSOs to LoTW Scarica i QSO selezionati su LoTW Upload to ClubLog Trasferisce a ClubLog Upload the selected QSOs to ClubLog Trasferisce i QSO selezionati su ClubLog Upload to eQSL.cc Trasferisce su eSQL.cc Upload the selected QSOs to eQSL.cc Trasferisce i QSO selezionati su eQSO.cc Send these QSLs via bureau Trasferisce questi QSO via bureau Send these QSLs via direct Trasferisce questi QSO via direct QSLs received via bureau QSL ricevute via bureau QSLs received via direc&t QSL ricevute via direc&t Select none Nessuna scelta Remove all selections Cancella tutte le scelte Select all Scegli Tutto Select all the QSOs Scegli tutti i QSO MainQSOEntryWidget &Add &Aggiunge &Clear &Pulisce Callsign of the QSO. Nominativo del QSO. Band of the QSO. Banda del QSO. Mode of the QSO. Modo operativo del QSO. Date of the QSO. Data del QSO. Time of the QSO. Ora del QSO. Add the QSO to the log. Aggiunge il QSO al log. Clears the QSO entry. Pulisce i campi del QSO. Look up info about the current callsign on qrz.com KLog will show real time if enabled. KLog lavorerà in tempo reale se abilitato. Real time Tempo-reale Stop wsjt-x and hamlib from automatically updating QSO information. Arresta wsjt e hamlib perl'aggiornamento automatico dei dati sui QSO. Manual Mode Modalità manuale Callsign Nominativo &Save &Salva &Cancel &Annulla DUPE Translator: DUPE is a common world for hams. Do not translate of not sure DUPE MainWindow Starting KLog KLog in avvio DX Entity Collegamento DX &Log Window Finestra &Log KLog KLog It seems that you have never done a backup or exported your log to ADIF. Non hai mai fatto un backup o esportato il tuo log su file ADIF. It was not possible to open the debug file for writing. No debug log will be saved! Impossobile aprire in scrittura il file di debug. Log di debug non salvato! Status bar ... Barra di stato ... KLog - CTY.dat update KLog - Aggiornamento CTY.dat It seems that the latest backup you did is older than one month. Il tuo ultimo backup risale a più di 1 mese fa. Log backup recommended! Backup del log raccomandato! It is a good practice to backup your full log regularly to avoid loosing data in case of a problem. Once you export your log to an ADIF file, you should copy that file to a safe place, like an USB drive, cloud drive, another computer, ... KLog will remind you to backup on a monthly basis. E' buona abitudine fare regolarmente backup completo del tuo log per evitare di perderli in caso di problemi. Una volta esportato il tuo log su file ADIF, dovresti copiare il file su un supporto esterno e tenuto questo al sicuro, come una pennina USB, cloud drive, un altro computer, ... KLog ti ricoderà la necessità di fare il backup almeno 1 volta al mese. KLog - Backup klOG - Backup KLog - New version detected! KLog . Rilevata nuova versione! Ready Pronto An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: Errore imprevisto durante l'aggiunta del QSO al tuo log. Se il problema si ripete, per favore contatta lo staff di sviluppo per analisi: KLog - Not valid call KLog - Collegamento non valido Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. Caricare chiamate non valide nel log può dare problemi, quando trasmesse per riconoscimenti, se exportate su file ADIF verso altri sistemi o applicazioni. You have selected an entity: Hai scelto un elemento: that is different from the KLog proposed entity: diverso dall'elemento KLog proposto: Click on the prefix of the correct entity or Cancel to edit the QSO again. Clicca sul prefisso dell'elemento corretto o Annulla per tornare a correggere il QSO. No DXCC No DXCC None Vuoto Click on the prefix of the right entity or Cancel to correct. Clicca sul prefisso dell'elelemento a destra o su Cancella per correggere. KLog - ClubLog error KLog - errore ClubLog KLog - eQSL error KLog - errore eQL Download from LoTW ... Scarico da LoTW ... Download the full log from LoTW ... Scarico del log completo da LoTW ... ClubLog tools ... Strumenti ClubLog ... Upload the queued QSOs to ClubLog ... Trasferimento QSO in coda a ClubLog ... eQSL tools ... Strumenti eQSL ... Upload the queued QSOs to eQSL.cc ... Trasferimento QSO in coda a eQSL.cc ... QRZ.com tools ... Strumenti QRZ.com ... Your log has been updated with the LoTW downloaded QSOs. Il tuo log è stato aggiornato aggiungendo i QSO scaricati da LoTW. KLog has updated %1 QSOs from LoTW. KLog ha aggiornato i QSO %1 da LoTW. No QSOs have been exported to ADIF. Nessun QSO è stato esportato su ADIF. KLog has exported %1 QSOs to the ADIF file: %2 KLog ha esportato N. %1 QSO su file ADIF: %2 You need to select one station callsign to be able to send your log to LoTW. Devi scegliere un nominativo di stazione per trasmettere il tuo log a LoTW. There was an error while updating to Yes the LoTW QSL sent information. Si è verificato un errore mentre marcavo come Spediti Sì verso LoTW. KLog - Select the Station Callsign. KLog - Scegli il nominativo di stazione. RSTrx RSTrx RSTtx RSTtx Do you really want to exit KLog? Vuoi davvero uscire da KLog? KLog - File not open KLog - File non aperto It was not possible to define the KLog folder. Some functions may not work properly! KLog - Unexpected error KLog - Errore imprevisto KLog - Select correct entity KLog - Scegli il giusto elemento KLog - Exit KLog - Uscita &File &File Import an ADIF file into the current log. Importa un file ADIF nell'attuale log. Export the current log to an ADIF logfile. Esporta l'attuale log su un log file ADIF. Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Esporta TUTTI i QSO in un file ADIF, fondendo QSO da tutti i diversi log. Print your log. Stampa il tuo log. KLog folder Cartella di KLog Opens the data folder of KLog. Apre la cartella dati di KLog. E&xit E&sce &Tools &Strumenti Fill in QSO data Inserisci i dati del QSO Go through the log reusing previous QSOs to fill missing information in other QSOs. Riempie i dati mancanti su QSO con dati presi da precedenti QSO. Shows QSOs for which you should send your QSL and request the DX QSL. Elenca i QSO per i quali devi ancora spedire la tua QSL e richiedere la QSL del DX. Find My-QSLs pending to send Trova le mie QSL ancora da spedire Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Evidenzia i QSO per i quali hai ancora da spedire le QSL. Questa lista dovrebbe essere sempre vuota! Mark all queued QSOs in this log as sent to LoTW. Indica come spediti a LoTW tutti i QSO in coda di questo log. Mark all queued QSOs as sent to LoTW. Indica come spediti a LoTW tutti i QSO in coda. For updated DX-Entity data, update cty.csv. Per aggiornare i collegamenti DX, aggiorna cty.csv. Stats Statistiche Show the statistics of your radio activity. Mostra le statistiche sulla tua attività radio. &Help &Aiuto KLog - TQSL KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. TQSL non installato o irraggiungibile per KLog. Per favore ricontrolla la configurazione. Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded. Errore #1: Procedura annullata dall'utente o TQSL non configurato. Nessun QSOs è stato trasferito. Error #2: Upload was rejected by LoTW, please check your data. Errore #2: Il trasferimento è stato rifiutato da LoTW, per favore ricontrolla i tuoi dati. Error #3: The TQSL server returned an unexpected response. Errore #3: Il server TQSL ha risposto in modo inaspettato. Error #4: There was a TQSL error. Errore #4: Si è verificato un errore su TQSL. Error #5: There was a TQSLLib error. Errore #5: Si è verificato un errore con TQSLLib. Error #6: It was not possible to open the input file. Errore #6: Impossibile aprire in input il file. Error #7: It was not possible to open the ouput file. Errore #7: Impossobile aprire in output il file. Error #8: No QSOs were processed since some QSOs were duplicates or out of date range. Errore #8: Nessun QSO è stato processato perché alcuni QSO sono duplicati o hanno data al di fuori del limite ammesso. Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range. Errore #9: Alcuni QSO sono stati processati, ed altri sono stati ignorati perché duplicati o con data al di fuori dei limiti ammessi. Error #10: Command syntax error. KLog sent a bad syntax command. Errore #10: Errore di sintassi sul comando. KLog ha inviato un comando con sintassi sbagliata. Error #11: LoTW Connection error (no network or LoTW is unreachable). Errore #11: Impossibile connettersi a LoTW (rete assente o server LoTw irraggiungibile). Error #00: Unexpected error. Please contact the development team. Errore #00: Errore inaspettato. Per favore contatta lo staff di sviluppo. The log that you have selected contains more than just one station callsign. Il log selezionato contiene più di un solo nominativo di stazione. Please select the station callsign you want to mark as sent to LoTW: Per favore scegli il nominativo di stazione che vuoi segnare come già inviato a LoTW: Station Callsign: Nominativo di stazione: Define Station Callsign Imposta il nominativo di stazione Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Scegli il nominativo di stazione per questo log o lascialo vuoto per i QSO senza nominativo impostato: KLog - No station selected KLog - Stazione non selezionata No station callsign has been selected and therefore no log will be marked Nessun nominativo di stazione scelto e qundi nessun log sarà segnato Congratulations! congratulazioni! You already have the latest version. Versione già aggiornata. You can find the KLog data folder here: La cartella dati di KLog è questa: start inizio stop stop KLog - QSO Dupe A dupe QSO has been detected in the file and will not be added to the log. Please check the QSO information file and ensure it is properly added. If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. Se sei davvero certo che il database contenga dei QSO anche se KLog non riesce a trovarne, per favore contatta gli sviluppatori (guarda About KLog) per aiuto. KLog - QSO received Klog - QSO ricevuto Duplicated QSOs have to match another existing QSO with the same call, band, mode, date and time, taking into account the period that can be defined in the settings. I QSO duplicati hanno corrispondenza di nominativo, banda, modo, data ed ora con un QSO già esistente, relativamente al periodo definito nell'impostazione dell'account. QSO logged from WSJT-X: QSO loggato da WSJT-X: It seems that you are running this version of KLog for the first time. E' la prima esecuzione di questa versione di KLog. The setup will be open to allow you to do any new setup you may need. Adesso apro immediatamente la maschera di configurazione per permetterti tutte le modifiche richieste. You have requested to delete the QSO with: %1 Hai chiesto di cancellare il QSO con: %1 Are you sure? Sei sicuro? Check always the current callsign in QRZ.com Controlla sempre il nominativo su QRZ.com You can update the entities database in Tools->Update cty.csv Puoi aggiornare l'elenco delle località su Strumenti->Scarirco cty.cvs Do you want to do it now? Vuoi farlo adesso? The callsign %1 is not a valid call. Do you really want to add this callsign to the log? Il nominativo %1 non è un nominativo valido. Davvero vuoi aggiungerlo al log? KLog - Not valid callsign KLog - Nominativo non valido The callsign %1 is not a valid callsign. Do you really want to add this callsign to the log? Il nominativo %1 non è un nomiantivo valido. Favvero vuoi aggiungerlo al log? You have requested to delete several QSOs Hai chiesto la cancellazione di parecchi QSO The ClubLog upload process has finished with an error and the log was possibly not uploaded. L'perazione di scarico di ClubLog è terminata con errori e probabilmente il log non è stato scaricato. Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 Per favore controlla i tuoid ati di collegamento, della tua connessione e dell'account ClubLog. Il codice di errore riportato era: %1 Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? Vuoi segnare come trasferiti tutti i QSO trasferiti a ClubLog? KLog - ClubLog KLog - ClubLog Always check the current callsign in QRZ.com Upload queued QSOs to LoTW Do you want to update now? You seem to have never backed up or exported your log to ADIF. Your latest backup seems older than one month. Regular backups prevent data loss and are good operator practice. Once exported, copy your ADIF file to a safe place such as a USB drive, cloud drive or other offsite computer. KLog will remind you to backup on a monthly basis. Backup completed successfully KLog will remind you again in approximately one month. Backup failed. Periodic data backups are recommended to prevent data loss and corruption of your log. The setup will now open to allow you to change your settings. There was an error while updating to Yes the ClubLog QSO upload information. Si è verificato un errore durante l'aggiornamento a Sì delle informazioni QSO ClubLog. The ClubLog upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? Il trasferimento è terminato e KLog ha creato un file (%1) nella cartella di KLog. Vuoi cancellare questo file? The file has not been removed. Il file non è stato cancellato. It seems that there was something that prevented KLog from removing the file You can remove it manually. Qualcosa ha impedito a Klog di cancellare il file Ma lo puoi comunque cancellare manualmente. The eQSL upload process has finished with an error and the log was possibly not uploaded. Il trasferimento eQSL è terminato ma con errori e qundi probabilmente non ha avuto termine. Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1 Per favore controlla i tuoi dati account, la tuaa conenssione internet e le tue credenziali eQSL. Il codice di errore riportato era: %1 Do you want to mark as Uploaded all the QSOs uploaded to eQSL? Vuoi marcare come trasferiti tutti i QSL mandati a eQSL? There was an error while updating to Yes the eQSL QSO upload information. Si è verificato un errore durante l'aggiornamento a Sì di eQSL delle informaizoni dei QSO. The eQSL upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? Il trasferimento a eQSL è terminato e KLog a creato un file (%1) nella tua carrtella KLog. Vuoi cancellare quresto file? KLog - %1 KLog %1 The logfile has been modified. Il file di log è stato modificato. Do you want to save your changes? Vuoi salvare i cambiamenti? KLog - ADIF export KLog - exsporta ADIF &Import from ADIF ... &Importazione da Adif ... Export to ADIF ... Esportazione su ADIF ... Export all logs to ADIF ... Esporta tutti i log su ADIF ... &Print Log ... &Stampa Log ... QSL tools ... Strumenti QSL ... Find QSO to QSL Cerca QSO sulle QSL Find DX-QSLs pending to receive Cera le QSL su DX in attesa di ricezione Shows DX-QSLs for which requests or QSLs have been sent with no answer. Elenca QSL di DX per le quali richieste o QSL spedite sono ancora senza risposta. Find requested pending to receive Cerca richieste in attesa di ricezione Shows the DX-QSLs that have been requested. Elenca le QSL DX richieste. LoTW tools ... Strumenti LoTW ... Queue all QSLs from this log to be sent Mette in coda tutte le QSL di questo log ancora da spedire Mark all non-sent QSOs in this log as queued to be uploaded. Segna tutti i QSO non speditI di questo log mettendolI in coda in attesa per l'invio. Queue all QSLs to be sent Mette in coda tutte le QSL da spedire Put all the non-sent QSOs in the queue to be uploaded. Mette incoda tutti i QSO per essere inviati. Mark all queued QSOs from this log as sent Marca tutti i QSO In coda sul log come trasmessi Mark all queued QSOs as sent Marca tutti i QSO in coda come spediti Check the current callsign in QRZ.com Verifica il nominativo corrente su QRZ.com Upload the queued QSOs to QRZ.com ... Trasferisce i QSO In coda su QRZ.com ... Update cty.csv Aggiorna cty.csv Update Satellite Data Agggiorna dati satelliti Online manual (F1) ... Manuale online (F1) ... &Tips ... &Suggerimenti ... &Debug ... &Debug ... &About ... &About ... About Qt ... About Qt ... Check updates ... Controlla presenza aggiornamenti ... All pending QSOs of this log has been marked as queued for LoTW! Tutti i QSO di questo log in attesa sono inseriti in coda per LoTW! Now you can upload them to LoTW. Adesso puoi trasmetterlo a LoTW. There was a problem to mark all pending QSOs of this log as queued for LoTW! Impossibile marcare tutti i QSO di questo log in coda per LoTW! Your log has not been updated. Il tuo log non è stato aggiornato. No QSO was updated with the data coming from LoTW. This may be because of errors in the logfile or simply because your log was already updated. Nessun QSO è stato aggiornato con i dati provenienti da LoTW. Forse a causa di erroi contenuti nel file log o magari semplicemente perché il tuo log era già aggiornato. All pending QSOs has been marked as queued for LoTW! Tutti i QSO in attesa sono stati marcati per LoTW! All queued QSOs has been marked as sent to LoTW! Tutti i QSO in coda sono stati marcati come spediti a LoTW! There was a problem to mark all queued QSOs of this log as sent to LoTW! Impossibile marcare tutti i QSO di questo log in coda come spediti a LoTW! About ... About ... KLog - Update checking result KLog . risultato controllo aggiornamento UDP Server error The UDP server failed to %1. start or stop Errore Server UDP Il server UDP ha fallito a %1. It seems that there are no QSOs in the database. Sembra non ci siano QSO nel database. Status of the DX entity. Stato del collegamento DX. Name of the DX entity. Nome del collegamento DX. QSO QSO QSL QSL eQSL eQSL Comment Commento Others Altro My Data Miei Dati Satellite Satellite You need to select one station callsign to be able to send your log to ClubLog. E' necessario selezionare almeno un nominativo di stazione per poter trasferire il tuo log su ClubLog. Do you want to add this QSOs to your ClubLog existing log? Vuoi aggiungere questo QSO al tuo attuale log su ClubLog? If you don't agree, this upload will overwrite your current ClubLog existing log. Se non sei d'accordo, questo trasferimento sopvrascriverà il tuo corrente log su ClubLog. KLog - eQSL KLog - eQSL You need to select one station callsign to be able to send your log to eQSL.cc. E' necessario selezionare almeno un nominativo di stazione per poter trasferire il tuo log a eQSO.cc. Select the Station Callsign to use when quering LoTW: Seleziona il nominativo di stazione da usare intrerfacciandosi a LoTW: Please check the LoTW setup Prego controllare configurazione LoTW You have not defined a LoTW user or a proper Station Callsign. Open the LoTW tab in the Setup and configure your LoTW connection. Utente LoTW non impostato o incorretto nominativo di stazione. Configura i parametri di connessione di LoTW. The log is ready to be uploaded to ClubLog. Il log è già stato trasferito su ClubLog. All the QSOs in this log has been marked as Modified in the ClubLog status field Tutti i QSO di questo log sono stati marcati come Modificati nel campo di stato di ClubLog KLog could not mark the full log to be sent to ClubLog KLog non hjapotuto marcare l'intero log per il trasferimento a ClubLog Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers. Qualcosa ha impedito a KLog di marcare i QSO come modificati. Riavvia KLog e riprova prima di contattare gli sviluppatori di KLog. The log is ready to be uploaded to eQSL.cc. Il log è già stato trasferito a eQSL.cc. All the QSOs in this log has been marked as Modified in the eQSL.cc status field Tutti i QSO di questo log sono stati marcati come Modificati nel campo stato di eQSL.cc KLog could not mark the full log to be sent to eQSL KLog non ha potuto marcare l'intero log pe ril trasferimento su eQSL Filling QSOs ... Completamento QSO ... Date/Time Data/Ora Callsign Nominativo Station Callsign Nominativo di stazione Operator Callsign Nominativo operatore KLog - Non-supported mode KLog - modo non supportato A new mode not supported by KLog has been received from an external program or radio: Nuova modalità non supportata da KLog ricevuta da programma esterno o radio: Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) Vuoi continuare a ricecere questi allarmi? (disabilitando gli allarmi impedirai però anche il rilevamento di modalità non valide) Native Error Errore nativo Recommendation: Raccomandazione: Periodically export your data to ADIF to prevent a potential data loss. Periodicamente esporta i tuoi dati su file ADIF per prevenire potenziali perdite dati. DXCC DXCC Info Info Awards Riconoscimenti Search Ricerca Log Log DX-Cluster DX-CLuster Save ADIF File Salva file ADIF The LoTW upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? Il trasferimento verso LoTW è terminato e KLog ha creato un file (%1) nella tua cartella dati KLog. Vuoi cancellare il file? The file has been removed. Il file è stato cancellato. Upload the queued QSOs to LoTW Trasferisce i QSO in coda a LoTW KLog needs to update the Entities database. KLog deve aggiornare il database località. The backup was done successfully Il Backup è stato completato con successo KLog will remind you to backup your data again in aprox one month. KLog ti ricoderà di fare il backup dei tuoi dati ancora fra circa un mese. The backup was not properly done. Il backup NON è stato completato con successo. It is recommended to backup your data periodically to prevent lose or corruption of your log. E' fortemente raccomandabile fare il backup dei tuoi dati periodicamente per prevenire perdite o corruzioni del tuo log. This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. Questa operazione cancellerà definitivamente tutti i QSO selezionati e dati correlati e non potranno essere recuperati successivamente. The QRZ.com upload process has finished with an error and the log was possibly not uploaded. Il processo di trasferimento a QRZ.com è terminato con errori pertanto il log non è stato probabilmente trasferito. Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? Vuoi marcare come già trasferiti tutti i QSO trasferiti a QRZ.com? KLog - QRZ.com KLog - QRZ.com There was an error while updating to Yes the QRZ.com QSO upload information. Si è verificato un errore durante il trasferimento a Sì su QRZ.com nelle informazioni di trasferimento. The QRZ.com upload process has finished successfully Il trasferimento si QRZ.com è stato completato con successo Call not found in QRZ.com Nominativo non trovato su QRZ.com KLog - QRZ.com error KLog errore QRZ.com KLog has received an error from QRZ.com. KLog ha ricevuto una segnalazione di errore da QRZ.com. You need to activate the %1 service in the eLog preferences. E' necessario attivare il servizio %1 fra le impostazioni di eLog. It is important to export to ADIF and save a copy as a backup. E' importante esportare su ADIF e salvare una copia cone backup per sicurezza. Saving the log was done successfully. Salvataggio del log fatto con successo. The ADIF export was not properly done. L'esportazione ADIF non è stata correttamente effettuata. Queue all the QSOs to be uploaded Mette in coda tutti i QSO per il trasferimento Queue all the QSO to be uploaded Mette in coda tutti i QSO per il trasferimento You have selected no callsign. KLog will complete the QSOs without a station callsign defined and those with the callsign you are entering here. Non ha selezionato un nominativo, KLog completerò il QSO senza annotare un nominativo di stazione e nessuno dei nominativi che inserisci qua. KLog - LoTW KLog - LoTW KLog - Stop the war in Ukraine! KLog - Stop the war in Ukraine! You are using a Russian call (%1). You can probably help to stop the Russian war, people are dying. Please call your leaders to stop the war. You are using an Ukranian call. Please take care and protect yourself and your family. The KLog developers wish you the best of luck in this very difficult moment. People are dying in the war of Russia against Ukraine. You can help to stop the Russian war against Ukraine. Please show your disagreement to your leaders, or in your social network to stop the war. KLog - KLog folder not found This version of KLog requires that the DXCC database is updated. The database will be updated. KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 KLog-%1 - Logbook of %2 - Nominativo stazione: %3 - QSOs: %4 KLog - QRZ.com warning KLog - QRZ.com warning QRZ.com has returned a non-subcribed error and queries to QRZ.com will be disabled. QRZ.com ha restituito l'errore di non iscrizione e qundi non sarà possibile interpellare QRZ.com. Please check your QRZ.com subcription or credentials. Per favore controlla la tua iscrizione al servizio QRZ.com. Settings ... Impostazioni... Queue all QSOs from this log to be sent Show Map Mostra mappa Do you really want to mark ALL the QSOs of this log to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. Sei certo di segnare TUTTI i QSO di questo log come da trasmettere? Questa procedura deve essere fatta SOLO SE QUESTO E' il primo trasferimento di QSO verso LoTW. Do you really want to mark ALL pending QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. Sei certo di segnare TUTTI i QSO in sopeso di questo log come da trasmettere? Questa procedura deve essere fatta SOLO SE QUESTO E' il primo trasferimento di QSO verso LoTW. There was a problem to mark all pending QSOs as queued for LoTW! L'operazione di segnare tutti i QSO in sospeso per la trasmissione verso LoTW ha incontrato dei problemi! All queued QSOs of this log has been marked as sent to LoTW! Tutti i QSO di questo log sono stati indicati per la trasmissione verso LoTW! There was a problem to mark all queued QSOs as sent to LoTW! L'operazione di segnare tutti i QSO per la trasmissione verso LoTW ha incontrato dei problemi! TQSL finished with no error. Do you want to mark as Sent all the QSOs uploaded to LoTW? TQSL terminato senza errori. Vuoi marcare come Trasmesso per tutti i QSO trasferiti a LoTW? The selection you have done does not include any QSO The selection you have done does not include any QSO. Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1 Davvero vuoi marcare tutti i tuoi QSO come da trasmettere? Questo deve essere fatto solo la prima volta hce trasferisci QSO su %1 ClubLog ClubLog KLog - QRZ.COM KLog-QRZ.COM QRZ.COM QRZ.COM The log is ready to be uploaded to QRZ.com. Il log è pronto per il trasaferimento a QRZ.com. All the QSOs in this log has been marked as Modified in the QRZ.com status field Tutti i QSO di questo log sono stati marcati come Modificati nel campo di stato su QRZ.com KLog could not mark the full log to be sent to QRZ.com KLog non ha potuto marcare TUTTO il log per il trasfeirmento su QRZ.com To upload QSOs you need a qrz.com subscription. If you have one, go to Setup->QRZ.com tab to enable it. Per poter trasferire QSO a QRZ.com è necessario essere iscritti al servizio. Se sei iscritto vai alal pagina Setup-> QRZ.com per abilitare la funzionalità. You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. E' necessario impostare una valida key API per il tuo logbook QRZ.com fra le impostazioni di eLog. Open File Apre File - Needed for DXMarathon - Richiesto per DXMarathon Abort filling Annulla completamento Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: Completamento dei campi DXCC, CQz, ITUz, Continente nel QSOs... QSO: Number Numero Band Banda Mode Modo Print Log Stampa Log Abort printing Annulla stampa Printing the log ... Stampa il log ... Printing the log... QSO: In stampa il log... QSO: The following QSO data has been received from WSJT-X to be logged: I dati del seguente QSO sono stati ricevuti da WSJT-X per essere inseriti nel log: Freq Frequenza Time On Tempo Acceso Time Off Tempo Spento RST TX RST TX RST RX RST RX DX-Grid DX-Grid Local-Grid Local-Grid KLog - WSJTX Dupe QSO KLog - WSJTX Duplica QSO This QSO seems to be duplicated. Do you want to save or discard it? Questo QSO sembra un duplicato. Vuoi salvarlo o scaricarlo? If the received mode is correct, please contact KLog development team and request support for that mode Se la modalità di ricezione è corretta, per favore contatta lo staff di sviluppo di KLog per richiedere l'inserimento della nuova modalità KLog - Duplicated satellite KLog - Satellite duplicato A duplicated satellite has been detected in the file and will not be imported. Un satellite duplicato è stato trovato nel file e non sarà importato. Please check the satellite information file and ensure it is properly populated. Per favore controlla il file delle informazioni dei satelliti e verifica che effettivamente contenga dei satelliti. Now you will see a more detailed error that can be used for debugging... Adesso ti mostro una indicazione di errore più dettagliata da usare come debug... An unexpected error ocurred!! Si è verificato un errore inaspettato!! If the problem persists, please contact the developers Se il problema continua, per favore contatta gli svipuppatori for analysis: per analisi: Error in function Errore in function Error text Messaggio di errore Failed query Query fallita KLog - Show errors KLog - Mostra errori Do you want to keep showing errors? Vuoi mantenere gli errori mostrati? MainWindowInputComment Comment Commento Add a comment for this QSO. Aggiungi un commento per questo QSO. Keep this data Tieni questi dati Data entered in this tab will be copied into the next QSO. Tutti i dati di questa maschera saranno precaricati di default durante l'inserimento del prossimo QSO. MainWindowInputEQSL Date of the ClubLog upload. Data del trasferimento su Clublog. Date of the QRZ.com upload. Data di scarico del trasferimento su QRZ.com. Date of the eQSL sending. Data di spedizione della eQSL. Date of the eQSL reception. Data di ricezione della eQSL. Date of the LoTW sending. Data dell'invio a LoTW. Date of the LoTW reception. Data della ricezione da LoTW. Status on QRZ.com. Stato su QRZ.com. Status of the LoTW sending. Stato dell'invio a LoTW. Status of the LoTW reception. Stato della ricezione da LoTW. QRZ.com QRZ.com LoTW Sent Invio a LoTW LoTW Rec Registrazione LoTW Status on ClubLog. Stato di ClubLog. Status of the eQSL sending. Stato della spedizione eQSL. Status of the eQSL reception. Stato della ricezione eQSL. ClubLog ClubLog eQSL Sent Invio eQSL eQSL Rec Registrazione eQSL MainWindowInputOthers Primary Div Primary Div Secondary Div Secondary Div IOTA IOTA Entity Elemento Propagation mode Modalità di propagazione Others Altri Keep propagation mode Mantieni la modalità propagazione Select the primary division for this QSO. Scegli la primary division di questo QSO. Select the secondary division for this QSO. Scegli la secondary division di questo QSO. Select the entity for this QSO. Scegli l'elemento di questo QSO. Select the propagation mode for this QSO. Scegli la modalità di propagazione di questo QSO. Select the IOTA continent for this QSO. Scegli il continente IOTA di questo QSO. Select the IOTA reference number for this QSO. Scegli il numero ri riferimento IOTA di questo QSO. Keeps the same propagation mode for next QSO. Mantiene la stessa modalità propagazione nel prossimo QSO. Select the appropriate ADIF field for this QSO. Scegli il corretto campo ADIF per questo QSO. Value for the selected ADIF field. Valore del campo ADIF scelto. Not Identified Non identificato Not - Not Identified No - Non identificato SOTA Ref SOTA Ref Age Età VUCC grids Statistiche VUCC Distance Distanza MainWindowInputQSL QSL Sent Invio QSL QSL Rec Registrazione QSL QSL Via QSL Via QSL Msg Messaggio QSL Status of the QSL sending. Stato invio QSL. Status of the QSL reception. Stato ricezione QSL. QSL sending information. Informazioni spedizione QSL. QSL reception information. Informazioni ricezione QSL. Date of the QSL sending. Data spedizione QSL. Date of the QSL reception. Data ricezione QSL. Message of the QSL. Messaggio QSL. QSL via information. Informazioni su Via QSL (modalità invio QSL). MainWindowInputQSO TX RST. TX RST. RX RST. RX RST. TX Frequency in MHz. Frequenza TX in MHz. RX Frequency in MHz. Frequenza RX in MHz. Power used by the contacted station. Potenza usata dalla stazione contattata. Name of the contacted operator. Nome operatore della stazione contattata. QTH of the contacted station. QTH della stazione contattata. Locator of the contacted station. Locatori della stazione contattata. Watts Watts MHz MHz Split Translator: Split is a common hamradio term. Do not translate unless you are sure. Split Name Nome QTH QTH DX Locator DX Locator Power(rx) Potenza(rx) RST TX RX Frequency RST(tx) RST(tx) RST(rx) RST(rx) Freq TX Frequenza TX Freq RX Frequenza RX DX QTH locator. DX QTH locator. DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. DX QTH locator. Il formato dovtrebbe seguire la regola come IN70AA fino a 10 caratteri. TX Frequency in MHz. Frequency is not in a hamradio band! Frequenza TX in MHz. Questa frequenza non appartiene a bande radioamatoriali! RX Frequency in MHz. Frequency is not in a hamradio band! Frequenza RX in MHz. Questa frequenza non appartiene a bande radioamatoriali! MainWindowMyDataTab Watts Watts Keep this data Mantieni questa data My QTH locator. Mio Locator QTH. Power Potenza Operator callsign Operatore di stazione Station Callsign Nominativo di stazione My Locator Il mio Locator My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. Il formato del QTH locator dovrebbe essere conformato (esempio IN70AA) fino ad un massimo di 10 caratteri. My Rig My Rig My Antenna La mia antenna My SOTA_Ref Il mio SOTA_Ref My VUCC_GRIDS I miei grafici VUCC MainWindowSatTab Keep this data Mantieni questi dati Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Il nome del satellite non è nella lista. Scegli: "%1" per abilitare questa opzione (formato usato AO-51). Satellite mode used. In uso modalità satellite. Select the satellite you are using. Scegli il satellite che stai utilizzando. UpLink band. Banda di uplink (uscita). DownLink band. Banda di downlink (ingresso). Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. Locatore della stazione DX. Questo campo è sempre tenuto sincronizzato con il campo Locatore della maschera di inserimento del QSO. UpLink Uplink DownLink Downlink Satellite Satellite Mode Modalità DX Locator Locatore DX Other Altro MHz MHz Locator of the DX station. Format should be Maidenhead like IN70AA up to 10 characters. Locatore della stazione DX. Il formato dovrebbe essere conformato (esempio IN70AA) per usare fino a 10 caratteri. Not Sat QSO QSO non satellitare KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. Nome di satellite sconosciuto a KLog perché non in elenco. Se hai la necessità specifica di inserire un satellite conosciuto, selezionabile dalla lista, puoi contattare lo staff di sviluppo e chiedere che il nuovo satellite sia inserito. Please be aware that the satellite name will not be saved if it is not in the list, so that information may be lost! Per favore, tieni presente che il nome del satellite non sarà salvato se non in elenco, quindi questa informazione può andare persa! RX Frequency in MHz. Frequency is not in a hamradio band! Frequenza RX in MHz. Questa frequenza non appartiene a bande radioamatoriali! RX Frequency in MHz. Frequenza RX in MHz. TX Frequency in MHz. Frequency is not in a hamradio band! Frequenza TX in MHz. Questa frequenza non appartiene a bande radioamatoriali! TX Frequency in MHz. Frequenza TX in MHz. Other - Sat not in the list Altro - Satellite non in elenco Data entered in this tab will be copied into the next QSO. Tutti i dati caricati su questa maschera saranno precaricati nella maschera di inserimento del prossimo QSO. The satellite you have in your QSO is: Il satellite del tuo QSO è: MapWindowWidget Select QSOs in this band. Scegli i QSO di questa banda. Select QSOs in this mode. Scegli i QSO in questa modalità. Select QSOs in this propagation mode. Scegli i QSO in questa modalità di propagazione. Select QSOs using this Satellite. Scegli i QSO che utilzizano questo satellite. Only confirmed Solo conferma Select only confirmed QSOs. Scegli solo i QSO confermati. All bands Tute le bande Show nothing All modes Tutte le modalità All propagation modes Tutti i modi di propagazione All satellites Tutti i satelliti OnlineMessageWidget The server returned the following error: %1 Il server ha riportato il seguente errore: %1 Not identified Non identificato QObject New One, work it! Uno nuovo, lavoralo! Needed, work it! Necessario, lavoralo! Worked but not confirmed Processato ma non confermato Confirmed Confermato Not identified Non identificato Database Error Errore nel database KLog DB needs to be upgraded. Il DB KLog deve essere aggiornato. The process to upgrade is: - Using an old KLog version export your log to ADIF. - Remove your logbook.dat file from your KLog folder. - Install the new KLog version. - Import your ADIF file. KLog will finish when you click on OK. La sequenza di aggiornamento è: - Esporta il log su ADIF utilizzando una vecchia versione di KLog. - Rimuovi il file logbook.dat dalla tua cartella dati KLog. - Installa la nuova versione KLog. - Importa il file ADIF appena esportato. KLog terminerà appena cliccherai su OK. KLog - DB update KLOg - Aggiornamento DB KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. KLog ha trovato che il DB contiene già un log. Tutto quanto contenuto sarà automaticamente migrato sul tuo nuovo log tipo DX. KLog: Enter Station callsign KLog: Inserisci nominativo di stazione Enter the station callsign used in this log Inserisci il nominativo di stazione usato in questo log Station Callsign Nominativo di stazione QSO: QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? Annullare questo aggiornamento può causare inconsistenza dei dati e possibile perdita di dati. Ancora convinto/a a procedere con l'annullamento? Progress: Progresso: Updating mode information... Aggiornamento dati modalità... Do you want to upgrade it now? Vuoi effettuare l'aggiornamento adesso? If DB is not upgraded KLog may not work properly. Se il DB non è aggiornato KLog potrebbe non operare correttamente. Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea. Aggiornare il software può causare problemi. Fare un backup del tuo DB, prima di procedere con l'aggiornamento, è sempre una buona idea. Do you want to backup your DB now? Vuoi fare il backup del tuo DB, adesso? The backup finished successfully. Il backup è terminato correttamente. You can find the backup in this file: %1 Il tuo backup si trova nel file: %1 The backup was not properly done. Il backup NON è stato completato con successo. You will be sent back to the starting point. Sarai riportato al punto di partenza. KLog - DB can't be updated automatically KLog - Il DB non può essere aggiornato automaticamente You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version. Ho trovato una versione KLog troppo vecchia, quindi l'aggiornamento alla nuova versione non può avvenire in modo automatico. All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay. Dati migrati correttamente. Adesso devi solo verificare che sia tutto ok nella maschera Configurazione -> Preferenze -> Log. Abort updating Annulla aggiornamento Updating bands information... Aggiornamento dati bande... Updating bands information in %1 status... Aggiornamento dati bande in %1 stato... Updating mode information in %1 status... Aggiornamento dati modalità in %1 stato... Updating DXCC award information... Trasmissione informazioni DXCC award... Updating DXCC Award information... Trasmissione informazioni DXCC award... Updating WAZ award information... Trasmissione informazioni WAZ award... Updating WAZ Award information... Trasmissione informazioni WAZ award... KLog is already running. Klog è già in esecuzione. It is allowed to run only one instance. Puo essere seguito solo una volta sulla macchina. Install wizard was canceled before completing... L'installazione guidata è stata cancellata prima del completamento dell'operazione... Do you want to remove the KLog dir from your disk? Vuoi rimuovere la cartella KLog dal tuo disco? Your KLog dir has been removed La tua cartella KLog è stata eliminata I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. Impossibile eliminare la tua cartella KLog. Dovrai eliminarla manualmente dal tuo hard disk. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. Impossibile eliminare la tua cartella KLog. Dovrai eliminarla manualmente dal tuo hard disk. Remember that your KLog dir is on your system... Ricorda che la cartella KLog è sul tuo sistema... Thank you for running KLog! Grazie per aver usato KLog! Updating information... Aggiornamento dati... Updating DXCC and Continent information... Aggiornamento dati DXCC e Continenti... A wrong callsign has been found: %1. Please enter a new callsign or confirm that the current one is a good callsign. Trovato nominativo di stazione errato: %1. Per favore scegli un nuovo nominativo o forza la correttezza del corrente. An empty callsign has been detected. If it is possible, please enter the right call. Nominativo di stazione vuoto trovato. Se possibile, per favore inserisci il giusto nominativo. KLog - Not valid callsign found KLog - Nominativo di stazione trovato non valido Date Data Call Nominativo RSTtx RSTtx RSTrx RSTrx Band Banda Comment Commento Mode Modo CQz CQz ITUz ITUz DXCC DXCC Address Indirizzo Age Età County Country A_Index A_Index Ant_Az Ant_AZ Ant_El Ant_El Ant_Path Anth_Percorso ARRL_SECT ARRL_SECT Award_Submitted Award Inviato Award_granted Award_concesso Band_RX Banda_RX CheckContest CheckContest Class Class ClubLog SDate ClubLog SDate ClubLog status ClubLog stato Continent Continente Contacted Op Op Contattato Contest Id Id Contest Country Country Credit Submitted Credito Inviato Credit granted Credito concesso Dark Dok Do not translate if unsure, common hamradio term. Dark-Dok Fists Do not translate if unsure, common hamradio term. Fists Fists CC Do not translate if unsure, common hamradio term. Fists CC My Fists Do not translate if unsure, common hamradio term. My Fists Nr bursts Do not translate if unsure, common hamradio term. Nr bursts Nr pings Do not translate if unsure, common hamradio term. Nr pings Sat mode Modo Sat SWL Do not translate if unsure, common hamradio term. SWL Ten-Ten Do not translate, it is a hamradio group name. Ten-Ten Distance Distanza Contacted_Op Email Email EQ_Call EQ_Nominativo eQSL RDate eQSL RDate eQSL SDate eQSL SDate eQSL Rcvd eQSL Rcvd eQSL Sent eQSL Sent Force Init Forza Init Freq Frequenza Freq RX Frequenza RX Gridsquare Statisticaa Guest OP Operatore ospite HRDLog SDate HRDLog SDate HRDLog status HRDLog stato IOTA IOTA IOTA Island id IOTA Id isola K Index Indice K Lat lat Lon Long LoTW RDate LoTW RDate LoTW SDate LoTW SDate LoTW Rcvd LoTW Rcvd LoTW Sent LoTW Sent Max Bursts Burst Max MS Shower MS Shower My Antenna Mia antenna My City Mia città My Cnty Mio country My Country Mio Country My CQz Mio CQx My DXCC Mio DXCC My Gridsquare Mie statistiche My IOTA Mio IOTA My IOTA island id Mio id isola IOTA My ITUz Mio ITUz My Lat Mia Lat My Lon Mia Long My Name Mio nome My Postal code Mio codice postale My Rig Mio Rig My Sig Mio Sig My Sig Info Mie info Sig My SOTA ref Mie ref SOTA My State Mio stato My Street Mia Via My USACA counties Miei counties USACA My VUCC grids Mia statistica VUCC Name Nome Notes Note Operator Operatore Owner Callsign Nominativo proprietario Pfx Pfx Points Punti Precedence Priorità Prop Mode Prop Mode Public Key Chiave pubblica QRZcom SDate QRZcom SDate QRZcom status QRZcom stato QSL msg QSL msg QSL RDate QSL RDate QSL SDate QSL SDate QSL Rcvd QSL Rcvd QSL Sent QSL Sent QSL rcvd via QSL rcvd via QSL sent via QSL sent via QSL via QSL via QSO complete QSO completo QSO random QSO random QTH QTH Region Regione Rig Rig RX Pwr RX Pwr Sat name Nome satellite SFI SFI Sig Sig Sig Info Sig Info Silent key Do not translate if unsure, common hamradio term. Silent key SKCC SKCC SOTA Ref SOTA Ref SRX String SRX String SRX SRX STX String STX String State Stato Submode Sub-modo UKSMG UKSMG USACA counties USACA counties VE prov VE prov VUCC grids VUCC statistiche TX Pwr TX Pwr Web Web QSO Date off QSO Date spenta Log number Log number SearchWidget &Clear &Pulisci &Select All &Seleziona Tutto &Search &Cerca &Export Highlighted &Esporta elementi evidenziati All logs Tutti i log Clear the searches. Pulisce le ricerche. Export the search result to an ADIF file. Esporta i risultati della ricerca su un file ADIF. Select/Unselect all the QSOs shown. Seleziona/deleseziona tutti i QSO mostrati. Search in the log. Cerca nel log. Search in all logs. Cerca in tutti i log. Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs! Scegli il nominativo da cercare per Enter '*' per mostrare tutti i QSO.. potrebbe essere lento sui log molto luunghi! Select the Station Callsign used to do this QSO. Scegli il nominativo di stazione usato in questo QSO. All in log Tutto il log Not defined Non definito &Clear selection &Pulisce selezione Save File Salva File You have requested to delete the QSO with: %1 Hai chiesto di cancellare il QSO con: %1 Are you sure? Sei sicuro? SearchWindow Date/Time Data/Ora Band Banda Mode Modo QSL Sent QSL Trasmessa QSL Rcvd QSL Ricevuta Station Callsign Nominativo di stazione ID ID Call Nominativo Date/time Data/ora Station callsign Nominativo di stazione QSL Send Trasmette QSL &Delete &Cancella Delete a QSO Cancella un QSO &Edit QSO &Modifica QSO Edit this QSO Modifica questo QSO Via &bureau Via &bureau Send this QSL via bureau Trasmetti la QSL via bureau D&irect D&irect Send this QSL via direct Trasmetti la QSL via direct Via bureau Via bureau QSL &received via bureau QSL &ricevuta via bureau Direct Direct QSL received via direc&t QSL ricevuta via direc&t Check in QRZ.com Controlla su QRZ.com Check this callsign in QRZ.com Controlla questo nominativo su QRZ.com Check in DXHeat.com Controlla su DXHeat.com Check this callsign in DXHeat.com Controlla questo nominativo su DXHeat.com &Request my QSL &Richiedi la mia QSL Mark my QSL as requested Segna la mia QSL come richiesta Via Direct and mark DX QSL as requested Via Diretto e indica la QSL del DX come richiesta Send this QSL via direct and mark DX QSL as requested Spedisce questa QSL via diretto e indica la QSL del DX come richiesta Via Bureau and mark DX QSL as requested Via Bureau e segna la QSL del DX come richiesta Send this QSL via bureau and mark DX QSL as requested Spedisce questa QSL via bureau e segna la QSL del DX come richiesta &Request the QSL &Richiedi la QSL Mark the QSL as requested Segna la QSL come richiesta Via bureau and mark my QSL as requested Via bureau e segna la mia QSL come richiesta QSL received via bureau and mark my QSL as requested QSL ricevuta via bureau e segna lamia SQL come richiesta Direc&t and mark as my QSL requested Dire&tto e segna come mia QSL richiesta QSL received via direct and mark my QSL as requested QSL ricevuta via diretto e segna la mia QSL come richiesta Needed QSO to send the QSL QSO che richiedono l'invio della QSL My QSL requested to be sent La mia richiesta di QSL da inviare DX QSL pending to be received QSL di DX in attesa di ricezione SetupDialog Bands/Modes Bande/modi DX-Cluster DX-CLuster Colors Colori Misc Altro World Editor Editor mondiale Logs Log Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Vai nella linguetta Altro e clicca su Muove DB oppure il DB non sarà spostato nel nuovo percorso. Cancel Annulla Satellites Satelliti HamLib HamLib eLog eLog OK OK User data Dati utente Log widget Log widget D&X-Cluster D&X-Cluster WSJT-X WSJT-X Settings Impostazioni You need to enter at least one log in the Logs tab. Nella configurazione log deve essere caricato almeno un log. Do you want to add one log in the Logs tab or exit KLog? (Click Yes to add a log or No to exit KLog) Vuoi aggiungere un log nella maschera configrazione Log o vuoi terminare KLog? (Clicca Sì per aggiungere un log oppure No per uscire da KLog) World Mondo DB has not been moved to new path. Il DB non è stato spostato nel nuovo percorso. You need to enter at least a valid callsign. Devi inserire almeno un nominativo valido. Go to the User tab and enter valid callsign. Vai alla tab Utente e inserisci il nominatio valido. You will be redirected to the Log tab. Please add and select the kind of log you want to use. Adesso ti porto nella maschera di configurazione dei log. Per favore aggiungi /seleziona il tipo di log che ti serve. You have not selected the kind of log you want. Non hai selezionato il tipo di log che ti interessa. SetupEntityDialog Entity Collegamento CQ CQ ITU ITU Latitude latitudine Longitude Longitudine UTC UTC Main prefix Prefisso principale ARRL ID ARRL ID Comma separated possible prefixes, e.g. EA1, EA2, ... I prefissi sono separati da virgole, es. EA1,EA2, ... Prefixes Prefissi Name of the Entity. Nome del collegamento. CQ zone. Zona CQ. ITU zone. Zona ITU. Longitude of the Entity. Longitudine del collegamento. Local time difference to UTC. Differenza tra ora locale e UTC. Main prefix of the entity. Prefisso principale del collegamento. ARRL ID. ARRL ID. Date of the deletion. Data della cancellazione. Deleted Cancellato Cancel Annulla Ok Ok Entity Dialog Maschera inserimento collegamento SetupPageBandMode Bands Bande Modes Modi SetupPageColors New One Uno nuovo Needed in this band Necessario in questa banda Worked in this band Processato per questa banda Confirmed in this band Comfermato in questa banda Default Default WSJT-X palette WSJT-X palette colori Default palette Default palette colori Dark Mode Visualizzazione notturna Color when the DXCC is an ATNO (All Time New One). Colore usato quando il DXCC è un ATNO (Sempre nuovo). DXCC is confirmed in this band. DXCC confermato in questa banda. Default color. Colore di default. Sets a palette of colors similar to the one used in WSJT-X. Seleziona una palette di colori simile a quella usata in WSJT-X. Sets the default palette. Seleziona la palette di default. Light Mode Visualizzazione diurna This DXCC was worked before in another band but not in the selected band. It may be needed due to the CQ, ITU, Grid, ... Questo DXCC è stato processato prima in un'altra banda, ma non nella banda richiesta. Magari a causa del CQ, ITU, Grid, ... Worked DXCC, but not confirmed in this band. DXCC processato, ma non confermato per questa banda. Sets the Dark Mode Attiva la visualizzazione notturna Choose a color Scegli un colore SetupPageDxCluster Add Aggiunge Delete Cancella Show &HF spots Elenca spots &HF Show V/&UHF spots Elenca spots V/&UHF Show W&ARC spots Elenca spots W&ARC Show &worked spots Elenca spots &processati Show &confirmed spots Elenca spot &confermati Show ANN/&FULL messages Elenca messaggi ANN/&PIENO Show WW&V messages Elenca messaggi WW&V Show WC&Y messages Elenca messaggi WC&Y Save DX Cluster activity Salva le attività del DX Cluster Saves all the DX-Cluster activity to a file in the KLog folder Salva tutte le attività del DX Cluster su un file nella cartella KLog Send DX Spots to the map Sends the received DX Spots to the map to know where is the activity. DX Spots DX Spots Others Altri Messages Messaggi KLog: Add a DXCluster server KLog: Aggiungi un server DXCluster Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Aggiungi un indirizzo seguito da una :porta Esempio: dxfun.com:8000 Se nessuna porta è esplicitamente indicata, la 41112 sarà usata di default: SetupPageELog ClubLog password Password ClubLog ClubLog App password ClubLog email Email ClubLog Enter the email you used to register in ClubLog. Inserisci l'email scelta durante la registrazione a ClubLog. Enter your password ClubLog here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Inserisci qua la tua password ClubLog. Attenzione: La password sarà salvata in chiaro all'interno del file di configurazione di KLog!! (Se non vuoi inserire la password, Kalog te la chiederà ogni volta quando necesaria.) Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!! Send QSOs in real time Trasferisci QSO in tempo reale Activate ClubLog Attiva ClubLog Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Trasferisci ogni QSO a ClubLog in tempo reale, appena aggiunti (o modificati) su KLog. Starts the ClubLog support in KLog. Avvia il supporto ClubLog su KLog. Activate eQSL.cc Attiva eQSL.cc Enter your username of eQSL.cc. Inserisci il tuo nome utente di eQSL.cc. Enter your password eQSL.cc here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Inserisci qua la password per eQSL.cc, Attenzione: la password sarà salvata in chiaro ill'interno del file di configurazione di KLog!! (Se non vuoi tenere qua la password, Klog te la chiderà ogno volta che sarà necessaria) eQSL.cc password Password eQSL.cc eQSL.cc user Nome utente eQSL.cc ClubLog ClubLog eQSL.cc eQSL.CC QRZ.com QRZ.com Enter the user of your QRZ.com account. You need to be subscribed to QRZ.com to use this service. Inserisci l'utente del tuo aaccount qrz.COM. Devi essere registrato aa QRZ.com per usare questo servizio. User Utente Enter your password QRZ.com here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Inserisci qua la tua password QRZ.com. Warning: La password sarà salvata in chiaro all'interno del file di configurazione di KLog!! (Se non vuoi inserirla qua Klog te la chiederà ogno colta che sarà necessaria.) Password Password Activate QRZ.com Attiva QRZ.com Check automatically Controllo automatico Check in Qrz.com all Calls as they are entered Verifica su QRZ.com tutti i nominativi ma mano che sono inseriti Paying Subscriber Pagamento Sottoscrizione Check it if you are paying for a qrz.com subscription Controlla di stare pagando per la sottoscrizione a QRZ.com LogBook Key Key LogBook LogBook Key for QSO uploading. You can get this key in your QRZ.com logbook webpage. Remember that you need a QRZ.com subscription to use this feature. Key LogBook per il trasferimento di QSO. Ottieni questa key nella tua pagina web su QRZ.com. Ricorda che occorre che tu sia utente registrato su QRZ.com per pyoter usare questa funzionalità. LoTW LoTW Upload upload Download Dowload TQSL path path TQSL Use TQSL Usa TQSL LoTW password password LoTW LoTW user user LoTW Enter your LoTW user. Inserisci il tuo utente LoTW. Enter your password LoTW here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Inserisci qua la tua password per LoTW. Attenzione: La password sarà salvata in charo nel file di configurazione di KLog. Se non vuoi lasciarla esposta puoi evitare di inserirla e KLog te la chiederà ogni volta quando necessario, senza memorizzarla Path to the TQSL software. Path del software TQSL. Enable the LoTW integration with TQSL. You will need to have TQSL installed Abilita l'integrazione fra LoTW e TQSL. E' necessario aver installato TQSL Select File Seleziona file SetupPageHamLib Activate HamLib Attiva Hamlib Activates the hamlib support that will enable the connection to a radio. Attiva il supporto hamlib che permette la conenssioen diretta alla radio. Read-Only mode Modo in sola lettura If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio. Se abilitato, KLog leggerà frequenza e modalità dalla radio ma senza trasmettere comando alla radio. Radio Radio Select your rig. seleziona il tuo rig. Serial Seriale Network Rete Defines the interval to poll the radio in msecs. Imposta l'intervallo di poll della radio in msecondi. Poll interval Intervallo di poll Test: OK Test: OK Test: NOK Test: NON OK Test Test Click to test the connection to the radio Premi per verificare la connessione alla radio SetupPageLogView Fields Campi SetupPageLogs &New &Nuovo &Edit &Modifica &Remove &Elimina KLog KLog All the QSOs from this log will also be deleted... Tutti i QSO di questo log saranno cancellati... Log has not been removed. (#3) Impossibile cancellare l'intero log. (#3) Do you really want to remove this log? Davvero vuoi eliminare questo log? Add a new log. Crea nuovo log. Edit the selected log. Modifica il log selezionato. Remove the selected log. Calcella il log selezionato. Log has not been removed. (#2) Impossibile cancellare l'intero log. (#2) Log has not been removed. (#1) Impossibile cancellare l'intero log. (#1) ID ID Date Data Station Callsign Nominativo di stazione Operators Operatori Comments Commenti QSOs QSO The new log could not be created. Il nuovo log potrebbe non essere creato. An error has occurred showing the following error code: Si è verificato un errore con il codice: KLog - SetupPageLogs KLog - Maschera configurazione Log SetupPageLogsNew &Date &Data &Station Callsign &Nominativo di stazione &Operators &Operatori Comm&ent Comm&enta &Ok &Ok &Cancel &Annulla Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. Inserisci una breve descrizione per questo log. Se lo inserisci, sarà mostrato sul titolo principale di KLog per distinguerlo. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. E' necessario che tu inserisca un valido nominativo nel box Nominativo di stazione. Il log non sarà aperto. Callsign used for this log. Nominativo usato per questo log. Comma separated list of operators: callsign1, callsign2. Elenco operatori separati da virgola: operatore, operatore2. Start date of this log. Data di inizio di questo log. SetupPageMisc &Imperial system Sistema &Imperiale &Log in real time &Log in tempo reale &Time in UTC &Ora in UTC &Save ADIF on exit &Salva ADIF all'uscita Use this &default filename Usa di &default questo nome file Mark &QSO to send QSL when QSL is received Segna il &QSO per inviare QSL quando una QSL è ricevuta Complete QSO with previous data Completa i dati del QSO con dati precedenti Show the Station &Callsign used in the search box Mostra il &nominativo di stazione inserito nella maschera di ricerca Mark sent eQSL && LoTW in new QSO as queued Mette in coda nei nuovi QSO per la spedizione eQSL && LoTW &Check for new versions automatically &Controlla automaticamente nuove versioni Check if there is a new release of KLog available every time you start KLog. Controlla se è diosponibile una nuova versione di KLog ogni volta che KLog si avvia. &Provide Info for statistics &Fornisci informazioni per statistiche Move DB Sposta DB The search box will also show the callsign on the air to do the QSO. La maschera di ricerca mostrerà anche il nominativo usato in trasmissione durante il QSO. If new version checking is selected, KLog will send the developer your callsign, KLog version and Operating system to help in improving KLog. Se la spunta sul checkbox di controllo di nuove versione è attiva, KLog trasmetterà algi sviluppatori il tuo nominativo la vesione di KLog, e dil sisstema operativo per aiutare lo sviluppo di nuove versioni di KLog. Select to use real time. Seleziona per il funzionamento in tempo reale. Select to use UTC time. Seleziona per usare l'ora UTC. Select if you want to save to ADIF on exit. Seleziona se vuoi salvare su file ADIF ad ogni uscita. Complete the current QSO with previous QSO data. Completa il QSO corrente ripescando i dati dal precedente QSO. Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default. Clicca se vuoi che di default ad ogni nuovo QSO le eQSL (LoTW e eQSL) siano automaticamente messe in coda per la spedizione. This is the directory where DB (logbook.dat) will be saved. Cartella di salvataggio del DB (logbook.dat). Click to change the default ADIF file. Clicca per cambiare il file ADIF di default. Show seconds Show seconds in the QSO editor Click to move the DB to the new directory. Clicca per spostare il DB su una nuova cartella. Select the application debug log level. This may be useful if something is not working as expected. A debug file will be created in the KLog directory and/or shown with Help->Debug menu. Log level Select Directory Scegli la cartella KLog - Move DB KLog - Sposta DB File moved File spostato File copied File copiato File already exist. Il file esiste già. The destination file already exist and KLog will not replace it. Please remove the file from the destination folder before moving the file with KLog to make sure KLog can copy the file. Il file di destinazione già esiste e KLog non lo sovrascriverà. Per favore rimuovi il file dalal cartella di destinazione prima di tentare di spostare il file con KLog se vuoi essere sicuro che la procedura abbia successo. File NOT copied File NON copiato The file was not copied due to an unknown problem. Impossibile coopiare il file per problemi sconosciuti. The target directory does not exist. Please select an existing directory. La cartella di destinazione non esiste. Per favore scegli una cartella esistente. Browse Sfoglia Check non-valid calls Controllo nominativi non validi Manage DX-Marathon Gestisci DX Marathon Activate the application debug log Attiva il log debug dell'applicazione &Delete always temp ADIF file after uploading QSOs &Cancella sempre il file temporaneo ADIF dopo il trasferimento dei QSO In seconds, enter the time range to consider a duplicate if same call, band and mode is entered. In secondi, scegli il tempo limite per considerare una chiamata come duplicata, se anche banda e modo sono presenti. If you disable this checkbox KLog will not check callsigns to identify wrong callsigns. Se disattivi la spunta di questa opzione KLog non controllerà i nomiantivi sbagliati. QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. QSO marcato come in attesa di spedizione QSL se hai già ricevuto la QSL del DX ma non ne hai ancora inviata una. Check it for Imperial system (Miles instead of Kilometers). Seleziona per attivare il sistema di misure Imperiale (Miglia invece di Kilometri). Select to use the following name for the logfile without being asked for it again. Scegli il nome del file di log (non ti verrà più chiesto). Select if you want to manage DX-Marathon. Seleziona se vuoi gestire la DX Marathon. This is the default file where ADIF data will be saved. File ADIF di default di salvataggio dei dati. This is the directory where the database (logbook.dat) will be saved. Cartella di salvataggio del database (logbook.dat). Click to change the path of the database. Clicca per cambiare il percorso del database. Activates the application debug log. This may be useful if something is not working as expected. A debug file will be created in the KLog directory. Attiva il log di debug dell'applicazione. Questo purò rivelarsi utile se qualcosa dovesse non andare come previsto. Il file di debug è creato nella cartella dati di KLog. Delete Always the adif file created after uploading QSOs Cancella sempre il file ADIF creato dopo in trasferimento dei QSO Dupe time range: Tempo limite duplicato: Open File Apre File Please specify an existing directory where the database (logbook.dat) will be saved. Per favore indica una cartella valida per il salvataggio del database (logbook.dat). SetupPageSats &New &Nuovo &Edit &Modifica &Remove &Elimina &Import &Importa E&xport E&sporta Add a new satellite. Aggiunge un nuovo satellite. Edit the selected satellite. Modifica il satellite selezionato. Remove the selected satellite. Elimina il satellite selezionato. Export your current satellites to a file. Esporta i tuoi satelliti attuali su file. Select the sat you want to open. Seleziona il sat da aprire. KLog KLog Do you really want to remove this satellite? Davvero vuoi eliminare questo satellite? Import a satellites file. It will replace the satellites you have in the current list. Imposta file di satelliti. Questi sostituiranno i satelliti del tuo elenco corrente. This satellite will no be longer available to be selected ... Questo satellite non apparirà più nell'elenco dei satelliti selezionabili... Sat has not been removed. (#3) Sat non è stato rimosso. (#3) Sat has not been removed. (#2) Sat non è stato rimosso. (#2) Sat has not been removed. (#1) Sat non è stato rimosso. (#1) ID ID Short Breve Name Nome Uplink Uplink (uscita) Downlink Downlink (ingresso) Modes Modalità An error has occurred showing the following error code: Si è verificato un errore con il codice: KLog - SetupPageSats KLog - SetupPageSats Open Satellites File Apre file satelliti KLog warning KLog warning An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Impossibile importare i dati satellite a causa di un errore inaspettato. Il file che stai cercando di importare potrebbe non essere nel corretto formato. Please check the format or contact the developer for analysis with the error code: Per favore controlla il formato o contatta gli sviluppatori per analisi con il seguente codice di errore: Save Satellites File Salva file satelliti SetupPageSatsNew Short name Nome breve Sat name Nome satellite UpLink Uplink DownLink Downlink Modes Modi &Ok &Ok &Cancel &Annulla Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Inserisci il nome breve. Prova ad usare il nome breve LoTW in modo da trasferire i tuoi QSO a afterwards LoTW. Enter the name of the satellite. Inserici il nome del satellite. Enter the uplink frequencies in this format: 144.300 Inserisci la frequenza di uplink nel formato: 144.300 Enter the downlink frequencies in this format: 144.300 Inserisci la frequenza di downlink nel formato: 144.300 Enter the modes in this format: USB Inserisci i modi in questo formato: USB Some of the data you have entered is not correct; the satellite can't be added. Il satellite non può essere aggiunto perché qualche dato inserito non è corretto. SetupPageSubdivisionNew &Date &Data &Station Callsign &Nominativo di stazione &Operators &Operatori Comm&ent Comm&ento &Ok &Ok &Cancel &Annulla Callsign used for this log. Nominativo usato per questo log. Comma separated list of operators: callsign1, callsign2. Elenco operatori separati da virgola: operatore1, operatore2. Start date of this log. Data di inizio di questo log. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. Inserisci una breve descrizione per questo log. Se lo inserisci, sarà mostrato sul titolo principale di KLog per maggior chiarezza. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. E' necessario che tu inserisca un nominativo valido nel box del nominativo di stazione. Il log non sarà aperto. SetupPageSubdivisions &Remove &Elimina Import new Importa nuovo Import an AWA file with the subdivision details. Importa file AWA con tutti i dettagli. Remove the selected references. Cancella i riferimenti selezionati. Select the references you want to open. Scegli i riferimenti che vuoi aprire. KLog KLog Do you really want to remove the data of this entity? Davvero vuoi cancellare la data di questo elemento? All the subdivision information for this entity will be deleted... Tutte le informazioni per questo elemento saranno cancellati... Log has not been removed. (#3) Log non cancellato. (#3) Log has not been removed. (#2) Log non cancellato. (#2) Log has not been removed. (#1) Log non cancellato. (#1) ID ID Name Nome Short Name Nome abbreviato CQ Zone Zona CQ ITU Zone Zona ITU Deleted Cancellato Start Date Data di inizio End Date Data di fine DXCC DXCC An error has occurred showing the following error code: Si è verificato un errore con il seguente codice: KLog - SetupPageSubdivisions KLog - SetuoPageSubdivisions SetupPageUDP Start UDP Server Avvia server UDP Automatically log QSOs from WSJT-X Automaticamente log i QSO da WSJT-X Allow WSJT-X to send logged QSOs to KLog Permette a WSJT-X di spedire i QSO logged a KLog QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected I QSO logged su WSJT-X saranno spediti a KLog e KLog chiederà conferma prima di logging into KLog a meno che "%1" sia selezionato KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. KLog automaticamente log ogni QSO in arrivo da WSJT-X senza ulteriori conferme manuali. Update status information from WSJT-X Aggiornamento informazione di stato da WSJT-X KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...) KLog automaticamente mosterò ed aggiornerà i dati provenienti da WSJT-X (DX, nominativo, report, modo, ...) UDP port number where the UDP Server will listen for packets. Numero di porta UDP dove il server ascolta per ricevere pacchetti. Make sure it is the same port that the other programs are sending the data to. Default port is 2237. Verifica bene che la porta usata sia esattamente quella usata da altri programmi per trasmettere i dati. La porta di default è la 2237. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. Il server UDP riceve QSO trasmessi da altri programmi come WSJT-X permettendoti di avere accesso da Klog ai dati di questi programmi. UDP Port Porta UDP Select the interface to listen for UDP datagrams coming from WSJT-X. Seleziona l'interfaccia per ascoltare UDP datagrammi provenienti da SWJT-X. Network interface Interfaccia di rete QSOs notification timeout (milisecs) Tempo di timeout di notifica QSO (millisecondi) Miliseconds that the notification of QSOs received from WSJTX will be shown. Millisecondi per la notifica di QSO ricevuti da WSJTX per essere mostrati. SetupPageUserDataPage &Personal data Dati &Personali Station &data &Data Stazione Enter your name. Inserisci il tuo nome. Enter your address - 1st line. Inserisci il tuo indirizzo - 1a linea. Enter your address - 2nd line. Inserisci il tuo indirizzo - 2a linea. Enter your address - 3rd line. Inserisci il tuo indirizzo - 3a linea. Enter your address - 4th line. Inserisci il tuo indirizzo - 4a linea. Enter your city. Inserisci la tua città. Enter your zip code. Inserisci il tuo codice postale. Enter your province or state. Inserisci la tua provincia o stato. Enter your country. Inserisci il tuo paese. &Name &Nome &Address &Indirizzo Cit&y Cit&tà &Zip Code &Cap Pro&v/State Pro&v/Stato Countr&y Countr&y Enter your information for rig Inserisci informazioni per l'impianto Enter your information for antenna Inserisci informazioni sulla tua antenna Enter your power information. Inserisci informazioni sulla tua potenza usata. Enter the station callsign that will be used for logging. Inserisci il nominativo di stazione che sarà usato per il log. Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Inserisci il locator della tua stazione. In alternativa, KLog è in grado di usare un locator approssimativo ricavato dal tuo nominativo. &Rig 1 &Impianto 1 R&ig 2 &Impianto 1 Ri&g 3 &Impianto 1 Antenna &1 Antenna &1 Antenna &2 Antenna &2 Antenna &3 Antenna &3 Po&wer Po&tenza Enter the operators (comma separated if more than one). Inserisci gli operatori (separati da virgola se più di uno). &Callsign &Nominativo &Operators &Operatori &CQ Zone Zona &CQ &ITU Zone Zona &ITU &Locator &Locator &Locator (not valid) &Locator (non valido) SetupPageWorldEditor Add Aggiunge Delete Cancella Edit Modifica Export World Esporta Mondo Import World IMporta mondo Still not implemented. Ancora non implementato. Import a new cty.csv file Importa un nuovo file cty.csv An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. Un file elenco (cty.csv) è stato trovato nella cartella dati di KLog e sarà caricato. No entities information file (cty.csv) has been detected in your KLog folder. Nessun file elenco (cty.csv) è stato trovato nella cartella dati di KLog. KLog will not be able to show entities information. KLog non sarà in grado di mostrare le informazioni di collegamento. Prefix Prefisso Entity Collegamento ARRL ID ARRL ID Continent Continente CQ Zone Zona CQ ITU Zone Zona ITU UTC UTC Latitude Latidudine Longitude Longitudine Deleted Eliminato Since Date Dalla data To Date Alla data Open File Apre File BigCTY (*.csv) BigCTY (*.csv) Entities information has been updated. Informazioni collegamento aggiornate. Entities information has not been updated. Informazioni collegamento non aggiornate. ShowAdifImportWidget The following QSOs are those QSOs that you have received the LoTW confirmation. I seguenti QSO sono tutti quelli ricevuti dalla conferma LoTW. Ok Ok DX DX Date/Time Data/Ora Band Banda Mode Modo ShowErrorDialog KLog Message Messaggio KLog SoftwareUpdateDialog Ok Ok KLog update Aggiornamento KLog <center><h2>KLog new version (%1) is available! </h2></center><br>There is a new version of KLog available.<br><br><b>You can get the new version from:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> <center><h2>KLog nuova versione (%1) è disponibile! </h2></center><br>E' disponibile una nuova versione di KLog.<br><br><b>Puoi scaricare la nuova versione da:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> Congratulations! congratulazioni! Your KLog has been updated. KLog è stato aggiornato. You already have the latest version. Stai già usando la versione più recente. StartWizard KLog - The free hamradio logging program KLog.- Un software libero per radioamatori Quit Setup Esce dalla configurazione Setup is not complete yet. Are you sure you want to quit setup? Configurazione non ancora completa. Sei sicuro di voler uscire dalla configurazione? StatisticsWidget QSO per year QSO all'anno DXCC per year DXCC all'anno CQ zones per year Zone CQ all'anno QSO per band QSO per banda QSO per mode QSO per modo QSO per DXCC QSO per DXCC QSO per Continent QSO per Continente QSO per hour QSO all'ora QSO per month QSO al mese Worked / Confirmed status Stato Processati / Confermati Worked / Sent status Stato Processati / Spediti Sent / Confirmed status Stato Spediti / Confermati Satellite grid status Stato DXCC satellite Stato griglia satellite Satellite DXCC status Satellite DXCC status Grids per band status Grids per stato banda DXCC per band status DXCC per stato banda StatsCQZPerYearBarChartWidget CQ Zones per year Zone CQ per anno Reading data ... Dati in lettura... Abort reading Cancellazione lettura CQ zones Zone CQ CQ zones per year Zone CQ Per anno Zone CQ per anno Reading data ... Lettura dati ... Years: %1/%2 Anni:%1/%2 StatsDXCCOnSatsWidget Show confirmed only Mostra solo i confermati Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Only LEO sats Number Numero Callsign Nominativo Date Data Band Banda Mode Modo DXCC DXCC Satellite Satellite Confirmed Confermato No No StatsEntitiesPerYearBarChartWidget Chart title Titolo della carta Reading data ... Lettura dati ... Abort reading Annulla lettura DXCC Entities Collegamenti DXCC DXCC Entities per year Collegamenti DXCC all'anno Reading data ... Lettura dati ... Entities: Collegamenti: StatsFieldPerBandWidget All Tutto Mode: Modo: Band Banda Worked Processato Confirmed Confermato StatsGridsOnSatsWidget Show confirmed only Mostra solo i confermati Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Only LEO sats Number Numero Callsign Nominativo Date Data Band Banda Mode Modo Grid Griglia Satellite Satellite Confirmed Confermato No No StatsQSOsPerBandBarChartWidget QSOs per band QSO per banda Reading data ... lettura dati ... Abort reading Annulla lettura Bands Bande QSOs per band distribution Distribuzione QSO per banda Reading data ... lettura dati ... Bands: Bande: StatsQSOsPerContinentBarChartWidget QSOs per continent QSO per continente Reading data ... Lettura dati ... Abort reading Annulla lettura Continents Continenti Reading data ... Lettura dati ... Hours: Ore: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC QSO per DXCC Reading data ... Lettura dati ... Abort reading Annulla lettura Reading data... lettura dati... DXCC DXCC Top ten DXCC per QSO Primi 10 DXCC per QSO StatsQSOsPerHourBarChartWidget QSOs per hour QSO per ora Reading data ... Lettura dati ... Abort reading Annulla lettura Hours Ore QSOs at hour QSO all'ora Reading data ... lettura dati ... Hours: Ore: StatsQSOsPerModeBarChartWidget QSOs per mode QSO per modo Reading data ... Lettura dati ... Abort reading Annulla lettura Modes Modi QSOs per mode distribution QSO per distribuzione modo Reading data ... lettura dati ... Modes: Modi: StatsQSOsPerMonthBarChartWidget QSOs per month QSO per mese Reading data ... Lettura dati ... Abort reading Annulla lettura Jan Gen Feb Feb Mar Mar Apr Apr May Mag Jun Giu Jul Lug Sep Set Oct Ott Nov Nov Dec Dic Aug Ago Months Mesi QSOs at Month QSO al mese Reading data ... Lettura dati ... Months: Mesi: StatsQSOsPerYearBarChartWidget Reading data ... Lettura dati ... Abort reading Annulla lettura QSOs QSO QSOs per year QSO per anno Reading data ... Lettura dati ... QSO: %1/%2 QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Spedito - %1 Confirmed - %2 Confermato - %2 Sent / Confirmed status Stato Trasferiti / Confermati StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Processato, non confermato - %1 Confirmed - %2 Confermato - %2 Worked / Confirmed status Stato Processati / Confermati StatsWorkedSentPieChartWidget Worked - %1 Processato - %1 Sent - %2 Spedito - %2 Worked / Sent status Stato Processati / Spediti TipsDialog KLog tips KLog suggerimenti Next Successivo Previous Precedente <b>Tip #1:</b><br>Do you know...<br>You can use <a href="#ToolsFillInQSO">Tools->Fill in QSO data</a> to automatically read the full log to fill the DXCC, CQ, ITU zones and continent? Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in QSO data <b>Tip #1:</b><br>Dovresti sapere che...<br>E' anche disponibile <a href="#ToolsFillInQSO">Strumenti->Completa dati QSO</a> che acquisce il log QSO completo di DXCC e lo usa per compilare automaticamente i dati della tua registrazione QSL Locale con informazioni DXCC, CQ, zone ITU e continenti? <b>Tip #3:</b><br>Do you know...<br>You can use <a href="#ToolsFindQSO2QSL">Tools->QSL tools...->Find QSO to QSL</a> to look for all those QSO that you should send your QSL because you still need to confirm that DXCC and you have still not send your QSL card? Translator: Please make sure that the name of the link is coherent with the menu Tools->QSL tools...->Find QSO to QSL <b>Tip #3:</b><br>Dovresti sapere che...<br>E' anche disponibile <a href="#ToolsFindQSO2QSL">Strumenti->Strumenti QSL...->Cerca QSO su QSL</a> per cercare tutti quei QSO per i quali dovresti spedire la QSL, non ancora spedita, perché stai ancora aspettando la conferma da DXCC? <b>Tip #2:</b><br>Do you know...<br>You can find the QSLs that you still need to send with <a href="#ToolsSendPendingQSL">Tools->QSL tools...->Find My-QSLs pending to send</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Requested</i>. Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in DXCC data <b>Tip #2:</b><br>Dovresti sapere che...<br>Puoi scoprire quali QSL hai ancora da spedire con <a href="#ToolsSendPendingQSL">Strumenti->Strumenti QSL...-> Trova le mie QSL In attesa di spedizione</a>.<bR>Questo strumento elencherà all'interno della maschera di ricerca tutte le QSL spedite segnate come <i>Richieste</i>. {2:?}. <b>Tip #4:</b><br>Do you know...<br>You can enter a '*' in the search box, in the search window to search for all the QSOs done with one specific station callsign? Translator: Please make sure that the name of the link is coherent with the menu File->Export Requested QSL to ADIF... <b>Tip #4:</b><br>Dovresti sapere che...<br>Puoi sempre inserire il wild char * nella maschera di ricerca, per trovare tutti i QSO fatti con uno specifico nominativo? <b>Tip #5:</b><br>Do you know...<br>You can find the file containing all your log and other information in the logbook.dat file and the klogrc file, containing the KLog config file in the KLog folder by opening the <a href="#FileOpenKLogFolder">File->KLog folder</a> menu? <b>Tip #5:</b><br>Dovresti sapere che...<br>Sono sempre disponibili tutti i tuoi log e altre informazioni nel file logbook.dat e nel file klogrc, nel file di configurazione di KLog config file nella cartella dati KLog aprendi direttamente il menù <a href="#FileOpenKLogFolder">File->Cartella KLog</a> ? <b>Tip #6:</b><br>Do you know...<br>You can upload your QSO marked as queued to LoTW via TQSL with <a href="#ToolsUploadLoTW">Tools->LoTW tools ...->Sends the log to LoTW calling TQSL.</a> ?<br><br>You have to configure TQSL in the preferences to be able to use this functionality. Translator: Please make sure that the name of the link is coherent with the menu File->KLog folder <b>Tip #6:</b><br>Dovresti sapere che...<br>E' possibile trasferire i tuoi QSO marcati e messi in coda per LoTW via TQSL con <a href="#ToolsUploadLoTW">Strumenti->Strumenti LoTW ...->Trasferisce il log delle chiamate a LoTW delle TQSL.</a> ?<br><br>E' necessario che TQSL nelle impostazioni per pytoer usare questa funzionalità. <b>Tip #7:</b><br>Do you know...<br>You can see the QSO that confirms one specific DXCC entity in one specific band by poiting your mouse over that band in the DXCC widget? Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find My-QSLs pending to send <b>Tip #7:</b><br>Dovresti sapere che...<br>Puoi sempre vedere i QSO che confermano uno specifico collegamento DXCC all'interno di una specifica banda puntando con il mouse sulla banda nel widget DXCC? <b>Tip #8:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceivePendingQSL">Tools->QSL tools...->Find DX-QSLs pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Sent</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find DX-QSLs pending to receive <b>Tip #8:</b><br>Dovresti sapere che...<br>Puoi scoprire di quali QSL sei ancora in attesa con <a href="#ToolsReceivePendingQSL">Strumenti->Strumenti QSL...->Trova DX QSL in attesa di ricezione</a>.<bR>Questo strumento ti elencherà nella maschera di ricerca tutti i QSO marcati come <i>Spediti</i> ma per i quali non hai ancora ricevuto la QSL di risposta. <b>Tip #9:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceiveRecPendingQSL">Tools->QSL tools...->Find requested pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Rec marked as <i>Requested</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find requested pending to receive <b>Tip #9:</b><br>Dovresti sapere che...<br>Puoi scoprire le QSL che stai ancora aspettando con <a href="#ToolsReceiveRecPendingQSL">Strumenti->Strumenti QSL...->Cerca QSL richieste in attesa di ricezione</a>.<bR>Questo strumento ti elencherà nella maschera di ricerca tutti i QSO con il campo registrazione QSL marcato come <i>Richiesto</i> ma per i quali non hai ancora ricevuto la QSL relativa al DX. <b>Tip #10:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/klogchat>English KLog Telegram group</a> to discuss about KLog in English? <b>Tip #10:</b><br>Dovresti sapere che...<br>Puoi sempre iscriverti al <a href=https://t.me/klogchat>Inglese Gruppo Telegram KLog</a> per parlare di KLog in Inglese? <b>Tip #11:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/KLogES>Spanish Telegram group</a> to discuss about KLog in Spanish? <b>Tip #11:</b><br>Dovresti sapere che...<br>Puoi sempre iscriverti al <a href=https://t.me/KLogES>Spagnolo Gruppo Telegram KLog</a> per parlare di KLog in Spagnolo? <b>Tip #12:</b><br>Do you know...<br>You can subscribe to <a href=https://groups.io/g/klog>KLog mailing list</a> to discuss via email about KLog in English? <b>Tip #12:</b><br>Dovresti sapere che...<br>Puoi sempre iscriverti a <a href=https://groups.io/g/klog>Mailing list utenti KLog</a> per parlare via email su KLog in Inglese? <b>Tip #13:</b><br>Do you know...<br>You can <a href=https://twitter.com/_ea4k>follow EA4K on twitter</a> to get updates about KLog? <b>Tip #13:</b><br>Dovresti sapere che...<br>Puoi sempre <a href=https://twitter.com/_ea4k>seguire EA4K su twitter</a> per ottenere aggiornamenti su KLog? <b>Tip #14:</b><br>Do you know...<br>You can write your own <a href=https://www.eham.net/reviews/detail/3118>review in eHam.net about KLog</a> to help other users to decide to use KLog? <b>Tip #14:</b><br>Dovresti sapere che...<br>Puoi scrivere una tua <a href=https://www.eham.net/reviews/detail/3118>recenzione su eHam.net per KLog</a> per convincere altri utenti a scegliere KLog? <b>Tip #15:</b><br>Do you know...<br>You can join the development team by simply <a href=https://www.klog.xyz/contact>Contacting us</a>? <b>Tip #15:</b><br>Dovresti sapere che...<br>Puoi sempre unirti allo staff di sviluppo semplicemente <a href=https://www.klog.xyz/contact>Contattandoci</a>? <b>Tip #16:</b><br>Do you know...<br>That there are many ways to contribute to KLog and some of them are listed in the <a href=https://www.klog.xyz/contrib>KLog Contribute</a> page? <b>Tip #16:</b><br>Dovresti sapere che...<br>Puoi contribuire alla crescita di KLog in monlti diversi modi, contenuti nella pagina <a href=https://www.klog.xyz/contrib>KLog Contributo</a> ? <b>Tip #17:</b><br>Do you know...<br>You can support translating KLog into your language? Please check <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a> page. <b>Tip #17:</b><br>Dovresti sapere che...<br>Puoi aiutare a tradurre KLOg nella tua lingua? Per favore controlla sulla pagina <a href=https://www.klog.xyz/contrib/translations>KLog Traduzioni</a> . <b>Tip #18:</b><br>Do you know...<br>You can double-click on an entity name in the DXCC table and all the QSOs with that DXCC Entity will be shown in the search box? <b>Tip #18:</b><br>Dovresti sapere che...<br>Puoi fare un doppio click sul nome di un collegamento nell'elenco DXCC e saranno mostrati tutti i QSO relativi a quel collegamento DXCC nella maschera di ricerca? <b>Tip #19:</b><br>Do you know...<br>You can right-click on a QSO and select <i>Check in QRZ.com</i> to check that callsign in QRZ.com? <b>Tip #19:</b><br>Dovresti sapere che...<br>Puoi sempre cloccare su un QSO e verificare su <i>Check in QRZ.com</i> l'esistenza del nominativo su QRZ.com? UpdateSatsData Reading Satellites data file... Lettura file dati satelliti... Abort reading Annulla lettura The Satellites information has been updated. Informazioni satelliti aggiornate. Open File Apre File Sat Data Dati satelliti UpdateSettings KLog - Settings update The settings system has been changed and KLog will update your settings file. World Entity Collegamento Continent continente Abort reading Annulla lettura Reading cty.csv... Lettura cty.cvs... eLogClubLog Host not found! Host non trovato! Timeout error! Errore di Timeout! KLog - ClubLog KLog - ClubLog This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO. Questo errore può essere cusato dalla presenza di QSO duplicati o,quando rimossi, per QSO macanti. Undefined error... Errore indefinito... Callsign missing Nominativo di chiamata assente Invalid callsign Nominativo di stazione non valido Skipping SWL callsign Salto nominativo SWL Callsign is your own call Callsign is you own call Invalid callsign with no DXCC mapping Nominativo di stazione non valido con nessuna localizzazione DXCC Updated QSO Trasferito QSO Invalid ADIF record Record ADIF non valido Missing ADIF record Record ADIF mancante Test mode - parameters ok, no action taken Modalità test parametri ok, nessuna azione intrapresa Undefined error number (#%1)... Numero di errore idnefinito (#%1)... We have received an undefined error from Clublog (%1) Ricevuto erorre idnefinito da ClubLog (%1) QSO dupe or not existing (#%1)... QSO duplicato o mancante (#%1)... It seems to be a CREDENTIALS ERROR; check your email and password. It seems that your ClubLog credentials are not correct. Please check your credentials in the setup. ClubLog uploads will be disabled. Please check your config in the setup and contact the KLog development team if you can't fix it. ClubLog uploads will be disabled. Per favore verifica nella tua configurazione e contatta il team di sviluppo di KLog se non riesci a farlo funzionare.Trasferimenti a ClubLog disabilitati. Excessive API Usage Eccessivo uso delle API Internal Error Errore Interno Rejected Rifiutato QSO Duplicate QSO Duplicato QSO Modified QSO Modificato Missing Login Login mancante QSO OK QSO OK Upload denied Trasferimento rifiutato No callsign selected Nessun nominativo selezionato No match found Nessuna corrispondenza trovata Dropped QSO QSO interrotto OK OK Login rejected Login rifiutato Rejected: Callsign is your own call Rifiutato: Nominativo is your own call eLogQrzLog Host not found! Host non trovato! Timeout error! Errore di Timeout! Undefined error number (#%1) Numero di errore undefinito (#%1) We have received the following error from QRZ.com (%1) Ricevuto il seguente errore da QRZ.com (%1) You are not subscribed to QRZ.com. Non sei iscritto a QRZ.com. Not valid KEY found Nessuna KEY valida trovata Please configure your QRZ.com API key. You will find it in your QRZ.com Logbook settings webpage. You need a QRZ.com subscription to use this feature. Per favore configura la chiave API del tuo QRZ.com. La trovi nella pagina web del tuo logbok su QRZ.com. E' necessaria la registrazione sul sito QRZ.com poter ptoer usare questa funzione. KLog - QRZ.com password needed KLog. - Password QRZ.com richiesta Please enter your QRZ.com password: Per fsavore isnerisci la tua password QRZ.com: KLog - QRZ.com KLog QRZ.com Callsign missing Nominativo di stazione assente eQSLUtilities Host not found! Host non trovato! Timeout error! Errore di Timeout! Undefined error number (#%1)... Numero errore idnefinito (#%1)... eQSL Error: User or password incorrect Errore eQSL: utente o password sbagliate eQSL Warning: At least one of the uplodaded QSOs is duplicated. Warning eQSSL: Almeno uno del QSO trasaferiti è duplicato. eQSL: All the QSOs were properly uploaded. eQSL: Tutti i QSO correttamente trasferiti. KLog - eQSL.cc password needed KLog - Password eQSL.cc richiesto Please enter your eQSL.cc password: Pler favore isnerirsci la tua password per wQSO.cc: KLog - eQSL KLog - eQSL eQSL has sent the following message: %1 eQSL ha mandato il seguente messaggio: %1 We have received an undefined error from eQSL (%1) Ricevuto erorre idnefinito da eQSL (%1) Please check your config in the setup and contact the KLog development team if you can't fix it. eQSL uploads will be disabled. Per favore controlla la tua configurazione e contatta il team di sviluppo di KLog se non riesci a rrisolvere i problema. Trasaferimento eQSL disabilitato. klog-2.3.3/translations/klog_da.ts0000644000015700001710000135476614542412415017054 0ustar jenkinsjenkins AboutDialog About KLog Om KLog By af KLog is a free logbook for hamradio operators. KLog er en fri logbog for operatører af amatørradio. Please be aware that this is a development release and it may contain many bugs.<br>Backup your data before using this software! Since 0.6.2, KLog has been fully rewritten to provide a cross-platform application that runs on all major operating systems (GNU/Linux, macOS and Windows) and to support new functionality. Please provide your review in KLog's eHam review page: Giv en anmeldelse i KLogs eHam-anmeldelsesside: Find more information and the latest release at Find yderligere information og den seneste udgivelse pÃ¥ Author Forfatter today i dag Main developer Hovedudvikler KLog is developed by a very small team and you are invited to join! KLog er udviklet af et meget lille hold og du er inviteret! If you want to provide support you are welcome to join the <a href="https://groups.io/g/klog">KLog mailing list</a>! Be aware that you can enable/disable this feature from the Misc tab in the Setup page. You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Du kan ogsÃ¥ hjælpe os ved at sende fejlrapporter eller smÃ¥ kodebidrag, ideer eller andet som kan forbedre KLog. Authors Forfattere Translators bring KLog into your language. They are really an important part of the KLog development team. Oversættere bringer KLog til dit sprog. De er en vigtig del af KLog-udviklingsholdet. If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://groups.io/g/klog">KLog mailing list</a>! Translators Oversættere Privacy advisory PrivatlivsrÃ¥d KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account users' needs. At present, the data that is provided is the following: I øjeblikket omfatter dataene følgende: Callsign Kaldesignal KLog version Klog-version Operating system Operativsystem KLog KLog Privacy Privatliv AdifLoTWExportWidget Select the Station Callsign that you want to use to upload the log. Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign. Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign. Station callsign My Locator Min locator Start date End date Ok O.k. Cancel Afbryd DX Date/Time Dato/tid Band BÃ¥nd Mode Tilstand Not defined ALL QSOs: %1/%2 All Alle KLog - QSOs to be uploaded to LoTW. This table shows the QSOs that will be sent to LoTW. KLog - QSOs to be uploaded to ClubLog. This table shows the QSOs that will be sent to ClubLog. KLog - QSOs to be uploaded to eQSL.cc. This table shows the QSOs that will be sent to eQSL.cc. KLog - QSOs to be uploaded to QRZ.com. This table shows the QSOs that will be sent to QRZ.com. This table shows the QSOs that will be exported to ADIF. AwardsWidget Recalculate Genberegn Click to recalculate the award status. Klik for at genberegne præmiestatus. Select the year you want to check. Vælg Ã¥ret du ønsker at kontrollere. QSOs QSO'er DXCC DXCC CQ CQ Award Præmie Confirmed Bekræftet Worked Bearbejdet WAZ WAZ Score Bedømmelse Annual Ã…rlig Number of confirmed DXCC entities. Antallet af bekræftede DXCC-entiteter. Number of worked DXCC entities. Antallet af bearbejdede DXCC-entiteter. Number of confirmed WAZ zones. Antallet af bekræftede WAZ-zoner. Number of worked WAZ zones. Antallet af bearbejdede WAZ-zoner. Number of confirmed QSOs. Antallet af bekræftede QSO'er. Number of worked QSOs. Antallet af bearbejdede QSO'er. Number of QSOs worked in the selected year. Number of DXCCs worked in the selected year. Number of CQ Zones worked in the selected year. Score for the DXMarathon in the selected year. DX-Marathon DX-Marathon CTYPage Country data download Overførsel af landedata KLog needs country data... KLog skal bruge landedata ... &Download &Hent &Ignore &Ignorer Country data needed Landedata krævet KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do. Click on Download to download now. Klik pÃ¥ Hent for at hente nu. KLog KLog I can't find the host. Please check your network and try again Do you want to try again? Jeg kan ikke finde værten. Kontroller dit netværk og prøv igen. Ønsker du at prøve igen? DXCCStatusWidget Update Opdater It seems that the DXCC status in your database is not updated and KLog can't find any dxcc information. You can try to fix this by updating the log. Do you want to update your DXCC status? Entity Entitet Prefix Præfiks Pref: CQ: ITU: Beam: Entity not worked in this band. Entitet fungerede ikke i dette bÃ¥nd. DXClusterWidget Click on Connect to connect to the DX-Cluster server Klik pÃ¥ Forbind for at forbinde til DX-Cluster-serveren Connect Forbind Clear Ryd Check in QRZ.com Check this callsign in QRZ.com Click on connect to connect to the DX-Cluster Klik pÃ¥ forbind for at forbinde til DX-Cluster Trying to connect to the server Forsøger at forbinde til serveren KLog DXCluster KLog DXCluster The host was not found. Please check: Værten blev ikke fundet. Kontroller venligst: - your network connection; - the host name and port settings. - din netværksforbindelse; - værtsnavnet og portindstillinger. The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. Forbindelsen blev nægtet af modparten. Sikr dig, at DXCluster-serveren kører og kontroller at værtsnavnet og portindstillinger er korrekte. The following error occurred: %1. Den følgende fejl opstod: %1. Connected to server Forbundet med serveren KLog message KLog-besked Enter your callsign to connect to the cluster: Indtast dit kaldesignal for at forbinde til klyngen: Enter your password to connect to the cluster: (Just hit enter for no password) Indtast din adgangskode for at forbinde til klyngen: (Tryk pÃ¥ retur for at undlade adgangskode) Disconnect Afbryd Not logged on, you may need to enter your callsign again. Ikke logget ind, du skal eventuelt indtaste dit kaldesignal igen. Enter here the commands to be sent to the DX-Cluster server. Indtast kommandoerne, der skal sendes til DX-Cluster-serveren, her. Connection closed by the server Forbindelse afbrudt af serveren Click on Connect to connect to the DX-Cluster server. Klik pÃ¥ Forbind for at forbinde til DX-Cluster-serveren. Send Send It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! DataProxy_SQLite Software version in DB is null Programversion i DB er nul Query didn't failed Aircraft Scatter Common term in hamradio, do not translate if not sure Flystøj Aurora Aurora Aurora-E Aurora-E Back scatter Common term in hamradio, do not translate if not sure Baggrundsstøj Earth-Moon-Earth Jorden-mÃ¥nen-jorden Sporadic E Sporadisk E Field Aligned Irregularities Common term in hamradio, do not translate if not sure Feltjusterede uregelmæssigheder F2 Reflection Common term in hamradio, do not translate if not sure F2-reflektion Internet-assisted Internetassisteret Ionoscatter Common term in hamradio, do not translate if not sure Ionostøj Meteor scatter Common term in hamradio, do not translate if not sure Meteorstøj Terrestrial or atmospheric repeater or transponder Terrestrisk eller atmosfærisk repeater eller transponder Rain scatter Common term in hamradio, do not translate if not sure Regnstøj Satellite Satellit Trans-equatorial Common term in hamradio, do not translate if not sure Trans-ækvatoriale Tropospheric ducting Common term in hamradio, do not translate if not sure Troposfærisk kanalisering Yes Ja No Nej Requested Anmodt Ignore/Invalid ignorer/ugyldig Validated Valideret Queued I kø Uploaded Overført Do not upload Overfør ikke Modified Ændret Bureau Common term in hamradio, do not translate if not sure Bureau Direct Direkte Electronic Elektronisk Manager Common term in hamradio, do not translate if not sure Manager KLog DXCC KLog-DXCC All QSOs have been updated with a DXCC and the Continent. Alle QSO'er er blevet opdateret med en DXCC og kontinentet. KLog - Invalid call detected An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported ADIF record? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. DownLoadCTY Download of cty.csv failed with the following error code: Overførsel af cty.csv mislykkedes med den følgende fejlkode: Download of cty.csv done. Overførsel af cty.csv udført. There is already a cty.csv file in the folder but it will be replaced with the new one. Der er allerede en cty.csv-fil i mappen, men den vil blive erstattet med den nye. Could not open %1 for writing Kunne ikke Ã¥bne %1 for at skrive FileAwardManager Open Award file Award files (*.awa) Award file not opened KLog was not able to read the award file It was not possible to open the file %1 for reading. AWA wrong format The AWA file does not have the right format AWA file does not have an <EOH> field KLog - %1 FileManager Writing ADIF file... Skriver ADIF-fil ... Abort writing Afbryd skrivning Exporting ADIF file... QSO: %1 / %2 Writing ADIF file... QSO: Skriver ADIF-fil ... QSO: You have canceled the file export. The file will be removed and no data will be exported. Du har afbrudt fileksporten. Filen vil blive fjernet og ingen data vil blive eksporteret. KLog - Error The selected log does not exist, please check it again. The file %1 can't be opened. Processing LoTW ADIF file... Abort processing LoTW reading KLog - Add new QSOs? Do you want to add non existing QSOs to your local log? There are some QSOs in the LoTW log that are not in your local log. Processing LoTW ADIF file...... QSO: %1 / %2 You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated. Do you want to add dupe QSOs to your local log? There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date. Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. KLog - Don't ask again Do you want to reuse your answer? KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again. <ul><li>Date/Time:</i> %1</li><li>Callsign: %2</li><li>Band: %3</li><li>Mode: %4</li></ul> KLog - QSO not found Do you want to add this QSO to the log?: We have found a QSO coming from LoTW that is not in your local log. Do you want KLog to add this QSO to the log? KLog - Invalid call detected An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported log file? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log file? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. You can, however, edit the ADIF file once the export process is finished. KLog - User cancelled Do you still want to cancel? Ønsker du stadig at afbryde? The selected callsign (%1) is not valid, please check it again to export the log. KLog - File not opened It was not possible to open the file %1 for reading. KLog was not able to read the LoTW file Reading LoTW file... Læser LotW-fil ... Importing LoTW ADIF file... KLog - Log selection KLog - Duplicated QSOs KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO with %1 on %2: KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO on %1: You have canceled the file import. The file will be removed and no data will be imported. There are no QSOs pending to be exported with that station callsign. Export Export progress This QSO is not including the minimum data to consider a QSO as valid! - The band missing and the following call: - BÃ¥ndet mangler og det følgende kald: - The mode missing and the following call: - Tilstanden mangler og det følgende kald: - The date missing and the following call: - Datoen mangler og det følgende kald: - The time missing and the following call: - Tidspunktet mangler og det følgende kald: Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information. If you select NO, maybe the QSO will not be imported. Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. KLog - Apply to all QSOs in this log? KLog - No Station callsign entered. KLog - QSO without Station Callsign Reading ADIF file... Læser ADIF-fil ... Abort reading Om læsning QSO: QSO: There is more than one log in this logfile. Der er mere end en log i denne logfil. All logs will be imported into the current log. Alle logge vil blive importeret i den nuværende log. Do you want to continue? Ønsker du at fortsætte? Importing ADIF file... Importerer ADIF-fil ... It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) Der ser ud til at der er nogle dublette QSO'er i ADIF-filen, du importerer. Ønsker du at fortsætte? (dublette QSO'er vil ikke blive importeret) Please edit the ADIF file and make sure that it include at least: Rediger din ADI-fil og sikr dig at den som minimum indeholder: and og This QSO had: Denne QSO havde: Do you want to continue with the current file? Ønsker du at fortsætte med den nuværende fil? KLog: Not all required data found! KLog: Ikke alle krævede data blev fundet! KLog: No RST TX found! KLog: Ingen RST TX blev fundet! KLog: No RST RX found! KLog: Ingen RST RX fundet! HamLibNetworkConfigWidget Enter the hostname or address of the radio. Set de network port of the radio. Host/Address Port Port Enter the port of the radio. HamLibSerialConfigWidget Bauds Bauds Select the serial port speed. Vælg den serielle porthastighed. Port Port Select the serial port. Only the serial ports that are detected are shown. Vælg den serielel port. Kun den serielle porter, der er registreret vises. Scan Skan Click to identify the serial ports available in your computer. Klik for at identificere de serielle porte tilgængelige i din computer. 5 bits 5-bit 6 bits 6-bit 7 bits 7-bit 8 bits 8-bit Data bits Databit Select the serial data bits. Vælg den serielle databit. None Ingen Hardware Udstyr Software XON/XOFF Software XON/XOFF Flow control Flow-kontrol Select the serial flow control Vælg den serielle flow-kontrol No parity Ingen paritet Even Lige Odd Ulige Space Mellemrum Mark Mærke Parity Paritet Select the serial parity. Vælg den serielle paritet. 1 bit 1 bit 1.5 bits 1,5 bit 2 bits 2 bit Stop bits Stop-bit Select the serial stop bits. Vælg den serielle stop-bit. InfoWidget 10M 10M 15M 15M 20M 20M 40M 40M 80M 80M 160M 160M 2M 2M 6M 6M 12M 12M 17M 17M 30M 30M 70CM 70CM Continent Kontinent Prefix Præfiks CQ CQ ITU ITU Short Path Kort sti Long Path Lang sti Deg Deg Miles Mil Km Km IntroPage Welcome to KLog! Velkommen til KLog! Welcome to KLog! - brought to you under the terms of the GPL! Velkommen til Klog! - bragt til dig under betingelserne i GPL'en! Welcome to KLog Velkommen til KLog This looks like it's the first time you've run KLog on this computer. Dette ser ud til, at det er første gang du afvikler KLog pÃ¥ denne computer. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. It is designed to provide general purpose DX, and contest logging. It supports QSL management, import and export of ADIF Programemt understøtter QSL-hÃ¥ndtering, import og eksport af ADIF and Cabrillo file formats and many other features... samt Cabrillofilformater og mange andre funktioner ... Before you can start using KLog, you will be asked to: Før du kan begynde med KLog vil du blive spurgt om: Acknowledge to the terms of the license. Anerkendelse af betingelserne i licensen. Download the DX entities information. Hente DX-entitetsinformationen. Enter your callsign, CQ zone, etc. and main configuration. Indtast dit kaldesignal, CQ-zone etc. og hovedkonfiguration. Enjoy KLog and contact the development team if you have any suggestions! Nyd KLog og kontakt udviklingsholdet hvis du har nogen forslag! LicPage KLog License information KLog-licensinformation Welcome to KLog!- brought to you under the terms of the GPL! Velkommen til KLog! - bragt til dig under betingelsen i GPL'en! Acknowledge Anerkendelse Be aware that KLog is free software. Vær opmærksom pÃ¥ at KLog er et frit program. LoTWUtilities KLog - LoTW password needed Please enter your LoTW password: Are you sure that you want to use that station callsign (%1)? There is a file already existing with the name that will be used. The file %1 already exist. Do you want to overwrite? KLog was not able to save the file %1. Error returned: %2 Downloading data to file: %1. KLog - LoTW download This is the first date of a QSO with the callsign %1 in this log If you think that in LoTW you may have previous QSOs, answer No. Do you want to use this date (%1) as start date? The remote server redirected our connection to %1 Do you want to follow the redirection? It was not possible for find the file %1 that has been just downloaded. It seems that LoTW has no QSO with the Station Callsign you are using (%1). Try again and send the downloaded file (%1) to the KLog developer for analysis. KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data? KLog - LoTW File already exists Double click on the date that you want to use as the start date for downloading QSOs. KLog - LoTW Station callsign There is not a single QSO in the log with that station callsign. KLog - LoTW Can't write the file The file %1 already exists. KLog - LoTW Start date selection KLog - LoTW Download error There was an error (%1) while downloading the file from LoTW. The downloading error details are: %1 KLog - LoTW Redirection found KLog - LoTW File not found KLog can't find the downloaded file. KLog - LoTW user/password error LoTW server did not recognized your user/password Check your user and password and ensure your are using the right one before trying again. KLog - LoTW No QSOs LoTW sent no QSOs KLog - LoTW Unknown error KLog can't recognize the file that has been downloaded from LoTW. Now KLog will process the downloaded QSO and update your local log. LogWindow QSL Send QSL send QSL Rcvd QSL modt &Delete &Slet Delete a QSO Slet en QSO &Edit QSO &Rediger QSO Edit this QSO Rediger denne QSO Via &bureau Via &bureau Send this QSL via bureau Send denne QSL via bureau D&irect D&irect Send this QSL via direct Send denne QSL via direct Via bureau Via bureau QSL &received via bureau QSL &modtaget via bureau Direct Direct QSL received via direc&t QSL modtaget via direc&t Check in QRZ.com Check this callsign in QRZ.com Check in DXHeat.com Check this callsign in DXHeat.com Delete selected QSOs Delete the selected QSOs Export to ADIF Export the selected QSOs to an ADIF file. Upload to LoTW Upload the selected QSOs to LoTW Upload to ClubLog Upload the selected QSOs to ClubLog Upload to eQSL.cc Upload the selected QSOs to eQSL.cc Send these QSLs via bureau Send these QSLs via direct QSLs received via bureau QSLs received via direc&t Select none Remove all selections Select all Select all the QSOs MainQSOEntryWidget &Add &Tilføj &Clear &Ryd Callsign of the QSO. Band of the QSO. BÃ¥nd for QSO'en. Mode of the QSO. Tilstand for QSO'en. Date of the QSO. Dato for QSO'en. Time of the QSO. Tidspunkt for QSO'en. Add the QSO to the log. Tilføj QSO'en til loggen. Clears the QSO entry. Rydder QSO-elementet. Look up info about the current callsign on qrz.com KLog will show real time if enabled. Real time Stop wsjt-x and hamlib from automatically updating QSO information. Manual Mode Callsign Kaldesignal &Save &Cancel &Afbryd DUPE Translator: DUPE is a common world for hams. Do not translate of not sure DUPE MainWindow Starting KLog Starter KLog DX Entity DX-entitet &Log Window &Logvindue KLog Klog It was not possible to open the debug file for writing. No debug log will be saved! Log backup recommended! It seems that you are running this version of KLog for the first time. Ready Klar An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: Der opstod en uventet fejl under tilføjelse af QSO'en til din log. Hvis problemet bestÃ¥r, sÃ¥ kontakt udvikleren for fejlsøgning: KLog - Not valid call Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. You have selected an entity: Du har valgt en entitet: that is different from the KLog proposed entity: som er anderledes fra den af KLog foreslÃ¥ede entitet: Click on the prefix of the correct entity or Cancel to edit the QSO again. Klik pÃ¥ præfikset for den korrekte entitet eller Afbryd for at redigere QSO'en igen. None Ingen Click on the prefix of the right entity or Cancel to correct. Klik pÃ¥ præfikset pÃ¥ den højre entitet eller Afbryd for at rette. KLog - QRZ.COM RSTrx RSTrx RSTtx RSTtx Do you really want to exit KLog? &File &Fil Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Eksporter ALLE QSO'erne til en ADIF-fil, sammenføj QSO'erne fra alle loggene. KLog folder KLog-mappe E&xit &Afslut &Tools &Værktøjer Fill in QSO data Udfyld QSO-data Find My-QSLs pending to send Find My-QSL'er under afsendelse Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Viser QSO'erne med afventende forespørgsler for at sende QSL'er. Du bør holde denne kø tom! Shows DX-QSLs for which requests or QSLs have been sent with no answer. Import an ADIF file into the current log. Importer en ADIF-fil ind i den aktuelle log. Export the current log to an ADIF logfile. Eksporter den aktuelle log til en ADIF-logfil. Print your log. Udskriv din log. Opens the data folder of KLog. Ã…bner datamappen for KLog. Go through the log reusing previous QSOs to fill missing information in other QSOs. GÃ¥ igennem loggen der genbruger tidligere QSO'er for at udfylde manglende information i andre QSO'er. Shows QSOs for which you should send your QSL and request the DX QSL. Viser QSO'er som du bør sende din QSL og forespørge pÃ¥ DX QSL'en. KLog - File not open Status bar ... KLog - Select correct entity KLog - Exit Mark all queued QSOs in this log as sent to LoTW. Marker alle QSO'er i kø i denne log som sendt til LoTW. Mark all queued QSOs as sent to LoTW. Marker alle QSO'er i kø som sendt til LoTW. You have requested to delete the QSO with: %1 Du har anmodt om at slette QSO'en med: %1 Are you sure? Er du sikker? Check always the current callsign in QRZ.com You can update the entities database in Tools->Update cty.csv The callsign %1 is not a valid call. Do you really want to add this callsign to the log? You have requested to delete several QSOs The ClubLog upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? KLog - ClubLog KLog - ClubLog There was an error while updating to Yes the ClubLog QSO upload information. The ClubLog upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The file has not been removed. It seems that there was something that prevented KLog from removing the file You can remove it manually. The eQSL upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1 Do you want to mark as Uploaded all the QSOs uploaded to eQSL? There was an error while updating to Yes the eQSL QSO upload information. The eQSL upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The QRZ.com upload process has finished with an error and the log was possibly not uploaded. Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? KLog - QRZ.com Always check the current callsign in QRZ.com Upload queued QSOs to LoTW It was not possible to define the KLog folder. Some functions may not work properly! Do you want to update now? You seem to have never backed up or exported your log to ADIF. Your latest backup seems older than one month. Regular backups prevent data loss and are good operator practice. Once exported, copy your ADIF file to a safe place such as a USB drive, cloud drive or other offsite computer. KLog will remind you to backup on a monthly basis. Backup completed successfully KLog will remind you again in approximately one month. Backup failed. Periodic data backups are recommended to prevent data loss and corruption of your log. The setup will now open to allow you to change your settings. There was an error while updating to Yes the QRZ.com QSO upload information. The QRZ.com upload process has finished successfully Call not found in QRZ.com You need to activate the %1 service in the eLog preferences. It is important to export to ADIF and save a copy as a backup. Saving the log was done successfully. The ADIF export was not properly done. &Import from ADIF ... Export to ADIF ... Export all logs to ADIF ... &Print Log ... Settings ... QSL tools ... Find QSO to QSL Find DX-QSLs pending to receive Find requested pending to receive LoTW tools ... Mark all queued QSOs from this log as sent Queue all the QSOs to be uploaded Check the current callsign in QRZ.com Queue all the QSO to be uploaded For updated DX-Entity data, update cty.csv. For opdaterede DX-Entity-data, opdater cty.csv. &Help &Hjælp Now you can upload them to LoTW. There was a problem to mark all pending QSOs as queued for LoTW! KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded. Error #2: Upload was rejected by LoTW, please check your data. Error #3: The TQSL server returned an unexpected response. Error #4: There was a TQSL error. Error #5: There was a TQSLLib error. Error #6: It was not possible to open the input file. Error #7: It was not possible to open the ouput file. Error #8: No QSOs were processed since some QSOs were duplicates or out of date range. Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range. Error #10: Command syntax error. KLog sent a bad syntax command. Error #11: LoTW Connection error (no network or LoTW is unreachable). Error #00: Unexpected error. Please contact the development team. Please select the station callsign you want to mark as sent to LoTW: Vælg venligst stationskaldesignalet du ønsker at markere som sendt til LoTW: You have selected no callsign. KLog will complete the QSOs without a station callsign defined and those with the callsign you are entering here. KLog - No station selected The log that you have selected contains more than just one station callsign. Loggen du har valgt indeholder mere end bare et stationskaldesignal. Shows the DX-QSLs that have been requested. Mark all non-sent QSOs in this log as queued to be uploaded. Queue all QSLs to be sent Put all the non-sent QSOs in the queue to be uploaded. Mark all queued QSOs as sent All pending QSOs of this log has been marked as queued for LoTW! There was a problem to mark all pending QSOs of this log as queued for LoTW! Your log has not been updated. No QSO was updated with the data coming from LoTW. This may be because of errors in the logfile or simply because your log was already updated. All pending QSOs has been marked as queued for LoTW! Station Callsign: Stationskaldesignal: Define Station Callsign Definer stationskaldesignal Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Indtast stationskaldesignalet at bruge for denne log eller efterlad den tom for QSO uden stationskaldesignal defineret: No station callsign has been selected and therefore no log will be marked Intet stationskaldesignal er blevet valgt og derfor vil ingen log blive markeret You need to select one station callsign to be able to send your log to ClubLog. Do you want to add this QSOs to your ClubLog existing log? If you don't agree, this upload will overwrite your current ClubLog existing log. KLog - eQSL KLog - Stop the war in Ukraine! KLog - Stop the war in Ukraine! You are using a Russian call (%1). You can probably help to stop the Russian war, people are dying. Please call your leaders to stop the war. You are using an Ukranian call. Please take care and protect yourself and your family. The KLog developers wish you the best of luck in this very difficult moment. People are dying in the war of Russia against Ukraine. You can help to stop the Russian war against Ukraine. Please show your disagreement to your leaders, or in your social network to stop the war. KLog - KLog folder not found KLog needs to update the Entities database. KLog - Backup KLog - New version detected! This version of KLog requires that the DXCC database is updated. The database will be updated. KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. KLog - ClubLog error KLog - eQSL error KLog - QRZ.com warning QRZ.com has returned a non-subcribed error and queries to QRZ.com will be disabled. Please check your QRZ.com subcription or credentials. KLog - QRZ.com error KLog has received an error from QRZ.com. KLog - %1 KLog - ADIF export Queue all QSOs from this log to be sent Download from LoTW ... Download the full log from LoTW ... ClubLog tools ... Upload the queued QSOs to ClubLog ... eQSL tools ... Upload the queued QSOs to eQSL.cc ... QRZ.com tools ... Upload the queued QSOs to QRZ.com ... Update cty.csv Update Satellite Data Show Map Online manual (F1) ... &Tips ... &Debug ... &About ... About Qt ... Check updates ... Do you really want to mark ALL the QSOs of this log to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. Do you really want to mark ALL pending QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. About ... KLog - Update checking result TQSL finished with no error. Do you want to mark as Sent all the QSOs uploaded to LoTW? The selection you have done does not include any QSO The selection you have done does not include any QSO. Select the Station Callsign to use when quering LoTW: Please check the LoTW setup You have not defined a LoTW user or a proper Station Callsign. Open the LoTW tab in the Setup and configure your LoTW connection. The log is ready to be uploaded to ClubLog. All the QSOs in this log has been marked as Modified in the ClubLog status field KLog could not mark the full log to be sent to ClubLog Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers. The log is ready to be uploaded to eQSL.cc. All the QSOs in this log has been marked as Modified in the eQSL.cc status field KLog could not mark the full log to be sent to eQSL The log is ready to be uploaded to QRZ.com. All the QSOs in this log has been marked as Modified in the QRZ.com status field KLog could not mark the full log to be sent to QRZ.com To upload QSOs you need a qrz.com subscription. If you have one, go to Setup->QRZ.com tab to enable it. You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. Filling QSOs ... Date/Time Dato/tid Callsign Kaldesignal Printing the log ... KLog - QSO received Station Callsign Operator Callsign KLog - WSJTX Dupe QSO This QSO seems to be duplicated. Do you want to save or discard it? KLog - Non-supported mode A new mode not supported by KLog has been received from an external program or radio: Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) Native Error Recommendation: Periodically export your data to ADIF to prevent a potential data loss. Congratulations! Tillykke! You already have the latest version. Du har allerede den seneste version. You can find the KLog data folder here: Du kan finde KLog-datamappen her: start start stop stop If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. Hvis du er sikker pÃ¥, at databasen indeholder QSO'er og KLog ikke kan finde dem, sÃ¥ kontakt udviklerne (se Om KLog) for hjælp. It seems that there are no QSOs in the database. No QSOs have been exported to ADIF. KLog has exported %1 QSOs to the ADIF file: %2 You need to select one station callsign to be able to send your log to LoTW. There was an error while updating to Yes the LoTW QSL sent information. KLog - Select the Station Callsign. The logfile has been modified. Logfilen er blevet ændret. KLog - CTY.dat update Do you want to save your changes? Ønsker du at gemme dine ændringer? Stats Stat Show the statistics of your radio activity. Vi statistik over din radioaktivitet. Your log has been updated with the LoTW downloaded QSOs. KLog has updated %1 QSOs from LoTW. All queued QSOs has been marked as sent to LoTW! There was a problem to mark all queued QSOs of this log as sent to LoTW! UDP Server error The UDP server failed to %1. start or stop UDP-serverfejl UDP-serveren mislykkedes i at %1. Status of the DX entity. Status pÃ¥ DX-entitet. Name of the DX entity. Navn pÃ¥ DX-entitet. QSO QSO QSL QSL eQSL eQSL Comment Kommentar Others Andre My Data Mine data Satellite Satellit DXCC DXCC Info Info Awards Præmier Search Søg Log Log DX-Cluster DX-Cluster Save ADIF File Gem ADIF-fil The LoTW upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The file has been removed. KLog - LoTW Freq Frek Time On Tid pÃ¥ Time Off Tid væk RST TX RST TX RST RX RST RX DX-Grid DX-Grid Local-Grid Lokalt-Net QSO logged from WSJT-X: QSO logget fra WSJT-X: Open File Ã…bn fil All queued QSOs of this log has been marked as sent to LoTW! There was a problem to mark all queued QSOs as sent to LoTW! Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1 ClubLog ClubLog QRZ.COM - Needed for DXMarathon - Krævet for DXMarathon Abort filling Afbryd udfyldning Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: Number Nummer Band BÃ¥nd Mode Tilstand Print Log Udskrivningslog Abort printing Om udskrivning Printing the log... QSO: Udskrivning af loggen ... QSO: The following QSO data has been received from WSJT-X to be logged: De følgende QSO-data er blevet modtaget fra WSJT-X for at blive logget: Duplicated QSOs have to match another existing QSO with the same call, band, mode, date and time, taking into account the period that can be defined in the settings. If the received mode is correct, please contact KLog development team and request support for that mode Hvis den modtagne tilstand er korrekt, sÃ¥ kontakt venligst KLog-udviklingsholdet og anmod om understøttelse for den tilstand KLog - QSO Dupe A dupe QSO has been detected in the file and will not be added to the log. Please check the QSO information file and ensure it is properly added. KLog - Duplicated satellite A duplicated satellite has been detected in the file and will not be imported. En dubletsatellit er blevet registreret i filen og vil ikke blive importeret. Please check the satellite information file and ensure it is properly populated. Kontroller venligst satellitinformationsfilen og sikr dig at den er korrekt udfyldt. Now you will see a more detailed error that can be used for debugging... Nu vil du se en mere detaljeret fejl, som kan bruges til fejlsøgning ... An unexpected error ocurred!! Der opstod en uventet fejl! If the problem persists, please contact the developers Hvis problemet bestÃ¥r, sÃ¥ kontakt udviklerne for analysis: for analyse: Error in function Fejl i funktion Error text Fejltekst Failed query Mislykket forespørgsel KLog - Show errors Do you want to keep showing errors? Ønsker du fortsat at vise fejl? MainWindowInputComment Comment Kommentar Add a comment for this QSO. Tilføj en kommentar for denne QSO. Keep this data Behold disse data Data entered in this tab will be copied into the next QSO. Data indtastet i dette faneblad vil blive kopieret ind i den næste QSO. MainWindowInputEQSL Date of the ClubLog upload. Dato for ClubLog-overførslen. Date of the QRZ.com upload. Date of the eQSL sending. Dato for eQSL-afsendelsen. Date of the eQSL reception. Dato for eQSL-modtagelsen. Date of the LoTW sending. Dato for LoTW-afsendelsen. Date of the LoTW reception. Dato for LoTW-modtagelsen. Status on QRZ.com. Status of the LoTW sending. Status for LoTW-afsendelsen. Status of the LoTW reception. Status for LoTW-modtagelsen. QRZ.com LoTW Sent LoTW sendt LoTW Rec LoTW modt Status on ClubLog. Status for ClubLog. Status of the eQSL sending. Status for eQSL-afsendelsen. Status of the eQSL reception. Status for eQSL-modtagelsen. ClubLog ClubLog eQSL Sent eQSL sendt eQSL Rec eQSL modt MainWindowInputOthers Primary Div Primær div Secondary Div Sekundær div IOTA IOTA Entity Entitet Propagation mode Propagationtilstand Others Andre Keep propagation mode Select the primary division for this QSO. ælg den primære division for denne QSO. Select the secondary division for this QSO. Vælg den sekundære division for denne QSO. Select the entity for this QSO. Vælg identiteten for denne QSO. Select the propagation mode for this QSO. Vælg propagatonstilstand for denne QSO. Select the IOTA continent for this QSO. Vælg IOTA-kontinentet for denne QSO. Select the IOTA reference number for this QSO. Vælg IOTA-referencenummeret for denne QSO. Keeps the same propagation mode for next QSO. Select the appropriate ADIF field for this QSO. Value for the selected ADIF field. Not Identified Ikke Identificeret Not - Not Identified Ikke - ikke identificeret SOTA Ref Age VUCC grids Distance MainWindowInputQSL QSL Sent QSL sendt QSL Rec QSL modt QSL Via QSL via QSL Msg QSL bskd Status of the QSL sending. Status for QSL-afsendelsen. Status of the QSL reception. Status for QSL-modtagelsen. QSL sending information. QSL-afsendelsesinformation. QSL reception information. QSL-modtagelsesinformation. Date of the QSL sending. Dato for QSL-afsendelsen. Date of the QSL reception. Dato for QSL-modtagelsen. Message of the QSL. Besked for QSL'en. QSL via information. QSL via information. MainWindowInputQSO TX RST. TX RST. RX RST. RX RST. TX Frequency in MHz. TX-frekvens i MHz. RX Frequency in MHz. RX-frekvens i MHz. Power used by the contacted station. Name of the contacted operator. QTH of the contacted station. Locator of the contacted station. Watts Watt MHz MHz Split Translator: Split is a common hamradio term. Do not translate unless you are sure. Name Navn QTH QTK DX Locator DX-lokalisering Power(rx) Power(rx) RST TX RX Frequency RST(tx) RST(tx) RST(rx) RST(rx) Freq TX Freq TX Freq RX Freq RX DX QTH locator. DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. TX Frequency in MHz. Frequency is not in a hamradio band! TX-frekvens i MHz. Frekvens er ikke i et amatørradiobÃ¥nd! RX Frequency in MHz. Frequency is not in a hamradio band! RX-frekvens i MHz. Frekvens er ikke i et amatørradiobÃ¥nd! MainWindowMyDataTab Watts Watt Keep this data Behold disse data My QTH locator. Min QTH-locator. Power Strøm Operator callsign Station Callsign Stationkaldesignal My Locator Min locator My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. My Rig My Antenna My SOTA_Ref My VUCC_GRIDS MainWindowSatTab Keep this data Behold disse data Other - Sat not in the list Andre - sat er ikke i listen Data entered in this tab will be copied into the next QSO. Data indtastet i dette faneblad vil blive kopieret ind i den næste QSO. Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Navn pÃ¥ satellitten hvis ikke i listen. Vælg: »%1« for at aktivere denne boks. Satellite mode used. Satellittilstand anvendt. Select the satellite you are using. Vælg satelitten du bruger. UpLink band. UpLink-bÃ¥nd. DownLink band. DownLink-bÃ¥nd. Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. Lokalisering af DX-stationen. Denne boks er synkroniseret med lokaliseringsboksen i QSO-fanebladet. UpLink UpLink DownLink DownLink Satellite Satellit Mode Tilstand DX Locator DX-lokalisering Other Andet MHz MHz Not Sat QSO Ikke sat QSO KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. KLog har registreret et satellitnavn, som det ikke genkender. Hvis det skal bruge et af navnene pÃ¥ kendte satellitter i stedet for, vælg det fra listen. Alternativt sÃ¥ kontakt udviklingsholdet for at tilføje det nye satellitnavn. The satellite you have in your QSO is: Satellitten du har i din QSO er: Please be aware that the satellite name will not be saved if it is not in the list, so that information may be lost! RX Frequency in MHz. Frequency is not in a hamradio band! RX-frekvens i MHz. Frekvens er ikke i et amatørradiobÃ¥nd! RX Frequency in MHz. RX-frekvens i MHz. TX Frequency in MHz. Frequency is not in a hamradio band! TX-frekvens i MHz. Frekvens er ikke i et amatørradiobÃ¥nd! TX Frequency in MHz. TX-frekvens i MHz. MapWindowWidget Select QSOs in this band. Select QSOs in this mode. Select QSOs in this propagation mode. Select QSOs using this Satellite. Only confirmed Select only confirmed QSOs. All bands Show nothing All modes All propagation modes All satellites OnlineMessageWidget The server returned the following error: %1 Not identified Ikke identficeret QObject New One, work it! Ny, bearbejd den! Needed, work it! Krævet, bearbejd den! Worked but not confirmed Bearbejdet men ikke bekræftet Confirmed Bekræftet Not identified Ikke identficeret Database Error Databasefejl KLog DB needs to be upgraded. KLog-databasen skal opgraderes. Do you want to upgrade it now? Ønsker du at opgradere den nu? If DB is not upgraded KLog may not work properly. Hvis databasen ikke bliver opgraderet sÃ¥ fungerer KLog mÃ¥ske ikke korrekt. Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea. Do you want to backup your DB now? The backup finished successfully. You can find the backup in this file: %1 The backup was not properly done. You will be sent back to the starting point. KLog - DB can't be updated automatically You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version. KLog - DB update KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. KLog har registreret en tidligere log i databasen. Alle data vil blive migreret til en ny DX-typelog. KLog: Enter Station callsign KLog: Indtast stationskaldesignal Enter the station callsign used in this log Indtast stationskaldesignalet brugt i denne log Station Callsign Stationskaldesignal Updating DXCC award information... Updating DXCC Award information... Updating WAZ award information... Updating WAZ Award information... The process to upgrade is: - Using an old KLog version export your log to ADIF. - Remove your logbook.dat file from your KLog folder. - Install the new KLog version. - Import your ADIF file. KLog will finish when you click on OK. All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay. Updating mode information... Opdaterer tilstandsinformation ... Abort updating Afbryd opdatering QSO: QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? Afbrydelse af denne opdatering vil medføre datauoverensstemmelser og muligvis datatab. Ønsker du stadig at afbryde? Updating bands information... Opdaterer bÃ¥ndinformation ... Updating bands information in %1 status... Opdaterer bÃ¥ndinformation i %1 status ... Progress: Status: Updating mode information in %1 status... Opdaterer tilstandsinformation i %1 status ... KLog is already running. It is allowed to run only one instance. Install wizard was canceled before completing... Installationsguide blev afbrudt før fuldførelse ... Do you want to remove the KLog dir from your disk? Ønsker du at fjerne KLog-mappen fra din disk? Your KLog dir has been removed Din KLog-mappe er blevet fjernet Thank you for running KLog! Tak fordi du bruger KLog! I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. Jeg kunne ikke fjerne din KLog-mappe. Du bør gøre det manuelt, hvis du ønsker at den fjernes fra din harddisk. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. Din KLog-mappe kan ikke fjernes. Du skal gøre det manuelt, hvis du ønsker den fjernet fra din harddisk. Remember that your KLog dir is on your system... Husk at din KLog-mappe er pÃ¥ dit system ... Updating information... Updating DXCC and Continent information... Opdaterer DSCC- og kontinentinformation ... A wrong callsign has been found: %1. Please enter a new callsign or confirm that the current one is a good callsign. An empty callsign has been detected. If it is possible, please enter the right call. KLog - Not valid callsign found Date Dato Call Call RSTtx RSTtx RSTrx RSTrx Band BÃ¥nd Comment Kommentar Mode Tilstand CQz ITUz DXCC DXCC Address Age County A_Index Ant_Az Ant_El Ant_Path ARRL_SECT Award_Submitted Award_granted Band_RX CheckContest Class ClubLog SDate ClubLog status Continent Kontinent Contest Id Country Credit Submitted Credit granted Dark Dok Do not translate if unsure, common hamradio term. Fists Do not translate if unsure, common hamradio term. Fists CC Do not translate if unsure, common hamradio term. My Fists Do not translate if unsure, common hamradio term. Nr bursts Do not translate if unsure, common hamradio term. Nr pings Do not translate if unsure, common hamradio term. Sat mode SWL Do not translate if unsure, common hamradio term. Ten-Ten Do not translate, it is a hamradio group name. Distance Contacted_Op Email EQ_Call eQSL RDate eQSL SDate eQSL Rcvd eQSL Sent eQSL sendt Force Init Freq Frek Freq RX Freq RX Gridsquare HRDLog SDate HRDLog status IOTA IOTA IOTA Island id K Index Lat Lon LoTW RDate LoTW SDate LoTW Rcvd LoTW Sent LoTW sendt Max Bursts MS Shower My Antenna My City My Cnty My Country My CQz My DXCC My Gridsquare My IOTA My IOTA island id My ITUz My Lat My Lon My Name My Postal code My Rig My Sig My Sig Info My SOTA ref My State My Street My USACA counties My VUCC grids Name Navn Notes Operator Owner Callsign Pfx Precedence Prop Mode Public Key QRZcom SDate QRZcom status QSL msg QSL RDate QSL SDate QSL Rcvd QSL modt QSL Sent QSL sendt QSL rcvd via QSL sent via QSL via QSO complete QSO random QTH QTK Region Rig RX Pwr Sat name Sat.-navn SFI Sig Sig Info Silent key Do not translate if unsure, common hamradio term. SKCC SOTA Ref SRX String SRX STX String State Submode UKSMG USACA counties VE prov VUCC grids TX Pwr Web QSO Date off Log number SearchWidget &Clear &Ryd &Export Highlighted &Eksporter markering &Select All &Vælg alle &Search &Søg Clear the searches. Ryd søgninger. Export the search result to an ADIF file. Eksporter søgeresutlatet til en ADIF-fil. Select/Unselect all the QSOs shown. Vælg/fravælg alle viste QSO'ere. Search in the log. Søg i loggen. Search in all logs. Søg i alle logge. All logs Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs! Select the Station Callsign used to do this QSO. All in log Not defined &Clear selection &Ryd markering Save File Gem fil You have requested to delete the QSO with: %1 Du har anmodt om at slette QSO'en med: %1 Are you sure? Er du sikker? SearchWindow Date/Time Dato/tid Band BÃ¥nd Mode Tilstand QSL Sent QSL sendt QSL Rcvd QSL modt Station Callsign ID Id Call Call Date/time Station callsign QSL Send QSL send &Delete &Slet Delete a QSO Slet en QSO &Edit QSO &Rediger QSO Edit this QSO Rediger denne QSO Via &bureau Via &bureau Send this QSL via bureau Send denne QSL via bureau D&irect D&irect Send this QSL via direct Send denne QSL via direct Via bureau Via bureau QSL &received via bureau QSL &modtaget via bureau Direct QSL received via direc&t QSL modtaget via direc&t Check in QRZ.com Check this callsign in QRZ.com Check in DXHeat.com Check this callsign in DXHeat.com &Request my QSL &Anmod om min QSL Mark my QSL as requested Marker min QSL som anmodt om Via Direct and mark DX QSL as requested Send this QSL via direct and mark DX QSL as requested Via Bureau and mark DX QSL as requested Send this QSL via bureau and mark DX QSL as requested &Request the QSL &Anmod om QSL'en Mark the QSL as requested Marker QSL'en som anmodt om Via bureau and mark my QSL as requested QSL received via bureau and mark my QSL as requested Direc&t and mark as my QSL requested QSL received via direct and mark my QSL as requested Needed QSO to send the QSL Krævet QSO til at sende QSL'en My QSL requested to be sent Min QSL anmodt om at blive sendt DX QSL pending to be received DX QSL igangværende til modtagelse SetupDialog Bands/Modes BÃ¥nd/tilstande DX-Cluster DX-Cluster Colors Farver Misc Diverse World Editor Verdensredigeringsprogram Logs Logge Satellites Sattelitter Cancel Afbryd HamLib HamLib OK O.k. User data Brugerdata Log widget D&X-Cluster D&X-Cluster WSJT-X WSJT-X Settings You need to enter at least one log in the Logs tab. Du skal indtaste mindst en log i fanebladet for logge. Do you want to add one log in the Logs tab or exit KLog? (Click Yes to add a log or No to exit KLog) World Verden Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. GÃ¥ til diversefanebladet og klik pÃ¥ flyt db ellers vil databasen ikke blive flyttet til den nye placering. You need to enter at least a valid callsign. Go to the User tab and enter valid callsign. eLog DB has not been moved to new path. You have not selected the kind of log you want. Du har valgt den slags log du ønsker. You will be redirected to the Log tab. Please add and select the kind of log you want to use. Du vil blive dirigeret til log-fanebladet. Tilføj og vælg den slags log du ønsker at bruge. SetupEntityDialog Entity Entitet CQ CQ ITU ITU Latitude Breddegrad Longitude Længdegrad UTC UTC Main prefix Hovedpræfiks ARRL ID ARRL ID Prefixes Præfiks Comma separated possible prefixes, e.g. EA1, EA2, ... Kommaadskilt mulige præfiks, f.eks. EA1, EA2, ... Ok O.k. Name of the Entity. Navn pÃ¥ element. CQ zone. CQ-zone. ITU zone. ITU-zone. Longitude of the Entity. Længdegrad for entitet. Local time difference to UTC. Lokal forskel i tid til UTC. Main prefix of the entity. Hovedpræfiks for entitet. ARRL ID. ARRL-Id. Date of the deletion. Sletningsdato. Deleted Slettet Cancel Afbryd Entity Dialog Entitetdialog SetupPageBandMode Bands BÃ¥nd Modes Tilstande SetupPageColors New One Ny Needed in this band Krævet i dette bÃ¥nd Worked in this band Bearbejdet i dette bÃ¥nd Confirmed in this band Bekræftet i dette bÃ¥nd Default Standard WSJT-X palette Default palette Dark Mode Color when the DXCC is an ATNO (All Time New One). DXCC is confirmed in this band. Default color. Sets a palette of colors similar to the one used in WSJT-X. Sets the default palette. Light Mode This DXCC was worked before in another band but not in the selected band. It may be needed due to the CQ, ITU, Grid, ... Worked DXCC, but not confirmed in this band. Sets the Dark Mode Choose a color Vælg en farve SetupPageDxCluster Add Tilføj Delete Slet Show &HF spots Vis %HF-spot Show V/&UHF spots Vis V/&UHF-spot Show W&ARC spots Vis W&ARC-spot Show &worked spots Vis &bearbejdede spot Show &confirmed spots Vis &bekræftede spot Show ANN/&FULL messages Vis ANN/&FULL-beskeder Show WW&V messages Vis WW&V-beskeder Show WC&Y messages Vis WC&Y-beskeder Save DX Cluster activity Saves all the DX-Cluster activity to a file in the KLog folder Send DX Spots to the map Sends the received DX Spots to the map to know where is the activity. DX Spots DX-spot Others Andre Messages Beskeder KLog: Add a DXCluster server Klog: Tilføj en DXCluster-server Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Tilføj adressen fulgt af :port Eksempel: dxfun.com:8000 Hvis ingen port er angivet, sÃ¥ vil 41112 blive brugt som standard: SetupPageELog ClubLog password ClubLog App password ClubLog email Enter the email you used to register in ClubLog. Indtast e-posten du ønsker at registrere i ClubLog. Enter your password ClubLog here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!! Send QSOs in real time Activate ClubLog Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Send hver QSO til ClubLog i realtid, efterhÃ¥nden som de tilføjes (eller ændres) i KLog. Starts the ClubLog support in KLog. Starter ClubLog-understøttelse i KLog. Activate eQSL.cc Enter your username of eQSL.cc. Enter your password eQSL.cc here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) eQSL.cc password eQSL.cc user ClubLog ClubLog eQSL.cc QRZ.com Enter the user of your QRZ.com account. You need to be subscribed to QRZ.com to use this service. User Enter your password QRZ.com here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Password Activate QRZ.com Check automatically Check in Qrz.com all Calls as they are entered Paying Subscriber Check it if you are paying for a qrz.com subscription LogBook Key LogBook Key for QSO uploading. You can get this key in your QRZ.com logbook webpage. Remember that you need a QRZ.com subscription to use this feature. LoTW Upload Download TQSL path Use TQSL LoTW password LoTW user Enter your LoTW user. Enter your password LoTW here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Path to the TQSL software. Enable the LoTW integration with TQSL. You will need to have TQSL installed Select File SetupPageHamLib Activate HamLib Aktiver HamLib Activates the hamlib support that will enable the connection to a radio. Aktiverer understøttelse af hamlib, der vil aktivere forbindelsen til en radio. Read-Only mode If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio. Radio Radio Select your rig. Vælg din rig. Serial Network Defines the interval to poll the radio in msecs. Poll interval Test: OK Test: NOK Test Click to test the connection to the radio SetupPageLogView Fields SetupPageLogs &New &Ny &Edit &Rediger &Remove &Fjern Add a new log. Tilføj en ny log. Edit the selected log. Rediger den valgte log. Remove the selected log. Fjern den valgte log. KLog KLog Do you really want to remove this log? Ønsker du at fjerne denne log? All the QSOs from this log will also be deleted... QSOs QSO'er The new log could not be created. Log has not been removed. (#3) Log er ikke blevet fjernet. (#3) Log has not been removed. (#2) Log er ikke blevet fjernet. (#2) Log has not been removed. (#1) Log er ikke blevet fjernet. (#1) ID Id Date Dato Station Callsign Stationskaldesignal Operators Operatører Comments Kommentarer An error has occurred showing the following error code: Der opstod en fejl med denne fejlkode: KLog - SetupPageLogs KLog - SetupPageLogs SetupPageLogsNew &Date &Dato &Station Callsign &Stationskaldesignal &Operators &Operatører Comm&ent &Kommentar &Ok &O.k. &Cancel &Afbryd Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. Callsign used for this log. Kaldesignal brugt for denne log. Comma separated list of operators: callsign1, callsign2. Kommaadskilt liste over operatører: kaldesignal1, kaldesignal2. Start date of this log. Startdato for denne log. SetupPageMisc &Imperial system &Imperial-system &Log in real time &Log i realtid &Time in UTC &Tid i UTC &Save ADIF on exit &Gem ADIF ved afslut Use this &default filename Brug dette &filnavn som standard Mark &QSO to send QSL when QSL is received Marker &QSO til at sende QSL nÃ¥r OSL er modtaget Complete QSO with previous data Fuldfør QSO med tidligere data Show the Station &Callsign used in the search box Vis stations&kaldesignal brugt i søgeboksen &Check for new versions automatically &Kontroller for nye versioner automatisk &Provide Info for statistics &Tilbyd information for statistik Manage DX-Marathon HÃ¥ndter DX-Maraton Mark sent eQSL && LoTW in new QSO as queued Browse Gennemse Move DB Flyt database QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. QSO'er vil blive markeret som afventende pÃ¥ at sende en QSL hvis du modtager DX QSL'en og ikke har sendt dine. The search box will also show the callsign on the air to do the QSO. Select the application debug log level. This may be useful if something is not working as expected. A debug file will be created in the KLog directory and/or shown with Help->Debug menu. Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default. Check if there is a new release of KLog available every time you start KLog. Kontroller om der er en ny version af KLog tilgængelig hver gang du starter KLog. Check non-valid calls Show seconds &Delete always temp ADIF file after uploading QSOs In seconds, enter the time range to consider a duplicate if same call, band and mode is entered. Show seconds in the QSO editor If you disable this checkbox KLog will not check callsigns to identify wrong callsigns. Check it for Imperial system (Miles instead of Kilometers). Kontroller for Imperial-system (mil i stedet for kilometer). Select to use real time. Vælg at bruge realtid. Select to use UTC time. Vælg at bruge UTC-tidspunkter. Select if you want to save to ADIF on exit. Vælg hvis du ønsker at gemme til ADIF ved afslut. Select to use the following name for the logfile without being asked for it again. Vælg at bruge det følgende navn for logfilen uden at blive spurgt om det igen. Complete the current QSO with previous QSO data. Fuldfør den nuværende QSO med tidligere QSO-data. Select if you want to manage DX-Marathon. Vælg om du ønsker at hÃ¥ndtere DX-Marathon. This is the default file where ADIF data will be saved. Dette er standardfilen hvor ADIF-data vil blive gemt. This is the directory where the database (logbook.dat) will be saved. Dette er mappen hvor databsen (logbook.dat) vil blive gemt. Click to change the default ADIF file. Klik for at ændre ADIF-standardfilen. Click to change the path of the database. Klik for at ændre stien for databasen. Click to move the DB to the new directory. Klik for at flytte databasen til den nye mappe. Delete Always the adif file created after uploading QSOs Log level Dupe time range: Open File Ã…bn fil Select Directory Vælg mappe This is the directory where DB (logbook.dat) will be saved. Dette er mappen hvor DB (logbook.dat) vil blive gemt. Please specify an existing directory where the database (logbook.dat) will be saved. Angiv en eksisterende mappe hvor databasen (logbook.dat) vil blive gemt. KLog - Move DB File moved Fil flyttet File copied Fil kopieret File already exist. The destination file already exist and KLog will not replace it. Please remove the file from the destination folder before moving the file with KLog to make sure KLog can copy the file. File NOT copied Filen blev IKKE kopieret The file was not copied due to an unknown problem. The target directory does not exist. Please select an existing directory. MÃ¥lmappen findes ikke. Vælg venligst en eksisterende mappe. SetupPageSats &New &Ny &Edit &Rediger &Remove &Fjern &Import &Import E&xport &Eksport Add a new satellite. Tilføj en ny satellit. Edit the selected satellite. Rediger den valgte satellit. Remove the selected satellite. Fjern den valgte satellit. Export your current satellites to a file. Eksporter dine nuværende satellitter til en fil. Select the sat you want to open. Vælg satellitten du ønsker at Ã¥bne. KLog KLog Do you really want to remove this satellite? Ønsker du virkelig at fjerne denne satellit? Import a satellites file. It will replace the satellites you have in the current list. This satellite will no be longer available to be selected ... Sat has not been removed. (#3) Sat. er ikke blevet fjernet. (#3) Sat has not been removed. (#2) Sat. er ikke blevet fjernet. (#2) Sat has not been removed. (#1) Sat. er ikke blevet fjernet. (#1) ID Id Short Kort Name Navn Uplink Uplink Downlink Downlink Modes Tilstande An error has occurred showing the following error code: Der opstod en fejl der viser den følgende fejlkode: KLog - SetupPageSats Klog - SetupPageSats Open Satellites File Ã…bn satellitfil KLog warning KLog-advarsel An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Der opstod en uventet fejl under import af satellitdata. Det kan være fordi, at filen du forsøger at imporetere ikke har det korrekte format. Please check the format or contact the developer for analysis with the error code: Kontroller venligst formatet eller kontakt udvikleren for analyse med fejlkoden: Save Satellites File Gem satellitfil SetupPageSatsNew Short name Kort navn Sat name Sat.-navn UpLink UpLink DownLink DownLink Modes Tilstande &Ok &O.k. &Cancel &Afbryd Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Indtast det korte navn. Prøv at bruge LoTW-kort navn, sÃ¥ du kan overføre din QSo til LoTW efterfølgende. Enter the name of the satellite. Indtast navnet pÃ¥ satellitten. Enter the uplink frequencies in this format: 144.300 Indtast uplink-frekvenser i dette format: 144.300 Enter the downlink frequencies in this format: 144.300 Indtast downlink-frekvenser i dette format: 144.300 Enter the modes in this format: USB Indtast tilstandene i dette format: USB Some of the data you have entered is not correct; the satellite can't be added. SetupPageSubdivisionNew &Date &Dato &Station Callsign &Stationskaldesignal &Operators &Operatører Comm&ent &Kommentar &Ok &O.k. &Cancel &Afbryd Callsign used for this log. Kaldesignal brugt for denne log. Comma separated list of operators: callsign1, callsign2. Kommaadskilt liste over operatører: kaldesignal1, kaldesignal2. Start date of this log. Startdato for denne log. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. SetupPageSubdivisions &Remove &Fjern Import new Import an AWA file with the subdivision details. Remove the selected references. Select the references you want to open. KLog Do you really want to remove the data of this entity? All the subdivision information for this entity will be deleted... Log has not been removed. (#3) Log er ikke blevet fjernet. (#3) Log has not been removed. (#2) Log er ikke blevet fjernet. (#2) Log has not been removed. (#1) Log er ikke blevet fjernet. (#1) ID Id Name Navn Short Name CQ Zone CQ-zone ITU Zone ITU-zone Deleted Slettet Start Date End Date DXCC DXCC An error has occurred showing the following error code: KLog - SetupPageSubdivisions SetupPageUDP Start UDP Server Start UDP-server Automatically log QSOs from WSJT-X Allow WSJT-X to send logged QSOs to KLog QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. Update status information from WSJT-X KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...) UDP port number where the UDP Server will listen for packets. UDP-portnummer hvor UDP-serveren vil lytte efter pakker. Make sure it is the same port that the other programs are sending the data to. Default port is 2237. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. UDP-server vil modtage QSO'er sendt fra andre programmer sÃ¥som WSJT-X hvilket gør, at du kan logge ind i KLog automatisk fra disse programmer. UDP Port UDP-port Select the interface to listen for UDP datagrams coming from WSJT-X. Network interface QSOs notification timeout (milisecs) Miliseconds that the notification of QSOs received from WSJTX will be shown. SetupPageUserDataPage &Personal data &Personlige data Station &data Stations&data Enter your name. Indtast dit navn. Enter your address - 1st line. Indtast din adresse - 1. linje. Enter your address - 2nd line. Indtast din adresse - 2. linje. Enter your address - 3rd line. Indtast din adresse - 3. linje. Enter your address - 4th line. Indtast din adresse - 4. linje. Enter your city. Indtast din by. Enter your zip code. Indtast din zip-kode. Enter your province or state. Indtast din provins eller stat. Enter your country. Indtast dit land. &Name &Navn &Address &Adresse Cit&y &By &Zip Code &Zip-kode Pro&v/State &Prov/stat Countr&y &Land Enter your information for rig Indtast din information for rig Enter your information for antenna Indtast din information for antenne Enter your power information. Indtast din strøminformation. Enter the station callsign that will be used for logging. Indtast stationskaldesignalet som vil blive brugt til logning. &Rig 1 &Rig 1 R&ig 2 R&ig 2 Ri&g 3 Ri&g 3 Antenna &1 Antenne &1 Antenna &2 Antenne &2 Antenna &3 Antenne &3 Po&wer &Strøm Enter the operators (comma separated if more than one). Indtast operatørerne (kommaadskilt hvis mere end en). Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Indtast locatoren for din station. Alternativt kan KLog bruge en omtrentlig loacator baseret pÃ¥ dit kaldesignal. &Callsign &Operators &Operatører &CQ Zone &CQ-zone &ITU Zone &ITU-zone &Locator &Locator &Locator (not valid) &Locator (ikke gyldig) SetupPageWorldEditor Add Tilføj Delete Slet Edit Rediger Export World Eksportverden Import World Importverden Still not implemented. Endnu ikke implementeret. Import a new cty.csv file Importer en ny cty.csv-fil An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. En entitetsinformationsfil (cty.csv) er blevet registreret i din KLog-mappe og vil blive indlæst. No entities information file (cty.csv) has been detected in your KLog folder. Ingen entitetinformationsfil (cty.csv) er blevet registreret i din KLog-mappe. KLog will not be able to show entities information. KLog vil ikke kunne vise entitetinformation. Prefix Præfiks Entity Entitet ARRL ID ARRL-id Continent Kontinent CQ Zone CQ-zone ITU Zone ITU-zone UTC UTC Latitude Breddegrad Longitude Længdegrad Deleted Slettet Since Date Siden dato To Date Til dato Open File Ã…bn fil BigCTY (*.csv) BigCTY (*.csv) Entities information has been updated. Entitetinformation er blevet opdateret. Entities information has not been updated. Entitetinformatoin er ikke blevet opdateret. ShowAdifImportWidget The following QSOs are those QSOs that you have received the LoTW confirmation. Ok O.k. DX Date/Time Dato/tid Band BÃ¥nd Mode Tilstand ShowErrorDialog KLog Message KLog-besked SoftwareUpdateDialog Ok O.k. KLog update KLog-opdatering <center><h2>KLog new version (%1) is available! </h2></center><br>There is a new version of KLog available.<br><br><b>You can get the new version from:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> Congratulations! Tillykke! Your KLog has been updated. Din KLog er blevet opdateret. You already have the latest version. Du har allerede den seneste version. StartWizard KLog - The free hamradio logging program KLog - Det frie logningsprogram for amatørradio Quit Setup Afslut opsætning Setup is not complete yet. Are you sure you want to quit setup? Opsætning er ikke færdig endnu. Er du sikker pÃ¥, at du ønsker at afslutte opsætningen? StatisticsWidget QSO per year QSO per Ã¥r DXCC per year DXCC per Ã¥r CQ zones per year CQ-zoner per Ã¥r QSO per band QSO per bÃ¥nd QSO per mode QSO per tilstand QSO per DXCC QSO per DXCC QSO per Continent QSO per kontinent QSO per hour QSO per time QSO per month QSO per mÃ¥ned Worked / Confirmed status Bearbejdet / bekræftet status Worked / Sent status Bearbejdet / sendt-status Sent / Confirmed status Sendt / Bekræftet status Satellite grid status Satellite DXCC status Grids per band status DXCC per band status StatsCQZPerYearBarChartWidget CQ Zones per year CQ-zoner per Ã¥r Reading data ... Læser data ... Abort reading Afbryd læsning CQ zones CQ-zoner CQ zones per year CQ-zoner per Ã¥r Reading data ... Læser data ... Years: %1/%2 Ã…r: %1/%2 StatsDXCCOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Nummer Callsign Kaldesignal Date Dato Band BÃ¥nd Mode Tilstand DXCC DXCC Satellite Satellit Confirmed Bekræftet No Nej StatsEntitiesPerYearBarChartWidget Chart title Diagramtitel Reading data ... Læser data ... Abort reading Afbryd læsning DXCC Entities DXCC-elementer DXCC Entities per year DXCC-elementer per Ã¥r Reading data ... Læser data ... Entities: Elementer: StatsFieldPerBandWidget All Alle Mode: Band BÃ¥nd Worked Bearbejdet Confirmed Bekræftet StatsGridsOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Nummer Callsign Kaldesignal Date Dato Band BÃ¥nd Mode Tilstand Grid Satellite Satellit Confirmed Bekræftet No Nej StatsQSOsPerBandBarChartWidget QSOs per band QSO'er per bÃ¥nd Reading data ... Læser data ... Abort reading Afbryd læsning Bands BÃ¥nd QSOs per band distribution Reading data ... Læser data ... Bands: BÃ¥nd: StatsQSOsPerContinentBarChartWidget QSOs per continent QSO'er per kontinent Reading data ... Læser data ... Abort reading Afbryd læsning Continents Kontinenter Reading data ... Læser data ... Hours: Timer: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC QSO'er per DSCC Reading data ... Læser data ... Abort reading Afbryd læsning Reading data... Læser data ... DXCC DXCC Top ten DXCC per QSO Top ti DXCC per QSO StatsQSOsPerHourBarChartWidget QSOs per hour QSO'er per time Reading data ... Læser data ... Abort reading Afbryd læsning Hours Timer QSOs at hour QSO'er per time Reading data ... Læser data ... Hours: Timer: StatsQSOsPerModeBarChartWidget QSOs per mode QSO'er til tilstand Reading data ... Læser data ... Abort reading Afbryd læsning Modes Tilstande QSOs per mode distribution Reading data ... Læser data ... Modes: Tilstande: StatsQSOsPerMonthBarChartWidget QSOs per month QSO'er per mÃ¥ned Reading data ... Læser data ... Abort reading Afbryd læsning Jan Jan Feb Feb Mar Mar Apr Apr May Maj Jun Jun Jul Jul Sep Sep Oct Okt Nov Nov Dec Dec Aug Aug Months MÃ¥neder QSOs at Month QSO'er per mÃ¥ned Reading data ... Læser data ... Months: MÃ¥neder: StatsQSOsPerYearBarChartWidget Reading data ... Læser data ... Abort reading Afbryd læsning QSOs QSO'er QSOs per year QSO'er per Ã¥r Reading data ... Læser data ... QSO: %1/%2 QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Sendt - %1 Confirmed - %2 Bekræftet - %2 Sent / Confirmed status Sendt / Bekræftet status StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Bearbejdet, ikke bekræftet - %1 Confirmed - %2 Bekræftet - %2 Worked / Confirmed status Bearbejdet / bekræftet status StatsWorkedSentPieChartWidget Worked - %1 Bearbejdet - %1 Sent - %2 Sendt - %2 Worked / Sent status Bearbejdet / sendt-status TipsDialog KLog tips Next Previous <b>Tip #1:</b><br>Do you know...<br>You can use <a href="#ToolsFillInQSO">Tools->Fill in QSO data</a> to automatically read the full log to fill the DXCC, CQ, ITU zones and continent? Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in QSO data <b>Tip #3:</b><br>Do you know...<br>You can use <a href="#ToolsFindQSO2QSL">Tools->QSL tools...->Find QSO to QSL</a> to look for all those QSO that you should send your QSL because you still need to confirm that DXCC and you have still not send your QSL card? Translator: Please make sure that the name of the link is coherent with the menu Tools->QSL tools...->Find QSO to QSL <b>Tip #2:</b><br>Do you know...<br>You can find the QSLs that you still need to send with <a href="#ToolsSendPendingQSL">Tools->QSL tools...->Find My-QSLs pending to send</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Requested</i>. Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in DXCC data <b>Tip #4:</b><br>Do you know...<br>You can enter a '*' in the search box, in the search window to search for all the QSOs done with one specific station callsign? Translator: Please make sure that the name of the link is coherent with the menu File->Export Requested QSL to ADIF... <b>Tip #5:</b><br>Do you know...<br>You can find the file containing all your log and other information in the logbook.dat file and the klogrc file, containing the KLog config file in the KLog folder by opening the <a href="#FileOpenKLogFolder">File->KLog folder</a> menu? <b>Tip #6:</b><br>Do you know...<br>You can upload your QSO marked as queued to LoTW via TQSL with <a href="#ToolsUploadLoTW">Tools->LoTW tools ...->Sends the log to LoTW calling TQSL.</a> ?<br><br>You have to configure TQSL in the preferences to be able to use this functionality. Translator: Please make sure that the name of the link is coherent with the menu File->KLog folder <b>Tip #7:</b><br>Do you know...<br>You can see the QSO that confirms one specific DXCC entity in one specific band by poiting your mouse over that band in the DXCC widget? Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find My-QSLs pending to send <b>Tip #8:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceivePendingQSL">Tools->QSL tools...->Find DX-QSLs pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Sent</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find DX-QSLs pending to receive <b>Tip #9:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceiveRecPendingQSL">Tools->QSL tools...->Find requested pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Rec marked as <i>Requested</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find requested pending to receive <b>Tip #10:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/klogchat>English KLog Telegram group</a> to discuss about KLog in English? <b>Tip #11:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/KLogES>Spanish Telegram group</a> to discuss about KLog in Spanish? <b>Tip #12:</b><br>Do you know...<br>You can subscribe to <a href=https://groups.io/g/klog>KLog mailing list</a> to discuss via email about KLog in English? <b>Tip #13:</b><br>Do you know...<br>You can <a href=https://twitter.com/_ea4k>follow EA4K on twitter</a> to get updates about KLog? <b>Tip #14:</b><br>Do you know...<br>You can write your own <a href=https://www.eham.net/reviews/detail/3118>review in eHam.net about KLog</a> to help other users to decide to use KLog? <b>Tip #15:</b><br>Do you know...<br>You can join the development team by simply <a href=https://www.klog.xyz/contact>Contacting us</a>? <b>Tip #16:</b><br>Do you know...<br>That there are many ways to contribute to KLog and some of them are listed in the <a href=https://www.klog.xyz/contrib>KLog Contribute</a> page? <b>Tip #17:</b><br>Do you know...<br>You can support translating KLog into your language? Please check <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a> page. <b>Tip #18:</b><br>Do you know...<br>You can double-click on an entity name in the DXCC table and all the QSOs with that DXCC Entity will be shown in the search box? <b>Tip #19:</b><br>Do you know...<br>You can right-click on a QSO and select <i>Check in QRZ.com</i> to check that callsign in QRZ.com? UpdateSatsData Reading Satellites data file... Læser satellitdatafil ... Abort reading Om læsning The Satellites information has been updated. Satellitinformationen er blevet opdateret. Open File Ã…bn fil Sat Data Sat-data UpdateSettings KLog - Settings update The settings system has been changed and KLog will update your settings file. World Entity Entitet Continent Kontinent Reading cty.csv... Læser cty.csv ... Abort reading Afbryd læsning eLogClubLog Host not found! Vært blev ikke fundet! Timeout error! Tidsudløbsfejl! KLog - ClubLog KLog - ClubLog Undefined error... Fejl er ikke defineret ... Undefined error number (#%1)... It seems to be a CREDENTIALS ERROR; check your email and password. It seems that your ClubLog credentials are not correct. Please check your credentials in the setup. ClubLog uploads will be disabled. QSO dupe or not existing (#%1)... We have received an undefined error from Clublog (%1) This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO. Please check your config in the setup and contact the KLog development team if you can't fix it. ClubLog uploads will be disabled. Callsign missing Kaldesignal mangler Invalid callsign Ugyldig kaldesignal Skipping SWL callsign Udelader SWL-kaldesignal Callsign is your own call Kaldesignal er dit eget kald Invalid callsign with no DXCC mapping Ugyldigt kaldesignal uden DXCC-oversættelse Updated QSO Opdateret QSO Invalid ADIF record Ugyldig ADIF-post Missing ADIF record Manglende ADIF-post Test mode - parameters ok, no action taken Testtilstand - parametre o.k., ingen handling taget Excessive API Usage Overdreven API-forbrug Internal Error Intern fejl Rejected Afvist QSO Duplicate QSO dublet QSO Modified QSO ændret Missing Login Manglende logind QSO OK QSO OK Upload denied Overførsel afvist No callsign selected Inter kaldesignal valgt No match found Intet match fundet Dropped QSO Droppet QSO OK O.k. Login rejected Logind afvist Rejected: Callsign is your own call Afvist: Kaldesignal er dit eget kald eLogQrzLog Host not found! Vært blev ikke fundet! Timeout error! Tidsudløbsfejl! Undefined error number (#%1) We have received the following error from QRZ.com (%1) You are not subscribed to QRZ.com. Not valid KEY found Please configure your QRZ.com API key. You will find it in your QRZ.com Logbook settings webpage. You need a QRZ.com subscription to use this feature. KLog - QRZ.com password needed Please enter your QRZ.com password: KLog - QRZ.com Callsign missing Kaldesignal mangler eQSLUtilities Host not found! Vært blev ikke fundet! Timeout error! Tidsudløbsfejl! Undefined error number (#%1)... eQSL Error: User or password incorrect eQSL Warning: At least one of the uplodaded QSOs is duplicated. eQSL: All the QSOs were properly uploaded. KLog - eQSL.cc password needed Please enter your eQSL.cc password: KLog - eQSL eQSL has sent the following message: %1 We have received an undefined error from eQSL (%1) Please check your config in the setup and contact the KLog development team if you can't fix it. eQSL uploads will be disabled. klog-2.3.3/translations/klog_en.ts0000644000015700001710000121431514542412415017053 0ustar jenkinsjenkins AboutDialog About KLog By KLog is a free logbook for hamradio operators. Please be aware that this is a development release and it may contain many bugs.<br>Backup your data before using this software! Since 0.6.2, KLog has been fully rewritten to provide a cross-platform application that runs on all major operating systems (Linux, macOS and Windows) and to support new functionality. Please provide your review in KLog's eHam review page: Find more information and the latest release at Author today Main developer KLog is developed by a very small team and you are invited to join! If you want to provide support you are welcome to join the <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog development mailing list</a>! You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Authors Translators bring KLog into your language. They are really an important part of the KLog development team. If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://lists.nongnu.org/mailman/listinfo/klog-devel">KLog development mailing list</a>! Translators Privacy advisory KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account users' needs. At present, the data that is provided is the following: Callsign KLog version Operating system Be aware that you can enable/disable this feature from the Misc tab in the Setup page. KLog Privacy AdifLoTWExportWidget Select the Station Callsign that you want to use to upload the log. Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign. Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign. Station callsign Start date End date Ok Cancel DX Date/Time Band Mode Not defined All QSOs: KLog - QSOs to be uploaded to LoTW. This table shows the QSOs that will be sent to LoTW. KLog - QSOs to be uploaded to ClubLog. This table shows the QSOs that will be sent to ClubLog. KLog - QSOs to be uploaded to eQSL.cc. This table shows the QSOs that will be sent to eQSL.cc. KLog - QSOs to be uploaded to QRZ.com. This table shows the QSOs that will be sent to QRZ.com. This table shows the QSOs that will be exported to ADIF. AwardsWidget Recalculate Click to recalculate the award status. Select the year you want to check. QSOs DXCC CQ Award Confirmed Worked WAZ Score Annual Number of confirmed DXCC entities. Number of worked DXCC entities. Number of confirmed WAZ zones. Number of worked WAZ zones. Number of confirmed QSOs. Number of worked QSOs. Number of QSOs worked in the selected year. Number of DXCCs worked in the selected year. Number of CQ Zones worked in the selected year. Score for the DXMarathon in the selected year. DX-Marathon CTYPage Country data download KLog needs country data... &Download &Ignore Country data needed KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do. Click on Download to download now. KLog I can't find the host. Please check your network and try again Do you want to try again? DXCCStatusWidget Update Prefix Entity Pref: CQ: ITU: Beam: Entity not worked in this band. DXClusterWidget Click on Connect to connect to the DX-Cluster server Connect Clear Click on connect to connect to the DX-Cluster Trying to connect to the server KLog DXCluster The host was not found. Please check: - your network connection; - the host name and port settings. The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. The following error occurred: %1. Connected to server KLog message Enter your callsign to connect to the cluster: Enter your password to connect to the cluster: (Just hit enter for no password) Disconnect Not logged on, you may need to enter your callsign again. Enter here the commands to be sent to the DX-Cluster server. Connection closed by the server Click on Connect to connect to the DX-Cluster server. Send It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! DataProxy_SQLite Software version in DB is null Query didn't failed Aircraft Scatter Common term in hamradio, do not translate if not sure Aurora Aurora-E Back scatter Common term in hamradio, do not translate if not sure Earth-Moon-Earth Sporadic E Field Aligned Irregularities Common term in hamradio, do not translate if not sure F2 Reflection Common term in hamradio, do not translate if not sure Internet-assisted Ionoscatter Common term in hamradio, do not translate if not sure Meteor scatter Common term in hamradio, do not translate if not sure Terrestrial or atmospheric repeater or transponder Rain scatter Common term in hamradio, do not translate if not sure Satellite Trans-equatorial Common term in hamradio, do not translate if not sure Tropospheric ducting Common term in hamradio, do not translate if not sure Yes No Requested Ignore/Invalid Validated Queued Uploaded Do not upload Modified Bureau Common term in hamradio, do not translate if not sure Direct Electronic Manager Common term in hamradio, do not translate if not sure KLog DXCC All QSOs have been updated with a DXCC and the Continent. KLog - Invalid call detected An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported ADIF record? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. DownLoadCTY Download of cty.csv failed with the following error code: Download of cty.csv done. There is already a cty.csv file in the folder but it will be replaced with the new one. Could not open %1 for writing FileAwardManager Open Award file Award files (*.awa) Award file not opened KLog was not able to read the award file It was not possible to open the file %1 for reading. AWA wrong format The AWA file does not have the right format AWA file does not have an <EOH> field KLog - %1 FileManager KLog - Error The selected log does not exist, please check it again. The selected callsign (%1) is not valid, please check it again to export the log. The file %1 can't be opened. There are no QSOs pending to be exported with that station callsign. Writing ADIF file... Abort writing Export Exporting ADIF file... QSO: %1 / %2 KLog - User cancelled You have canceled the file export. The file will be removed and no data will be exported. Do you still want to cancel? Export progress Writing ADIF file... QSO: KLog - File not opened It was not possible to open the file %1 for reading. KLog was not able to read the LoTW file Processing LoTW ADIF file... Abort processing LoTW reading KLog - Add new QSOs? Do you want to add non existing QSOs to your local log? There are some QSOs in the LoTW log that are not in your local log. Processing LoTW ADIF file...... QSO: %1 / %2 You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated. Reading LoTW file... Abort reading Importing LoTW ADIF file... QSO: You have canceled the file import. The file will be removed and no data will be imported. KLog - Log selection There is more than one log in this logfile. All logs will be imported into the current log. Do you want to continue? Reading ADIF file... Do you want to add dupe QSOs to your local log? There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date. Importing ADIF file... KLog - Duplicated QSOs It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) This QSO is not including the minimum data to consider a QSO as valid! Please edit the ADIF file and make sure that it include at least: and This QSO had: - The band missing and the following call: - The mode missing and the following call: - The date missing and the following call: - The time missing and the following call: Do you want to continue with the current file? KLog: Not all required data found! Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information. Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. If you select NO, maybe the QSO will not be imported. KLog: No RST TX found! Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. KLog: No RST RX found! KLog - No Station callsign entered. KLog - Apply to all QSOs in this log? KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO with %1 on %2: KLog - QSO without Station Callsign KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO on %1: KLog - Don't ask again Do you want to reuse your answer? KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again. <ul><li>Date/Time:</i> %1</li><li>Callsign: %2</li><li>Band: %3</li><li>Mode: %4</li></ul> KLog - QSO not found Do you want to add this QSO to the log?: We have found a QSO coming from LoTW that is not in your local log. Do you want KLog to add this QSO to the log? KLog - Invalid call detected An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported log file? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log file? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. You can, however, edit the ADIF file once the export process is finished. InfoWidget 10M 15M 20M 40M 80M 160M 2M 6M 12M 17M 30M 70CM Continent Prefix CQ ITU Short Path Long Path Deg Miles Km IntroPage Welcome to KLog! Welcome to KLog! - brought to you under the terms of the GPL! Welcome to KLog This looks like it's the first time you've run KLog on this computer. KLog is a free hamradio logging program that can run on Linux, macOS, and Windows. It is designed to provide general purpose DX, and contest logging. It supports QSL management, import and export of ADIF and Cabrillo file formats and many other features... Before you can start using KLog, you will be asked to: Acknowledge to the terms of the license. Download the DX entities information. Enter your callsign, CQ zone, etc. and main configuration. Enjoy KLog and contact the development team if you have any suggestions! LicPage KLog License information Welcome to KLog!- brought to you under the terms of the GPL! Acknowledge Be aware that KLog is free software. LoTWUtilities Double click on the date that you want to use as the start date for downloading QSOs. KLog - LoTW password needed Please enter your LoTW password: KLog - LoTW Station callsign There is not a single QSO in the log with that station callsign. Are you sure that you want to use that station callsign (%1)? KLog - LoTW File already exists There is a file already existing with the name that will be used. The file %1 already exist. Do you want to overwrite? KLog - LoTW Can't write the file KLog was not able to save the file %1. Error returned: %2 The file %1 already exists. Downloading data to file: %1. KLog - LoTW download KLog - LoTW Start date selection This is the first date of a QSO with the callsign %1 in this log If you think that in LoTW you may have previous QSOs, answer No. Do you want to used this date (%1) as start date? KLog - LoTW Download error There was an error (%1) while downloading the file from LoTW. The downloading error details are: %1 KLog - LoTW Redirection found The remote server redirected our connection to %1 Do you want to follow the redirection? KLog - LoTW File not found KLog can't find the downloaded file. It was not possible for find the file %1 that has been just downloaded. KLog - LoTW user/password error LoTW server did not recognized your user/password Check your user and password and ensure your are using the right one before trying again. KLog - LoTW No QSOs LoTW sent no QSOs It seems that LoTW has no QSO with the Station Callsign you are using (%1). KLog - LoTW Unknown error KLog can't recognize the file that has been downloaded from LoTW. Try again and send the downloaded file (%1) to the KLog developer for analysis. KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data? Now KLog will process the downloaded QSO and update your local log. LogModel Date Call Band Mode RSTtx RSTrx Comment LogWindow QSL Send QSL Rcvd &Delete Delete a QSO &Edit QSO Edit this QSO Via &bureau Send this QSL via bureau D&irect Send this QSL via direct Via bureau QSL &received via bureau Direct QSL received via direc&t Check in QRZ.com Check this callsign in QRZ.com Check in DXHeat.com Check this callsign in DXHeat.com Delete selected QSOs Delete the selected QSOs Export to ADIF Export the selected QSOs to an ADIF file. Upload to LoTW Upload the selected QSOs to LoTW Upload to ClubLog Upload the selected QSOs to ClubLog Upload to eQSL.cc Upload the selected QSOs to eQSL.cc Send these QSLs via bureau Send these QSLs via direct QSLs received via bureau QSLs received via direc&t Select none Remove all selections Select all Select all the QSOs MainQSOEntryWidget &Add &Clear Callsign of the QSO. Band of the QSO. Mode of the QSO. Date of the QSO. Time of the QSO. Add the QSO to the log. Clears the QSO entry. KLog will show real time if enabled. Callsign &Modify DUPE Translator: DUPE is a common world for hams. Do not translate of not sure MainWindow Check always the current callsign in QRZ.com KLog - File not open It was not possible to open the debug file for writing. No debug log will be saved! Status bar ... DX Entity Starting KLog &Log Window Upload the queued QSOs to LoTW Watts MHz Split Translator: Split is a common hamradio term. Do not translate unless you are sure. KLog CTY.dat update KLog needs to update the Entities database. You can update the entities database in Tools->Update cty.csv Do you want to do it now? It seems that you have never done a backup or exported your log to ADIF. It seems that the latest backup you did is older than one month. Log backup recommended! It is a good practice to backup your full log regularly to avoid loosing data in case of a problem. Once you export your log to an ADIF file, you should copy that file to a safe place, like an USB drive, cloud drive, another computer, ... KLog will remind you to backup on a monthly basis. KLog backup The backup was done successfully KLog will remind you to backup your data again in aprox one month. The backup was not properly done. It is recommended to backup your data periodically to prevent lose or corruption of your log. KLog new version detected! It seems that you are running this version of KLog for the first time. The setup will be open to allow you to do any new setup you may need. Ready KLog - %1 - QSOs: %2 - %3 KLog - %1 - QSOs: %2 KLog KLog - Unexpected error An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: KLog - Not valid call The callsign %1 is not a valid call. Do you really want to add this callsign to the log? Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. KLog - Select correct entity You have selected an entity: that is different from the KLog proposed entity: Click on the prefix of the correct entity or Cancel to edit the QSO again. KLog - Not valid callsign The callsign %1 is not a valid callsign. Do you really want to add this callsign to the log? No DXCC None Click on the prefix of the right entity or Cancel to correct. Save ADIF File You have requested to delete several QSOs This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. Are you sure? You have requested to delete the QSO with: %1 KLog ClubLog error The ClubLog upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 KLog ClubLog Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? KLog - ClubLog There was an error while updating to Yes the ClubLog QSO upload information. The ClubLog upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The file has been removed. The file has not been removed. It seems that there was something that prevented KLog from removing the file You can remove it manually. KLog eQSL error The eQSL upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1 KLog eQSL Do you want to mark as Uploaded all the QSOs uploaded to eQSL? KLog - eQSL There was an error while updating to Yes the eQSL QSO upload information. The eQSL upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? KLog QRZ.com error The QRZ.com upload process has finished with an error and the log was possibly not uploaded. KLog QRZ.com Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? KLog - QRZ.com There was an error while updating to Yes the QRZ.com QSO upload information. The QRZ.com upload process has finished successfully Call not found in QRZ.com KLog - QRZ.com error KLog has received an error from QRZ.com. KLog %1 You need to activate the %1 service in the eLog preferences. KLog - Exit Do you really want to exit KLog? The logfile has been modified. Do you want to save your changes? KLog ADIF export It is important to export to ADIF and save a copy as a backup. Saving the log was done successfully. The ADIF export was not properly done. &File &Import from ADIF ... Import an ADIF file into the current log. Export to ADIF ... Export the current log to an ADIF logfile. Export all logs to ADIF ... Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. &Print Log ... Print your log. KLog folder Opens the data folder of KLog. E&xit &Tools Fill in QSO data Go through the log reusing previous QSOs to fill missing information in other QSOs. QSL tools ... Find QSO to QSL Shows QSOs for which you should send your QSL and request the DX QSL. Find My-QSLs pending to send Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Find DX-QSLs pending to receive Shows DX-QSLs for which requests or QSLs have been sent with no answer. Find requested pending to receive Shows the DX-QSLs that have been requested. LoTW tools ... Queue all QSLs from this log to be sent Mark all non-sent QSOs in this log as queued to be uploaded. Queue all QSLs to be sent Put all the non-sent QSOs in the queue to be uploaded. Mark all queued QSOs from this log as sent Mark all queued QSOs in this log as sent to LoTW. Mark all queued QSOs as sent Mark all queued QSOs as sent to LoTW. Download from LoTW ... Download the full log from LoTW ... ClubLog tools ... Queue all the QSOs to be uploaded Upload the queued QSOs to ClubLog ... eQSL tools ... Upload the queued QSOs to eQSL.cc ... QRZ.com tools ... Check the current callsign in QRZ.com Queue all the QSO to be uploaded Upload the queued QSOs to QRZ.com ... Update cty.csv For updated DX-Entity data, update cty.csv. Update Satellite Data Stats Show the statistics of your radio activity. Setup Setup ... &Help &Tips ... &Debug ... &About ... About Qt ... Check updates ... KLog LoTW All pending QSOs of this log has been marked as queued for LoTW! Now you can go to the File menu to export the LoTW ADIF file and upload it to LoTW. There was a problem to mark all pending QSOs of this log as queued for LoTW! Your log has been updated with the LoTW downloaded QSOs. KLog has updated %1 QSOs from LoTW. Your log has not been updated. No QSO was updated with the data coming from LoTW. This may be because of errors in the logfile or simply because your log was already updated. All pending QSOs has been marked as queued for LoTW! KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. TQSL finished with no error. Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded. Error #2: Upload was rejected by LoTW, please check your data. Error #3: The TQSL server returned an unexpected response. Error #4: There was a TQSL error. Error #5: There was a TQSLLib error. Error #6: It was not possible to open the input file. Error #7: It was not possible to open the ouput file. Error #8: No QSOs were processed since some QSOs were duplicates or out of date range. Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range. Error #10: Command syntax error. KLog sent a bad syntax command. Error #11: LoTW Connection error (no network or LoTW is unreachable). Error #00: Unexpected error. Please contact the development team. The log that you have selected contains more than just one station callsign. Please select the station callsign you want to mark as sent to LoTW: Station Callsign: Define Station Callsign You have selected no callsign. KLog will mark QSOs without a station callsign defined and those with the callsign you are entering here. Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: KLog - No station selected No station callsign has been selected and therefore no log will be marked Do you really want to mark ALL these QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to LoTW All queued QSOs of this log has been marked as sent for LoTW! There was a problem to mark all queued QSOs of this log as sent for LoTW! All queued QSOs has been marked as sent to LoTW! There was a problem to mark all queued QSOs of this log as sent to LoTW! About ... KLog update checking result Congratulations! You already have the latest version. You can find the KLog data folder here: start UDP Server error The UDP server failed to %1. start or stop stop It seems that there are no QSOs in the database. If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. Sends the log to LoTW calling TQSL. This function is disabled. Go to the Setup->LoTW tab to enable it. TX Frequency in MHz. RX Frequency in MHz. Power used by the contacted station. Logging operator's callsign. Callsign used over the air. Name of the contacted operator. QTH of the contacted station. Locator of the contacted station. TX RST. RX RST. Status of the DX entity. Name of the DX entity. Name QTH DX Locator Power(rx) RST(tx) RST(rx) Freq TX Freq RX QSO QSL eQSL Comment Others My Data Satellite Info Awards Search Log DX-Cluster DXCC No QSOs have been exported to ADIF. KLog has exported %1 QSOs to the ADIF file: %2 KLog - LoTW You need to select one station callsign to be able to send your log to LoTW. If you uploaded any QSO to LoTW while you were using TQSL you can now mark them as sent in KLog. Do you want to mark as Sent all the QSOs uploaded to LoTW? There was an error while updating to Yes the LoTW QSL sent information. The LoTW upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? You need to select one station callsign to be able to send your log to ClubLog. Do you want to add this QSOs to your ClubLog existing log? If you don't agree, this upload will overwrite your current ClubLog existing log. You need to select one station callsign to be able to send your log to eQSL.cc. KLog - Select the Station Callsign. Select the Station Callsign to use when quering LoTW: Please check the LoTW setup You have not defined a LoTW user or a proper Station Callsign. Open the LoTW tab in the Setup and configure your LoTW connection. Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to ClubLog The log is ready to be uploaded to ClubLog. All the QSOs in this log has been marked as Modified in the ClubLog status field KLog could not mark the full log to be sent to ClubLog Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers. Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to eQSL The log is ready to be uploaded to eQSL.cc. All the QSOs in this log has been marked as Modified in the eQSL.cc status field KLog could not mark the full log to be sent to eQSL KLog QRZ.COM Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to QRZ.COM The log is ready to be uploaded to QRZ.com. All the QSOs in this log has been marked as Modified in the QRZ.com status field KLog could not mark the full log to be sent to QRZ.com You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. Open File DX QTH locator. DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. - Needed for DXMarathon Filling QSOs ... Abort filling Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: Number Date/Time Callsign RSTtx RSTrx Band Mode Print Log Printing the log ... Abort printing Printing the log... QSO: TX Frequency in MHz. Frequency is not in a hamradio band! RX Frequency in MHz. Frequency is not in a hamradio band! KLog QSO received The following QSO data has been received from WSJT-X to be logged: Freq Time On Time Off RST TX RST RX DX-Grid Local-Grid Station Callsign Operator Callsign KLog - WSJTX Dupe QSO This QSO seems to be duplicated. Do you want to save or discard it? Duplicated QSOs have to match another exiting QSO with the same call, band, mode, date and time, taking into account the period that can be defined in the settings. QSO logged from WSJT-X: KLog - Non-supported mode A new mode not supported by KLog has been received from an external program or radio: If the received mode is correct, please contact KLog development team and request support for that mode Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) KLog - Duplicated satellite A duplicated satellite has been detected in the file and will not be imported. Please check the satellite information file and ensure it is properly populated. Now you will see a more detailed error that can be used for debugging... An unexpected error ocurred!! If the problem persists, please contact the developers for analysis: Error in function Error code Error text Failed query Recommendation: Periodically export your data to ADIF to prevent a potential data loss. KLog - Show errors Do you want to keep showing errors? MainWindowInputComment Comment Add a comment for this QSO. Keep this data Data entered in this tab will be copied into the next QSO. MainWindowInputEQSL Date of the ClubLog upload. Date of the QRZ.com upload. Date of the eQSL sending. Date of the eQSL reception. Date of the LoTW sending. Date of the LoTW reception. Status on ClubLog. Status on QRZ.com. Status of the eQSL sending. Status of the eQSL reception. Status of the LoTW sending. Status of the LoTW reception. ClubLog QRZ.com eQSL Sent eQSL Rec LoTW Sent LoTW Rec MainWindowInputOthers Primary Div Secondary Div IOTA Entity Propagation mode Keep propagation mode Select the primary division for this QSO. Select the secondary division for this QSO. Select the entity for this QSO. Select the propagation mode for this QSO. Select the IOTA continent for this QSO. Select the IOTA reference number for this QSO. Keeps the same propagation mode for next QSO. Not Identified Not - Not Identified MainWindowInputQSL QSL Sent QSL Rec QSL Via QSL Msg Status of the QSL sending. Status of the QSL reception. QSL sending information. QSL reception information. Date of the QSL sending. Date of the QSL reception. Message of the QSL. QSL via information. MainWindowMyDataTab Watts Keep this data Data entered in this tab will be copied into the next QSO. Power used for the QSO in watts. Logging operator's callsign. Callsign used over the air. My QTH locator. Power Operator callsign Station Callsign My Locator My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. MainWindowSatTab Keep this data Data entered in this tab will be copied into the next QSO. Other - Sat not in the list Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Satellite mode used. Select the satellite you are using. UpLink band. DownLink band. Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. UpLink DownLink Satellite Mode DX Locator Other MHz Locator of the DX station. Format should be Maidenhead like IN70AA up to 10 characters. Not Sat QSO KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. The satellite you have in your QSO is: Please be aware that the satellite name will not be saved if it is not in the list, so that information may be lost! RX Frequency in MHz. Frequency is not in a hamradio band! RX Frequency in MHz. TX Frequency in MHz. Frequency is not in a hamradio band! TX Frequency in MHz. QObject New One, work it! Needed, work it! Worked but not confirmed Confirmed Not identified Database Error KLog DB needs to be upgraded. Do you want to upgrade it now? If DB is not upgraded KLog may not work properly. Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea. Do you want to backup your DB now? The backup finished successfully. You can find the backup in this file: %1 The backup was not properly done. You will be sent back to the starting point. KLog - DB can't be updated automatically You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version. The process to upgrade is: - Using an old KLog version export your log to ADIF. - Remove your logbook.dat file from your KLog folder. - Install the new KLog version. - Import your ADIF file. KLog will finish when you click on OK. KLog - DB update KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. KLog: Enter Station callsign Enter the station callsign used in this log Station Callsign All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay. Updating mode information... Abort updating QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? Updating bands information... Updating bands information in %1 status... Progress: Updating mode information in %1 status... Updating information... Updating DXCC and Continent information... Install wizard was canceled before completing... Do you want to remove the KLog dir from your disk? Your KLog dir has been removed Thank you for running KLog! I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. Remember that your KLog dir is on your system... A wrong callsign has been found: %1. Please enter a new callsign or confirm that the current one is a good callsign. An empty callsign has been detected. If it is possible, please enter the right call. KLog - Not valid callsign found SearchWidget &Clear &Export Highlighted &Select All &Search All logs Clear the searches. Export the search result to an ADIF file. Select/Unselect all the QSOs shown. Search in the log. Search in all logs. Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs! Select the Station Callsign used to do this QSO. You have requested to delete the QSO with: %1 Are you sure? All in log Not defined &Clear selection Save File SearchWindow Call Date/Time Band Mode QSL Sent QSL Rcvd Station Callsign ID Date/time Station callsign QSL Send &Delete Delete a QSO &Edit QSO Edit this QSO Via &bureau Send this QSL via bureau D&irect Send this QSL via direct Via bureau QSL &received via bureau Direct QSL received via direc&t Check in QRZ.com Check this callsign in QRZ.com Check in DXHeat.com Check this callsign in DXHeat.com &Request my QSL Mark my QSL as requested Via Direct and mark DX QSL as requested Send this QSL via direct and mark DX QSL as requested Via Bureau and mark DX QSL as requested Send this QSL via bureau and mark DX QSL as requested &Request the QSL Mark the QSL as requested Via bureau and mark my QSL as requested QSL received via bureau and mark my QSL as requested Direc&t and mark as my QSL requested QSL received via direct and mark my QSL as requested Needed QSO to send the QSL My QSL requested to be sent DX QSL pending to be received SetupDialog User data Bands/Modes D&X-Cluster Colors Misc World Editor Logs eLog WSJT-X Satellites HamLib Cancel OK Settings You need to enter at least one log in the Logs tab. Do you want to add one log in the Logs tab or exit KLog? (Click Yes to add a log or No to exit KLog) DX-Cluster World DB has not been moved to new path. Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. You need to enter at least a valid callsign. Go to the User tab and enter valid callsign. You have not selected the kind of log you want. You will be redirected to the Log tab. Please add and select the kind of log you want to use. SetupEntityDialog Entity Name of the Entity. CQ CQ zone. ITU ITU zone. Latitude Longitude of the Entity. Longitude UTC Local time difference to UTC. Main prefix Main prefix of the entity. ARRL ID ARRL ID. Prefixes Comma separated possible prefixes, e.g. EA1, EA2, ... Date of the deletion. Deleted Cancel Ok Entity Dialog SetupPageBandMode Bands Modes SetupPageColors New One Needed in this band Worked in this band Confirmed in this band Default WSJT-X palette Default palette Color when the DXCC is an ATNO (All Time New One). This DXCC was worked before in another band but not in the selected band. It may be needed due to the CQ, ITU, Grid, ... Worked DXCC, but not confirmed in this band. DXCC is confirmed in this band. Default color. Sets a palette of colors similar to the one used in WSJT-X. Sets the default palette. Choose a color SetupPageDxCluster Add Delete Show &HF spots Show V/&UHF spots Show W&ARC spots Show &worked spots Show &confirmed spots Show ANN/&FULL messages Show WW&V messages Show WC&Y messages Save DX Cluster activity Saves all the DX-Cluster activity to a file in the KLog folder DX Spots Others Messages KLog: Add a DXCluster server Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: SetupPageELog ClubLog password ClubLog email Enter the email you used to register in ClubLog. Enter your password ClubLog here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Send QSOs in real time Activate ClubLog Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Starts the ClubLog support in KLog. Activate eQSL.cc Enter your username of eQSL.cc. Enter your password eQSL.cc here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) eQSL.cc password eQSL.cc user ClubLog eQSL.cc QRZ.com Enter the user of your QRZ.com account. You need to be subscribed to QRZ.com to use this service. User Enter your password QRZ.com here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Password Activate QRZ.com Check automatically Check in Qrz.com all Calls as they are entered LogBook Key LogBook Key for QSO uploading. You can get this key in your QRZ.com logbook webpage. Remember that you need a QRZ.com subscription to use this feature. LoTW Upload Download TQSL path Use TQSL LoTW password LoTW user Enter your LoTW user. Enter your password LoTW here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Path to the TQSL software. Enable the LoTW integration with TQSL. You will need to have TQSL installed Select File SetupPageHamLib Activate HamLib Activates the hamlib support that will enable the connection to a radio. Read-Only mode If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio. Radio Select your rig. Defines the interval to poll the radio in msecs. Poll interval Port Select the serial port. Only the serial ports that are detected are shown. Scan Click to identify the serial ports available in your computer. Bauds Select the serial port speed. 5 bits 6 bits 7 bits 8 bits Data bits Select the serial data bits. None Hardware Software XON/XOFF Flow control Select the serial flow control No parity Even Odd Space Mark Parity Select the serial parity. 1 bit 1.5 bits 2 bits Stop bits Select the serial stop bits. SetupPageLogs &New &Edit &Remove Add a new log. Edit the selected log. Remove the selected log. KLog Do you really want to remove this log? All the QSOs from this log will also be deleted... Log has not been removed. (#3) Log has not been removed. (#2) Log has not been removed. (#1) ID Date Station Callsign Operators Comments QSOs The new log could not be created. An error has occurred showing the following error code: KLog - SetupPageLogs SetupPageLogsNew &Date &Station Callsign &Operators Comm&ent &Ok &Cancel Callsign used for this log. Comma separated list of operators: callsign1, callsign2. Start date of this log. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. SetupPageMisc &Imperial system &Log in real time &Time in UTC &Save ADIF on exit Use this &default filename Mark &QSO to send QSL when QSL is received Complete QSO with previous data Show the Station &Callsign used in the search box &Check for new versions automatically &Provide Info for statistics Manage DX-Marathon Activate the application debug log Mark sent eQSL && LoTW in new QSO as queued &Delete always temp ADIF file after uploading QSOs Browse Move DB QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. The search box will also show the callsign on the air to do the QSO. Check if there is a new release of KLog available every time you start KLog. If new version checking is selected, KLog will send the developer your callsign, KLog version and Operating system to help in improving KLog. Check it for Imperial system (Miles instead of Kilometers). Select to use real time. Select to use UTC time. Select if you want to save to ADIF on exit. Select to use the following name for the logfile without being asked for it again. Complete the current QSO with previous QSO data. Select if you want to manage DX-Marathon. This is the default file where ADIF data will be saved. This is the directory where the database (logbook.dat) will be saved. Click to change the default ADIF file. Click to change the path of the database. Click to move the DB to the new directory. Activates the application debug log. This may be useful if something is not working as expected. A debug file will be created in the KLog directory. Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default. Delete Always the adif file created after uploading QSOs Dupe time range: Open File Select Directory This is the directory where DB (logbook.dat) will be saved. Please specify an existing directory where the database (logbook.dat) will be saved. KLog - Move DB File moved File copied File already exist. The destination file already exist and KLog will not replace it. Please remove the file from the destination folder before moving the file with KLog to make sure KLog can copy the file. File NOT copied The file was not copied due to an unknown problem. The target directory does not exist. Please select an existing directory. SetupPageSats &New &Edit &Remove &Import E&xport Add a new satellite. Edit the selected satellite. Remove the selected satellite. Import a satellites file. It will replace the satellites you have in the current list. Export your current satellites to a file. Select the sat you want to open. KLog Do you really want to remove this satellite? This satellite will no be longer available to be selected ... Sat has not been removed. (#3) Sat has not been removed. (#2) Sat has not been removed. (#1) ID Short Name Uplink Downlink Modes An error has occurred showing the following error code: KLog - SetupPageSats Open Satellites File KLog warning An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Please check the format or contact the developer for analysis with the error code: Save Satellites File SetupPageSatsNew Short name Sat name UpLink DownLink Modes &Ok &Cancel Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Enter the name of the satellite. Enter the uplink frequencies in this format: 144.300 Enter the downlink frequencies in this format: 144.300 Enter the modes in this format: USB Some of the data you have entered is not correct; the satellite can't be added. SetupPageSubdivisionNew &Date &Station Callsign &Operators Comm&ent &Ok &Cancel Callsign used for this log. Comma separated list of operators: callsign1, callsign2. Start date of this log. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. You need to enter a valid Call in the Station Callsign box. The log will not be opened. SetupPageSubdivisions &Remove Import new Import an AWA file with the subdivision details. Remove the selected references. Select the references you want to open. KLog Do you really want to remove the data of this entity? All the subdivision information for this entity will be deleted... Log has not been removed. (#3) Log has not been removed. (#2) Log has not been removed. (#1) ID Name Short Name CQ Zone ITU Zone Deleted Start Date End Date DXCC An error has occurred showing the following error code: KLog - SetupPageSubdivisions SetupPageUDP Start UDP Server Automatically log QSOs from WSJT-X Allow WSJT-X to send logged QSOs to KLog QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. Update status information from WSJT-X KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...) UDP port number where the UDP Server will listen for packets. Make sure it is the same port that the other programs are sending the data to. Default port is 2237. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. UDP Port Select the interface to listen for UDP datagrams coming from WSJT-X. Network interface QSOs notification timeout (milisecs) Miliseconds that the notification of QSOs received from WSJTX will be shown. SetupPageUserDataPage &Personal data Station &data Enter your name. Enter your address - 1st line. Enter your address - 2nd line. Enter your address - 3rd line. Enter your address - 4th line. Enter your city. Enter your zip code. Enter your province or state. Enter your country. &Name &Address Cit&y &Zip Code Pro&v/State Countr&y Enter your information for rig Enter your information for antenna Enter your power information. &Rig 1 R&ig 2 Ri&g 3 Antenna &1 Antenna &2 Antenna &3 Po&wer Enter the station callsign that will be used for logging. Enter the operators (comma separated if more than one). Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. &Callsign &Operators &CQ Zone &ITU Zone &Locator &Locator (not valid) SetupPageWorldEditor Add Delete Edit Export World Import World Still not implemented. Import a new cty.csv file An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. No entities information file (cty.csv) has been detected in your KLog folder. KLog will not be able to show entities information. Prefix Entity ARRL ID Continent CQ Zone ITU Zone UTC Latitude Longitude Deleted Since Date To Date Open File BigCTY (*.csv) Entities information has been updated. Entities information has not been updated. ShowAdifImportWidget The following QSOs are those QSOs that you have received the LoTW confirmation. Ok DX Date/Time Band Mode ShowErrorDialog KLog Message SoftwareUpdateDialog Ok KLog update Congratulations! Your KLog has been updated. You already have the latest version. StartWizard KLog - The free hamradio logging program Quit Setup Setup is not complete yet. Are you sure you want to quit setup? StatisticsWidget QSO per year DXCC per year CQ zones per year QSO per band QSO per mode QSO per DXCC QSO per Continent QSO per hour QSO per month Worked / Confirmed status Worked / Sent status Sent / Confirmed status Satellite grid status Satellite DXCC status StatsCQZPerYearBarChartWidget CQ Zones per year Reading data ... Abort reading CQ zones CQ zones per year Reading data ... Years: %1/%2 StatsDXCCOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Callsign Date Band Mode DXCC Satellite Confirmed No StatsEntitiesPerYearBarChartWidget Chart title Reading data ... Abort reading DXCC Entities DXCC Entities per year Reading data ... Entities: StatsGridsOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Callsign Date Band Mode Grid Satellite Confirmed No StatsQSOsPerBandBarChartWidget QSOs per band Reading data ... Abort reading Bands QSOs per band distribution Reading data ... Bands: StatsQSOsPerContinentBarChartWidget QSOs per continent Reading data ... Abort reading Continents Reading data ... Hours: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC Reading data ... Abort reading Reading data... DXCC Top ten DXCC per QSO StatsQSOsPerHourBarChartWidget QSOs per hour Reading data ... Abort reading Hours QSOs at hour Reading data ... Hours: StatsQSOsPerModeBarChartWidget QSOs per mode Reading data ... Abort reading Modes QSOs per mode distribution Reading data ... Modes: StatsQSOsPerMonthBarChartWidget QSOs per month Reading data ... Abort reading Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Months QSOs at Month Reading data ... Months: StatsQSOsPerYearBarChartWidget QSOs per year Reading data ... Abort reading QSOs Reading data ... QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Confirmed - %2 Sent / Confirmed status StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Confirmed - %2 Worked / Confirmed status StatsWorkedSentPieChartWidget Worked - %1 Sent - %2 Worked / Sent status TipsDialog KLog tips Next Previous <b>Tip #1:</b><br>Do you know...<br>You can use <a href="#ToolsFillInQSO">Tools->Fill in QSO data</a> to automatically read the full log to fill the DXCC, CQ, ITU zones and continent? Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in QSO data <b>Tip #2:</b><br>Do you know...<br>You can use <a href="#ToolsFillInDXCC">Tools->Fill in DXCC data</a> to automatically read the full log to fill the DXCC QSO data? Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in DXCC data <b>Tip #3:</b><br>Do you know...<br>You can use <a href="#ToolsFindQSO2QSL">Tools->QSL tools...->Find QSO to QSL</a> to look for all those QSO that you should send your QSL because you still need to confirm that DXCC and you have still not send your QSL card? Translator: Please make sure that the name of the link is coherent with the menu Tools->QSL tools...->Find QSO to QSL <b>Tip #4:</b><br>Do you know...<br>You can export your QSO marked as QSL requested with <a href="#FileExportQSLADIFToPrint">File->Export Requested QSL to ADIF...</a> to create an ADIF file that you will be able to import into a QSL tag creation program to print tags for your QSL cards? Translator: Please make sure that the name of the link is coherent with the menu File->Export Requested QSL to ADIF... <b>Tip #5:</b><br>Do you know...<br>You can enter a '*' in the search box, in the search window to search for all the QSOs done with one specific station callsign? <b>Tip #6:</b><br>Do you know...<br>You can find the file containing all your log and other information in the logbook.dat file and the klogrc file, containing the KLog config file in the KLog folder by opening the <a href="#FileOpenKLogFolder">File->KLog folder</a> menu? Translator: Please make sure that the name of the link is coherent with the menu File->KLog folder <b>Tip #7:</b><br>Do you know...<br>You can find the QSLs that you still need to send with <a href="#ToolsSendPendingQSL">Tools->QSL tools...->Find My-QSLs pending to send</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Requested</i>. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find My-QSLs pending to send <b>Tip #8:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceivePendingQSL">Tools->QSL tools...->Find DX-QSLs pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Sent</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find DX-QSLs pending to receive <b>Tip #9:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceiveRecPendingQSL">Tools->QSL tools...->Find requested pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Rec marked as <i>Requested</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find requested pending to receive <b>Tip #10:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/klogchat>English KLog Telegram group</a> to discuss about KLog in English? <b>Tip #11:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/KLogES>Spanish Telegram group</a> to discuss about KLog in Spanish? <b>Tip #12:</b><br>Do you know...<br>You can subscribe to <a href=https://lists.nongnu.org/mailman/listinfo/klog-users>KLog-users mailing list</a> to discuss via email about KLog in English? <b>Tip #13:</b><br>Do you know...<br>You can <a href=https://twitter.com/_ea4k>follow EA4K on twitter</a> to get updates about KLog? <b>Tip #14:</b><br>Do you know...<br>You can write your own <a href=https://www.eham.net/reviews/detail/3118>review in eHam.net about KLog</a> to help other users to decide to use KLog? <b>Tip #15:</b><br>Do you know...<br>You can join the development team by simply <a href=https://www.klog.xyz/contact>Contacting us</a>? <b>Tip #16:</b><br>Do you know...<br>That there are many ways to contribute to KLog and some of them are listed in the <a href=https://www.klog.xyz/contrib>KLog Contribute</a> page? <b>Tip #17:</b><br>Do you know...<br>You can support translating KLog into your language? Please check <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a> page. <b>Tip #18:</b><br>Do you know...<br>You can double-click on an entity name in the DXCC table and all the QSOs with that DXCC Entity will be shown in the search box? <b>Tip #19:</b><br>Do you know...<br>You can right-click on a QSO and select <i>Check in QRZ.com</i> to check that callsign in QRZ.com? <b>Tip #20:</b><br>Do you know...<br>You can see the QSO that confirms one specific DXCC entity in one specific band by poiting your mouse over that band in the DXCC widget? <b>Tip #21:</b><br>Do you know...<br>You can upload your QSO marked as queued to LoTW via TQSL with <a href="#ToolsUploadLoTW">Tools->Upload to LoTW...</a> ?<br><br>You have to configure TQSL in the preferences to be able to use this functionality. Translator: Please make sure that the name of the link is coherent with the menu File->Export ADIF for LoTW... TIP-Default: Text UpdateSatsData Reading Satellites data file... Abort reading The Satellites information has been updated. Open File Sat Data World Entity Continent Reading cty.csv... Abort reading WorldMapWidget World map View Zoom In(25%) Zoom Out(25%) Normal Size Fit to window eLogClubLog Host not found! Timeout error! QSO dupe or not existing (#%1)... KLog - ClubLog We have received an undefined error from Clublog (%1) This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO. Undefined error number (#%1)... Please check your config in the setup and contact the KLog development team if you can't fix it. ClubLog uploads will be disabled. Undefined error... Callsign missing Invalid callsign Skipping SWL callsign Callsign is your own call Invalid callsign with no DXCC mapping Updated QSO Invalid ADIF record Missing ADIF record Test mode - parameters ok, no action taken Excessive API Usage Internal Error Rejected QSO Duplicate QSO Modified Missing Login QSO OK Upload denied No callsign selected No match found Dropped QSO OK Login rejected Rejected: Callsign is your own call eLogQrzLog Host not found! Timeout error! Undefined error number (#%1) KLog - QRZ.com We have received the following error from QRZ.com (%1) Not valid KEY found Please configure your QRZ.com API key. You will find it in your QRZ.com Logbook settings webpage. You need a QRZ.com subscription to use this feature. KLog - QRZ.com password needed Please enter your QRZ.com password: Callsign missing eQSLUtilities KLog - eQSL eQSL has sent the following message: %1 Host not found! Timeout error! Undefined error number (#%1)... We have received an undefined error from eQSL (%1) Please check your config in the setup and contact the KLog development team if you can't fix it. eQSL uploads will be disabled. eQSL Error: User or password incorrect eQSL Warning: At least one of the uplodaded QSOs is duplicated. eQSL: All the QSOs were properly uploaded. KLog - eQSL.cc password needed Please enter your eQSL.cc password: klog-2.3.3/translations/klog_uk.ts0000644000015700001710000151601414542412415017071 0ustar jenkinsjenkins AboutDialog About KLog Про KLog By Від KLog is a free logbook for hamradio operators. KLog - це безкоштовний апаратний журнал Ð´Ð»Ñ Ñ€Ð°Ð´Ñ–Ð¾Ð°Ð¼Ð°Ñ‚Ð¾Ñ€Ñ–Ð². Please be aware that this is a development release and it may contain many bugs.<br>Backup your data before using this software! Будь лаÑка, майте на увазі, Ñ†Ñ Ð²ÐµÑ€ÑÑ–Ñ Ñ‰Ðµ у розробці, вона може міÑтити помилки.<br>Створіть резервну копію Ñвоїх даних, перед викориÑтаннÑм цього програмного забезпеченнÑ! Since 0.6.2, KLog has been fully rewritten to provide a cross-platform application that runs on all major operating systems (GNU/Linux, macOS and Windows) and to support new functionality. Починаючи з верÑÑ–Ñ— 0.6.2, KLog було повніÑтю перепиÑано, щоб забезпечити кроÑ-платформну програму, Ñка працює на вÑÑ–Ñ… оÑновних операційних ÑиÑтемах (GNU/Linux, macOS Ñ– Windows), та підтримувати нові функції. Please provide your review in KLog's eHam review page: Будь лаÑка, надайте Ñвій відгук про KLog, на Ñторінці eHam.net: Find more information and the latest release at Знайдіть більше інформації та найновіший випуÑк на: Author Ðвтор today по Ñьогодні Main developer Головний розробник KLog is developed by a very small team and you are invited to join! KLog розроблÑÑ” дуже невелика команда, Ñ– Ð’Ð°Ñ Ð·Ð°Ð¿Ñ€Ð¾ÑˆÑƒÑŽÑ‚ÑŒ приєднатиÑÑ! If you want to provide support you are welcome to join the <a href="https://groups.io/g/klog">KLog mailing list</a>! Якщо Ви бажаєте надати підтримку, приєднайтеÑÑ Ð´Ð¾ <a href="https://groups.io/g/klog">поштової розÑилки KLog</a>! You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Ви також можете допомогти нам, надіÑлавши звіти про помилки. Ðевеликі внеÑки коду, ідеї чи будь-що, що на вашу думку, може покращити KLog. Authors Ðвтори Translators bring KLog into your language. They are really an important part of the KLog development team. Перекладачі - передають KLog на вашу мову. Вони Ñ” Ñправді, важливою чаÑтиною команди розробників KLog. If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://groups.io/g/klog">KLog mailing list</a>! Якщо KLog вÑе ще не на вашій мові, Ñ– Ви хочете нам допомогти, зв'ÑжітьÑÑ Ð· нами через <a href="https://groups.io/g/klog"> поштову розÑилку KLog</a>! Translators Перекладачі Privacy advisory Щодо конфіденційноÑті KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account users' needs. Розробники KLog включили функцію, Ñка повідомлÑÑ” деÑкі дані кориÑтувача на Ñервер KLog, з єдиною метою, визначити кількіÑть вÑтановлених верÑій, щоб зоÑередити розробку в тому чи іншому напрÑмку з урахуваннÑм потреб кориÑтувачів. At present, the data that is provided is the following: Ðаразі дані, Ñкі надаютьÑÑ, такі: Callsign Кличний KLog version ВерÑÑ–Ñ KLog Operating system Операційна ÑиÑтема Be aware that you can enable/disable this feature from the Misc tab in the Setup page. Майте на увазі, Ви можете увімкнути чи вимкнути цю функцію, на вкладці «Різне» на Ñторінці «ÐалаштуваннÑ». KLog Privacy КонфіденційніÑть AdifLoTWExportWidget Select the Station Callsign that you want to use to upload the log. Виберіть кличний Ñтанції, Ñкий Ви хочете викориÑтовувати Ð´Ð»Ñ Ð½Ð°Ð´ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ. Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign. Виберіть початкову дату Ð´Ð»Ñ ÐµÐºÑпорту QSO. Дата за замовчуваннÑм - дата першого QSO з кличним цієї Ñтанції. Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign. Виберіть кінцеву дату Ð´Ð»Ñ ÐµÐºÑпорту QSO. Дата за замовчуваннÑм - дата оÑтаннього QSO з кличним цієї Ñтанції. Station callsign Кличний Ñтанції My Locator Мій Локатор Start date Початкова дата End date Кінцева дата Ok Cancel СкаÑувати DX Date/Time Дата/Ð§Ð°Ñ Band Діапазон Mode Вид Not defined Ðе визначено ALL Ð’ÑÑ– QSOs: %1/%2 QSO: %1/%2 KLog - QSOs to be uploaded to LoTW. KLog - QSO, Ñкі будуть передані до LoTW. This table shows the QSOs that will be sent to LoTW. Ð¦Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ð¿Ð¾ÐºÐ°Ð·ÑƒÑ” QSO, Ñкі будуть надіÑлані до LoTW. KLog - QSOs to be uploaded to ClubLog. KLog - QSO, Ñкі будуть передані до ClubLog. This table shows the QSOs that will be sent to ClubLog. Ð¦Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ð¿Ð¾ÐºÐ°Ð·ÑƒÑ” QSO, Ñкі будуть надіÑлані до ClubLog. KLog - QSOs to be uploaded to eQSL.cc. KLog - QSO, Ñкі будуть передані до eQSL.cc. This table shows the QSOs that will be sent to eQSL.cc. Ð¦Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ð¿Ð¾ÐºÐ°Ð·ÑƒÑ” QSO, Ñкі будуть надіÑлані до eQSL.cc. KLog - QSOs to be uploaded to QRZ.com. KLog - QSO, Ñкі будуть передані до QRZ.com. This table shows the QSOs that will be sent to QRZ.com. Ð¦Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ð¿Ð¾ÐºÐ°Ð·ÑƒÑ” QSO, Ñкі будуть надіÑлані до QRZ.com. This table shows the QSOs that will be exported to ADIF. Ð¦Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ð¿Ð¾ÐºÐ°Ð·ÑƒÑ” QSO, Ñкі будуть екÑпортовані до ADIF. AwardsWidget Recalculate Перерахувати Click to recalculate the award status. ÐатиÑніть, щоб перерахувати ÑÑ‚Ð°Ñ‚ÑƒÑ Ð´Ð¸Ð¿Ð»Ð¾Ð¼Ñ–Ð². Select the year you want to check. Виберіть рік, Ñкий потрібно перевірити. QSOs QSO DXCC CQ Award Диплом Confirmed Підтверджено Worked Відпрацьовано WAZ Score Оцінка Annual Річних Number of confirmed DXCC entities. КількіÑть підтверджених Ñуб'єктів DXCC. Number of worked DXCC entities. КількіÑть відпрацьованих Ñуб'єктів DXCC. Number of confirmed WAZ zones. КількіÑть підтверджених зон WAZ. Number of worked WAZ zones. КількіÑть відпрацьованих зон WAZ. Number of confirmed QSOs. КількіÑть підтверджених QSO. Number of worked QSOs. КількіÑть відпрацьованих QSO. Number of QSOs worked in the selected year. КількіÑть QSO, відпрацьованих у вибраному році. Number of DXCCs worked in the selected year. КількіÑть DXCC, відпрацьованих у вибраному році. Number of CQ Zones worked in the selected year. КількіÑть CQ зон, відпрацьованих у вибраному році. Score for the DXMarathon in the selected year. Оцінка за DX-Марафон у вибраному році. DX-Marathon DX-Марафон CTYPage Country data download Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… країн KLog needs country data... KLog потребує даних про країни ... &Download &Завантажити &Ignore &Ігнорувати Country data needed Ðеобхідні дані про країни KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. KLog викориÑтовує файл cty.csv з https://www.country-files.com/ Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ— DXCC. You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do. Вам потрібно завантажити файл: cty.csv. Якщо Ви хочете, щоб KLog показував Вам країни, локатор, тощо. Click on Download to download now. ÐатиÑніть «Завантажити», щоб завантажити зараз. KLog I can't find the host. Please check your network and try again Do you want to try again? ХоÑÑ‚ - не знайдено. Будь лаÑка, перевірте вашу мережу та повторіть Ñпробу Ви хочете Ñпробувати ще раз? DXCCStatusWidget Update Оновити It seems that the DXCC status in your database is not updated and KLog can't find any dxcc information. You can try to fix this by updating the log. Схоже ÑÑ‚Ð°Ñ‚ÑƒÑ DXCC, у вашій базі не оновлено. KLog не може знайти жодної інформації про DXCC. Ви можете виправити це, оновивши журнал. Do you want to update your DXCC status? Ви бажаєте оновити Ñвій ÑÑ‚Ð°Ñ‚ÑƒÑ DXCC? Prefix ÐŸÑ€ÐµÑ„Ñ–ÐºÑ Entity Об'єкт Pref: Преф: CQ: ITU: Beam: Entity not worked in this band. Суб'єкт не працював у цьому діапазоні. DXClusterWidget Click on Connect to connect to the DX-Cluster server ÐатиÑніть «ПідключитиÑÑ», щоб підключитиÑÑ Ð´Ð¾ Ñервера DX-КлаÑтер Connect ПідключитиÑÑ Clear ОчиÑтити Check in QRZ.com Перевірити на QRZ.com Check this callsign in QRZ.com Перевірити цей кличний на QRZ.com Click on connect to connect to the DX-Cluster ÐатиÑніть «ПідключитиÑÑ», Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ DX-КлаÑтер Trying to connect to the server ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ Ñервера ... KLog DXCluster The host was not found. Please check: ХоÑÑ‚ не знайдено. Будь лаÑка, перевірте: - your network connection; - the host name and port settings. - Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ мережі; - ім'Ñ Ñ…Ð¾Ñта та параметри порту. The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ - відхилено. ПереконайтеÑÑ, що Ñервер DX-КлаÑтер запущено, а також , що Ñ–Ð¼â€™Ñ Ñ…Ð¾Ñту та параметри порту правильні. The following error occurred: %1. Виникла наÑтупна помилка: %1. Connected to server Підключений до Ñервера KLog message KLog Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Enter your callsign to connect to the cluster: Введіть Ñвій кличний, Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ клаÑтера: Enter your password to connect to the cluster: (Just hit enter for no password) Введіть пароль Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ клаÑтера: (ПроÑто натиÑніть Enter, Ñкщо немає паролÑ) Disconnect ВідключитиÑÑ Not logged on, you may need to enter your callsign again. Enter here the commands to be sent to the DX-Cluster server. Введіть тут команди, Ñкі будуть надіÑлані на Ñервер DX-КлаÑтер. Connection closed by the server Сервер закрив з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Click on Connect to connect to the DX-Cluster server. ÐатиÑніть «ПідключитиÑÑ», Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ Ñервера DX-КлаÑтер. Send ÐадіÑлати It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл, щоб зберегти DX-Споти. Дані з DX-Cluster не буде збережено! DataProxy_SQLite Software version in DB is null ВерÑÑ–Ñ ÐŸÐ— у БД - нульова Query didn't failed Запит не виконано Aircraft Scatter Common term in hamradio, do not translate if not sure Aurora Aurora-E Back scatter Common term in hamradio, do not translate if not sure Earth-Moon-Earth Sporadic E Field Aligned Irregularities Common term in hamradio, do not translate if not sure F2 Reflection Common term in hamradio, do not translate if not sure Internet-assisted З підтримкою Інтернету Ionoscatter Common term in hamradio, do not translate if not sure ІоноÑферне Meteor scatter Common term in hamradio, do not translate if not sure Метеорного розÑÑ–ÑŽÐ²Ð°Ð½Ð½Ñ Terrestrial or atmospheric repeater or transponder Ðаземний або атмоÑферний ретранÑлÑтор чи транÑпондер Rain scatter Common term in hamradio, do not translate if not sure Satellite Супутник Trans-equatorial Common term in hamradio, do not translate if not sure ТранÑ-екваторіальне Tropospheric ducting Common term in hamradio, do not translate if not sure Тропо Yes Так No ÐÑ– Requested Запитано Ignore/Invalid Проігноровано/ÐедійÑне Validated Перевірено Queued ПоÑтавлено у чергу Uploaded Відвантажено Do not upload Ðе відвантажено Modified Модифіковано Bureau Common term in hamradio, do not translate if not sure Бюро Direct Дірект Electronic Електронне Manager Common term in hamradio, do not translate if not sure Менеджер KLog DXCC All QSOs have been updated with a DXCC and the Continent. Ð’ÑÑ– QSO були оновлені, за допомогою DXCC та Континенту. KLog - Invalid call detected KLog - виÑвлено недійÑний кличний An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported ADIF record? ВиÑвлено порожній кличний. Ви вÑе одно хочете екÑпортувати це QSO (натиÑніть «Так») чи видалити поле з екÑпортованого запиÑу ADIF? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log? ВиÑвлено недійÑний кличний %1. Ви хочете екÑпортувати цей кличний (натиÑніть «Так») чи видалити зв'Ñзок з екÑпортованого журналу? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. ЕкÑпорт неправильних кличних може Ñтворити проблеми в програмах, до Ñких Ви потенційно імпортуєте цей файл журналу. Однак це може бути хороший кличний, Ñкий помилково визначено KLog - недійÑним. DownLoadCTY Download of cty.csv failed with the following error code: Помилка Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ cty.csv, з кодом помилки: Download of cty.csv done. Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ cty.csv завершено. There is already a cty.csv file in the folder but it will be replaced with the new one. У папці вже Ñ” файл cty.csv, але його буде замінено на новий. Could not open %1 for writing Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ %1 Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу FileAwardManager Open Award file Відкрити файл диплому Award files (*.awa) Файл диплому (*.awa) Award file not opened Файл диплому - не відкрито KLog was not able to read the award file KLog не зміг прочитати файл диплому It was not possible to open the file %1 for reading. Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл %1 Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ. AWA wrong format AWA - неправильний формат The AWA file does not have the right format Файл AWA має неправильний формат AWA file does not have an <EOH> field Файл AWA немає Ð¿Ð¾Ð»Ñ <EOH> KLog - %1 FileManager KLog - Error KLog - Помилка The selected callsign (%1) is not valid, please check it again to export the log. Вибраний кличний (%1) недійÑний, перевірте його ще раз, щоб екÑпортувати журнал. The selected log does not exist, please check it again. Вибраний журнал не Ñ–Ñнує, перевірте його ще раз. The file %1 can't be opened. Ðе вдаєтьÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл %1. There are no QSOs pending to be exported with that station callsign. Ðемає QSO, що очікують на екÑпорт з цим кличним Ñтанції. Writing ADIF file... Ð—Ð°Ð¿Ð¸Ñ Ñ„Ð°Ð¹Ð»Ñƒ ADIF... Abort writing СкаÑувати Ð·Ð°Ð¿Ð¸Ñ Export ЕкÑпорт Exporting ADIF file... QSO: %1 / %2 ЕкÑпорт файла ADIF... QSO: %1 / %2 KLog - User cancelled KLog - кориÑтувача ÑкаÑовано You have canceled the file export. The file will be removed and no data will be exported. Ви ÑкаÑували екÑпорт файлу. Файл буде видалено, а дані не екÑпортуватимутьÑÑ. Do you still want to cancel? Ви вÑе ще бажаєте ÑкаÑувати? Export progress ÐŸÑ€Ð¾Ð³Ñ€ÐµÑ ÐµÐºÑпорту Writing ADIF file... QSO: Ð—Ð°Ð¿Ð¸Ñ Ñ„Ð°Ð¹Ð»Ñƒ ADIF... QSO: KLog - File not opened KLog - Файл не відкрито It was not possible to open the file %1 for reading. Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл %1 Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ. KLog was not able to read the LoTW file KLog не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл LoTW Processing LoTW ADIF file... Обробка файлу LoTW ADIF... Abort processing СкаÑувати обробку LoTW reading Ð§Ð¸Ñ‚Ð°Ð½Ð½Ñ LoTW KLog - Add new QSOs? KLog - Додати нові QSO? Do you want to add non existing QSOs to your local log? Ви бажаєте додати неіÑнуючі QSO до локального журналу? There are some QSOs in the LoTW log that are not in your local log. У журналі LoTW Ñ” деÑкі QSO, Ñких немає у вашому локальному журналі. Processing LoTW ADIF file...... QSO: %1 / %2 Обробка файлу LoTW ADIF...... QSO: %1 / %2 You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated. Ви ÑкаÑували обробку LoTW. ÐŸÑ€Ð¾Ñ†ÐµÑ Ð±ÑƒÐ´Ðµ зупинено, а ваш журнал, може бути не повніÑтю оновлений. Reading LoTW file... Ð§Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ LoTW... Abort reading СкаÑувати Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Importing LoTW ADIF file... Імпорт файлу LoTW ADIF... QSO: You have canceled the file import. The file will be removed and no data will be imported. Ви ÑкаÑували імпорт файлу. Файл буде видалено, а дані не імпортовані. KLog - Log selection KLog - Вибір журналу There is more than one log in this logfile. У цьому файлі журналу Ñ” більше одного файлу журналу. All logs will be imported into the current log. Ð’ÑÑ– журнали будуть імпортовані до поточного журналу. Do you want to continue? Ви бажаєте продовжити? Reading ADIF file... Ð§Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ ADIF... Do you want to add dupe QSOs to your local log? Бажаєте додати фальшиві QSO до Ñвого локального журналу? There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date. У цьому журналі Ñ” деÑкі QSO, Ñкі можуть бути підробленими, оÑкільки вони мають той Ñамий кличний, діапазон, режим та дуже близьку дату. Importing ADIF file... Імпорт файлу ADIF... KLog - Duplicated QSOs KLog - Дубльовані QSO It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) Схоже, що у файлі ADIF, Ñкий Ви імпортуєте, Ñ” дубльовані QSO. Бажаєте продовжити? (Підроблені QSO не будуть імпортовані) This QSO is not including the minimum data to consider a QSO as valid! Це QSO не міÑтить мінімальних даних Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, щоб вважати його дійÑним! Please edit the ADIF file and make sure that it include at least: Будь лаÑка, відредагуйте файл ADIF та переконайтеÑÑ, що він міÑтить принаймні: and та This QSO had: У цьому QSO: - The band missing and the following call: - ВідÑутній діапазон та наÑтупний кличний: - The mode missing and the following call: - ВідÑутній режим та наÑтупний кличний: - The date missing and the following call: - ВідÑÑƒÑ‚Ð½Ñ Ð´Ð°Ñ‚Ð° та наÑтупний кличний: - The time missing and the following call: - ВідÑÑƒÑ‚Ð½Ñ Ñ‡Ð°Ñ Ñ‚Ð° наÑтупний кличний: Do you want to continue with the current file? Ви бажаєте продовжити з поточним файлом? KLog: Not all required data found! KLog: Ðе вÑÑ– необхідні дані знайдено! Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information. У деÑких QSO цього журналу (напр.: %1), Ñхоже, бракує інформації RST-TX. Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. ÐатиÑніть «Так», щоб додати Ñтандартний %1 Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ñƒ %2 до вÑÑ–Ñ… QSO з подібною проблемою. If you select NO, maybe the QSO will not be imported. Якщо вибрати «Ðі» можливо, QSO не буде імпортовано. KLog: No RST TX found! KLog: RST TX не знайдено! Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. У деÑких QSO цього журналу (напр.: %1), Ñхоже, бракує інформації RST-RX. KLog: No RST RX found! KLog: RST RX не знайдено! KLog - No Station callsign entered. KLog - Кличний Ñтанції не введено! KLog - Apply to all QSOs in this log? KLog - ЗаÑтоÑувати до вÑÑ–Ñ… QSO у цьому журналі? KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO with %1 on %2: KLog знайшов одне QSO без визначеного кличного. Введіть кличний Ñтанції, Ñкий викориÑтовувавÑÑ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÐ´ÐµÐ½Ð½Ñ QSO з %1 на %2: KLog - QSO without Station Callsign KLog - QSO без Кличного Ñтанції! KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO on %1: KLog знайшов одне QSO без визначеного кличного. Введіть кличний Ñтанції, Ñкий викориÑтовувавÑÑ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÐ´ÐµÐ½Ð½Ñ QSO з %1: KLog - Don't ask again KLog - Більше не питати Do you want to reuse your answer? Бажаєте повторно викориÑтати Ñвою відповідь? KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again. KLog викориÑтовуватиме вашу попередню відповідь Ð´Ð»Ñ Ð±ÑƒÐ´ÑŒ-Ñкої іншої, подібної події, Ñкщо така Ñ”, не запитуючи Ð’Ð°Ñ Ð·Ð½Ð¾Ð²Ñƒ. <ul><li>Date/Time:</i> %1</li><li>Callsign: %2</li><li>Band: %3</li><li>Mode: %4</li></ul> <ul><li>Дата/ЧаÑ:</i> %1</li><li>Кличний: %2</li><li>Діапазон: %3</li><li>Вид: %4</li></ul> KLog - QSO not found KLog - QSO не знайдено Do you want to add this QSO to the log?: Бажаєте додати це QSO до журналу?: We have found a QSO coming from LoTW that is not in your local log. Do you want KLog to add this QSO to the log? Ми знайшли QSO з LoTW, Ñкого немає у вашому локальному журналі. Ви бажаєте, щоб KLog додав це QSO до журналу? KLog - Invalid call detected KLog - виÑвлено недійÑний кличний An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported log file? ВиÑвлено порожній кличний. Ви вÑе одно хочете екÑпортувати це QSO (натиÑніть «Так») чи видалити поле з екÑпортованого файлу журналу? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log file? ВиÑвлено недійÑний кличний %1. Ви хочете екÑпортувати цей кличний (натиÑніть «Так») чи видалити зв'Ñзок з екÑпортованого файлу журналу? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. You can, however, edit the ADIF file once the export process is finished. ЕкÑпорт неправильних кличних може Ñтворити проблеми в програмах, до Ñких Ви потенційно імпортуєте цей файл журналу. Однак це може бути хороший кличний, Ñкий помилково визначено KLog - недійÑним. Ви можете відредагувати файл ADIF піÑÐ»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑу екÑпорту. HamLibNetworkConfigWidget Enter the hostname or address of the radio. Set de network port of the radio. Host/Address ХоÑÑ‚/ÐдреÑа Port Порт Enter the port of the radio. HamLibSerialConfigWidget Bauds Бод Select the serial port speed. Port Порт Select the serial port. Only the serial ports that are detected are shown. Scan Сканувати Click to identify the serial ports available in your computer. 5 bits 6 bits 7 bits 8 bits Data bits Біти даних Select the serial data bits. None Ðемає Hardware Software XON/XOFF Flow control Контроль потоку Select the serial flow control No parity Паритет відÑутній Even Odd Space Mark Parity Паритет Select the serial parity. 1 bit 1.5 bits 2 bits Stop bits Стоп біти Select the serial stop bits. InfoWidget 10M 15M 20M 40M 80M 160M 2M 6M 12M 17M 30M 70CM Continent Континент Prefix ÐŸÑ€ÐµÑ„Ñ–ÐºÑ CQ ITU Short Path Короткий шлÑÑ… Long Path Довгий шлÑÑ… Deg ГрадуÑів Miles Миль Km Км IntroPage Welcome to KLog! ЛаÑкаво проÑимо до KLog! Welcome to KLog! - brought to you under the terms of the GPL! ЛаÑкаво проÑимо до KLog! - доÑтупний Вам відповідно до умов GPL! Welcome to KLog ЛаÑкаво проÑимо до KLog This looks like it's the first time you've run KLog on this computer. Схоже, що Ви вперше запуÑкаєте KLog на цьому комп'ютері. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. KLog - це безкоштовна програма, реєÑтратор аматорÑького радіо, Ñка працює в GNU/Linux, macOS Ñ– Windows. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. It is designed to provide general purpose DX, and contest logging. Він призначений Ð´Ð»Ñ Ñ€ÐµÑ”Ñтрації загальних QSO, DX та Ð´Ð»Ñ Ð·Ð¼Ð°Ð³Ð°Ð½ÑŒ. It supports QSL management, import and export of ADIF Він підтримує ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ QSL, імпорт та екÑпорт ADIF and Cabrillo file formats and many other features... та файлів у форматі Cabrillo, а також багато інших функцій... Before you can start using KLog, you will be asked to: Перед тим, Ñк Ви почнете кориÑтовуватиÑÑŒ KLog, Ð’Ð°Ñ Ð¿Ñ€Ð¾ÑÑть: Acknowledge to the terms of the license. Визнайте умови ліцензії. Download the DX entities information. Завантажте інформацію про DX території. Enter your callsign, CQ zone, etc. and main configuration. ВвеÑти Ñвій кличний, зону CQ, тощо. Та оÑновну конфігурацію. Enjoy KLog and contact the development team if you have any suggestions! ÐаÑолоджуйтеÑÑŒ KLog! ЗвертайтеÑÑ Ð´Ð¾ команди розробників, Ñкщо маєте пропозиції! LicPage KLog License information Ліцензійна Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ KLog Welcome to KLog!- brought to you under the terms of the GPL! ЛаÑкаво проÑимо до KLog! - доÑтупний Вам відповідно до умов GPL! Acknowledge ПрийнÑти Be aware that KLog is free software. Пам’Ñтайте, що KLog Ñ” безкоштовним програмним забезпеченнÑм. LoTWUtilities Double click on the date that you want to use as the start date for downloading QSOs. Двічі клацніть дату, Ñку Ви бажаєте викориÑтовувати Ñк дату початку Ð´Ð»Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ QSO. KLog - LoTW password needed KLog - Потрібен пароль Ð´Ð»Ñ LoTW Please enter your LoTW password: Будь лаÑка, введіть Ваш пароль LoTW: KLog - LoTW Station callsign KLog - Кличний Ñтанції LoTW There is not a single QSO in the log with that station callsign. Ð’ журналі немає жодного QSO з цим кличним Ñтанцією. Are you sure that you want to use that station callsign (%1)? Ви впевнені, що бажаєте викориÑтовувати цей кличний Ñтанції (%1)? KLog - LoTW File already exists KLog - Файл LoTW вже Ñ–Ñнує! There is a file already existing with the name that will be used. Уже Ñ–Ñнує файл із таким іменем, Ñке буде викориÑтовуватиÑÑ. The file %1 already exist. Do you want to overwrite? Файл %1 вже Ñ–Ñнує. Бажаєте перезапиÑати? KLog - LoTW Can't write the file KLog - LoTW Ðеможливо запиÑати файл KLog was not able to save the file %1. Error returned: %2 KLog не вдалоÑÑ Ð·Ð±ÐµÑ€ÐµÐ³Ñ‚Ð¸ файл %1. Виникла помилка: %2 The file %1 already exists. Файл %1 вже Ñ–Ñнує! Downloading data to file: %1. Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… у файл: %1. KLog - LoTW download KLog - LoTW Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ KLog - LoTW Start date selection KLog - LoTW вибір початковаї дати This is the first date of a QSO with the callsign %1 in this log If you think that in LoTW you may have previous QSOs, answer No. Це перша дата QSO з кличним %1 у цьому журналі. Якщо Ви думаєте, що в LoTW у Ð’Ð°Ñ Ð¼Ð¾Ð¶ÑƒÑ‚ÑŒ бути попередні QSO, дайте відповідь «Ðі». Do you want to use this date (%1) as start date? Чи бажаєте Ви викориÑтати цю дату (%1), Ñк дату початку? KLog - LoTW Download error KLog - Помилка Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ LoTW There was an error (%1) while downloading the file from LoTW. Під Ñ‡Ð°Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ з LoTW ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° (%1). The downloading error details are: %1 Деталі помилки завантаженнÑ: %1 KLog - LoTW Redirection found KLog - LoTW Знайдено Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ The remote server redirected our connection to %1 Віддалений Ñервер перенаправив Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ %1 Do you want to follow the redirection? Ви бажаєте Ñлідкувати за перенаправленнÑм? KLog - LoTW File not found KLog - LoTW Файл не знайдено KLog can't find the downloaded file. KLog не може знайти завантажений файл. It was not possible for find the file %1 that has been just downloaded. Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ файл %1, Ñкий щойно було завантажено. KLog - LoTW user/password error KLog - LoTW Помилка user/pass LoTW server did not recognized your user/password Сервер LoTW не розпізнає Ваш user/pass Check your user and password and ensure your are using the right one before trying again. Перш ніж повторити Ñпробу, переконайтеÑÑ, що Ви викориÑтовуєте правильний user/pass. KLog - LoTW No QSOs KLog - LoTW Ðемає QSO LoTW sent no QSOs LoTW не надÑилав QSO It seems that LoTW has no QSO with the Station Callsign you are using (%1). Схоже, LoTW не має QSO з кличним Ñтанції, Ñкий Ви викориÑтовуєте (%1). KLog - LoTW Unknown error KLog - LoTW Ðевідома помилка KLog can't recognize the file that has been downloaded from LoTW. KLog не може розпізнати файл, Ñкий було завантажено з LoTW. Try again and send the downloaded file (%1) to the KLog developer for analysis. Повторіть Ñпробу та надішліть завантажений файл (%1) розробнику KLog Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ñ–Ð·Ñƒ. KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data? KLog уÑпішно завантажив %1 QSO. Бажаєте оновити Ñвій журнал завантаженими даними? Now KLog will process the downloaded QSO and update your local log. Тепер KLog обробить завантажені QSO та оновить ваш локальний журнал. LogWindow QSL Send QSL ÐадіÑлана QSL Rcvd QSL Отримана &Delete &Видалити Delete a QSO Видалити QSO &Edit QSO &Правка QSO Edit this QSO Правка цього QSO Via &bureau Через &Бюро Send this QSL via bureau ÐадіÑлати цю QSL - через Бюро D&irect &Дірект Send this QSL via direct ÐадіÑлати цю QSL - Дірект Via bureau Через Бюро QSL &received via bureau QSL отримана - через Бюро Direct Дірект QSL received via direc&t QSL отримана - Дірект Check in QRZ.com Перевірити на QRZ.com Check this callsign in QRZ.com Перевірити цей кличний на QRZ.com Check in DXHeat.com Перевірити на DXHeat.com Check this callsign in DXHeat.com Перевірити цей кличний на DXHeat.com Delete selected QSOs Видалити вибрані QSO Delete the selected QSOs Видалити вибрані QSO Export to ADIF ЕкÑпортувати до ADIF Export the selected QSOs to an ADIF file. ЕкÑпортувати вибрані QSO до файлу ADIF. Upload to LoTW Передати до LoTW Upload the selected QSOs to LoTW Передати вибрані QSO до LoTW Upload to ClubLog Передати до ClubLog Upload the selected QSOs to ClubLog Передати вибрані QSO до ClubLog Upload to eQSL.cc Передати до eQSL.cc Upload the selected QSOs to eQSL.cc Передати вибрані QSO до eQSL.cc Send these QSLs via bureau ÐадіÑлати ці QSL - через Бюро Send these QSLs via direct ÐадіÑлати ці QSL - Дірект QSLs received via bureau QSL отримані - через Бюро QSLs received via direc&t QSL отримані - Дірект Select none СкаÑувати вибране Remove all selections Видалити вÑе виділене Select all Вибрати вÑе Select all the QSOs Вибрати вÑÑ– QSO MainQSOEntryWidget &Add &Додати &Clear &ОчиÑтити Callsign of the QSO. Кличний QSO. Band of the QSO. Діапазон QSO. Mode of the QSO. Вид QSO. Date of the QSO. Дата QSO. Time of the QSO. Ð§Ð°Ñ QSO. Add the QSO to the log. Додати QSO до журналу. Clears the QSO entry. ОчиÑтити Ð·Ð°Ð¿Ð¸Ñ QSO. Look up info about the current callsign on qrz.com KLog will show real time if enabled. KLog відображатиме реальний чаÑ, Ñкщо його ввімкнено. Real time Реальний Ñ‡Ð°Ñ Stop wsjt-x and hamlib from automatically updating QSO information. Зупинити wsjt-x та hamlib Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ— QSO. Manual Mode Ручний режим Callsign Кличний &Save &Зберегти &Cancel &СкаÑувати DUPE Translator: DUPE is a common world for hams. Do not translate of not sure MainWindow KLog - Stop the war in Ukraine! KLog - Stop the war in Ukraine! You are using a Russian call (%1). You can probably help to stop the Russian war, people are dying. Please call your leaders to stop the war. You are using an Ukranian call. Please take care and protect yourself and your family. The KLog developers wish you the best of luck in this very difficult moment. Ви викориÑтовуєте УкраїнÑький Кличний. Будь лаÑка, бережіть Ñебе та Ñвою родину. Розробники KLog бажають Вам удачі в цю дуже важку хвилину. People are dying in the war of Russia against Ukraine. You can help to stop the Russian war against Ukraine. Please show your disagreement to your leaders, or in your social network to stop the war. Always check the current callsign in QRZ.com Upload queued QSOs to LoTW Do you want to update now? You seem to have never backed up or exported your log to ADIF. Your latest backup seems older than one month. Regular backups prevent data loss and are good operator practice. Once exported, copy your ADIF file to a safe place such as a USB drive, cloud drive or other offsite computer. KLog will remind you to backup on a monthly basis. Backup completed successfully KLog will remind you again in approximately one month. Backup failed. Periodic data backups are recommended to prevent data loss and corruption of your log. The setup will now open to allow you to change your settings. Check always the current callsign in QRZ.com Завжди перевірÑти поточний кличний на QRZ.com Status bar ... Панель Ñтану... DX Entity DX Території Starting KLog ЗапуÑк KLog &Log Window &Вікно журналу Upload the queued QSOs to LoTW Передати QSO з черги до LoTW KLog - KLog folder not found KLog - Тека KLog не знайдена It was not possible to define the KLog folder. Some functions may not work properly! Ðе вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ теку KLog. ДеÑкі функції можуть працювати неправильно! KLog - File not open KLog - Файл не відкрито It was not possible to open the debug file for writing. No debug log will be saved! Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл відладки Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу. Журнал відладки не буде збережено! KLog - CTY.dat update KLog - ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ CTY.dat KLog needs to update the Entities database. KLog необхідно Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð±Ð°Ð·Ð¸ даних. You can update the entities database in Tools->Update cty.csv Ви можете оновити базу даних у ІнÑтрументи->Оновити cty.csv Do you want to do it now? Ви бажаєте зробити це зараз? KLog - Settings update KLog - ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½ÑŒ The settings system has been changed and KLog will update your settings file. СиÑтему налаштувань було змінено. KLog оновить ваш файл налаштувань. It seems that you have never done a backup or exported your log to ADIF. Схоже, Ви ніколи не робили резервну копію або екÑпортували Ñвій журнал до ADIF. It seems that the latest backup you did is older than one month. Схоже, що резервне копіюваннÑ, Ви робили більше міÑÑÑ†Ñ Ñ‚Ð¾Ð¼Ñƒ. Log backup recommended! Рекомендовано резервне копіюваннÑ! It is a good practice to backup your full log regularly to avoid loosing data in case of a problem. Once you export your log to an ADIF file, you should copy that file to a safe place, like an USB drive, cloud drive, another computer, ... KLog will remind you to backup on a monthly basis. РекомендуєтьÑÑ Ñ€ÐµÐ³ÑƒÐ»Ñрно Ñтворювати резервні копії, щоб уникнути втрати даних у разі Ð²Ð¸Ð½Ð¸ÐºÐ½ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼. ПіÑÐ»Ñ Ñ‚Ð¾Ð³Ð¾, Ñк Ви екÑпортуєте Ñвій журнал у файл ADIF, Вам Ñлід Ñкопіювати цей файл у безпечне міÑце, Ñк-от USB-накопичувач, хмарний диÑк, інший комп'ютер, ... KLog щоміÑÑÑ†Ñ Ð½Ð°Ð³Ð°Ð´ÑƒÐ²Ð°Ñ‚Ð¸Ð¼Ðµ Вам про ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ñ— копії. KLog - Backup KLog - резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ The backup was done successfully Резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð¾ уÑпішно! KLog will remind you to backup your data again in aprox one month. KLog нагадає Вам, знову Ñтворити резервну копію даних приблизно через міÑÑць. The backup was not properly done. Резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð¾ неправильно! It is recommended to backup your data periodically to prevent lose or corruption of your log. РекомендуєтьÑÑ Ð¿ÐµÑ€Ñ–Ð¾Ð´Ð¸Ñ‡Ð½Ð¾ Ñтворювати резервні копії даних, щоб запобігти втраті або пошкодженню журналу. KLog - New version detected! KLog - ВиÑвлено нову верÑÑ–ÑŽ! This version of KLog requires that the DXCC database is updated. Ð¦Ñ Ð²ÐµÑ€ÑÑ–Ñ KLog потребує Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð±Ð°Ð·Ð¸ даних DXCC. The database will be updated. База даних буде оновлюватиÑÑŒ. It seems that you are running this version of KLog for the first time. Схоже, Ви вперше запуÑкаєте цю верÑÑ–ÑŽ KLog. The setup will be open to allow you to do any new setup you may need. ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÑƒÐ´Ðµ відкрито, щоб Ви могли виконати будь-Ñке нове налаштуваннÑ, Ñке може знадобитиÑÑ. Ready Готово KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Журнал %2 - QSO: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 KLog-%1 - Ðпаратний журнал %2 - Кличний: %3 - QSO: %4 KLog KLog - Unexpected error KLog - Ðеочікувана помилка An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: Під Ñ‡Ð°Ñ Ñпроби додати QSO до вашого журналу, ÑталаÑÑ Ð½ÐµÐ¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð° помилка. Якщо проблема не зникає, звернітьÑÑ Ð´Ð¾ розробника Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ñ–Ð·Ñƒ: KLog - Not valid call KLog - Кличний недійÑний! The callsign %1 is not a valid call. Do you really want to add this callsign to the log? Кличний %1 - недійÑний! Ви Ñправді бажаєте додати цей кличний до журналу? Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. Ð”Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð½ÐµÐ´Ñ–Ð¹Ñних кличних до журналу, може Ñтворити проблеми під Ñ‡Ð°Ñ Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð·Ð°Ñвки на дипломи, екÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² ADIF до інших ÑиÑтем або програм. KLog - Select correct entity KLog - Виберіть правильну країну You have selected an entity: Ви вибрали країну: that is different from the KLog proposed entity: Ñка відрізнÑєтьÑÑ Ð²Ñ–Ð´ країни, запропонованої KLog: Click on the prefix of the correct entity or Cancel to edit the QSO again. ÐатиÑніть на Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð¾Ñ— країни або СкаÑувати, щоб відредагувати QSO знову. KLog - Not valid callsign KLog - Кличний недійÑний! The callsign %1 is not a valid callsign. Do you really want to add this callsign to the log? Кличний %1 - недійÑний! Ви Ñправді бажаєте додати цей кличний до журналу? None Ðемає Click on the prefix of the right entity or Cancel to correct. Щоб виправити, натиÑніть Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ Ð¿Ð¾Ñ‚Ñ€Ñ–Ð±Ð½Ð¾Ñ— країни або СкаÑувати. Save ADIF File Зберегти файл ADIF You have requested to delete several QSOs Ви подали запит на Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ ÐºÑ–Ð»ÑŒÐºÐ¾Ñ… QSO This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. Ð¦Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ, обов'Ñзково видалить уÑÑ– вибрані QSO та пов'Ñзані дані. Ви не зможете відновити Ñ—Ñ… знову. Are you sure? Ви впевнені? You have requested to delete the QSO with: %1 Ви подали запит на Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ QSO з: %1 KLog - ClubLog error KLog - помилка ClubLog The ClubLog upload process has finished with an error and the log was possibly not uploaded. ÐŸÑ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð° ClubLog завершивÑÑ Ð· помилкою. Можливо, журнал не було завантажено. Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 Будь лаÑка, перевірте Ñвої облікові дані, Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ Інтернету та обліковий Ð·Ð°Ð¿Ð¸Ñ ClubLog. Отриманий код помилки: %1 KLog - ClubLog Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? Бажаєте позначити Ñк завантажені, Ð’ÑÑ– QSO, завантажені до ClubLog? There was an error while updating to Yes the ClubLog QSO upload information. Під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ— про передачу до ClubLog QSO виникла помилка. The ClubLog upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? ÐŸÑ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ ClubLog завершено. KLog Ñтворив файл (%1) у вашій теці KLog. Ви бажаєте, щоб KLog видалив цей файл? The file has been removed. Файл видалено. The file has not been removed. Файл - не видалено. It seems that there was something that prevented KLog from removing the file You can remove it manually. Схоже, щоÑÑŒ заважало KLog видалити файл Ви можете видалити його вручну. KLog - eQSL error KLog - помилка eQSL The eQSL upload process has finished with an error and the log was possibly not uploaded. ÐŸÑ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð° eQSL завершивÑÑ Ð· помилкою. Можливо, журнал не було завантажено. Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1 Будь лаÑка, перевірте Ñвої облікові дані, Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ Інтернету та обліковий Ð·Ð°Ð¿Ð¸Ñ eQSL. Отриманий код помилки: %1 KLog - eQSL Do you want to mark as Uploaded all the QSOs uploaded to eQSL? Ви бажаєте позначити Ñк завантажені вÑÑ– QSO, завантажені на eQSL? There was an error while updating to Yes the eQSL QSO upload information. Під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ— про передачу до eQSL QSO виникла помилка. The eQSL upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? ÐŸÑ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ eQSL завершено. KLog Ñтворив файл (%1) у вашій теці KLog. Ви бажаєте, щоб KLog видалив цей файл? KLog - QRZ.com warning KLog - ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ QRZ.com QRZ.com has returned a non-subcribed error and queries to QRZ.com will be disabled. QRZ.com повернув помилку без підпиÑки. Запити до QRZ.com будуть вимкнені. Please check your QRZ.com subcription or credentials. Перевірте Ñвою підпиÑку на QRZ.com або облікові дані. KLog - QRZ.com error KLog - помилка QRZ.com The QRZ.com upload process has finished with an error and the log was possibly not uploaded. ÐŸÑ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð° QRZ.com завершивÑÑ Ð· помилкою. Можливо, журнал не було завантажено. KLog - QRZ.com Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? Ви бажаєте позначити Ñк завантажені вÑÑ– QSO, завантажені на QRZ.com? There was an error while updating to Yes the QRZ.com QSO upload information. Під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ— про передачу до QRZ.com QSO виникла помилка. The QRZ.com upload process has finished successfully ÐŸÑ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð° QRZ.com уÑпішно завершено Call not found in QRZ.com Кличний не знайдено на QRZ.com KLog has received an error from QRZ.com. KLog отримав Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ помилку від QRZ.com. KLog - %1 You need to activate the %1 service in the eLog preferences. Вам потрібно активувати Ñлужбу %1 у налаштуваннÑÑ… eLog. KLog - Exit KLog - Вихід Do you really want to exit KLog? Ви Ñправді бажаєте вийти з KLog? The logfile has been modified. Файл журналу було змінено. Do you want to save your changes? Бажаєте зберегти зміни? KLog - ADIF export KLog - ADIF екÑпорт It is important to export to ADIF and save a copy as a backup. Важливо екÑпортувати в ADIF та зберегти Ñк резервну копію. Saving the log was done successfully. Ð—Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ виконано уÑпішно. The ADIF export was not properly done. ЕкÑпорт ADIF виконано неправильно! &File &Файл &Import from ADIF ... &Імпорт з ADIF... Import an ADIF file into the current log. Імпорт файлу ADIF у поточний журнал. Export to ADIF ... ЕкÑпорт до ADIF... Export the current log to an ADIF logfile. ЕкÑпорт поточного журнал до ADIF файлу. Export all logs to ADIF ... ЕкÑпорт увÑÑ– журналів до ADIF... Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. ЕкÑпортувати ВСІ QSO в один файл ADIF, об'єднавши QSO з уÑÑ–Ñ… журналів. &Print Log ... &Друк журналу... Print your log. Друк ващого журналу. KLog folder Тека KLog Opens the data folder of KLog. Відкриває теку з даними KLog. Settings ... ÐалаштуваннÑ... E&xit &Вийти &Tools Ін&Ñтрументи Fill in QSO data Заповнити дані QSO Go through the log reusing previous QSOs to fill missing information in other QSOs. ПереглÑньте журнал, повторно викориÑтовуючи попередні QSO, щоб заповнити інформацію, відÑутню в інших QSO. QSL tools ... ІнÑтрументи QSL... Find QSO to QSL Знайти QSO Ð´Ð»Ñ Ð½Ð°Ð´ÑÐ¸Ð»Ð°Ð½Ð½Ñ QSL Shows QSOs for which you should send your QSL and request the DX QSL. Показує QSO, Ð´Ð»Ñ Ñких Ви можете надіÑлати Ñвою QSL та запроÑити DX QSL. Find My-QSLs pending to send Знайти Мої QSL, Ñкі очікують на відправку Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Показує QSO із запитами на надÑÐ¸Ð»Ð°Ð½Ð½Ñ QSL, Ñкі очікують на розглÑд. Ви маєте залишити цю чергу порожньою! Find DX-QSLs pending to receive Знайти DX QSL, що очікують на Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Shows DX-QSLs for which requests or QSLs have been sent with no answer. Показує DX QSL, Ð´Ð»Ñ Ñких запити чи QSL, були надіÑлані без відповіді. Find requested pending to receive Знайти запити, що очікують на Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Shows the DX-QSLs that have been requested. Показує запитані DX-QSL. LoTW tools ... ІнÑтрументи LoTW... Queue all QSOs from this log to be sent ПоÑтавте в чергу вÑÑ– QSO з цього журналу Ð´Ð»Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²ÐºÐ¸ Mark all non-sent QSOs in this log as queued to be uploaded. Позначте вÑÑ– не відправлені QSO у цьому журналі Ñк поÑтавлені в чергу Ð´Ð»Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²ÐºÐ¸. Queue all QSLs to be sent ПоÑтавте в чергу вÑÑ– QSL, Ñкі потрібно надіÑлати Put all the non-sent QSOs in the queue to be uploaded. ПоміÑтіть вÑÑ– не відправлені QSO у чергу Ð´Ð»Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²ÐºÐ¸. Mark all queued QSOs from this log as sent Позначити вÑÑ– QSO з цього журналу в черзі Ñк надіÑлані Mark all queued QSOs in this log as sent to LoTW. Позначити вÑÑ– QSO з черги в цьому журналі Ñк надіÑлані на LoTW. Mark all queued QSOs as sent Позначити вÑÑ– QSO в черзі Ñк надіÑлані Mark all queued QSOs as sent to LoTW. Позначити вÑÑ– QSO в черзі Ñк надіÑлані до LoTW. Download from LoTW ... Завантажити з LoTW... Download the full log from LoTW ... Завантажити веÑÑŒ журнал з LoTW... ClubLog tools ... ІнÑтрументи ClubLog... Queue all the QSOs to be uploaded ПоÑтавте в чергу вÑÑ– QSO, Ñкі потрібно передати Upload the queued QSOs to ClubLog ... Передати QSO з черги до ClubLog... eQSL tools ... ІнÑтрументи eQSL... Upload the queued QSOs to eQSL.cc ... Передати QSO з черги до eQSL.cc... QRZ.com tools ... ІнÑтрументи QRZ.com... Check the current callsign in QRZ.com Перевірте поточний кличний на QRZ.com Queue all the QSO to be uploaded ПоÑтавте в чергу вÑÑ– QSO, Ñкі потрібно передати Upload the queued QSOs to QRZ.com ... Передати QSO з черги до QRZ.com... Update cty.csv ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ cty.csv For updated DX-Entity data, update cty.csv. Щоб отримати оновлені дані DX-Entity, оновіть cty.csv. Update Satellite Data Оновити дані Ñупутника Stats СтатиÑтика Show the statistics of your radio activity. Показати ÑтатиÑтику вашої активноÑті. Show Map Показати карту &Help &Довідка Online manual (F1) ... Онлайн поÑібник (F1)... &Tips ... &Поради... &Debug ... &Відладка... &About ... &Про... About Qt ... Про QT... Check updates ... Перевірити оновленÑ... KLog - LoTW Do you really want to mark ALL the QSOs of this log to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. Ви дійÑно бажаєте позначити ВСІ QSO цього журналу Ñк ПЕРЕДÐÐІ? Це потрібно зробити, ТІЛЬКИ ЯКЩО ВИ ПЕРШИЙ РÐЗ передаете QSO до LoTW. All pending QSOs of this log has been marked as queued for LoTW! Ð’ÑÑ– незавершені QSO у цьому журналі позначено Ñк поÑтавлені в чергу Ð´Ð»Ñ LoTW! Now you can upload them to LoTW. Тепер Ви можете передати Ñ—Ñ… до LoTW. There was a problem to mark all pending QSOs of this log as queued for LoTW! Виникла проблема з позначеннÑм уÑÑ–Ñ… незавершених QSO цього журналу Ñк поÑтавлених у чергу Ð´Ð»Ñ LoTW! Your log has been updated with the LoTW downloaded QSOs. Ваш журнал оновлено, за допомогою завантажених QSO з LoTW. KLog has updated %1 QSOs from LoTW. KLog оновив %1 QSO з LoTW. Your log has not been updated. Ваш журнал не був оновлений! No QSO was updated with the data coming from LoTW. This may be because of errors in the logfile or simply because your log was already updated. Жодна QSO не оновлена даними, що надходÑть від LoTW. Це може бути через помилки у файлі журналу або тому, що ваш журнал вже оновлено. Do you really want to mark ALL pending QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. Ви дійÑно хочете позначити ВСІ незавершені QSO Ñк ПЕРЕДÐÐІ? Це потрібно зробити, ТІЛЬКИ ЯКЩО ЦЕ Ð’ÐШ ПЕРШИЙ РÐЗ коли Ви передаєте QSO в LoTW. All pending QSOs has been marked as queued for LoTW! Ð’ÑÑ– незавершені QSO позначено Ñк поÑтавлені в чергу на LoTW! There was a problem to mark all pending QSOs as queued for LoTW! Виникла проблема з позначеннÑм незавершених QSO Ñкі поÑтавлені в чергу Ð´Ð»Ñ LoTW! KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. TQSL не вÑтановлено або KLog не може його знайти. Будь лаÑка, перевірте конфігурацію. Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded. Помилка #1: ÐŸÑ€Ð¾Ñ†ÐµÑ ÑкаÑовано кориÑтувачем або TQSL не налаштовано. QSO не було завантажено. Error #2: Upload was rejected by LoTW, please check your data. Помилка #2: LoTW відхилив завантаженнÑ, перевірте Ñвої дані. Error #3: The TQSL server returned an unexpected response. Помилка #3: Сервер TQSL повернув неочікувану відповідь. Error #4: There was a TQSL error. Помилка #4: Помилка TQSL. Error #5: There was a TQSLLib error. Помилка #5: Помилка TQSLLib. Error #6: It was not possible to open the input file. Помилка #6: Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ вхідний файл. Error #7: It was not possible to open the ouput file. Помилка #7: Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ вихідний файл. Error #8: No QSOs were processed since some QSOs were duplicates or out of date range. Помилка #8: Жодне QSO не було оброблено, оÑкільки деÑкі QSO були дублікатами або поза діапазоном дат. Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range. Помилка #9: Ðе вÑÑ– QSO були оброблені, тому що вони були дублікатами або поза діапазоном дат. Error #10: Command syntax error. KLog sent a bad syntax command. Помилка #10: СинтакÑична помилка. KLog надіÑлав команду з неправильним ÑинтакÑиÑом. Error #11: LoTW Connection error (no network or LoTW is unreachable). Помилка #11: Помилка Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ LoTW (відÑÑƒÑ‚Ð½Ñ Ð¼ÐµÑ€ÐµÐ¶Ð° або LoTW недоÑтупний). Error #00: Unexpected error. Please contact the development team. Помилка #00: Ðеочікувана помилка. Будь лаÑка, зв'ÑжітьÑÑ Ð· командою розробників. The log that you have selected contains more than just one station callsign. Журнал, Ñкий Ви вибрали, міÑтить більше ніж один кличний Ñтанції. Please select the station callsign you want to mark as sent to LoTW: Будь лаÑка, виберіть кличний Ñтанції, Ñкий потрібно позначити Ñк надіÑланий на LoTW: Station Callsign: Кличний Ñтанції: Define Station Callsign Визначте кличний Ñтанції You have selected no callsign. KLog will complete the QSOs without a station callsign defined and those with the callsign you are entering here. Ви не вибрали жодного кличного. KLog завершить QSO без визначеного кличного Ñтанції та з кличним, Ñкий Ви вводите. Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Введіть кличний Ñтанції Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð² цьому журналі або залиште його порожнім Ð´Ð»Ñ QSO без визначеного кличного Ñтанції: KLog - No station selected KLog - Станцію не вибрано No station callsign has been selected and therefore no log will be marked Жоден кличнтй Ñтанції не вибрано, тому журнал не буде позначений All queued QSOs of this log has been marked as sent to LoTW! Ð’ÑÑ– QSO в черзі цього журналу позначено Ñк надіÑлані на LoTW! There was a problem to mark all queued QSOs of this log as sent to LoTW! Виникла проблема з позначеннÑм уÑÑ–Ñ… QSO у черзі цього журналу Ñк надіÑланих на LoTW! All queued QSOs has been marked as sent to LoTW! Ð’ÑÑ– QSO в черзі, позначено Ñк надіÑлані на LoTW! There was a problem to mark all queued QSOs as sent to LoTW! Виникла проблема позначити вÑÑ– QSO в черзі, Ñк надіÑлані на LoTW! About ... Про... KLog - Update checking result KLog - результат перевірки Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Congratulations! Вітаємо! You already have the latest version. Ви вже маєте найновішу верÑÑ–ÑŽ. You can find the KLog data folder here: Теку даних KLog можна знайти тут: start Ñтарт UDP Server error The UDP server failed to %1. start or stop Помилка Ñервера UDP UDP-Ñерверу не вдалоÑÑ %1. stop Ñтоп Status of the DX entity. Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¾Ð±'єкта DX. Name of the DX entity. Ðазва об'єкта DX. QSO QSL eQSL Comment Коментар Others Інше My Data Мої дані Satellite Супутники Info Інфо Awards Дипломи Search Пошук Log Журнал DX-Cluster DX-КлаÑтер DXCC No QSOs have been exported to ADIF. Жодна QSO не була екÑпортована до ADIF. KLog has exported %1 QSOs to the ADIF file: %2 KLog екÑпортував %1 QSO до файлу ADIF: %2 You need to select one station callsign to be able to send your log to LoTW. Вам потрібно вибрати кличний Ñтанції, щоб мати можливіÑть надіÑлати Ñвій журнал до LoTW. TQSL finished with no error. Do you want to mark as Sent all the QSOs uploaded to LoTW? TQSL завершено без помилок. Бажаєте позначити Ñк надіÑлані вÑÑ– QSO, завантажені до LoTW? There was an error while updating to Yes the LoTW QSL sent information. Під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ— про передачу до LoTW QSL виникла помилка. The LoTW upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? ÐŸÑ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ LoTW завершено. KLog Ñтворив файл (%1) у вашій теці KLog. Ви бажаєте, щоб KLog видалив цей файл? You need to select one station callsign to be able to send your log to ClubLog. Вам потрібно вибрати один кличний Ñтанції, щоб мати можливіÑть надіÑлати Ñвій журнал до ClubLog. The selection you have done does not include any QSO. Зроблений вами вибір не міÑтить QSO.( Do you want to add this QSOs to your ClubLog existing log? Ви бажаєте додати ці QSO до вже Ñ–Ñнуючого журналу ClubLog? The selection you have done does not include any QSO If you don't agree, this upload will overwrite your current ClubLog existing log. Якщо Ви не згодні, Ñ†Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð°, перезапише ваш поточний журнал ClubLog. You need to select one station callsign to be able to send your log to eQSL.cc. Вам потрібно вибрати кличний Ñтанції, щоб мати можливіÑть надіÑлати Ñвій журнал до eQSL.cc. KLog - Select the Station Callsign. KLog - Виберіть кличний Ñтанції. Select the Station Callsign to use when quering LoTW: Виберіть кличний Ñтанції Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ до LoTW: Please check the LoTW setup Будь лаÑка, перевірте Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ LoTW You have not defined a LoTW user or a proper Station Callsign. Open the LoTW tab in the Setup and configure your LoTW connection. Ви не визначили кориÑтувача LoTW або відповідний кличний Ñтанції. Відкрийте вкладку LoTW у ÐалаштуваннÑÑ… та налаштуйте Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ LoTW. Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1 Ви дійÑно бажаєте позначити ВСІ Ñвої QSO Ñк ПЕРЕДÐÐІ? Це потрібно зробити, ТІЛЬКИ ЯКЩО ЦЕ ПЕРШИЙ РÐЗ, коли Ви передаєте QSO до %1 ClubLog The log is ready to be uploaded to ClubLog. Журнал готовий Ð´Ð»Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð° ClubLog. All the QSOs in this log has been marked as Modified in the ClubLog status field УÑÑ– QSO в цьому журналі були позначені Ñк Змінені. Ð’ полі ÑтатуÑу ClubLog KLog could not mark the full log to be sent to ClubLog KLog не може позначити веÑÑŒ журнал Ð´Ð»Ñ Ð½Ð°Ð´ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð´Ð¾ ClubLog Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers. ЩоÑÑŒ завадило KLog позначити QSO Ñк змінені. ПерезапуÑтіть KLog та Ñпробуйте знову, перш ніж зв’ÑзуватиÑÑ Ð· розробниками KLog. The log is ready to be uploaded to eQSL.cc. Журнал готовий Ð´Ð»Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð° eQSL.cc. All the QSOs in this log has been marked as Modified in the eQSL.cc status field УÑÑ– QSO в цьому журналі були позначені Ñк Змінені. Ð’ полі ÑтатуÑу ClubLog KLog could not mark the full log to be sent to eQSL KLog не зміг позначити веÑÑŒ журнал Ð´Ð»Ñ Ð½Ð°Ð´ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° eQSL KLog - QRZ.COM QRZ.COM The log is ready to be uploaded to QRZ.com. Журнал готовий Ð´Ð»Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð° QRZ.com. All the QSOs in this log has been marked as Modified in the QRZ.com status field УÑÑ– QSO в цьому журналі були позначені Ñк Змінені. Ð’ полі ÑтатуÑу QRZ.com KLog could not mark the full log to be sent to QRZ.com KLog не може позначити веÑÑŒ журнал Ð´Ð»Ñ Ð½Ð°Ð´ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° QRZ.com To upload QSOs you need a qrz.com subscription. If you have one, go to Setup->QRZ.com tab to enable it. Щоб завантажити QSO, Вам потрібна підпиÑка на QRZ.com. Якщо вона Ñ”, перейдіть на вкладку ÐалаштуваннÑ->QRZ.com, щоб увімкнути його. You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. Вам потрібно визначити API ключ Ð´Ð»Ñ Ñвого журналу QRZ.com у налаштуваннÑÑ… eLog. Open File Відкрити файл - Needed for DXMarathon - Потрібен Ð´Ð»Ñ DX-марафону Filling QSOs ... Ð—Ð°Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ QSO... Abort filling СкаÑувати Ð·Ð°Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: Ð—Ð°Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ DXCC, CQz, ITUz, Continent в QSO... QSO: Number Ðомер Date/Time Дата/Ð§Ð°Ñ Callsign Кличний RSTtx RST tx RSTrx RST rx Band Діапазон Mode Вид Print Log Друк журналу Printing the log ... Друк журналу... Abort printing СкаÑувати друк Printing the log... QSO: Друк журналу... KLog - QSO received The following QSO data has been received from WSJT-X to be logged: ÐаÑтупні дані QSO були отримані від WSJT-X Ð´Ð»Ñ Ð»Ð¾Ð³Ñƒ: Freq ЧаÑÑ‚. Time On Ð§Ð°Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚. Time Off Ð§Ð°Ñ Ð·Ð°Ð²ÐµÑ€. RST TX RST RX DX-Grid Local-Grid Station Callsign Кличний Ñтанції Operator Callsign Кличний оператора KLog - WSJTX Dupe QSO This QSO seems to be duplicated. Do you want to save or discard it? Схоже, це QSO дублюєтьÑÑ. Бажаєте зберегти чи відкинути? Duplicated QSOs have to match another existing QSO with the same call, band, mode, date and time, taking into account the period that can be defined in the settings. Дубльовані QSO мають збігатиÑÑ Ð· іншими, Ñ–Ñнуючими QSO з тим Ñамим кличним, діапазоном, режимом, датою та чаÑом. Враховуючи період, Ñкий можна визначити в налаштуваннÑÑ…. QSO logged from WSJT-X: QSO запиÑано з WSJT-X: KLog - Non-supported mode KLog - Режим не підтримуєтьÑÑ A new mode not supported by KLog has been received from an external program or radio: Ðовий режим, Ñкий не підтримуєтьÑÑ KLog, отримано від зовнішньої програми або радіоÑтанції: If the received mode is correct, please contact KLog development team and request support for that mode Якщо отриманий режим правильний, зв'ÑжітьÑÑ Ð· командою розробників KLog та подайте запит на підтримку Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ режиму Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) Чи бажаєте Ви й надалі отримувати ці ÑповіщеннÑ? (Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ñ†Ð¸Ñ… Ñповіщень запобігатиме виÑвленню недійÑних режимів) KLog - QSO Dupe A dupe QSO has been detected in the file and will not be added to the log. Please check the QSO information file and ensure it is properly added. KLog - Duplicated satellite KLog - Дубльований Ñупутник A duplicated satellite has been detected in the file and will not be imported. У файлі виÑвлено дубльований Ñупутник, Ñкий не буде імпортований. Please check the satellite information file and ensure it is properly populated. Будь лаÑка, перевірте файл Ñупутникової інформації та переконайтеÑÑ, що він правильно заповнений. Now you will see a more detailed error that can be used for debugging... Тепер Ви побачите більш детальну помилку, Ñку можна викориÑтати Ð´Ð»Ñ Ð²Ñ–Ð´Ð»Ð°Ð´ÐºÐ¸... An unexpected error ocurred!! СталаÑÑ Ð½ÐµÐ¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð° помилка! If the problem persists, please contact the developers Якщо проблема не зникає, звернітьÑÑ Ð´Ð¾ розробників for analysis: Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ñ–Ð·Ñƒ: Error in function Native Error Error text Failed query Recommendation: РекомендаціÑ: Periodically export your data to ADIF to prevent a potential data loss. KLog - Show errors KLog - Показати помилки Do you want to keep showing errors? Бажаєте продовжити показувати помилки? It seems that there are no QSOs in the database. Ð’ базі даних, QSO відÑутні. If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. Якщо Ви впевнені, що база даних міÑтить QSO, а KLog не може Ñ—Ñ… знайти, звернітьÑÑ Ð´Ð¾ розробників по допомогу. MainWindowInputComment Comment Коментар Add a comment for this QSO. Додати коментар до цього QSO. Keep this data Зберегти дані Data entered in this tab will be copied into the next QSO. Дані, введені на цій вкладці, будуть Ñкопійовані до наÑтупного QSO. MainWindowInputEQSL Date of the ClubLog upload. Дата передачі на ClubLog. Date of the QRZ.com upload. Дата передачі на QRZ.com. Date of the eQSL sending. Дата Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð° eQSL. Date of the eQSL reception. ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð· eQSL. Date of the LoTW sending. Дата Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð° LoTW. Date of the LoTW reception. ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð· LoTW. Status on ClubLog. Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð½Ð° ClubLog. Status on QRZ.com. Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð½Ð° QRZ.com. Status of the eQSL sending. Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð° eQSL. Status of the eQSL reception. Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð· eQSL. Status of the LoTW sending. Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð° LoTW. Status of the LoTW reception. Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð· LoTW. ClubLog QRZ.com eQSL Sent eQSL Ðад. eQSL Rec eQSL Отр. LoTW Sent LoTW Ðад. LoTW Rec LoTW Отр. MainWindowInputOthers Primary Div Первинна група Secondary Div Вторинна група IOTA Entity Об'єкт Propagation mode РозповÑÑŽÐ´Ð¶ÐµÐ½Ð½Ñ Others Інші Keep propagation mode Зберігати режим розповÑÑŽÐ´Ð¶ÐµÐ½Ð½Ñ Select the primary division for this QSO. Виберіть первинну групу Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ QSO. Select the secondary division for this QSO. Виберіть вторинну групу Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ QSO. Select the entity for this QSO. Виберіть об'єкт Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ QSO. Select the propagation mode for this QSO. Виберіть режим розповÑÑŽÐ´Ð¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ QSO. Select the IOTA continent for this QSO. Виберіть континент IOTA Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ QSO. Select the IOTA reference number for this QSO. Введіть номер групи IOTA Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ QSO. Keeps the same propagation mode for next QSO. Зберегти той Ñамий режим розповÑюдженнÑ, Ð´Ð»Ñ Ð½Ð°Ñтупного QSO. Select the appropriate ADIF field for this QSO. Виберіть відповідне поле ADIF Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ QSO. Value for the selected ADIF field. Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð²Ð¸Ð±Ñ€Ð°Ð½Ð¾Ð³Ð¾ Ð¿Ð¾Ð»Ñ ADIF. Not Identified Not - Not Identified SOTA Ref Age VUCC grids Distance MainWindowInputQSL QSL Sent QSL Ðад. QSL Rec QSL Отр. QSL Via QSL Через QSL Msg QSL Пов. Status of the QSL sending. Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²ÐºÐ¸ QSL. Status of the QSL reception. Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ QSL. QSL sending information. Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ QSL. QSL reception information. Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ QSL. Date of the QSL sending. Дата Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ QSL. Date of the QSL reception. ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ QSL. Message of the QSL. ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ QSL. QSL via information. Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ QSL. Через ... MainWindowInputQSO TX RST. RX RST. TX Frequency in MHz. ЧаÑтота передачі, TX в MHz. RX Frequency in MHz. ЧаÑтота прийманнÑ, RX в MHz. Power used by the contacted station. ПотужніÑть Ñтанції, з Ñкою парцює Ваш кореÑпондент. Name of the contacted operator. Ім'Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð°, з Ñким зв'ÑзалиÑÑ. QTH of the contacted station. QTH Ñтанції, Вашого кореÑпондента. Locator of the contacted station. Локатор Ñтанції, Вашого кореÑпондента. Watts Ð’Ñ‚. MHz Split Translator: Split is a common hamradio term. Do not translate unless you are sure. Спліт Name Ім'Ñ QTH DX Locator DX Локатор Power(rx) ПотужніÑть (Rx) RST TX RX Frequency ЧаÑтота DX QTH locator. DX QTH Локатор DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. DX QTH локатор. Формат має бути: IN70AA Та міÑтити, до 10 Ñимволів. TX Frequency in MHz. Frequency is not in a hamradio band! ЧаÑтота передачі, в MHz. ЧаÑтота, не в діапазоні HamRadio! RX Frequency in MHz. Frequency is not in a hamradio band! ЧаÑтота прийому, в MHz. ЧаÑтота, не в діапазоні HamRadio! MainWindowMyDataTab Watts Ð’Ñ‚. Keep this data Зберегти дані Power ПотужніÑть Operator callsign Кличний оператора Station Callsign Кличний Станції My Locator Мій Локатор My QTH locator. Мій QTH Локатор. My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. Мій QTH локатор. Формат має бути: IN70AA Та міÑтити, до 10 Ñимволів. My Rig Мій TRX My Antenna ÐœÐ¾Ñ Ðнтена My SOTA_Ref My VUCC_GRIDS MainWindowSatTab Keep this data Зберегти дані Data entered in this tab will be copied into the next QSO. Дані, введені на цій вкладці, будуть Ñкопійовані до наÑтупного QSO. Other - Sat not in the list Інший - Супутник відÑутній у ÑпиÑку Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Ðазва Ñупутника. Якщо його немає в ÑпиÑку, виберіть: "%1", щоб увімкнути це поле. (формат типу ÐО-51). Satellite mode used. Режим роботи Ñупутника. Select the satellite you are using. Виберіть Ñупутник, Ñкий Ви викориÑтовуєте. UpLink band. UpLink діапазон. DownLink band. DownLink діапазон. UpLink DownLink Satellite Супутник Mode Режим Other Not Sat QSO KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. KLog виÑвив назву Ñупутника, Ñку він не розпізнає. Якщо заміÑть нього має викориÑтовуватиÑÑ Ð¾Ð´Ð½Ð° з назв відомих Ñупутників, будь лаÑка, виберіть Ñ—Ñ— зі ÑпиÑку. Крім того, зв’ÑжітьÑÑ Ð· командою розробників, щоб додати назву нового Ñупутника. The satellite you have in your QSO is: Супутник у вашому QSO: Please be aware that the satellite name will not be saved if it is not in the list, so that information may be lost! Будь лаÑка, майте на увазі, назва Ñупутника не буде збережена, Ñкщо Ñ—Ñ— немає у ÑпиÑку. Тому Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¼Ð¾Ð¶Ðµ бути втрачена! MapWindowWidget Select QSOs in this band. Виберіть QSO в цьому діапазоні. Select QSOs in this mode. Виберіть QSO в цьому режимі. Select QSOs in this propagation mode. Виберіть QSO в цьому режимі поширеннÑ. Select QSOs using this Satellite. Виберіть QSO з викориÑтаннÑм цього Ñупутника. Only confirmed Тільки підтверджені Select only confirmed QSOs. Вибрати лише підтверджені QSO. All bands Ð’ÑÑ– діапазони Show nothing Ðічого не показувати All modes Ð’ÑÑ– види All propagation modes Ð’ÑÑ– режими розповÑÑŽÐ´Ð¶ÐµÐ½Ð½Ñ All satellites Ð’ÑÑ– Ñупутники OnlineMessageWidget The server returned the following error: %1 Сервер повернув Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ помилку: %1 Not identified Ðе ідентифіковано QObject New One, work it! Ðовий, працюй! Needed, work it! Потрібен, працюй! Worked but not confirmed Працював, але не підтверджено Confirmed Підтверджено Not identified Ðе ідентифіковано Database Error Помилка бази даних KLog DB needs to be upgraded. KLog БД потрібно оновити. Do you want to upgrade it now? Бажаєте оновити Ñ—Ñ— зараз? If DB is not upgraded KLog may not work properly. Якщо БД не оновлено, KLog може працювати некоректно. Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea. ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð½Ð¾Ð³Ð¾ Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‚ÐµÐ½Ñ†Ñ–Ð¹Ð½Ð¾, може Ñпричинити проблеми. Резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ð°ÑˆÐ¾Ñ— БД перед оновленнÑм завжди Ñ” гарною ідеєю. Do you want to backup your DB now? Ви бажаєте зробити резервну копію Ñвоєї БД? The backup finished successfully. Резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ ÑƒÑпішно завершено. You can find the backup in this file: %1 Резервну копію можна знайти у цьому файлі: %1 The backup was not properly done. Резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð¾ неправильно! You will be sent back to the starting point. Ви повернетеÑÑ Ð´Ð¾ початкової точки. KLog - DB can't be updated automatically KLog - БД не можна оновлювати автоматично You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version. Ви оновлюєте надто Ñтару верÑÑ–ÑŽ KLog. Це Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ðµ можна оновити автоматично з цієї верÑÑ–Ñ—. The process to upgrade is: - Using an old KLog version export your log to ADIF. - Remove your logbook.dat file from your KLog folder. - Install the new KLog version. - Import your ADIF file. KLog will finish when you click on OK. ÐŸÑ€Ð¾Ñ†ÐµÑ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ: - ВикориÑтовуючи Ñтару верÑÑ–ÑŽ KLog, екÑпортуйте журнал до ADIF. - Видаліть файл logbook.dat з папки KLog. - Ð’Ñтановіть нову верÑÑ–ÑŽ KLog. - Імпортуйте файл ADIF. KLog завершить роботу, коли Ви натиÑнете кнопку OK. KLog - DB update KLog - Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð‘Ð” KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. KLog виÑвив попередній журнал у БД. Ð’ÑÑ– дані буде перенеÑено до щойно Ñтвореного журналу типу DX. KLog: Enter Station callsign KLog: Введіть кличний Ñтанції Enter the station callsign used in this log Введіть кличний Ñтанції, викориÑтаний у цьому журналі Station Callsign Кличний Ñтанції All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay. УÑÑ– дані було переміщено правильно. Тепер Вам потрібно перейти до ÐалаштуваннÑ->Параметри->Журнали, щоб перевірити, чи вÑе гаразд. Updating mode information... ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ— про режим... Abort updating СкаÑувати Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? СкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñпричинить невідповідніÑть даних, та можливо, Ñ—Ñ… втрату. Ви вÑе ще бажаєте ÑкаÑувати? Updating bands information... ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ— про діапазони... Updating bands information in %1 status... ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ— про діапазони в ÑтатуÑÑ– %1... Progress: ПоÑтуп: Updating mode information in %1 status... ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ— про режим у ÑтатуÑÑ– %1... Updating DXCC award information... ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ— про диплом DXCC... Updating DXCC Award information... ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ— про Диплом DXCC... Updating WAZ award information... ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ— про Диплом WAZ... Updating WAZ Award information... ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ— про Диплом WAZ... Updating information... ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ—... Updating DXCC and Continent information... ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ DXCC та КонтеÑÑ‚ інформації... KLog is already running. KLog вже працює. It is allowed to run only one instance. Дозволено запуÑкати тільки один екземплÑÑ€. A wrong callsign has been found: %1. Please enter a new callsign or confirm that the current one is a good callsign. Знайдено неправильний кличний: %1. Будь лаÑка, введіть новий кличний або підтвердіть поточний кличний. An empty callsign has been detected. If it is possible, please enter the right call. ВиÑвлено відÑутній кличний. Якщо можливо, введіть правильний кличний. KLog - Not valid callsign found KLog - Знайдено недійÑний кличний Date Дата Call Кличний RSTtx RST tx RSTrx RST rx Band Діапазон Comment Коментар Mode Вид CQz ITUz DXCC Address ÐдреÑа Age Вік County ГрафÑтво A_Index Ant_Az Ðнт_Ðз Ant_El Ðнт_Ел Ant_Path Ðнт_ШлÑÑ… ARRL_SECT Award_Submitted Award_granted Band_RX Діапазон_RX CheckContest Class ÐšÐ»Ð°Ñ ClubLog SDate ClubLog status Ð¡Ñ‚Ð°Ñ‚ÑƒÑ ClubLog Continent Континент Contacted_Op Contest Id Country ГрафÑтво Credit Submitted Credit granted Dark Dok Do not translate if unsure, common hamradio term. Distance ВідÑтань Email EQ_Call eQSL RDate eQSL Отр.дата eQSL SDate eQSL Ðад.дата eQSL Rcvd eQSL Отр. eQSL Sent eQSL Ðад. Fists Do not translate if unsure, common hamradio term. Fists CC Do not translate if unsure, common hamradio term. Force Init Freq Freq RX Gridsquare HRDLog SDate HRDLog status IOTA IOTA Island id IOTA ID оÑтрова K Index K Ñ–Ð½Ð´ÐµÐºÑ Lat Шир. Lon Дов. LoTW RDate LoTW SDate LoTW Rcvd LoTW Sent Max Bursts MS Shower My Antenna ÐœÐ¾Ñ Ðнтена My City Моє МіÑто My Cnty My Country ÐœÐ¾Ñ ÐšÑ€Ð°Ñ—Ð½Ð° My CQz ÐœÐ¾Ñ CQ зона My DXCC Мій DXCC My Fists Do not translate if unsure, common hamradio term. My Gridsquare Мій Локатор My IOTA ÐœÐ¾Ñ IOTA My IOTA island id Мій IOTA ID оÑтрова My ITUz ÐœÐ¾Ñ ITU зона My Lat ÐœÐ¾Ñ Ð¨Ð¸Ñ€. My Lon ÐœÐ¾Ñ Ð”Ð¾Ð². My Name Моє Ім'Ñ My Postal code Мій Пошт. код My Rig Мій TRX My Sig My Sig Info My SOTA ref My State My Street ÐœÐ¾Ñ Ð’ÑƒÐ»Ð¸Ñ†Ñ My USACA counties My VUCC grids Name Ім'Ñ Notes Ðотатки Nr bursts Do not translate if unsure, common hamradio term. Nr pings Do not translate if unsure, common hamradio term. Operator Оператор Owner Callsign Клич. ВлаÑника Pfx Precedence Prop Mode Public Key QRZcom SDate QRZcom status QSL msg QSL RDate QSL SDate QSL Rcvd QSL Sent QSL rcvd via QSL sent via QSL via QSO complete QSO завершено QSO random Випадкові QSO QTH Region Регіон Rig TRX RX Pwr Sat mode Sat name SFI Sig Sig Info Silent key Do not translate if unsure, common hamradio term. SKCC SOTA Ref SRX String SRX STX String State Submode SWL Do not translate if unsure, common hamradio term. UKSMG USACA counties VE prov VUCC grids Ten-Ten Do not translate, it is a hamradio group name. TX Pwr Web QSO Date off Log number SearchWidget &Clear &ОчиÑтити &Export Highlighted &ЕкÑпортувати виділене &Select All &Вибрати вÑе &Search &Пошук All logs Ð’ÑÑ– журнали Clear the searches. ОчиÑтити пошук. Export the search result to an ADIF file. ЕкÑпортувати результат пошуку до файлу ADIF. Select/Unselect all the QSOs shown. Виберіть/СкаÑуйте вибір, вÑÑ–Ñ… показаних QSO. Search in the log. Пошук в журналі. Search in all logs. Пошук у вÑÑ–Ñ… журналах. Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs! Введіть кличний Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ. Введіть '*', щоб показати вÑÑ– QSO... у великих журналах це може бути повільно! Select the Station Callsign used to do this QSO. Виберіть кличний Ñтанції, викориÑтаний Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ QSO. You have requested to delete the QSO with: %1 Ви подали запит на Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ QSO з: %1 Are you sure? Ви впевнені? All in log Ð’Ñе в журналі Not defined Ðе визначено &Clear selection &СкаÑувати вибране Save File Зберегти файл SearchWindow Call Кличний Date/Time Дата/Ð§Ð°Ñ Band Діап. Mode Вид QSL Sent QSL Відп. QSL Rcvd QSL Отр. Station Callsign Кличний Ñтанції ID Date/time Дата/Ñ‡Ð°Ñ Station callsign Кличний Ñтанції QSL Send QSL ÐадіÑлана &Delete &Видалити Delete a QSO Видалити QSO &Edit QSO &Правка QSO Edit this QSO Правка цього QSO Via &bureau Через &бюро Send this QSL via bureau ÐадіÑлати цю QSL - через Бюро D&irect &Дірект Send this QSL via direct ÐадіÑлати цю QSL - Дірект Via bureau Через Бюро QSL &received via bureau QSL отримана - через Бюро Direct Дірект QSL received via direc&t QSL отримана - Дірект Check in QRZ.com Перевірити на QRZ.com Check this callsign in QRZ.com Перевірити цей кличний на QRZ.com Check in DXHeat.com Перевірити на DXHeat.com Check this callsign in DXHeat.com Перевірити цей кличний на DXHeat.com &Request my QSL &ЗапроÑити мою QSL Mark my QSL as requested Позначити мою QSO в черзі Ñк надіÑлані Via Direct and mark DX QSL as requested Через Дірект та позчити DX QSL Ñк запит Send this QSL via direct and mark DX QSL as requested ÐадіÑлати цю QSL через Дірект та позначити DX QSL Ñк запит Via Bureau and mark DX QSL as requested Через Бюро та позначити DX QSL Ñк запит Send this QSL via bureau and mark DX QSL as requested ÐадіÑлати цю QSL через Бюро та позначити DX QSL Ñк запит &Request the QSL &ЗапроÑити QSL Mark the QSL as requested Позначити QSL Ñк надіÑлану Via bureau and mark my QSL as requested Через бюро та позначити мою QSL Ñк запитану QSL received via bureau and mark my QSL as requested QSL отримано через бюро та позначте мю QSL Ñк запит Direc&t and mark as my QSL requested Дірект та позначено запит мою QSL QSL received via direct and mark my QSL as requested QSL отримано через дірект та позначено мою QSL Ñк запитану Needed QSO to send the QSL Щоб надіÑлати QSL, потрібне QSO My QSL requested to be sent ÐœÐ¾Ñ QSL, запит на надÑÐ¸Ð»Ð°Ð½Ð½Ñ DX QSL pending to be received DX QSL очікує на Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ SetupDialog User data Дані кориÑтувача Bands/Modes Діап./Реж. Log widget ÐŸÐ¾Ð»Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ D&X-Cluster DX-КлаÑтер Colors Кольори Misc Різне World Editor Редактор Ðагород Logs Журнали eLog WSJT-X Satellites Супутники HamLib Cancel СкаÑувати OK Settings ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ You need to enter at least one log in the Logs tab. Потрібно ввеÑти принаймні один журнал на вкладці Журнали. Do you want to add one log in the Logs tab or exit KLog? (Click Yes to add a log or No to exit KLog) Ви бажаєте додати журнал на вкладці «Журнали» чи вийти з KLog? (ÐатиÑніть Так, щоб додати журнал, або ÐÑ–, щоб вийти з KLog) DX-Cluster DX-КлаÑтер World DB has not been moved to new path. БД не переміщена до нового шлÑху. Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Перейдіть на вкладку «Різне» та натиÑніть «ПереміÑтити БД» або БД не буде переміщено на нове міÑце. You need to enter at least a valid callsign. Вам потрібно ввеÑти Ñк мінімум дійÑний кличний. Go to the User tab and enter valid callsign. Перейдіть на вкладку КориÑтувача та введіть дійÑний кличний. You have not selected the kind of log you want. Ви не вибрали потрібний тип журналу. You will be redirected to the Log tab. Please add and select the kind of log you want to use. Ви будете перенаправлені на вкладку Журнал. Будь лаÑка, додайте та виберіть тип журналу, Ñкий Ви хочете викориÑтовувати. SetupEntityDialog Entity Ð¢ÐµÑ€Ð¸Ñ‚Ð¾Ñ€Ñ–Ñ Name of the Entity. CQ CQ zone. CQ зона. ITU ITU zone. ITU зона. Latitude Широта Longitude of the Entity. Longitude Довгота UTC Local time difference to UTC. Ð Ñ–Ð·Ð½Ð¸Ñ†Ñ Ð¼Ñ–Ð¶ міÑцевим чаÑом та UTC. Main prefix ОÑновний Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ Main prefix of the entity. ARRL ID ARRL ID. Prefixes ПрефікÑи Comma separated possible prefixes, e.g. EA1, EA2, ... Можливі префікÑи, розділені комами, напр. UR1, UR2, ... Date of the deletion. Дата видаленнÑ. Deleted Видалено Cancel СкаÑувати Ok Ok Entity Dialog SetupPageBandMode Bands Діапазони Modes Режими SetupPageColors New One Ðовий Needed in this band Worked in this band Confirmed in this band Default За замовчуваннÑм WSJT-X palette Палітра WSJT-X Default palette Палітра за замовчуваннÑм Dark Mode Темний Режим Color when the DXCC is an ATNO (All Time New One). ! Колір, коли DXCC Ñ” ATNO (All Time New One) (завжди новий). This DXCC was worked before in another band but not in the selected band. It may be needed due to the CQ, ITU, Grid, ... Цей DXCC відпрацьовано раніше. У іншому, але, не у вибраному діапазоні. Це може знадобитиÑÑ Ð´Ð¾ CQ, ITU, Grid, ... Worked DXCC, but not confirmed in this band. Відпрацьовано DXCC, але не підтверджено, в цьому діапазоні. DXCC is confirmed in this band. DXCC підтверджено у цьому діапазоні. Default color. Колір за замовчуваннÑм. Sets a palette of colors similar to the one used in WSJT-X. Ð’Ñтановлює палітру кольорів, подібну до тієї, що викориÑтовуєтьÑÑ Ð² WSJT-X. Sets the default palette. Ð’Ñтановити палітру. за замовченнÑм Sets the Dark Mode Ð’Ñтановити Темний Режим Choose a color Виберіть колір Light Mode Світлий Режим SetupPageDxCluster Add Додати Delete Видалити Show &HF spots Показати &HF Ñпоти Show V/&UHF spots Показати V/&UHF Ñпоти Show W&ARC spots Показати W&ARC Ñпоти Show &worked spots Показати &опрацьовані Ñпоти Show &confirmed spots Показати &підтверджені Ñпоти Show ANN/&FULL messages Показати ANN/&FULL Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Show WW&V messages Показати WW&V Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Show WC&Y messages Показати WC&Y Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Save DX Cluster activity Зберегти активніÑть DX КлаÑтер Saves all the DX-Cluster activity to a file in the KLog folder Зберігає вÑÑŽ активніÑть DX-КлаÑтер до файлу у теці KLog Send DX Spots to the map ÐадÑилати DX Споти на карту Sends the received DX Spots to the map to know where is the activity. ÐадÑилає отримані DX Ñпоти на карту, щоб знати, де відбуваєтьÑÑ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ–Ñть. DX Spots DX Споти Others Інше Messages ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ KLog: Add a DXCluster server KLog: Додати Ñервер DX КлаÑтер Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Додайте адреÑу, а потім :порт Приклад: dxfun.com:8000 Якщо порт не вказано, за замовчуваннÑм, викориÑтовуватиметьÑÑ 41112: SetupPageELog ClubLog password ClubLog App password ClubLog email Enter the email you used to register in ClubLog. Введіть email, Ñкий Ви викориÑтовували, Ð´Ð»Ñ Ñ€ÐµÑ”Ñтрації на ClubLog. Enter your password ClubLog here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Введіть Ваш пароль кориÑтувача, ClubLog. ПопередженнÑ: Пароль буде збережено під Ñ‡Ð°Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ, у конфігураційному файлі KLog!! (Якщо Ви не бажаєте вводити пароль, KLog запитає ВаÑ, коли він знадобитьÑÑ.) Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!! Введіть Ваш пароль, Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ ClubLog. Його можна отримати в ClubLog (меню «Параметри» > «Паролі додатків»).ПопередженнÑ: Пароль програми буде збережено під Ñ‡Ð°Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ, у конфігураційному файлі KLog!! Send QSOs in real time ÐадÑилати QSO в реальному чаÑÑ– Activate ClubLog ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ ClubLog Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. ÐадÑилає кожне QSO до ClubLog, у режимі реального чаÑу, коли вони додаютьÑÑ (або змінюютьÑÑ) у KLog. Starts the ClubLog support in KLog. ЗапуÑкає підтримку ClubLog у KLog. Activate eQSL.cc ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ eQSL.cc Enter your username of eQSL.cc. Введіть Ваш логін, кориÑтувача eQSL.cc. Enter your password eQSL.cc here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Введіть Ваш пароль кориÑтувача, eQSL.cc ПопередженнÑ: Пароль буде збережено під Ñ‡Ð°Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ, у конфігураційному файлі KLog!! (Якщо Ви не бажаєте вводити пароль, KLog запитає ВаÑ, коли він знадобитьÑÑ.) eQSL.cc password eQSL.cc user ClubLog eQSL.cc QRZ.com Enter the user of your QRZ.com account. You need to be subscribed to QRZ.com to use this service. Введіть Ваш логін, кориÑтувача QRZ.com. Щоб кориÑтуватиÑÑ Ñ†Ñ–Ñ”ÑŽ поÑлугою, Вам потрібно бути підпиÑаним на QRZ.com. User Enter your password QRZ.com here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Введіть Ваш пароль кориÑтувача, QRZ.com. ПопередженнÑ: Пароль буде збережено під Ñ‡Ð°Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ, у конфігураційному файлі KLog!! (Якщо Ви не бажаєте вводити пароль, KLog запитає ВаÑ, коли він знадобитьÑÑ.) Password Activate QRZ.com ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ QRZ.com Check automatically ПеревірÑти автоматично Check in Qrz.com all Calls as they are entered ПеревірÑти на Qrz.com вÑÑ– кличні, Ñк були введені Paying Subscriber Платна підпиÑка Check it if you are paying for a qrz.com subscription Позначте, Ñкщо Ви платите за підпиÑку на QRZ.com LogBook Key LogBook Ключ LogBook Key for QSO uploading. You can get this key in your QRZ.com logbook webpage. Remember that you need a QRZ.com subscription to use this feature. Ключ Ð´Ð»Ñ Ð²Ñ–Ð´Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ QSO. Ви можете отримати цей ключ на веб-Ñторінці Ñвого журналу QRZ.com. Пам’Ñтайте, що Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ñ†Ñ–Ñ”Ñ— функції Вам потрібна підпиÑка на QRZ.com. LoTW Upload Передати Download Завантажити TQSL path ШлÑÑ… до TQSL Use TQSL ВикориÑтати TQSL LoTW password LoTW user Enter your LoTW user. Введіть Ваш логін, кориÑтувача LoTW. Enter your password LoTW here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Введіть Ваш пароль кориÑтувача, LoTW. ПопередженнÑ: Пароль буде збережено під Ñ‡Ð°Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ, у конфігураційному файлі KLog!! (Якщо Ви не бажаєте вводити пароль, KLog запитає ВаÑ, коли він знадобитьÑÑ.) Path to the TQSL software. ШлÑÑ… до ПЗ TQSL. Enable the LoTW integration with TQSL. You will need to have TQSL installed Ввімкнути інтеграцію LoTW з TQSL. Вам також, буде потрібно вÑтановити TQSL Select File Виберіть файл SetupPageHamLib Test: OK Test: NOK Test: NotOK Activate HamLib ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ HamLib Activates the hamlib support that will enable the connection to a radio. Ðктивує підтримку HamLib, Ñка дозволить підключитиÑÑ Ð´Ð¾ транÑивера. Read-Only mode Режим «Read-Only» If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio. Якщо ввімкнено, KLog читатиме ЧаÑтоту/Режим з транÑивера. Ðле ніколи, не надÑилатиме жодних команд на транÑивер. Test Click to test the connection to the radio ÐатиÑніть, щоб перевірити Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· транÑивером Defines the interval to poll the radio in msecs. Визначає інтервал Ð´Ð»Ñ Ð¾Ð¿Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ñ€Ð°Ð½Ñивера в мÑек. Poll interval Інтервал опитувань Radio ТранÑивер Select your rig. Введіть ваш TRX. Serial Серійний Network Мережа SetupPageLogView Fields ÐŸÐ¾Ð»Ñ SetupPageLogs &New &Ðовий &Edit &Правка &Remove &Видалити Add a new log. Додати новий журнал. Edit the selected log. Редагувати вибраний журнал. Remove the selected log. Видалити вибраний журнал. KLog Do you really want to remove this log? Ви дійÑно бажаєте видалити цей журнал? All the QSOs from this log will also be deleted... Ð’ÑÑ– QSO з цього журналу, також будуть видалені... Log has not been removed. (#3) Журнал не видалено. (#3) Log has not been removed. (#2) Журнал не видалено. (#2) Log has not been removed. (#1) Журнал не видалено. (#1) ID Date Дата Station Callsign Кличний Ñтанції Operators Оператори Comments Коментарі QSOs QSO The new log could not be created. Ðе вдалоÑÑ Ñтворити новий журнал. An error has occurred showing the following error code: Виникла помилка з таким кодом: KLog - SetupPageLogs SetupPageLogsNew &Date &Дата &Station Callsign &Кличний Ñтанції &Operators &Оператори Comm&ent &Коментар &Ok &Ok &Cancel &СкаÑувати Callsign used for this log. Кличний, викориÑтаний у цьому журналі Comma separated list of operators: callsign1, callsign2. СпиÑок операторів, розділених комами: Кличний1, Кличний2. Start date of this log. Початкова дата цього журналу. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. Додати коментар, про цей журнал. Якщо він заповнений, він буде показаний у головному заголовку KLog Ð´Ð»Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— журналу. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. Вам необхідно ввеÑти дійÑний кличний у полі Кличний Станції. Журнал не буде відкритий. SetupPageMisc Check non-valid calls Перевірити недійÑні кличні &Imperial system &ІмперÑька ÑиÑтема &Log in real time &Журнал в реальному чаÑÑ– Show seconds Показати Ñекунди &Time in UTC &Ð§Ð°Ñ Ð² UTC &Save ADIF on exit &Зберегти ADIF при виході Use this &default filename Файл за замовченнÑм Mark &QSO to send QSL when QSL is received Позначте &QSO, щоб надіÑлати QSL, коли QSL отримано Complete QSO with previous data Завершити QSO з попередніми даними Show the Station &Callsign used in the search box Показати &Кличний Станції, Ñкий викориÑтовуєтьÑÑ Ñƒ вікні пошуку &Check for new versions automatically &Ðвтоматично перевірÑти наÑвніÑть нових верÑій Manage DX-Marathon ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ DX-Марафоном Mark sent eQSL && LoTW in new QSO as queued Позначити надіÑлані eQSL та LoTW. У новому QSO, Ñк у черзі &Delete always temp ADIF file after uploading QSOs &Завжди видалÑти тимчаÑовий файл ADIF, піÑÐ»Ñ Ð²Ñ–Ð´Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ QSO Browse ОглÑд Move DB ПереміÑтити БД In seconds, enter the time range to consider a duplicate if same call, band and mode is entered. Ð’ Ñекундах введіть чаÑовий діапазон Ð´Ð»Ñ Ñ€Ð¾Ð·Ð³Ð»Ñду дублікату. Якщо введено той Ñамий кличний, діапазон та режим. Show seconds in the QSO editor Відображати Ñекунди, в редакторі QSO If you disable this checkbox KLog will not check callsigns to identify wrong callsigns. Якщо Ви вимкнете цей прапорець. KLog не перевірÑтиме кличні, на ідентифікацію неправильних кличних. QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. QSO буде позначено, в очікуванні на надÑÐ¸Ð»Ð°Ð½Ð½Ñ QSL. Якщо Ви отримали DX QSL але, не надіÑлали Ñвою. The search box will also show the callsign on the air to do the QSO. Ð’ полі пошуку, також буде відображено кличний в ефірі. Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÐ´ÐµÐ½Ð½Ñ QSO. Check if there is a new release of KLog available every time you start KLog. Щоразу, коли Ви запуÑкаєте KLog, перевірÑти наÑвніÑть нової верÑÑ–Ñ— KLog. Check it for Imperial system (Miles instead of Kilometers). ПеревірÑти за ІмперÑькою ÑиÑтемою (Милі, заміÑть Кілометрів). Select to use real time. Виберіть режим реального чаÑу. Select to use UTC time. Виберіть Ñ‡Ð°Ñ UTC. Select if you want to save to ADIF on exit. Виберіть, чи потрібно зберегти в ADIF піÑÐ»Ñ Ð²Ð¸Ñ…Ð¾Ð´Ñƒ. Select to use the following name for the logfile without being asked for it again. Виберіть, щоб викориÑтовувати наÑтупне Ñ–Ð¼â€™Ñ Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ журналу, без повторного запиту. Complete the current QSO with previous QSO data. Завершити поточне QSO, з даними попередніх QSO. Select if you want to manage DX-Marathon. Виберіть, Ñкщо Ви хочете керувати DX-Марафон. This is the default file where ADIF data will be saved. Файл за замовчуваннÑм, у Ñкому будуть збережені дані ADIF. This is the directory where the database (logbook.dat) will be saved. Каталог, де зберігатиметьÑÑ Ð±Ð°Ð·Ð° даних (logbook.dat). Click to change the default ADIF file. ÐатиÑніть, щоб змінити файл ADIF за замовчуваннÑм. Click to change the path of the database. ÐатиÑніть, щоб змінити шлÑÑ… до бази даних. Click to move the DB to the new directory. ÐатиÑніть, щоб переміÑтити базу даних до нового каталогу. Select the application debug log level. This may be useful if something is not working as expected. A debug file will be created in the KLog directory and/or shown with Help->Debug menu. Виберіть рівень журналу відладки програми. Це може бути кориÑно, коли щоÑÑŒ не працює, Ñк очікувалоÑÑ. Файл логу відладки, буде Ñтворено в каталозі KLog та показано через меню: Довідка->Відладка. Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default. ÐатиÑніть, щоб позначити вÑÑ– eQSL (LoTW Ñ– eQSL) у черзі (Ð´Ð»Ñ Ð½Ð°Ð´ÑиланнÑ), у вÑÑ–Ñ… нових QSO за замовчуваннÑм. Delete Always the adif file created after uploading QSOs Завжди ВидалÑти файл ADIF, Ñтворений піÑÐ»Ñ Ð²Ñ–Ð´Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ QSO Log level Рівень логу відладки Dupe time range: Ð§Ð°Ñ Ð´ÑƒÐ±Ð»ÑŽÐ²Ð°Ð½Ð½Ñ: Open File Відкрити файл Select Directory Виберіть Каталог This is the directory where DB (logbook.dat) will be saved. Ð’ цьому каталозі буде збережено база даних (logbook.dat). Please specify an existing directory where the database (logbook.dat) will be saved. Будь лаÑка, вкажіть Ñ–Ñнуючий каталог, де буде збережено базу даних (logbook.dat). KLog - Move DB KLog - ПереміÑтити БД File moved Файл переміщено File copied Файл Ñкопійовано File already exist. Файл вже Ñ–Ñнує! The destination file already exist and KLog will not replace it. Please remove the file from the destination folder before moving the file with KLog to make sure KLog can copy the file. Файл Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð¶Ðµ Ñ–Ñнує. KLog не замінить його. Будь лаÑка, видаліть файл із теки Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´ переміщеннÑм файлу за допомогою KLog. Щоб переконатиÑÑ, що KLog зможе Ñкопіювати файл. File NOT copied Файл ÐЕ Ñкопійовано The file was not copied due to an unknown problem. Файл не був Ñкопійований через невідому проблему. The target directory does not exist. Please select an existing directory. Цільовий каталог не Ñ–Ñнує. Виберіть Ñ–Ñнуючий каталог. SetupPageSats &New &Ðовий &Edit &Правка &Remove &Видалити &Import &Імпорт E&xport &ЕкÑпорт Add a new satellite. Додати новий Ñупутник. Edit the selected satellite. Відредагуйте вибраний Ñупутник. Remove the selected satellite. Видалити вибраний Ñупутник. Import a satellites file. It will replace the satellites you have in the current list. Імпортуйте файл Ñупутників. Він замінить Ñупутники, Ñкі Ñ” у Ð’Ð°Ñ Ñƒ поточному ÑпиÑку. Export your current satellites to a file. ЕкÑпортуйте поточні Ñупутники у файл. Select the sat you want to open. Виберіть Ñупутник, Ñкий хочете відкрити. KLog Do you really want to remove this satellite? Ви Ñправді хочете видалити цей Ñупутник? This satellite will no be longer available to be selected ... Цей Ñупутник більше не буде доÑтупним Ð´Ð»Ñ Ð²Ð¸Ð±Ð¾Ñ€Ñƒ ... Sat has not been removed. (#3) Супутник не видалено. (#3) Sat has not been removed. (#2) Супутник не видалено. (#2) Sat has not been removed. (#1) Супутник не видалено. (#1) ID Short Скорочено Name Ðазва Uplink Downlink Modes Режими An error has occurred showing the following error code: Виникла помилка з таким кодом: KLog - SetupPageSats Open Satellites File Відкрийте файл Ñупутників KLog warning ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ KLog An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Під Ñ‡Ð°Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… Ñупутника, ÑталаÑÑ Ð½ÐµÐ¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð° помилка. Це може бути Ñпричинено тим, що файл, Ñкий Ви намагаєтеÑÑŒ імпортувати, має неналежний формат. Please check the format or contact the developer for analysis with the error code: Будь лаÑка, перевірте формат або звернітьÑÑ Ð´Ð¾ розробника Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ñ–Ð·Ñƒ з кодом помилки: Save Satellites File Зберегти файл Ñупутників SetupPageSatsNew Short name Скорочено Sat name Ðазва UpLink DownLink Modes Режими &Ok &Ok &Cancel &СкаÑувати Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Введіть коротку назву. Спробуйте викориÑтовувати коротку назву у LoTW, щоб потім Ви могли передати Ñвої QSO до LoTW. Enter the name of the satellite. Введіть назву Ñупутника. Enter the uplink frequencies in this format: 144.300 Введіть чаÑтоти uplink, в такому форматі: 144.300 Enter the downlink frequencies in this format: 144.300 Введіть чаÑтоти downlink, в такому форматі: 144.300 Enter the modes in this format: USB Введіть режими в такому форматі: USB Some of the data you have entered is not correct; the satellite can't be added. ДеÑкі дані, Ñкі Ви ввели, Ñ” неправильними; Ñупутник не можна додати. SetupPageSubdivisionNew &Date &Дата &Station Callsign &Кличний Ñтанції &Operators &Оператори Comm&ent &Коментар &Ok &Ok &Cancel &СкаÑувати Callsign used for this log. Кличний, викориÑтаний у цьому журналі Comma separated list of operators: callsign1, callsign2. СпиÑок операторів, розділених комами: Кличний1, Кличний2. Start date of this log. Початкова дата цього журналу. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. Додати коментар, про цей журнал. Якщо він заповнений, він буде показаний у головному заголовку KLog Ð´Ð»Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— журналу. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. Вам необхідно ввеÑти дійÑний кличний у полі Кличний Станції. Журнал не буде відкритий. SetupPageSubdivisions &Remove &Видалити Import new Ðовий Імпорт Import an AWA file with the subdivision details. Імпортуйте файл AWA з інформацією про підрозділ. Remove the selected references. Видалити вибрані поÑиланнÑ. Select the references you want to open. Виберіть поÑиланнÑ, Ñкі Ви хочете відкрити. KLog Do you really want to remove the data of this entity? Ви Ñправді хочете видалити дані цього об'єкта? All the subdivision information for this entity will be deleted... Ð’ÑÑ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ підрозділи Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ об'єкту буде видалено... Log has not been removed. (#3) Журнал не видалено. (#3) Log has not been removed. (#2) Журнал не видалено. (#2) Log has not been removed. (#1) Журнал не видалено. (#1) ID Name Ім'Ñ Short Name Скорочено CQ Zone Зони CQ ITU Zone Зони ITU Deleted Видалено Start Date Початкова дата End Date Кінцева дата DXCC An error has occurred showing the following error code: Виникла помилка з таким кодом: KLog - SetupPageSubdivisions SetupPageUDP Start UDP Server ЗапуÑк UDP Сервера Automatically log QSOs from WSJT-X Ðвтоматична реєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ QSO від WSJT-X Allow WSJT-X to send logged QSOs to KLog Дозволити WSJT-X надÑилати зареєÑтровані QSO до KLog QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected QSO, зареєÑтровані в WSJT-X, будуть надіÑлані до KLog. KLog запитуватиме перед запуÑком. Якщо не вибрано "%1". KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. KLog автоматично реєÑтруватиме будь-Ñкі QSO, що надходÑть із WSJT-X, без Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð²Ñ€ÑƒÑ‡Ð½Ñƒ. Update status information from WSJT-X Оновіть інформацію про ÑÑ‚Ð°Ñ‚ÑƒÑ Ð· WSJT-X KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...) KLog автоматично відображатиме та оновлюватиме дані, що надходÑть із WSJT-X (Кличний DX, Звіт, режим, ...) UDP port number where the UDP Server will listen for packets. Ðомер UDP-порту, де UDP Сервер буде проÑлуховувати пакети. Make sure it is the same port that the other programs are sending the data to. Default port is 2237. ПереконайтеÑÑŒ, що це той Ñамий порт, на Ñкий надÑилають дані інші програми. Стандартний порт: 2237. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. UDP Сервер прийматиме QSO, надіÑлані з інших програм. Ðаприклад WSJT-X. Що дозволить Вам автоматично входити в KLog із цих програм. UDP Port UDP Порт Select the interface to listen for UDP datagrams coming from WSJT-X. Виберіть Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾ÑÐ»ÑƒÑ…Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ UDP даних, що надходÑть від WSJT-X. Network interface Мережевий Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ QSOs notification timeout (milisecs) Тайм-аут ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ QSO (міліÑекуди) Miliseconds that the notification of QSOs received from WSJTX will be shown. МіліÑекунди, протÑгом Ñких, відображатиметьÑÑ ÑповіщеннÑ. Якщо QSO отримано, від WSJT X. SetupPageUserDataPage &Personal data ПерÑональні дані Station &data Дані Ñтанції Enter your name. Введіть Ñвоє ім'Ñ. Enter your address - 1st line. Введіть Ñвою адреÑу - 1й Ñ€Ñдок. Enter your address - 2nd line. Введіть Ñвою адреÑу - 2й Ñ€Ñдок. Enter your address - 3rd line. Введіть Ñвою адреÑу - 3й Ñ€Ñдок. Enter your address - 4th line. Введіть Ñвою адреÑу - 4й Ñ€Ñдок. Enter your city. Введіть Ñвоє міÑто. Enter your zip code. Введіть Ñвій поштовий індекÑ. Enter your province or state. Введіть Ñвій регіон. Enter your country. Введіть Ñвою країну. &Name &Ім'Ñ &Address &ÐдреÑа Cit&y &МіÑто &Zip Code &Поштовий Ñ–Ð½Ð´ÐµÐºÑ Pro&v/State Регіон Countr&y Країна Enter your information for rig Введіть Ñвою інформацію про TRX ( RIG, радіо-аматорÑьке обладнаннÑ). Enter your information for antenna Введіть Ñвою інформацію про антену Enter your power information. Введіть Ñвою інформацію про потужніÑть &Rig 1 &TRX 1 R&ig 2 T&RX 2 Ri&g 3 TR&X 3 Antenna &1 Ðнтена 1 Antenna &2 Ðнтена 2 Antenna &3 Ðнтена 3 Po&wer &ПотужніÑть Enter the station callsign that will be used for logging. Введіть кличний Ñтанції, Ñкий буде викориÑтовуватиÑÑ Ð´Ð»Ñ Ñ€ÐµÑ”Ñтрації. Enter the operators (comma separated if more than one). Введіть операторів (розділіть Ñ—Ñ… комами, Ñкщо Ñ—Ñ… більше одного). Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Введіть локатор вашої Ñтанції. Як альтернатива, KLog може викориÑтати приблизний локатор, на оÑнові вашого кличного. &Callsign &Кличний &Operators &Оператори &CQ Zone &CQ зона &ITU Zone &ITU зона &Locator &Локатор &Locator (not valid) &Локатор (недійÑний) SetupPageWorldEditor Add Додати Delete Видалити Edit Правка Export World ЕкÑпорт Ðагород Import World Імпорт Ðагород Still not implemented. Ще не реалізовано. Import a new cty.csv file Імпорт нового файлу cty.csv An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. Інформаційний файл об’єктів (cty.csv) знайдено у Вашій теці KLog Ñ– буде завантажено. No entities information file (cty.csv) has been detected in your KLog folder. Інформаційний файл об’єктів (cty.csv) не знайдено у Вашій теці KLog. KLog will not be able to show entities information. KLog не зможе відобразити інформацію про об’єкти. Prefix ÐŸÑ€ÐµÑ„Ñ–ÐºÑ Entity Об'єкти ARRL ID Continent Континент CQ Zone Зони CQ ITU Zone Зони ITU UTC Latitude Широта Longitude Довгота Deleted Видалено Since Date Починаючи з дати To Date Ðа даний момент Open File Відкрити файл BigCTY (*.csv) Entities information has been updated. Інформацію про об’єкти оновлено. Entities information has not been updated. Інформацію про об’єкти не оновлено. ShowAdifImportWidget The following QSOs are those QSOs that you have received the LoTW confirmation. ÐаÑтупні QSO - це ті QSO, Ð´Ð»Ñ Ñких Ви отримали Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ LoTW. Ok DX Date/Time Дата/Ð§Ð°Ñ Band Діапазон Mode Вид ShowErrorDialog KLog Message ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ KLog SoftwareUpdateDialog Ok KLog update ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ KLog <center><h2>KLog new version (%1) is available! </h2></center><br>There is a new version of KLog available.<br><br><b>You can get the new version from:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> <center><h2>ДоÑтупна нова верÑÑ–Ñ KLog (%1)! </h2></center><br>Ðову верÑÑ–ÑŽ KLog.<br><br><b>Ви можете завантажити з:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> Congratulations! Вітаємо! Your KLog has been updated. Ваш KLog оновлений! You already have the latest version. Ви вже маєте найновішу верÑÑ–ÑŽ. StartWizard KLog - The free hamradio logging program KLog - Безкоштовний апаратний журнал Quit Setup Вийти з Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Setup is not complete yet. Are you sure you want to quit setup? ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‰Ðµ не завершено. Ви впевнені, що бажаєте вийти з налаштуваннÑ? StatisticsWidget QSO per year QSO за рік DXCC per year DXCC за рік CQ zones per year Зони CQ за рік QSO per band QSO по діапазонах QSO per mode QSO по режимах QSO per DXCC QSO по DXCC QSO per Continent QSO по Континентам QSO per hour QSO по годинах QSO per month QSO по міÑÑцÑÑ… Worked / Confirmed status СтатуÑ: Відпрацьовано / Підтверджено Worked / Sent status СтатуÑ: Відпрацьовано / ÐадіÑлано Sent / Confirmed status СтатуÑ: ÐадіÑлано / Підтверджено Satellite grid status Satellite DXCC status СтатуÑ: DXCC Супутники Grids per band status DXCC per band status СтатуÑ: DXCC по діапазонах StatsCQZPerYearBarChartWidget CQ Zones per year Зони CQ за рік Reading data ... Ð—Ñ‡Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… ... Abort reading СкаÑувати Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ CQ zones Зони CQ CQ zones per year Зони CQ за рік Reading data ... Ð—Ñ‡Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…... Years: %1/%2 Роки: %1/%2 StatsDXCCOnSatsWidget Show confirmed only Показувати тільки підтверджені Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Ðомер Callsign Кличний Date Дата Band Діапазон Mode Вид DXCC Satellite Супутник Confirmed Підтверджено No ÐÑ– StatsEntitiesPerYearBarChartWidget DXCC Entities DXCC за рік Chart title Заголовок діаграми Reading data ... Ð—Ñ‡Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… ... Abort reading СкаÑувати Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Reading data ... Ð—Ñ‡Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…... Entities: Об’єкти: StatsFieldPerBandWidget All Ð’ÑÑ– Mode: Вид: Band Діапазон Worked Відпрацьовано Confirmed Підтверджено StatsGridsOnSatsWidget Show confirmed only Показувати тільки підтверджені Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Ðомер Callsign Кличний Date Дата Band Діапазон Mode Вид Grid Satellite Супутник Confirmed Підтверджено No ÐÑ– StatsQSOsPerBandBarChartWidget QSOs per band QSO по діапазонах Reading data ... Ð—Ñ‡Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… ... Abort reading СкаÑувати Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Bands Діапазони QSOs per band distribution Розподіл QSO по діапазонах Reading data ... Ð—Ñ‡Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…... Bands: Діапазони: StatsQSOsPerContinentBarChartWidget QSOs per continent QSO по континентам Reading data ... Ð—Ñ‡Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… ... Abort reading СкаÑувати Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Continents Континенти Reading data ... Ð—Ñ‡Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…... Hours: Години: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC QSO по DXCC Reading data ... Ð—Ñ‡Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… ... Abort reading СкаÑувати Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Reading data... Ð—Ñ‡Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…... DXCC Top ten DXCC per QSO Топ деÑÑть QSO по DXCC StatsQSOsPerHourBarChartWidget QSOs per hour QSO по годинах Reading data ... Ð—Ñ‡Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… ... Abort reading СкаÑувати Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Hours Години QSOs at hour QSO за годину Reading data ... Ð—Ñ‡Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…... Hours: Години: StatsQSOsPerModeBarChartWidget QSOs per mode QSO по видам Reading data ... Ð—Ñ‡Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… ... Abort reading СкаÑувати Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Modes Режими QSOs per mode distribution Розподіл QSO по режимах Reading data ... Ð—Ñ‡Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…... Modes: Режими: StatsQSOsPerMonthBarChartWidget QSOs per month QSO по міÑÑцÑÑ… Reading data ... Ð—Ñ‡Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… ... Abort reading СкаÑувати Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Jan Січ. Feb Лют. Mar Берез. Apr Квіт. May Трав. Jun Черв. Jul Лип. Aug Серп. Sep ВереÑ. Oct Жовт. Nov ЛиÑтоп. Dec Груд. Months МіÑÑці QSOs at Month QSO за міÑÑць Reading data ... Ð—Ñ‡Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…... Months: МіÑÑці: StatsQSOsPerYearBarChartWidget QSOs QSO QSOs per year QSO за рік Reading data ... Ð—Ñ‡Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… ... Abort reading СкаÑувати Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Reading data ... Ð—Ñ‡Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…... QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 ÐадіÑлано - %1 Confirmed - %2 Підтверджено - %2 Sent / Confirmed status СтатуÑ: ÐадіÑлано / Підтверджено StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Працював, не підтверджено - %1 Confirmed - %2 Підтверджено - %2 Worked / Confirmed status СтатуÑ: Відпрацьовано / Підтверджено StatsWorkedSentPieChartWidget Worked - %1 Відпрацьовано - %1 Sent - %2 ÐадіÑлано - %2 Worked / Sent status СтатуÑ: Відпрацьовано / ÐадіÑлано TipsDialog KLog tips Поради KLog Next ÐаÑтупна Previous ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ <b>Tip #1:</b><br>Do you know...<br>You can use <a href="#ToolsFillInQSO">Tools->Fill in QSO data</a> to automatically read the full log to fill the DXCC, CQ, ITU zones and continent? Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in QSO data <b>Порада #1:</b><br>Чи знаєте Ви...<br>Ви можете викориÑтати: <a href="#ToolsFillInQSO">ІнÑтрументи->Заповнити дані QSO</a> Щоб автоматично читати повний журнал Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ: DXCC, CQ, ITU зон та Континенту? <b>Tip #2:</b><br>Do you know...<br>You can find the QSLs that you still need to send with <a href="#ToolsSendPendingQSL">Tools->QSL tools...->Find My-QSLs pending to send</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Requested</i>. Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in DXCC data <b>Порада #2:</b><br>Чи знаєте Ви...<br>Ви можете знайти QSL, Ñкі Вам ще потрібно надіÑлати<a href="#ToolsSendPendingQSL">ІнÑтрументи->ІнÑтрументи QSL->Знайти QSO Ð´Ð»Ñ Ð½Ð°Ð´ÑÐ¸Ð»Ð°Ð½Ð½Ñ QSL</a>.<bR>Цей інÑтрумент перерахує у вікні пошуку вÑÑ– QSO позначеними Ñк QSL-Sent, <b>Tip #3:</b><br>Do you know...<br>You can use <a href="#ToolsFindQSO2QSL">Tools->QSL tools...->Find QSO to QSL</a> to look for all those QSO that you should send your QSL because you still need to confirm that DXCC and you have still not send your QSL card? Translator: Please make sure that the name of the link is coherent with the menu Tools->QSL tools...->Find QSO to QSL <b>Tip #4:</b><br>Do you know...<br>You can enter a '*' in the search box, in the search window to search for all the QSOs done with one specific station callsign? Translator: Please make sure that the name of the link is coherent with the menu File->Export Requested QSL to ADIF... <b>Tip #5:</b><br>Do you know...<br>You can find the file containing all your log and other information in the logbook.dat file and the klogrc file, containing the KLog config file in the KLog folder by opening the <a href="#FileOpenKLogFolder">File->KLog folder</a> menu? <b>Tip #6:</b><br>Do you know...<br>You can upload your QSO marked as queued to LoTW via TQSL with <a href="#ToolsUploadLoTW">Tools->LoTW tools ...->Sends the log to LoTW calling TQSL.</a> ?<br><br>You have to configure TQSL in the preferences to be able to use this functionality. Translator: Please make sure that the name of the link is coherent with the menu File->KLog folder <b>Tip #7:</b><br>Do you know...<br>You can see the QSO that confirms one specific DXCC entity in one specific band by poiting your mouse over that band in the DXCC widget? Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find My-QSLs pending to send <b>Tip #8:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceivePendingQSL">Tools->QSL tools...->Find DX-QSLs pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Sent</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find DX-QSLs pending to receive <b>Tip #9:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceiveRecPendingQSL">Tools->QSL tools...->Find requested pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Rec marked as <i>Requested</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find requested pending to receive <b>Tip #10:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/klogchat>English KLog Telegram group</a> to discuss about KLog in English? <b>Tip #11:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/KLogES>Spanish Telegram group</a> to discuss about KLog in Spanish? <b>Tip #12:</b><br>Do you know...<br>You can subscribe to <a href=https://groups.io/g/klog>KLog mailing list</a> to discuss via email about KLog in English? <b>Tip #13:</b><br>Do you know...<br>You can <a href=https://twitter.com/_ea4k>follow EA4K on twitter</a> to get updates about KLog? <b>Tip #14:</b><br>Do you know...<br>You can write your own <a href=https://www.eham.net/reviews/detail/3118>review in eHam.net about KLog</a> to help other users to decide to use KLog? <b>Tip #15:</b><br>Do you know...<br>You can join the development team by simply <a href=https://www.klog.xyz/contact>Contacting us</a>? <b>Tip #16:</b><br>Do you know...<br>That there are many ways to contribute to KLog and some of them are listed in the <a href=https://www.klog.xyz/contrib>KLog Contribute</a> page? <b>Tip #17:</b><br>Do you know...<br>You can support translating KLog into your language? Please check <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a> page. <b>Tip #18:</b><br>Do you know...<br>You can double-click on an entity name in the DXCC table and all the QSOs with that DXCC Entity will be shown in the search box? <b>Tip #19:</b><br>Do you know...<br>You can right-click on a QSO and select <i>Check in QRZ.com</i> to check that callsign in QRZ.com? UpdateSatsData Reading Satellites data file... Ð§Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ даних Ñупутника... Abort reading СкаÑувати Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ The Satellites information has been updated. Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ Ñупутники оновлена! Open File Відкрити файл Sat Data UpdateSettings KLog - Settings update KLog - ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½ÑŒ The settings system has been changed and KLog will update your settings file. СиÑтему налаштувань було змінено. KLog оновить ваш файл налаштувань. World Reading cty.csv... Ð§Ð¸Ñ‚Ð°Ð½Ð½Ñ cty.csv... Abort reading СкаÑувати Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ eLogClubLog Host not found! ХоÑÑ‚ не знайдено! Timeout error! Помилка тайм-ауту! It seems to be a CREDENTIALS ERROR; check your email and password. Схоже, це ПОМИЛКРОБЛІКОВИХ ДÐÐИХ; перевірте Ñвою електронну пошту та пароль. KLog - ClubLog It seems that your ClubLog credentials are not correct. Схоже, Ваші облікові дані ClubLog неправильні. Please check your credentials in the setup. ClubLog uploads will be disabled. Перевірте Ñвої облікові дані в налаштуваннÑÑ…. Ð’Ñ–Ð´Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð¾ ClubLog буде вимкнено. QSO dupe or not existing (#%1)... We have received an undefined error from Clublog (%1) Ми отримали невизначену помилку від ClubLog (%1) This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO. Ð¦Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° може бути викликана тим, що QSO дублюєтьÑÑ, або Ñкщо видалÑєтьÑÑ, то намагаєтьÑÑ, видалити неіÑнуюче QSO. Undefined error number (#%1)... Ðевизначена помилка номер (#%1)... Please check your config in the setup and contact the KLog development team if you can't fix it. ClubLog uploads will be disabled. Будь лаÑка, перевірте Вашу конфігурацію в налаштуваннÑÑ… та звернітьÑÑ Ð´Ð¾ команди розробників KLog, Ñкщо Ви не можете Ñ—Ñ— виправити. Ð’Ñ–Ð´Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð¾ ClubLog буде вимкнено. Undefined error... Ðевизначена помилка... Callsign missing Кличний відÑутній Invalid callsign Кличний недійÑний Skipping SWL callsign ПропуÑк кличного SWL Callsign is your own call Кличний - це ваш влаÑний виклик Invalid callsign with no DXCC mapping ÐедійÑний кличний із відÑутнім ÑпіввідношеннÑм до DXCC Updated QSO ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ QSO Invalid ADIF record ÐедійÑний Ð·Ð°Ð¿Ð¸Ñ ADIF Missing ADIF record ВідÑутній Ð·Ð°Ð¿Ð¸Ñ ADIF Test mode - parameters ok, no action taken ТеÑтовий режим - параметри в нормі, жодних дій не виконано Excessive API Usage Ðадмірне викориÑÑ‚Ð°Ð½Ð½Ñ API Internal Error Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° Rejected Відхилено QSO Duplicate QSO Дублікат QSO Modified QSO Модифіковано Missing Login ВідÑутній логін QSO OK QSO Ok Upload denied Ð’Ñ–Ð´Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð°Ð±Ð¾Ñ€Ð¾Ð½ÐµÐ½Ð¾ No callsign selected Кличний не вибрано No match found Збігів не знайдено Dropped QSO QSO Скинуто OK Login rejected Логін відхилено Rejected: Callsign is your own call Відхилено: Кличний - це ваш влаÑний виклик eLogQrzLog Host not found! ХоÑÑ‚ не знайдено! Timeout error! Помилка тайм-ауту! Undefined error number (#%1) Ðевизначена помилка номер (#%1) KLog - QRZ.com We have received the following error from QRZ.com (%1) Ми отримали від QRZ.com таку помилку (%1) You are not subscribed to QRZ.com. Ви не підпиÑані на QRZ.com. Not valid KEY found Знайдено недійÑний КЛЮЧ Please configure your QRZ.com API key. You will find it in your QRZ.com Logbook settings webpage. You need a QRZ.com subscription to use this feature. Будь лаÑка, налаштуйте ключ від API QRZ.com. Ви знайдете його на веб-Ñторінці QRZ.com. Ð”Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ñ†Ñ–Ñ”Ñ— функції, Вам потрібна підпиÑка на QRZ.com. KLog - QRZ.com password needed KLog - Потрібен пароль Ð´Ð»Ñ QRZ.com Please enter your QRZ.com password: Будь лаÑка, введіть Ваш пароль QRZ.com: Callsign missing Кличний відÑутній eQSLUtilities KLog - eQSL eQSL has sent the following message: %1 eQSL надіÑлав таке повідомленнÑ: %1 Host not found! ХоÑÑ‚ не знайдено! Timeout error! Помилка тайм-ауту! Undefined error number (#%1)... Ðевизначена помилка номер (#%1)... We have received an undefined error from eQSL (%1) Ми отримали невизначену помилку від eQSL (%1) Please check your config in the setup and contact the KLog development team if you can't fix it. eQSL uploads will be disabled. Будь лаÑка, перевірте Вашу конфігурацію в налаштуваннÑÑ… та звернітьÑÑ Ð´Ð¾ команди розробників KLog, Ñкщо Ви не можете Ñ—Ñ— виправити. Ð’Ñ–Ð´Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð¾ eQSL буде вимкнено. eQSL Error: User or password incorrect Помилка eQSL: Ðеправильні кориÑтувач або пароль eQSL Warning: At least one of the uplodaded QSOs is duplicated. ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ eQSL: Принаймні одне із відвантажених QSO дублюєтьÑÑ. eQSL: All the QSOs were properly uploaded. eQSL: Ð’ÑÑ– QSO відвантажені! KLog - eQSL.cc password needed KLog - Потрібен пароль Ð´Ð»Ñ eQSL.cc Please enter your eQSL.cc password: Будь лаÑка, введіть Ваш пароль eQSL.cc: klog-2.3.3/translations/klog_pl.ts0000644000015700001710000134463314542412415017073 0ustar jenkinsjenkins AboutDialog About KLog O progrmie By Przez KLog is a free logbook for hamradio operators. KLog jest darmowym programem logujÄ…cym dla krótkofalowców. Since 0.6.2, KLog has been fully rewritten to provide a cross-platform application that runs on all major operating systems (GNU/Linux, macOS and Windows) and to support new functionality. Please provide your review in KLog's eHam review page: ProszÄ™ o napisanie opini na tema KLog na stronie eHam: Find more information and the latest release at Aby dowiedzieć siÄ™ wiÄ™cej oraz najnowsze wydania na You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Możesz również pomóc przesyÅ‚ajÄ…c błędy programu oraz swoje pomysÅ‚y lub cokolwiek co pomogÅ‚o by w poprawie KLog. At present, the data that is provided is the following: W tym momÄ™cie, dane dostarczone zawierajÄ…: Please be aware that this is a development release and it may contain many bugs.<br>Backup your data before using this software! Author Autor today dzisiaj Main developer Główny twórca KLog is developed by a very small team and you are invited to join! KLOG Jest tworzony przez bardzo maÅ‚e grono entuzjastów. Dołącz do nas! If you want to provide support you are welcome to join the <a href="https://groups.io/g/klog">KLog mailing list</a>! Authors Autorzy Translators bring KLog into your language. They are really an important part of the KLog development team. TÅ‚umacze przeÅ‚ożli KLOG na Twój jÄ™zyk. TÅ‚umacze sÄ… naprawdÄ™ ważnÄ… częściÄ… grupy rozwojowej KLOG. If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://groups.io/g/klog">KLog mailing list</a>! Translators TÅ‚umacze Privacy advisory Postanowienia prawne KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account users' needs. Callsign Znak wywoÅ‚awczy KLog version Wersja KLog Operating system System operacyjny Be aware that you can enable/disable this feature from the Misc tab in the Setup page. KLog Klog Privacy Prywatność AdifLoTWExportWidget Select the Station Callsign that you want to use to upload the log. Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign. Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign. Station callsign My Locator Mój lokator Start date End date Ok OK Cancel Anuluj DX Date/Time Data/Czas Band Pasmo Mode Emisja Not defined ALL QSOs: %1/%2 All Wszystko KLog - QSOs to be uploaded to LoTW. This table shows the QSOs that will be sent to LoTW. KLog - QSOs to be uploaded to ClubLog. This table shows the QSOs that will be sent to ClubLog. KLog - QSOs to be uploaded to eQSL.cc. This table shows the QSOs that will be sent to eQSL.cc. KLog - QSOs to be uploaded to QRZ.com. This table shows the QSOs that will be sent to QRZ.com. This table shows the QSOs that will be exported to ADIF. AwardsWidget Recalculate Click to recalculate the award status. Select the year you want to check. QSOs QSOs DXCC DXCC CQ CQ Award Confirmed Potwierdzone Worked WAZ Score Annual Number of confirmed DXCC entities. Number of worked DXCC entities. Number of confirmed WAZ zones. Number of worked WAZ zones. Number of confirmed QSOs. Number of worked QSOs. Number of QSOs worked in the selected year. Number of DXCCs worked in the selected year. Number of CQ Zones worked in the selected year. Score for the DXMarathon in the selected year. DX-Marathon CTYPage Country data download Lista krajów zostaÅ‚a pobran KLog needs country data... Klog wymga danych paÅ„stwa... &Download &Pobieranie &Ignore &Ignorownie Country data needed Wymagana lista krajów KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do. Click on Download to download now. ProszÄ™ nacisnąć Pobierz aby zacząć pobieranie. KLog Klog I can't find the host. Please check your network and try again Do you want to try again? Nie mogÄ™ odnaleźć host. ProszÄ™ sprawdzić swoje połączenie sieciowe oraz spróbować ponownie Czy chciaÅ‚byÅ› spróbować ponownie? DXCCStatusWidget Update Aktualizacja It seems that the DXCC status in your database is not updated and KLog can't find any dxcc information. You can try to fix this by updating the log. Do you want to update your DXCC status? Entity Jednostka Prefix Pref: CQ: ITU: Beam: Entity not worked in this band. DXClusterWidget Click on Connect to connect to the DX-Cluster server NaciÅ›nij Połącz aby połączyć z DX-Cluterem Connect Połącz Clear Wyczyść Check in QRZ.com Check this callsign in QRZ.com Click on connect to connect to the DX-Cluster NaciÅ›nij na Połącz aby połączyć z DX-Cluster Trying to connect to the server Próba nawiÄ…zania połączenia z serwerem KLog DXCluster Klog DX Cluster The host was not found. Please check: Host nie zostaÅ‚ odnaleziony. ProszÄ™ sprawdzić: - your network connection; - the host name and port settings. - połączenie sieciowe; - nazwa hosta oraz ustawienia portów. The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. Połączenie zostaÅ‚o odrzucone przez peer Upewnij siÄ™ że DX Cluster jest włączony oraz sprawdź czy ustawienia sÄ… prawidÅ‚owe. The following error occurred: %1. PojawiÅ‚ siÄ™ pewien błąd:%1. Connected to server Połączono z serwerem KLog message Wiadomość KLog Enter your callsign to connect to the cluster: Wprowadź swój znak aby połączyć siÄ™ z clusterem: Enter your password to connect to the cluster: (Just hit enter for no password) Wprowadź swoje hasÅ‚o aby połączyć siÄ™ z Clusterem: ( NaciÅ›nij Enter aby połączyć bez hasÅ‚a ) Disconnect Rozłącz Not logged on, you may need to enter your callsign again. Nie zalogowano, być może konieczne bÄ™dzie wpisać Twój znak ponownie. Enter here the commands to be sent to the DX-Cluster server. Connection closed by the server Połączenie zamkniÄ™te przez serwer Click on Connect to connect to the DX-Cluster server. Send WyÅ›lij It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! DataProxy_SQLite Software version in DB is null Wersja oprogramowania w DB jest zero Aircraft Scatter Common term in hamradio, do not translate if not sure Aurora Aurora-E Back scatter Common term in hamradio, do not translate if not sure Earth-Moon-Earth Sporadic E Internet-assisted Ionoscatter Common term in hamradio, do not translate if not sure Meteor scatter Common term in hamradio, do not translate if not sure Terrestrial or atmospheric repeater or transponder Rain scatter Common term in hamradio, do not translate if not sure Satellite Satelita Bureau Common term in hamradio, do not translate if not sure Manager Common term in hamradio, do not translate if not sure All QSOs have been updated with a DXCC and the Continent. Field Aligned Irregularities Common term in hamradio, do not translate if not sure Query didn't failed F2 Reflection Common term in hamradio, do not translate if not sure Trans-equatorial Common term in hamradio, do not translate if not sure Tropospheric ducting Common term in hamradio, do not translate if not sure Yes No Requested Ignore/Invalid Validated Queued Uploaded Do not upload Modified Direct Direct Electronic KLog DXCC KLog DXCC KLog - Invalid call detected An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported ADIF record? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. DownLoadCTY Download of cty.csv failed with the following error code: Pobieranie pliku CTY.CSV zakoÅ„czone z błędem o kodzie: Download of cty.csv done. Pobieranie pliku CTY.CSV ukoÅ„czone. There is already a cty.csv file in the folder but it will be replaced with the new one. Plik CTY.CSV już znajduje siÄ™ w folderze ale zostnie on zastÄ…piony nowym. Could not open %1 for writing FileAwardManager Open Award file Award files (*.awa) Award file not opened KLog was not able to read the award file It was not possible to open the file %1 for reading. AWA wrong format The AWA file does not have the right format AWA file does not have an <EOH> field KLog - %1 FileManager Writing ADIF file... Zapisywanie pliku ADIF... Abort writing Przerwij zapisywanie Writing ADIF file... QSO: Zapisywanie pliku ADIF... QSO: It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) WyglÄ…da na to że w pliku ADIF który wÅ‚aÅ›nie importujesz znajduje siÄ™ kilka zduplikowanych QSO. Czy nadal chcesz kontynuować? ( Zduplikowane QSO nie bÄ™dÄ… zaimportowane ) You have canceled the file export. The file will be removed and no data will be exported. Eksport pliku zosaÅ‚ anulowany. Plik zostanie usuniÄ™ty oraz żadne dane wyeksportowane. Do you still want to cancel? Czy nadal chcesz anulować? There is more than one log in this logfile. W tym pliku logu znajduje siÄ™ wiÄ™cej niż jeden log. All logs will be imported into the current log. Wszystkie logi zostanÄ… zaimportowane do bierzÄ…cego logu. Do you want to continue? Czy nadal chcesz kontynuować? Importing ADIF file... Importowanie pliku ADIF... QSO: QSO: This QSO had: To QSO miaÅ‚o: Do you want to continue with the current file? Czy nadal chcesz kontynuować z obecnym plikiem? Reading LoTW file... Wczytywanie pliku LOTW... Reading ADIF file... Wczytywanie pliku ADIF... KLog - Error The selected log does not exist, please check it again. The file %1 can't be opened. Processing LoTW ADIF file... Abort processing LoTW reading KLog - Add new QSOs? Do you want to add non existing QSOs to your local log? There are some QSOs in the LoTW log that are not in your local log. Processing LoTW ADIF file...... QSO: %1 / %2 You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated. Do you want to add dupe QSOs to your local log? There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date. Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. KLog - Don't ask again Do you want to reuse your answer? KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again. <ul><li>Date/Time:</i> %1</li><li>Callsign: %2</li><li>Band: %3</li><li>Mode: %4</li></ul> KLog - QSO not found Do you want to add this QSO to the log?: We have found a QSO coming from LoTW that is not in your local log. Do you want KLog to add this QSO to the log? KLog - Invalid call detected An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported log file? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log file? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. You can, however, edit the ADIF file once the export process is finished. KLog - User cancelled The selected callsign (%1) is not valid, please check it again to export the log. KLog - Log selection KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO with %1 on %2: KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO on %1: Please edit the ADIF file and make sure that it include at least: ProszÄ™ o sprawdzenie pliku ADIF oraz upewnienie siÄ™ że zawiera przynajmniej: and oraz Abort reading Przerwij wczytywanie KLog - Duplicated QSOs You have canceled the file import. The file will be removed and no data will be imported. There are no QSOs pending to be exported with that station callsign. Export Exporting ADIF file... QSO: %1 / %2 Export progress KLog - File not opened It was not possible to open the file %1 for reading. KLog was not able to read the LoTW file Importing LoTW ADIF file... This QSO is not including the minimum data to consider a QSO as valid! - The band missing and the following call: - Brakuje pasma w wybranym QSO: - The mode missing and the following call: - Brakuje emisji dla wybranego znaku: - The date missing and the following call: - Brakuje daty dla wybranego znaku: - The time missing and the following call: - Brakuje czasu dla wybranego znaku: KLog: Not all required data found! KLog: Nie wszystkie wymagane dane zostaÅ‚y znalezione! Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information. If you select NO, maybe the QSO will not be imported. Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. KLog - Apply to all QSOs in this log? KLog: No RST TX found! Klog: Nie znaleziono RST-TX! KLog: No RST RX found! Klog: Nie znaleziono odebranych raportów RST-RX! KLog - No Station callsign entered. KLog - QSO without Station Callsign HamLibNetworkConfigWidget Enter the hostname or address of the radio. Set de network port of the radio. Host/Address Port Enter the port of the radio. HamLibSerialConfigWidget Bauds Select the serial port speed. Port Select the serial port. Only the serial ports that are detected are shown. Scan Click to identify the serial ports available in your computer. 5 bits 6 bits 7 bits 8 bits Data bits Select the serial data bits. None Hardware Software XON/XOFF Flow control Select the serial flow control No parity Even Odd Space Mark Parity Select the serial parity. 1 bit 1.5 bits 2 bits Stop bits Select the serial stop bits. InfoWidget 10M 10M 15M 15M 20M 20M 40M 40M 80M 80M 160M 160M 2M 2M 6M 6M 12M 12M 17M 17M 30M 30M 70CM 70CM Continent Kontynent Prefix Prefiks CQ CQ ITU ITU Short Path Krótka droga Long Path DÅ‚uga droga Deg Miles Mile Km Km IntroPage Welcome to KLog! Witamy w KLog! Welcome to KLog! - brought to you under the terms of the GPL! Witamy w KLog! - Napisanym pod licÄ™cjÄ… GPL! Welcome to KLog Witaj w KLog This looks like it's the first time you've run KLog on this computer. WyglÄ…da na to że to pierwszy raz kiedy korzystasz z KLog na tym komputerze. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. It is designed to provide general purpose DX, and contest logging. It supports QSL management, import and export of ADIF Posiada możlowość zarzÄ…dzania kartami QSL, import oraz eksport z oraz do ADIF and Cabrillo file formats and many other features... oraz format Cabrill and wiele innych funkcji... Before you can start using KLog, you will be asked to: Zanim zaczniesz korzystać z KLog, bÄ™dziesz poproszony o: Acknowledge to the terms of the license. Informacje dotyczÄ…ce warunków licencji. Download the DX entities information. Pobierz Informacje o jednostakach DX. Enter your callsign, CQ zone, etc. and main configuration. Podaj swój znak wywoÅ‚awczy, StrefÄ™ CQ, oraz inne przy konfiguracji główniej. Enjoy KLog and contact the development team if you have any suggestions! Korzystaj z KLog oraz z twóracmi programu jeÅ›li masz jakieÅ› sugestje! LicPage KLog License information KLog informacje na temat licÄ™cji Welcome to KLog!- brought to you under the terms of the GPL! Witaj w KLog! -Napisany pod licencjÄ… GPL! Acknowledge Acknowledge Be aware that KLog is free software. PamiÄ™taj o tym że KLog jest oprogramowaniem darmowym. LoTWUtilities KLog - LoTW password needed Please enter your LoTW password: Are you sure that you want to use that station callsign (%1)? There is a file already existing with the name that will be used. The file %1 already exist. Do you want to overwrite? KLog was not able to save the file %1. Error returned: %2 Downloading data to file: %1. KLog - LoTW download This is the first date of a QSO with the callsign %1 in this log If you think that in LoTW you may have previous QSOs, answer No. Do you want to use this date (%1) as start date? The remote server redirected our connection to %1 Do you want to follow the redirection? It was not possible for find the file %1 that has been just downloaded. It seems that LoTW has no QSO with the Station Callsign you are using (%1). Try again and send the downloaded file (%1) to the KLog developer for analysis. KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data? KLog - LoTW File already exists Double click on the date that you want to use as the start date for downloading QSOs. KLog - LoTW Station callsign There is not a single QSO in the log with that station callsign. KLog - LoTW Can't write the file The file %1 already exists. KLog - LoTW Start date selection KLog - LoTW Download error There was an error (%1) while downloading the file from LoTW. The downloading error details are: %1 KLog - LoTW Redirection found KLog - LoTW File not found KLog can't find the downloaded file. KLog - LoTW user/password error LoTW server did not recognized your user/password Check your user and password and ensure your are using the right one before trying again. KLog - LoTW No QSOs LoTW sent no QSOs KLog - LoTW Unknown error KLog can't recognize the file that has been downloaded from LoTW. Now KLog will process the downloaded QSO and update your local log. LogWindow QSL Send QSL wysÅ‚ane QSL Rcvd QSL Otrzymane &Delete &Delete Delete a QSO UsuÅ„ QSO &Edit QSO &Edit QSO Edit this QSO Edytuj QSO Via &bureau Via &bureau Send this QSL via bureau Wyśłij QSL przez biuro D&irect D&irect Send this QSL via direct WyÅ›lij QSL direktem Via bureau Przez biuro QSL &received via bureau QSL &received via bureau Direct Direct QSL received via direc&t QSL odebrane przez direct&t Check in QRZ.com Check this callsign in QRZ.com Check in DXHeat.com Check this callsign in DXHeat.com Delete selected QSOs Delete the selected QSOs Export to ADIF Export the selected QSOs to an ADIF file. Upload to LoTW Upload the selected QSOs to LoTW Upload to ClubLog Upload the selected QSOs to ClubLog Upload to eQSL.cc Upload the selected QSOs to eQSL.cc Send these QSLs via bureau Send these QSLs via direct QSLs received via bureau QSLs received via direc&t Select none Remove all selections Select all Select all the QSOs MainQSOEntryWidget &Add &Clear &Clear Callsign of the QSO. Band of the QSO. Mode of the QSO. Date of the QSO. Time of the QSO. Add the QSO to the log. Clears the QSO entry. Look up info about the current callsign on qrz.com KLog will show real time if enabled. Real time Stop wsjt-x and hamlib from automatically updating QSO information. Manual Mode Callsign Znak wywoÅ‚awczy &Save &Cancel &Cancel DUPE Translator: DUPE is a common world for hams. Do not translate of not sure MainWindow Starting KLog DX Entity &Log Window KLog Klog It was not possible to open the debug file for writing. No debug log will be saved! Status bar ... It was not possible to define the KLog folder. Some functions may not work properly! KLog - CTY.dat update Log backup recommended! KLog - Backup KLog - New version detected! Ready KLog - Not valid call Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. You have selected an entity: that is different from the KLog proposed entity: Click on the prefix of the correct entity or Cancel to edit the QSO again. KLog - ClubLog error KLog - eQSL error KLog - %1 Settings ... Queue all QSOs from this log to be sent Download from LoTW ... Download the full log from LoTW ... ClubLog tools ... Upload the queued QSOs to ClubLog ... eQSL tools ... Upload the queued QSOs to eQSL.cc ... QRZ.com tools ... Do you really want to mark ALL the QSOs of this log to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. Your log has been updated with the LoTW downloaded QSOs. KLog has updated %1 QSOs from LoTW. Do you really want to mark ALL pending QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. There was a problem to mark all pending QSOs as queued for LoTW! All queued QSOs of this log has been marked as sent to LoTW! There was a problem to mark all queued QSOs as sent to LoTW! No QSOs have been exported to ADIF. KLog has exported %1 QSOs to the ADIF file: %2 You need to select one station callsign to be able to send your log to LoTW. There was an error while updating to Yes the LoTW QSL sent information. The selection you have done does not include any QSO The selection you have done does not include any QSO. KLog - Select the Station Callsign. The log is ready to be uploaded to QRZ.com. All the QSOs in this log has been marked as Modified in the QRZ.com status field KLog could not mark the full log to be sent to QRZ.com To upload QSOs you need a qrz.com subscription. If you have one, go to Setup->QRZ.com tab to enable it. RSTrx RSTrx RSTtx RSTtx Do you really want to exit KLog? KLog - File not open KLog - Select correct entity KLog - Exit &File Import an ADIF file into the current log. Export the current log to an ADIF logfile. Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Print your log. KLog folder Opens the data folder of KLog. E&xit &Tools Fill in QSO data Go through the log reusing previous QSOs to fill missing information in other QSOs. Shows QSOs for which you should send your QSL and request the DX QSL. Find My-QSLs pending to send Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Mark all queued QSOs in this log as sent to LoTW. Mark all queued QSOs as sent to LoTW. For updated DX-Entity data, update cty.csv. Stats Show the statistics of your radio activity. &Help KLog needs to update the Entities database. This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. The QRZ.com upload process has finished with an error and the log was possibly not uploaded. Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? KLog - QRZ.com There was an error while updating to Yes the QRZ.com QSO upload information. The QRZ.com upload process has finished successfully Call not found in QRZ.com KLog - QRZ.com error KLog has received an error from QRZ.com. Queue all the QSOs to be uploaded Queue all the QSO to be uploaded KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded. Error #2: Upload was rejected by LoTW, please check your data. Error #3: The TQSL server returned an unexpected response. Error #4: There was a TQSL error. Error #5: There was a TQSLLib error. Error #6: It was not possible to open the input file. Error #7: It was not possible to open the ouput file. Error #8: No QSOs were processed since some QSOs were duplicates or out of date range. Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range. Error #10: Command syntax error. KLog sent a bad syntax command. Error #11: LoTW Connection error (no network or LoTW is unreachable). Error #00: Unexpected error. Please contact the development team. The log that you have selected contains more than just one station callsign. Log który wÅ‚aÅ›nie zostaÅ‚ zaznaczony zawiera wiÄ™cej niż jeden znak stacji. Please select the station callsign you want to mark as sent to LoTW: Station Callsign: Znak Stacji: Define Station Callsign Zdefinuj Znak Stacji Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Wprowadż znak stacji aby używać go z tym Logiem, lub pozostaw puste miejsce dlaQSO bez znaku: You have selected no callsign. KLog will complete the QSOs without a station callsign defined and those with the callsign you are entering here. KLog - No station selected No station callsign has been selected and therefore no log will be marked Congratulations! Gratulacje! You already have the latest version. Już posiadasz najnowszÄ… wersjÄ™. You can find the KLog data folder here: start stop If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. TQSL finished with no error. Do you want to mark as Sent all the QSOs uploaded to LoTW? Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1 ClubLog ClubLog KLog - QRZ.COM QRZ.COM KLog - QSO received Duplicated QSOs have to match another existing QSO with the same call, band, mode, date and time, taking into account the period that can be defined in the settings. QSO logged from WSJT-X: It seems that you are running this version of KLog for the first time. You have requested to delete the QSO with: %1 Are you sure? Czy jesteÅ› pewien? Check always the current callsign in QRZ.com You can update the entities database in Tools->Update cty.csv The callsign %1 is not a valid call. Do you really want to add this callsign to the log? You have requested to delete several QSOs The ClubLog upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? KLog - ClubLog Klog -ClubLog KLog - Stop the war in Ukraine! KLog - Stop the war in Ukraine! You are using a Russian call (%1). You can probably help to stop the Russian war, people are dying. Please call your leaders to stop the war. You are using an Ukranian call. Please take care and protect yourself and your family. The KLog developers wish you the best of luck in this very difficult moment. People are dying in the war of Russia against Ukraine. You can help to stop the Russian war against Ukraine. Please show your disagreement to your leaders, or in your social network to stop the war. Always check the current callsign in QRZ.com Upload queued QSOs to LoTW KLog - KLog folder not found Do you want to update now? You seem to have never backed up or exported your log to ADIF. Your latest backup seems older than one month. Regular backups prevent data loss and are good operator practice. Once exported, copy your ADIF file to a safe place such as a USB drive, cloud drive or other offsite computer. KLog will remind you to backup on a monthly basis. Backup completed successfully KLog will remind you again in approximately one month. Backup failed. Periodic data backups are recommended to prevent data loss and corruption of your log. This version of KLog requires that the DXCC database is updated. The database will be updated. The setup will now open to allow you to change your settings. KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 There was an error while updating to Yes the ClubLog QSO upload information. The ClubLog upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The file has not been removed. It seems that there was something that prevented KLog from removing the file You can remove it manually. The eQSL upload process has finished with an error and the log was possibly not uploaded. Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1 Do you want to mark as Uploaded all the QSOs uploaded to eQSL? There was an error while updating to Yes the eQSL QSO upload information. The eQSL upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? KLog - QRZ.com warning QRZ.com has returned a non-subcribed error and queries to QRZ.com will be disabled. Please check your QRZ.com subcription or credentials. You need to activate the %1 service in the eLog preferences. The logfile has been modified. Do you want to save your changes? KLog - ADIF export It is important to export to ADIF and save a copy as a backup. Saving the log was done successfully. The ADIF export was not properly done. &Import from ADIF ... Export to ADIF ... Export all logs to ADIF ... &Print Log ... QSL tools ... Find QSO to QSL Find DX-QSLs pending to receive Shows DX-QSLs for which requests or QSLs have been sent with no answer. Find requested pending to receive Shows the DX-QSLs that have been requested. LoTW tools ... Mark all non-sent QSOs in this log as queued to be uploaded. Queue all QSLs to be sent Put all the non-sent QSOs in the queue to be uploaded. Mark all queued QSOs from this log as sent Mark all queued QSOs as sent Check the current callsign in QRZ.com Upload the queued QSOs to QRZ.com ... Update cty.csv Update Satellite Data Show Map Online manual (F1) ... &Tips ... &Debug ... &About ... About Qt ... Check updates ... All pending QSOs of this log has been marked as queued for LoTW! Now you can upload them to LoTW. There was a problem to mark all pending QSOs of this log as queued for LoTW! Your log has not been updated. No QSO was updated with the data coming from LoTW. This may be because of errors in the logfile or simply because your log was already updated. All pending QSOs has been marked as queued for LoTW! All queued QSOs has been marked as sent to LoTW! There was a problem to mark all queued QSOs of this log as sent to LoTW! About ... KLog - Update checking result UDP Server error The UDP server failed to %1. start or stop It seems that there are no QSOs in the database. Status of the DX entity. Name of the DX entity. QSO QSL eQSL Comment Komentarz Others My Data Moje dane Satellite Satelita You need to select one station callsign to be able to send your log to ClubLog. Do you want to add this QSOs to your ClubLog existing log? If you don't agree, this upload will overwrite your current ClubLog existing log. KLog - eQSL Select the Station Callsign to use when quering LoTW: Please check the LoTW setup You have not defined a LoTW user or a proper Station Callsign. Open the LoTW tab in the Setup and configure your LoTW connection. The log is ready to be uploaded to ClubLog. All the QSOs in this log has been marked as Modified in the ClubLog status field KLog could not mark the full log to be sent to ClubLog Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers. The log is ready to be uploaded to eQSL.cc. All the QSOs in this log has been marked as Modified in the eQSL.cc status field KLog could not mark the full log to be sent to eQSL You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. Filling QSOs ... Date/Time Data/Czas Callsign Znak wywoÅ‚awczy Printing the log ... Station Callsign Operator Callsign KLog - WSJTX Dupe QSO This QSO seems to be duplicated. Do you want to save or discard it? KLog - Non-supported mode A new mode not supported by KLog has been received from an external program or radio: Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) Native Error Recommendation: Periodically export your data to ADIF to prevent a potential data loss. DXCC DXCC Info Awards Search Log DX-Cluster DX-Klaster Save ADIF File The LoTW upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? The file has been removed. KLog - LoTW Open File Otwórz plik - Needed for DXMarathon Abort filling Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: Number Band Pasmo Mode Emisja Print Log Abort printing Printing the log... QSO: The following QSO data has been received from WSJT-X to be logged: Freq Time On Time Off RST TX RST RX DX-Grid Local-Grid If the received mode is correct, please contact KLog development team and request support for that mode KLog - QSO Dupe A dupe QSO has been detected in the file and will not be added to the log. Please check the QSO information file and ensure it is properly added. KLog - Duplicated satellite A duplicated satellite has been detected in the file and will not be imported. Please check the satellite information file and ensure it is properly populated. Now you will see a more detailed error that can be used for debugging... An unexpected error ocurred!! If the problem persists, please contact the developers for analysis: Error in function Error text Failed query KLog - Show errors Do you want to keep showing errors? MainWindowInputComment Comment Komentarz Add a comment for this QSO. Keep this data Zachowaj te dane Data entered in this tab will be copied into the next QSO. MainWindowInputEQSL Date of the ClubLog upload. Data aktualizacji ClubLog. Date of the QRZ.com upload. Date of the eQSL sending. Data wysÅ‚ania eQSL. Date of the eQSL reception. Data otrzymania eQSL. Date of the LoTW sending. Date of the LoTW reception. Status on QRZ.com. Status of the LoTW sending. Status of the LoTW reception. QRZ.com LoTW Sent LoTW Rec Status on ClubLog. Status ClubLog. Status of the eQSL sending. Status wysÅ‚ania eQSL. Status of the eQSL reception. Status otrzymywanych eQSL. ClubLog ClubLog eQSL Sent eQSL WysÅ‚ane eQSL Rec eQSL Otrzymane MainWindowInputOthers Primary Div Primary Div Secondary Div Secondary Div IOTA IOTA Entity Jednostka Propagation mode Typ propagacji Others Keep propagation mode Select the primary division for this QSO. Select the secondary division for this QSO. Select the entity for this QSO. Select the propagation mode for this QSO. Select the IOTA continent for this QSO. Select the IOTA reference number for this QSO. Keeps the same propagation mode for next QSO. Select the appropriate ADIF field for this QSO. Value for the selected ADIF field. Not Identified Not - Not Identified SOTA Ref Age VUCC grids Distance MainWindowInputQSL QSL Sent QSL wysÅ‚ane QSL Rec QSL Otrzymane QSL Via QSL Via QSL Msg QSL Msg Status of the QSL sending. Stan wysÅ‚anych kart QSL. Status of the QSL reception. Stan kart QSL otrzymanych. QSL sending information. Informacje dotyczÄ…ce wysyÅ‚ania QSL. QSL reception information. Informacje dostyczÄ…ce odebranej karty QSL. Date of the QSL sending. Data wysÅ‚ania karty QSL. Date of the QSL reception. Data otrzymania karty QSL. Message of the QSL. Informacje o QSL. QSL via information. Info o sposobie wysÅ‚ania QSL. MainWindowInputQSO TX RST. RX RST. TX Frequency in MHz. RX Frequency in MHz. Power used by the contacted station. Name of the contacted operator. QTH of the contacted station. Locator of the contacted station. Watts MHz MHz Split Translator: Split is a common hamradio term. Do not translate unless you are sure. Name QTH DX Locator Power(rx) RST TX RX Frequency DX QTH locator. DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. TX Frequency in MHz. Frequency is not in a hamradio band! RX Frequency in MHz. Frequency is not in a hamradio band! MainWindowMyDataTab Watts Keep this data Zachowaj te dane My QTH locator. Mój QTH Lokator. Power Moc Operator callsign Station Callsign Znak stacji My Locator Mój lokator My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. My Rig My Antenna My SOTA_Ref My VUCC_GRIDS MainWindowSatTab Keep this data Zachowaj te dane Other - Sat not in the list Inne - Satelita nie jest na liÅ›cie Data entered in this tab will be copied into the next QSO. Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Satellite mode used. Select the satellite you are using. UpLink band. DownLink band. UpLink UpLink DownLink DownLink Satellite Satelita Mode Emisja Other Inne MHz MHz Not Sat QSO QSO nie przez SAT KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. KLog wykryÅ‚ nazwÄ™ satelity która nie zostaÅ‚a rozpoznana. JeÅ›li chcesz użyć jednej ze znanych zamiast tej, proszÄ™ wybrać jÄ… z listy. Ewentualnie, proszÄ™ o kontak z twórcami programu aby satelita mógÅ‚ zostać do listy w kolejnych wydaniach. The satellite you have in your QSO is: Satelita w Twoim QSO to: Please be aware that the satellite name will not be saved if it is not in the list, so that information may be lost! MapWindowWidget Select QSOs in this band. Select QSOs in this mode. Select QSOs in this propagation mode. Select QSOs using this Satellite. Only confirmed Select only confirmed QSOs. All bands Show nothing All modes All propagation modes All satellites OnlineMessageWidget The server returned the following error: %1 Not identified Nie zidetyfikowany QObject New One, work it! New One, work it! Needed, work it! Potrzebny, zrób QSO! Worked but not confirmed Zrobione, ale nie potwierdzone Confirmed Potwierdzone Not identified Nie zidetyfikowany Database Error Błąd bazy dancyh KLog DB needs to be upgraded. Baza danych KLog musi zostać zaktualizowana. The process to upgrade is: - Using an old KLog version export your log to ADIF. - Remove your logbook.dat file from your KLog folder. - Install the new KLog version. - Import your ADIF file. KLog will finish when you click on OK. KLog - DB update KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. KLog wykryÅ‚ poprzedni LOG w bazie dancy. Wszystkie dane zostanÄ… dla Ciebie zaimportowane do nowo utworzonego Logu. KLog: Enter Station callsign KLog: Wprowadź znak stacji Enter the station callsign used in this log Wprowadź znak używany w KLog Station Callsign Znak Stacji QSO: QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? Przerwanie tej aktualizjacji może grozić utratÄ… danych, Czy napewno chcesz przerwać? Progress: PostÄ™p: Updating mode information... Updating mode information... Do you want to upgrade it now? Czy chcesz aktualizować teraz? If DB is not upgraded KLog may not work properly. JeÅ›li DB nie zostanie zauktualizowana KLog może nie dziaÅ‚ać poprawnie. Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea. Do you want to backup your DB now? The backup finished successfully. You can find the backup in this file: %1 The backup was not properly done. You will be sent back to the starting point. KLog - DB can't be updated automatically You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version. All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay. Abort updating Przerwij aktualizowanie Updating bands information... Aktualizowanie informacjo o pasmach... Updating bands information in %1 status... Updating bands information in %1 status... Updating mode information in %1 status... Updating mode information in %1 status... Updating DXCC award information... Updating DXCC Award information... Updating WAZ award information... Updating WAZ Award information... KLog is already running. It is allowed to run only one instance. Install wizard was canceled before completing... Proces aktualizacji zostaÅ‚ przerwany przed zakoÅ„czeniem... Do you want to remove the KLog dir from your disk? Czy chcesz usunąć katalog KLoog ze sswojego dysku? Your KLog dir has been removed Katalog KLog zostaÅ‚ usuniÄ™ty I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. UsuniÄ™cie katalogu KLog byÅ‚o nie możliwe. PowinieneÅ› zrobić to manualnie jeÅ›li aby katalog KLog zostaÅ‚ caÅ‚kowicie usuniÄ™ty. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. Katalog KLog nie zostaÅ‚ usuniÄ™ty. Aby usunąć ten katalog z dysku powinieneÅ› usunąć go rÄ™cznie. Remember that your KLog dir is on your system... PamiÄ™taj że katalog Klo jest w zainstalowany na Twoim systemie... Thank you for running KLog! DziÄ™kujemy za korzystanie z KLog! Updating information... Updating DXCC and Continent information... A wrong callsign has been found: %1. Please enter a new callsign or confirm that the current one is a good callsign. An empty callsign has been detected. If it is possible, please enter the right call. KLog - Not valid callsign found Date Data Call RSTtx RSTtx RSTrx RSTrx Band Pasmo Comment Komentarz Mode Emisja CQz ITUz DXCC DXCC Address Age County A_Index Ant_Az Ant_El Ant_Path ARRL_SECT Award_Submitted Award_granted Band_RX CheckContest Class ClubLog SDate ClubLog status Continent Kontynent Contest Id Country Credit Submitted Credit granted Dark Dok Do not translate if unsure, common hamradio term. Fists Do not translate if unsure, common hamradio term. Fists CC Do not translate if unsure, common hamradio term. My Fists Do not translate if unsure, common hamradio term. Nr bursts Do not translate if unsure, common hamradio term. Nr pings Do not translate if unsure, common hamradio term. Sat mode SWL Do not translate if unsure, common hamradio term. Ten-Ten Do not translate, it is a hamradio group name. Distance Contacted_Op Email EQ_Call eQSL RDate eQSL SDate eQSL Rcvd eQSL Sent eQSL WysÅ‚ane Force Init Freq Freq RX Gridsquare HRDLog SDate HRDLog status IOTA IOTA IOTA Island id K Index Lat Lon LoTW RDate LoTW SDate LoTW Rcvd LoTW Sent Max Bursts MS Shower My Antenna My City My Cnty My Country My CQz My DXCC My Gridsquare My IOTA My IOTA island id My ITUz My Lat My Lon My Name My Postal code My Rig My Sig My Sig Info My SOTA ref My State My Street My USACA counties My VUCC grids Name Notes Operator Owner Callsign Pfx Precedence Prop Mode Public Key QRZcom SDate QRZcom status QSL msg QSL RDate QSL SDate QSL Rcvd QSL Otrzymane QSL Sent QSL wysÅ‚ane QSL rcvd via QSL sent via QSL via QSO complete QSO random QTH Region Rig RX Pwr Sat name SFI Sig Sig Info Silent key Do not translate if unsure, common hamradio term. SKCC SOTA Ref SRX String SRX STX String State Submode UKSMG USACA counties VE prov VUCC grids TX Pwr Web QSO Date off Log number SearchWidget &Clear &Clear &Select All &Select All &Search &Search &Export Highlighted &Export Highlighted All logs Clear the searches. Wyczyść wyszukiwanie. Export the search result to an ADIF file. Wyeksportuj wyniki wyszukiwania do pliku ADIF. Select/Unselect all the QSOs shown. Zaznacz/Odznacz wszystkie wyÅ›wietlone QSO. Search in the log. Przeszukaj log. Search in all logs. Przeszukaj we wszystkich logach. You have requested to delete the QSO with: %1 Select the Station Callsign used to do this QSO. Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs! All in log Not defined &Clear selection &Clear selection Save File Zapisz plik Are you sure? Czy jesteÅ› pewien? SearchWindow Date/Time Data/Czas Band Pasmo Mode Emisja QSL Sent QSL wysÅ‚ane QSL Rcvd QSL Otrzymane Station Callsign ID ID Call Date/time Station callsign QSL Send QSL wysÅ‚ane &Delete &Delete Delete a QSO UsuÅ„ QSO &Edit QSO &Edit QSO Edit this QSO Edytuj QSO Via &bureau Via &bureau Send this QSL via bureau Wyśłij QSL przez biuro D&irect D&irect Send this QSL via direct WyÅ›lij QSL direktem Via bureau Przez biuro QSL &received via bureau QSL &received via bureau Direct Direct QSL received via direc&t QSL odebrane przez direct&t Check in QRZ.com Check this callsign in QRZ.com Check in DXHeat.com Check this callsign in DXHeat.com &Request my QSL &Request my QSL Mark my QSL as requested Zaznacz moje QSL jako oczekiwane Via Direct and mark DX QSL as requested Send this QSL via direct and mark DX QSL as requested Via Bureau and mark DX QSL as requested Send this QSL via bureau and mark DX QSL as requested &Request the QSL &Request the QSL Mark the QSL as requested Zaznacz to QSL jako oczekiwane Via bureau and mark my QSL as requested QSL received via bureau and mark my QSL as requested Direc&t and mark as my QSL requested QSL received via direct and mark my QSL as requested Needed QSO to send the QSL QSO wymagne aby wysÅ‚ać QSL My QSL requested to be sent Moje QSL jako oczekiwane DX QSL pending to be received DX QSL jako oczekjÄ…ce SetupDialog Bands/Modes Pasma/Emisje DX-Cluster DX-Klaster Colors Kolory Log widget Misc Inne World Editor Edycja Znaków Logs Logi Satellites HamLib Do you want to add one log in the Logs tab or exit KLog? (Click Yes to add a log or No to exit KLog) DB has not been moved to new path. Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Cancel Anuluj OK OK User data Dane użytkownika D&X-Cluster D&X-Cluster You will be redirected to the Log tab. Please add and select the kind of log you want to use. Zstaniesz przekierowany do zakÅ‚dki Log. ProszÄ™ wybrać z którego logu chcesz obecnie korzystać. World Åšwiat eLog WSJT-X Settings You need to enter at least one log in the Logs tab. Wymagane jest abyÅ› dodaÅ‚ przynajmniej jeden Log w zakÅ‚adce Log. You need to enter at least a valid callsign. Go to the User tab and enter valid callsign. You have not selected the kind of log you want. Nie zanaczono żadnego logu. SetupEntityDialog Entity Jednostka CQ CQ ITU ITU Latitude Szerokość Longitude Szerokość UTC UTC Main prefix Główny Prefiks ARRL ID ARRL ID Comma separated possible prefixes, e.g. EA1, EA2, ... Prefixy oddzielpone przecinkiem Np EA1, EA2, ... Prefixes Prefiksy Name of the Entity. CQ zone. ITU zone. Longitude of the Entity. Local time difference to UTC. Main prefix of the entity. ARRL ID. Date of the deletion. Deleted UsuniÄ™ty Cancel Anuluj Ok OK Entity Dialog Opis Jednostki SetupPageBandMode Bands Pasma Modes Emisje SetupPageColors New One Nowy kraj Needed in this band Potrzebny na tym paÅ›mie Worked in this band Zrobiony na tym paÅ›mie Confirmed in this band Potwierdzony na tym paÅ›mie Default DomyÅ›lny WSJT-X palette Default palette Dark Mode Color when the DXCC is an ATNO (All Time New One). DXCC is confirmed in this band. Default color. Sets a palette of colors similar to the one used in WSJT-X. Sets the default palette. Light Mode This DXCC was worked before in another band but not in the selected band. It may be needed due to the CQ, ITU, Grid, ... Worked DXCC, but not confirmed in this band. Sets the Dark Mode Choose a color Wybierz kolor SetupPageDxCluster Add Dodaj Delete UsuÅ„ Show &HF spots Pokaż &HF spots Show V/&UHF spots Pokaż V/&UHF spots Show W&ARC spots Pokaż W&ARC spots Show &worked spots Pkaż &worked spots Show &confirmed spots Pokaż &confirmed spots Show ANN/&FULL messages Pokaż ANN/&FULL messages Show WW&V messages Pokaż WW&V messages Show WC&Y messages Pokaż WC&Y messages Save DX Cluster activity Saves all the DX-Cluster activity to a file in the KLog folder Send DX Spots to the map Sends the received DX Spots to the map to know where is the activity. DX Spots DX spot Others Messages Wiadomość KLog: Add a DXCluster server KLog: Dodaj server DXCluster Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: ProszÄ™ podać adres razem z numerem :portu Na przykÅ‚ad: dxfun.com:8000 JeÅ›li numer portu nie zostanie podany, port 41112 zostanie użyty jako domyÅ›lny: SetupPageELog ClubLog password ClubLog App password ClubLog email Enter the email you used to register in ClubLog. Wprowadź e-mail którego użyÅ‚eÅ› podczas rejestracji w ClubLog. Enter your password ClubLog here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!! Send QSOs in real time Activate ClubLog Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Starts the ClubLog support in KLog. Activate eQSL.cc Enter your username of eQSL.cc. Enter your password eQSL.cc here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) eQSL.cc password eQSL.cc user ClubLog ClubLog eQSL.cc QRZ.com Enter the user of your QRZ.com account. You need to be subscribed to QRZ.com to use this service. User Enter your password QRZ.com here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Password Activate QRZ.com Check automatically Check in Qrz.com all Calls as they are entered Paying Subscriber Check it if you are paying for a qrz.com subscription LogBook Key LogBook Key for QSO uploading. You can get this key in your QRZ.com logbook webpage. Remember that you need a QRZ.com subscription to use this feature. LoTW Upload Download TQSL path Use TQSL LoTW password LoTW user Enter your LoTW user. Enter your password LoTW here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Path to the TQSL software. Enable the LoTW integration with TQSL. You will need to have TQSL installed Select File SetupPageHamLib Activate HamLib Activates the hamlib support that will enable the connection to a radio. Read-Only mode If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio. Radio Select your rig. Serial Network Defines the interval to poll the radio in msecs. Poll interval Test: OK Test: NOK Test Click to test the connection to the radio SetupPageLogView Fields SetupPageLogs &New &New &Edit &Edit &Remove &Remove KLog Klog All the QSOs from this log will also be deleted... Log has not been removed. (#3) Log nie zostaÅ‚ usuniÄ™ty. (#3) Do you really want to remove this log? Czy na pewno chcesz usunąć ten Log? Add a new log. Edit the selected log. Remove the selected log. Log has not been removed. (#2) Log nie zostaÅ‚ usuniÄ™ty. (#2) Log has not been removed. (#1) Log nie zostaÅ‚ usuniÄ™ty. (#1) ID ID Date Data Station Callsign Znak stacji Operators Comments Komentarz QSOs QSOs The new log could not be created. An error has occurred showing the following error code: WystÄ…piÅ‚ błąd o wskazanym kodzie błędu: KLog - SetupPageLogs Klog -SetupPageLogs SetupPageLogsNew &Date &Date &Station Callsign &Satation Callsign &Operators &Operators Comm&ent Comm&ent &Ok &OK &Cancel &Cancel Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. Callsign used for this log. Comma separated list of operators: callsign1, callsign2. Lista operatorów oddzielona przecinkiem: Znak Sacji1, Znak Stacji2. {1,?} Start date of this log. SetupPageMisc &Imperial system &Imperial system &Log in real time &Log in real time Show seconds &Time in UTC &Time in UTC &Save ADIF on exit &Save ADIF on exit Use this &default filename Use this &default filname Mark &QSO to send QSL when QSL is received Mark &QSO to send QSL when QSL is recived Complete QSO with previous data UzupeÅ‚nij QSO ze wczeÅ›niejszymi danymi Show the Station &Callsign used in the search box Show the Station &Callsign used in the search box Manage DX-Marathon &Delete always temp ADIF file after uploading QSOs In seconds, enter the time range to consider a duplicate if same call, band and mode is entered. Show seconds in the QSO editor If you disable this checkbox KLog will not check callsigns to identify wrong callsigns. QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. QSO zostanie oznaczone jako oczekujÄ…ce QSL jeÅ›li otrzymasz kartÄ™ QSL a Twoja jeszcze nie zostaÅ‚a wysÅ‚ana. Check it for Imperial system (Miles instead of Kilometers). Select to use the following name for the logfile without being asked for it again. ProszÄ™ zaznaczyć wybrnanÄ… nazwÄ™ pliku aby nie być ponownie pytany o jego nazwÄ™. Select if you want to manage DX-Marathon. This is the default file where ADIF data will be saved. To jest domyÅ›lna nazwa pliku w którym ADIF zostanie zapisany. Delete Always the adif file created after uploading QSOs Log level Dupe time range: Please specify an existing directory where the database (logbook.dat) will be saved. ProszÄ™ wybrać istniejÄ…cy katalog w którym baza danych programu ( logbook.dat) zostanie zapisana. &Check for new versions automatically &Check for new version automaticlly &Provide Info for statistics &Provide info for statistics Mark sent eQSL && LoTW in new QSO as queued Browse PrzeglÄ…daj Move DB PrzenieÅ› DB Check if there is a new release of KLog available every time you start KLog. Sprawdź czy sÄ… dostÄ™pne nowe wydania KLog każdorazowno kiedy KLog jest uruchamiany. Select to use real time. Zaznacz aby pracować w czasie rzeczywistym. Select to use UTC time. Zaznacz aby użyć czasu UTC. Select if you want to save to ADIF on exit. Zaznacz aby zapisać do ADIF przy wyjÅ›ciu z programu. Complete the current QSO with previous QSO data. UzupeÅ‚nij obecne QSO danymi z poprzednich QSO. This is the directory where the database (logbook.dat) will be saved. To jest katalog w którym baza danych ( logbook.dat) zostanie zapisana. Click to change the path of the database. Kliknij aby zmienić miejsce w którym baza danych zostanie zapisana. This is the directory where DB (logbook.dat) will be saved. To jest katalog w którym DB ( logbook.dat ) zostanie zapisana. Click to change the default ADIF file. Kliknij aby zmienić domyÅ›lny plik ADIF. Check non-valid calls The search box will also show the callsign on the air to do the QSO. Click to move the DB to the new directory. Kliknij aby przenieść DB do nowego katalogu. Select the application debug log level. This may be useful if something is not working as expected. A debug file will be created in the KLog directory and/or shown with Help->Debug menu. Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default. Open File Otwórz plik Select Directory Zaznacz Katalog KLog - Move DB File moved Plik przeniesiony File copied Plik skopiowany File already exist. The destination file already exist and KLog will not replace it. Please remove the file from the destination folder before moving the file with KLog to make sure KLog can copy the file. File NOT copied Plik NIE skopiowany The file was not copied due to an unknown problem. The target directory does not exist. Please select an existing directory. Katalog docelowy nie istnieje . ProszÄ™ wybrać istniejÄ…cy katalog. SetupPageSats &New &New &Edit &Edit &Remove &Remove &Import E&xport Add a new satellite. Edit the selected satellite. Remove the selected satellite. Export your current satellites to a file. Select the sat you want to open. KLog Klog Do you really want to remove this satellite? Import a satellites file. It will replace the satellites you have in the current list. This satellite will no be longer available to be selected ... Sat has not been removed. (#3) Sat has not been removed. (#2) Sat has not been removed. (#1) ID ID Short Name Uplink Downlink Modes Emisje An error has occurred showing the following error code: WystÄ…piÅ‚ błąd o wskazanym kodzie błędu: KLog - SetupPageSats Open Satellites File KLog warning An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Please check the format or contact the developer for analysis with the error code: Save Satellites File SetupPageSatsNew Short name Sat name UpLink UpLink DownLink DownLink Modes Emisje &Ok &OK &Cancel &Cancel Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Enter the name of the satellite. Enter the uplink frequencies in this format: 144.300 Enter the downlink frequencies in this format: 144.300 Enter the modes in this format: USB Some of the data you have entered is not correct; the satellite can't be added. SetupPageSubdivisionNew &Date &Date &Station Callsign &Satation Callsign &Operators &Operators Comm&ent Comm&ent &Ok &OK &Cancel &Cancel Callsign used for this log. Comma separated list of operators: callsign1, callsign2. Lista operatorów oddzielona przecinkiem: Znak Sacji1, Znak Stacji2. {1,?} Start date of this log. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. SetupPageSubdivisions &Remove &Remove Import new Import an AWA file with the subdivision details. Remove the selected references. Select the references you want to open. KLog Klog Do you really want to remove the data of this entity? All the subdivision information for this entity will be deleted... Log has not been removed. (#3) Log nie zostaÅ‚ usuniÄ™ty. (#3) Log has not been removed. (#2) Log nie zostaÅ‚ usuniÄ™ty. (#2) Log has not been removed. (#1) Log nie zostaÅ‚ usuniÄ™ty. (#1) ID ID Name Short Name CQ Zone Strefa CQ ITU Zone Strefa ITU Deleted UsuniÄ™ty Start Date End Date DXCC DXCC An error has occurred showing the following error code: WystÄ…piÅ‚ błąd o wskazanym kodzie błędu: KLog - SetupPageSubdivisions SetupPageUDP Start UDP Server Automatically log QSOs from WSJT-X Allow WSJT-X to send logged QSOs to KLog QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. Update status information from WSJT-X KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...) UDP port number where the UDP Server will listen for packets. Make sure it is the same port that the other programs are sending the data to. Default port is 2237. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. UDP Port Select the interface to listen for UDP datagrams coming from WSJT-X. Network interface QSOs notification timeout (milisecs) Miliseconds that the notification of QSOs received from WSJTX will be shown. SetupPageUserDataPage &Personal data &Personal data Station &data Station &data Enter your name. Enter your address - 1st line. Enter your address - 2nd line. Enter your address - 3rd line. Enter your address - 4th line. Enter your city. Enter your zip code. Enter your province or state. Enter your country. &Name &Name &Address &Address Cit&y Cit&y &Zip Code &Zip Code Pro&v/State Pro&v/State Countr&y Countr&y Enter your information for rig Wpisz informacje o swoim radiu Enter your information for antenna Wpisz informacje o swojej antenie Enter your power information. Enter the station callsign that will be used for logging. Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Wpisz lokator swojej stacji. Alternatywnie KLog może skorzystać z przybliżonej lokalizacji bazujÄ…c na Twoim znaku wywoÅ‚awczym. &Rig 1 &Rig 1 R&ig 2 R&ig 2 Ri&g 3 Ri&g 3 Antenna &1 Antenna &1 Antenna &2 Antenna &2 Antenna &3 Antenna &3 Po&wer Po&wer Enter the operators (comma separated if more than one). Wpisz operatorów ( skorzystaj z przecinka jeÅ›li wiÄ™cej niż jeden ). &Callsign &Operators &Operators &CQ Zone &CQ Zone &ITU Zone &ITU Zone &Locator &Locator &Locator (not valid) &Locator (not valid) SetupPageWorldEditor Add Dodaj Delete UsuÅ„ Edit Export World Import World Still not implemented. Import a new cty.csv file An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. Plik z informacjami jednostek DXCC ( cty.csv ) zostaÅ‚ wykryty w katalogu KLog i zostanie on wczytany. No entities information file (cty.csv) has been detected in your KLog folder. Plik z jednostkami DXCC nie zostaÅ‚ wykryty ( cty.csv) w folderze KLog. KLog will not be able to show entities information. KLog nie bÄ™dzie mógÅ‚ pokazać informacji jednostek DXCC. Prefix Prefix Entity Jednostka ARRL ID ARRL ID Continent Kontynent CQ Zone Strefa CQ ITU Zone Strefa ITU UTC UTC Latitude Szerokość geograficzna Longitude DÅ‚ugość geograficzna Deleted UsuniÄ™ty Since Date Od daty To Date Do daty Open File Otwórz plik BigCTY (*.csv) BigCTY (*.csv) Entities information has been updated. Informacje o jednostkach DXCC zostaÅ‚y zaktualizowane. Entities information has not been updated. Informacje o jednostkach DXCC nie zostaÅ‚y zaktualizowane. ShowAdifImportWidget The following QSOs are those QSOs that you have received the LoTW confirmation. Ok OK DX Date/Time Data/Czas Band Pasmo Mode Emisja ShowErrorDialog KLog Message SoftwareUpdateDialog Ok OK KLog update Aktualizacja KLog <center><h2>KLog new version (%1) is available! </h2></center><br>There is a new version of KLog available.<br><br><b>You can get the new version from:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> Congratulations! Gratulacje! Your KLog has been updated. Twój KLog zostaÅ‚ zaktualizowany. You already have the latest version. Już posiadasz najnowszÄ… wersjÄ™. StartWizard KLog - The free hamradio logging program KLog - Darmowy program logujÄ…cy dla krótkofalowców Quit Setup Opuść Ustawienia Setup is not complete yet. Are you sure you want to quit setup? Ustawienia nie zostaÅ‚y jeszcze ukoÅ„czone. Czy jesteÅ› pewien że chcesz opuÅ›cić ustawienia? StatisticsWidget QSO per year DXCC per year CQ zones per year QSO per band QSO per mode QSO per DXCC QSO per Continent QSO per hour QSO per month Worked / Confirmed status Worked / Sent status Sent / Confirmed status Satellite grid status Satellite DXCC status Grids per band status DXCC per band status StatsCQZPerYearBarChartWidget CQ Zones per year Reading data ... Abort reading Przerwij wczytywanie CQ zones CQ zones per year Reading data ... Years: %1/%2 StatsDXCCOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Callsign Znak wywoÅ‚awczy Date Data Band Pasmo Mode Emisja DXCC DXCC Satellite Satelita Confirmed Potwierdzone No StatsEntitiesPerYearBarChartWidget Chart title Reading data ... Abort reading Przerwij wczytywanie DXCC Entities Reading data ... Entities: StatsFieldPerBandWidget All Wszystko Mode: Band Pasmo Worked Confirmed Potwierdzone StatsGridsOnSatsWidget Show confirmed only Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Number Callsign Znak wywoÅ‚awczy Date Data Band Pasmo Mode Emisja Grid Satellite Satelita Confirmed Potwierdzone No StatsQSOsPerBandBarChartWidget QSOs per band Reading data ... Abort reading Przerwij wczytywanie Bands Pasma QSOs per band distribution Reading data ... Bands: StatsQSOsPerContinentBarChartWidget QSOs per continent Reading data ... Abort reading Przerwij wczytywanie Continents Reading data ... Hours: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC Reading data ... Abort reading Przerwij wczytywanie Reading data... DXCC DXCC Top ten DXCC per QSO StatsQSOsPerHourBarChartWidget QSOs per hour Reading data ... Abort reading Przerwij wczytywanie Hours QSOs at hour Reading data ... Hours: StatsQSOsPerModeBarChartWidget QSOs per mode Reading data ... Abort reading Przerwij wczytywanie Modes Emisje QSOs per mode distribution Reading data ... Modes: StatsQSOsPerMonthBarChartWidget QSOs per month Reading data ... Abort reading Przerwij wczytywanie Jan Feb Mar Apr May Jun Jul Sep Oct Nov Dec Aug Months QSOs at Month Reading data ... Months: StatsQSOsPerYearBarChartWidget Reading data ... Abort reading Przerwij wczytywanie QSOs QSOs QSOs per year Reading data ... QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Confirmed - %2 Sent / Confirmed status StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Confirmed - %2 Worked / Confirmed status StatsWorkedSentPieChartWidget Worked - %1 Sent - %2 Worked / Sent status TipsDialog KLog tips Next Previous <b>Tip #1:</b><br>Do you know...<br>You can use <a href="#ToolsFillInQSO">Tools->Fill in QSO data</a> to automatically read the full log to fill the DXCC, CQ, ITU zones and continent? Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in QSO data <b>Tip #3:</b><br>Do you know...<br>You can use <a href="#ToolsFindQSO2QSL">Tools->QSL tools...->Find QSO to QSL</a> to look for all those QSO that you should send your QSL because you still need to confirm that DXCC and you have still not send your QSL card? Translator: Please make sure that the name of the link is coherent with the menu Tools->QSL tools...->Find QSO to QSL <b>Tip #2:</b><br>Do you know...<br>You can find the QSLs that you still need to send with <a href="#ToolsSendPendingQSL">Tools->QSL tools...->Find My-QSLs pending to send</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Requested</i>. Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in DXCC data <b>Tip #4:</b><br>Do you know...<br>You can enter a '*' in the search box, in the search window to search for all the QSOs done with one specific station callsign? Translator: Please make sure that the name of the link is coherent with the menu File->Export Requested QSL to ADIF... <b>Tip #5:</b><br>Do you know...<br>You can find the file containing all your log and other information in the logbook.dat file and the klogrc file, containing the KLog config file in the KLog folder by opening the <a href="#FileOpenKLogFolder">File->KLog folder</a> menu? <b>Tip #6:</b><br>Do you know...<br>You can upload your QSO marked as queued to LoTW via TQSL with <a href="#ToolsUploadLoTW">Tools->LoTW tools ...->Sends the log to LoTW calling TQSL.</a> ?<br><br>You have to configure TQSL in the preferences to be able to use this functionality. Translator: Please make sure that the name of the link is coherent with the menu File->KLog folder <b>Tip #7:</b><br>Do you know...<br>You can see the QSO that confirms one specific DXCC entity in one specific band by poiting your mouse over that band in the DXCC widget? Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find My-QSLs pending to send <b>Tip #8:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceivePendingQSL">Tools->QSL tools...->Find DX-QSLs pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Sent</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find DX-QSLs pending to receive <b>Tip #9:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceiveRecPendingQSL">Tools->QSL tools...->Find requested pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Rec marked as <i>Requested</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find requested pending to receive <b>Tip #10:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/klogchat>English KLog Telegram group</a> to discuss about KLog in English? <b>Tip #11:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/KLogES>Spanish Telegram group</a> to discuss about KLog in Spanish? <b>Tip #12:</b><br>Do you know...<br>You can subscribe to <a href=https://groups.io/g/klog>KLog mailing list</a> to discuss via email about KLog in English? <b>Tip #13:</b><br>Do you know...<br>You can <a href=https://twitter.com/_ea4k>follow EA4K on twitter</a> to get updates about KLog? <b>Tip #14:</b><br>Do you know...<br>You can write your own <a href=https://www.eham.net/reviews/detail/3118>review in eHam.net about KLog</a> to help other users to decide to use KLog? <b>Tip #15:</b><br>Do you know...<br>You can join the development team by simply <a href=https://www.klog.xyz/contact>Contacting us</a>? <b>Tip #16:</b><br>Do you know...<br>That there are many ways to contribute to KLog and some of them are listed in the <a href=https://www.klog.xyz/contrib>KLog Contribute</a> page? <b>Tip #17:</b><br>Do you know...<br>You can support translating KLog into your language? Please check <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a> page. <b>Tip #18:</b><br>Do you know...<br>You can double-click on an entity name in the DXCC table and all the QSOs with that DXCC Entity will be shown in the search box? <b>Tip #19:</b><br>Do you know...<br>You can right-click on a QSO and select <i>Check in QRZ.com</i> to check that callsign in QRZ.com? UpdateSatsData Reading Satellites data file... Abort reading Przerwij wczytywanie The Satellites information has been updated. Open File Otwórz plik Sat Data UpdateSettings KLog - Settings update The settings system has been changed and KLog will update your settings file. World Entity Jednostka Continent Kontynent Reading cty.csv... Wczytywanie cty.csv... Abort reading Przerwij wczytywanie eLogClubLog Host not found! Host nie zostaÅ‚ odnaleziony! Timeout error! Przekroczony zostaÅ‚ limit czasu! This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO. Undefined error number (#%1)... KLog - ClubLog Klog -ClubLog QSO dupe or not existing (#%1)... We have received an undefined error from Clublog (%1) Undefined error... Niezidenfikowany błąd... Callsign missing Brak znaku wywoÅ‚awczego Invalid callsign Niepoprawny znak wywoÅ‚awczy Skipping SWL callsign Opuszczanie znaków wywoÅ‚aczych stacji nasÅ‚uchowych SWL Callsign is your own call Znka wywoÅ‚awczy jest Twoim wÅ‚asnym znakiem Invalid callsign with no DXCC mapping Niepoprawny znak wywoÅ‚awczy brak w spisie DXCC Updated QSO QSO Zaktualizowane Invalid ADIF record Niepoprawny zapis ADIF Missing ADIF record BrakujÄ…cy wpis ADIF Test mode - parameters ok, no action taken Tryb testujÄ…cy -Parametry OK, brak akcji Please check your config in the setup and contact the KLog development team if you can't fix it. ClubLog uploads will be disabled. It seems to be a CREDENTIALS ERROR; check your email and password. It seems that your ClubLog credentials are not correct. Please check your credentials in the setup. ClubLog uploads will be disabled. Excessive API Usage Znaczne użcie API Internal Error Błąd wewnÄ™trzny Rejected Odrzucony QSO Duplicate QSO zduplikowane QSO Modified QSO Zmodyfikowane Missing Login BrakujÄ…cy Login QSO OK QSO OK Upload denied PrzesyÅ‚anie odrzucone No callsign selected Znak wywoÅ‚awczy nie zaznaczony No match found Nie znaleziono poasujÄ…cych elemÄ™tów Dropped QSO QSO Opuszczone OK OK Login rejected Logowanie odrzucone Rejected: Callsign is your own call Odrzucone: Znak wywoÅ‚awczy jest Twoim wÅ‚asnym znakiem eLogQrzLog Host not found! Host nie zostaÅ‚ odnaleziony! Timeout error! Przekroczony zostaÅ‚ limit czasu! Undefined error number (#%1) We have received the following error from QRZ.com (%1) You are not subscribed to QRZ.com. Not valid KEY found Please configure your QRZ.com API key. You will find it in your QRZ.com Logbook settings webpage. You need a QRZ.com subscription to use this feature. KLog - QRZ.com password needed Please enter your QRZ.com password: KLog - QRZ.com Callsign missing Brak znaku wywoÅ‚awczego eQSLUtilities Host not found! Host nie zostaÅ‚ odnaleziony! Timeout error! Przekroczony zostaÅ‚ limit czasu! Undefined error number (#%1)... eQSL Error: User or password incorrect eQSL Warning: At least one of the uplodaded QSOs is duplicated. eQSL: All the QSOs were properly uploaded. KLog - eQSL.cc password needed Please enter your eQSL.cc password: KLog - eQSL eQSL has sent the following message: %1 We have received an undefined error from eQSL (%1) Please check your config in the setup and contact the KLog development team if you can't fix it. eQSL uploads will be disabled. klog-2.3.3/translations/klog_cs.ts0000644000015700001710000143222114542412415017054 0ustar jenkinsjenkins AboutDialog About KLog O KLog By od KLog is a free logbook for hamradio operators. KLog je svobodný staniÄní log pro radioamatéry. Please be aware that this is a development release and it may contain many bugs.<br>Backup your data before using this software! MÄ›jte na pamÄ›ti, že se jedná o vývojovou verzi a ta může obsahovat mnoho chyb.<br>PÅ™ed použitím tohoto software proveÄte zálohu dat! Since 0.6.2, KLog has been fully rewritten to provide a cross-platform application that runs on all major operating systems (GNU/Linux, macOS and Windows) and to support new functionality. Od verze 0.6.2 byl KLog pÅ™epsán tak, aby mohl běžet na vÅ¡ech hlavních operaÄních systémech (GNU/Linux, macOS a Windows) a podporoval nové funkce. Please provide your review in KLog's eHam review page: Prosím, napiÅ¡te VaÅ¡i recenzi na stránce eHam review: Find more information and the latest release at Více informací a nové verze najdete na Author Autor today dnes Main developer Hlavní vývojář KLog is developed by a very small team and you are invited to join! KLog je vyvíjen velmi malým týmem, ale každá další pomoc je vítaná! If KLog is still not in your language and you want to help us, you are welcome to contact us through the <a href="https://groups.io/g/klog">KLog mailing list</a>! Pokud KLog stále není ve vaÅ¡em jazyce a chcete nám pomoci, můžete nás kontaktovat prostÅ™ednictvím <a href="https://groups.io/g/klog"> KLog mailing listu </a>! You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog. Můžete nám také pomoci tÅ™eba zasláním hlášení o chybÄ› nebo malým kusem kódu, nápady nebo Äímkoliv, co si myslíte, že by mohlo vylepÅ¡it KLog. If you want to provide support you are welcome to join the <a href="https://groups.io/g/klog">KLog mailing list</a>! Pokud potÅ™ebujete poradit, můžete se pÅ™ipojit k <a href="https://groups.io/g/klog">KLog mailing listu</a>! Authors AutoÅ™i Translators bring KLog into your language. They are really an important part of the KLog development team. PÅ™ekladatelé pÅ™ekládají KLog do vaÅ¡eho jazyka. Jsou opravdu důležitou souÄástí vývojového týmu KLog. Translators PÅ™ekladatelé Privacy advisory Ochrana osobních údajů KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account users' needs. Vývojáři KLog implementovali funkci, která posílá nÄ›která uživatelská data na server KLog s jediným úÄelem - identifikovat poÄet nainstalovaných verzí, zaměřit vývoj jedním nebo druhým smÄ›rem s ohledem na potÅ™eby uživatelů. At present, the data that is provided is the following: V souÄasné dobÄ› jsou poskytovány následující údaje: Callsign Volací znaÄka KLog version KLog verze Operating system OperaÄní systém Be aware that you can enable/disable this feature from the Misc tab in the Setup page. Tuto funkci můžete povolit nebo zakázat v menu Nastavení ->Nastavení ->záložka Různé. KLog KLog Privacy Soukromí AdifLoTWExportWidget Select the Station Callsign that you want to use to upload the log. Vyberte volací znaÄku, kterou chcete použít pro nahrání logu. Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign. Vyberte poÄáteÄní datum exportu QSO. Výchozí datum je datum prvního spojení s touto volací znaÄkou. Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign. Vyberte koncové datum exportu QSO. Výchozí datum je datum posledního spojení s touto volací znaÄkou. Station callsign Volací znaÄka My Locator Můj lokátor Start date PoÄáteÄní datum End date Koncové datum Ok Ok Cancel ZruÅ¡it DX DX Date/Time Datum/ÄŒas Band Pásmo Mode Druh provozu Not defined Nedefinovaná ALL QSOs: %1/%2 All VÅ¡echny QSOs: QSO: KLog - QSOs to be uploaded to LoTW. KLog - QSO nahrávána do LoTW. This table shows the QSOs that will be sent to LoTW. Tabulka obsahuje QSO, která budou nahrána do LoTW. KLog - QSOs to be uploaded to ClubLog. KLog - QSO nahrávána do ClubLog. This table shows the QSOs that will be sent to ClubLog. Tabulka obsahuje QSO, která budou nahrána do ClubLog. KLog - QSOs to be uploaded to eQSL.cc. KLog - QSO nahrávána do eQSL.cc. This table shows the QSOs that will be sent to eQSL.cc. Tabulka obsahuje QSO, která budou nahrána do eQSL.cc. KLog - QSOs to be uploaded to QRZ.com. KLog - QSO nahrávána do QRZ.com. This table shows the QSOs that will be sent to QRZ.com. Tabulka obsahuje QSO, která budou nahrána do QRZ.com. This table shows the QSOs that will be exported to ADIF. Tabulka obsahuje QSO, která budou exportována do ADIF. AwardsWidget Recalculate PÅ™epoÄítat Click to recalculate the award status. Kliknutím pÅ™epoÄítáte stav diplomů. Select the year you want to check. Vyberte rok, který chcete zkontrolovat. QSOs QSO DXCC DXCC CQ CQ Award Diplom Confirmed Potvrzené Worked Navázané WAZ WAZ Score Skóre Annual RoÄní Number of confirmed DXCC entities. PoÄet potvrzených DXCC. Number of worked DXCC entities. PoÄet navázaných DXCC. Number of confirmed WAZ zones. PoÄet potvrzených WAZ. Number of worked WAZ zones. PoÄet navázaných WAZ. Number of confirmed QSOs. PoÄet potvrzených QSO. Number of worked QSOs. PoÄet navázaných QSO. Number of QSOs worked in the selected year. PoÄet QSO navázaných ve vybraném roce. Number of DXCCs worked in the selected year. PoÄet DXCC ve vybraném roce. Number of CQ Zones worked in the selected year. PoÄet CQ Zone navázaných ve vybraném roce. Score for the DXMarathon in the selected year. Výsledek DXMarathonu ve vybraném roce. DX-Marathon DX-Marathon CTYPage Country data download Stažení Country informací KLog needs country data... KLog požaduje Country informace... &Download &Stáhnout &Ignore &Ignorovat Country data needed Jsou potÅ™eba Country informace KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information. KLog používá soubor cty.csv umístÄ›ný na https://www.country-files.com/ to get DXCC information. You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do. Musíte si stáhnout soubor cty.csv, pokud chcete, aby vám KLog ukázal zemÄ›, lokátor atd. Click on Download to download now. StisknÄ›te Stáhnout pro zahájení stahování. KLog KLog I can't find the host. Please check your network and try again Do you want to try again? Server nenalezen. Prosím, zkontrolujte pÅ™ipojení a zkuste to znovu Chcete to zkusit znovu? DXCCStatusWidget Update Aktualizovat It seems that the DXCC status in your database is not updated and KLog can't find any dxcc information. You can try to fix this by updating the log. Do you want to update your DXCC status? Prefix Prefix Entity Stanice Pref: Pref: CQ: CQ: ITU: ITU: Beam: Beam: Entity not worked in this band. Se stanicí nepracováno na tomto pásmu. DXClusterWidget Click on Connect to connect to the DX-Cluster server Kliknutím na PÅ™ipojit se přípojíte do DX Clusteru Connect PÅ™ipojit Clear Smazat Check in QRZ.com Vyhledat v QRZ.com Check this callsign in QRZ.com Vyhledat znaÄku v QRZ.com Click on connect to connect to the DX-Cluster Kliknutím na PÅ™ipojit se pÅ™opojíte do DX Clusteru Trying to connect to the server Pokouším se pÅ™ipojit k serveru KLog DXCluster KLog DXCluster The host was not found. Please check: Server nebyl nalezen. Prosím, pÅ™ekontrolujte: - your network connection; - the host name and port settings. - sítové nastavení; - jméno serveru a nastavení port. The connection was refused by the peer. Make sure the DXCluster server is running, and check that the host name and port settings are correct. Spojení bylo serverem odmítnuto. Zkontrolujte, zda je spuÅ¡tÄ›n DXCluster, a zkontrolujte, zda je název serveru a nastavení portu správné. The following error occurred: %1. Nastala následující chyba: %1. Connected to server PÅ™ipojeno k serveru KLog message KLog zpráva Enter your callsign to connect to the cluster: Vložte svou volací znaÄku pro pÅ™ipojení do clusteru: Enter your password to connect to the cluster: (Just hit enter for no password) Vložte heslo do DX clusteru: (StisknÄ›te Enter pro prázdné heslo) Disconnect Odpojit Not logged on, you may need to enter your callsign again. Nejste pÅ™ihlášeni, možná budete muset znovu zadat svou volací znaÄku. Enter here the commands to be sent to the DX-Cluster server. Zde zadejte příkazy, které se mají odeslat do DX-Clusteru. Connection closed by the server Spojení ukonÄeno Click on Connect to connect to the DX-Cluster server. Kliknutím na PÅ™ipojit se pÅ™ipojíte do DX Clusteru. Send Odeslat It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved! Nebylo možné otevřít soubor s DX-Spoty pro zápis. Aktivita DX-Cluster nebude uložena! DataProxy_SQLite Software version in DB is null Verze SW v databázi je NULL Query didn't failed Dotaz neselhal Aircraft Scatter Common term in hamradio, do not translate if not sure Aircraft Scatter Aurora Aurora Aurora-E Aurora-E Back scatter Common term in hamradio, do not translate if not sure Back scatter Earth-Moon-Earth Earth-Moon-Earth Sporadic E Sporadic E Field Aligned Irregularities Common term in hamradio, do not translate if not sure Field Aligned Irregularities F2 Reflection Common term in hamradio, do not translate if not sure F2 Reflection Internet-assisted Internet-assisted Ionoscatter Common term in hamradio, do not translate if not sure Ionoscatter Meteor scatter Common term in hamradio, do not translate if not sure Meteor scatter Terrestrial or atmospheric repeater or transponder PÅ™evadÄ›Ä nebo transponder Rain scatter Common term in hamradio, do not translate if not sure Rain scatter Satellite Satelit Trans-equatorial Common term in hamradio, do not translate if not sure Trans-equatorial Tropospheric ducting Common term in hamradio, do not translate if not sure Tropospheric ducting Yes Ano No Ne Requested Vyžádané Ignore/Invalid Ignorovat / Neplatné Validated Ověřené Queued Ve frontÄ› Uploaded Nahrané Do not upload Nenahrávat Modified Modifikované Bureau Common term in hamradio, do not translate if not sure Bureau Direct Direct Electronic Elektronicky Manager Common term in hamradio, do not translate if not sure Manažer KLog DXCC KLog DXCC All QSOs have been updated with a DXCC and the Continent. VÅ¡echna QSO byla aktualizována na DXCC a Kontinent. KLog - Invalid call detected KLog - Byla zjiÅ¡tÄ›na chybná znaÄka An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported ADIF record? Byla zjiÅ¡tÄ›na prázdná volací znaÄka. PÅ™ejete si pÅ™esto toto QSO exportovat (kliknÄ›te na Ano) nebo ho odstranit z exportu ADIF? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log? Byla zjiÅ¡tÄ›na neplatná volací znaÄka %1. PÅ™ejete si pÅ™esto toto QSO exportovat (kliknÄ›te na Ano) nebo ho odstranit z exportu? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. Export chybných znaÄek může způsobit problémy v aplikacích, do kterých potenciálnÄ› importujete tento log. Může to vÅ¡ak být dobrá znaÄka, kterou KLog nesprávnÄ› identifikoval. DownLoadCTY Download of cty.csv failed with the following error code: Stažení cty.csv se nezdaÅ™ilo a skonÄilo touto chybou: Download of cty.csv done. Stažení cty.csv dokonÄeno. There is already a cty.csv file in the folder but it will be replaced with the new one. Soubor cty.csv již existuje, ale bude nahrazen novÄ›jším. Could not open %1 for writing NepodaÅ™ilo se zapsat do souboru %1 FileAwardManager Open Award file Otevřít soubor s diplomy Award files (*.awa) Diplom (*.awa) Award file not opened NepodaÅ™ilo se otevřít soubor s diplomem KLog was not able to read the award file KLog nebyl schopen pÅ™eÄíst soubor s diplomem It was not possible to open the file %1 for reading. Nebylo možné otevřít soubor %1 pro Ätení. AWA wrong format Chybný formát AWA The AWA file does not have the right format Soubor AWA nemá správný formát AWA file does not have an <EOH> field Soubor AWA nemá pole <EOH> KLog - %1 KLog - %1 FileManager KLog - Error KLog - Chyba The selected log does not exist, please check it again. Vybraný log neexistuje, prosím, pÅ™ekontrolujte to znovu. The selected callsign (%1) is not valid, please check it again to export the log. Vybraná volací znaÄka (%1) neexistuje, prosím, pÅ™ekontrolujte to znovu. The file %1 can't be opened. Soubor %1 se nepodaÅ™ilo otevřít. There are no QSOs pending to be exported with that station callsign. Neexistuje žádné QSO, které by bylo s touto volací znaÄkou exportováno. Writing ADIF file... Zapisuji ADIF... Abort writing Zapis pÅ™eruÅ¡en Export Export Exporting ADIF file... QSO: %1 / %2 Exportuji ADIF... QSO: %1 / %2 KLog - User cancelled KLog - ZruÅ¡eno uživatelem You have canceled the file export. The file will be removed and no data will be exported. ZruÅ¡ili jste export souboru. Soubor bude odstranÄ›n. Do you still want to cancel? Stále to požadujete zruÅ¡it? Export progress PrůbÄ›h exportu Writing ADIF file... QSO: Zapisuji ADIF... QSO: KLog - File not opened KLog - Soubor se nepodaÅ™ilo otevřít It was not possible to open the file %1 for reading. Nebylo možné Äíst ze souboru %1. KLog was not able to read the LoTW file KLog nebyl schopen pÅ™eÄíst soubor LoTW Processing LoTW ADIF file... LoTW ADIF je zpracováván... Abort processing PÅ™eruÅ¡it zpracování LoTW reading ÄŒtení LoTW KLog - Add new QSOs? KLog - PÅ™idat nové QSOs? Do you want to add non existing QSOs to your local log? PÅ™ejete si pÅ™idat neexistující QSO do lokálního logu? There are some QSOs in the LoTW log that are not in your local log. V LoTW jsou spojení, která nejsou ve vaÅ¡em lokálním logu. Processing LoTW ADIF file...... QSO: %1 / %2 LoTW ADIF je zpracováván...... QSO: %1 / %2 You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated. ZruÅ¡ili jste zpracování LoTW. Váš log nemusí být zcela aktualizovaný. Reading LoTW file... ÄŒtení LoTW... Abort reading PÅ™eruÅ¡it Ätení Importing LoTW ADIF file... Import LoTW ADIF... QSO: QSO: You have canceled the file import. The file will be removed and no data will be imported. PÅ™eruÅ¡ili jste import souboru. Soubor bude odstranÄ›n. Neimportovala se žádná data. KLog - Log selection KLog - VýbÄ›r logu There is more than one log in this logfile. V souboru je více než jeden log. All logs will be imported into the current log. VÅ¡echny logy budou importovány do aktuálního logu. Do you want to continue? PÅ™ejete si pokraÄovat? Reading ADIF file... ÄŒtení ADIF... Do you want to add dupe QSOs to your local log? PÅ™ejete si vložit duplicitní QSO do lokálního logu? There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date. NÄ›která QSO v logu mohou být duplicitní, protože mají stejnou volací znaÄku, pásmo & druh a velmi blízké datum. Importing ADIF file... Import ADIF... KLog - Duplicated QSOs KLog - Duplicitní QSO It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported) V importovaném ADIF souboru jsou duplicitní QSO. PÅ™ejete si pokraÄovat? (Duplicitní QSO nebudou importována) This QSO is not including the minimum data to consider a QSO as valid! Toto QSO nezahrnuje minimální množinu informací, aby bylo považováno za platné! Please edit the ADIF file and make sure that it include at least: Upravte ADIF tak, aby obsahoval alespoň: and a This QSO had: QSO mÄ›lo: - The band missing and the following call: - ChybÄ›jící pásmo a následující volací znaÄku: - The mode missing and the following call: - ChybÄ›jící druh provozu a následující volací znaÄku: - The date missing and the following call: - ChybÄ›jící datum a následující volací znaÄku: - The time missing and the following call: - ChybÄ›jící Äas a následující volací znaÄku: Do you want to continue with the current file? PÅ™ejete si pokraÄovat se souÄasným souborem? KLog: Not all required data found! KLog: Nebyla nalezena vÅ¡echna požadovaná data! Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information. NÄ›kterým QSO z tohoto logu (tj.: %1) chybí informace RST TX. Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem. Kliknutím na Ano pÅ™idáte výchozí %1 pro druh %2 do vÅ¡ech QSO s podobným problémem. If you select NO, maybe the QSO will not be imported. Kliknutím na Ne nebudou QSO importována. KLog: No RST TX found! KLog: RST TX nenalezeno! Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information. NÄ›kterým QSO z tohoto logu (tj.: %1) chybí informace RST RX. KLog: No RST RX found! KLog: RST RX nenalezeno! KLog - No Station callsign entered. KLog - Není vložena volací znaÄka. KLog - Apply to all QSOs in this log? KLog - Použít na vÅ¡echna QSO v tomto logu? KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO with %1 on %2: KLog: NaÅ¡lo se QSO bez volací znaÄky. Vložte volací znaÄku, která byla použita pÅ™i tomto QSO s %1 na %2: KLog - QSO without Station Callsign KLog - QSO bez volací znaÄky KLog has found one QSO without the Station Callsign defined. Enter the Station Callsign that was used to do this QSO on %1: KLog: NaÅ¡lo se QSO bez volací znaÄky. Vložte volací znaÄku, která byla použita pÅ™i tomto QSO na %1: KLog - Don't ask again KLog - Znovu se neptat Do you want to reuse your answer? PÅ™ejete si opÄ›tovnÄ› použít odpovÄ›Ä? KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again. KLog automaticky použije pÅ™edchozí odpovÄ›Ä na jakýkoliv podobný výskyt, aniž by se znovu zeptal. <ul><li>Date/Time:</i> %1</li><li>Callsign: %2</li><li>Band: %3</li><li>Mode: %4</li></ul> <ul><li>Datum/ÄŒas:</i> %1</li><li>ZnaÄka: %2</li><li>Pásmo: %3</li><li>Druh: %4</li></ul> KLog - QSO not found KLog - QSO nenalezeno Do you want to add this QSO to the log?: PÅ™ejete si pÅ™idat QSO do logu?: We have found a QSO coming from LoTW that is not in your local log. Do you want KLog to add this QSO to the log? Bylo nalezeno QSO původem z LoTW, které není v lokálním logu. PÅ™ejete si pÅ™idat toto spojení? KLog - Invalid call detected KLog - Byla zjiÅ¡tÄ›na chybná znaÄka An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported log file? Byla zjiÅ¡tÄ›na prázdná volací znaÄka. PÅ™ejete si pÅ™esto toto QSO exportovat (kliknÄ›te na Ano) nebo ho odstranit z exportu? An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log file? Byla zjiÅ¡tÄ›na neplatná volací znaÄka %1. PÅ™ejete si pÅ™esto exportovat tuto znaÄku (stiskem Ano) nebo ji odstranit z exportu? Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. You can, however, edit the ADIF file once the export process is finished. Export chybných znaÄek může způsobit problémy v aplikacích, do kterých potenciálnÄ› importujete tento log. Může to vÅ¡ak být dobrá znaÄka, kterou KLog nesprávnÄ› identifikoval. Po exportu můžete také soubor ADIF upravit. HamLibNetworkConfigWidget Enter the hostname or address of the radio. Zadejte hostname nebo adresu rádia. Set de network port of the radio. Nastavení portu rádia. Host/Address Host/Adresa Port Port Enter the port of the radio. Zadejte port rádia HamLibSerialConfigWidget Bauds Rychlost Select the serial port speed. Vyberte rychlost sériového portu. Port Port Select the serial port. Only the serial ports that are detected are shown. Vyberte sériový port. Jsou zobrazeny pouze nalezené seriové porty. Scan Vyhledat Click to identify the serial ports available in your computer. Vyhledat dostupné sériové porty na tomto poÄítaÄi. 5 bits 5 bits 6 bits 6 bits 7 bits 7 bits 8 bits 8 bits Data bits Datové bity Select the serial data bits. Vyberte datové bity. None Žádný Hardware Hardware Software XON/XOFF Software XON/XOFF Flow control Řízení toku Select the serial flow control Vyberte řízení toku na sériovém portu No parity No parity Even Even Odd Odd Space Space Mark Mark Parity Parity Select the serial parity. Vyberte paritu sériového portu. 1 bit 1 bit 1.5 bits 1.5 bits 2 bits 2 bits Stop bits Stop bity Select the serial stop bits. Vyberte Stop bity. InfoWidget 10M 10M 15M 15M 20M 20M 40M 40M 80M 80M 160M 160M 2M 2M 6M 6M 12M 12M 17M 17M 30M 30M 70CM 70CM Continent Kontinent Prefix Prefix CQ CQ ITU ITU Short Path Short Path Long Path Long Path Deg Azimut Miles Mile Km Km IntroPage Welcome to KLog! Vítejte v KLog! Welcome to KLog! - brought to you under the terms of the GPL! Vítejte v KLog! - pÅ™inesen Vám byl za podmínek GPL! Welcome to KLog Vitejte v KLog This looks like it's the first time you've run KLog on this computer. Vypadá to, že je to první spuÅ¡tÄ›ní KLog na tomto poÄítaÄi. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. KLog je bezplatný staniÄní log pro radioamatéry, který běží na GNU/Linux, macOS a Windows. KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. It is designed to provide general purpose DX, and contest logging. Je navržen tak, aby poskytoval vedení logu pro DX a soutěže. It supports QSL management, import and export of ADIF Podporuje QSL management, import a export ADIF and Cabrillo file formats and many other features... a Cabrillo a mnoho dalšího... Before you can start using KLog, you will be asked to: Než zaÄnete KLog používat, budete požádáni o: Acknowledge to the terms of the license. Odsouhlasení licenÄních podmínek. Download the DX entities information. Stažení DX informací. Enter your callsign, CQ zone, etc. and main configuration. Vložení Vaší volací znaÄky, CQ Zone a hlavní konfigurace. Enjoy KLog and contact the development team if you have any suggestions! Užijte si KLog a kontaktujte vývojový tým, pokud máte jakékoliv návrhy! LicPage KLog License information KLog LicenÄní Informace Welcome to KLog!- brought to you under the terms of the GPL! Vítejte v KLog! - pÅ™inesen Vám byl za podmínek GPL! Acknowledge Odsouhlasit Be aware that KLog is free software. UvÄ›domte si, že KLog je svobodný software. LoTWUtilities Double click on the date that you want to use as the start date for downloading QSOs. Dvakrát kliknÄ›te na datum, které chcete použít jako poÄáteÄní datum pro stažení QSO. KLog - LoTW password needed KLog - Je vyžadováno heslo LoTW Please enter your LoTW password: Vložte heslo do LoTW: KLog - LoTW Station callsign KLog - LoTW stanice There is not a single QSO in the log with that station callsign. V logu pro tuto stanici není žádné QSO. Are you sure that you want to use that station callsign (%1)? Opravdu si pÅ™ejete použít stanici (%1)? KLog - LoTW File already exists KLog - Soubor LoTW již existuje There is a file already existing with the name that will be used. Soubor s takovým jménem již existuje. The file %1 already exist. Do you want to overwrite? Soubor %1 již existuje. PÅ™ejete si jej pÅ™epsat? KLog - LoTW Can't write the file KLog - LoTW Nelze zapsat do souboru KLog was not able to save the file %1. Error returned: %2 KLog nebyl schopen zapsat do souboru %1. Chyba : %2 The file %1 already exists. Soubor %1 již existuje. Downloading data to file: %1. Stahuji data to souboru: %1. KLog - LoTW download KLog - Stažení LoTW KLog - LoTW Start date selection KLog - LoTW VýbÄ›r poÄáteÄního data This is the first date of a QSO with the callsign %1 in this log If you think that in LoTW you may have previous QSOs, answer No. Toto je první datum spojení s volací znaÄkou %1 v tomto logu Pokud si myslíte, že v LoTW můžete mít pÅ™edchozí spojení, odpovÄ›zte Ne. Do you want to use this date (%1) as start date? PÅ™ejete si použít datum (%1) jako poÄáteÄní datum? KLog - LoTW Download error KLog - LoTW Chyba pÅ™i stahování There was an error (%1) while downloading the file from LoTW. PÅ™i stahování souboru z LoTW doÅ¡lo k chybÄ› (%1). The downloading error details are: %1 Detaily chyby: %1 KLog - LoTW Redirection found KLog - LoTW Nalezeno pÅ™esmÄ›rování The remote server redirected our connection to %1 Vzdálený server pÅ™esmÄ›roval spojení na %1 Do you want to follow the redirection? Akceptujete toto pÅ™esmÄ›rování? KLog - LoTW File not found KLog - LoTW Soubor nenalezen KLog can't find the downloaded file. KLog nemůže nalézt stažený soubor. It was not possible for find the file %1 that has been just downloaded. Nebylo možné najít soubor %1, který byl právÄ› stažen. KLog - LoTW user/password error KLog - LoTW Chyba uživatele/hesla LoTW server did not recognized your user/password LoTW odmítl vaÅ¡e pÅ™ihlaÅ¡ovací údaje (uživatel/heslo) Check your user and password and ensure your are using the right one before trying again. Než to zkusíte znovu, zkontrolujte své uživatelské jméno a heslo. KLog - LoTW No QSOs KLog - LoTW Žádné QSO LoTW sent no QSOs LoTW Nebylo odesláno žádné QSO It seems that LoTW has no QSO with the Station Callsign you are using (%1). LoTW neobsahuje QSO se znaÄkou stanice, kterou právÄ› používáte (%1). KLog - LoTW Unknown error KLog - LoTW Neznámá chyba KLog can't recognize the file that has been downloaded from LoTW. KLog nemůže rozpoznat soubor, který byl stažen z LoTW. Try again and send the downloaded file (%1) to the KLog developer for analysis. Zkuste to znovu a poÅ¡lete stažený soubor (%1) vývojáři KLog k analýze. KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data? KLog úspěšnÄ› stáhl %1 QSO. Chcete aktualizovat svůj log o stažená data? Now KLog will process the downloaded QSO and update your local log. KLog zpracuje stažená spojení a aktualizuje lokální log. LogWindow QSL Send Odeslat QSL QSL Rcvd QSL PÅ™ijato &Delete &Smazat Delete a QSO Smazat QSO &Edit QSO &Upravit QSO Edit this QSO Upravit QSO Via &bureau Via &bureau Send this QSL via bureau Odeslat QSL via bureau D&irect D&irect Send this QSL via direct Odeslat QSL direct Via bureau Via bureau QSL &received via bureau QSL &pÅ™ijato via bureau Direct Direct QSL received via direc&t QSL pÅ™ijato direc&t Check in QRZ.com Vyhledat v QRZ.com Check this callsign in QRZ.com Vyhledat znaÄku v QRZ.com Check in DXHeat.com Vyhledat v DXHeat.com Check this callsign in DXHeat.com Vyhledat znaÄku v DXHeat.com Delete selected QSOs Smazat vybraná QSO Delete the selected QSOs Smazat vybraná QSO Export to ADIF Export ADIF Export the selected QSOs to an ADIF file. Exportovat vybraná QSO do ADIF. Upload to LoTW Nahrát do LoTW Upload the selected QSOs to LoTW Nahrát vybraná QSO do LoTW Upload to ClubLog Nahrát do ClubLog Upload the selected QSOs to ClubLog Nahrát vybraná QSO do ClubLog Upload to eQSL.cc Nahrát do eQSL.cc Upload the selected QSOs to eQSL.cc Nahrát vybraná QSO to QSL.cc Send these QSLs via bureau Odeslat tyto QSL via bureau Send these QSLs via direct Odeslat tyto QSL direct QSLs received via bureau QSL pÅ™ijatá via bureau QSLs received via direc&t QSL pÅ™ijatá direc&t Select none ZruÅ¡it výbÄ›r Remove all selections Odebrat vÅ¡echny výbÄ›ry Select all Vybrat vÅ¡echny Select all the QSOs Vybrat vÅ¡echny QSO MainQSOEntryWidget &Add &Vložit &Clear S&mazat Callsign of the QSO. Volací znaÄka. Band of the QSO. Pásmo. Mode of the QSO. Druh provozu. Date of the QSO. Datum. Time of the QSO. ÄŒas. Add the QSO to the log. Vložit QSO do logu. Clears the QSO entry. Smazat QSO. Look up info about the current callsign on qrz.com KLog will show real time if enabled. Pokud zaÅ¡krtnuto, KLog zobrazuje skuteÄný Äas. Real time SkuteÄný Äas Stop wsjt-x and hamlib from automatically updating QSO information. Manual Mode Callsign Stanice &Save &Cancel &ZruÅ¡it DUPE Translator: DUPE is a common world for hams. Do not translate of not sure DUPE MainWindow Check always the current callsign in QRZ.com Vždy vyhledej stanici v QRZ.com KLog - File not open KLog - Soubor neotevÅ™en It was not possible to open the debug file for writing. No debug log will be saved! Není možné zapsat do debug souboru. Debug informace nebudou zapisovány! Status bar ... Stanový řádek ... KLog - Stop the war in Ukraine! KLog - Stop the war in Ukraine! You are using a Russian call (%1). You can probably help to stop the Russian war, people are dying. Please call your leaders to stop the war. You are using an Ukranian call. Please take care and protect yourself and your family. The KLog developers wish you the best of luck in this very difficult moment. People are dying in the war of Russia against Ukraine. You can help to stop the Russian war against Ukraine. Please show your disagreement to your leaders, or in your social network to stop the war. DX Entity DX zemÄ› Starting KLog Startuji KLog &Log Window Okno &Logu Upload the queued QSOs to LoTW Nahrát zafrontovaná QSO to LoTW KLog - KLog folder not found KLog - CTY.dat update KLog - CTY.dat aktualizace KLog needs to update the Entities database. KLog potÅ™ebuje aktualizovat databázi zemí. You can update the entities database in Tools->Update cty.csv Aktualizovat databázi zemí je možné v Nástrojích->Aktualizace cty.csv Do you want to do it now? PÅ™ejete si to nyní provést? It seems that you have never done a backup or exported your log to ADIF. Nebyla provedená záloha nebo export logu do ADIF. It seems that the latest backup you did is older than one month. Poslední záloha je starší více než jeden mÄ›síc. Log backup recommended! Je doporuÄována záloha! It is a good practice to backup your full log regularly to avoid loosing data in case of a problem. Once you export your log to an ADIF file, you should copy that file to a safe place, like an USB drive, cloud drive, another computer, ... KLog will remind you to backup on a monthly basis. Je dobrým zvykem pravidelnÄ› zálohovat celý log, aby nedoÅ¡lo v případÄ› problému ke ztrátÄ› dat. Jakmile exportujete svůj log do souboru ADIF, mÄ›li byste tento soubor zkopírovat na bezpeÄné místo, například na USB disk, do cloudu nebo jiný poÄítaÄ. KLog vám pÅ™ipomene, abyste zálohovali každý mÄ›síc. KLog - Backup KLog - Záloha The backup was done successfully Záloha probÄ›hla úspěšnÄ› KLog will remind you to backup your data again in aprox one month. KLog pÅ™ipomene provést další zálohu pÅ™ibližnÄ› za 1 mÄ›síc. The backup was not properly done. Záloha se nepovedla. It is recommended to backup your data periodically to prevent lose or corruption of your log. DoporuÄujeme pravidelnÄ› zálohovat data, aby nedoÅ¡lo ke ztrátÄ› nebo poÅ¡kození vaÅ¡eho logu. KLog - New version detected! KLog - Byla zjiÅ¡tÄ›na nová verze! This version of KLog requires that the DXCC database is updated. The database will be updated. It seems that you are running this version of KLog for the first time. Zdá se, že používáte tuto verzi KLogu poprvé. The setup will be open to allow you to do any new setup you may need. OtevÅ™e se nastavení, pro úpravu parametrů. Ready PÅ™ipraven KLog KLog KLog - Unexpected error KLog - NeoÄekávána chyba An unexpected error ocurred when trying to add the QSO to your log. If the problem persists, please contact the developer for analysis: PÅ™i pokusu o pÅ™idání spojení do vaÅ¡eho logu doÅ¡lo k neoÄekávané chybÄ›. Pokud problém pÅ™etrvává, požádejte vývojáře o analýzu: KLog - Not valid call KLog - Neplatná znaÄka The callsign %1 is not a valid call. Do you really want to add this callsign to the log? Volací znaÄka %1 není platná. Opravdu si pÅ™ejete vložit tuto znaÄku do logu? Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications. Vložení neplatné znaÄky do logu může způsobit problémy pÅ™i žádosti o diplomy, exportu do ADIF. KLog - Select correct entity KLog - Vyberte správnou zemi You have selected an entity: Vybrali jste zemi: that is different from the KLog proposed entity: která se liší od zemÄ› navrhované KLog: Click on the prefix of the correct entity or Cancel to edit the QSO again. KliknÄ›te na prefix správné zemÄ› nebo ZruÅ¡it upravte spojení. KLog - Not valid callsign KLog - Neplatná znaÄka The callsign %1 is not a valid callsign. Do you really want to add this callsign to the log? Volací znaÄka %1 není platná. Opravdu si pÅ™ejete vložit tuto stanici do logu? No DXCC Není DXCC None Žádný Click on the prefix of the right entity or Cancel to correct. KliknÄ›te na prefix správné zemÄ› nebo ZruÅ¡it pro upravení. Save ADIF File Uložit ADIF You have requested to delete several QSOs Bylo požadováno smazat nÄ›kolik QSO This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again. Tato operace definitivnÄ› odstraní vÅ¡echna vybraná QSO a související data a nebudete jej moci znovu obnovit. Are you sure? Opravdu chcete odstranit QSO? You have requested to delete the QSO with: %1 Bylo požadováno smazat QSO s: %1 KLog - ClubLog error KLog - Chyba ClubLog The ClubLog upload process has finished with an error and the log was possibly not uploaded. Proces nahrávání do ClubLog byl dokonÄen s chybou. Log pravdÄ›podobnÄ› nebyl nahrán. Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1 Zkontrolujte prosím své pÅ™ihlaÅ¡ovací údaje, pÅ™ipojení k internetu a úÄet Clublog. Chybový kód:%1 KLog - ClubLog KLog - ClubLog Do you want to mark as Uploaded all the QSOs uploaded to ClubLog? PÅ™ejete si oznaÄit jako Nahraná vÅ¡echna QSO nahraná na ClubLog? There was an error while updating to Yes the ClubLog QSO upload information. DoÅ¡lo k chybÄ› pÅ™i nahrávání informací ClubLog QSO. The ClubLog upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? Nahrávání do ClubLog bylo dokonÄeno. Byl vytvoÅ™en soubor (%1) v adresáři KLogu. PÅ™ejete si smazat tento soubor? The file has been removed. Soubor byl smazán. The file has not been removed. Soubor nebyl smazán. It seems that there was something that prevented KLog from removing the file You can remove it manually. NÄ›co brání KLogu soubor smazat Můžete ho ruÄnÄ› smazat. KLog - eQSL error KLog - Chyba eQSL The eQSL upload process has finished with an error and the log was possibly not uploaded. Proces nahrávání do eQSL byl dokonÄen s chybou. Log pravdÄ›podobnÄ› nebyl nahrán. Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1 Zkontrolujte prosím své pÅ™ihlaÅ¡ovací údaje, pÅ™ipojení k internetu a úÄet eQSL. Chybový kód:%1 KLog - eQSL KLog - eQSL Do you want to mark as Uploaded all the QSOs uploaded to eQSL? PÅ™ejete si oznaÄit jako Nahraná vÅ¡echna QSO nahraná na eQSL? There was an error while updating to Yes the eQSL QSO upload information. DoÅ¡lo k chybÄ› pÅ™i nahrávání informací eQSL QSO. The eQSL upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? Nahrávání do eQSL bylo dokonÄeno. Byl vytvoÅ™en soubor (%1) v adresáři KLogu. PÅ™ejete si smazat tento soubor? KLog - QRZ.com warning QRZ.com has returned a non-subcribed error and queries to QRZ.com will be disabled. Please check your QRZ.com subcription or credentials. KLog - QRZ.com error KLog - Chyba QRZ.com The QRZ.com upload process has finished with an error and the log was possibly not uploaded. Proces nahrávání do QRZ.com byl dokonÄen s chybou. Log pravdÄ›podobnÄ› nebyl nahrán. KLog - QRZ.com KLog - QRZ.com Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com? PÅ™ejete si oznaÄit jako Nahraná vÅ¡echna QSO nahraná na QRZ.com? There was an error while updating to Yes the QRZ.com QSO upload information. DoÅ¡lo k chybÄ› pÅ™i nahrávání informací QRZ.com QSO. The QRZ.com upload process has finished successfully Nahrání QRZ.com bylo úspěšnÄ› dokonÄeno Call not found in QRZ.com Stanice nenalezena v QRZ.com KLog has received an error from QRZ.com. Byla pÅ™ijata chyba z QRZ.com. KLog - %1 KLog - %1 You need to activate the %1 service in the eLog preferences. Je potÅ™eba aktivovat službu %1 v Nastavení->Nastavení->eLog. KLog - Exit KLog - UkonÄení Do you really want to exit KLog? Opravdu si pÅ™ejete ukonÄit Klog? The logfile has been modified. Log byl modifikován. Do you want to save your changes? PÅ™ejete si uložit zmÄ›ny? KLog - ADIF export KLog - ADIF export It is important to export to ADIF and save a copy as a backup. Je důležité provést export ADIF a kopii exportu použít jako zálohu. Saving the log was done successfully. Log byl úspěšnÄ› uložen. The ADIF export was not properly done. Export ADIF nebyl proveden správnÄ›. &File &Soubor &Import from ADIF ... &Import z ADIF ... Import an ADIF file into the current log. Importovat ADIF do souÄasného logu. Export to ADIF ... Export do ADIF ... Export the current log to an ADIF logfile. Exportovat souÄasný log do ADIF. Export all logs to ADIF ... Exportovat vÅ¡echny logy do ADIF ... Export ALL the QSOs into one ADIF file, merging QSOs from all the logs. Exportovat vÅ¡echny QSO do jednoho ADIF, slouÄit QSO ze vÅ¡ech logů. &Print Log ... &Tisk logu ... Print your log. Tisk logu. KLog folder KLog adresář Opens the data folder of KLog. Otevřít KLog adresář. Settings ... Nastavení... E&xit &UkonÄit &Tools Nás&troje Fill in QSO data PÅ™epoužít QSO data Go through the log reusing previous QSOs to fill missing information in other QSOs. Použít data z pÅ™edeÅ¡lých QSO pro vyplnÄ›ní chybÄ›jících informací v QSO.. QSL tools ... QSL ... Find QSO to QSL Najít QSO pro QSL Shows QSOs for which you should send your QSL and request the DX QSL. Zobrazit QSO, pro která by mÄ›la být poslána QSL a požádáno o QSL protistanice. Find My-QSLs pending to send Najít QSL Äekající na odeslání Shows the QSOs with pending requests to send QSLs. You should keep this queue empty! Zobrazit QSO s nevyřízenými požadavky na odeslání QSL. Tato fronta by mÄ›la být ideálnÄ› prázdná! Find DX-QSLs pending to receive Najít QSL Äekající na potvrzení Shows DX-QSLs for which requests or QSLs have been sent with no answer. Zobrazit QSL, pro která bylo vyžádáno nebo odesláno QSL, ale není odpovÄ›Ä. Find requested pending to receive Najít nepÅ™ijaté vyžádané QSL Shows the DX-QSLs that have been requested. Zobrazí QSL, která byla vyžádána. LoTW tools ... LoTW ... Queue all QSLs from this log to be sent VÅ¡echna QSO z tohoto logu do fronty k odeslání Mark all non-sent QSOs in this log as queued to be uploaded. Do fronty pro odeslání budou vložena vÅ¡echna neodeslaná QSO z tohoto logu. Queue all QSLs to be sent VÅ¡echna QSL do fronty k odeslání Put all the non-sent QSOs in the queue to be uploaded. Vložit vÅ¡echna neodeslaná QSO do fronty k odeslání. Mark all queued QSOs from this log as sent OznaÄit zafrontovaná QSO z tohoto logu jako odeslaná Mark all queued QSOs in this log as sent to LoTW. OznaÄit zafrontovaná QSO z tohoto logu jako odeslaná do LoTW. Mark all queued QSOs as sent OznaÄit zafrontovaná QSO jako odeslaná Mark all queued QSOs as sent to LoTW. OznaÄit zafrontovaná QSO jako odeslaná do LoTW. Download from LoTW ... Stažení LoTW ... Download the full log from LoTW ... Stažení celého logu z LoTW ... ClubLog tools ... ClubLog ... Queue all the QSOs to be uploaded VÅ¡echna QSO do fronty k odeslání Upload the queued QSOs to ClubLog ... Odeslat QSO ve frontÄ› ... eQSL tools ... eQSL ... Upload the queued QSOs to eQSL.cc ... Nahrát QSO ve frontÄ› ... QRZ.com tools ... QRZ.com ... Check the current callsign in QRZ.com Vyhledat stanici v QRZ.com Queue all the QSO to be uploaded VÅ¡echna QSO do fronty k odeslání Upload the queued QSOs to QRZ.com ... Nahrát QSO ve frontÄ› ... Update cty.csv Aktualizovat cty.csv For updated DX-Entity data, update cty.csv. Aktualizuje DX zemÄ›, cty csv. Update Satellite Data Aktualizovat Satelity Stats Statistiky Show the statistics of your radio activity. Zobrazit statistiky o aktivitÄ›. Show Map &Help &NápovÄ›da Online manual (F1) ... Online nápovÄ›da (F1) ... &Tips ... &Typy ... &Debug ... &LadÄ›ní ... &About ... &O aplikaci ... About Qt ... O Qt ... Check updates ... Aktualizace ... KLog - LoTW KLog - LoTW All pending QSOs of this log has been marked as queued for LoTW! VÅ¡echna Äekající QSO z tohoto logu byla zafrontována do LoTW! There was a problem to mark all pending QSOs of this log as queued for LoTW! Vyskytla se chyba v oznaÄení vÅ¡ech QSO tohoto logu jako zafrontovaná do LoTW! Your log has been updated with the LoTW downloaded QSOs. Log byl aktualizován na základÄ› stažených dat z LoTW. KLog has updated %1 QSOs from LoTW. KLog aktualizoval %1 QSOs. Your log has not been updated. Log nebyl aktualizován. No QSO was updated with the data coming from LoTW. This may be because of errors in the logfile or simply because your log was already updated. QSO nebyla aktualizována. Mohla to způsobit chyba v souboru nebo jednoduÅ¡e nebylo co aktualizovat. Do you really want to mark ALL pending QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. Opravdu si pÅ™ejete oznaÄit VÅ ECHNA Äekající QSO k Nahrání. Toto je potÅ™eba udÄ›lat POUZE, když jsou QSO nahrávána do LoTW poprvé. All pending QSOs has been marked as queued for LoTW! VÅ¡echna Äekající QSO byla oznaÄena jako zafrontovaná do LoTW! KLog - TQSL KLog - TQSL TQSL is not installed or KLog can't find it. Please check the configuration. TQSL není nainstalovaný nebo KLog ho nemůže najít. Prosím, pÅ™ekontrolujte nastavení. Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded. Chyba #1: Akce byla pÅ™eruÅ¡ena uživatelem nebo TQSL není nakonfigurovaný. Žádné QSO nebylo nahráno. Error #2: Upload was rejected by LoTW, please check your data. Chyba #2: Požadavek byl odmítnut LoTW. Prosím, pÅ™ekontrolujte data. Error #3: The TQSL server returned an unexpected response. Chyba #3: NeoÄekávaná odpovÄ›Ä ze server TQSL. Error #4: There was a TQSL error. Chyba #4: Chyba TQSL. Error #5: There was a TQSLLib error. Chyba #5: Chyba TQSLLib. Error #6: It was not possible to open the input file. Chyba #6: NepodaÅ™ilo se otevřít vstupní soubor. Error #7: It was not possible to open the ouput file. Chyba #7: NepodaÅ™ilo se otevřít výstupní soubor. Error #8: No QSOs were processed since some QSOs were duplicates or out of date range. Chyba #8: Nebyla zpracována žádná QSO, protože QSO byla duplicitní nebo mimo Äasový rozsah. Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range. Chyba #9: Zpracovala se pouze nÄ›která QSO, zbytek byl ignorován, protože byly duplicitní nebo mimo Äasovou dobu. Error #10: Command syntax error. KLog sent a bad syntax command. Chyba #10: Chyba syntaxe. KLog zavolal chybný příkaz. Error #11: LoTW Connection error (no network or LoTW is unreachable). Chyba #11: Chyba pÅ™ipojení k LoTW (chyba síťového pÅ™ipojení nebo LoTW je nedostupný). Error #00: Unexpected error. Please contact the development team. Chyba #00: NeoÄekávaná chyba. Prosím, kontaktujte vývojový tým. The log that you have selected contains more than just one station callsign. Vybraný log obsahuje více jak jednu znaÄku stanice. Please select the station callsign you want to mark as sent to LoTW: Prosím, vyberte znaÄku stanice, která má být odeslána do LoTW: Station Callsign: Stanice: Define Station Callsign UrÄete znaÄku stanice You have selected no callsign. KLog will complete the QSOs without a station callsign defined and those with the callsign you are entering here. Nebyla vybrána žádná znaÄka. KLog doplní QSO bez znaÄky stanice definovanou znaÄkou, kterou zde vyberete. Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined: Zadejte znaÄku stanice, kterou chcete použít pro tento log nebo ji nechte prázdnou pro QSO bez definované volací znaÄky stanice: KLog - No station selected KLog - Nebyla vybrána žádná znaÄka stanice No station callsign has been selected and therefore no log will be marked Nebude oznaÄen žádný log, protože nebyla vybrána žádná znaÄka stanice All queued QSOs has been marked as sent to LoTW! VÅ¡echna zafrontovaná QSO byla oznaÄena jako odeslaná do LoTW! To upload QSOs you need a qrz.com subscription. If you have one, go to Setup->QRZ.com tab to enable it. Native Error There was a problem to mark all queued QSOs of this log as sent to LoTW! Nastal problém s oznaÄením zafrontovaných QSO jako odeslaných do LoTW! It was not possible to define the KLog folder. Some functions may not work properly! KLog-%1 - Logbook of %2 - QSOs: %3 KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4 Queue all QSOs from this log to be sent Do you really want to mark ALL the QSOs of this log to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW. Opravdu si pÅ™ejete oznaÄit VÅ ECHNA QSO v tomto Logu k Nahrání. Toto je potÅ™eba udÄ›lat POUZE, když jsou QSO nahrávána do LoTW poprvé. Now you can upload them to LoTW. Nyní je můžete nahrát do LoTW. There was a problem to mark all pending QSOs as queued for LoTW! Vyskytl se problém s oznaÄením vÅ¡ech ÄŒekajících QSO do LoTW! All queued QSOs of this log has been marked as sent to LoTW! VÅ¡echna QSO ve frontÄ› byla oznaÄena jako Odeslána do LoTW! There was a problem to mark all queued QSOs as sent to LoTW! Vyskytl se problém s oznaÄením QSO jako Odeslaná do LoTW! About ... O aplikaci... KLog - Update checking result KLog - Výsledek Aktualizace Congratulations! Gratulujeme! You already have the latest version. NejnovÄ›jší verzi již máte. You can find the KLog data folder here: KLog adresáře je možné najít: start nastartovat UDP Server error The UDP server failed to %1. start or stop Chyba UDP Serveru Serveru UDP se nepovedlo %1. stop zastavit The selection you have done does not include any QSO. It seems that there are no QSOs in the database. V databázi nejsou žádná QSO. If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help. Kontaktujte KLog vývojový tým, pokud databáze obsahuje nÄ›jaká QSO a KLog je nemůže najít (NápovÄ›da->O aplikaci). Status of the DX entity. Status DX zemÄ›. Always check the current callsign in QRZ.com Upload queued QSOs to LoTW Do you want to update now? You seem to have never backed up or exported your log to ADIF. Your latest backup seems older than one month. Regular backups prevent data loss and are good operator practice. Once exported, copy your ADIF file to a safe place such as a USB drive, cloud drive or other offsite computer. KLog will remind you to backup on a monthly basis. Backup completed successfully KLog will remind you again in approximately one month. Backup failed. Periodic data backups are recommended to prevent data loss and corruption of your log. The setup will now open to allow you to change your settings. Name of the DX entity. Jméno DX zemÄ›. QSO QSO QSL QSL eQSL eQSL Comment Poznámka Others Jiné My Data Mé údaje Satellite Satelit Info Info Awards Diplomy Search Hledání Log Log DX-Cluster DX-Cluster DXCC DXCC No QSOs have been exported to ADIF. Nebylo exportováno žádné QSO do ADIF. KLog has exported %1 QSOs to the ADIF file: %2 KLog exportoval %1 QSO do souboru ADIF: %2 You need to select one station callsign to be able to send your log to LoTW. Je potÅ™eba vybrat jednu znaÄku stanice, abyste mohli odeslat log do LoTW. TQSL finished with no error. Do you want to mark as Sent all the QSOs uploaded to LoTW? TQSL skonÄil bez chyby. PÅ™ejete si oznaÄit vÅ¡echna nahraná QSO jako odeslaná do LoTW? There was an error while updating to Yes the LoTW QSL sent information. PÅ™i aktualizaci doÅ¡lo k chybÄ›. The LoTW upload process has finished and KLog created a file (%1) in your KLog folder. Do you want KLog to remove that file? Nahrání do LoTW bylo úspěšné. KLog vytvoÅ™il soubor (%1) v KLog adresáři. PÅ™ejete si ho smazat? You need to select one station callsign to be able to send your log to ClubLog. Je potÅ™eba vybrat jednu znaÄku stanice, abyste mohli odeslat log do ClubLog. The selection you have done does not include any QSO Do you want to add this QSOs to your ClubLog existing log? PÅ™ejete si pÅ™idat toto QSO to existujícího ClubLog logu? If you don't agree, this upload will overwrite your current ClubLog existing log. Pokud nesouhlasíte, toto nahrání pÅ™epíše existující ClubLog log. You need to select one station callsign to be able to send your log to eQSL.cc. Je potÅ™eba vybrat jednu znaÄku stanice, abyste mohli odeslat log do eQSL. KLog - Select the Station Callsign. KLog - Vyberte znaÄku stanice. Select the Station Callsign to use when quering LoTW: Vyberte znaÄku stanice, která se použije pÅ™i dotazování do LoTW: Please check the LoTW setup PÅ™ekontrolujte nastavení LoTW You have not defined a LoTW user or a proper Station Callsign. Open the LoTW tab in the Setup and configure your LoTW connection. Nenastavili jste LoTW uživatele ani správnou znaÄku stanice. V Nastavení otevÅ™te kartu LoTW a nakonfigurujte spojení LoTW. Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1 PÅ™ejete si opravdu oznaÄit vÅ¡echna QSO pro NAHRÃNÃ? Musí být udÄ›láno POUZE, jestli jde o PRVNà NAHRÃNà QSO do %1 ClubLog ClubLog The log is ready to be uploaded to ClubLog. Log je pÅ™ipraven na nahrání do ClubLog. All the QSOs in this log has been marked as Modified in the ClubLog status field VÅ¡echna spojení v tomto logu byla oznaÄena jako Upravená ve stavovém poli ClubLog KLog could not mark the full log to be sent to ClubLog KLog nemohl oznaÄit celý log k odeslání do ClubLog Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers. NÄ›co zabraňovalo KLogu, aby oznaÄil QSO jako upravená. Restartujte KLog a zkuste to znovu, než kontaktujete vývojáře KLog. The log is ready to be uploaded to eQSL.cc. Log je pÅ™ipraven na nahrání do eQSL.cc. All the QSOs in this log has been marked as Modified in the eQSL.cc status field VÅ¡echna spojení v tomto logu byla oznaÄena jako Upravená ve stavovém poli eQSL KLog could not mark the full log to be sent to eQSL KLog nemohl oznaÄit celý log k odeslání do eQSL KLog - QRZ.COM KLog - QRZ.COM QRZ.COM QRZ.COM The log is ready to be uploaded to QRZ.com. Log je pÅ™ipraven na nahrání do QRZ.com. All the QSOs in this log has been marked as Modified in the QRZ.com status field VÅ¡echna spojení v tomto logu byla oznaÄena jako Upravená ve stavovém poli QRZ.com KLog could not mark the full log to be sent to QRZ.com KLog nemohl oznaÄit celý log k odeslání do QRZ.com You need to define a proper API Key for your QRZ.com logbook in the eLog preferences. V Nastavení je potÅ™eba definovat správné API Key pro QRZ.com. Open File Otevřít soubor - Needed for DXMarathon - PotÅ™ebné pro DXMarathon Filling QSOs ... PlnÄ›ní QSO ... Abort filling PÅ™eruÅ¡ení plnÄ›ní Filling DXCC, CQz, ITUz, Continent in QSOs... QSO: PlnÄ›ní DXCC, CQzone, ITU, Kontinentů v QSO... QSO: Number PoÄet Date/Time Datum/ÄŒas Callsign Stanice RSTtx RSTtx RSTrx RSTrx Band Pásmo Mode Druh provozu Print Log Tisk logu Printing the log ... Log se tiskne... Abort printing PÅ™eruÅ¡ení tisku Printing the log... QSO: Tisk logu... QSO: KLog - QSO received KLog - PÅ™ijato QSO The following QSO data has been received from WSJT-X to be logged: Následující QSO bylo pÅ™ijato z WSJT-X a bude zalogováno: Freq Frek Time On ÄŒas zaÄátku Time Off ÄŒas konce RST TX RST TX RST RX RST RX DX-Grid DX-Grid Local-Grid Místní-Grid Station Callsign Stanice Operator Callsign Volací znaÄka Operátora KLog - WSJTX Dupe QSO KLog - WSJTX Dupe QSO This QSO seems to be duplicated. Do you want to save or discard it? Jedná se o duplicitní QSO. PÅ™ejete si jej uložit nebo zamítnout? Duplicated QSOs have to match another existing QSO with the same call, band, mode, date and time, taking into account the period that can be defined in the settings. Duplicitní QSO se shoduje s existujícím QSO se stejnou znaÄkou, pásmem, druhem provozu, datem/Äasem s pÅ™ihlédnutím k období, které je definováno v nastavení. QSO logged from WSJT-X: QSO pÅ™ijato z WSJT-X: KLog - Non-supported mode KLog - Nepodporovaný mod A new mode not supported by KLog has been received from an external program or radio: Z externího programu nebo rádia byl pÅ™ijat nepodporovaný mód: If the received mode is correct, please contact KLog development team and request support for that mode Pokud je pÅ™ijatý mod správný, kontaktujte vývojový tým KLog a požádejte o podporu pro tento režim Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected) PÅ™ejete si nadále dostávat tato upozornÄ›ní? (deaktivace tÄ›chto upozornÄ›ní zabrání detekci neplatných režimů) KLog - QSO Dupe A dupe QSO has been detected in the file and will not be added to the log. Please check the QSO information file and ensure it is properly added. KLog - Duplicated satellite KLog - Duplicitní satelitní A duplicated satellite has been detected in the file and will not be imported. Duplicitní satelit byl detekován v tomto souboru a nebude importován. Please check the satellite information file and ensure it is properly populated. Zkontrolujte soubor informací o satelitu a ujistÄ›te se, že je správnÄ› vyplnÄ›n. Now you will see a more detailed error that can be used for debugging... Nyní uvidíte podrobnÄ›jší chybu, kterou lze použít k ladÄ›ní ... An unexpected error ocurred!! Nastala neoÄekávaná chyba!! If the problem persists, please contact the developers Kontaktujte vývojáře, pokud problém pÅ™etrvává for analysis: pro analýzu: Error in function Chyba ve funkci Error text Text chyby Failed query Neúspěšný dotaz Recommendation: DoporuÄení: Periodically export your data to ADIF to prevent a potential data loss. PravidelnÄ› exportujte svá data do ADIF, abyste pÅ™edeÅ¡li možné ztrátÄ› dat. KLog - Show errors KLog - Zobrazení chyb Do you want to keep showing errors? PÅ™ejete si nadále zobrazovat chyby? MainWindowInputComment Comment Poznámka Add a comment for this QSO. PÅ™idat poznámku pro toto QSO. Keep this data Ponechat pro další Data entered in this tab will be copied into the next QSO. Data zadaná na této kartÄ› budou zkopírována do dalšího spojení. MainWindowInputEQSL Date of the ClubLog upload. Datum odeslání do ClubLog. Date of the QRZ.com upload. Datum odeslání do QRZ.com. Date of the eQSL sending. Datum odeslání do eQSL. Date of the eQSL reception. Datum pÅ™ijetí z eQSL. Date of the LoTW sending. Datum odeslaní do LoTW. Date of the LoTW reception. Datum pÅ™ijetí z LoTW. Status on ClubLog. Status ClubLog. Status on QRZ.com. Status QRZ.com. Status of the eQSL sending. Status odeslání eQSL. Status of the eQSL reception. Status pÅ™ijetí eQSL. Status of the LoTW sending. Status odeslání LoTW. Status of the LoTW reception. Status pÅ™ijetí z LoTW. ClubLog ClubLog QRZ.com QRZ.com eQSL Sent eQSL odesláno eQSL Rec eQSL pÅ™ijato LoTW Sent LoTW odesláno LoTW Rec LoTW pÅ™ijato MainWindowInputOthers Primary Div Primární Div Secondary Div Sekundární Div IOTA IOTA Entity ZemÄ› Propagation mode Druh šíření Others Jiné Keep propagation mode Ponechat způsob šíření Select the primary division for this QSO. Vyberte primární divizi pro QSO. Select the secondary division for this QSO. Vyberte sekundární divizi pro QSO. Select the entity for this QSO. Vyberte zemi pro QSO. Select the propagation mode for this QSO. Vyberte způsob šíření pro QSO. Select the IOTA continent for this QSO. Vyberte IOTA kontinent pro QSO. Select the IOTA reference number for this QSO. Vyberte IOTA referenÄní Äíslo pro QSO. Keeps the same propagation mode for next QSO. Zachovat způsob šíření pro další QSO. Select the appropriate ADIF field for this QSO. Vyberte přísluÅ¡né pole ADIF pro toto QSO. Value for the selected ADIF field. Hodnota pro vybrané pole ADIF. Not Identified Neidentifikován Not - Not Identified Ne - Neidentifikován SOTA Ref SOTA Ref Age VÄ›k VUCC grids Distance MainWindowInputQSL QSL Sent QSL k odeslání QSL Rec QSL pÅ™ijato QSL Via QSL Via QSL Msg QSL zpráva Status of the QSL sending. Stav odeslání QSL. Status of the QSL reception. Stav pÅ™ijetí QSL. QSL sending information. Informace odeslání QSL. QSL reception information. Informace příjmu QSL. Date of the QSL sending. Datum odeslání QSL. Date of the QSL reception. Datum pÅ™ijetí QSL. Message of the QSL. QSL zpráva. QSL via information. Informace QSL via. MainWindowInputQSO TX RST. TX RST. RX RST. RX RST. TX Frequency in MHz. TX Frekvence v MHz. RX Frequency in MHz. RX Frekvence v MHz. Power used by the contacted station. Výkon použitý protistanicí. Name of the contacted operator. Jméno operátora protistanice. QTH of the contacted station. QTH protistanice. Locator of the contacted station. Lokátor protistanice. Watts W MHz MHz Split Translator: Split is a common hamradio term. Do not translate unless you are sure. Split Name Jméno QTH QTH DX Locator DX Lokátor Power(rx) Výkon(rx) RST TX RX Frequency RST(tx) RST(tx) RST(rx) RST(rx) Freq TX Frek TX Freq RX Frek RX DX QTH locator. DX QTH lokátor. DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. DX QTH lokátor. Formát má být IN70AA nanejvýš vÅ¡ak 10 znaků. TX Frequency in MHz. Frequency is not in a hamradio band! TX Frekvence v MHz. Frekvence je mimo radioamatérké pásmo! RX Frequency in MHz. Frequency is not in a hamradio band! RX Frekvence v MHz. Frekvence je mimo radioamatérké pásmo! MainWindowMyDataTab Watts W Keep this data Ponechat pro další My QTH locator. Můj QTH lokátor. Power Výkon Operator callsign ZnaÄka operátora Station Callsign ZnaÄka stanice My Locator Můj lokátor My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters. Můj QTH lokátor. Formát má být IN70AA nanejvýš vÅ¡ak 10 znaků. My Rig Můj Rig My Antenna Moje anténa My SOTA_Ref Moje SOTA_Ref My VUCC_GRIDS MainWindowSatTab Keep this data Ponechat pro další Data entered in this tab will be copied into the next QSO. Data zadaná na této kartÄ› budou zkopírována do dalšího spojení. Other - Sat not in the list Jiný - Sat není v seznamu Name of the Satellite if not in the list. Select: "%1" to enable this box. (format like AO-51). Jméno satelitu pokud není v seznamu. Vyberte: "%1" aktivovat toto pole. (napÅ™. AO-51). Satellite mode used. Použit satelitní režim. Select the satellite you are using. Vyberte satelit, který používáte. UpLink band. Pásmo UpLink. DownLink band. Pásmo DownLink. Locator of the DX station. This box is synchronized with the Locator box in the QSO tab. Lokátor DX stanice. Toto pole je synchronizováno s polem Lokátoru v záložce QSO. UpLink UpLink DownLink DownLink Satellite Satelit Mode Druh provozu DX Locator DX Lokátor Other Jiné MHz MHz Locator of the DX station. Format should be Maidenhead like IN70AA up to 10 characters. Lokátor DX stanice. Formát má být IN70AA nanejvýš vÅ¡ak 10 znaků. Not Sat QSO Není Sat QSO KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name. Jméno satelity nebylo rozpoznáno. Pokud má být použito jedno ze jmen známých satelitů, vyberte jej ze seznamu. PřípadnÄ› kontaktujte vývojový tým a pÅ™idejte nový název satelitu. The satellite you have in your QSO is: Satelit použit pro: Please be aware that the satellite name will not be saved if it is not in the list, so that information may be lost! Pamatujte, že název satelitu nebude uložen, pokud není v seznamu, takže může dojít ke ztrátÄ› informací! RX Frequency in MHz. Frequency is not in a hamradio band! RX Frekvence v MHz. Frekvence je mimo radioamatérké pásmo! RX Frequency in MHz. RX Frekvence v MHz. TX Frequency in MHz. Frequency is not in a hamradio band! TX Frekvence v MHz. Frekvence je mimo radioamatérké pásmo! TX Frequency in MHz. TX Frekvence v MHz. MapWindowWidget Select QSOs in this band. Select QSOs in this mode. Select QSOs in this propagation mode. Select QSOs using this Satellite. Only confirmed Select only confirmed QSOs. All bands Show nothing All modes All propagation modes All satellites OnlineMessageWidget The server returned the following error: %1 Not identified Neidentifikováno QObject New One, work it! Nové, ber ho ! Needed, work it! Je potÅ™eba, ber ho! Worked but not confirmed Pracováno, nepotvrzeno Confirmed Potvrzeno Not identified Neidentifikováno Database Error Chyba databáze KLog DB needs to be upgraded. KLog DB potÅ™ebuje aktualizovat. Do you want to upgrade it now? PÅ™ejete si ji aktualizovat nyní? If DB is not upgraded KLog may not work properly. Jestliže DB nebude aktualizována, KLog nemusí dobÅ™e pracovat. Upgrading software may potentially cause problems. Backing up your DB, before upgrading, is always a good idea. Aktualizace může způsobit problémy. Je dobrý nápad pÅ™ed aktualizací zazálohovat DB. Do you want to backup your DB now? PÅ™ejete si nyní zazálohovat DB? The backup finished successfully. Záloha byla provedena. You can find the backup in this file: %1 Zálohu je možné najít v souboru: %1 The backup was not properly done. Záloha se nepovedla. You will be sent back to the starting point. Budete pÅ™esmÄ›rováni zpÄ›t do výchozího bodu. KLog - DB can't be updated automatically KLog - DB nemůže být aktualizována automaticky You are upgrading from a too old KLog version and this upgrade can't be upgraded automatically from that version. Aktualizace je provádÄ›na z příliÅ¡ staré verze KLog a proto nemůže být provedena automaticky. The process to upgrade is: - Using an old KLog version export your log to ADIF. - Remove your logbook.dat file from your KLog folder. - Install the new KLog version. - Import your ADIF file. KLog will finish when you click on OK. Možný postup aktualizace je: - Použít starou verzi KLog a vyexportovat logy do ADIF. - Odstranit logbook.dat z adresáře KLog. - Instalovat novou verzi KLog. - Importovat ADIF soubor. KLog se ukonÄí po stisknutí OK. KLog - DB update KLog - Aktualizace DB KLog has detected a previous log in the DB. All data will be migrated to a newly created DX type log for you. KLog zjistil pÅ™edchozí log v databázi. VÅ¡echna data budou migrována do novÄ› vytvoÅ™eného logu typu DX. KLog: Enter Station callsign KLog: Vložte znaÄku stanice Enter the station callsign used in this log Vložte znaÄku stanice použitou v tento logu Station Callsign ZnaÄka stanice All the data was migrated correctly. You should now go to Setup->Preferences->Logs to check that everything is okay. VÅ¡echna data byla migrována správnÄ›. Nyní byste mÄ›li jít do Nastavení-> Nastavení-> Logy a zkontrolovat, zda je vÅ¡e v pořádku. Updating mode information... Aktualizace informací o druhu provozu ... Abort updating PÅ™eruÅ¡it aktualizaci QSO: QSO: Canceling this update will cause data inconsistencies and possibly data loss. Do you still want to cancel? ZruÅ¡ení této aktualizace způsobí nekonzistence dat a možná ztrátu dat. Opravdu si ji pÅ™ejete zruÅ¡it? Updating bands information... Aktualizace informací o pásmech... Updating bands information in %1 status... Aktualizace informací o pásmech. Stav %1 ... Progress: Progres: Updating mode information in %1 status... Aktualizace informací o druhu provozu. Stav %1 ... Updating DXCC award information... Aktualizace DXCC informací... Updating DXCC Award information... Aktualizace DXCC informací... Updating WAZ award information... Aktualizace WAZ informací... Updating WAZ Award information... Aktualizace WAZ informací... Updating information... Aktualizace informací... Updating DXCC and Continent information... Aktualizace DXCC a kontinentů... KLog is already running. KLog již běží. It is allowed to run only one instance. Je povoleno spustit pouze jednu instanci. Install wizard was canceled before completing... Průvodce instalací byl pÅ™eruÅ¡en pÅ™ed dokonÄením... Do you want to remove the KLog dir from your disk? PÅ™ejete si smazat z disku KLog adresář? Your KLog dir has been removed KLog adresář byl smazán Thank you for running KLog! DÄ›kujeme, že jste spustili KLog! I could not remove your KLog dir. You should do it manually if you want it removed from your hard disk. Nepovedlo se smazat KLog adresář. Pokud ho chcete opravdu smazat, mÄ›li byste to udÄ›lat ruÄnÄ›. Your KLog dir could not be removed. You should do it manually if you want it removed from your hard disk. Nepovedlo se smazat KLog adresář. Pokud ho chcete opravdu smazat, mÄ›li byste to udÄ›lat ruÄnÄ›. Remember that your KLog dir is on your system... Pamatujte, že adresář KLog je ve vaÅ¡em systému... A wrong callsign has been found: %1. Please enter a new callsign or confirm that the current one is a good callsign. Byla nalezena nesprávná znaÄka: %1. Zadejte novou volací znaÄku nebo potvrÄte, že ta aktuální je správná. An empty callsign has been detected. If it is possible, please enter the right call. Byla nalezena prázdná volací znaÄka. Pokud je to možné, prosím, vložte správnou znaÄku. KLog - Not valid callsign found KLog - Nalezena neplatná znaÄka Date Datum Call Stanice RSTtx RSTtx RSTrx RSTrx Band Pásmo Comment Poznámka Mode Druh provozu CQz ITUz DXCC DXCC Address Age VÄ›k County A_Index Ant_Az Ant_El Ant_Path ARRL_SECT Award_Submitted Award_granted Band_RX CheckContest Class ClubLog SDate ClubLog status Continent Kontinent Contest Id Country Credit Submitted Credit granted Dark Dok Do not translate if unsure, common hamradio term. Fists Do not translate if unsure, common hamradio term. Fists CC Do not translate if unsure, common hamradio term. My Fists Do not translate if unsure, common hamradio term. Nr bursts Do not translate if unsure, common hamradio term. Nr pings Do not translate if unsure, common hamradio term. Sat mode SWL Do not translate if unsure, common hamradio term. Ten-Ten Do not translate, it is a hamradio group name. Distance Contacted_Op Email EQ_Call eQSL RDate eQSL SDate eQSL Rcvd eQSL Sent eQSL odesláno Force Init Freq Frek Freq RX Frek RX Gridsquare HRDLog SDate HRDLog status IOTA IOTA IOTA Island id K Index Lat Lon LoTW RDate LoTW SDate LoTW Rcvd LoTW Sent LoTW odesláno Max Bursts MS Shower My Antenna Moje anténa My City My Cnty My Country My CQz My DXCC My Gridsquare My IOTA My IOTA island id My ITUz My Lat My Lon My Name My Postal code My Rig Můj Rig My Sig My Sig Info My SOTA ref My State My Street My USACA counties My VUCC grids Name Jméno Notes Operator Owner Callsign Pfx Precedence Prop Mode Public Key QRZcom SDate QRZcom status QSL msg QSL RDate QSL SDate QSL Rcvd QSL Sent QSL rcvd via QSL sent via QSL via QSO complete QSO random QTH QTH Region Rig RX Pwr Sat name Jméno satelitu SFI Sig Sig Info Silent key Do not translate if unsure, common hamradio term. SKCC SOTA Ref SOTA Ref SRX String SRX STX String State Submode UKSMG USACA counties VE prov VUCC grids TX Pwr Web QSO Date off Log number SearchWidget &Clear S&mazat &Export Highlighted &Exportovat vybrané &Select All &Vybrat vÅ¡e &Search &Hledání All logs VÅ¡echny logy Clear the searches. Smazat vÅ¡echny hledání. Export the search result to an ADIF file. Export výsledku hledání do ADIF. Select/Unselect all the QSOs shown. Vybrat/ZruÅ¡it vÅ¡echna zobrazená QSO. Search in the log. Najít v logu. Search in all logs. Najít ve vÅ¡ech logách. Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs! Zadejte znaÄku, kterou chcete vyhledat. Pro výbÄ›r vÅ¡ech spojení použijte '*'...může trvat delší dobu! Select the Station Callsign used to do this QSO. Vyberte znaÄku stanice použitou pro toto QSO. You have requested to delete the QSO with: %1 Bylo požádáno smazat QSO s: %1 Are you sure? Opravdu chcete odstranit QSO? All in log Ve vÅ¡ech Not defined Nedefinováno &Clear selection &ZruÅ¡it výbÄ›r Save File Uložit soubor SearchWindow Call Stanice Date/Time Datum/ÄŒas Band Pásmo Mode Druh provozu QSL Sent QSL odesláno QSL Rcvd QSL pÅ™ijato Station Callsign Volací znaÄka ID ID Date/time Datum/ÄŒas Station callsign Stanice QSL Send QSL odesláno &Delete &Smazat Delete a QSO Smazat QSO &Edit QSO &Upravit QSO Edit this QSO Upravit QSO Via &bureau Via &bureau Send this QSL via bureau Odeslat QSL via bureau D&irect D&irect Send this QSL via direct Odeslat QSL via bureau Via bureau Via bureau QSL &received via bureau QSL &pÅ™ijato via bureau Direct Direct QSL received via direc&t QSL pÅ™ijato direc&t Check in QRZ.com Vyhledat v QRZ.com Check this callsign in QRZ.com Vyhledat znaÄku v QRZ.com Check in DXHeat.com Vyhledat v DXHeat.com Check this callsign in DXHeat.com Vyhledat znaÄku v DXHeat.com &Request my QSL &Request my QSL Mark my QSL as requested OznaÄit můj QSL jako vyžádaný Via Direct and mark DX QSL as requested Direct a oznaÄit QSL jako vyžádané Send this QSL via direct and mark DX QSL as requested Odeslat QSL direct a oznaÄit jako vyžádané Via Bureau and mark DX QSL as requested Via Bureau a oznaÄit QSL jako vyžádané Send this QSL via bureau and mark DX QSL as requested Odeslat QSL via Bureau a oznaÄit QSL jako vyžádané &Request the QSL &Request QSL Mark the QSL as requested OznaÄit QSL jako vyžádané Via bureau and mark my QSL as requested Via Bureau a oznaÄit můj QSL jako vyžádaný QSL received via bureau and mark my QSL as requested QSL pÅ™ijato via bureau a oznaÄit můj QSL jako vyžádaný Direc&t and mark as my QSL requested Direc&t a oznaÄit můj QSL jako vyžádaný QSL received via direct and mark my QSL as requested QSL pÅ™ijat direct a oznaÄit můj QSL jako vyžádaný Needed QSO to send the QSL K odeslání QSL je potÅ™eba QSO My QSL requested to be sent Můj vyžádaný QSL bude odeslán DX QSL pending to be received QSL Äeká na pÅ™ijetí SetupDialog User data Uživatel Bands/Modes Pásma/Druhy provozu Log widget D&X-Cluster D&X-Cluster Colors Barvy Misc Různé World Editor Editor zemí Logs Logy eLog eLog WSJT-X WSJT-X Satellites Satelity HamLib HamLib Cancel ZruÅ¡it OK OK Settings Nastavení You need to enter at least one log in the Logs tab. Na kartÄ› Logy je nutné zadat alespoň jeden log. Do you want to add one log in the Logs tab or exit KLog? (Click Yes to add a log or No to exit KLog) PÅ™ejete si pÅ™idat log v záložce Log nebo ukonÄit KLog? (ANO - pÅ™idat log nebo NE - opustit) DX-Cluster DX-Cluster World SvÄ›t DB has not been moved to new path. DB nebyla pÅ™esunuta do nové cesty. Go to the Misc tab and click on Move DB or the DB will not be moved to the new location. Jdete do karty Různé a kliknÄ›te na PÅ™esun DB jinak DB nebude pÅ™esunuta do nového adresáře. You need to enter at least a valid callsign. Musíte vložit alespoň platnou znaÄku. Go to the User tab and enter valid callsign. Použijte kartu Uživatel a vložte platnou znaÄku. You have not selected the kind of log you want. Nevybrali jste požadovaný druh logu. You will be redirected to the Log tab. Please add and select the kind of log you want to use. Budete pÅ™esmÄ›rováni na kartu Log. PÅ™idejte a vyberte druh logu, který chcete použít. SetupEntityDialog Entity ZemÄ› Name of the Entity. Jméno zemÄ›. CQ CQ CQ zone. CQ zone. ITU ITU ITU zone. ITU zone. Latitude ZemÄ›pisná šířka Longitude of the Entity. ZemÄ›pisná délka zemÄ›. Longitude ZemÄ›pisná délka UTC UTC Local time difference to UTC. Rozdíl mezi místním Äasem a UTC. Main prefix Hlavní prefix Main prefix of the entity. Hlavní prefix zemÄ›. ARRL ID ARRL ID ARRL ID. ARRL ID. Prefixes Prefixy Comma separated possible prefixes, e.g. EA1, EA2, ... Seznam možných prefixů, e.g. EA1, EA2, ... Date of the deletion. Datum zruÅ¡ení. Deleted ZruÅ¡eno Cancel ZruÅ¡it Ok Ok Entity Dialog ZemÄ› SetupPageBandMode Bands Pásmo Modes Druhy provozu SetupPageColors New One Nové Needed in this band PotÅ™eba na tomto pásmu Worked in this band Navázáno na tomto pásmu Confirmed in this band Potvrzeno na tomto pásmu Default Výchozí WSJT-X palette Paleta WSJT-X Default palette Výchozí paleta Dark Mode Tmavý režim Color when the DXCC is an ATNO (All Time New One). Barva pro ATNO (All Time New One) DXCC. This DXCC was worked before in another band but not in the selected band. It may be needed due to the CQ, ITU, Grid, ... S DXCC bylo navázané spojení na jiném pásmu, ale ne na vybraném pásmu.Může to být nutné pro CQ, ITU, ÄŒtverce, ... Worked DXCC, but not confirmed in this band. Navázáno s DXCC, ale není potvrzené na tomto pásmu. DXCC is confirmed in this band. DXCC potvrzeno na tomto pásmu. Default color. Výchozí barva. Sets a palette of colors similar to the one used in WSJT-X. Barevná paleta podobná barvám, používaných v WSJT-X. Sets the default palette. Nastav výchozí paletu. Sets the Dark Mode Nastavení Tmavého režimu Choose a color Vyberte barvu Light Mode SvÄ›tlý režim SetupPageDxCluster Add PÅ™idat Delete Smazat Show &HF spots Zobrazovat &HF spoty Show V/&UHF spots Zobrazovat V/&UHF spoty Show W&ARC spots Zobrazovat W&ARC spoty Show &worked spots Zobrazovat již &Navázané Show &confirmed spots Zobrazovat již &Potvrzené Show ANN/&FULL messages Zobrazovat ANN/&FULL zprávy Show WW&V messages Zobrazovat WW&V zprávy Show WC&Y messages Zobrazovat WC&Y zprávy Save DX Cluster activity Ukládat aktivitu DX Cluster Saves all the DX-Cluster activity to a file in the KLog folder Ukládat aktivitu DX-Cluster do souboru v KLog adresáři Send DX Spots to the map Sends the received DX Spots to the map to know where is the activity. DX Spots DX Spoty Others Jiné Messages Zprávy KLog: Add a DXCluster server KLog: Vložit DXCluster server Add the address followed by the :port Example: dxfun.com:8000 If no port is specified, 41112 will be used by default: Vložte adresu a port Příklad: dxfun.com:8000 Pokud nebude specifikován port, bude použit výchozí port 41112: SetupPageELog ClubLog password Heslo ClubLog App password ClubLog email Email Enter the email you used to register in ClubLog. Vložte email, který jste použili pÅ™i registraci do ClubLog. Enter your password ClubLog here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Vložte heslo pro ClubLog. UpozornÄ›ní: Heslo je uloženo v otevÅ™ené podobnÄ› v konfiguraÄním souboru KLog!! (Pokud si nepÅ™ejete heslo uložit, KLog se bude ptát pokaždé, když bude potÅ™eba) Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!! Send QSOs in real time Ihned odesílat QSO Activate ClubLog Aktivovat ClubLog Send each QSO to ClubLog in real time, as they are added (or modified) in KLog. Ihned odeslat každé QSO do ClubLog tak jak je vloženo (nebo modifikováno) v KLog. Starts the ClubLog support in KLog. ZaÄít používat ClubLog v KLog. Activate eQSL.cc Aktivovat eQSL.cc Enter your username of eQSL.cc. Vložte uživatelské jméno v eQSL.cc. Enter your password eQSL.cc here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Vložte heslo pro eQSL.cc. UpozornÄ›ní: Heslo je uloženo v otevÅ™ené podobnÄ› v konfiguraÄním souboru KLog!! (Pokud si nepÅ™ejete heslo uložit, KLog se bude ptát pokaždé, když bude potÅ™eba) eQSL.cc password Heslo eQSL.cc user Uživatelské jméno ClubLog ClubLog eQSL.cc eQSL.cc QRZ.com QRZ.com Enter the user of your QRZ.com account. You need to be subscribed to QRZ.com to use this service. Vložte uživatelské jméno pro QRZ.com. Abyste mohli tuto službu používat, musíte se nejdříve registrovat u QRZ.com. User Uživatelské jméno Enter your password QRZ.com here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Vložte heslo pro QRZ.com. UpozornÄ›ní: Heslo je uloženo v otevÅ™ené podobnÄ› v konfiguraÄním souboru KLog!! (Pokud si nepÅ™ejete heslo uložit, KLog se bude ptát pokaždé, když bude potÅ™eba) Password Heslo Activate QRZ.com Aktivovat QRZ.com Check automatically Vyhledávat automaticky Check in Qrz.com all Calls as they are entered Vždy vyhledat vloženou stanici v QRZ.com Paying Subscriber Check it if you are paying for a qrz.com subscription LogBook Key LogBook Key LogBook Key for QSO uploading. You can get this key in your QRZ.com logbook webpage. Remember that you need a QRZ.com subscription to use this feature. LogBook Key pro nahrání QSO. Získáte ho na Vaší stránce QRZ.com. MÄ›jte na pamÄ›ti, že je potÅ™eba se registrovat. LoTW LoTW Upload Nahrání Download Stažení TQSL path Cesta k TQSL Use TQSL Použít TQSL LoTW password Heslo LoTW user Uživatelské jméno Enter your LoTW user. Vložte LoTW uživatelské jméno. Enter your password LoTW here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.) Vložte heslo pro LoTW. UpozornÄ›ní: Heslo je uloženo v otevÅ™ené podobnÄ› v konfiguraÄním souboru KLog!! (Pokud si nepÅ™ejete heslo uložit, KLog se bude ptát pokaždé, když bude potÅ™eba) Path to the TQSL software. Cesta k aplikaci TQSL. Enable the LoTW integration with TQSL. You will need to have TQSL installed Povolit integraci LoTW s TQSL. Bude potÅ™eba mít nainstalovaný TSQL Select File Vyberte soubor SetupPageHamLib Activate HamLib Používat HamLib Activates the hamlib support that will enable the connection to a radio. Použít hamlib umožňující pÅ™ipojit rádio. Read-Only mode Read-Only režim If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio. Pokud povoleno, KLog Äte frekvenci a druh provozu z rádia, ale neposílá žádné příkazy do rádia. Radio Rádio Select your rig. Vyberte rádio. Serial Network Defines the interval to poll the radio in msecs. Definujte interval dotazování rádia v milisekundách. Poll interval Interval dotazování Test: OK Test: OK Test: NOK Test: NOK Test Test Click to test the connection to the radio Kliknutím se otestuje pÅ™ipojení radia SetupPageLogView Fields SetupPageLogs &New &Nový &Edit &Upravit &Remove &Odstranit Add a new log. PÅ™idat nový log. Edit the selected log. Upravit vybraný log. Remove the selected log. Odstranit vybraný log. KLog KLog Do you really want to remove this log? Opravdu si pÅ™ejete odstranit tento log? All the QSOs from this log will also be deleted... Budou vymazána také vÅ¡echna QSO z tohoto logu... Log has not been removed. (#3) Log nebyl vymazán. (#3) Log has not been removed. (#2) Log nebyl vymazán. (#2) Log has not been removed. (#1) Log nebyl vymazán. (#1) ID ID Date Datum Station Callsign Stanice Operators OperátoÅ™i Comments Poznámka QSOs QSO The new log could not be created. Nelze vytvoÅ™it nový log. An error has occurred showing the following error code: Nastala chyba s následujícím kódem chyby: KLog - SetupPageLogs KLog - Nastavení Logů SetupPageLogsNew &Date &Datum &Station Callsign &Stanice &Operators &OperátoÅ™i Comm&ent &Poznámka &Ok &Ok &Cancel &ZruÅ¡it Callsign used for this log. Použitá znaÄka pro tento log. Comma separated list of operators: callsign1, callsign2. Čárkou oddÄ›lený seznam operátorů: znaÄka1, znaÄka2. Start date of this log. PoÄáteÄní datum logu. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. PÅ™idejte komentář k tomuto logu. Pokud je vyplnÄ›n, zobrazí se v hlavním oknÄ› KLog jako identifikace logu. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. Je potÅ™eba vložit platnou znaÄku stanice. Log nebude otevÅ™en. SetupPageMisc Check non-valid calls &Imperial system &Imperiální jednotky &Log in real time Použít &skuteÄný Äas Show seconds &Time in UTC ÄŒ&as v UTC &Save ADIF on exit &Ukládat ADIF pÅ™ed ukonÄení Use this &default filename &Výchozí jméno ADIF souboru Mark &QSO to send QSL when QSL is received OznaÄovat &QSO jako Odeslat QSL pÅ™i příjmu QSL od protistanice Complete QSO with previous data Kompletovat QSO z pÅ™edeÅ¡lých informací Show the Station &Callsign used in the search box Zobrazovat vlastní znaÄku &stanice ve výsledku Hledání &Check for new versions automatically Automaticky &kontroloval aktualizace &Provide Info for statistics &Poskytnout informace pro statistiky Manage DX-Marathon Spravovat DX-Marathon Activate the application debug log Zapnout ladící hlášky Mark sent eQSL && LoTW in new QSO as queued OznaÄovat nová QSO k odeslání do eQSL && LoTW &Delete always temp ADIF file after uploading QSOs Vždy &smazat doÄasný ADIF po nahrání QSO Browse Procházet Move DB PÅ™esunout DB In seconds, enter the time range to consider a duplicate if same call, band and mode is entered. Zadejte Äasový interval v sekundách pro zvážení, zda jde o duplicitní spojení, pokud jde o stejnou znaÄku, pásmo a druh provozu. Show seconds in the QSO editor If you disable this checkbox KLog will not check callsigns to identify wrong callsigns. QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours. QSO budou oznaÄena jako nevyřízené (k odeslání) QSL, pokud obdržíte QSL od protistanice a Váš QSL nebyl zatím odeslán. The search box will also show the callsign on the air to do the QSO. Vyhledávací pole zobrazí volací znaÄku pro spojení. Check if there is a new release of KLog available every time you start KLog. Pokud povoleno, KLog kontroluje dostupnou aktualizaci pÅ™i každém startu. If new version checking is selected, KLog will send the developer your callsign, KLog version and Operating system to help in improving KLog. Pokud je aktivní kontrola aktualizací, KLog bude zasílat vývojářům VaÅ¡i znaÄku, KLog verzi a OperaÄní systém pro vylepÅ¡ení KLogu. Check it for Imperial system (Miles instead of Kilometers). Použijí se Imperiální jednotky (míle místo kilometrů). Select to use real time. Použít skuteÄný Äas. Select to use UTC time. Použít Äas v UTC. Select if you want to save to ADIF on exit. Vyberte, pokud požadujete pÅ™ed ukonÄení aplikace uložit do ADIF. Select to use the following name for the logfile without being asked for it again. Vyberte, chcete-li použít následující název souboru logu, aniž byste o nÄ›j byli znovu požádáni. Complete the current QSO with previous QSO data. Pro QSO se použijí informace z pÅ™edeÅ¡lých QSO. Select if you want to manage DX-Marathon. Vyberte, pokud si pÅ™ejete spravovat DX-Marathon. This is the default file where ADIF data will be saved. Toto je výchozí soubor, kam je ADIF ukládán. This is the directory where the database (logbook.dat) will be saved. Toto je adresář, do kterého bude databáze (logbook.dat) uložen. Click to change the default ADIF file. KliknÄ›te pro zmÄ›nu výchozího ADIF souboru. Click to change the path of the database. KliknÄ›te pro zmÄ›nu cesty k databázi. Click to move the DB to the new directory. KliknÄ›te pro pÅ™esun DB to nového adresáře. Select the application debug log level. This may be useful if something is not working as expected. A debug file will be created in the KLog directory and/or shown with Help->Debug menu. Activates the application debug log. This may be useful if something is not working as expected. A debug file will be created in the KLog directory. Aktivuje ladící log. Toto může být užiteÄné v případÄ›, kdy nÄ›co nefunguje tak, jak by mÄ›lo. Ladící soubor bude vytvoÅ™en v KLog adresáři. Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default. KliknÄ›te pro oznaÄení Zafrontovat (k odeslání) do eQSL (LoTW a eQSL) pro vÅ¡echna nová QSO. Delete Always the adif file created after uploading QSOs Vždy smazat ADIF vytvoÅ™ený pÅ™i nahrání QSO Log level Dupe time range: ÄŒasový interval Duplicit: Open File Otevřít soubor Select Directory Vybrat adresář This is the directory where DB (logbook.dat) will be saved. Toto je adresář, do kterého bude ukládána DB (logbook.dat). Please specify an existing directory where the database (logbook.dat) will be saved. Specifikujte existující adresář, do kterého bude ukládána databáze (logbook.dat). KLog - Move DB KLog - PÅ™esun DB File moved Soubor pÅ™esunut File copied Soubor pÅ™ekopírován File already exist. Soubor již existuje. The destination file already exist and KLog will not replace it. Please remove the file from the destination folder before moving the file with KLog to make sure KLog can copy the file. Cílový soubor již existuje a KLog ho nebude nahrazovat. Odeberte soubor z cílové složky pÅ™ed pÅ™esunutím souboru pomocí KLog. File NOT copied Soubor se nezkopíroval The file was not copied due to an unknown problem. Soubor se nepÅ™ekopíroval kvůli neznámé chybÄ›. The target directory does not exist. Please select an existing directory. Cílový adresář neexistuje. Vyberte existující adresář. SetupPageSats &New &Nový &Edit &Upravit &Remove &Smazat &Import &Importovat E&xport E&xportovat Add a new satellite. PÅ™idat nový satelit. Edit the selected satellite. Upravit vybraný satelit. Remove the selected satellite. Smazat vybraný satelit. Import a satellites file. It will replace the satellites you have in the current list. Importovat soubor se satelity. Soubor nahradí satelity, které jsou na souÄasném seznamu. Export your current satellites to a file. Exportovat souÄasný seznam satelitů do souboru. Select the sat you want to open. Vyberte satelit, který si pÅ™ejete otevřít. KLog KLog Do you really want to remove this satellite? Opravdu si pÅ™ejete odstranit tento satelit? This satellite will no be longer available to be selected ... Tento satelit již nebude možné vybrat ... Sat has not been removed. (#3) Satelit nebyl odstranÄ›n. (#3) Sat has not been removed. (#2) Satelit nebyl odstranÄ›n. (#2) Sat has not been removed. (#1) Satelit nebyl odstranÄ›n. (#1) ID ID Short Krátké Name Jméno Uplink Uplink Downlink Downlink Modes Druhy provozu An error has occurred showing the following error code: Nastala chyba s následujícím kódem chyby: KLog - SetupPageSats KLog - Nastavení Satelitů Open Satellites File Otevřít satelitní soubor KLog warning KLog upozornÄ›ní An unexpected error ocurred while importing the satellite data. It may be caused because the file you are trying to import does not have the right format. Objevila se neoÄekávaná chyba pÅ™i importu satelitních dat. To může být způsobeno tím, že soubor nemá požadovaný formát. Please check the format or contact the developer for analysis with the error code: Zkontrolujte prosím formát nebo kontaktujte vývojáře s žádostí o analýzu s kódem chyby: Save Satellites File Uložit satelitní soubor SetupPageSatsNew Short name Krátké jméno Sat name Jméno satelitu UpLink UpLink DownLink DownLink Modes Druhy provozu &Ok &Ok &Cancel &ZruÅ¡it Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards. Zadejte krátký název. Pokuste se použít krátký název LoTW, abyste poté mohli své QSO nahrát do LoTW. Enter the name of the satellite. Zadejte jméno satelitu. Enter the uplink frequencies in this format: 144.300 Zadejte uplink frekvenci v tomto formátu: 144.300 Enter the downlink frequencies in this format: 144.300 Zadejte downlink frekvenci v tomto formátu: 144.300 Enter the modes in this format: USB Zadejte druh provozu v tomto formátu: USB Some of the data you have entered is not correct; the satellite can't be added. NÄ›která z vložených dat jsou chybná; satelit nebude pÅ™idán. SetupPageSubdivisionNew &Date &Datum &Station Callsign &Stanice &Operators &OperátoÅ™i Comm&ent &Poznámka &Ok &Ok &Cancel &ZruÅ¡it Callsign used for this log. Použitá znaÄka pro tento log. Comma separated list of operators: callsign1, callsign2. Čárkou oddÄ›lený seznam operátorů: znaÄka1, znaÄka2. Start date of this log. PoÄáteÄní datum logu. Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log. PÅ™idejte komentář k tomuto logu. Pokud je vyplnÄ›n, zobrazí se v hlavním oknÄ› KLog jako identifikace logu. You need to enter a valid callsign in the Station Callsign box. The log will not be opened. Je potÅ™eba vložit platnou znaÄku stanice. Log nebude otevÅ™en. SetupPageSubdivisions &Remove &Odstranit Import new Importovat nový Import an AWA file with the subdivision details. Import AWA souboru s detaily subdivize. Remove the selected references. Odebrat vybrané reference. Select the references you want to open. Vyberte reference, které si pÅ™ejete otevřít. KLog KLog Do you really want to remove the data of this entity? Opravdu si pÅ™ejete odstranit data pro tuto zemi? All the subdivision information for this entity will be deleted... Budou odstranÄ›ny vÅ¡echny subdivize pro tuto zemi... Log has not been removed. (#3) Log nebyl vymazán. (#3) Log has not been removed. (#2) Log nebyl vymazán. (#2) Log has not been removed. (#1) Log nebyl vymazán. (#1) ID ID Name Jméno Short Name Krátké jméno CQ Zone CQ Zone ITU Zone ITU Zone Deleted Smazat Start Date PoÄáteÄní datum End Date Koncové datum DXCC DXCC An error has occurred showing the following error code: Nastala chyba s následujícím kódem chyby: KLog - SetupPageSubdivisions KLog - Nastavení subdivizí SetupPageUDP Start UDP Server Spustit UDP server Automatically log QSOs from WSJT-X Automaticky zapisovat QSO z WSJT-X Allow WSJT-X to send logged QSOs to KLog Povolit WSJT-X logovat QSO QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless "%1" is selected QSO provedená v WSJT-X budou zaslaná KLogu. Klog se zeptá pÅ™ed uložením, pokud není vybráno "%1" KLog will automatically log any QSO coming from WSJT-X without any manual confirmation. KLog automaticky zapíše QSO pÅ™ijaté z WSJT-X bez jakéhokoliv potvrzení. Update status information from WSJT-X Aktualizuje stavové informace z WSJT-X KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...) KLog bude automaticky zobrazovat a aktualizovat příchozí informace z WSJT-X (volací znaÄku, report, druh provozu,...) UDP port number where the UDP Server will listen for packets. Číslo UDP portu, na kterém bude server poslouchat. Make sure it is the same port that the other programs are sending the data to. Default port is 2237. UjistÄ›te se, že stejný port je nastaven i v WSJT-X. Výchozí port je 2237. UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs. UDP server bude pÅ™ijímat QSO poslaná i z jiných programů. To umožní zapsat automaticky spojení i z tÄ›chto programu. UDP Port UDP Port Select the interface to listen for UDP datagrams coming from WSJT-X. Síťové rozhraní, na kterém bude poslouchat UDP server. Network interface Síťové rozhraní QSOs notification timeout (milisecs) ÄŒas notifikace QSO (milisekundy) Miliseconds that the notification of QSOs received from WSJTX will be shown. ÄŒas, bÄ›hem kterého bude zobrazena notifikace o pÅ™ijatém QSO z WSJT-X. SetupPageUserDataPage &Personal data &Osobní informace Station &data &Stanice Enter your name. Zadejte své jméno. Enter your address - 1st line. Zadejte VaÅ¡i adresu - 1. řádek. Enter your address - 2nd line. Zadejte VaÅ¡i adresu - 2. řádek. Enter your address - 3rd line. Zadejte VaÅ¡i adresu - 3. řádek. Enter your address - 4th line. Zadejte VaÅ¡i adresu - 4. řádek. Enter your city. Zadejte VaÅ¡e mÄ›sto. Enter your zip code. Zadejte VaÅ¡e PSÄŒ. Enter your province or state. Zadejte VaÅ¡i provincii nebo region. Enter your country. Zadejte VaÅ¡e zemi. &Name &Jméno &Address &Adresa Cit&y MÄ›st&o &Zip Code &PSÄŒ Pro&v/State Pro&vincie/region Countr&y &ZemÄ› Enter your information for rig Vložte informace o rádiu Enter your information for antenna Vložte informace o anténÄ› Enter your power information. Vložte informace o výkonu. &Rig 1 &Rádio 1 R&ig 2 Rád&io 2 Ri&g 3 Rádi&o 3 Antenna &1 Anténa &1 Antenna &2 Anténa &2 Antenna &3 Anténa &3 Po&wer &Výkon Enter the station callsign that will be used for logging. Vložte znaÄku stanice, která bude použita v logu. Enter the operators (comma separated if more than one). Vložte jména operátorů (oddÄ›lte je Äárkou, pokud je jich víc). Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign. Vložte Váš lokátor. AlternativnÄ›, KLog je schopen použít pÅ™ibližný lokátor v závislosti na Vaší volací znaÄce. &Callsign &Stanice &Operators &OperátoÅ™i &CQ Zone &CQ Zone &ITU Zone &ITU Zone &Locator &Lokátor &Locator (not valid) &Lokátor (neplatný) SetupPageWorldEditor Add PÅ™idat Delete Smazat Edit Upravit Export World Export zemí Import World Import zemí Still not implemented. Stále není implementováno. Import a new cty.csv file Import nového cty.csv souboru An entities information file (cty.csv) has been detected in your KLog folder and will be loaded. V KLog adresáři byl nalezl soubor s informacemi o zemích (cty.csv) a bude nahrán. No entities information file (cty.csv) has been detected in your KLog folder. Soubor s informacemi o zemích (cty.csv) nebyl nalezen v KLog adresáři. KLog will not be able to show entities information. KLog nebude schopen zobrazit informace o zemích. Prefix Prefix Entity ZemÄ› ARRL ID ARRL ID Continent Kontinent CQ Zone CQ Zone ITU Zone ITU Zone UTC UTC Latitude ZemÄ›pisná šířka Longitude ZemÄ›pisná délka Deleted ZruÅ¡eno Since Date Od To Date Do Open File Otevřít soubor BigCTY (*.csv) BigCTY (*.csv) Entities information has been updated. Informace o zemích byly aktualizovány. Entities information has not been updated. Informace o zemích nebyly aktualizovány. ShowAdifImportWidget The following QSOs are those QSOs that you have received the LoTW confirmation. Tyto QSO jsou ty, která byla potvrzena pÅ™es LoTW. Ok Ok DX DX Date/Time Datum/ÄŒas Band Pásmo Mode Druh provozu ShowErrorDialog KLog Message KLog zpráva SoftwareUpdateDialog Ok Ok KLog update Aktualizace KLog <center><h2>KLog new version (%1) is available! </h2></center><br>There is a new version of KLog available.<br><br><b>You can get the new version from:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> <center><h2>Je dostupná nová verze KLog (%1)! </h2></center><br>Existuje nová verze KLogu.<br><br><b>Je možné ji získat na:<br><br><center><a href=https://www.klog.xyz>https://www.klog.xyz</a></center> Congratulations! Gratulujeme! Your KLog has been updated. KLog byl aktualizován. You already have the latest version. Máte již poslední verzi. StartWizard KLog - The free hamradio logging program KLog = Svobodný staniÄní log pro radioamatéry Quit Setup Rychlé nastavení Setup is not complete yet. Are you sure you want to quit setup? Nastavení není kompletní. Opravdu si pÅ™ejete ukonÄit nastavení? StatisticsWidget QSO per year QSO podle roku DXCC per year DXCC podle roku CQ zones per year CQ zones podle roku QSO per band QSO podle pásma QSO per mode QSO podle druhu provozu QSO per DXCC QSO podle DXCC QSO per Continent QSO podle kontinentu QSO per hour QSO podle hodin QSO per month QSO podle mÄ›síců Worked / Confirmed status Stav Pracoval / Potvrzeno Worked / Sent status Stav Pracoval / Odesláno Sent / Confirmed status Stav Odesláno / Potvrzeno Satellite grid status Stav Sat Ätverců Satellite DXCC status Stav Sat DXCC Grids per band status Stav Ätverců na pásmo DXCC per band status Stav DXCC na pásmo StatsCQZPerYearBarChartWidget CQ Zones per year CQ Zone podle roku Reading data ... ÄŒtení dat .... Abort reading UkonÄení Ätení CQ zones CQ zone CQ zones per year CQ zones podle roku Reading data ... ÄŒtení dat .... Years: %1/%2 Roky: %1/%2 StatsDXCCOnSatsWidget Show confirmed only Pouze potvrzené Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Pouze LEO sat Number PoÄet Callsign Stanice Date Datum Band Pásmo Mode Druh provozu DXCC DXCC Satellite Satelit Confirmed Potvrzeno No Ne StatsEntitiesPerYearBarChartWidget Chart title Název grafu Reading data ... ÄŒtení dat .... Abort reading PÅ™eruÅ¡it Ätení DXCC Entities ZemÄ› DXCC DXCC Entities per year DXCC zemÄ› podle roku Reading data ... ÄŒtení dat .... Entities: ZemÄ›: StatsFieldPerBandWidget All VÅ¡echny Mode: Druh provozu: Band Pásmo Worked Navázané Confirmed Potvrzené StatsGridsOnSatsWidget Show confirmed only Pouze potvrzené Only LEO sats LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure. Pouze LEO satelity Number PoÄet Callsign Stanice Date Datum Band Pásmo Mode Druh provozu Grid ÄŒtverec Satellite Satelit Confirmed Potvrzeno No Ne StatsQSOsPerBandBarChartWidget QSOs per band QSO podle pásma Reading data ... ÄŒtení dat .... Abort reading PÅ™eruÅ¡it Ätení Bands Pásmo QSOs per band distribution QSO podle pásma Reading data ... ÄŒtení dat .... Bands: Pásmo: StatsQSOsPerContinentBarChartWidget QSOs per continent QSO podle kontinentu Reading data ... ÄŒtení dat .... Abort reading PÅ™eruÅ¡it Ätení Continents Kontinent Reading data ... ÄŒtení dat .... Hours: Hodiny: StatsQSOsPerDXCCBarChartWidget QSOs per DXCC QSO podle DXCC Reading data ... ÄŒtení dat .... Abort reading PÅ™eruÅ¡it Ätení Reading data... ÄŒtení dat .... DXCC DXCC Top ten DXCC per QSO TOP10 DXCC podle spojení StatsQSOsPerHourBarChartWidget QSOs per hour QSO podle hodin Reading data ... ÄŒtení dat .... Abort reading PÅ™eruÅ¡it Ätení Hours Hodiny QSOs at hour QSO v hodinách Reading data ... ÄŒtení dat .... Hours: Hodiny: StatsQSOsPerModeBarChartWidget QSOs per mode QSO podle druhu provozu Reading data ... ÄŒtení dat .... Abort reading PÅ™eruÅ¡it Ätení Modes Druhy provozu QSOs per mode distribution QSO podle druhu provozu Reading data ... ÄŒtení dat .... Modes: Druhy provozu: StatsQSOsPerMonthBarChartWidget QSOs per month QSO podle mÄ›síců Reading data ... ÄŒtení dat .... Abort reading PÅ™eruÅ¡it Ätení Jan Led Feb Úno Mar BÅ™e Apr Dub May KvÄ› Jun ÄŒvn Jul ÄŒvc Aug Srp Sep Zář Oct Říj Nov Lis Dec Pro Months MÄ›síce QSOs at Month QSO v mÄ›síci Reading data ... ÄŒtení dat .... Months: MÄ›síce: StatsQSOsPerYearBarChartWidget QSOs per year QSO podle roku Reading data ... ÄŒtení dat .... Abort reading PÅ™eruÅ¡it Ätení QSOs QSO Reading data ... ÄŒtení dat .... QSO: %1/%2 QSO: %1/%2 StatsSentConfirmedPieChartWidget Sent - %1 Odesláno - %1 Confirmed - %2 Potvrzeno - %2 Sent / Confirmed status Stav Odesláno / Potvrzeno StatsWorkedConfirmedPieChartWidget Worked, not confirmed - %1 Pracováno, nepotvrzeno - %1 Confirmed - %2 Potvrzeno - %2 Worked / Confirmed status Stav Pracoval / Potvrzeno StatsWorkedSentPieChartWidget Worked - %1 Navázané - %1 Sent - %2 Odesláno - %2 Worked / Sent status Stav Pracoval / Odesláno TipsDialog KLog tips Typy KLogu Next Další Previous PÅ™edchozí <b>Tip #1:</b><br>Do you know...<br>You can use <a href="#ToolsFillInQSO">Tools->Fill in QSO data</a> to automatically read the full log to fill the DXCC, CQ, ITU zones and continent? Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in QSO data <b>Tip #1:</b><br>Víte, že...<br>můžete použít <a href="#ToolsFillInQSO">Nástroje->PÅ™epoužít QSO data</a> pro automatické vyplnÄ›ní DXCC, CQ, ITU zones a kontinentu? <b>Tip #2:</b><br>Do you know...<br>You can find the QSLs that you still need to send with <a href="#ToolsSendPendingQSL">Tools->QSL tools...->Find My-QSLs pending to send</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Requested</i>. Translator: Please make sure that the name of the link is coherent with the menu Tools->Fill in DXCC data <b>Tip #2:</b><br>Víte, že...<br>můžete najít QSL, které je potÅ™eba jeÅ¡tÄ› odeslat v menu <a href="#ToolsSendPendingQSL">Nástroje->QSL...->Najít QSL Äekající na odeslání</a>.<bR>Tato volba zobrazí v oknÄ› Hledání vÅ¡echna QSO oznaÄená jako QSL k odeslaní <i>Vyžádané</i>. <b>Tip #3:</b><br>Do you know...<br>You can use <a href="#ToolsFindQSO2QSL">Tools->QSL tools...->Find QSO to QSL</a> to look for all those QSO that you should send your QSL because you still need to confirm that DXCC and you have still not send your QSL card? Translator: Please make sure that the name of the link is coherent with the menu Tools->QSL tools...->Find QSO to QSL <b>Tip #3:</b><br>Víte, že...<br>můžete použít <a href="#ToolsFindQSO2QSL">Nástroje->QSL...->Najít QSO </a> pro nalezení vÅ¡ech QSO, pro která je potÅ™eba jeÅ¡tÄ› odeslat QSL? <b>Tip #4:</b><br>Do you know...<br>You can enter a '*' in the search box, in the search window to search for all the QSOs done with one specific station callsign? Translator: Please make sure that the name of the link is coherent with the menu File->Export Requested QSL to ADIF... <b>Tip #4:</b><br>Víte, že...<br>pÅ™i hledání můžete použít '*' k nalezení vÅ¡ech QSO? <b>Tip #5:</b><br>Do you know...<br>You can find the file containing all your log and other information in the logbook.dat file and the klogrc file, containing the KLog config file in the KLog folder by opening the <a href="#FileOpenKLogFolder">File->KLog folder</a> menu? <b>Tip #5:</b><br>Víte, že......<br>vÅ¡echny soubory KLogu, jako jsou VaÅ¡e logy, logbook.dat, konfiguraÄní soubor klogrc jsou uloženy v adresáři zobrazeném pomocí menu <a href="#FileOpenKLogFolder">Soubor->KLog adresář</a>? <b>Tip #6:</b><br>Do you know...<br>You can upload your QSO marked as queued to LoTW via TQSL with <a href="#ToolsUploadLoTW">Tools->LoTW tools ...->Sends the log to LoTW calling TQSL.</a> ?<br><br>You have to configure TQSL in the preferences to be able to use this functionality. Translator: Please make sure that the name of the link is coherent with the menu File->KLog folder <b>Tip #6:</b><br>Víte, že...<br>můžete vÅ¡echna zafrontovaná QSL nahrát do LoTW pomocí TQSL pÅ™es menu <a href="#ToolsUploadLoTW">Nástroje->LoTW->Nahrát zafrontovaná QSO do LoTW</a> ?<br><br>Je potÅ™eba mít nastaven TQSL, aby tato volba byla aktivní. <b>Tip #7:</b><br>Do you know...<br>You can see the QSO that confirms one specific DXCC entity in one specific band by poiting your mouse over that band in the DXCC widget? Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find My-QSLs pending to send <b>Tip #7:</b><br>Víte, že...<br>můžete zobrazit QSO, které potvrzuje jednu konkrétní zemi DXCC na jednom konkrétním pásmu, když umístíte myÅ¡ nad toto pásmo v oknÄ› DXCC? <b>Tip #8:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceivePendingQSL">Tools->QSL tools...->Find DX-QSLs pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Sent marked as <i>Sent</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find DX-QSLs pending to receive <b>Tip #8:</b><br>Víte, že...<br>můžete najít vÅ¡echna QSL, na které Äekáte pomocí <a href="#ToolsReceivePendingQSL">Nástroje->QSL...->Najít QSL Äekající na potvrzení</a>.<bR>Tato volba zobrazí v oknÄ› Hledání vÅ¡echna QSO oznaÄená jako <i>Odeslaná</i>, s tím, že od protistanice nebylo pÅ™ijato její QSL. <b>Tip #9:</b><br>Do you know...<br>You can find the QSLs that you are still waiting for with <a href="#ToolsReceiveRecPendingQSL">Tools->QSL tools...->Find requested pending to receive</a>.<bR>This tool will list you in the search box all the QSOs with the QSL-Rec marked as <i>Requested</i> but you have still not received the QSL card from the DX. Translator: Please make sure that the name of the link is coherent with the menu QSL tools...->Find requested pending to receive <b>Tip #9:</b><br>Víte, že...<br>můžete najít vÅ¡echna QSL, na které stále Äekáte pomocí <a href="#ToolsReceiveRecPendingQSL">Nástroje->QSL...->Najít požadavky Äekající na potvrzení</a>.<bR>Tato volba zobrazí v oknÄ› Hledání vÅ¡echna QSO ve stavu QSL pÅ™ijetí <i>Vyžádáno</i>, s tím, že od protistanice nebylo zatím pÅ™ijato její QSL. <b>Tip #10:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/klogchat>English KLog Telegram group</a> to discuss about KLog in English? <b>Tip #10:</b><br>Víte, že...<br>se můžete pÅ™ihlásit k odbÄ›ru <a href=https://t.me/klogchat>English KLog Telegram group</a> - anglické diskuzní skupiny o KLogu? <b>Tip #11:</b><br>Do you know...<br>You can subscribe to the <a href=https://t.me/KLogES>Spanish Telegram group</a> to discuss about KLog in Spanish? <b>Tip #11:</b><br>Víte, že...<br>se můžete pÅ™ihlásit k odbÄ›ru <a href=https://t.me/KLogES>Spanish Telegram group</a> - Å¡panÄ›lské diskuzní skupiny o KLogu? <b>Tip #12:</b><br>Do you know...<br>You can subscribe to <a href=https://groups.io/g/klog>KLog mailing list</a> to discuss via email about KLog in English? <b>Tip #12:</b><br>Víte, že...<br>se můžete pÅ™ihlásit na <a href=https://groups.io/g/klog>KLog mailing list</a> a diskutovat zde anglicky o KLogu? <b>Tip #13:</b><br>Do you know...<br>You can <a href=https://twitter.com/_ea4k>follow EA4K on twitter</a> to get updates about KLog? <b>Tip #13:</b><br>Víte, že...<br>můžete sledovat novinky o KLogu pÅ™es twitter na <a href=https://twitter.com/_ea4k>EA4K</a>? <b>Tip #14:</b><br>Do you know...<br>You can write your own <a href=https://www.eham.net/reviews/detail/3118>review in eHam.net about KLog</a> to help other users to decide to use KLog? <b>Tip #14:</b><br>Víte, že...<br>můžete napsat recenzi na KLog na <a href=https://www.eham.net/reviews/detail/3118>eHam.net</a> a pomoci tím jiným uživatelům najít KLog? <b>Tip #15:</b><br>Do you know...<br>You can join the development team by simply <a href=https://www.klog.xyz/contact>Contacting us</a>? <b>Tip #15:</b><br>Víte, že...<br>se můžete jednoduÅ¡e pÅ™ipojit k vývojovému týmu kontaktem uvedeným na stránkách <a href=https://www.klog.xyz/contact>KLogu Contact</a>? <b>Tip #16:</b><br>Do you know...<br>That there are many ways to contribute to KLog and some of them are listed in the <a href=https://www.klog.xyz/contrib>KLog Contribute</a> page? <b>Tip #16:</b><br>Víte, že...<br>je mnoho cest, jak pÅ™ispívat do KLog. NÄ›které z nich jsou uvedeny na stránkách <a href=https://www.klog.xyz/contrib>KLog Contribute</a>? <b>Tip #17:</b><br>Do you know...<br>You can support translating KLog into your language? Please check <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a> page. <b>Tip #17:</b><br>Víte, že...<br>můžete pomoci s pÅ™ekladem KLogu? Více na stránkách <a href=https://www.klog.xyz/contrib/translations>KLog Translations</a>. <b>Tip #18:</b><br>Do you know...<br>You can double-click on an entity name in the DXCC table and all the QSOs with that DXCC Entity will be shown in the search box? <b>Tip #18:</b><br>Víte, že...<br>dvojitým kliknutím v tabulce DXCC zemí budou zobrazena v oknÄ› Hledání vÅ¡echna QSO s danou zemí? <b>Tip #19:</b><br>Do you know...<br>You can right-click on a QSO and select <i>Check in QRZ.com</i> to check that callsign in QRZ.com? <b>Tip #19:</b><br>Víte, že...<br>kliknutím na QSO pravým tlaÄítkem myÅ¡i a výbÄ›rem <i>Vyhledat v QRZ.com</i> vyhledáte detaily o stanice na QRZ.com? UpdateSatsData Reading Satellites data file... ÄŒtení souboru se satelity... Abort reading PÅ™eruÅ¡it Ätení The Satellites information has been updated. Satelitní informace byly aktualizovány. Open File Otevřít soubor Sat Data Sat Data UpdateSettings KLog - Settings update The settings system has been changed and KLog will update your settings file. World Entity ZemÄ› Continent Kontinent Reading cty.csv... ÄŒtení cty.csv... Abort reading PÅ™eruÅ¡it Ätení eLogClubLog Host not found! Server nenalezen! Timeout error! VyprÅ¡el Äasový limit! QSO dupe or not existing (#%1)... QSO dupe nebo neexistující (#%1)... KLog - ClubLog KLog - ClubLog It seems to be a CREDENTIALS ERROR; check your email and password. It seems that your ClubLog credentials are not correct. Please check your credentials in the setup. ClubLog uploads will be disabled. We have received an undefined error from Clublog (%1) Byla zaznamenána neznámá chyba Clublog (%1) This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO. Tato chyba může být způsobena duplicitním QSO nebo v případÄ› smazání, tak se maže neexistující QSO. Undefined error number (#%1)... Nedefinované Äíslo chyby (#%1)... Please check your config in the setup and contact the KLog development team if you can't fix it. ClubLog uploads will be disabled. Zkontrolujte konfiguraci v Nastavení a pokud ji nemůžete opravit, kontaktujte vývojový tým KLog. Nahrávání do ClubLog bude zakázáno. Undefined error... Nedefinovaná chyba... Callsign missing Chybí znaÄka Invalid callsign Neplatná znaÄka Skipping SWL callsign PÅ™eskoÄit SWL znaÄku Callsign is your own call Je to VaÅ¡e vlastní znaÄka Invalid callsign with no DXCC mapping Neplatná znaÄka bez DXCC mapování Updated QSO Aktualizované QSO Invalid ADIF record Neplatný ADIF záznam Missing ADIF record ChybÄ›jící ADIF záznam Test mode - parameters ok, no action taken Testovací režim - parametry ok, žádná akce Excessive API Usage NadmÄ›rné používání API Internal Error Interní chyba Rejected Odmítnuto QSO Duplicate Duplicitní QSO QSO Modified Upravené QSO Missing Login ChybÄ›jící pÅ™ihlášení QSO OK QSO OK Upload denied Nahrání zamítnuto No callsign selected Nebyla vybrána žádná znaÄka No match found Shoda nenalezena Dropped QSO Zahozené QSO OK OK Login rejected PÅ™ihlášení zamítnuto Rejected: Callsign is your own call Zamítnuto: ZnaÄka je VaÅ¡e vlastní eLogQrzLog Host not found! Server nenalezen! Timeout error! VyprÅ¡el Äasový limit! Undefined error number (#%1) Nedefinované Äíslo chyby (#%1) KLog - QRZ.com KLog - QRZ.com We have received the following error from QRZ.com (%1) Byla zaznamenána chyba QRZ.com (%1) You are not subscribed to QRZ.com. Not valid KEY found Neplatný KEY Please configure your QRZ.com API key. You will find it in your QRZ.com Logbook settings webpage. You need a QRZ.com subscription to use this feature. Nastavte svůj API key z QRZ.com. Najdete jej na webové stránce nastavení logu QRZ.com. Abyste mohli používat tuto funkci, potÅ™ebujete registraci na QRZ.com. KLog - QRZ.com password needed KLog - Je vyžadováno heslo QRZ.com Please enter your QRZ.com password: Vložte heslo do QRZ.com: Callsign missing Chybí znaÄka eQSLUtilities KLog - eQSL KLog - eQSL eQSL has sent the following message: %1 eQSL odpovÄ›dÄ›lo touto zprávou: %1 Host not found! Server nenalezen! Timeout error! VyprÅ¡el Äasový limit! Undefined error number (#%1)... Nedefinované Äíslo chyby (#%1)... We have received an undefined error from eQSL (%1) Byla zaznamenána neznámá chyba eQSL (%1) Please check your config in the setup and contact the KLog development team if you can't fix it. eQSL uploads will be disabled. Zkontrolujte konfiguraci v Nastavení a pokud ji nemůžete opravit, kontaktujte vývojový tým KLog. Nahrávání do eQSL bude zakázáno. eQSL Error: User or password incorrect eQSL Chyba: Nesprávné uživatelské jméno nebo heslo eQSL Warning: At least one of the uplodaded QSOs is duplicated. UpozornÄ›ní eQSL: Alespoň jedno z nahrávaných QSO je duplicitní. eQSL: All the QSOs were properly uploaded. eQSL: VÅ¡echna QSO byla nahrána. KLog - eQSL.cc password needed KLog - Je vyžadováno heslo eQSL.cc Please enter your eQSL.cc password: Vložte heslo do eQSL.cc: klog-2.3.3/logwindow.cpp0000644000015700001710000006443414542412415015065 0ustar jenkinsjenkins/*************************************************************************** logwindow.cpp - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "logwindow.h" LogWindow::LogWindow(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "LogWindow::LogWindow: " ; dataProxy = dp; //sortingThroughProxyModel = false; logModel = new LogModel(dataProxy, this); util = new Utilities(Q_FUNC_INFO); connect(logModel, SIGNAL(queryError(QString, QString, QString, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, QString, QString)) ); logView = new QTableView; columns.clear(); //dxccStatusWidget = new DXCCStatusWidget(dataProxy); //elogClublog = new eLogClubLog(); currentLog = -1; //proxyModel = new LogViewSortFilterProxyModel(this); awards = new Awards(dataProxy, Q_FUNC_INFO); createUI(); createActions(); setDefaultData(); //qDebug() << "LogWindow::LogWindow: - END" ; } LogWindow::~LogWindow() { delete(util); delete(awards); // emit clearError(); } void LogWindow::setColumns(const QStringList &_columns) { //qDebug() << Q_FUNC_INFO; columns.clear(); //qDebug() << Q_FUNC_INFO << "llamando a filterValidFields"; columns << dataProxy->filterValidFields(_columns); logModel->setColumns(columns); } void LogWindow::sortColumn(const int _c) { //proxyModel->sort(_c); logModel->sort(_c, Qt::AscendingOrder); } void LogWindow::clear() { //qDebug() << "LogWindow::clear " ; } void LogWindow::createUI() { //qDebug() << Q_FUNC_INFO; logView->setContextMenuPolicy(Qt::CustomContextMenu); logView->setSortingEnabled(true); logView->horizontalHeader ()->setSectionsMovable (true); //logView->setDragDropMode (QAbstractItemView::InternalMove); //logView->setDropIndicatorShown (true); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(logView); setLayout(layout); } void LogWindow::setDefaultData() { //qDebug() << Q_FUNC_INFO; columns.clear(); //qDebug() << Q_FUNC_INFO << "llamando a filterValidFields"; columns << dataProxy->filterValidFields(util->getDefaultLogFields()); //qDebug() << "LogWindow::setDefaultData" ; } void LogWindow::createlogPanel(const int _currentLog) { //qDebug() << "LogWindow::createlogPanel: " << QString::number(_currentLog); currentLog = _currentLog; logModel->createlogModel(currentLog); //proxyModel->setSourceModel(logModel); logView->setModel(logModel); logView->setCurrentIndex(logModel->index(0, 0)); setColumnsOfLog(columns); sortColumn(1); //Initial sort by column 1 (date & time) logView->setSelectionMode(QAbstractItemView::ExtendedSelection); logView->setSelectionBehavior(QAbstractItemView::SelectRows); logView->resizeColumnsToContents(); logView->horizontalHeader()->setStretchLastSection(true); logView->sortByColumn(1, Qt::DescendingOrder); } void LogWindow::setColumnsOfLog(const QStringList &_columns) { //qDebug() << Q_FUNC_INFO << ": Length: " << QString::number(_columns.length()); QString stringQuery; stringQuery = QString("SELECT * FROM log LIMIT 1"); QSqlQuery query; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } QSqlRecord rec; rec = query.record(); // Number of columns int ncolumns = rec.count(); for (int i=0; i < ncolumns; i++) { logView->setColumnHidden(i, true); } QString aux; foreach(aux, columns) { //qDebug() << Q_FUNC_INFO << ": columns-1: " << aux; } foreach(aux, _columns) { //qDebug() << Q_FUNC_INFO << ": _columns-1: " << aux; } QStringList temPColumns; temPColumns.clear(); temPColumns << _columns; columns.clear(); //qDebug() << Q_FUNC_INFO << "llamando a filterValidFields"; columns << dataProxy->filterValidFields(temPColumns); foreach(aux, columns) { //qDebug() << Q_FUNC_INFO << ":-2: " << aux; } foreach(aux, columns) { //qDebug() << Q_FUNC_INFO << ": " << aux; showColumn(aux); } } void LogWindow::showColumn(const QString &_columnName) { QString stringQuery; stringQuery = QString("SELECT * FROM log LIMIT 1"); QSqlQuery query; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } QSqlRecord rec; rec = query.record(); // Number of columns int columns = rec.indexOf(_columnName); logView->setColumnHidden(columns, false); } void LogWindow::refresh() { //qDebug() << "LogWindow::refresh" ; logModel->select(); } void LogWindow::createActions() { //qDebug() << Q_FUNC_INFO; createActionsCommon(); showMenuRightButtonFromLogCreateActions(); } void LogWindow::createActionsCommon() { //LOG VIEW connect(logView, SIGNAL(customContextMenuRequested( const QPoint& ) ), this, SLOT(slotRighButtonFromLog( const QPoint& ) ) ); connect(logView, SIGNAL(doubleClicked ( const QModelIndex& ) ), this, SLOT(slotDoubleClickLog( const QModelIndex& ) ) ); } void LogWindow::slotRighButtonFromLog(const QPoint& pos) { //qDebug() << Q_FUNC_INFO; int row = (logView->indexAt(pos)).row(); QItemSelectionModel *select = logView->selectionModel(); QModelIndexList list = select->selectedRows(); if (select->hasSelection() && (list.length()>1) ) { rightButtonMultipleFromLogMenu(); } else { rightButtonFromLogMenu(row); } //TODO: To be added to the logWindow and create an action that emist the QSO id } void LogWindow::rightButtonMultipleFromLogMenu() { //qDebug() << Q_FUNC_INFO; QMenu menu(this); menu.addAction(multipleDelQSOsFromLogAct); //menu.addSeparator(); menu.addAction(multipleExportToADIFFromLogAct); /* menu.addSeparator(); QMenu *menuEQsl = menu.addMenu(tr("eQSL")); menuEQsl->addAction(multipleQueueForLoTWFromLogAct); menuEQsl->addAction(multipleQueueForClubLogFromLogAct); menuEQsl->addAction(multipleQueueForEQSLFromLogAct); menu.addMenu(menuEQsl); QMenu *menuQslS = menu.addMenu(tr("QSL")); QMenu *menuSentQsl = menuQslS->addMenu(tr("QSLs Send")); menuSentQsl->addAction(multipleQslSentViaBureauFromLogAct); menuSentQsl->addAction(multipleQslSentViaDirectFromLogAct); QMenu *menuRcvdQsl = menuQslS->addMenu(tr("QSLs Rcvd")); menuRcvdQsl->addAction(multipleQslRecViaBureauFromLogAct); menuRcvdQsl->addAction(multipleQslRecViaDirectFromLogAct); */ menu.addSeparator(); menu.addAction(multipleSelectAll); menu.addAction(multipleDeselectAll); menu.exec(QCursor::pos()); } void LogWindow::rightButtonFromLogMenu(const int trow) { //qDebug() << "LogWindow::slotshowRighButtonFromLogMenu: " << QString::number(trow); //qDebug() << Q_FUNC_INFO; int _qsoID = ((logModel->index(trow, 0)).data(0)).toInt(); //qDebug() << "LogWindow::slotshowRighButtonFromLogMenu: QSOid: " << QString::number(_qsoID); bool qslReceived = isQSLReceived(_qsoID); bool qslSent = isQSLSent(_qsoID); QMenu menu(this); //menu.addAction(multipleQueueForQRZCOMFromLogAct); menu.addAction(multipleExportToADIFFromLogAct); menu.addAction(delQSOFromLogAct); delQSOFromLogAct->setData(trow); menu.addAction(qsoToEditFromLogAct); qsoToEditFromLogAct->setData(trow); menu.addAction(checkQRZCOMFromLogAct); checkQRZCOMFromLogAct->setData(trow); menu.addAction(checkDXHeatFromLogAct); checkDXHeatFromLogAct->setData(trow); menu.addSeparator(); if (!qslSent) { QMenu *menuSentQsl = menu.addMenu(tr("QSL Send")); menuSentQsl->addAction(qslSentViaBureauFromLogAct); menuSentQsl->addAction(qslSentViaDirectFromLogAct); qslSentViaBureauFromLogAct->setData(trow); qslSentViaDirectFromLogAct->setData(trow); } if (!qslReceived) { QMenu *menuRecQsl = menu.addMenu(tr("QSL Rcvd")); menuRecQsl->addAction(qslRecViaBureauFromLogAct); menuRecQsl->addAction(qslRecViaDirectFromLogAct); qslRecViaBureauFromLogAct->setData(trow); qslRecViaDirectFromLogAct->setData(trow); } menu.addSeparator(); menu.addAction(multipleSelectAll); menu.addAction(multipleDeselectAll); menu.exec(QCursor::pos()); } void LogWindow::slotDoubleClickLog(const QModelIndex & index) { //qDebug() << "LogWindow::slotDoubleClickLog: Row: " << QString::number(index.row()) << "Column: " << QString::number(index.column()); int row = index.row(); //qsoToEdit((logModel->index(row, 0)).data(0).toInt()); int qsoID = ((logModel->index(row, Qt::DisplayRole)).data(0)).toInt(); //qDebug() << "LogWindow::slotDoubleClickLog: n: " << QString::number (logModel->data(index, Qt::DisplayRole).toInt()); //qDebug() << "LogWindow::slotDoubleClickLog: emitted: " << QString::number (((logModel->index(row, Qt::DisplayRole)).data(0)).toInt()); emit actionQSODoubleClicked(qsoID); //qsoToEdit((logModel->index(row, 0)).data(0).toInt()); //TODO: To be added to the logWindow and create an action that emist the QSO id to be edited logModel->select(); } bool LogWindow::isQSLReceived(const int _qsoId) { //qDebug() << "LogWindow::isQSLReceived: " << QString::number(_qsoId); return dataProxy->isQSOConfirmed(_qsoId, true, false); // We check just paper QSL //return dataProxy->isQSLReceived(_qsoId); } bool LogWindow::isQSLSent(const int _qsoId) { //qDebug() << "LogWindow::isQSLSent: " << QString::number(_qsoId); return dataProxy->isQSLSent(_qsoId); } void LogWindow::showMenuRightButtonFromLogCreateActions() { //qDebug() << "LogWindow::showMenuRightButtonFromLogCreateActions"; delQSOFromLogAct = new QAction(tr("&Delete"), this); delQSOFromLogAct->setShortcut(Qt::CTRL + Qt::Key_D); delQSOFromLogAct->setStatusTip(tr("Delete a QSO")); connect(delQSOFromLogAct, SIGNAL(triggered()), this, SLOT(slotQsoDeleteFromLog())); qsoToEditFromLogAct = new QAction(tr("&Edit QSO"), this); qsoToEditFromLogAct->setShortcut(Qt::CTRL + Qt::Key_E); qsoToEditFromLogAct->setStatusTip(tr("Edit this QSO")); connect(qsoToEditFromLogAct, SIGNAL(triggered()), this, SLOT(slotQSOToEditFromLog())); qslSentViaBureauFromLogAct = new QAction(tr("Via &bureau"), this); qslSentViaBureauFromLogAct->setShortcut(Qt::CTRL + Qt::Key_B); qslSentViaBureauFromLogAct->setStatusTip(tr("Send this QSL via bureau")); connect(qslSentViaBureauFromLogAct, SIGNAL(triggered()), this, SLOT( slotQSLSentViaBureauFromLog() )); qslSentViaDirectFromLogAct = new QAction(tr("D&irect"), this); qslSentViaDirectFromLogAct->setShortcut(Qt::CTRL + Qt::Key_I); qslSentViaDirectFromLogAct->setStatusTip(tr("Send this QSL via direct")); connect(qslSentViaDirectFromLogAct, SIGNAL(triggered()), this, SLOT( slotQSLSentViaDirectFromLog() )); qslRecViaBureauFromLogAct = new QAction(tr("Via bureau"), this); qslRecViaBureauFromLogAct->setShortcut(Qt::CTRL + Qt::Key_R); qslRecViaBureauFromLogAct->setStatusTip(tr("QSL &received via bureau")); connect(qslRecViaBureauFromLogAct, SIGNAL(triggered()), this, SLOT( slotQSLRecViaBureauFromLog() )); qslRecViaDirectFromLogAct = new QAction(tr("Direct"), this); qslRecViaDirectFromLogAct->setShortcut(Qt::CTRL + Qt::Key_T); qslRecViaDirectFromLogAct->setStatusTip(tr("QSL received via direc&t")); connect(qslRecViaDirectFromLogAct, SIGNAL(triggered()), this, SLOT( slotQSLRecViaDirectFromLog() )); checkQRZCOMFromLogAct = new QAction(tr("Check in QRZ.com"), this); checkQRZCOMFromLogAct->setShortcut(Qt::CTRL + Qt::Key_Q); checkQRZCOMFromLogAct->setStatusTip(tr("Check this callsign in QRZ.com")); connect(checkQRZCOMFromLogAct, SIGNAL(triggered()), this, SLOT( slotCheckQRZCom() )); checkDXHeatFromLogAct = new QAction(tr("Check in DXHeat.com"), this); checkDXHeatFromLogAct->setShortcut(Qt::CTRL + Qt::Key_Q); checkDXHeatFromLogAct->setStatusTip(tr("Check this callsign in DXHeat.com")); connect(checkDXHeatFromLogAct, SIGNAL(triggered()), this, SLOT( slotCheckDXHeatCom() )); multipleDelQSOsFromLogAct = new QAction(tr("Delete selected QSOs"), this); //multipleDelQSOsFromLogAct->setShortcut(Qt::CTRL + Qt::Key_D); multipleDelQSOsFromLogAct->setStatusTip(tr("Delete the selected QSOs")); connect(multipleDelQSOsFromLogAct, SIGNAL(triggered()), this, SLOT(slotQSOsDeleteFromLog())); multipleExportToADIFFromLogAct = new QAction(tr("Export to ADIF"), this); multipleExportToADIFFromLogAct->setStatusTip(tr("Export the selected QSOs to an ADIF file.")); connect(multipleExportToADIFFromLogAct, SIGNAL(triggered()), this, SLOT(slotQSOsExportFromLog())); //multipleQueueForQRZCOMFromLogAct = new QAction(tr("Upload to QRZ.com"), this); //multipleQueueForQRZCOMFromLogAct->setStatusTip(tr("Send the selected QSOs to QRZ.com.")); //connect(multipleQueueForQRZCOMFromLogAct, SIGNAL(triggered()), this, SLOT(slotQSOsQRZUploadFromLog())); multipleQueueForLoTWFromLogAct = new QAction(tr("Upload to LoTW"), this); multipleQueueForLoTWFromLogAct->setStatusTip(tr("Upload the selected QSOs to LoTW")); connect(multipleQueueForLoTWFromLogAct, SIGNAL(triggered()), this, SLOT(slotQSOsUploadToLoTWFromLog())); multipleQueueForClubLogFromLogAct = new QAction(tr("Upload to ClubLog"), this); multipleQueueForClubLogFromLogAct->setStatusTip(tr("Upload the selected QSOs to ClubLog")); connect(multipleQueueForClubLogFromLogAct, SIGNAL(triggered()), this, SLOT(slotQSOsUploadToClubLogFromLog())); multipleQueueForEQSLFromLogAct = new QAction(tr("Upload to eQSL.cc"), this); multipleQueueForEQSLFromLogAct->setStatusTip(tr("Upload the selected QSOs to eQSL.cc")); connect(multipleQueueForEQSLFromLogAct, SIGNAL(triggered()), this, SLOT(slotQSOsUploadToEQSLFromLog())); multipleQslSentViaBureauFromLogAct = new QAction(tr("Via bureau"), this); multipleQslSentViaBureauFromLogAct->setStatusTip(tr("Send these QSLs via bureau")); connect(multipleQslSentViaBureauFromLogAct, SIGNAL(triggered()), this, SLOT( slotMultipleQSLSentViaBureauFromLog() )); multipleQslSentViaDirectFromLogAct = new QAction(tr("Direct"), this); multipleQslSentViaDirectFromLogAct->setStatusTip(tr("Send these QSLs via direct")); connect(multipleQslSentViaDirectFromLogAct, SIGNAL(triggered()), this, SLOT( slotMultipleQSLSentViaDirectFromLog() )); multipleQslRecViaBureauFromLogAct = new QAction(tr("Via bureau"), this); multipleQslRecViaBureauFromLogAct->setStatusTip(tr("QSLs received via bureau")); connect(multipleQslRecViaBureauFromLogAct, SIGNAL(triggered()), this, SLOT( slotMultipleQSLRecViaBureauFromLog() )); multipleQslRecViaDirectFromLogAct = new QAction(tr("Direct"), this); multipleQslRecViaDirectFromLogAct->setStatusTip(tr("QSLs received via direc&t")); connect(multipleQslRecViaDirectFromLogAct, SIGNAL(triggered()), this, SLOT( slotMultipleQSLRecViaDirectFromLog() )); multipleDeselectAll = new QAction(tr("Select none"), this); multipleDeselectAll->setStatusTip(tr("Remove all selections")); connect(multipleDeselectAll, SIGNAL(triggered()), this, SLOT( slotQSOsDeselectAll() )); multipleSelectAll = new QAction(tr("Select all"), this); multipleSelectAll->setStatusTip(tr("Select all the QSOs")); connect(multipleSelectAll, SIGNAL(triggered()), this, SLOT( slotQSOsSelectAll() )); } void LogWindow::slotQSOsSelectAll() { logView->selectAll(); } void LogWindow::slotQSOsDeselectAll() { logView->selectionModel()->clearSelection(); } void LogWindow::slotQSLSentViaBureauFromLog() { //qDebug() << "LogWindow::slotQSLSentViaBureauFromLog: " << (qslSentViaBureauFromLogAct->data()).toString() << " - Id = " << QString::number( ((logModel->index( ( (qslSentViaBureauFromLogAct->data()).toInt() ) , 0)).data(0).toInt()) ); int _qsoId = ((logModel->index( ( (qslSentViaBureauFromLogAct->data()).toInt() ) , 0)).data(0).toInt()); qslSentViaBureau(_qsoId); } void LogWindow::slotQSLSentViaDirectFromLog() { //qDebug() << "LogWindow::slotQSLSentViaDirectFromLog: " << (qslSentViaDirectFromLogAct->data()).toString() << " - Id = " << QString::number( ((logModel->index( ( (qslSentViaDirectFromLogAct->data()).toInt() ) , 0)).data(0).toInt()) ); int _qsoId = ((logModel->index( ( (qslSentViaDirectFromLogAct->data()).toInt() ) , 0)).data(0).toInt()); //dataProxy->qslSentViaDirect(_qsoId, (QDateTime::currentDateTime()).toString("yyyy-MM-dd")); dataProxy->qslSentViaDirect(_qsoId, QDate::currentDate()); } void LogWindow::slotQSLRecViaBureauFromLog() { //qDebug() << "LogWindow::slotQSLRecViaBureauFromLog: "; int _qsoId = ((logModel->index( ( (qslRecViaBureauFromLogAct->data()).toInt() ) , 0)).data(0).toInt()); qslRecViaBureau(_qsoId); //TODO: To be added to the logWindow and create an action that emist the QSO id } void LogWindow::slotQSLRecViaDirectFromLog() { //qDebug() << "LogWindow::slotQSLRecViaDirectFromLog: " << (qslRecViaDirectFromLogAct->data()).toString() << " - Id = " << QString::number( ((logModel->index( ( (qslRecViaDirectFromLogAct->data()).toInt() ) , 0)).data(0).toInt()) ); int _qsoId = ((logModel->index( ( (qslRecViaDirectFromLogAct->data()).toInt() ) , 0)).data(0).toInt()); qslRecViaDirect(_qsoId); // Mark Sent, Bureau, date, update log. //TODO: To be added to the logWindow and create an action that emist the QSO id } void LogWindow::slotQSOToEditFromLog() { //qDebug() << "slotQSOToEditFromLog: " << (qsoToEditFromLogAct->data()).toString(); //qsoToEdit((logModel->index((qsoToEditFromLogAct->data()).toInt(), 0)).data(0).toInt()); int QSOid = ((logModel->index((qsoToEditFromLogAct->data()).toInt(), 0)).data(0)).toInt(); /* int row = index.row(); int qsoID = ((logModel->index(row, Qt::DisplayRole)).data(0)).toInt(); emit actionQSODoubleClicked(qsoID); */ //int row = index.row(); //qsoToEdit((logModel->index(row, 0)).data(0).toInt()); emit actionQSODoubleClicked(QSOid); //TODO: To be added to the logWindow and create an action that emit the QSO id } void LogWindow::deleteQSO(const int _qsoId) { //qDebug() << "LogWindow::deleteQSO " << QString::number(_qsoId); emit actionDeleteQSO(_qsoId); } /* void LogWindow::deleteQSO(const int _qsoID) { //qDebug() << "LogWindow::deleteQSO: " << QString::number(_qsoID); emit actionDeleteQSO(_qsoID); //elogClublog->deleteQSO(dataProxy->getClubLogRealTimeFromId(_qsoID)); dataProxy->deleteQSO(_qsoID); //logModel->removeRow((delQSOFromLogAct->data()).toInt()); //TODO: This has been replaced by the previous line //awards->recalculateAwards(); refresh(); //dxccStatusWidget->refresh(); emit updateAwards(); emit updateSearchText(); } */ void LogWindow::slotQsoDeleteFromLog() { //qDebug() << "LogWindow::slotQsoDeleteFromLog: " << (delQSOFromLogAct->data()).toString(); //TODO: To be added to the logWindow and create an action that emist the QSO id int QSOid = ((logModel->index((delQSOFromLogAct->data()).toInt(), 0)).data(0)).toInt(); deleteQSO(QSOid); //qDebug() << "LogWindow::slotQsoDeleteFromLog (id): " << QString::number(QSOid); /* switch (ret) { case QMessageBox::Yes: //qDebug() << "LogWindow::slotQsoDeleteFromLog (id): -1"; deleteQSO(QSOid); break; case QMessageBox::No: // No was clicked break; default: // should never be reached break; } */ } void LogWindow::slotQSOsDeleteFromLog() { //qDebug() << "LogWindow::slotQSOsDeleteFromLog"; QItemSelectionModel *select = logView->selectionModel(); QList qsos; qsos.clear(); if (select->hasSelection()) { QModelIndexList list = select->selectedRows(); foreach (QModelIndex index, list) { qsos.append(index.data(0).toInt()); //qDebug() << "LogWindow::slotshowRighButtonFromLog: " << QString::number(index.row()) ; //qDebug() << "LogWindow::slotshowRighButtonFromLog: " << QString::number(index.data(0).toInt()) ; } } if (qsos.length()>0) { emit deleteTheseQSOs(qsos); } } void LogWindow::slotQSOsExportFromLog() { //qDebug() << "LogWindow::slotQSOsExportFromLog"; QItemSelectionModel *select = logView->selectionModel(); QList qsos; qsos.clear(); if (select->hasSelection()) { QModelIndexList list = select->selectedRows(); foreach (QModelIndex index, list) { qsos.append(index.data(0).toInt()); //qDebug() << "LogWindow::slotQSOsExportFromLog: " << QString::number(index.row()) ; //qDebug() << "LogWindow::slotQSOsExportFromLog: " << QString::number(index.data(0).toInt()) ; } } if (qsos.length()>0) { emit exportToADIFTheseQSOs(qsos); } //qDebug() << "LogWindow::slotQSOsExportFromLog - END - " << QString::number(qsos.length()); } void LogWindow::slotQSOsUploadToLoTWFromLog() { //qDebug() << "LogWindow::slotQSOsUploadToLoTWFromLog - TO BE IMPLEMENTED"; } void LogWindow::slotQSOsUploadToClubLogFromLog() { //qDebug() << "LogWindow::slotQSOsUploadToClubLogFromLog - TO BE IMPLEMENTED"; } void LogWindow::slotQSOsQRZUploadFromLog() { //qDebug() << "LogWindow::slotQSOsQRZUploadFromLog - TO BE IMPLEMENTED"; QItemSelectionModel *select = logView->selectionModel(); QList qsos; qsos.clear(); if (select->hasSelection()) { QModelIndexList list = select->selectedRows(); foreach (QModelIndex index, list) { qsos.append(index.data(0).toInt()); //qDebug() << "LogWindow::slotQSOsQRZUploadFromLog: " << QString::number(index.row()) ; //qDebug() << "LogWindow::slotQSOsQRZUploadFromLog: " << QString::number(index.data(0).toInt()) ; } } if (qsos.length()>0) { emit uploadToQRZcomTheseQSOs(qsos); } } void LogWindow::slotQSOsUploadToEQSLFromLog() { //qDebug() << "LogWindow::slotQSOsUploadToEQSLFromLog - TO BE IMPLEMENTED"; } void LogWindow::slotMultipleQSLSentViaBureauFromLog() { //qDebug() << "LogWindow::slotMultipleQSLSentViaBureauFromLog - TO BE IMPLEMENTED"; } void LogWindow::slotMultipleQSLSentViaDirectFromLog() { //qDebug() << "LogWindow::slotMultipleQSLSentViaDirectFromLog - TO BE IMPLEMENTED"; } void LogWindow::slotMultipleQSLRecViaBureauFromLog() { //qDebug() << "LogWindow::slotMultipleQSLRecViaBureauFromLog - TO BE IMPLEMENTED"; } void LogWindow::slotMultipleQSLRecViaDirectFromLog() { //qDebug() << "LogWindow::slotMultipleQSLRecViaDirectFromLog - TO BE IMPLEMENTED"; } void LogWindow::qslSentViaBureau(const int _qsoId) { //qDebug() << "LogWindow::qslSentViaBureau: " << QString::number(_qsoId)yyyy-MM-dd dataProxy->qslSentViaBureau(_qsoId, QDate::currentDate()); } void LogWindow::qslRecViaBureau(const int _qsoId) { // //qDebug() << "LogWyyyy-MM-ddRecViaBureau: " << QString::number(_qsoIyyyy-MM-dd<< (dateTime->currentDateTime()).toString("yyyy/MM/dd"); dataProxy->qslRecViaBureau(_qsoId, QDate::currentDate(), false); awards->setAwards(_qsoId); //Update the Award status refresh(); emit updateAwards(); } void LogWindow::qslRecViaDirect(const int _qsoId) { //qDebug() << "LogWindow::qslRecViaDirect: " << QString::number(_qsoId)yyyy-MM-dd dataProxy->qslRecViaDirect(_qsoId, QDate::currentDate(), false); awards->setAwards(_qsoId); refresh(); emit updateAwards(); } void LogWindow::slotQueryErrorManagement(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery) { emit queryError(functionFailed, errorCodeS, nativeError, failedQuery); } void LogWindow::slotCheckQRZCom() { QString _qrz = ((logModel->index( ( (qslRecViaDirectFromLogAct->data()).toInt() ) , 2)).data(Qt::DisplayRole).toString()); //int _qsoId = ((logModel->index( ( (qslRecViaDirectFromLogAct->data()).toInt() ) , 0)).data(0).toInt()); //QString _qrz = dataProxy->getCallFromId(_qsoId); //qDebug() << "LogWindow::sloTCheckQRZCom: " << _qrz; util->openQrzcom (_qrz); //QString url = "https://www.qrz.com/db/" + _qrz; //QDesktopServices::openUrl(QUrl(url)); } void LogWindow::slotCheckDXHeatCom() { QString _qrz = ((logModel->index( ( (qslRecViaDirectFromLogAct->data()).toInt() ) , 2)).data(Qt::DisplayRole).toString()); //int _qsoId = ((logModel->index( ( (qslRecViaDirectFromLogAct->data()).toInt() ) , 0)).data(0).toInt()); //QString _qrz = dataProxy->getCallFromId(_qsoId); //qDebug() << "LogWindow::slotCheckDXHeatCom(): " << _qrz; QString url = "https://www.dxheat.com/db/" + _qrz; QDesktopServices::openUrl(QUrl(url)); } klog-2.3.3/setupdialog.cpp0000644000015700001710000006533314542412415015373 0ustar jenkinsjenkins/*************************************************************************** setupdialog.cpp - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "setupdialog.h" //#include /* This class calls all the othet "Setup..." to manage the configuration */ SetupDialog::SetupDialog(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << Q_FUNC_INFO ; Q_UNUSED(parent); //contentsWidget->update(); //pagesWidget->update(); dataProxy = dp; util = new Utilities(Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << ": 01"; locator = new Locator(); tabWidget = new QTabWidget; //qDebug() << Q_FUNC_INFO << ": 01.0"; userDataPage = new SetupPageUserDataPage(dataProxy); //qDebug() << Q_FUNC_INFO << ": 01.10"; bandModePage = new SetupPageBandMode(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": 01.20"; dxClusterPage = new SetupPageDxCluster(this); //qDebug() << Q_FUNC_INFO << ": 01.30"; colorsPage = new SetupPageColors(this); //qDebug() << Q_FUNC_INFO << ": 01.40"; miscPage = new SetupPageMisc(this); //qDebug() << Q_FUNC_INFO << ": 01.50"; worldEditorPage = new SetupPageWorldEditor (dataProxy, this); //qDebug() << Q_FUNC_INFO << ": 01.60"; logsPage = new SetupPageLogs(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": 01.70"; eLogPage = new SetupPageELog(this); //qDebug() << Q_FUNC_INFO << ": 01.80"; UDPPage = new SetupPageUDP(this); //qDebug() << Q_FUNC_INFO << ": 01.90"; satsPage = new SetupPageSats(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": 01.100"; hamlibPage = new SetupPageHamLib(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": 01.101"; logViewPage = new SetupPageLogView(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": 02"; tabWidget->addTab(userDataPage, tr("User data")); tabWidget->addTab(bandModePage, tr("Bands/Modes")); tabWidget->addTab(logViewPage, tr("Log widget")); tabWidget->addTab(dxClusterPage, tr("D&X-Cluster")); tabWidget->addTab(colorsPage, tr("Colors")); tabWidget->addTab(miscPage, tr("Misc")); tabWidget->addTab(worldEditorPage, tr("World Editor")); logsPageTabN = tabWidget->addTab(logsPage, tr("Logs")); tabWidget->addTab(eLogPage, tr("eLog")); tabWidget->addTab(UDPPage, tr("WSJT-X")); tabWidget->addTab(satsPage , tr("Satellites")); //qDebug() << Q_FUNC_INFO << ": 02.100"; tabWidget->addTab(hamlibPage, tr ("HamLib")); //qDebug() << "SetupDialog::SetupDialog 03"; closeButton = new QPushButton(tr("Cancel")); okButton = new QPushButton(tr("OK")); QHBoxLayout *horizontalLayout = new QHBoxLayout; horizontalLayout->addWidget(tabWidget); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addStretch(1); buttonsLayout->addWidget(okButton); buttonsLayout->addWidget(closeButton); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(horizontalLayout); mainLayout->addLayout(buttonsLayout); //qDebug() << Q_FUNC_INFO << ": 04"; setLayout(mainLayout); setWindowTitle(tr("Settings")); //qDebug() << Q_FUNC_INFO << " - END"; } void SetupDialog::init(const QString &_softwareVersion, const int _page, const bool _alreadyConfigured) { //qDebug() << Q_FUNC_INFO; logLevel = None; constrid = 2; nolog = true; firstTime = true; version = QString(); pageRequested = 0; //qDebug() << Q_FUNC_INFO << "00"; util->setLongPrefixes(dataProxy->getLongPrefixes()); util->setSpecialCalls(dataProxy->getSpecialCallsigns()); userDataPage->setPrefixes (); //qDebug() << Q_FUNC_INFO << "000"; firstTime = !_alreadyConfigured; if (firstTime) { //qDebug() << Q_FUNC_INFO << " - Running for the FIRST TIME"; } version = _softwareVersion; pageRequested = _page; slotReadConfigData(); if ((pageRequested==6) && (logsPageTabN>0))// The user is opening a new log { //qDebug() << Q_FUNC_INFO << ": 5.2"; tabWidget->setCurrentIndex(logsPageTabN); } //qDebug() << Q_FUNC_INFO << ": 5.3"; nolog = !(haveAtleastOneLog()); connectActions(); //qDebug() << Q_FUNC_INFO << " - END"; } SetupDialog::~SetupDialog() { //qDebug() << Q_FUNC_INFO ; delete(locator); delete(userDataPage); delete(bandModePage); delete(dxClusterPage); delete(miscPage); delete(worldEditorPage); delete(logsPage); delete(eLogPage); delete(colorsPage); delete(UDPPage); delete(satsPage); delete(hamlibPage); delete(logViewPage); delete(util); } void SetupDialog::connectActions() { //qDebug() << Q_FUNC_INFO; logEvent(Q_FUNC_INFO, "Start", Debug); connect(closeButton, SIGNAL(clicked()), this, SLOT(slotCancelButtonClicked())); connect(okButton, SIGNAL(clicked()), this, SLOT(slotOkButtonClicked())); connect (logsPage, SIGNAL(newLogData(QStringList)), this, SLOT(slotAnalyzeNewLogData(QStringList))); connect(logsPage, SIGNAL(focusOK()), this, SLOT(slotFocusOK()) ); connect (userDataPage, SIGNAL(mainCallsignSignal(QString)), this, SLOT(slotSetStationCallSign(QString))); connect (userDataPage, SIGNAL(operatorsSignal(QString)), this, SLOT(slotSetOperators(QString))); connect (userDataPage, SIGNAL(enterKey()), this, SLOT(slotOkButtonClicked())); connect (eLogPage, SIGNAL(enterKey()), this, SLOT(slotOkButtonClicked())); logEvent(Q_FUNC_INFO, "END", Debug); } //void SetupDialog::slotQRZCOMAuto(const bool _b) //{ //emit qrzcomAuto(_b); //} void SetupDialog::setData(const QString &_softwareVersion, const int _page, const bool _alreadyConfigured) { //qDebug() << "SetupDialog::setData: " << _softwareVersion << "/" << QString::number(_page); logEvent(Q_FUNC_INFO, "Start", Debug); nolog = !(haveAtleastOneLog()); firstTime = !_alreadyConfigured; if (firstTime) { //qDebug() << Q_FUNC_INFO << " - Running for the FIRST time"; } else { //qDebug() << Q_FUNC_INFO << " - Running NOT for the FIRST time"; miscPage->setUseDefaultDBPath(miscPage->getDefaultDBPath()); } setSoftVersion(_softwareVersion); slotReadConfigData (); setPage(_page); //removeBandModeDuplicates(); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "SetupDialog::setData - END"; } void SetupDialog::setSoftVersion(const QString &_softwareVersion) { //qDebug() << "SetupDialog::setSoftVersion"; logEvent(Q_FUNC_INFO, "Start", Debug); version = _softwareVersion; logEvent(Q_FUNC_INFO, "END", Debug); } void SetupDialog::setPage(const int _page) { //qDebug() << "SetupDialog::setPage("<0))// The user is opening a new log { tabWidget->setCurrentIndex(pageRequested); } logEvent(Q_FUNC_INFO, "END", Debug); } void SetupDialog::slotCancelButtonClicked() { //qDebug() << "SetupDialog::slotCancelButtonClicked"; logEvent(Q_FUNC_INFO, "Start", Debug); if (firstTime || nolog) { if (nolog) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); msgBox.setText(tr("You need to enter at least one log in the Logs tab.")); msgBox.setInformativeText(tr("Do you want to add one log in the Logs tab or exit KLog?\n(Click Yes to add a log or No to exit KLog)")); int ret = msgBox.exec(); if (ret == QMessageBox::No) { emit debugLog (Q_FUNC_INFO, "END-1", logLevel); emit exitSignal(2); return; } else { emit debugLog (Q_FUNC_INFO, "END-2", logLevel); return; } } } hamlibPage->stopHamlib(); QDialog::reject (); close(); logEvent(Q_FUNC_INFO, "END", Debug); } void SetupDialog::createIcons() { //qDebug() << "SetupDialog::createIcons"; logEvent(Q_FUNC_INFO, "Start", Debug); QListWidgetItem *configButton = new QListWidgetItem(contentsWidget); configButton->setIcon(QIcon(":/images/config.png")); configButton->setText(tr("User data")); configButton->setTextAlignment(Qt::AlignHCenter); configButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); QListWidgetItem *logsButton = new QListWidgetItem(contentsWidget); logsButton->setIcon(QIcon(":/images/config.png")); logsButton->setText(tr("Logs")); logsButton->setTextAlignment(Qt::AlignHCenter); logsButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); QListWidgetItem *bandsButton = new QListWidgetItem(contentsWidget); bandsButton->setIcon(QIcon(":/images/query.png")); bandsButton->setText(tr("Bands/Modes")); bandsButton->setTextAlignment(Qt::AlignHCenter); bandsButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); QListWidgetItem *dxClusterButton = new QListWidgetItem(contentsWidget); dxClusterButton->setIcon(QIcon(":/images/query.png")); dxClusterButton->setText(tr("DX-Cluster")); dxClusterButton->setTextAlignment(Qt::AlignHCenter); dxClusterButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); QListWidgetItem *colorsButton = new QListWidgetItem(contentsWidget); colorsButton->setIcon(QIcon(":/images/query.png")); colorsButton->setText(tr("Colors")); colorsButton->setTextAlignment(Qt::AlignHCenter); colorsButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); QListWidgetItem *miscButton = new QListWidgetItem(contentsWidget); miscButton->setIcon(QIcon(":/images/query.png")); miscButton->setText(tr("Misc")); miscButton->setTextAlignment(Qt::AlignHCenter); miscButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); QListWidgetItem *worldButton = new QListWidgetItem(contentsWidget); worldButton->setIcon(QIcon(":/images/query.png")); worldButton->setText(tr("World")); worldButton->setTextAlignment(Qt::AlignHCenter); worldButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); connect(contentsWidget, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), this, SLOT(changePage(QListWidgetItem*,QListWidgetItem*))); logEvent(Q_FUNC_INFO, "END", Debug); } void SetupDialog::changePage(QListWidgetItem *current, QListWidgetItem *previous) { //qDebug() << "SetupDialog::changePage"; logEvent(Q_FUNC_INFO, "Start", Debug); if (!current) current = previous; pagesWidget->setCurrentIndex(contentsWidget->row(current)); logEvent(Q_FUNC_INFO, "END", Debug); } void SetupDialog::loadDarkMode() {// Reads the config to setup the DarkMode //qDebug() << Q_FUNC_INFO; colorsPage->loadDarkMode (); } bool SetupDialog::loadSettings() { //qDebug() << Q_FUNC_INFO << " - Start"; if (!QFile::exists(util->getCfgFile ())) { //qDebug() << Q_FUNC_INFO << " - Nothing to load"; return false; } QSettings settings(util->getCfgFile (), QSettings::IniFormat); //qDebug() << Q_FUNC_INFO << " - 10 - General"; version = settings.value ("Version").toString(); //latestBackup = settings.value ("LatestBackup").toString (); //qDebug() << Q_FUNC_INFO << " - 20 - user"; userDataPage->loadSettings(); //qDebug() << Q_FUNC_INFO << " - 30 - bands"; settings.beginGroup ("BandMode"); QStringList listAux; listAux.clear(); listAux << "SSB" << "CW"; readActiveModes (settings.value("Modes", listAux).toStringList ()); listAux.clear(); listAux << "10M" << "15M" << "20M" << "40M" << "80M" << "160M"; readActiveBands (settings.value("Bands", listAux).toStringList ()); modes.removeDuplicates(); bandModePage->setActiveModes(modes); bands.removeDuplicates(); bandModePage->setActiveBands (bands); settings.endGroup (); //qDebug() << Q_FUNC_INFO << " - 40 - logview"; logViewPage->loadSettings (); //qDebug() << Q_FUNC_INFO << " - 50 - dxcluster"; dxClusterPage->loadSettings (); //qDebug() << Q_FUNC_INFO << " - 60 - colors"; colorsPage->loadSettings (); //qDebug() << Q_FUNC_INFO << " - 70 - misc"; miscPage->loadSettings (); //qDebug() << Q_FUNC_INFO << " - 80 - logs"; logsPage->loadSettings(); //qDebug() << Q_FUNC_INFO << " - 90 - elog"; eLogPage->loadSettings (); //qDebug() << Q_FUNC_INFO << " - 100 - UDP"; UDPPage->loadSettings (); //qDebug() << Q_FUNC_INFO << " - 110 - Sats"; hamlibPage->loadSettings (); //qDebug() << Q_FUNC_INFO << " - 120 - END"; return true; } void SetupDialog::saveSettings() { //qDebug() << Q_FUNC_INFO << " - Start"; //QSettings settings(util->getCfgFile (), QSettings::IniFormat); userDataPage->saveSettings(); // Groups done bandModePage->saveSettings (); // Groups done logViewPage->saveSettings (); dxClusterPage->saveSettings (); miscPage->saveSettings (); colorsPage->saveSettings (); logsPage->saveSettings(); eLogPage->saveSettings (); UDPPage->saveSettings (); hamlibPage->saveSettings (); //qDebug() << Q_FUNC_INFO << " - END"; } void SetupDialog::slotOkButtonClicked() { //qDebug() << Q_FUNC_INFO ; logEvent(Q_FUNC_INFO, "Start", Debug); if (!miscPage->areDBPathChangesApplied()) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("DB has not been moved to new path.")); msgBox.setInformativeText(tr("Go to the Misc tab and click on Move DB\n or the DB will not be moved to the new location.")); msgBox.exec(); emit debugLog (Q_FUNC_INFO, "END-1", logLevel); return; } if (!util->isValidCall(userDataPage->getMainCallsign())){ // QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("You need to enter at least a valid callsign.")); msgBox.setInformativeText(tr("Go to the User tab and enter valid callsign.")); msgBox.exec(); emit debugLog (Q_FUNC_INFO, "END-2", logLevel); return; } if (!haveAtleastOneLog()) { //qDebug() << "SetupDialog::slotOkButtonClicked - NO LOG!"; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("You have not selected the kind of log you want.")); msgBox.setInformativeText(tr("You will be redirected to the Log tab.\nPlease add and select the kind of log you want to use.")); msgBox.exec(); tabWidget->setCurrentIndex(tabWidget->indexOf(logsPage)); logsPage->createNewLog(); //emit newLogRequested(true); // Signal to be catched by logsPage true show new log //qDebug() << Q_FUNC_INFO << "END-3" ; emit debugLog (Q_FUNC_INFO, "END-3", logLevel); return; } //qDebug() << "SetupDialog::slotOkButtonClicked - 10"; saveSettings(); hamlibPage->stopHamlib(); //qDebug() << "SetupDialog::slotOkButtonClicked - just before leaving"; QDialog::accept(); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "SetupDialog::slotOkButtonClicked - END"; close(); } void SetupDialog::slotReadConfigData() { //qDebug() << Q_FUNC_INFO << " - Start"; logEvent(Q_FUNC_INFO, "Start", Debug); if (firstTime) //if (!QFile::exists (util->getCfgFile ())) { //qDebug() << Q_FUNC_INFO << " - FirstTime"; setDefaults(); bands.removeDuplicates(); modes.removeDuplicates(); //logViewFields.removeDuplicates(); bandModePage->setActiveModes(modes); bandModePage->setActiveBands(bands); //logViewPage->setActiveFields(logViewFields); } loadSettings(); //dxClusterPage->setDxclusterServersComboBox(dxClusterServers); //dxClusterPage->setSelectedDxClusterServer(dxClusterServerToUse); if (modes.isEmpty()) { modes << "SSB" << "CW"; } if (bands.isEmpty()) { bands << "10M" << "12M" << "15M" << "17M" << "20M" << "40M" << "80M" << "160M"; } modes.removeDuplicates(); bandModePage->setActiveModes(modes); bands.removeDuplicates(); bandModePage->setActiveBands(bands); //logViewPage->setActiveFields(logViewFields); //qDebug() << Q_FUNC_INFO << " - END"; logEvent(Q_FUNC_INFO, "END", Debug); } void SetupDialog::readActiveBands (const QStringList &actives) { // Checks a "10m, 12m" QString, checks if they are valid bands and import to the // bands used in the program //qDebug() << "SetupDialog::readActiveBands: " << actives << QT_ENDL; logEvent(Q_FUNC_INFO, "Start", Debug); bool atLeastOne = false; QStringList values = actives; QStringList _abands; for (int i = 0; i < values.size() ; i++) { if (isValidBand(values.at(i))) { if (!atLeastOne) { atLeastOne = true; _abands.clear(); } _abands << values.at(i); } } bands.clear(); bands << dataProxy->getBandsInLog(-1); bands << _abands; bands.removeDuplicates(); //qDebug() << Q_FUNC_INFO << " - END"; logEvent(Q_FUNC_INFO, "END", Debug); } void SetupDialog::readActiveModes (const QStringList &actives) { //qDebug() << "SetupDialog::readActiveModes: " << actives; logEvent(Q_FUNC_INFO, "Start", Debug); bool atLeastOne = false; QStringList _amodes; QStringList values = actives; values.removeDuplicates(); for (int i = 0; i < values.size() ; i++) { if (isValidMode(values.at(i))) { if (!atLeastOne) { atLeastOne = true; _amodes.clear(); } _amodes << values.at(i); } } modes.clear(); modes = dataProxy->getModesInLog(-1); modes << _amodes; modes.removeDuplicates(); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "SetupDialog::readActiveModes: " << modes.join(" / "); } bool SetupDialog::isValidBand (const QString &b) { //qDebug() << "SetupDialog::isValidBand: "<< b; logEvent(Q_FUNC_INFO, "Start", Debug); QString stringQuery = QString("SELECT id FROM band WHERE name='%1'").arg(b); QSqlQuery query(stringQuery); query.next(); logEvent(Q_FUNC_INFO, "END", Debug); return query.isValid(); } bool SetupDialog::isValidMode (const QString &b) { //qDebug() << "SetupDialog::isValidMode: " << b; logEvent(Q_FUNC_INFO, "Start", Debug); QString stringQuery = QString("SELECT id FROM mode WHERE name='%1'").arg(b); QSqlQuery query(stringQuery); query.next(); logEvent(Q_FUNC_INFO, "END", Debug); return query.isValid(); } void SetupDialog::setDefaults() { //qDebug() << "SetupDialog::setDefaults"; logEvent(Q_FUNC_INFO, "Start", Debug); miscPage->setRealTime("TRUE"); miscPage->setUTCTime("TRUE"); miscPage->setImperial("FALSE"); //Metric system is the default miscPage->setAlwaysADIF("FALSE"); miscPage->setSendQSLWhenRec("TRUE"); miscPage->setShowStationCallSignInSearch("TRUE"); miscPage->setCheckNewVersions("TRUE"); //miscPage->setReportInfo("FALSE"); miscPage->setDXMarathon("FALSE"); miscPage->setDebugLogLevel(util->getDebugLevels().at(0)); //miscPage->setLogSort("FALSE"); miscPage->setSetEQSLByDefault("TRUE"); miscPage->setCheckCalls (true); UDPPage->setUDPServer(false); UDPPage->setUDPServerPort(2237); UDPPage->setTimeout(2000); UDPPage->setLogFromWSJTx(false); UDPPage->setReaDataFromWSJTx(false); UDPPage->setAutoLogFromWSJTx(false); //interfacesWindowsPage->setSendToPSTRotator("FALSE"); //interfacesWindowsPage->setPSTRotatorUDPServer("locahost"); //interfacesWindowsPage->setPSTRotatorUDPServerPort("12040"); dxClusterPage->init (); logViewPage->init(); //dxClusterServers.clear(); //dxClusterServers.append("dxfun.com:8000"); //dxClusterServerToUse = "dxfun.com:8000"; if (modes.isEmpty()) { modes << "SSB" << "CW"; modes.removeDuplicates(); } if (bands.isEmpty()) { bands << "10M" << "12M" << "15M" << "17M" << "20M" << "40M" << "80M" << "160M"; bands.removeDuplicates(); } logEvent(Q_FUNC_INFO, "END", Debug); } QString SetupDialog::checkAndFixASCIIinADIF(const QString &_data) { //qDebug() << "SetupDialog::checkAndFixASCIIinADIF " << _data; //TODO: this function is also in the FileManager class. Maybe I should call that one and keep just one copy logEvent(Q_FUNC_INFO, "Start", Debug); ushort unicodeVal; QString st = _data; QString newString; newString.clear(); for(int i=0; i < st.length(); i++) { // Get unicode VALUE into unicodeVal unicodeVal = (st.at(i)).unicode(); if ((20 <= unicodeVal ) && (unicodeVal <= 126)) { newString.append(st.at(i)); } //qDebug() << "SetupDialog::checkAndFixunicodeinADIF: " << st.at(i) <<" = " << QString::number(unicodeVal); } // Show into another lineEdit logEvent(Q_FUNC_INFO, "END", Debug); return newString; } bool SetupDialog::haveAtleastOneLog() { logEvent(Q_FUNC_INFO, "Start", Debug); emit debugLog (Q_FUNC_INFO, "END-1", logLevel); return dataProxy->haveAtLeastOneLog(); //logEvent(Q_FUNC_INFO, "END", Debug); } void SetupDialog::setClubLogActive(const bool _b) { logEvent(Q_FUNC_INFO, "Start", Debug); eLogPage->setClubLogActive(_b); logEvent(Q_FUNC_INFO, "END", Debug); } void SetupDialog::checkIfNewBandOrMode() { //qDebug() << "SetupDialog::checkIfNewBandOrMode: logLevel: " << QString::number(logLevel); logEvent(Q_FUNC_INFO, "Start", Debug); QStringList _items; _items.clear(); //qDebug() << "SetupDialog::checkIfNewBandOrMode -1"; _items << dataProxy->getBandsInLog(-1); //qDebug() << "SetupDialog::checkIfNewBandOrMode -2"; _items << bandModePage->getBands(); //qDebug() << "SetupDialog::checkIfNewBandOrMode -3"; _items.removeDuplicates(); //qDebug() << "SetupDialog::checkIfNewBandOrMode -4"; bandModePage->setActiveBands(_items); //qDebug() << "SetupDialog::checkIfNewBandOrMode -5"; _items.clear(); _items << dataProxy->getModesInLog(-1); _items << bandModePage->getModes(); _items.removeDuplicates(); bandModePage->setActiveModes(_items); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "SetupDialog::checkIfNewBandOrMode END"; } void SetupDialog::slotAnalyzeNewLogData(const QStringList _qs) { //qDebug() << "SetupDialog::slotAnalyzeNewLogData (length=" << QString::number(_qs.length()) << ")"; //qDebug() << "SetupDialog::slotAnalyzeNewLogData"; // We receive the station callsign and operators from the logs tab logEvent(Q_FUNC_INFO, "Start", Debug); if (_qs.length()!=2) { emit debugLog (Q_FUNC_INFO, "END-1", logLevel); return; } userDataPage->setMainCallsign(_qs.at(0)); userDataPage->setOperators(_qs.at(1)); logEvent(Q_FUNC_INFO, "END", Debug); } void SetupDialog::slotSetStationCallSign(const QString &_p) { //qDebug() << "SetupDialog::slotSetStationCallSign: " << _p; logEvent(Q_FUNC_INFO, "Start", Debug); logsPage->setDefaultStationCallsign(_p); logEvent(Q_FUNC_INFO, "END", Debug); } void SetupDialog::slotSetOperators(const QString &_p) { //qDebug() << "SetupDialog::slotSetOperators: " << _p; logEvent(Q_FUNC_INFO, "Start", Debug); logsPage->setDefaultOperators(_p); logEvent(Q_FUNC_INFO, "END", Debug); } void SetupDialog::setLogLevel(const DebugLogLevel _sev) { logLevel = _sev; miscPage->setDebugLogLevel(util->debugLevelToString(_sev)); } void SetupDialog::slotQueryErrorManagement(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery) { logEvent(Q_FUNC_INFO, "Start", Debug); emit queryError(functionFailed, errorCodeS, nativeError, failedQuery); logEvent(Q_FUNC_INFO, "END", Debug); } void SetupDialog::slotFocusOK() { okButton->setFocus(Qt::OtherFocusReason); } void SetupDialog::showEvent(QShowEvent *event) { //qDebug() << Q_FUNC_INFO; //qDebug() << Q_FUNC_INFO << " - selectedLog: " << QString::number(logsPage->getSelectedLog()); QWidget::showEvent(event); eLogPage->loadSettings (); miscPage->loadSettings (); userDataPage->setStationFocus(); } void SetupDialog::logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level) { if (logLevel<=_level) emit debugLog (_func, _msg, _level); } klog-2.3.3/world.h0000644000015700001710000001270414542412415013641 0ustar jenkinsjenkins#ifndef KLOG_WORLD_H #define KLOG_WORLD_H /*************************************************************************** world.h - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include #include #include //#include #include #include #include #include #include #include #include "locator.h" #include "dataproxy_sqlite.h" #include "utilities.h" //#include "klogdefinitions.h" //#include "awards.h" class QStringList; enum { Entity_Name = 1, Entity_Continent = 2 }; class World : public QObject { //friend class Awards; Q_OBJECT public: World(DataProxy_SQLite *dp, const QString &_parentFunction); //World(DataProxy_SQLite *dp, const QString &_klogDir, const QString &_parentFunction); //World(DataProxy_SQLite *dp, const QString &_klogVer, const QString &_parentFunction); ~World(); bool create(const QString &_worldFile); bool recreate(const QString &_worldFile); bool readWorld(); QString getQRZEntityName(const QString &_qrz); QString getEntityName(const int _entityN); QString getQRZEntityMainPrefix(const QString &_qrz); QString getEntityMainPrefix(const int _entityN); QString getQRZContinentNumber(const QString &_qrz); // Returns the continent id number int getContinentNumber(const int _enti); // Returns the continent id number QString getQRZContinentShortName(const QString &_qrz); // Returns the continent shortName (EU, AF, ...) QString getContinentShortName(const int _enti); QString getQRZLocator(const QString &_qrz); // Returns the entity locator QString getLocator(const int _entityN); // Returns the entity locator double getLongitude(const int _enti); // Returns the longitude of the Entity double getLatitude(const int _enti); // Returns the latitude of the Entity int getEntityCqz(const int _enti); int getQRZCqz(const QString &_qrz); //int getPrefixCQz(const QString &_p); int getQRZItuz(const QString &_qrz); int getEntityItuz(const int _enti); int getQRZARRLId(const QString &_qrz); //Returns the ARRL id of the Entity from a QRZ & Returns -1 if not found. bool isNewCQz(const int _cqz); bool isNewEntity(const int _entityN); //int getBandIdFromFreq(const QString fr); QString getEntityPrefixes(const int _enti); //QStringList getEntitiesNames(); int getHowManyEntities(); bool hasSpecialEntities(); private slots: private: //void identifyOS(); bool insertSpecialEntities(); int getPrefixId(const QString &_prefix); //bool readCTYDAT(); bool readCTYCSV(const QString &_worldFile); QStringList processLine(const QString &_line); QStringList processLineP(const QString &_line, const int _processingEntity); //void createWorldModel(); QStringList readZones(const QString &pref, const int _cq, const int _itu); int progressBarPosition; bool created; //QString klogVersion; int cqz, ituz, numberOfEntities; QString entityName; QString currentPrefix; // Used in the progressBar bool ret; QStringList list, prefixAndZones; QString continentName, prefix; int continentId; double lat, lon, utc; //int utc; //QString line; //bool readingDataOfAnEntity; int nullValue; Locator *locator; DataProxy_SQLite *dataProxy; Utilities *util; QHash worldPrefixes; //int constrid; // Just an id for the constructor to check who is being executed at one specific time //Awards *awards; //FLAGS //QString flagsDir; //FLAGS-END signals: //void qsoFound(const QStringList _qs); // Each: QString with format: Fieldname:value void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution }; #endif // WORLD_H klog-2.3.3/setuppages/0000755000015700001710000000000014542412415014515 5ustar jenkinsjenkinsklog-2.3.3/setuppages/hamlibnetworkconfigwidget.cpp0000644000015700001710000000407214542412415022464 0ustar jenkinsjenkins#include "hamlibnetworkconfigwidget.h" HamLibNetworkConfigWidget::HamLibNetworkConfigWidget(QWidget *parent) : QWidget(parent) { //qDebug() << Q_FUNC_INFO; hostAddressLineEdit = new QLineEdit(); portQSpinBox = new QSpinBox; //qDebug() << Q_FUNC_INFO << " - END"; } void HamLibNetworkConfigWidget::createUI() { portQSpinBox->setMaximum (65535); portQSpinBox->setMinimum (0); hostAddressLineEdit->setToolTip (tr("Enter the hostname or address of the radio.")); portQSpinBox->setToolTip (tr("Set de network port of the radio.")); //portQSpinBox->setValue (rigctlport); QLabel *hostAddLabel = new QLabel(tr("Host/Address")); hostAddLabel->setBuddy(hostAddressLineEdit); hostAddLabel->setToolTip(tr("Enter the hostname or address of the radio.")); hostAddLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); hostAddLabel->setEnabled(true); QLabel *portNetLabel = new QLabel(tr("Port")); portNetLabel->setBuddy(portQSpinBox); portNetLabel->setToolTip(tr("Enter the port of the radio.")); portNetLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); portNetLabel->setEnabled(true); QGridLayout *networkLayout = new QGridLayout; //qDebug() << Q_FUNC_INFO << " - 120"; networkLayout->addWidget (hostAddLabel, 0, 0); networkLayout->addWidget (hostAddressLineEdit, 0, 1); networkLayout->addWidget (portNetLabel, 1, 0); networkLayout->addWidget (portQSpinBox, 1, 1); //networkGroup->setLayout (networkLayout); setLayout (networkLayout); //qDebug() << Q_FUNC_INFO << " - END"; } int HamLibNetworkConfigWidget::getPort() { return portQSpinBox->value (); } void HamLibNetworkConfigWidget::setPort (const int _b) {//TODO: Check that if ((_b<0) || (_b>65535)) { return; } portQSpinBox->setValue (_b); } QString HamLibNetworkConfigWidget::getAddress() { return hostAddressLineEdit->text (); } void HamLibNetworkConfigWidget::setAddress(const QString &_st) { //TODO: Check that what is arriving is a hostname or IP address hostAddressLineEdit->setText (_st); } klog-2.3.3/setuppages/setuppageuserdata.cpp0000644000015700001710000006021414542412415020752 0ustar jenkinsjenkins/*************************************************************************** userdatapage.cpp - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * Foobar is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "setuppageuserdata.h" SetupPageUserDataPage::SetupPageUserDataPage(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent){ //qDebug() << Q_FUNC_INFO << " - Start"; slotQRZRunning = false; locator = new Locator(); util = new Utilities(Q_FUNC_INFO); dataProxy = dp; world = new World(dataProxy, Q_FUNC_INFO); mainCallOK = false; operatorsOK = false; tabWidget = new QTabWidget; QWidget *personalTab = new QWidget; QWidget *stationTab = new QWidget; tabWidget->addTab(personalTab, tr("&Personal data")); tabWidget->addTab(stationTab, tr("Station &data")); maincallsignLineEdit = new QLineEdit; operatorsLineEdit = new QLineEdit; nameLineEdit = new QLineEdit; cqzLineEdit = new QLineEdit; ituzLineEdit = new QLineEdit; myLocatorLineEdit = new QLineEdit; defaultPalette = new QPalette; wrongPalette = new QPalette; wrongPalette->setColor(QPalette::Text, Qt::red); //Personal Tab nameLineEdit = new QLineEdit; address1LineEdit = new QLineEdit; address2LineEdit = new QLineEdit; address3LineEdit = new QLineEdit; address4LineEdit = new QLineEdit; cityLineEdit = new QLineEdit; zipLineEdit = new QLineEdit; provinceLineEdit = new QLineEdit; countryLineEdit = new QLineEdit; nameLineEdit->setToolTip(tr("Enter your name.")); address1LineEdit->setToolTip(tr("Enter your address - 1st line.")); address2LineEdit->setToolTip(tr("Enter your address - 2nd line.")); address3LineEdit->setToolTip(tr("Enter your address - 3rd line.")); address4LineEdit->setToolTip(tr("Enter your address - 4th line.")); cityLineEdit->setToolTip(tr("Enter your city.")); zipLineEdit->setToolTip(tr("Enter your zip code.")); provinceLineEdit->setToolTip(tr("Enter your province or state.")); countryLineEdit->setToolTip(tr("Enter your country.")); QLabel *nameLabel = new QLabel(tr("&Name")); QLabel *addressLabel = new QLabel(tr("&Address")); QLabel *cityLabel = new QLabel(tr("Cit&y")); QLabel *zipLabel = new QLabel(tr("&Zip Code")); QLabel *provLabel = new QLabel(tr("Pro&v/State")); QLabel *countryLabel = new QLabel(tr("Countr&y")); nameLabel->setBuddy(nameLineEdit); addressLabel->setBuddy(address1LineEdit); cityLabel->setBuddy(cityLineEdit); zipLabel->setBuddy(zipLineEdit); provLabel->setBuddy(provinceLineEdit); countryLabel->setBuddy(countryLineEdit); //void addWidget ( QWidget * widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = 0 ) // 0 1 2 3 QGridLayout *personalLayout = new QGridLayout(); personalLayout->addWidget(nameLabel, 0, 0); personalLayout->addWidget(nameLineEdit, 1, 0); personalLayout->addWidget(addressLabel, 2, 0); personalLayout->addWidget(address1LineEdit, 3, 0, 1, 2); personalLayout->addWidget(address2LineEdit, 4, 0, 1, 2); personalLayout->addWidget(address3LineEdit, 5, 0, 1, 2); personalLayout->addWidget(address4LineEdit, 6, 0, 1, 2); personalLayout->addWidget(cityLabel, 2, 2); personalLayout->addWidget(cityLineEdit, 3, 2, 1, 1); personalLayout->addWidget(zipLabel, 2, 5); personalLayout->addWidget(zipLineEdit, 3, 5, 1, 1); personalLayout->addWidget(provLabel, 4, 2); personalLayout->addWidget(provinceLineEdit, 5, 2, 1, 1); personalLayout->addWidget(countryLabel, 4, 5); personalLayout->addWidget(countryLineEdit, 5, 5, 1, 1); personalTab->setLayout(personalLayout); // Station Tab rig1LineEdit = new QLineEdit; rig2LineEdit = new QLineEdit; rig3LineEdit = new QLineEdit; ant1LineEdit = new QLineEdit; ant2LineEdit = new QLineEdit; ant3LineEdit = new QLineEdit; myPowerSpinBox = new QDoubleSpinBox; myPowerSpinBox->setDecimals(2); myPowerSpinBox->setMaximum(9999); rig1LineEdit->setToolTip(tr("Enter your information for rig") + " #1."); rig2LineEdit->setToolTip(tr("Enter your information for rig") + " #2."); rig3LineEdit->setToolTip(tr("Enter your information for rig") + " #3."); ant1LineEdit->setToolTip(tr("Enter your information for antenna") + " #1."); ant2LineEdit->setToolTip(tr("Enter your information for antenna") + " #2."); ant3LineEdit->setToolTip(tr("Enter your information for antenna") + " #3."); myPowerSpinBox->setToolTip(tr("Enter your power information.")); QLabel *rig1Label = new QLabel(tr("&Rig 1")); QLabel *rig2Label = new QLabel(tr("R&ig 2")); QLabel *rig3Label = new QLabel(tr("Ri&g 3")); QLabel *antenna1Label = new QLabel(tr("Antenna &1")); QLabel *antenna2Label = new QLabel(tr("Antenna &2")); QLabel *antenna3Label = new QLabel(tr("Antenna &3")); QLabel *powerLabel = new QLabel(tr("Po&wer")); rig1Label->setBuddy(rig1LineEdit); rig2Label->setBuddy(rig2LineEdit); rig3Label->setBuddy(rig3LineEdit); antenna1Label->setBuddy(ant1LineEdit); antenna2Label->setBuddy(ant2LineEdit); antenna3Label->setBuddy(ant3LineEdit); powerLabel->setBuddy(myPowerSpinBox); //void addWidget ( QWidget * widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = 0 ) // 0 1 2 3 QGridLayout *stationLayout = new QGridLayout(); stationLayout->addWidget(rig1Label, 0, 0); stationLayout->addWidget(rig1LineEdit, 1, 0, 1, 1); stationLayout->addWidget(rig2Label, 2, 0); stationLayout->addWidget(rig2LineEdit, 3, 0, 1, 1); stationLayout->addWidget(rig3Label, 4, 0); stationLayout->addWidget(rig3LineEdit, 5, 0, 1, 1); stationLayout->addWidget(antenna1Label, 0, 2); stationLayout->addWidget(ant1LineEdit, 1, 2, 1, 1); stationLayout->addWidget(antenna2Label, 2, 2); stationLayout->addWidget(ant2LineEdit, 3, 2, 1, 1); stationLayout->addWidget(antenna3Label, 4, 2); stationLayout->addWidget(ant3LineEdit, 5, 2, 1, 1); stationLayout->addWidget(powerLabel, 0, 4); stationLayout->addWidget(myPowerSpinBox, 1, 4); stationTab->setLayout(stationLayout); //TODO:Defining ALL the tooltips maincallsignLineEdit->setToolTip(tr("Enter the station callsign that will be used for logging.")); operatorsLineEdit->setToolTip(tr("Enter the operators (comma separated if more than one).")); myLocatorLineEdit->setToolTip(tr("Enter the locator of your station. Alternatively, KLog can use an approximate locator based on your callsign.")); QLabel *qrzLabel = new QLabel(tr("&Callsign")); QLabel *operatorsLabel = new QLabel (tr("&Operators")); QLabel *cqzLabel = new QLabel(tr("&CQ Zone")); QLabel *ituzLabel = new QLabel(tr("&ITU Zone")); myLocatorLabel = new QLabel(tr("&Locator")); qrzLabel->setBuddy(maincallsignLineEdit); operatorsLabel->setBuddy(operatorsLineEdit); cqzLabel->setBuddy(cqzLineEdit); ituzLabel->setBuddy(ituzLineEdit); myLocatorLabel->setBuddy(myLocatorLineEdit); cqzLineEdit->setInputMask("09"); ituzLineEdit->setInputMask("09"); cqzLineEdit->setText("00"); ituzLineEdit->setText("00"); QGridLayout *userdataLayout = new QGridLayout; userdataLayout->addWidget(qrzLabel, 0, 0); userdataLayout->addWidget(maincallsignLineEdit, 1, 0); userdataLayout->addWidget(operatorsLabel, 0, 1); userdataLayout->addWidget(operatorsLineEdit, 1, 1, 1, -1); userdataLayout->addWidget(myLocatorLabel, 3, 0); userdataLayout->addWidget(myLocatorLineEdit, 4, 0); userdataLayout->addWidget(cqzLabel, 3, 1); userdataLayout->addWidget(cqzLineEdit, 4, 1); userdataLayout->addWidget(ituzLabel, 3, 2); userdataLayout->addWidget(ituzLineEdit, 4, 2); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(userdataLayout); mainLayout->addWidget(tabWidget); //mainLayout->addStretch(1); connect(maincallsignLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotQRZTextChanged() ) ); connect(maincallsignLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(operatorsLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(nameLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(cqzLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(ituzLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(myLocatorLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(address1LineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(address2LineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(address3LineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(address4LineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(cityLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(zipLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(provinceLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(countryLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(myLocatorLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotMyLocatorTextChanged() ) ); connect(operatorsLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotOperatorsChanged() ) ); setLayout(mainLayout); maincallsignLineEdit->setFocus(); //qDebug() << Q_FUNC_INFO << " - END"; } SetupPageUserDataPage::~SetupPageUserDataPage() { //qDebug() << Q_FUNC_INFO << " - Start"; delete(locator); delete(util); delete(world); delete(defaultPalette); delete(wrongPalette); delete(dataProxy); } void SetupPageUserDataPage::setPrefixes() { util->setLongPrefixes(dataProxy->getLongPrefixes()); util->setSpecialCalls(dataProxy->getSpecialCallsigns()); world->readWorld (); } QString SetupPageUserDataPage::getMainCallsign() { if (util->isValidCall(maincallsignLineEdit->text())) { return maincallsignLineEdit->text(); } else { return QString(); } } void SetupPageUserDataPage::slotEnterKeyPressed() { emit enterKey(); } void SetupPageUserDataPage::slotQRZTextChanged() { //qDebug() << Q_FUNC_INFO << " - Start"; if (slotQRZRunning) { //qDebug() << Q_FUNC_INFO << " - END-1"; return; } slotQRZRunning = true; //qDebug() << "SetupPageUserDataPage::slotQRZTextChanged: " << maincallsignLineEdit->text() << " / Length: " << QString::number((maincallsignLineEdit->text()).size()); int i = maincallsignLineEdit->cursorPosition(); QString _a = util->getClearSQLi (maincallsignLineEdit->text()); if (i<1) { slotQRZRunning = false; //qDebug() << Q_FUNC_INFO << " - END-2"; return; } if ((_a.at(i-1)).isSpace()) { maincallsignLineEdit->setText(_a.remove(i-1, 1)); } maincallsignLineEdit->setText(((maincallsignLineEdit->text())).simplified()); maincallsignLineEdit->setText((maincallsignLineEdit->text()).toUpper()); cqzLineEdit->setText(QString::number(world->getQRZCqz(maincallsignLineEdit->text()))); ituzLineEdit->setText(QString::number(world->getQRZItuz(maincallsignLineEdit->text()))); myLocatorLineEdit->setText(world->getQRZLocator(maincallsignLineEdit->text())); maincallsignLineEdit->setCursorPosition(i); emit mainCallsignSignal(maincallsignLineEdit->text()); /* if (!locator->isValidLocator(myLocatorLineEdit->text()) ) { myLocatorLineEdit->setText(world->getQRZLocator(maincallsignLineEdit->text())); } */ //qDebug() << Q_FUNC_INFO << " - END-3"; slotQRZRunning = false; } int SetupPageUserDataPage::getCQz(){ return (cqzLineEdit->text()).toInt(); } int SetupPageUserDataPage::getITUz(){ return (ituzLineEdit->text()).toInt(); } bool SetupPageUserDataPage::setMainCallsign(const QString &_qrz) { //qDebug() << Q_FUNC_INFO << ": " << _qrz; if (_qrz.length ()<3) { return false; } maincallsignLineEdit->setText((_qrz).toUpper()); return true; } bool SetupPageUserDataPage::setCQz(const int _cqz) { cqzLineEdit->setText(QString::number(_cqz)); return true; } bool SetupPageUserDataPage::setITUz(const int _ituz) { ituzLineEdit->setText(QString::number(_ituz)); return true; } void SetupPageUserDataPage::slotMyLocatorTextChanged() { //qDebug() << Q_FUNC_INFO << " - Start"; myLocatorLineEdit->setText(((util->getClearSQLi(myLocatorLineEdit->text()))).simplified()); myLocatorLineEdit->setText((myLocatorLineEdit->text()).toUpper()); if ( ((myLocatorLineEdit->text()).length()) >3 ) { if (!(locator->isValidLocator(myLocatorLineEdit->text()) )) { myLocatorLabel->setText(tr("&Locator (not valid)")); } else { myLocatorLabel->setText(tr("&Locator")); } } } QString SetupPageUserDataPage::getStationLocator() { if (!(locator->isValidLocator(myLocatorLineEdit->text()) )) { return ""; } else { return (myLocatorLineEdit->text()).toUpper(); } } bool SetupPageUserDataPage::setStationLocator(const QString &_loc) { if (!(locator->isValidLocator(_loc) )) { return false; } else { myLocatorLineEdit->setText((_loc).toUpper()); return true; } } QString SetupPageUserDataPage::getName() { return nameLineEdit->text(); } QStringList SetupPageUserDataPage::getAddress() { QStringList a; a.clear(); a << address1LineEdit->text() << address2LineEdit->text() << address3LineEdit->text() << address4LineEdit->text(); return a; } QString SetupPageUserDataPage::getAddress1() { return address1LineEdit->text(); } QString SetupPageUserDataPage::getAddress2() { return address2LineEdit->text(); } QString SetupPageUserDataPage::getAddress3() { return address3LineEdit->text(); } QString SetupPageUserDataPage::getAddress4() { return address4LineEdit->text(); } QString SetupPageUserDataPage::getRig1() { return rig1LineEdit->text(); } QString SetupPageUserDataPage::getRig2() { return rig2LineEdit->text(); } QString SetupPageUserDataPage::getRig3() { return rig3LineEdit->text(); } QString SetupPageUserDataPage::getAntenna1() { return ant1LineEdit->text(); } QString SetupPageUserDataPage::getAntenna2() { return ant2LineEdit->text(); } QString SetupPageUserDataPage::getAntenna3() { return ant3LineEdit->text(); } QString SetupPageUserDataPage::getCity() { return cityLineEdit->text(); } QString SetupPageUserDataPage::getZipCode() { return zipLineEdit->text(); } QString SetupPageUserDataPage::getProvince() { return provinceLineEdit->text(); } QString SetupPageUserDataPage::getCountry() { return countryLineEdit->text(); } bool SetupPageUserDataPage::setName (const QString &_aux) { nameLineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setAddress (const QStringList _aux) { address1LineEdit->setText(_aux.at(0)); address2LineEdit->setText(_aux.at(1)); address3LineEdit->setText(_aux.at(2)); address4LineEdit->setText(_aux.at(3)); return true; } bool SetupPageUserDataPage::setAddress1 (const QString &_aux) { address1LineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setAddress2 (const QString &_aux) { address2LineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setAddress3 (const QString &_aux) { address3LineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setAddress4 (const QString &_aux) { address4LineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setCity (const QString &_aux) { cityLineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setZipCode(const QString &_aux) { zipLineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setProvince (const QString &_aux) { provinceLineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setCountry (const QString &_aux) { countryLineEdit->setText(_aux); return true; } QStringList SetupPageUserDataPage::getRigs() { QStringList a; a.clear(); a << rig1LineEdit->text() << rig2LineEdit->text() << rig3LineEdit->text(); return a; } QStringList SetupPageUserDataPage::getAntennas() { QStringList a; a.clear(); a << ant1LineEdit->text() << ant2LineEdit->text() << ant3LineEdit->text(); return a; } double SetupPageUserDataPage::getPower() { return myPowerSpinBox->value(); } bool SetupPageUserDataPage::setPower(const float _aux) { myPowerSpinBox->setValue(_aux); return true; } bool SetupPageUserDataPage::setRig1 (const QString &_aux) { rig1LineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setRig2 (const QString &_aux) { rig2LineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setRig3 (const QString &_aux) { rig3LineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setAntenna1 (const QString &_aux) { ant1LineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setAntenna2 (const QString &_aux) { ant2LineEdit->setText(_aux); return true; } bool SetupPageUserDataPage::setAntenna3 (const QString &_aux) { ant3LineEdit->setText(_aux); return true; } void SetupPageUserDataPage::slotOperatorsChanged() { //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged"; //QString _operators = operatorsLineEdit->text(); if (operatorsLineEdit->text().length() < 1) return; int i = operatorsLineEdit->cursorPosition(); QString _a = operatorsLineEdit->text(); if ((_a.at(i-1)).isSpace()) { operatorsLineEdit->setText(_a.remove(i-1, 1)); } operatorsLineEdit->setText(util->getClearSQLi (_a).simplified().toUpper()); _a = operatorsLineEdit->text(); QStringList operators = _a.split(",", QT_SKIP); //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged-02"; //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged-02.5 Size: " << QString::number(operators.size()); for (int ii = 0; ii < operators.size(); ++ii) { //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged-03 - " << QString::number(ii); operatorsOK = util->isValidCall(operators.at(ii)); //operatorsOK = world->checkQRZValidFormat(operators.at(ii)); } //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged-04"; if (operatorsOK) { //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged: VALID FORMAT"; operatorsLineEdit->setPalette(*defaultPalette); emit operatorsSignal(operatorsLineEdit->text()); } else { operatorsLineEdit->setPalette(*wrongPalette); //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged: NOT VALID FORMAT"; } //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged-05"; operatorsLineEdit->setCursorPosition(i); //qDebug() << "SetupPageUserDataPage::slotOperatorsChanged-END"; } QString SetupPageUserDataPage::getOperators() { if (operatorsOK) { return operatorsLineEdit->text(); } else { return QString(); } } bool SetupPageUserDataPage::setOperators(const QString &_aux) { if (checkOperatorsLineQString(_aux)) { operatorsLineEdit->setText(_aux); return true; } return false; } bool SetupPageUserDataPage::checkOperatorsLineQString(const QString &_auxLine) { QStringList _aux = _auxLine.split(','); for (int ii = 0; ii < _aux.size(); ++ii) { operatorsOK = util->isValidCall(_aux.at(ii)); //operatorsOK = world->checkQRZValidFormat(_aux.at(ii)); if (!operatorsOK) return operatorsOK; } return true; } void SetupPageUserDataPage::setStationFocus() { //qDebug() << Q_FUNC_INFO << " - Start"; maincallsignLineEdit->setFocus(); } void SetupPageUserDataPage::saveSettings() { //qDebug() << Q_FUNC_INFO << " - Start"; QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("UserData"); settings.setValue ("Callsign", getMainCallsign()); settings.setValue ("Operators", getOperators()); settings.setValue ("CQz", getCQz ()); settings.setValue ("ITUz", getITUz()); settings.setValue ("StationLocator", getStationLocator()); settings.setValue ("Name", getName()); settings.setValue ("Address1", getAddress1()); settings.setValue ("Address2", getAddress2()); settings.setValue ("Address3", getAddress3()); settings.setValue ("Address4", getAddress4()); settings.setValue ("City", getCity()); settings.setValue ("ZipCode", getZipCode()); settings.setValue ("ProvinceState", getProvince()); settings.setValue ("Country", getCountry()); settings.setValue ("Rig1", getRig1()); settings.setValue ("Rig2", getRig2()); settings.setValue ("Rig3", getRig3()); settings.setValue ("Antenna1", getAntenna1()); settings.setValue ("Antenna2", getAntenna2()); settings.setValue ("Antenna3",getAntenna3()); settings.setValue ("Power", getPower ()); settings.endGroup (); //qDebug() << Q_FUNC_INFO << " - END"; } void SetupPageUserDataPage::loadSettings() { //qDebug() << Q_FUNC_INFO << " - Start"; QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("UserData"); setMainCallsign(settings.value ("Callsign").toString ()); setOperators (settings.value ("Operators").toString ()); setStationLocator (settings.value ("StationLocator").toString ()); cqzLineEdit->setText (settings.value ("CQz").toString ()); ituzLineEdit->setText (settings.value ("ITUz").toString ()); nameLineEdit->setText (settings.value ("Name").toString ()); address1LineEdit->setText(settings.value ("Address1").toString ()); address2LineEdit->setText(settings.value ("Address2").toString ()); address3LineEdit->setText(settings.value ("Address3").toString ()); address4LineEdit->setText(settings.value ("Address4").toString ()); cityLineEdit->setText (settings.value ("City").toString ()); zipLineEdit->setText (settings.value ("ZipCode").toString ()); provinceLineEdit->setText(settings.value ("ProvinceState").toString ()); countryLineEdit->setText (settings.value ("Country").toString ()); rig1LineEdit->setText (settings.value ("Rig1").toString ()); rig2LineEdit->setText (settings.value ("Rig2").toString ()); rig3LineEdit->setText (settings.value ("Rig3").toString ()); ant1LineEdit->setText (settings.value ("Antenna1").toString ()); ant2LineEdit->setText (settings.value ("Antenna2").toString ()); ant3LineEdit->setText (settings.value ("Antenna3").toString ()); myPowerSpinBox->setValue(settings.value ("Power").toDouble ()); settings.endGroup (); } klog-2.3.3/setuppages/setuppageudp.h0000644000015700001710000000641014542412415017375 0ustar jenkinsjenkins#ifndef KLOG_SETUPPAGES_SETUPPAGEUDP_H #define KLOG_SETUPPAGES_SETUPPAGEUDP_H /*************************************************************************** setuppageudp.h - description ------------------- begin : sept 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include "../utilities.h" class SetupPageUDP : public QWidget { Q_OBJECT public: SetupPageUDP(QWidget *parent = nullptr); ~SetupPageUDP(); void setLogFromWSJTx(const bool _t); void setAutoLogFromWSJTx(const bool _t); void setReaDataFromWSJTx(const bool _t); void setUDPServer(const bool _t); void setUDPServerPort(const int _t); void setTimeout(const int _t); void setNetworkInterface(const QString &_t); QString getLogFromWSJTx(); QString getAutoLogFromWSJTx(); QString getReaDataFromWSJTx(); QString getUDPServerPort(); QString getUDPServer(); //int getTimeout(); QString getNetworkInterface(); void saveSettings(); void loadSettings(); private: void createUI(); void createActions(); void fillNetworkInterfaceComboBox(); QCheckBox *logFromWSJTXCheckbox, *logAutomaticallyWSJTXCheckbox, *realDataFromWSJTXCheckbox, *UDPServerCheckBox; //QLineEdit *wsjtxIPAddress, *wsjtxPortNumber; QSpinBox *UDPServerPortSpinBox; QSpinBox *miliSecsSpinBox; QComboBox *networkInterfacesComboBox; int defaultport, defaultTimer; Utilities *util; //bool logFromWSJTx, autoLogFromWSJTx, realDataFromWSJTx; signals: public slots: void slotLogFromWSJTCheckBoxClicked(); //void slotAutoLogFromWSJTCheckBoxClicked(); //void slotRealFromWSJTCheckBoxClicked(); void slotUDPServerCheckBoxClicked(); }; #endif // SETUPPAGEUDP_H klog-2.3.3/setuppages/setupentitydialog.h0000644000015700001710000000666014542412415020453 0ustar jenkinsjenkins#ifndef KLOG_SETUPPAGES_SETUPENTITYDIALOG_H #define KLOG_SETUPPAGES_SETUPENTITYDIALOG_H /*************************************************************************** SetupEntityDialog.h - description ------------------- begin : sept 2012 copyright : (C) 2012 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include #include #include #include "../klogdefinitions.h" class SetupEntityDialog : public QDialog { Q_OBJECT public: SetupEntityDialog(); ~SetupEntityDialog(); public slots: private slots: void slotOkButtonClicked(); void slotCancelButtonClicked(); void slotCheckEntity(); void slotCheckMainprefix(); void slotCheckCQz(); void slotCheckITUz(); void slotCheckContinent(); void slotCheckLatitude(); void slotCheckLongitude(); void slotCheckUTC(); void slotCheckARRLid(); void slotCheckDeleted(); void slotCheckDeletedDate(); void slotCheckPrefixes(); signals: void entityAdded(const QStringList _qs); // entity private: QString checkEntity(); QString checkMainprefix(); QString checkCQz(); QString checkITUz(); QString checkContinent(); QString checkLatitude(); QString checkLongitude(); QString checkUTC(); QString checkARRLid(); QString checkDeleted(); QString checkDeletedDate(); QString checkPrefixes(); bool entityBool, mainPrefixBool, cqBool, ituBool, contBool; bool latBool, lonBool, utcBool, arrlidBool, delBool, delDateBool, prefBool; QLineEdit *entityLineEdit, *cqLineEdit, *ituLineEdit; QLineEdit *contLineEdit, *latLineEdit, *lonLineEdit; QLineEdit *utcLineEdit, *mprefLineEdit, *arrlidLineEdit; QLineEdit *deletedLineEdit, *prefLineEdit; QDateEdit *delQDateEdit; QCheckBox *delRbutton; QStringList entityData; //QPalette *paletteOrig, *paletteWrong; //QColor color; QPalette pal, palw; }; #endif // SetupEntityDialog_H klog-2.3.3/setuppages/setuppagesubdivisions.cpp0000644000015700001710000003467614542412415021700 0ustar jenkinsjenkins/*************************************************************************** setuppageregionalawards.cpp - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include "setuppagesubdivisions.h" SetupPageSubdivisions::SetupPageSubdivisions(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent){ //qDebug() << "SetupPageSubdivisions::SetupPageSubdivisions"; dataProxy = dp; fileAwardManager = new FileAwardManager(dataProxy, Q_FUNC_INFO); //util = new Utilities(Q_FUNC_INFO); selectedLog = -1; currentLogs = new QComboBox(); logsAvailable.clear(); logsModel = new QSqlRelationalTableModel(this); logsView = new QTableView; logsView->setContextMenuPolicy(Qt::CustomContextMenu); logsView->setSortingEnabled(true); createLogsModel(); createLogsPanel(); logsView->setCurrentIndex(logsModel->index(0, 0)); lastLog = 0; //newLogPushButton = new QPushButton(tr("&New"), this); //editPushButton = new QPushButton(tr("&Edit"), this); removePushButton = new QPushButton(tr("&Remove"), this); importAwardPushButton = new QPushButton(tr("Import new")); importAwardPushButton->setToolTip(tr("Import an AWA file with the subdivision details.")); //newLogPushButton->setToolTip(tr("Add a new references file.")); //editPushButton->setToolTip(tr("Edit the selected references.")); removePushButton->setToolTip(tr("Remove the selected references.")); currentLogs->setToolTip(tr("Select the references you want to open.")); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addWidget(importAwardPushButton); //buttonsLayout->addWidget(newLogPushButton); //buttonsLayout->addWidget(editPushButton); buttonsLayout->addWidget(removePushButton); QVBoxLayout *widgetLayout = new QVBoxLayout; widgetLayout->addWidget(logsView); widgetLayout->addWidget(currentLogs); widgetLayout->addLayout(buttonsLayout); setLayout(widgetLayout); createActions(); updateSelectedLogs(); //qDebug() << "SetupPageSubdivisions::SetupPageSubdivisions - END"; } SetupPageSubdivisions::~SetupPageSubdivisions(){ //qDebug() << "SetupPageSubdivisions::~SetupPageSubdivisions"; delete(fileAwardManager); } /* void SetupPageSubdivisions::slotEditButtonClicked() { //qDebug() << "SetupPageSubdivisions::slotEditButtonClicked"; //QSqlQuery query; //int nameCol = -1; selectedLog = getSelectedLog(); QString getStationCallSignFromLog(const int _log); newLog->setEditing(true); //qDebug() << "SetupPageSubdivisions::slotEditButtonClicked"; newLog->setStationCallSign(dataProxy->getStationCallSignFromLog(selectedLog)); newLog->setOperators(dataProxy->getOperatorsFromLog(selectedLog)); newLog->setComment(dataProxy->getCommentsFromLog(selectedLog)); newLog->setDateString(dataProxy->getLogDateFromLog(selectedLog)); //newLog->setTypeN(dataProxy->getLogTypeNFromLog(selectedLog).toInt()); int result = newLog->exec(); if (result == QDialog::Accepted) { emit focusOK(); } } */ void SetupPageSubdivisions::slotRemoveButtonClicked() { //qDebug() << "SetupPageSubdivisions::slotRemoveButtonClicked"; int selectedLog = getSelectedLog(); QMessageBox::StandardButton ret; ret = QMessageBox::warning(this, tr("KLog"), tr("Do you really want to remove the data of this entity?") + "\n" + tr("All the subdivision information for this entity will be deleted..."), QMessageBox::Yes | QMessageBox::No); if (ret == QMessageBox::Yes) { //qDebug() << "SetupPageSubdivisions::slotRemoveButtonClicked (selected log to remove: " << QString::number(selectedLog) << ")"; QString stringQuery = QString("DELETE FROM logs WHERE id='%1'").arg(selectedLog); QSqlQuery query(stringQuery); bool sqlOk = query.exec(); if (sqlOk) { //qDebug() << "SetupPageSubdivisions::slotRemoveButtonClicked (REMOVED: " << QString::number(selectedLog) << ")"; logsModel->select(); updateSelectedLogs(); stringQuery = QString("DELETE FROM log WHERE lognumber='%1'").arg(selectedLog); query.exec(stringQuery); sqlOk = query.exec(); //qDebug() << "SetupPageSubdivisions::slotRemoveButtonClicked: LastQuery: " << query.lastQuery() ; if (sqlOk) { //qDebug() << "SetupPageSubdivisions::slotRemoveButtonClicked (QSOS REMOVED: " << QString::number(selectedLog) << ")"; stringQuery = QString("DELETE FROM award WHERE lognumber='%2'").arg(selectedLog); query.exec(stringQuery); sqlOk = query.exec(); //qDebug() << "SetupPageSubdivisions::slotRemoveButtonClicked: LastQuery: " << query.lastQuery() ; if (sqlOk) { //qDebug() << "SetupPageSubdivisions::slotRemoveButtonClicked (AWARDDXCC REMOVED: " << QString::number(selectedLog) << ")"; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); showError(tr("Log has not been removed. (#3)")); //qDebug() << "SetupPageSubdivisions::slotRemoveButtonClicked (AWARDDXCC NOT REMOVED: " << QString::number(selectedLog) << ")"; } } else { showError(tr("Log has not been removed. (#2)")); //qDebug() << "SetupPageSubdivisions::slotRemoveButtonClicked (QSOS NOT REMOVED: " << QString::number(selectedLog) << ")"; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); showError(tr("Log has not been removed. (#1)")); //qDebug() << "SetupPageSubdivisions::slotRemoveButtonClicked (NOT REMOVED: " << QString::number(selectedLog) << ")"; } } //ASK FOR A CONFIRMATION //DELETE ALL THE QSO IN THE REMOVED LOG } void SetupPageSubdivisions::createLogsPanel() { //qDebug() << "SetupPageSubdivisions::createLogsPanel"; logsView->setModel(logsModel); QString stringQuery = QString("SELECT * FROM primary_subdivision"); QSqlQuery query(stringQuery); QSqlRecord rec = query.record(); // Number of columns int columns = rec.count(); for (int i = 0; i < columns; i++ ){ logsView->setColumnHidden(i, true); } //columns = rec.indexOf("id"); //logsView->setColumnHidden(columns, false); logsView->setItemDelegate(new QSqlRelationalDelegate(this)); logsView->setSelectionMode( QAbstractItemView::SingleSelection); logsView->setSelectionBehavior(QAbstractItemView::SelectRows); logsView->resizeColumnsToContents(); logsView->horizontalHeader()->setStretchLastSection(true); } void SetupPageSubdivisions::createLogsModel() { //qDebug() << "SetupPageSubdivisions::createLogsModel"; QString stringQuery = QString("SELECT * FROM primary_subdivisions"); QSqlQuery q(stringQuery); QSqlRecord rec = q.record(); int nameCol; logsModel->setTable("primary_subdivisions"); nameCol = rec.indexOf("id"); logsModel->setSort(nameCol, Qt::AscendingOrder); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("ID")); nameCol = rec.indexOf("name"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Name")); nameCol = rec.indexOf("shortname"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Short Name")); nameCol = rec.indexOf("cqz"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("CQ Zone")); nameCol = rec.indexOf("ituz"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("ITU Zone")); nameCol = rec.indexOf("deleted"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Deleted")); nameCol = rec.indexOf("start_date"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Start Date")); nameCol = rec.indexOf("end_date"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("End Date")); nameCol = rec.indexOf("dxcc"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("DXCC")); logsModel->select(); } void SetupPageSubdivisions::slotLogSelected(const QModelIndex & index) { //qDebug() << "SetupPageSubdivisions::slotLogSelected" ; int row = index.row(); setSelectedLog((logsModel->index(row, 0)).data(0).toInt()); } void SetupPageSubdivisions::createActions() { //qDebug() << "SetupPageSubdivisions::createActions"; connect(currentLogs, SIGNAL(currentIndexChanged(int)), this, SLOT(slotCurrentLogsComboBoxChanged() ) ) ; connect(importAwardPushButton, SIGNAL(clicked()), this, SLOT(slotImportButtonClicked() ) ); connect(removePushButton, SIGNAL(clicked()), this, SLOT(slotRemoveButtonClicked() ) ); connect(logsView, SIGNAL(clicked(QModelIndex)), this, SLOT(slotLogSelected(QModelIndex) ) ); } QStringList SetupPageSubdivisions::readLogs() { //qDebug() << "SetupPageSubdivisions::readLogs"; QString aux, aux2; QStringList _logs; QSqlQuery query; int nameCol = -1; bool sqlOk = false; aux2.clear(); aux.clear(); _logs.clear(); aux = "SELECT DISTINCT dxcc from primary_subdivisions"; int counter = 0; sqlOk = query.exec(aux); if (sqlOk) { QSqlRecord rec = query.record(); while ( (query.next()) && (query.isValid()) ) { counter ++; aux2.clear(); nameCol = rec.indexOf("dxcc"); //aux2 = QString::number(counter) + "-"; aux2 = (query.value(nameCol)).toString() + "-" + dataProxy->getEntityNameFromId(query.value(nameCol).toInt()); //aux2.append((query.value(nameCol)).toString()); _logs.append(aux2); } return _logs; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); return _logs; } } void SetupPageSubdivisions::updateSelectedLogs() { //qDebug() << "SetupPageSubdivisions::updateSelectedLogs"; logsAvailable = readLogs(); if (logsAvailable.length()>0) { currentLogs->clear(); currentLogs->addItems(logsAvailable); } else { //qDebug() << "SetupPageSubdivisions::updateSelectedLogs Not selected (less than 1)"; currentLogs->clear(); } } int SetupPageSubdivisions::getSelectedLog() { //qDebug() << "SetupPageSubdivisions::getSelectedLog: " << currentLogs->currentText(); QString selectedLog = currentLogs->currentText(); int i = 0; QStringList qs; qs.clear(); qs << selectedLog.split("-"); i = (qs.at(0)).toInt(); //qDebug() << "SetupPageSubdivisions::getSelectedLog: " << QString::number(i); if (i>=1) { return i; } else { return 0; } } void SetupPageSubdivisions::slotCurrentLogsComboBoxChanged() { //qDebug() << "SetupPageSubdivisions::slotCurrentLogsComboBoxChanged: " << currentLogs->currentText(); QString a = (currentLogs->currentText()).section('-', 0, 0); //qDebug() << "SetupPageSubdivisions::slotCurrentLogsComboBoxChanged: a: " << a; setSelectedLog(a.toInt()); } void SetupPageSubdivisions::setSelectedLog(const int _i) { //qDebug() << "SetupPageSubdivisions::SetupPageSubdivisions::setSelectedLog: " << QString::number(_i); QString n = QString::number(_i) + "-"; int selected = currentLogs->findText(n, Qt::MatchStartsWith); if (selected >= 0) { //qDebug() << "SetupPageSubdivisions::SetupPageSubdivisions::setSelectedLog selected>=0: " << QString::number(selected); currentLogs->setCurrentIndex(selected); } else { //qDebug() << "SetupPageSubdivisions::SetupPageSubdivisions::setSelectedLog not selected"; return; } } void SetupPageSubdivisions::showError(const QString &_errorC) { QString text = QString(tr("An error has occurred showing the following error code:") + "\n'%1'").arg(_errorC); QMessageBox::warning(this, tr("KLog - SetupPageSubdivisions"), text, QMessageBox::Ok); } void SetupPageSubdivisions::slotImportButtonClicked() { //qDebug() << "SetupPageSubdivisions::slotImportButtonClicked"; if (fileAwardManager->importNewAwardFile()) { //qDebug() << "SetupPageSubdivisions::slotImportButtonClicked - OK"; } else { //qDebug() << "SetupPageSubdivisions::slotImportButtonClicked - NOK"; } //QString fileName = QFileDialog::getOpenFileName(this, tr("Open Award file"), util->getHomeDir(), tr("Award files (*.awa)")); //qDebug() << "SetupPageSubdivisions::slotImportButtonClicked - END"; } klog-2.3.3/setuppages/setuppagemisc.h0000644000015700001710000001213214542412415017536 0ustar jenkinsjenkins#ifndef KLOG_SETUPPAGES_SETUPPAGEMISC_H #define KLOG_SETUPPAGES_SETUPPAGEMISC_H /*************************************************************************** setuppagemisc.h - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include #include "../utilities.h" class SetupPageMisc : public QWidget { Q_OBJECT public: SetupPageMisc(QWidget *parent=nullptr); ~SetupPageMisc(); QString getRealTime(); void setRealTime(const QString &_t); bool getShowSeconds(); void setShowSeconds(const bool &_t); QString getUTCTime(); void setUTCTime(const QString &_t); QString getAlwaysADIF(); void setAlwaysADIF(const QString &_t); QString getDefaultFileName(); void setUseDefaultName(const QString &_t); QString getDefaultDBPath(); void setUseDefaultDBPath(const QString &_t); QString getUseDefaultName(); void setDefaultFileName(const QString &_t); //QString getInMemory(); //void setInMemory(const QString &_t); QString getImperial(); void setImperial(const QString &_t); QString getSendQSLWhenRec(); void setSendQSLWhenRec(const QString &_t); QString getShowStationCallSignInSearch(); void setShowStationCallSignInSearch(const QString &_t); //QString getKeepMyData(); //void setKeepMyData(const QString &_t); QString getCompleteWithPrevious(); void setCompleteWithPrevious(const QString &_t); QString getCheckNewVersions(); void setCheckNewVersions(const QString &_t); //void setReportInfo(const QString &_t); QString getDXMarathon(); void setDXMarathon(const QString &_t); QString getDebugLogLevel(); void setDebugLogLevel(const QString &_t); //QString getLogSort(); //void setLogSort(const QString &_t); QString getSendEQSLByDefault(); void setSetEQSLByDefault(const QString &_t); void setDeleteAlwaysAdiFile(const bool &_t); QString getDeleteAlwaysAdiFile(); bool getCheckCalls(); void setCheckCalls(const bool &_t); void setDupeTime(const int _t); int getDupeTime(); bool areDBPathChangesApplied(); void saveSettings(); void loadSettings(); private slots: void slotOpenFileButtonClicked(); void slotUseDefaultButtonStateChanged(int state); //void slotdefaultFileNameChanged(); void slotDefaultFileNameLineEditChanged(); void slotcheckNewVersionCheckBoxClicked(); void slotDBButtonClicked(); void slotDBLineEditChanged(); void slotMoveDBButtonClicked(); //void slotUDPServerCheckBoxClicked(); private: void createActions(); void createUI(); void fillDebugComboBox(); Utilities *util; QCheckBox *realTimeCheckbox, *showSecondsCheckBox, *UTCCheckbox, *alwaysADIFCheckBox, *useDefaultName, *completeWithPreviousCheckBox; QCheckBox *imperialCheckBox, *sendQSLWhenRecCheckBox, *showStationCallWhenSearchCheckBox; QCheckBox *checkNewVersionCheckBox, *provideCallCheckBox, *useDxMarathonCheckBox, *checkCallsCheckBox; //QCheckBox *logSortCheckBox; QCheckBox *sendEQSLByDefaultSearchCheckBox, *deleteAlwaysAdiFileCheckBox; QString defaultFileName; QLineEdit *defaultFileNameLineEdit, *dbPathLineEdit; QPushButton *fileNameButton, *dbPushButton, *moveDBPushButton; QLineEdit *dupeTimeLineEdit; QString klogDir, dbDirNew, dbDirCurrent; //TODO: To be removed when the defaultDir is saved in the config file QPalette palRight, palWrong; // To paint Text in red or black(normal) bool dbPathApplied; QComboBox *debugLogLevelCombo; //QWidget *bandsWidget; }; #endif // SETUPPAGEMISC_H klog-2.3.3/setuppages/setuppageworldeditor.h0000644000015700001710000000615514542412415021151 0ustar jenkinsjenkins#ifndef KLOG_SETUPPAGES_SETUPPAGEWORLDEDITOR_H #define KLOG_SETUPPAGES_SETUPPAGEWORLDEDITOR_H /*************************************************************************** setuppageworldeditor.h - description ------------------- begin : jun 2012 copyright : (C) 2012 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include #include #include #include "../world.h" #include "../dataproxy_sqlite.h" #include "../setuppages/setupentitydialog.h" #include "../utilities.h" enum { WORLD_DXCCid = 0, WORLD_Nameid = 1, WORLD_MainPrefix = 2, WORLD_CQZ = 3, WORLD_ITUZ = 4, WORLD_Cont = 5 }; class SetupPageWorldEditor : public QWidget { Q_OBJECT public: SetupPageWorldEditor(DataProxy_SQLite *dp, QWidget *parent=nullptr); ~SetupPageWorldEditor(); private slots: void slotAddButtonClicked(); void slotDelButtonClicked(); void slotEditButtonClicked(); //void slotDoubleClickEntity( const QModelIndex & index); void slotAnalyzeEntityAddedSignal(const QStringList _qs); void slotImportWorldButtonClicked(); private: World *world; Utilities *util; DataProxy_SQLite *dataProxy; void createWorldPanel(); void createWorldModel(); void createActions(); bool isWorldEmpty(); QSqlRelationalTableModel *worldModel; QWidget *worldPanel; QTableView *worldView; QTreeWidget *searchResultsTreeWidget; QPushButton *addEntityPushButton, *delEntityPushButton, *editEntityPushButton, *exportWorldPushButton, *loadWorldPushButton; SetupEntityDialog *setupEntityDialog; }; #endif // SETUPPAGEWORLDEDITOR_H klog-2.3.3/setuppages/setuppagebandmode.h0000644000015700001710000000514214542412415020357 0ustar jenkinsjenkins#ifndef KLOG_SETUPPAGES_SETUPPAGEBANDMODE_H #define KLOG_SETUPPAGES_SETUPPAGEBANDMODE_H /*************************************************************************** setuppagebandmode.h - description ------------------- begin : nov 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include "../dataproxy_sqlite.h" #include "../utilities.h" class SetupPageBandMode : public QWidget { Q_OBJECT public: SetupPageBandMode(DataProxy_SQLite *dp, QWidget *parent=nullptr); ~SetupPageBandMode(); QStringList getBands(); // 10m, 12m, 15m QStringList getModes(); //ssb, CW void setActiveBands(QStringList q); void setActiveModes(QStringList q); void saveSettings(); signals: public slots: private: void addBands(QStringList _b); // read the available bands from the DB void addModes(QStringList _b); // read the available modes from the DB QListWidget *bandsListWidget, *modesListWidget; DataProxy_SQLite *dataProxy; Utilities *util; }; #endif // SETUPPAGEBANDMODE_H klog-2.3.3/setuppages/setuppagesubdivisions.h0000644000015700001710000001121714542412415021327 0ustar jenkinsjenkins#ifndef KLOG_SETUPPAGES_SETUPPAGESUBDIVISION_H #define KLOG_SETUPPAGES_SETUPPAGESUBDIVISION_H /*************************************************************************** setuppagesubdivision.h - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include #include #include #include "../dataproxy_sqlite.h" #include "../fileawardmanager.h" class SetupPageSubdivisions : public QWidget { Q_OBJECT public: SetupPageSubdivisions(DataProxy_SQLite *dp, QWidget *parent=nullptr); ~SetupPageSubdivisions(); int getSelectedLog(); void setSelectedLog(const int _i); void createNewLog(); void setDefaultStationCallsign (const QString &_p); void setDefaultOperators(const QString &_p); private slots: //void slotNewButtonClicked(); //void slotEditButtonClicked(); void slotRemoveButtonClicked(); //void slotAnalyzeNewLogData(const QStringList _qs); void slotLogSelected(const QModelIndex & index); //void slotLogDoubleClicked(const QModelIndex & index); void slotCurrentLogsComboBoxChanged(); void slotImportButtonClicked(); //void slotCreateLog(); // signals: //void exitSignal(const int status); // 1 = OK, -1 = NOK, 2 = Cancel clicked //void newLogData(const QStringList _qs); // Station QRZ + Operators to be shown in the main tab void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution void focusOK(); private: FileAwardManager *fileAwardManager; QStringList readLogs(); void createLogsPanel(); void createLogsModel(); void createActions(); //bool addNewLog(const QStringList _qs); void updateSelectedLogs(); //void readSelectedLog(const int _i); void showError(const QString &_errorC); /* Wizard to create a new log*/ //QWizardPage *createLogTypePage(); //QWizard *newLogWizard; // Wizard to create a new log /*^Wizard to create a new log^*/ QSqlRelationalTableModel *logsModel; QWidget *logsPanel; QTableView *logsView; QAbstractButton *finishButton; //QWidget *logsWidget; //QTreeWidget *logsQTreeWidget; //QListWidget *bandsNotActiveListWidget, *bandsActiveListWidget; //QListWidget *modesNotActiveListWidget, *modesActiveListWidget; //QStringList bands, modes; QPushButton *removePushButton; //*editPushButton, *newLogPushButton, QPushButton *importAwardPushButton; //*loadAllPushButton, *loadSelectedPushButton, *clearPushButton,; int lastLog; QString currentLogComment; QString currentStationCallSign; QComboBox *currentLogs; QStringList logsAvailable; //SetupPageSubdivisionNew *newLog; //QString stationCallsign, operators, comment, dateString;//, typeContest; //int contestCatMode, contestCatOperators, contestCatAssisted, contestCatPower, contestCatBands, contestBands;//, typeContestN; DataProxy_SQLite *dataProxy; //Utilities *util; int selectedLog; //QString defaultStationCallSign, defaultOperators; }; #endif // SETUPPAGEREGIONALAWARDS_H klog-2.3.3/setuppages/setuppagecolors.h0000644000015700001710000000737714542412415020123 0ustar jenkinsjenkins#ifndef KLOG_SETUPPAGES_SETUPPAGECOLORS_H #define KLOG_SETUPPAGES_SETUPPAGECOLORS_H /*************************************************************************** setuppagecolors.h - description ------------------- begin : nov 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include //#include #include #include "../utilities.h" class SetupPageColors : public QWidget { Q_OBJECT public: SetupPageColors(QWidget *parent=0); ~SetupPageColors(); QString getNewOneColor(); QString getNeededColor(); QString getWorkedColor(); QString getConfirmedColor(); QString getDefaultColor(); QString getDarkMode(); void setNewOneColor(const QString &_c); void setNeededColor(const QString &_c); void setWorkedColor(const QString &_c); void setConfirmedColor(const QString &_c); void setDefaultColor(const QString &_c); void setDarkMode(const bool _d); void saveSettings(); void loadSettings(); void loadDarkMode(); // Reads the config to setup the DarkMode private slots: void slotNewOneColorButtonClicked(); void slotConfirmedColorButtonClicked(); void slotWorkedColorButtonClicked(); void slotNeededColorButtonClicked(); void slotDefaultColorButtonClicked(); void slotWSJTXButtonClicked(); void slotKLogButtonClicked(); void slotSetDarkMode(); private: Utilities *util; bool darkMode; void setDefaultColors(); void setWSJTXColors(); QColor giveColor (QColor c); QPalette palette; QPushButton *newOneColorButton; // In ANY band QPushButton *neededColorButton; // In this band QPushButton *workedColorButton; // In this band QPushButton *confirmedColorButton; // In this band QPushButton *defaultColorButton; // In this band QPushButton *wsjtxColorButton; // In this band QPushButton *klogColorButton; // In this band QPushButton *darkModeButton; QColor color; /* 0 - New one. 1 - Worked but not confirmed: New one in this band. 2 - Worked but not confirmed: Worked in this band. 3 - Confirmed: New one in this band. 4 - Confirmed: Worked in this band. 5 - Confirmed: Confirmed in this band. */ }; #endif // SETUPPAGECOLORS_H klog-2.3.3/setuppages/setuppagemisc.cpp0000644000015700001710000006305214542412415020100 0ustar jenkinsjenkins/*************************************************************************** setuppagemisc.cpp - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include "setuppagemisc.h" //TODO: The defaultFileName QString can be removed and used the content of defaultFileNameLineEdit // instead. It is easy to change but the code would not be so clear... Think about this. :-) SetupPageMisc::SetupPageMisc(QWidget *parent) : QWidget(parent){ //qDebug() << "SetupPageMisc::SetupPageMisc"; util = new Utilities(Q_FUNC_INFO); checkCallsCheckBox = new QCheckBox(tr("Check non-valid calls"), this); imperialCheckBox = new QCheckBox(tr("&Imperial system"), this); realTimeCheckbox = new QCheckBox(tr("&Log in real time"), this); showSecondsCheckBox = new QCheckBox(tr("Show seconds"), this); UTCCheckbox = new QCheckBox(tr("&Time in UTC"), this); alwaysADIFCheckBox = new QCheckBox(tr("&Save ADIF on exit"), this); useDefaultName = new QCheckBox(tr("Use this &default filename"), this); sendQSLWhenRecCheckBox = new QCheckBox(tr("Mark &QSO to send QSL when QSL is received"), this); completeWithPreviousCheckBox = new QCheckBox(tr("Complete QSO with previous data")); showStationCallWhenSearchCheckBox = new QCheckBox(tr("Show the Station &Callsign used in the search box"), this); //keepMyDataCheckBox = new QCheckBox(tr("&Reset to My Data for all QSOs"), this); checkNewVersionCheckBox = new QCheckBox(tr("&Check for new versions automatically"), this); //provideCallCheckBox = new QCheckBox(tr("&Provide Info for statistics"), this); useDxMarathonCheckBox = new QCheckBox(tr("Manage DX-Marathon"), this); //logSortCheckBox = new QCheckBox(tr("Sort log based in date && time")); sendEQSLByDefaultSearchCheckBox = new QCheckBox(tr("Mark sent eQSL && LoTW in new QSO as queued")); deleteAlwaysAdiFileCheckBox = new QCheckBox(tr("&Delete always temp ADIF file after uploading QSOs")); debugLogLevelCombo = new QComboBox; dupeTimeLineEdit = new QLineEdit; defaultFileNameLineEdit = new QLineEdit; dbPathLineEdit = new QLineEdit; fileNameButton = new QPushButton (tr("Browse")); dbPushButton = new QPushButton (tr("Browse")); moveDBPushButton = new QPushButton(tr("Move DB")); dbPathApplied = true; createUI(); createActions(); if (areDBPathChangesApplied()) { moveDBPushButton->setEnabled(false); } else { moveDBPushButton->setEnabled(true); } //qDebug() << "SetupPageMisc::SetupPageMisc - END"; } SetupPageMisc::~SetupPageMisc(){ delete(util); //qDebug() << "SetupPageMisc::~SetupPageMisc"; } void SetupPageMisc::createUI() { dupeTimeLineEdit->setInputMask("0000000"); dupeTimeLineEdit->setToolTip(tr("In seconds, enter the time range to consider a duplicate if same call, band and mode is entered.")); palWrong.setColor(QPalette::Text, Qt::red); palRight.setColor(QPalette::Text, Qt::black); //TODO: To be removed when the defaultDir is saved in the config file #ifdef Q_OS_WIN //qDebug() << "WINDOWS DETECTED!" ; klogDir = util->getHomeDir(); // We create the \klog for the logs and data defaultFileName = klogDir+"/klog.adi"; #else //qDebug() << "NO WINDOWS DETECTED!" ; klogDir = util->getHomeDir(); // We create the ~/.klog for the logs and data defaultFileName = klogDir+"/klog.adi"; #endif dbDirNew = klogDir; // The new path where the DB is to be moved dbDirCurrent = dbDirNew; // The path where the DB is hosted showSecondsCheckBox->setToolTip (tr("Show seconds in the QSO editor")); showSecondsCheckBox->setChecked (true); showSecondsCheckBox->setEnabled (true); defaultFileNameLineEdit->setReadOnly(false); defaultFileNameLineEdit->setText(defaultFileName); defaultFileNameLineEdit->setEnabled(false); dbPathLineEdit->setReadOnly(false); dbPathLineEdit->setText(dbDirCurrent); dbPathLineEdit->setEnabled(true); useDefaultName->setChecked(true); alwaysADIFCheckBox->setChecked(true); showStationCallWhenSearchCheckBox->setChecked(true); //keepMyDataCheckBox->setChecked(true); completeWithPreviousCheckBox->setChecked(false); debugLogLevelCombo->setCurrentIndex (0); UTCCheckbox->setChecked(true); realTimeCheckbox->setChecked(true); //logSortCheckBox->setChecked(false); defaultFileNameLineEdit->setEnabled(true); fileNameButton->setEnabled(true); dupeTimeLineEdit->setText("300"); checkCallsCheckBox->setEnabled (true); checkCallsCheckBox->setChecked (true); checkCallsCheckBox->setToolTip (tr("If you disable this checkbox KLog will not check callsigns to identify wrong callsigns.")); sendQSLWhenRecCheckBox->setToolTip(tr("QSOs will be marked as pending to send a QSL if you receive the DX QSL and have not sent yours.")); showStationCallWhenSearchCheckBox->setToolTip(tr("The search box will also show the callsign on the air to do the QSO.")); //keepMyDataCheckBox->setToolTip(tr("All the data from the My Data tab will be used or data from the previous QSO will be maintained.")); checkNewVersionCheckBox->setToolTip(tr("Check if there is a new release of KLog available every time you start KLog.")); //provideCallCheckBox->setToolTip(tr("If new version checking is selected, KLog will send the developer your callsign, KLog version and Operating system to help in improving KLog.")); imperialCheckBox ->setToolTip(tr("Check it for Imperial system (Miles instead of Kilometers).")); realTimeCheckbox->setToolTip(tr("Select to use real time.")); UTCCheckbox->setToolTip(tr("Select to use UTC time.")); alwaysADIFCheckBox->setToolTip(tr("Select if you want to save to ADIF on exit.")); useDefaultName->setToolTip(tr("Select to use the following name for the logfile without being asked for it again.")); completeWithPreviousCheckBox->setToolTip(tr("Complete the current QSO with previous QSO data.")); useDxMarathonCheckBox->setToolTip(tr("Select if you want to manage DX-Marathon.")); defaultFileNameLineEdit->setToolTip(tr("This is the default file where ADIF data will be saved.")); dbPathLineEdit->setToolTip(tr("This is the directory where the database (logbook.dat) will be saved.")); fileNameButton->setToolTip(tr("Click to change the default ADIF file.")); dbPushButton->setToolTip(tr("Click to change the path of the database.")); moveDBPushButton->setToolTip(tr("Click to move the DB to the new directory.")); debugLogLevelCombo->setToolTip(tr("Select the application debug log level. This may be useful if something is not working as expected. A debug file will be created in the KLog directory and/or shown with Help->Debug menu.")); //logSortCheckBox->setToolTip(tr("Click to enable that log will be sorted based on date and time when clicking on the date column. It may be a little bit slower.")); sendEQSLByDefaultSearchCheckBox->setToolTip(tr("Click to mark as Queued (to be sent) all the eQSL (LoTW and eQSL) in all the new QSO by default.")); deleteAlwaysAdiFileCheckBox->setToolTip(tr("Delete Always the adif file created after uploading QSOs")); fillDebugComboBox(); QHBoxLayout *fileLayout = new QHBoxLayout; fileLayout->addWidget(useDefaultName); fileLayout->addWidget(defaultFileNameLineEdit); fileLayout->addWidget(fileNameButton); QHBoxLayout *dbLayout = new QHBoxLayout; dbLayout->addWidget(dbPathLineEdit); dbLayout->addWidget(dbPushButton); dbLayout->addWidget(moveDBPushButton); QLabel *logLevelLabel = new QLabel; logLevelLabel->setText(tr("Log level")); QHBoxLayout *logLevelLayout = new QHBoxLayout; logLevelLayout->addWidget(logLevelLabel); logLevelLayout->addWidget(debugLogLevelCombo); QLabel *timeRangeLabel = new QLabel; timeRangeLabel->setText(tr("Dupe time range:")); QHBoxLayout *timeRangeLayout = new QHBoxLayout; timeRangeLayout->addWidget(timeRangeLabel); timeRangeLayout->addWidget(dupeTimeLineEdit); QHBoxLayout *timeLayout = new QHBoxLayout; timeLayout->addWidget (realTimeCheckbox); timeLayout->addWidget (showSecondsCheckBox); QGridLayout *mainLayout = new QGridLayout; mainLayout->addLayout(fileLayout, 0, 0, 1, -1); mainLayout->addLayout(dbLayout, 1, 0, 1, -1); mainLayout->addWidget(alwaysADIFCheckBox, 2, 0, 1, 1); mainLayout->addLayout(logLevelLayout, 2, 1, 1, 1); mainLayout->addWidget(UTCCheckbox, 3, 0, 1, 1); //mainLayout->addWidget(realTimeCheckbox, 3, 1, 1, 1); mainLayout->addLayout(timeLayout, 3, 1, 1, 1); mainLayout->addWidget(imperialCheckBox, 4, 0, 1, 1); mainLayout->addWidget(useDxMarathonCheckBox, 4, 1, 1, 1); mainLayout->addLayout(timeRangeLayout, 5, 0, 1, 1); mainLayout->addWidget(completeWithPreviousCheckBox, 5, 1, 1, 1); mainLayout->addWidget(sendQSLWhenRecCheckBox,6, 0, 1, 1); mainLayout->addWidget(sendEQSLByDefaultSearchCheckBox, 6, 1, 1, 1); mainLayout->addWidget(checkNewVersionCheckBox, 7, 0, 1, 1); //mainLayout->addWidget(provideCallCheckBox, 7, 1, 1, 1); //mainLayout->addWidget(logSortCheckBox, 8, 0, 1, 1); mainLayout->addWidget(showStationCallWhenSearchCheckBox, 8, 0, 1, 1); mainLayout->addWidget(deleteAlwaysAdiFileCheckBox, 8, 1, 1, 1); mainLayout->addWidget (checkCallsCheckBox, 9, 0, 1, 1); setLayout(mainLayout); } void SetupPageMisc::fillDebugComboBox() { debugLogLevelCombo->addItems(util->getDebugLevels()); debugLogLevelCombo->setCurrentIndex(0); } void SetupPageMisc::createActions(){ //void itemDoubleClicked ( QListWidgetItem * item ) connect(fileNameButton, SIGNAL(clicked() ), this, SLOT(slotOpenFileButtonClicked() ) ); connect(useDefaultName, SIGNAL(stateChanged(int) ), this, SLOT(slotUseDefaultButtonStateChanged(int) ) ); connect(defaultFileNameLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotDefaultFileNameLineEditChanged() ) ); connect(checkNewVersionCheckBox, SIGNAL(clicked() ), this, SLOT(slotcheckNewVersionCheckBoxClicked() ) ); connect(dbPushButton, SIGNAL(clicked() ), this, SLOT(slotDBButtonClicked() ) ); connect(dbPathLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotDBLineEditChanged() ) ); connect(moveDBPushButton, SIGNAL(clicked() ), this, SLOT(slotMoveDBButtonClicked() ) ); //connect(UDPServerCheckBox, SIGNAL(clicked () ), this, SLOT(slotUDPServerCheckBoxClicked() ) ); } void SetupPageMisc::setDeleteAlwaysAdiFile(const bool &_t){ deleteAlwaysAdiFileCheckBox->setChecked(_t); //qDebug() << "SetupPageMisc::setDeleteAlwaysAdiFile - DELETEALWAYSADIFILE = " << _t; } QString SetupPageMisc::getDeleteAlwaysAdiFile(){ return util->boolToQString(deleteAlwaysAdiFileCheckBox->isChecked()); } QString SetupPageMisc::getSendEQSLByDefault(){ return util->boolToQString(sendEQSLByDefaultSearchCheckBox->isChecked()); } void SetupPageMisc::setSetEQSLByDefault(const QString &_t){ sendEQSLByDefaultSearchCheckBox->setChecked(util->trueOrFalse(_t)); } QString SetupPageMisc::getRealTime(){ return util->boolToQString(realTimeCheckbox->isChecked()); } void SetupPageMisc::setRealTime(const QString &_t) { realTimeCheckbox->setChecked(util->trueOrFalse(_t)); } bool SetupPageMisc::getShowSeconds() { return showSecondsCheckBox->isChecked (); } void SetupPageMisc::setShowSeconds(const bool &_t) { showSecondsCheckBox->setChecked (_t); } QString SetupPageMisc::getUTCTime(){ return util->boolToQString(UTCCheckbox->isChecked()); } void SetupPageMisc::setUTCTime(const QString &_t) { UTCCheckbox->setChecked(util->trueOrFalse(_t)); } QString SetupPageMisc::getAlwaysADIF() { return util->boolToQString(alwaysADIFCheckBox->isChecked()); } void SetupPageMisc::setAlwaysADIF(const QString &_t) { // Defaul value is false alwaysADIFCheckBox->setChecked(util->trueOrFalse(_t)); } QString SetupPageMisc::getDefaultFileName() { return defaultFileName; } void SetupPageMisc::setDefaultFileName(const QString &_t) { //qDebug() << "SetupPageMisc::setDefaultFileName: " << _t; if (_t.length ()<1) { defaultFileName = util->getDebugLogFile (); } else { defaultFileName = _t; } defaultFileNameLineEdit->setText(defaultFileName); } void SetupPageMisc::slotOpenFileButtonClicked() { defaultFileName = QFileDialog::getOpenFileName(this, tr("Open File"), klogDir, "ADIF (*.adi)"); defaultFileNameLineEdit->setText(defaultFileName); } void SetupPageMisc::slotDefaultFileNameLineEditChanged() { //setDefaultFileName(); defaultFileName = defaultFileNameLineEdit->text(); } QString SetupPageMisc::getUseDefaultName() { return util->boolToQString(useDefaultName->isChecked()); } void SetupPageMisc::setUseDefaultName(const QString &_t) { useDefaultName->setChecked(util->trueOrFalse(_t)); } QString SetupPageMisc::getImperial() { return util->boolToQString(imperialCheckBox->isChecked()); } void SetupPageMisc::setImperial(const QString &_t) { imperialCheckBox->setChecked(util->trueOrFalse(_t)); } void SetupPageMisc::slotUseDefaultButtonStateChanged(int state) { //qDebug() << "SetupPageMisc::slotUseDefaultButtonStateChanged"; if (state) { defaultFileNameLineEdit->setEnabled(true); moveDBPushButton->setEnabled(true); } else { defaultFileNameLineEdit->setEnabled(false); moveDBPushButton->setEnabled(false); } } QString SetupPageMisc::getSendQSLWhenRec() { return util->boolToQString(sendQSLWhenRecCheckBox->isChecked()); } void SetupPageMisc::setSendQSLWhenRec(const QString &_t) { sendQSLWhenRecCheckBox->setChecked(util->trueOrFalse(_t)); } QString SetupPageMisc::getShowStationCallSignInSearch() { return util->boolToQString(showStationCallWhenSearchCheckBox->isChecked()); } void SetupPageMisc::setShowStationCallSignInSearch(const QString &_t) { showStationCallWhenSearchCheckBox->setChecked(util->trueOrFalse(_t)); } /* QString SetupPageMisc::getKeepMyData() { return util->boolToQString(keepMyDataCheckBox->isChecked()); } void SetupPageMisc::setKeepMyData(const QString &_t) { keepMyDataCheckBox->setChecked(util->trueOrFalse(_t)); } */ QString SetupPageMisc::getCompleteWithPrevious() { return util->boolToQString(completeWithPreviousCheckBox->isChecked()); } void SetupPageMisc::setCompleteWithPrevious(const QString &_t) { completeWithPreviousCheckBox->setChecked(util->trueOrFalse(_t)); } void SetupPageMisc::slotcheckNewVersionCheckBoxClicked() { if (checkNewVersionCheckBox->isChecked()) { //provideCallCheckBox->setEnabled(true); } else { //provideCallCheckBox->setEnabled(false); //provideCallCheckBox->setChecked(false); } } QString SetupPageMisc::getCheckNewVersions() { return util->boolToQString(checkNewVersionCheckBox->isChecked()); } void SetupPageMisc::setCheckNewVersions(const QString &_t) { checkNewVersionCheckBox->setChecked(util->trueOrFalse(_t)); } QString SetupPageMisc::getDefaultDBPath() { return dbDirCurrent; } void SetupPageMisc::setUseDefaultDBPath(const QString &_t) { if (_t.isEmpty ()) { dbDirCurrent = util->getHomeDir(); } else { dbDirCurrent = _t; } dbPathLineEdit->setText(dbDirCurrent); } QString SetupPageMisc::getDXMarathon(){ return util->boolToQString(useDxMarathonCheckBox->isChecked()); } void SetupPageMisc::setDXMarathon(const QString &_t){ //QString st = t; useDxMarathonCheckBox->setChecked(util->trueOrFalse(_t)); } QString SetupPageMisc::getDebugLogLevel() { return debugLogLevelCombo->currentText (); } void SetupPageMisc::setDebugLogLevel(const QString &_t) { if (util->isValidLogLevel(_t)) debugLogLevelCombo->setCurrentIndex(debugLogLevelCombo->findText(_t, Qt::MatchCaseSensitive)); else debugLogLevelCombo->setCurrentIndex(0); } void SetupPageMisc::slotDBButtonClicked() { // QString dbDirBack = dbDir; QString dir = QFileDialog::getExistingDirectory(this, tr("Select Directory"), dbDirCurrent, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); if (dir.length()>=1) { dbDirNew = dir; } dbPathLineEdit->setText(dbDirNew); if (dbDirCurrent == dbDirNew) { dbPathApplied = true; } else { dbPathApplied = false; moveDBPushButton->setEnabled(true); } //setUseDefaultDBPath(dbDirNew); } void SetupPageMisc::slotDBLineEditChanged() { //qDebug() << "SetupPageMisc::slotDBLineEditChanged: " << dbPathLineEdit->text(); QString aux; aux = dbPathLineEdit->text(); if ( QFile::exists(aux) ) { dbPathLineEdit->setToolTip(tr("This is the directory where DB (logbook.dat) will be saved.")); dbPathLineEdit->setPalette(palRight); dbDirNew = dbPathLineEdit->text(); } else { dbPathLineEdit->setToolTip(tr("Please specify an existing directory where the database (logbook.dat) will be saved.")); dbPathLineEdit->setPalette(palWrong); } if (dbDirCurrent == dbDirNew) { dbPathApplied = true; moveDBPushButton->setEnabled(false); } else { dbPathApplied = false; moveDBPushButton->setEnabled(true); } } void SetupPageMisc::slotMoveDBButtonClicked() { QString source = dbDirCurrent + "/logbook.dat"; QString target = dbDirNew + "/logbook.dat"; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - Move DB")); //qDebug() << "SetupPageMisc::slotMoveDBButtonClicked (source): " << source; //qDebug() << "SetupPageMisc::slotMoveDBButtonClicked (target): " << target; if ( QFile::exists(dbDirNew) ) { if (QFile::exists(target)) { //qDebug() << "SetupPageMisc::slotMoveDBButtonClicked (target EXISTS): " << target; } if (QFile::copy(source, target)) { dbDirCurrent = dbDirNew; if (QFile::remove(source)) { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("File moved")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); dbPathApplied = true; } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("File copied")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); dbPathApplied = true; } } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); if (QFile::exists(target)) { //qDebug() << "SetupPageMisc::slotMoveDBButtonClicked (target EXISTS): " << target; msgBox.setText(tr("File already exist.")); msgBox.setDetailedText(tr("The destination file already exist and KLog will not replace it. Please remove the file from the destination folder before moving the file with KLog to make sure KLog can copy the file.")); dbPathApplied = true; } else { msgBox.setText(tr("File NOT copied")); msgBox.setDetailedText(tr("The file was not copied due to an unknown problem.")); dbPathApplied = false; } msgBox.exec(); moveDBPushButton->setEnabled(true); } } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("The target directory does not exist. Please select an existing directory.")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); dbPathApplied = false; moveDBPushButton->setEnabled(true); } } bool SetupPageMisc::areDBPathChangesApplied() { return dbPathApplied; } void SetupPageMisc::setDupeTime(const int _t) { dupeTimeLineEdit->setText(QString::number(_t)); } int SetupPageMisc::getDupeTime() { return dupeTimeLineEdit->text().toInt(); } bool SetupPageMisc::getCheckCalls() { return checkCallsCheckBox->isChecked (); } void SetupPageMisc::setCheckCalls(const bool &_t) { checkCallsCheckBox->setChecked (_t); } void SetupPageMisc::saveSettings() { //qDebug() << Q_FUNC_INFO ; QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("Misc"); settings.setValue ("RealTime", QVariant((realTimeCheckbox->isChecked()))); settings.setValue ("ShowSeconds", QVariant((showSecondsCheckBox->isChecked()))); settings.setValue ("UTCTime", QVariant((UTCCheckbox->isChecked()))); settings.setValue ("AlwaysADIF", QVariant((alwaysADIFCheckBox->isChecked()))); settings.setValue ("UseDefaultName", QVariant((useDefaultName->isChecked()))); settings.setValue ("DefaultADIFFile", defaultFileName); settings.setValue ("DBPath", dbDirCurrent); settings.setValue ("ImperialSystem", QVariant((imperialCheckBox->isChecked()))); settings.setValue ("SendQSLWhenRec", QVariant((sendQSLWhenRecCheckBox->isChecked()))); settings.setValue ("ShowCallsignInSearch", QVariant((showStationCallWhenSearchCheckBox->isChecked()))); settings.setValue ("CompleteWithPrevious", QVariant((completeWithPreviousCheckBox->isChecked()))); settings.setValue ("CheckNewVersions", QVariant((checkNewVersionCheckBox->isChecked()))); settings.setValue ("ManageDXMarathon", QVariant((useDxMarathonCheckBox->isChecked()))); settings.setValue ("DebugLog", debugLogLevelCombo->currentText ()); settings.setValue ("SendEQSLByDefault", QVariant((sendEQSLByDefaultSearchCheckBox->isChecked()))); settings.setValue ("DeleteAlwaysAdiFile", QVariant((deleteAlwaysAdiFileCheckBox->isChecked()))); settings.setValue ("CheckValidCalls", QVariant((checkCallsCheckBox->isChecked()))); settings.setValue ("DuplicatedQSOSlot", dupeTimeLineEdit->text()); //settings.setValue ("ProvideInfo", QVariant((provideCallCheckBox->isChecked()))); //stream << "PSTRotatorActive=" << interfacesWindowsPage->getSendToPSTRotator() << ";"; //stream << "PSTRotatorServer=" << interfacesWindowsPage->getPSTRotatorUDPServer() << ";"; //stream << "PSTRotatorPort=" << interfacesWindowsPage->getPSTRotatorUDPServerPort() << ";"; settings.endGroup (); } void SetupPageMisc::loadSettings() { QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("Misc"); realTimeCheckbox->setChecked (settings.value("RealTime").toBool ()); showSecondsCheckBox->setChecked (settings.value("ShowSeconds").toBool ()); UTCCheckbox->setChecked (settings.value("UTCTime").toBool ()); alwaysADIFCheckBox->setChecked (settings.value("AlwaysADIF").toBool ()); useDefaultName->setChecked (settings.value("UseDefaultName").toBool ()); imperialCheckBox->setChecked (settings.value("ImperialSystem").toBool ()); sendQSLWhenRecCheckBox->setChecked (settings.value("SendQSLWhenRec").toBool ()); showStationCallWhenSearchCheckBox->setChecked (settings.value("ShowCallsignInSearch").toBool ()); completeWithPreviousCheckBox->setChecked (settings.value("CompleteWithPrevious").toBool ()); checkNewVersionCheckBox->setChecked (settings.value("CheckNewVersions").toBool ()); useDxMarathonCheckBox->setChecked (settings.value("ManageDXMarathon").toBool ()); sendEQSLByDefaultSearchCheckBox->setChecked (settings.value("SendEQSLByDefault").toBool ()); deleteAlwaysAdiFileCheckBox->setChecked (settings.value("DeleteAlwaysAdiFile").toBool ()); checkCallsCheckBox->setChecked (settings.value("CheckValidCalls").toBool ()); //provideCallCheckBox->setChecked (settings.value("ProvideInfo").toBool ()); setDefaultFileName(settings.value("DefaultADIFFile").toString ()); setUseDefaultDBPath(settings.value("DBPath").toString ()); setDebugLogLevel(settings.value("DebugLog").toString ()); dupeTimeLineEdit->setText (settings.value("DuplicatedQSOSlot").toString ()); settings.endGroup (); } klog-2.3.3/setuppages/setuppagehamlib.cpp0000644000015700001710000003575114542412415020406 0ustar jenkinsjenkins/*************************************************************************** setuppagehamlib.cpp - description ------------------- begin : feb 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "setuppagehamlib.h" SetupPageHamLib::SetupPageHamLib(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { Q_UNUSED(dp); //qDebug << Q_FUNC_INFO ; hamlibTestOK = false; hamlib = new HamLibClass(); activateHamlibCheckBox = new QCheckBox(); readOnlyModeCheckBox = new QCheckBox(); tabWidget = new QTabWidget; serialConfigWidget = new HamLibSerialConfigWidget; networkConfigWidget = new HamLibNetworkConfigWidget; testHamlibPushButton = new QPushButton(); rigTypeComboBox = new QComboBox; pollIntervalQSpinBox = new QSpinBox; createUI(); setDefaults(); //qDebug << Q_FUNC_INFO << " - END" ; } void SetupPageHamLib::stopHamlib () { hamlib->stop(); } void SetupPageHamLib::slotTestHamlib() { //qDebug << Q_FUNC_INFO; hamlib->stop (); if ((rigTypeComboBox->currentText ().contains ("NET rigctl")) || (rigTypeComboBox->currentText ().contains ("FLRig"))) { //qDebug << Q_FUNC_INFO << " - FLRig/NetRig"; hamlib->setNetworkPort (networkConfigWidget->getPort ()); hamlib->setNetworkAddress (networkConfigWidget->getAddress ()); } else { //qDebug << Q_FUNC_INFO << " - Serial rig"; hamlib->setPort (serialConfigWidget->getSerialPort ()); hamlib->setSpeed (serialConfigWidget->getSerialBauds ()); hamlib->setParity(serialConfigWidget->getParity ()); hamlib->setFlow(serialConfigWidget->getFlowControl ()); hamlib->setStop(serialConfigWidget->getStopBits ()); //qDebug << Q_FUNC_INFO << " - 50"; hamlib->setDataBits(serialConfigWidget->getDataBits ()); //qDebug << Q_FUNC_INFO << " - 51"; } hamlib->setModelId (hamlib->getModelIdFromName (rigTypeComboBox->currentText ())); hamlib->setPoll (2000); //qDebug << Q_FUNC_INFO << " - Calling hamlib->init"; setTestResult (hamlib->init(true)); //qDebug << Q_FUNC_INFO << " - END"; } void SetupPageHamLib::setTestResult(const bool _ok) { //qDebug << Q_FUNC_INFO ; QPalette pal = testHamlibPushButton->palette(); if (_ok ) { //qDebug << Q_FUNC_INFO << " - OK"; testHamlibPushButton->setText (tr("Test: OK")); pal.setColor(QPalette::Button, QColor(Qt::green)); activateHamlibCheckBox->setEnabled (true); //qDebug << Q_FUNC_INFO << " - before reading freq"; //double freq = hamlib->getFrequency (); //qDebug << Q_FUNC_INFO << " - after reading freq"; //dataFromRigLineEdit->setText (QString::number(freq)); } else { //qDebug << Q_FUNC_INFO << " - NOK"; testHamlibPushButton->setText (tr("Test: NOK")); pal.setColor(QPalette::Button, QColor(Qt::red)); activateHamlibCheckBox->setChecked (false); activateHamlibCheckBox->setEnabled (false); } testHamlibPushButton->setPalette(pal); testHamlibPushButton->update(); //qDebug << Q_FUNC_INFO << " - NOK END"; } void SetupPageHamLib::slotRadioComboBoxChanged(QString _r) { //qDebug << Q_FUNC_INFO << ": " << _r; if (_r == "NET rigctl") { rigctlport = 4532; networkConfigWidget->setPort (rigctlport); tabWidget->setCurrentWidget (networkConfigWidget); //qDebug << Q_FUNC_INFO << ": Network radio found!" ; networkRadio = true; } else if (_r == "FLRig") { rigctlport = 12345; networkConfigWidget->setPort (rigctlport); tabWidget->setCurrentWidget (networkConfigWidget); //qDebug << Q_FUNC_INFO << ": Network radio found!" ; networkRadio = true; } else { tabWidget->setCurrentWidget (serialConfigWidget); networkRadio = false; } setTestResult(false); } void SetupPageHamLib::createUI() { pollMax = 10000; pollMin = 10; pollIntervalQSpinBox->setRange(pollMin, pollMax); pollIntervalQSpinBox->setValue (200); //qDebug << Q_FUNC_INFO << " - 0"; serialConfigWidget->createUI(); //qDebug << Q_FUNC_INFO << " - 1"; networkConfigWidget->createUI(); //qDebug << Q_FUNC_INFO << " - 2"; activateHamlibCheckBox->setText(tr("Activate HamLib")); activateHamlibCheckBox->setToolTip(tr("Activates the hamlib support that will enable the connection to a radio.")); readOnlyModeCheckBox->setText(tr("Read-Only mode")); readOnlyModeCheckBox->setToolTip(tr("If enabled, the KLog will read Freq/Mode from the radio but will never send any command to the radio.")); testHamlibPushButton->setText (tr("Test")); testHamlibPushButton->setToolTip (tr("Click to test the connection to the radio")); setRig(); QString pollTip = QString(tr("Defines the interval to poll the radio in msecs.")); pollIntervalQSpinBox->setToolTip(pollTip); //qDebug << Q_FUNC_INFO << " - 13"; //showDebugLog->setMinimum(pollMin); //qDebug << Q_FUNC_INFO << " - 14"; //showDebugLog->setMaximum(pollMax); //qDebug << Q_FUNC_INFO << " - 15"; QLabel *pollIntervalLabel = new QLabel(tr("Poll interval")); pollIntervalLabel->setBuddy(rigTypeComboBox); pollIntervalLabel->setToolTip(pollTip); pollIntervalLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); pollIntervalLabel->setEnabled(true); QHBoxLayout *pollIntervalLayout = new QHBoxLayout; pollIntervalLayout->addWidget(pollIntervalLabel); pollIntervalLayout->addWidget(pollIntervalQSpinBox); //qDebug << Q_FUNC_INFO << " - 24"; QLabel *rigTypeLabel = new QLabel(tr("Radio")); rigTypeLabel->setBuddy(rigTypeComboBox); rigTypeLabel->setToolTip(tr("Select your rig.")); rigTypeLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); rigTypeLabel->setEnabled(true); //qDebug << Q_FUNC_INFO << " - 25"; QHBoxLayout *radioLayout = new QHBoxLayout; radioLayout->addWidget (rigTypeLabel); radioLayout->addWidget (rigTypeComboBox); radioLayout->addLayout (pollIntervalLayout); radioLayout->addWidget (testHamlibPushButton); //radioLayout->addWidget (dataFromRigLineEdit); //qDebug << Q_FUNC_INFO << " - 30"; QHBoxLayout *checkBoxLayout = new QHBoxLayout; checkBoxLayout->addWidget(activateHamlibCheckBox); checkBoxLayout->addWidget(readOnlyModeCheckBox); //qDebug << Q_FUNC_INFO << " - 35"; tabWidget->addTab (serialConfigWidget, tr("Serial")); tabWidget->addTab (networkConfigWidget, tr("Network")); QGridLayout *mLayout = new QGridLayout; //QVBoxLayout *mLayout = new QVBoxLayout; mLayout->addLayout(checkBoxLayout, 0, 1); mLayout->addLayout (radioLayout, 1, 0); mLayout->addWidget (tabWidget, 2, 0, 2, -1); //mLayout->addWidget (networkConfigWidget, 2, 1); //qDebug << Q_FUNC_INFO << " - 199"; setLayout(mLayout); //connect(serialPortComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(slotSerialPortChanged(QString) )); //connect(serialBaudsComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSerialSpeedChanged (int) )); //connect(stopBitsComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSerialStopBitChanged (int) )); //connect(dataBitsComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSerialDataBitsChanged (int) )); //connect(flowControlComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(slotSerialFlowControlChanged (QString))); //connect(parityComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(slotSerialParityChanged (QString))); connect(testHamlibPushButton, SIGNAL(clicked(bool)), this, SLOT(slotTestHamlib()) ); connect(rigTypeComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(slotRadioComboBoxChanged(QString)) ); //qDebug << Q_FUNC_INFO << " - END"; } void SetupPageHamLib::setRig() { //qDebug << Q_FUNC_INFO; // Rutine to fill the rig combo boxes // Do not display debug codes when load the rig's QStringList rigs; rigs.clear(); //qDebug << Q_FUNC_INFO << " - 10"; hamlib->initClass(); rigs << hamlib->getRigList(); //qDebug << Q_FUNC_INFO << " - rigs: " << QString::number(rigs.length())<< QT_ENDL; rigTypeComboBox->clear (); rigTypeComboBox->addItems (rigs); rigTypeComboBox->setCurrentIndex(0); //rigTypeComboBox->clear(); //rigTypeComboBox->addItems(rigs); //qDebug << Q_FUNC_INFO << " - END"; } void SetupPageHamLib::setDefaults() { //qDebug << Q_FUNC_INFO; hamlib->initClass(); rigctlport = 4532; networkRadio = false; rigTypeComboBox->setCurrentIndex(0); //showDebugLog->setValue(300); setTestResult(false); //qDebug << Q_FUNC_INFO << " - END"; } /* QString SetupPageHamLib::getData() { //qDebug << "SetupPageHamLib::getData"; QString _output; _output.clear(); QString _rigType, _serialPort;//, dataBits, stopBits, handshake, flowControlLine; _rigType = rigTypeComboBox->currentText (); _serialPort = serialConfigWidget->getSerialPort (); //_baudsSpeed = serialConfigWidget->getSerialBauds (); _output.clear(); if (activateHamlibCheckBox->isChecked()) { _output = _output + "Hamlib=True;\n"; } if (readOnlyModeCheckBox->isChecked()) { _output = _output + "HamlibReadOnly=True;\n"; } else { _output = _output + "HamlibReadOnly=False;\n"; } _output = _output + "HamLibRigType=" + QString::number(hamlib->getModelIdFromName(_rigType)) + ";\n"; _output = _output + "HamlibRigPollRate=" + QString::number(pollIntervalQSpinBox->value ()) + ";\n"; _output = _output + "HamlibSerialPort=" + _serialPort + ";\n"; _output = _output + "HamlibSerialBauds=" + QString::number(serialConfigWidget->getSerialBauds ()) + ";\n"; _output = _output + "HamLibSerialDataBits=" + QString::number(getDataBits()) + ";\n"; _output = _output + "HamLibSerialStopBits=" + serialConfigWidget->getStopBits() + ";\n"; _output = _output + getFlowControl() + ";\n"; _output = _output + getParity() + ";\n"; if ((networkConfigWidget->getAddress ()).length()>1) { _output = _output + "HamlibNetAddress=" + networkConfigWidget->getAddress () + ";\n"; _output = _output + "HamlibNetPort=" + QString::number(networkConfigWidget->getPort ()) + ";\n"; } return _output; } */ bool SetupPageHamLib::setRigType(const QString &_radio) { int _index = rigTypeComboBox->findText(hamlib->getNameFromModelId(_radio.toInt()), Qt::MatchFlag::MatchExactly); //qDebug << "SetupPageHamLib::setRig: After: " << QString::number(_index) ; if (_index >= 0) { rigTypeComboBox->setCurrentIndex(_index); return true; } else { rigTypeComboBox->setCurrentIndex(0); } return false; } int SetupPageHamLib::getDataBits() { return serialConfigWidget->getDataBits (); } QString SetupPageHamLib::getFlowControl() { return serialConfigWidget->getFlowControl (); } QString SetupPageHamLib::getParity() { return serialConfigWidget->getParity (); } void SetupPageHamLib::saveSettings() { //qDebug << Q_FUNC_INFO ; Utilities util(Q_FUNC_INFO); QSettings settings(util.getCfgFile (), QSettings::IniFormat); settings.beginGroup ("HamLib"); settings.setValue ("HamlibActive", QVariant((activateHamlibCheckBox->isChecked()))); settings.setValue ("HamlibReadOnly", QVariant((readOnlyModeCheckBox->isChecked()))); settings.setValue ("HamLibRigType", hamlib->getModelIdFromName(rigTypeComboBox->currentText ())); settings.setValue ("HamlibRigPollRate", QString::number(pollIntervalQSpinBox->value ())); settings.setValue ("HamlibSerialPort", serialConfigWidget->getSerialPort ()); settings.setValue ("HamlibSerialBauds", QString::number(serialConfigWidget->getSerialBauds ())); settings.setValue ("HamLibSerialDataBits", QString::number(getDataBits())); settings.setValue ("HamLibSerialStopBit", serialConfigWidget->getStopBits()); settings.setValue ("HamLibSerialFlowControl", serialConfigWidget->getFlowControl ()); settings.setValue ("HamLibSerialParity", serialConfigWidget->getParity ()); settings.setValue ("HamlibNetAddress", networkConfigWidget->getAddress ()); settings.setValue ("HamlibNetPort", networkConfigWidget->getPort ()); settings.endGroup (); } void SetupPageHamLib::loadSettings() { //qDebug << Q_FUNC_INFO; Utilities util(Q_FUNC_INFO); QSettings settings(util.getCfgFile (), QSettings::IniFormat); settings.beginGroup ("HamLib"); setRigType (settings.value("HamLibRigType").toString()); pollIntervalQSpinBox->setValue(settings.value("HamlibRigPollRate", 2000).toInt ()); serialConfigWidget->setSerialPort (settings.value("HamlibSerialPort").toString()); serialConfigWidget->setSerialBauds (settings.value("HamlibSerialBauds", 9600).toInt ()); serialConfigWidget->setDataBits (settings.value("HamLibSerialDataBits", 8).toInt ()); serialConfigWidget->setStopBits(settings.value("HamLibSerialStopBit", "OneStop").toString()); serialConfigWidget->setFlowControl (settings.value("HamLibSerialFlowControl", "None").toString()); serialConfigWidget->setParity(settings.value("HamLibSerialParity", "Even").toString()); networkConfigWidget->setAddress (settings.value("HamlibNetAddress", "localhost").toString()); networkConfigWidget->setPort (settings.value("HamlibNetPort", 4532).toInt ()); activateHamlibCheckBox->setChecked (settings.value("HamlibActive", false).toBool ()); readOnlyModeCheckBox->setChecked (settings.value("HamlibReadOnly", false).toBool ()); settings.endGroup (); } klog-2.3.3/setuppages/setuppagelogs.cpp0000644000015700001710000003721114542412415020107 0ustar jenkinsjenkins/*************************************************************************** setuppagelogs.cpp - description ------------------- begin : feb 2012 copyright : (C) 2012 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include "setuppagelogs.h" SetupPageLogs::SetupPageLogs(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent){ //qDebug() << "SetupPageLogs::SetupPageLogs"; dataProxy = dp; stationCallsign = QString(); operators = QString(); comment = QString(); dateString = QString(); selectedLog = -1; defaultStationCallSign.clear(); logsAvailable.clear(); newLog = new SetupPageLogsNew(dataProxy); logsModel = new QSqlRelationalTableModel(this); logsView = new QTableView; logsView->setContextMenuPolicy(Qt::CustomContextMenu); logsView->setSortingEnabled(true); createLogsModel(); createLogsPanel(); logsView->setCurrentIndex(logsModel->index(0, 0)); lastLog = 0; newLogPushButton = new QPushButton(tr("&New"), this); editPushButton = new QPushButton(tr("&Edit"), this); removePushButton = new QPushButton(tr("&Remove"), this); newLogPushButton->setToolTip(tr("Add a new log.")); editPushButton->setToolTip(tr("Edit the selected log.")); removePushButton->setToolTip(tr("Remove the selected log.")); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addWidget(newLogPushButton); buttonsLayout->addWidget(editPushButton); buttonsLayout->addWidget(removePushButton); QVBoxLayout *widgetLayout = new QVBoxLayout; widgetLayout->addWidget(logsView); widgetLayout->addLayout(buttonsLayout); setLayout(widgetLayout); createActions(); updateSelectedLogs(); //qDebug() << "SetupPageLogs::SetupPageLogs - END"; } SetupPageLogs::~SetupPageLogs(){ //qDebug() << "SetupPageLogs::~SetupPageLogs"; } void SetupPageLogs::createNewLog() { //qDebug() << "SetupPageLogs::createNewLog"; selectedLog = -1; newLog->setEditing(false); if (defaultStationCallSign.length()>2) { //qDebug() << "SetupPageLogs::createNewLog-1"; newLog->setStationCallSign(defaultStationCallSign); } if (defaultOperators.length()>2) { newLog->setOperators(defaultOperators); } newLog->setDateString(QDate::currentDate().toString("yyyy-MM-dd")); newLog->setComment(""); int result = newLog->exec(); //qDebug() << "SetupPageLogs::createNewLog: result: " << QString::number(result); if (result == QDialog::Accepted) { //qDebug() << "SetupPageLogs::createNewLog - Accepted, emitting focusOK"; emit focusOK(); } //qDebug() << "SetupPageLogs::createNewLog - END"; } void SetupPageLogs::slotNewButtonClicked() { //qDebug() << "SetupPageLogs::slotNewButtonClicked"; createNewLog(); } void SetupPageLogs::slotEditButtonClicked() { //qDebug() << "SetupPageLogs::slotEditButtonClicked"; //QSqlQuery query; //int nameCol = -1; //selectedLog = getSelectedLog(); //QString call = getStationCallSignFromLog(const int _log); newLog->setEditing(true); //qDebug() << "SetupPageLogs::slotEditButtonClicked"; newLog->setStationCallSign(dataProxy->getStationCallSignFromLog(selectedLog)); newLog->setOperators(dataProxy->getOperatorsFromLog(selectedLog)); newLog->setComment(dataProxy->getCommentsFromLog(selectedLog)); newLog->setDateString(dataProxy->getLogDateFromLog(selectedLog)); //newLog->setTypeN(dataProxy->getLogTypeNFromLog(selectedLog).toInt()); int result = newLog->exec(); if (result == QDialog::Accepted) { emit focusOK(); } } void SetupPageLogs::slotRemoveButtonClicked() { //qDebug() << "SetupPageLogs::slotRemoveButtonClicked"; //int selectedLog = getSelectedLog(); QMessageBox::StandardButton ret; ret = QMessageBox::warning(this, tr("KLog"), tr("Do you really want to remove this log?") + "\n" + tr("All the QSOs from this log will also be deleted..."), QMessageBox::Yes | QMessageBox::No); if (ret == QMessageBox::Yes) { //qDebug() << "SetupPageLogs::slotRemoveButtonClicked (selected log to remove: " << QString::number(selectedLog) << ")"; QString stringQuery = QString("DELETE FROM logs WHERE id='%1'").arg(selectedLog); QSqlQuery query(stringQuery); bool sqlOk = query.exec(); if (sqlOk) { //qDebug() << "SetupPageLogs::slotRemoveButtonClicked (REMOVED: " << QString::number(selectedLog) << ")"; logsModel->select(); updateSelectedLogs(); stringQuery = QString("DELETE FROM log WHERE lognumber='%1'").arg(selectedLog); sqlOk = query.exec(stringQuery); //qDebug() << "SetupPageLogs::slotRemoveButtonClicked: LastQuery: " << query.lastQuery() ; if (sqlOk) { //qDebug() << "SetupPageLogs::slotRemoveButtonClicked (QSOS REMOVED: " << QString::number(selectedLog) << ")"; stringQuery = QString("DELETE FROM awarddxcc WHERE lognumber='%2'").arg(selectedLog); query.exec(stringQuery); sqlOk = query.exec(); //qDebug() << "SetupPageLogs::slotRemoveButtonClicked: LastQuery: " << query.lastQuery() ; if (sqlOk) { //qDebug() << "SetupPageLogs::slotRemoveButtonClicked (AWARDDXCC REMOVED: " << QString::number(selectedLog) << ")"; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); showError(tr("Log has not been removed. (#3)")); //qDebug() << "SetupPageLogs::slotRemoveButtonClicked (AWARDDXCC NOT REMOVED: " << QString::number(selectedLog) << ")"; } } else { showError(tr("Log has not been removed. (#2)")); //qDebug() << "SetupPageLogs::slotRemoveButtonClicked (QSOS NOT REMOVED: " << QString::number(selectedLog) << ")"; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); showError(tr("Log has not been removed. (#1)")); //qDebug() << "SetupPageLogs::slotRemoveButtonClicked (NOT REMOVED: " << QString::number(selectedLog) << ")"; } } //ASK FOR A CONFIRMATION //DELETE ALL THE QSO IN THE REMOVED LOG } void SetupPageLogs::createLogsPanel() { //qDebug() << "SetupPageLogs::createLogsPanel"; logsView->setModel(logsModel); QString stringQuery = QString("SELECT * FROM logs"); QSqlQuery query(stringQuery); QSqlRecord rec = query.record(); // Number of columns int columns = rec.count(); for (int i = 0; i < columns; i++ ){ logsView->setColumnHidden(i, true); } columns = rec.indexOf("id"); logsView->setColumnHidden(columns, false); columns = rec.indexOf("logdate"); logsView->setColumnHidden(columns, false); columns = rec.indexOf("stationcall"); logsView->setColumnHidden(columns, false); columns = rec.indexOf("operators"); logsView->setColumnHidden(columns, false); columns = rec.indexOf("comment"); logsView->setColumnHidden(columns, false); columns = rec.indexOf("logtypen"); logsView->setColumnHidden(columns, false); logsView->setItemDelegate(new QSqlRelationalDelegate(this)); logsView->setSelectionMode( QAbstractItemView::SingleSelection); logsView->setSelectionBehavior(QAbstractItemView::SelectRows); logsView->resizeColumnsToContents(); logsView->horizontalHeader()->setStretchLastSection(true); } void SetupPageLogs::createLogsModel() { //qDebug() << "SetupPageLogs::createLogsModel"; QString stringQuery = QString("SELECT * FROM logs"); QSqlQuery q(stringQuery); QSqlRecord rec = q.record(); int nameCol; logsModel->setTable("logs"); nameCol = rec.indexOf("id"); logsModel->setSort(nameCol, Qt::AscendingOrder); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("ID")); nameCol = rec.indexOf("logdate"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Date")); nameCol = rec.indexOf("stationcall"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Station Callsign")); nameCol = rec.indexOf("operators"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Operators")); nameCol = rec.indexOf("comment"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Comments")); nameCol = rec.indexOf("logtypen"); logsModel->setHeaderData(nameCol, Qt::Horizontal, tr("QSOs")); logsModel->select(); } void SetupPageLogs::slotLogSelected(const QModelIndex & index) { int row = index.row(); selectedLog = (logsModel->index(row, 0)).data(0).toInt(); //qDebug() << "SetupPageLogs::slotLogSelected: " << QString::number(selectedLog) ; } void SetupPageLogs::slotLogDoubleClicked(const QModelIndex & index) { //qDebug() << "SetupPageLogs::slotLogDoubleClicked" ; int row = index.row(); selectedLog = (logsModel->index(row, 0)).data(0).toInt(); slotEditButtonClicked(); } void SetupPageLogs::createActions() { //qDebug() << "SetupPageLogs::createActions"; //connect(currentLogs, SIGNAL(currentIndexChanged (int)), this, SLOT(slotCurrentLogsComboBoxChanged() ) ) ; connect(newLogPushButton, SIGNAL(clicked()), this, SLOT(slotNewButtonClicked() ) ); connect(removePushButton, SIGNAL(clicked()), this, SLOT(slotRemoveButtonClicked() ) ); connect(editPushButton, SIGNAL(clicked()), this, SLOT(slotEditButtonClicked() ) ); connect(newLog, SIGNAL(newLogData(QStringList)), this, SLOT(slotAnalyzeNewLogData(QStringList) ) ); connect(logsView, SIGNAL(clicked(QModelIndex)), this, SLOT(slotLogSelected(QModelIndex) ) ); connect(logsView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(slotLogDoubleClicked(QModelIndex) ) ); } QStringList SetupPageLogs::readLogs() { //qDebug() << "SetupPageLogs::readLogs"; QString aux, aux2; QStringList _logs; QSqlQuery query; int nameCol = -1; bool sqlOk = false; //QDate date = QDate::currentDate(); aux2.clear(); aux.clear(); _logs.clear(); aux = "SELECT id, logdate, stationcall FROM logs"; sqlOk = query.exec(aux); if (sqlOk) { QSqlRecord rec = query.record(); while ( (query.next()) && (query.isValid()) ) { aux2.clear(); nameCol = rec.indexOf("id"); aux2 = (query.value(nameCol)).toString(); nameCol = rec.indexOf("stationcall"); aux2 = aux2.append("-"); aux2.append((query.value(nameCol)).toString()); //nameCol = rec.indexOf("logtype"); //aux2 = aux2.append("-"); //aux2.append((query.value(nameCol)).toString()); nameCol = rec.indexOf("logdate"); aux2 = aux2.append(" ("); aux2.append((query.value(nameCol)).toString()); aux2 = aux2.append(")"); _logs.append(aux2); } return _logs; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); return _logs; } } void SetupPageLogs::slotAnalyzeNewLogData(const QStringList _qs) { //qDebug() << "SetupPageLogs::slotAnalyzeNewLogData (length=" << QString::number(_qs.length()) << ")"; if (_qs.length()!=5) { return; } stationCallsign = _qs.at(0); operators = _qs.at(1); comment = _qs.at(2); dateString = _qs.at(3); //TODO: Check that those vars have received valid data (calls, date, ...) QStringList newLogq; newLogq.clear(); newLogq << dateString << stationCallsign << operators << comment << QString::number(selectedLog) << _qs.at(4) ; if (dataProxy->addNewLog(newLogq)) { logsModel->select(); updateSelectedLogs(); } else { showError(tr("The new log could not be created.")); } // We send the data to the main tab QStringList logData; logData.clear(); logData << stationCallsign << operators ; emit newLogData(logData); } void SetupPageLogs::updateSelectedLogs() { //qDebug() << "SetupPageLogs::updateSelectedLogs"; logsAvailable = readLogs(); } int SetupPageLogs::getSelectedLog() { //qDebug() << "SetupPageLogs::getSelectedLog: " << currentLogs->currentText(); return selectedLog; } void SetupPageLogs::showError(const QString &_errorC) { QString text = QString(tr("An error has occurred showing the following error code:") + "\n'%1'").arg(_errorC); QMessageBox::warning(this, tr("KLog - SetupPageLogs"), text, QMessageBox::Ok); } void SetupPageLogs::setDefaultStationCallsign(const QString &_p) { //qDebug() << "SetupPageLogs::setDefaultStationCallsign: " << _p; defaultStationCallSign = _p; } void SetupPageLogs::setDefaultOperators(const QString &_p) { //SetupPageLogs defaultOperators = _p; } void SetupPageLogs::showEvent(QShowEvent *event) { //qDebug() << Q_FUNC_INFO; QWidget::showEvent(event); dataProxy->updateQSONumberPerLog(); logsModel->select(); } void SetupPageLogs::saveSettings() { //qDebug() << Q_FUNC_INFO ; Utilities util(Q_FUNC_INFO); QSettings settings(util.getCfgFile (), QSettings::IniFormat); //settings.beginGroup ("Logs"); settings.setValue ("SelectedLog", selectedLog); //settings.endGroup (); } void SetupPageLogs::loadSettings() { Utilities util(Q_FUNC_INFO); QSettings settings(util.getCfgFile (), QSettings::IniFormat); int i = settings.value("SelectedLog").toInt(); if (!dataProxy->doesThisLogExist(i)) { i = 0; while((!dataProxy->doesThisLogExist(i)) || i >500) {//TODO If a user has more than 500 logs it may fail... i++; } } selectedLog = i; logsView->selectRow(1); QModelIndex index = logsModel->index(selectedLog, 0); logsView->setCurrentIndex(index); } klog-2.3.3/setuppages/hamlibnetworkconfigwidget.h0000644000015700001710000000110314542412415022121 0ustar jenkinsjenkins#ifndef KLOG_SETUPPAGES_HAMLIBNETWORKCONFIGWIDGET_H #define KLOG_SETUPPAGES_HAMLIBNETWORKCONFIGWIDGET_H #include #include "../klogdefinitions.h" #include "../utilities.h" class HamLibNetworkConfigWidget : public QWidget { Q_OBJECT public: explicit HamLibNetworkConfigWidget(QWidget *parent = nullptr); void createUI(); int getPort(); void setPort (const int _b); QString getAddress(); void setAddress(const QString &_st); private: QLineEdit*hostAddressLineEdit; QSpinBox *portQSpinBox; }; #endif // HAMLIBNETWORKCONFIGWIDGET_H klog-2.3.3/setuppages/setupentitydialog.cpp0000644000015700001710000004020314542412415020775 0ustar jenkinsjenkins/*************************************************************************** setupentitydialog.cpp - description ------------------- begin : sept 2012 copyright : (C) 2012 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "../setuppages/setupentitydialog.h" //#include /* This class calls all the othet "Setup..." to manage the configuration */ SetupEntityDialog::SetupEntityDialog(){ //qDebug() << "SetupEntityDialog::SetupEntityDialog: "; //QPalette::ColorRole QWidget::foregroundRole () const; //QPalette::ColorRole //paletteOrig = new QPalette; //paletteWrong = new QPalette; //paletteWrong.setColor(QPalette::Normal, QPalette::WindowText, Qt::red); //paletteWrong = new QPalette(); //*paletteWrong->setColor(QPalette::WindowText, Qt::red); //paletteWrong.setColor(QPalette::WindowText, color.setNamedColor("red")); palw.setColor(QPalette::Text, Qt::red); //pal.setColor(QPalette::Text, Qt::black); entityData.clear(); entityBool = false; mainPrefixBool = false; cqBool = false; ituBool = false; contBool = false; latBool = false; lonBool = false; utcBool = false; arrlidBool = false; delBool = false; delDateBool = false; prefBool = false; //qDebug() << "SetupEntityDialog::SetupEntityDialog - 0"; QLabel *entityLabel = new QLabel(tr("Entity")); entityLineEdit = new QLineEdit; entityLineEdit->setToolTip(tr("Name of the Entity.")); QLabel *cqLabel = new QLabel(tr("CQ")); cqLineEdit = new QLineEdit; cqLineEdit->setToolTip(tr("CQ zone.")); QLabel *ituLabel = new QLabel(tr("ITU")); ituLineEdit = new QLineEdit; ituLineEdit->setToolTip(tr("ITU zone.")); //QLabel *contLabel = new QLabel(tr("Continent")); //contLineEdit = new QLineEdit; //contLineEdit->setToolTip(tr("Continent of the Entity")); QLabel *latLabel = new QLabel(tr("Latitude")); latLineEdit = new QLineEdit; latLineEdit->setToolTip(tr("Longitude of the Entity.")); QLabel *lonLabel = new QLabel(tr("Longitude")); lonLineEdit = new QLineEdit; lonLineEdit->setToolTip(tr("Longitude of the Entity.")); QLabel *utcLabel = new QLabel(tr("UTC")); utcLineEdit = new QLineEdit; utcLineEdit->setToolTip(tr("Local time difference to UTC.")); QLabel *mprefLabel = new QLabel(tr("Main prefix")); mprefLineEdit = new QLineEdit; mprefLineEdit->setToolTip(tr("Main prefix of the entity.")); //qDebug() << "SetupEntityDialog::SetupEntityDialog - 1"; QLabel *arrlidLabel = new QLabel(tr("ARRL ID")); arrlidLineEdit = new QLineEdit; arrlidLineEdit->setToolTip(tr("ARRL ID.")); //QLabel *deletedLabel = new QLabel(tr("Deleted")); //deletedLineEdit = new QLineEdit; //deletedLineEdit->setToolTip(tr("Mark if the entity is deleted")); QLabel *prefLabel = new QLabel(tr("Prefixes")); prefLineEdit = new QLineEdit; prefLineEdit->setToolTip(tr("Comma separated possible prefixes, e.g. EA1, EA2, ...")); delQDateEdit = new QDateEdit; delQDateEdit->setToolTip(tr("Date of the deletion.")); delRbutton = new QCheckBox(tr("Deleted"), this); QPushButton *closeButton = new QPushButton(tr("Cancel")); QPushButton *okButton = new QPushButton(tr("Ok")); //qDebug() << "SetupEntityDialog::SetupEntityDialog - 2"; /* connect(closeButton, SIGNAL(clicked()), this, SLOT(close())); connect(okButton, SIGNAL(clicked()), this, SLOT(slotOkButtonClicked())); connect(entityLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckEntity() ) ); connect(mprefLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckMainprefix() ) ); connect(cqLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckCQz() ) ); connect(ituLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckITUz() ) ); connect(contLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckContinent() ) ); connect(latLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckLatitude() ) ); connect(lonLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckLongitude() ) ); connect(utcLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckUTC() ) ); connect(arrlidLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckARRLid() ) ); connect(delRbutton, SIGNAL(checked), this, SLOT(slotCheckDeleted() ) ); connect(delQDateEdit, SIGNAL(dateChanged), this, SLOT(slotCheckDeletedDate() ) ); connect(prefLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotCheckPrefixes() ) ); */ //qDebug() << "SetupEntityDialog::SetupEntityDialog - 3"; QVBoxLayout *cqLayout = new QVBoxLayout; cqLayout->addWidget(cqLabel); cqLayout->addWidget(cqLineEdit); QVBoxLayout *ituLayout = new QVBoxLayout; ituLayout->addWidget(ituLabel); ituLayout->addWidget(ituLineEdit); QVBoxLayout *latLayout = new QVBoxLayout; latLayout->addWidget(latLabel); latLayout->addWidget(latLineEdit); QVBoxLayout *lonLayout = new QVBoxLayout; lonLayout->addWidget(lonLabel); lonLayout->addWidget(lonLineEdit); QHBoxLayout *posLayout = new QHBoxLayout; posLayout->addLayout(cqLayout); posLayout->addLayout(ituLayout); posLayout->addLayout(latLayout); posLayout->addLayout(lonLayout); QVBoxLayout *utcLayout = new QVBoxLayout; utcLayout->addWidget(utcLabel); utcLayout->addWidget(utcLineEdit); QVBoxLayout *arrlidLayout = new QVBoxLayout; arrlidLayout->addWidget(arrlidLabel); arrlidLayout->addWidget(arrlidLineEdit); QVBoxLayout *delLayout = new QVBoxLayout; delLayout->addWidget(delRbutton); delLayout->addWidget(delQDateEdit); QHBoxLayout *thirdLayout = new QHBoxLayout; thirdLayout->addLayout(utcLayout); thirdLayout->addLayout(arrlidLayout); thirdLayout->addLayout(delLayout); QVBoxLayout *prefLayout = new QVBoxLayout; prefLayout->addWidget(prefLabel); prefLayout->addWidget(prefLineEdit); QGridLayout *dataLayout = new QGridLayout; dataLayout->addWidget(entityLabel, 0, 0); dataLayout->addWidget(entityLineEdit, 1, 0); dataLayout->addWidget(mprefLabel, 0, 1); dataLayout->addWidget(mprefLineEdit, 1, 1); dataLayout->addLayout(posLayout, 2, 0, 2, -1); dataLayout->addLayout(thirdLayout, 4, 0, 4, -1); dataLayout->addLayout(prefLayout, 8, 0, 8, -1); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addStretch(1); buttonsLayout->addWidget(okButton); buttonsLayout->addWidget(closeButton); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(dataLayout); mainLayout->addStretch(1); mainLayout->addSpacing(12); mainLayout->addLayout(buttonsLayout); //qDebug() << "SetupEntityDialog::SetupEntityDialog - 3"; setLayout(mainLayout); setWindowTitle(tr("Entity Dialog")); pal = lonLineEdit->palette(); //qDebug() << "SetupEntityDialog::SetupEntityDialog: END"; } SetupEntityDialog::~SetupEntityDialog() { //qDebug() << "SetupEntityDialog::~SetupEntityDialog "; } void SetupEntityDialog::slotOkButtonClicked() { //qDebug() << "SetupEntityDialog::slotOkButtonClicked "; QStringList ql; ql.clear(); if (entityBool && mainPrefixBool && cqBool && ituBool && contBool && latBool && lonBool && utcBool && arrlidBool && delBool && delDateBool && prefBool) { ql << checkEntity(); ql << checkMainprefix(); ql << checkContinent(); ql << checkCQz(); ql << checkITUz(); ql << checkLatitude(); ql << checkLongitude(); ql << checkUTC(); ql << checkARRLid(); ql << checkDeleted(); //ql << checkDeletedDate(); ql << checkPrefixes(); emit entityAdded(ql); accept(); } else { reject(); } reject(); } QString SetupEntityDialog::checkContinent() { //qDebug() << "SetupEntityDialog::checkContinent"; if(contBool) { return contLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkEntity() { //qDebug() << "SetupEntityDialog::checkEntity"; if(entityBool) { return entityLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkMainprefix() { //qDebug() << "SetupEntityDialog::checkMainprefix"; if(mainPrefixBool) { return mprefLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkCQz() { //qDebug() << "SetupEntityDialog::checkCQz"; if(cqBool) { return cqLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkITUz() { //qDebug() << "SetupEntityDialog::checkITUz"; if(ituBool) { return ituLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkLatitude() { //qDebug() << "SetupEntityDialog::checkLatitude"; if(latBool) { return latLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkLongitude() { //qDebug() << "SetupEntityDialog::checkLongitude"; if(lonBool) { return lonLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkUTC() { //qDebug() << "SetupEntityDialog::checkUTC"; if(utcBool) { return utcLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkARRLid() { //qDebug() << "SetupEntityDialog::checkARRLid"; if(arrlidBool) { return arrlidLineEdit->text(); } else { return ""; } return ""; } QString SetupEntityDialog::checkDeleted() { //qDebug() << "SetupEntityDialog::checkDeleted"; if(delBool) { return "Y"; } else { return "N"; } return ""; } QString SetupEntityDialog::checkDeletedDate() { //qDebug() << "SetupEntityDialog::checkDeletedDate"; if(delDateBool) { return "00/00/0000"; } else { return ""; } return ""; } QString SetupEntityDialog::checkPrefixes() { //qDebug() << "SetupEntityDialog::checkPrefixes"; if(prefBool) { return prefLineEdit->text(); } else { return ""; } return ""; } void SetupEntityDialog::slotCancelButtonClicked() { //qDebug() << "SetupEntityDialog::slotCancelButtonClicked "; reject(); } void SetupEntityDialog::slotCheckEntity() { //qDebug() << "SetupEntityDialog::slotCheckEntity "; QString aux; aux = entityLineEdit->text(); if (aux.length()>2) { entityBool = true; entityLineEdit->setPalette(pal); } else { entityBool = false; entityLineEdit->setPalette(palw); } } void SetupEntityDialog::slotCheckMainprefix() { //qDebug() << "SetupEntityDialog::slotCheckMainprefix"; QString aux; aux = mprefLineEdit->text(); if (aux.length()>0) { mprefLineEdit->setPalette(pal); mainPrefixBool = true; } else { mainPrefixBool = false; mprefLineEdit->setPalette(palw); } } void SetupEntityDialog::slotCheckCQz() { //qDebug() << "SetupEntityDialog::slotCheckCQz"; QString aux; aux = cqLineEdit->text(); if (aux.length()>0) { cqBool = true; cqLineEdit->setPalette(pal); } else { cqBool = false; cqLineEdit->setPalette(palw); } } void SetupEntityDialog::slotCheckITUz() { //qDebug() << "SetupEntityDialog::slotCheckITUz"; QString aux; aux = ituLineEdit->text(); if (aux.length()>0) { ituBool = true; ituLineEdit->setPalette(pal); } else { ituBool = false; ituLineEdit->setPalette(palw); } } void SetupEntityDialog::slotCheckContinent() { //qDebug() << "SetupEntityDialog::slotCheckContinent"; QString aux; aux = contLineEdit->text(); if (aux.length()>2) { contBool = true; contLineEdit->setPalette(pal); } else { contBool = false; contLineEdit->setPalette(palw); } } void SetupEntityDialog::slotCheckLatitude() { //qDebug() << "SetupEntityDialog::slotCheckLatitude"; QString aux; aux = latLineEdit->text(); if (aux.length()>0) { latBool = true; latLineEdit->setPalette(pal); } else { latBool = false; latLineEdit->setPalette(palw); } } void SetupEntityDialog::slotCheckLongitude() { //qDebug() << "SetupEntityDialog::slotCheckLongitude"; QString aux; aux = lonLineEdit->text(); if (aux.length()>3) { //lonLineEdit->setPalette(*paletteOrig); lonBool = true; lonLineEdit->setPalette(pal); } else { //lonLineEdit->setForegroundRole(QPalette::WindowText); lonLineEdit->setPalette(palw); //lonLineEdit->setPalette(*paletteWrong); lonBool = false; } } void SetupEntityDialog::slotCheckUTC() { //qDebug() << "SetupEntityDialog::slotCheckUTC"; QString aux; aux = utcLineEdit->text(); if (aux.length()>0) { utcBool = true; utcLineEdit->setPalette(pal); } else { utcBool = false; utcLineEdit->setPalette(palw); } } void SetupEntityDialog::slotCheckARRLid() { //qDebug() << "SetupEntityDialog::slotCheckARRLid"; QString aux; aux = arrlidLineEdit->text(); // int n = aux.toInt(); if (aux.length()>0) { arrlidBool = false; arrlidLineEdit->setPalette(pal); } else { arrlidBool = false; arrlidLineEdit->setPalette(palw); } } void SetupEntityDialog::slotCheckDeleted() { //qDebug() << "SetupEntityDialog::slotCheckDeleted"; if (delRbutton->isChecked()) { delBool = true; } else { delBool = false; } } void SetupEntityDialog::slotCheckDeletedDate() { //qDebug() << "SetupEntityDialog::slotCheckDeletedDate"; delDateBool = false; //arrlidLineEdit->setPalette(palw); } void SetupEntityDialog::slotCheckPrefixes() { //qDebug() << "SetupEntityDialog::slotCheckPrefixes"; QString aux; aux = prefLineEdit->text(); aux = aux.simplified(); QStringList list = aux.split(",", QT_SKIP); if (aux.length()>0) { prefBool = true; prefLineEdit->setPalette(pal); //"EA1, EA2, EA3" } else { prefBool = false; prefLineEdit->setPalette(palw); } } klog-2.3.3/setuppages/setuppagecolors.cpp0000644000015700001710000003217114542412415020444 0ustar jenkinsjenkins/*************************************************************************** setuppagecolors.cpp - description ------------------- begin : nov 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include "setuppagecolors.h" SetupPageColors::SetupPageColors(QWidget *parent) : QWidget(parent) { //qDebug() << "SetupPageColors::SetupPageColors"; newOneColorButton = new QPushButton; neededColorButton = new QPushButton; workedColorButton = new QPushButton; confirmedColorButton = new QPushButton; defaultColorButton = new QPushButton; wsjtxColorButton = new QPushButton; klogColorButton = new QPushButton; darkModeButton = new QPushButton; newOneColorButton->setText(tr("New One")); neededColorButton->setText(tr("Needed in this band")); workedColorButton->setText(tr("Worked in this band")); confirmedColorButton->setText(tr("Confirmed in this band")); defaultColorButton->setText(tr("Default")); wsjtxColorButton->setText(tr("WSJT-X palette")); klogColorButton->setText(tr("Default palette")); darkModeButton->setText(tr("Dark Mode")); newOneColorButton->setToolTip(tr("Color when the DXCC is an ATNO (All Time New One).")); neededColorButton->setToolTip(tr("This DXCC was worked before in another band but not in the selected band. It may be needed due to the CQ, ITU, Grid, ...")); workedColorButton->setToolTip(tr("Worked DXCC, but not confirmed in this band.")); confirmedColorButton->setToolTip(tr("DXCC is confirmed in this band.")); defaultColorButton->setToolTip(tr("Default color.")); wsjtxColorButton->setToolTip(tr("Sets a palette of colors similar to the one used in WSJT-X.")); klogColorButton->setToolTip(tr("Sets the default palette.")); darkModeButton->setToolTip(tr("Sets the Dark Mode")); newOneColorButton->setAutoFillBackground ( true ); QVBoxLayout *buttonsLayout = new QVBoxLayout; buttonsLayout->addWidget(newOneColorButton); buttonsLayout->addWidget(neededColorButton); buttonsLayout->addWidget(workedColorButton); buttonsLayout->addWidget(confirmedColorButton); buttonsLayout->addWidget(defaultColorButton); QHBoxLayout *schemasLayout = new QHBoxLayout; schemasLayout->setSpacing(40); schemasLayout->addWidget(wsjtxColorButton); schemasLayout->addWidget(klogColorButton); schemasLayout->addWidget(darkModeButton); QGridLayout *mainLayout = new QGridLayout; mainLayout->addLayout(buttonsLayout, 0, 0); mainLayout->addLayout(schemasLayout, 1, 0); //setLayout(buttonsLayout); setLayout(mainLayout); connect(newOneColorButton, SIGNAL(clicked()), this, SLOT(slotNewOneColorButtonClicked()) ); connect(neededColorButton, SIGNAL(clicked()), this, SLOT(slotNeededColorButtonClicked()) ); connect(workedColorButton, SIGNAL(clicked()), this, SLOT(slotWorkedColorButtonClicked()) ); connect(confirmedColorButton, SIGNAL(clicked()), this, SLOT(slotConfirmedColorButtonClicked()) ); connect(defaultColorButton, SIGNAL(clicked()), this, SLOT(slotDefaultColorButtonClicked()) ); connect(wsjtxColorButton, SIGNAL(clicked()), this, SLOT(slotWSJTXButtonClicked()) ); connect(klogColorButton, SIGNAL(clicked()), this, SLOT(slotKLogButtonClicked()) ); connect(darkModeButton, SIGNAL(clicked()), this, SLOT(slotSetDarkMode()) ); setDefaultColors(); //qDebug() << "SetupPageColors::SetupPageColors - END"; } SetupPageColors::~SetupPageColors() {; } void SetupPageColors::setDefaultColors() { setNewOneColor("#FF0000"); setNeededColor("#FF8C00"); setWorkedColor("#FFD700"); setConfirmedColor("#32CD32"); setDefaultColor("#00BFFF"); } void SetupPageColors::setWSJTXColors() { setNewOneColor("#FF00FF"); // New DXCC setNeededColor("#FFAAFF"); // New DXCC on Band setWorkedColor("#00BFFF"); // Like Default, WSJT-X does not make any difference setConfirmedColor("#00BFFF"); // Like Default, WSJT-X does not make any difference setDefaultColor("#00BFFF"); } void SetupPageColors::slotNewOneColorButtonClicked() { //qDebug() << "SetupPageColors::slotNewOneColorButtonClicked "; QString style = "* { background-color: "; style = style + (giveColor(newOneColorButton->palette().color(QPalette::Button))).name(); style = style + "; }"; newOneColorButton->setStyleSheet(style); } void SetupPageColors::slotNeededColorButtonClicked () { //qDebug() << "SetupPageColors::slotNeededColorButtonClicked "; QString style = "* { background-color: "; style = style + (giveColor(neededColorButton->palette().color(QPalette::Button))).name(); style = style + "; }"; neededColorButton->setStyleSheet(style); } void SetupPageColors::slotWorkedColorButtonClicked () { //qDebug() << "SetupPageColors::slotWorkedColorButtonClicked "; QString style = "* { background-color: "; style = style + (giveColor(workedColorButton->palette().color(QPalette::Button))).name(); style = style + "; }"; workedColorButton->setStyleSheet(style); } void SetupPageColors::slotConfirmedColorButtonClicked () { //qDebug() << "SetupPageColors::slotNeededColorButtonClicked "; QString style = "* { background-color: "; style = style + (giveColor(confirmedColorButton->palette().color(QPalette::Button))).name(); style = style + "; }"; confirmedColorButton->setStyleSheet(style); } void SetupPageColors::slotDefaultColorButtonClicked() { //qDebug() << "SetupPageColors::slotDefaultColorButtonClicked "; QString style = "* { background-color: "; style = style + (giveColor(defaultColorButton->palette().color(QPalette::Button))).name(); style = style + "; }"; defaultColorButton->setStyleSheet(style); } QColor SetupPageColors::giveColor (QColor c) { // Receives the actual color, shows the user a color picker and returns the color that the user selects. QColor colorb; color = c; colorb = color; color = QColorDialog::getColor (color, this, tr("Choose a color")); if (color.isValid ()) { //qDebug() << "SetupPageColors::giveColor valid color: " << color.name(); return color; } else { //qDebug() << "SetupPageColors::giveColor NOT valid color"; return colorb; } } QString SetupPageColors::getNewOneColor() { //qDebug() << "SetupPageColors::getNewOneColor: " << (newOneColorButton->palette().color(QPalette::Button)).name(); return (newOneColorButton->palette().color(QPalette::Button)).name(); } QString SetupPageColors::getNeededColor() { return (neededColorButton->palette().color(QPalette::Button)).name(); } QString SetupPageColors::getWorkedColor() { return (workedColorButton->palette().color(QPalette::Button)).name(); } QString SetupPageColors::getConfirmedColor() { return (confirmedColorButton->palette().color(QPalette::Button)).name(); } QString SetupPageColors::getDefaultColor() { return (defaultColorButton->palette().color(QPalette::Button)).name(); } void SetupPageColors::setNewOneColor(const QString &_c) { //qDebug() << Q_FUNC_INFO << ": " << _c; QString style = "* { background-color: "; style = style + _c; style = style + "; }"; newOneColorButton->setStyleSheet(style); } void SetupPageColors::setNeededColor(const QString &_c) { QString style = "* { background-color: "; style = style + _c; style = style + "; }"; neededColorButton->setStyleSheet(style); } void SetupPageColors::setWorkedColor(const QString &_c) { QString style = "* { background-color: "; style = style + _c; style = style + "; }"; workedColorButton->setStyleSheet(style); } void SetupPageColors::setConfirmedColor(const QString &_c) { QString style = "* { background-color: "; style = style + _c; style = style + "; }"; confirmedColorButton->setStyleSheet(style); } void SetupPageColors::setDefaultColor(const QString &_c) { QString style = "* { background-color: "; style = style + _c; style = style + "; }"; defaultColorButton->setStyleSheet(style); } void SetupPageColors::slotWSJTXButtonClicked() { setWSJTXColors(); } void SetupPageColors::slotKLogButtonClicked() { setDefaultColors(); } void SetupPageColors::loadDarkMode() {// Reads the config to setup the DarkMode //qDebug() << Q_FUNC_INFO; QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("Colors"); setDarkMode (settings.value("DarkMode", false).toBool ()); settings.endGroup (); } void SetupPageColors::slotSetDarkMode() { setDarkMode (!darkMode); } QString SetupPageColors::getDarkMode(){ //qDebug() << Q_FUNC_INFO; return util->boolToQString(darkMode); } void SetupPageColors::setDarkMode(const bool _d) { //qDebug() << Q_FUNC_INFO << ": " << util->boolToQString (_d); darkMode = _d; if (darkMode) { QApplication::setStyle(QStyleFactory::create("Fusion")); QPalette p; p = qApp->palette(); p.setColor(QPalette::Window, QColor(53,53,53)); p.setColor(QPalette::Button, QColor(53,53,53)); p.setColor(QPalette::Highlight, QColor(142,45,197)); p.setColor(QPalette::ButtonText, QColor(255,255,255)); p.setColor(QPalette::WindowText, QColor(255,255,255)); p.setColor(QPalette::Text, Qt::white); p.setColor(QPalette::Base, QColor(100,100,100)); qApp->setPalette(p); darkModeButton->setText(tr("Light Mode")); //darkMode = true; } else { QApplication::setStyle(QStyleFactory::create("Fusion")); QPalette p; p = qApp->palette(); p.setColor(QPalette::Window, QColor(244,246,246)); p.setColor(QPalette::Text, Qt::black); p.setColor(QPalette::Button, QColor(234,237,237)); p.setColor(QPalette::Highlight, QColor(40,120,240)); p.setColor(QPalette::ButtonText, Qt::black); p.setColor(QPalette::WindowText, QColor(33,47,60)); p.setColor(QPalette::Base, Qt::white); p.setColor(QPalette::ToolTipBase, Qt::white); p.setColor(QPalette::ToolTipText, Qt::black); qApp->setPalette(p); darkModeButton->setText(tr("Dark Mode")); //darkMode = false; } } void SetupPageColors::saveSettings() { //qDebug() << Q_FUNC_INFO ; QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("Colors"); //qDebug() << Q_FUNC_INFO << ": Saving NewOneColor: " << (newOneColorButton->palette().color(QPalette::Button)).name(); settings.setValue ("NewOneColor", (newOneColorButton->palette().color(QPalette::Button)).name()); settings.setValue ("NeededColor", (neededColorButton->palette().color(QPalette::Button)).name()); settings.setValue ("WorkedColor", (workedColorButton->palette().color(QPalette::Button)).name()); settings.setValue ("ConfirmedColor", (confirmedColorButton->palette().color(QPalette::Button)).name()); settings.setValue ("DefaultColor", (defaultColorButton->palette().color(QPalette::Button)).name()); settings.setValue ("DarkMode", QVariant(darkMode)); settings.endGroup (); } void SetupPageColors::loadSettings() { //qDebug() << Q_FUNC_INFO; QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("Colors"); setNewOneColor (settings.value("NewOneColor", "#FF0000").toString ()); //settings.value("interval").toInt(); setNeededColor (settings.value("NeededColor", "#FF8C00").toString ()); setWorkedColor (settings.value("WorkedColor", "#FFD700").toString ()); setConfirmedColor (settings.value("ConfirmedColor", "#32CD32").toString ()); setDefaultColor (settings.value("DefaultColor", "#00BFFF").toString ()); setDarkMode (settings.value("DarkMode", false).toBool ()); settings.endGroup (); } klog-2.3.3/setuppages/setuppagelogsnew.cpp0000644000015700001710000003634114542412415020624 0ustar jenkinsjenkins/*************************************************************************** setuppagelogsnew.h - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implements the Dialog to add a new log // #include "setuppagelogsnew.h" SetupPageLogsNew::SetupPageLogsNew(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "SetupPageLogsNew::SetupPageLogsNew" ; Q_UNUSED(parent); dataProxy = dp; util = new Utilities(Q_FUNC_INFO); editing = false; checking = false; logData.clear(); stationCallsignFilled = false; operatorsFilled = true; stationCallsign = QString(); operators = QString(); comment = QString(); dateString = QString(); stationCallsignLineEdit = new QLineEdit; operatorsLineEdit = new QLineEdit; dateEdit = new QDateEdit; dateEdit->setDate(QDate::currentDate ()); commentLineEdit = new QLineEdit; dateLabel = new QLabel(tr("&Date")); stationCallsignLabel = new QLabel(tr("&Station Callsign")); operatorsLabel = new QLabel(tr("&Operators")); commentLabel = new QLabel(tr("Comm&ent")); okButton = new QPushButton(tr("&Ok"), this); cancelButton = new QPushButton(tr("&Cancel"), this); createWidget(); okButton->setEnabled(false); //qDebug() << "SetupPageLogsNew::SetupPageLogsNew - END" ; } SetupPageLogsNew::~SetupPageLogsNew() { delete(util); } void SetupPageLogsNew::clear() { //qDebug() << "SetupPageLogsNew::Clear - Start" ; stationCallsignLineEdit->clear(); operatorsLineEdit->clear(); dateEdit->setDate(QDate::currentDate ()); //qDebug() << "SetupPageLogsNew::Clear - END" ; } void SetupPageLogsNew::createWidget() { //qDebug() << "SetupPageLogsNew::createWidget - Start"; stationCallsignLabel->setWordWrap(true); operatorsLabel->setWordWrap(true); commentLabel->setWordWrap(true); dateLabel->setBuddy(dateEdit); stationCallsignLabel->setBuddy(stationCallsignLineEdit); operatorsLabel->setBuddy(operatorsLineEdit); commentLabel->setBuddy(commentLineEdit); stationCallsignLineEdit->setToolTip(tr("Callsign used for this log.")); operatorsLineEdit->setToolTip(tr("Comma separated list of operators: callsign1, callsign2.")); dateEdit->setToolTip(tr("Start date of this log.")); commentLineEdit->setToolTip(tr("Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log.")); dateLabel->setWordWrap(true); connect(stationCallsignLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotStationCallSignTextChanged() ) ); connect(operatorsLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotOperatorsTextChanged() ) ); connect(okButton,SIGNAL(clicked()), this, SLOT(slotOKButtonClicked() ) ); connect(cancelButton, SIGNAL(clicked()), this, SLOT(slotCancelButtonClicked() ) ); QGridLayout *callsLayout = new QGridLayout; // Widget, row, column callsLayout->addWidget(stationCallsignLabel, 0, 0); callsLayout->addWidget(stationCallsignLineEdit, 0, 1); callsLayout->addWidget(dateLabel, 1, 0); callsLayout->addWidget(dateEdit, 1, 1); callsLayout->addWidget(operatorsLabel, 2, 0); callsLayout->addWidget(operatorsLineEdit, 2, 1); callsLayout->addWidget(commentLabel, 3, 0); callsLayout->addWidget(commentLineEdit, 3, 1); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addSpacerItem(new QSpacerItem(10,0,QSizePolicy::Expanding,QSizePolicy::Maximum)); buttonsLayout->addWidget(okButton); buttonsLayout->addWidget(cancelButton); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(callsLayout); mainLayout->addLayout(buttonsLayout); setLayout(mainLayout); clear(); //qDebug() << "SetupPageLogsNew::createWidget - End"; } void SetupPageLogsNew::slotOperatorsTextChanged() { //qDebug() << "SetupPageLogsNew::slotOperatorsTextChanged - Start"; // connect(stationCallsignLineEdit, SIGNAL(textChanged(QString)), this, SLOT( ) ); if ((operatorsLineEdit->text()).length()<1) { return; } int cursorP = operatorsLineEdit->cursorPosition(); QString currentQrz = util->getClearSQLi (operatorsLineEdit->text()); if ((currentQrz.at(cursorP-1)).isSpace()) { currentQrz = currentQrz.remove(cursorP-1, 1); cursorP--; operatorsLineEdit->setText(currentQrz); } operatorsLineEdit->setText(((operatorsLineEdit->text())).simplified()); operatorsLineEdit->setText((operatorsLineEdit->text()).toUpper()); operatorsLineEdit->setCursorPosition(cursorP); if (currentQrz.length()>=3) {//TODO: Add a check of the format (comma separated) operatorsFilled= true; } //qDebug() << "SetupPageLogsNew::slotOperatorsTextChanged - End"; } void SetupPageLogsNew::slotStationCallSignTextChanged() { //qDebug() << "SetupPageLogsNew::slotStationCallSignTextChanged"; // connect(stationCallsignLineEdit, SIGNAL(textChanged(QString)), this, SLOT( ) ); if ((stationCallsignLineEdit->text()).length()<1) { showNOK(); return; } int cursorP = stationCallsignLineEdit->cursorPosition(); QString currentQrz = util->getClearSQLi (stationCallsignLineEdit->text()); if ((currentQrz.at(cursorP-1)).isSpace()) { currentQrz = currentQrz.remove(cursorP-1, 1); cursorP--; stationCallsignLineEdit->setText(currentQrz); } stationCallsignLineEdit->setText(((stationCallsignLineEdit->text())).simplified()); stationCallsignLineEdit->setText((stationCallsignLineEdit->text()).toUpper()); stationCallsignLineEdit->setCursorPosition(cursorP); if (currentQrz.length()>=3) { stationCallsignFilled = true; } showOK(); //qDebug() << "SetupPageLogsNew::slotStationCallSignTextChanged - End"; } void SetupPageLogsNew::slotOKButtonClicked() { //qDebug() << "SetupPageLogsNew::slotOkButtonClicked"; stationCallsign = stationCallsignLineEdit->text(); if (stationCallsign.length()<3) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("You need to enter a valid callsign in the Station Callsign box.\nThe log will not be opened.")); msgBox.exec(); return; } operators = operatorsLineEdit->text(); //TODO: Check if operators is really including a comma separated list of QRZ comment = commentLineEdit->text(); dateString = dateEdit->date().toString("yyyy-MM-dd"); logData.clear(); logData << stationCallsign << operators << comment << dateString; if (editing) { logData << "1"; editing = false; } else { logData << "0"; } emit newLogData(logData); clear(); accept(); } void SetupPageLogsNew::gatherAndSend() { //qDebug() << "SetupPageLogsNew::gatherAndSend: " ; // The following lines will be removed once more contest types have been added //contestCatMode = contestCatModeComboBox->currentIndex(); //contestCatBands = contestCatBandsComboBox->currentIndex(); //contestCatPower = contestCatPowerComboBox->currentIndex(); //contestCatOperators = contestCatOperatorsComboBox->currentIndex(); //contestCatAssisted = contestCatAssistedComboBox->currentIndex(); //typeContestSelected = typeComboBox->currentIndex(); //contestCatOverlay = contestCatOverlayComboBox->currentIndex(); //typeContest = getSelectedTypeContest(); // The previous lines will be removed once more contest types have been added logData.clear(); logData << stationCallsign << operators << comment << dateString; /* << typeConteststr << QString::number(contestCatMode) << QString::number(contestCatOperators) << QString::number(contestCatAssisted) << QString::number(contestCatPower) << QString::number(contestCatBands) << QString::number(contestBands) << QString::number(contestCatOverlay) << QString::number(typeContest); */ if (editing) { logData << "1"; editing = false; } else { logData << "0"; } //logData << QString::number(typeContest) // Update the SetupPageLogs::slotAnalyzeNewLogData if you add or remove any field (Today 12) //qDebug() << "SetupPageLogsNew::gatherAndSend: EMITED"; emit newLogData(logData); } void SetupPageLogsNew::slotCancelButtonClicked() { //qDebug() << "SetupPageLogsNew::slotCancelButtonClicked"; logData.clear(); emit cancelled(true); setResult(QDialog::Rejected); clear(); close(); } /* QStringList SetupPageLogsNew::getValidCatOptions(const int _currentCat, const int _higherCat) {// currentCat is the current category and highercat is the category we want to know the information // being: // 1 - contestcatoperator // 2 - contestcatassisted // 3 - contestcatpower // 4 - contestcatband // 5 - contestcatoverlay // 6 - contestcatmode //qDebug() << "SetupPageLogsNew::getValidCatOptions: " << QString::number(_currentCat) <<"/"<< QString::number(_higherCat); //return dataProxy->getValidCatOptions(_currentCat, _higherCat); return QStringList(); } */ void SetupPageLogsNew::setStationCallSign(const QString &_st) { stationCallsign = _st; stationCallsignLineEdit->setText(stationCallsign.toUpper()); } void SetupPageLogsNew::setOperators(const QString &_st) { operators = _st; operatorsLineEdit->setText(operators.toUpper()); } void SetupPageLogsNew::setComment(const QString &_st) { comment = _st; commentLineEdit->setText(comment); } void SetupPageLogsNew::setDateString(const QString &_st) { dateString = _st; dateEdit->setDate(QDate::fromString(dateString, "yyyy-MM-dd")); } /* void SetupPageLogsNew::setType(const QString &_st) { typeConteststr = _st; //typeConteststr = typeComboBox->currentText(); typeComboBox->setCurrentIndex(typeComboBox->findText(typeConteststr, Qt::MatchExactly)); //findText ( const QString & text, Qt::MatchFlags flags = static_cast ( Qt::MatchExactly | Qt::MatchCaseSensitive ) ) const } void SetupPageLogsNew::setCMode(const int _n) { contestCatMode = _n; contestCatModeComboBox->setCurrentIndex(contestCatMode); } void SetupPageLogsNew::setCOperators(const int _n) { contestCatOperators = _n; contestCatOperatorsComboBox->setCurrentIndex(contestCatOperators); } void SetupPageLogsNew::setCAssisted(const int _n) { contestCatAssisted = _n; contestCatAssistedComboBox->setCurrentIndex(contestCatAssisted); } void SetupPageLogsNew::setCPower(const int _n) { contestCatPower = _n; contestCatPowerComboBox->setCurrentIndex(contestCatPower); } void SetupPageLogsNew::setCBands(const int _n) { contestCatBands = _n; contestCatBandsComboBox->setCurrentIndex(contestCatBands); } void SetupPageLogsNew::setBands(const int _n) { contestBands = _n; contestBandsComboBox->setCurrentIndex(contestBands); } void SetupPageLogsNew::setCOverlay(const int _n) { contestCatOverlay = _n; contestCatOverlayComboBox->setCurrentIndex(contestCatOverlay); } */ void SetupPageLogsNew::setEditing(const bool b) { editing = b; if (!editing) { clear(); } } /* int SetupPageLogsNew::getSelectedTypeContest() { //qDebug() << "SetupPageLogsNew::getSelectedTypeContest: "; //is/contest/catoperator/catassisted/catpower/catband/catoverlay/catmode int i = dataProxy->getContestTypeN(typeContestSelected, contestCatOperators, contestCatAssisted, contestCatPower, contestCatBands, contestCatOverlay, contestCatMode); //qDebug() << "SetupPageLogsNew::getSelectedTypeContest: " << QString::number(i); return i; } void SetupPageLogsNew::setTypeN(const int _n) { //qDebug() << "SetupPageLogsNew::setTypeN: " << QString::number(_n); typeContestSelected = _n; fillWithType(typeContestSelected); } void SetupPageLogsNew::fillWithType(const int _n) { //qDebug() << "SetupPageLogsNew::fillWithType - n = " << QString::number(_n); typeContestSelected = _n; QStringList contestData; contestData << dataProxy->getDataFromContestType(_n); //qDebug() << "SetupPageLogsNew::fillWithType-1 (length = " << QString::number(contestData.length()) << ")"; if (contestData.length()== 8) { //qDebug() << "SetupPageLogsNew::fillWithType-2"; //setCOperators ((contestData.at(1)).toInt()); //setCAssisted ((contestData.at(2)).toInt()); //setCPower ((contestData.at(3)).toInt()); //setCOverlay ((contestData.at(4)).toInt()); //setCMode ((contestData.at(5)).toInt()); //setType(contestData.at(6)); //setCBands((contestData.at(7)).toInt()); //qDebug() << "SetupPageLogsNew::fillWithType: " << contestData.at(6); } else { //qDebug() << "SetupPageLogsNew::fillWithType-3"; return; } } void SetupPageLogsNew::updateAllCats() { //qDebug() << "SetupPageLogsNew::updateAllCats"; contestCatMode = contestCatModeComboBox->currentIndex(); contestCatBands = contestCatBandsComboBox->currentIndex(); contestCatPower = contestCatPowerComboBox->currentIndex(); contestCatOperators = contestCatOperatorsComboBox->currentIndex(); contestCatAssisted = contestCatAssistedComboBox->currentIndex(); typeContestSelected = typeComboBox->currentIndex(); contestCatOverlay= contestCatOverlayComboBox->currentIndex(); typeContest = getSelectedTypeContest(); } */ void SetupPageLogsNew::showOK() { //validCats->setText(tr("Data OK")); //validCats->setStyleSheet("QLabel {color : black; }"); okButton->setEnabled(true); } void SetupPageLogsNew::showNOK() { //validCats->setText(tr("Data not OK")); //validCats->setStyleSheet("QLabel {color : red; }"); okButton->setEnabled(false); } klog-2.3.3/setuppages/setuppageelog.cpp0000644000015700001710000006223114542412415020071 0ustar jenkinsjenkins/*************************************************************************** setuppageelog.cpp - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include "setuppageelog.h" SetupPageELog::SetupPageELog(QWidget *parent) : QWidget(parent) { //qDebug() << "SetupPageELog::SetupPageELog"; util = new Utilities(Q_FUNC_INFO); util->setCallValidation(false); palRed.setColor(QPalette::Text, Qt::red); palBlack.setColor(QPalette::Text, Qt::black); clubLogEmailLineEdit = new QLineEdit; clubLogPasswordLineEdit = new QLineEdit; clubLogAppPasswordLineEdit = new QLineEdit; clubLogPasswordLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit); clubLogAppPasswordLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit); clubLogPasswordLabel = new QLabel(tr("ClubLog password")); clubLogAppPasswordLabel = new QLabel(tr("ClubLog App password")); clubLogEmailLabel = new QLabel(tr("ClubLog email")); clubLogAppPasswordLabel->setBuddy (clubLogAppPasswordLineEdit); clubLogPasswordLabel->setBuddy(clubLogPasswordLineEdit); clubLogEmailLabel->setBuddy(clubLogEmailLineEdit); clubLogEmailLineEdit->setToolTip(tr("Enter the email you used to register in ClubLog.")); clubLogPasswordLineEdit->setToolTip(tr("Enter your password ClubLog here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.)")); clubLogAppPasswordLineEdit->setToolTip(tr("Enter your application password ClubLog here. It can be obtained in ClubLog (Settings > App Passwords menu). Warning: The app password will be save on clear in the KLog config file!!")); QRegularExpression rx("\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b", QRegularExpression::CaseInsensitiveOption); clubLogEmailLineEdit->setValidator(new QRegularExpressionValidator(rx, this)); clubLogSendInRealTimeCheckBox = new QCheckBox(tr("Send QSOs in real time"), this); clubLogActiveCheckBox = new QCheckBox(tr("Activate ClubLog"), this); clubLogSendInRealTimeCheckBox->setToolTip(tr("Send each QSO to ClubLog in real time, as they are added (or modified) in KLog.")); clubLogActiveCheckBox->setToolTip(tr("Starts the ClubLog support in KLog.")); //qDebug() << "SetupPageELog::SetupPageELog - 00010"; eQSLUserLineEdit = new QLineEdit; eQSLPasswordLineEdit = new QLineEdit; eQSLPasswordLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit); eQSLActiveCheckBox = new QCheckBox(tr("Activate eQSL.cc"), this); eQSLUserLineEdit->setToolTip(tr("Enter your username of eQSL.cc.")); eQSLPasswordLineEdit->setToolTip(tr("Enter your password eQSL.cc here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.)")); //eQSLSendInRealTimeCheckBox = new QCheckBox(tr("Send QSOs in real time"), this); eQSLpasswordLabel = new QLabel(tr("eQSL.cc password")); eQSLemailLabel = new QLabel(tr("eQSL.cc user")); clubLogGroup = new QGroupBox (tr("ClubLog")); eQSLccGroup = new QGroupBox (tr("eQSL.cc")); //qDebug() << "SetupPageELog::SetupPageELog - 00020"; QGridLayout *cl1layout = new QGridLayout; cl1layout->addWidget(clubLogEmailLabel, 0, 0); cl1layout->addWidget(clubLogPasswordLabel, 1, 0); cl1layout->addWidget(clubLogAppPasswordLabel, 2, 0); cl1layout->addWidget(clubLogEmailLineEdit, 0, 1); cl1layout->addWidget(clubLogPasswordLineEdit, 1, 1); cl1layout->addWidget(clubLogAppPasswordLineEdit, 2, 1); QVBoxLayout *cl2layout = new QVBoxLayout; cl2layout->addWidget(clubLogActiveCheckBox); //cl2layout->addWidget(warningLabel); cl2layout->addLayout(cl1layout); cl2layout->addWidget(clubLogSendInRealTimeCheckBox); clubLogGroup->setLayout(cl2layout); //qDebug() << "SetupPageELog::SetupPageELog - 00030"; QGridLayout *e1layout = new QGridLayout; e1layout->addWidget(eQSLemailLabel, 0, 0); e1layout->addWidget(eQSLpasswordLabel, 1, 0); e1layout->addWidget(eQSLUserLineEdit, 0, 1); e1layout->addWidget(eQSLPasswordLineEdit, 1, 1); QVBoxLayout *e2layout = new QVBoxLayout; e2layout->addWidget(eQSLActiveCheckBox); e2layout->addLayout(e1layout); //e2layout->addWidget(eQSLSendInRealTimeCheckBox); eQSLccGroup->setLayout(e2layout); //qDebug() << "SetupPageELog::SetupPageELog - 00040"; QRZCOMGroup = new QGroupBox (tr("QRZ.com")); QRZCOMUserLineEdit = new QLineEdit; QRZCOMUserLineEdit->setToolTip(tr("Enter the user of your QRZ.com account. You need to be subscribed to QRZ.com to use this service.")); QRZCOMUserLabel = new QLabel(tr("User")); QRZCOMPasswordLineEdit = new QLineEdit; QRZCOMPasswordLineEdit->setToolTip(tr("Enter your password QRZ.com here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.)")); QRZCOMPasswordLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit); QRZCOMPasswordLabel = new QLabel(tr("Password")); QRZCOMActiveCheckBox = new QCheckBox(tr("Activate QRZ.com"), this); QRZCOMAutoCheckCheckBox = new QCheckBox(tr("Check automatically"), this); QRZCOMAutoCheckCheckBox->setToolTip(tr("Check in Qrz.com all Calls as they are entered")); //qDebug() << "SetupPageELog::SetupPageELog - 00050"; QRZCOMSubscriberCheckBox = new QCheckBox(tr("Paying Subscriber"), this); QRZCOMSubscriberCheckBox->setToolTip(tr("Check it if you are paying for a qrz.com subscription")); QRZLogBookKeyLabel = new QLabel(tr("LogBook Key")); QRZCOMLogBookKEYLineEdit = new QLineEdit; QRZCOMLogBookKEYLineEdit->setToolTip(tr("LogBook Key for QSO uploading. You can get this key in your QRZ.com logbook webpage. Remember that you need a QRZ.com subscription to use this feature.")); QGridLayout *q1layout = new QGridLayout; q1layout->addWidget(QRZCOMUserLabel, 0, 0); q1layout->addWidget(QRZCOMPasswordLabel, 1, 0); q1layout->addWidget(QRZCOMUserLineEdit, 0, 1); q1layout->addWidget(QRZCOMPasswordLineEdit, 1, 1); q1layout->addWidget(QRZCOMSubscriberCheckBox,0,2); QHBoxLayout *qrzcomKeyLayout = new QHBoxLayout; qrzcomKeyLayout->addWidget(QRZLogBookKeyLabel); qrzcomKeyLayout->addWidget(QRZCOMLogBookKEYLineEdit); QHBoxLayout *qrzcomActive = new QHBoxLayout; qrzcomActive->addWidget(QRZCOMActiveCheckBox); //qrzcomActive->addWidget(QRZCOMSubscriberCheckBox); //qDebug() << "SetupPageELog::SetupPageELog - 00070"; QVBoxLayout *qrzLayout = new QVBoxLayout; qrzLayout->addLayout(qrzcomActive); qrzLayout->addLayout(q1layout); qrzLayout->addWidget(QRZCOMAutoCheckCheckBox); qrzLayout->addLayout(qrzcomKeyLayout); QRZCOMGroup->setLayout(qrzLayout); //qDebug() << "SetupPageELog::SetupPageELog - 00080"; lotwGroup = new QGroupBox (tr("LoTW")); lotwUpGroup = new QGroupBox (tr("Upload")); lotwDownGroup = new QGroupBox (tr("Download")); lotwUserLineEdit = new QLineEdit; lotwUserLineEdit->setValidator(new QRegularExpressionValidator(rx, this)); lotwPasswordLineEdit = new QLineEdit; lotwPasswordLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit); lotwTQSLPathLineEdit = new QLineEdit; lotwSearchTQSLPushButton = new QPushButton(tr("TQSL path"), this); lotwUseTQSLCheckBox = new QCheckBox(tr("Use TQSL"), this); lotwpasswordLabel = new QLabel(tr("LoTW password")); lotwemailLabel = new QLabel(tr("LoTW user")); lotwUserLineEdit->setToolTip(tr("Enter your LoTW user.")); lotwPasswordLineEdit->setToolTip(tr("Enter your password LoTW here. Warning: The password will be save on clear in the KLog config file!! (If you don't want to enter the password, KLog will ask you when it is needed.)")); lotwTQSLPathLineEdit->setToolTip(tr("Path to the TQSL software.")); lotwSearchTQSLPushButton->setToolTip(tr("Enable the LoTW integration with TQSL. You will need to have TQSL installed")); QHBoxLayout *l1layout = new QHBoxLayout; l1layout->addWidget(lotwTQSLPathLineEdit); l1layout->addWidget(lotwSearchTQSLPushButton); //lotwUpGroup->setLayout(l1layout); QVBoxLayout *l2layout = new QVBoxLayout; l2layout->addWidget(lotwUseTQSLCheckBox); l2layout->addLayout(l1layout); lotwUpGroup->setLayout(l2layout); QGridLayout *l3layout = new QGridLayout; l3layout->addWidget(lotwemailLabel, 0, 0); l3layout->addWidget(lotwpasswordLabel, 1, 0); l3layout->addWidget(lotwUserLineEdit, 0, 1); l3layout->addWidget(lotwPasswordLineEdit, 1, 1); lotwDownGroup->setLayout(l3layout); //qDebug() << "SetupPageELog::SetupPageELog - 00100"; QVBoxLayout *llayout = new QVBoxLayout; //llayout->addLayout(l2layout); llayout->addWidget(lotwUpGroup); llayout->addWidget(lotwDownGroup); lotwGroup->setLayout(llayout); //qDebug() << "SetupPageELog::SetupPageELog - 00110"; QVBoxLayout *v1layout = new QVBoxLayout; v1layout->addWidget(clubLogGroup); v1layout->addWidget(eQSLccGroup); //qDebug() << "SetupPageELog::SetupPageELog - 00120"; QVBoxLayout *v2layout = new QVBoxLayout; v2layout->addWidget(QRZCOMGroup); v2layout->addWidget(lotwGroup); //qDebug() << "SetupPageELog::SetupPageELog - 00130"; QHBoxLayout *mlayout = new QHBoxLayout; mlayout->addLayout(v1layout); mlayout->addLayout(v2layout); setLayout(mlayout); //qDebug() << "SetupPageELog::SetupPageELog - 00140"; connect(clubLogActiveCheckBox, SIGNAL(toggled(bool) ), this, SLOT(slotClubLogActive(bool))); connect(clubLogPasswordLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(clubLogAppPasswordLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(clubLogEmailLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(eQSLUserLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(eQSLPasswordLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(eQSLActiveCheckBox, SIGNAL(toggled(bool) ), this, SLOT(slotEQSLActive(bool))); connect(eQSLUserLineEdit, SIGNAL(textChanged(QString)), this, SLOT(sloteQSLCallTextChanged() ) ); //qDebug() << "SetupPageELog::SetupPageELog - 00150"; connect(QRZCOMActiveCheckBox, SIGNAL(toggled(bool) ), this, SLOT(slotQRZCOMActive(bool))); //connect(QRZCOMAutoCheckCheckBox, SIGNAL(toggled(bool) ), this, SLOT(slotQRZCOMAuto(bool))); connect(QRZCOMUserLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(QRZCOMUserLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotQRZCallTextChanged() ) ); connect(QRZCOMPasswordLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); //qDebug() << "SetupPageELog::SetupPageELog - 00160"; connect(lotwUserLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(lotwPasswordLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(lotwTQSLPathLineEdit, SIGNAL(returnPressed()), this, SLOT(slotEnterKeyPressed() ) ); connect(lotwSearchTQSLPushButton, SIGNAL(clicked()), this, SLOT(slotSelectTQSLClicked()) ); connect(lotwTQSLPathLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotPathLineEditChanged(QString)) ); connect(lotwUseTQSLCheckBox, SIGNAL(toggled(bool) ), this, SLOT(slotTQSLActive(bool))); connect(clubLogEmailLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotClubLogEmailDefineColor() ) ); connect(lotwUserLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotLoTWEmailDefineColor() ) ); //qDebug() << "SetupPageELog::SetupPageELog - 00150"; setDefaults(); slotClubLogActive(false); setLoTWActive(false); slotTQSLActive(false); slotEQSLActive(false); slotQRZCOMActive(false); //qDebug() << "SetupPageELog::SetupPageELog - END"; } SetupPageELog::~SetupPageELog() { delete(util); } void SetupPageELog::slotQRZCallTextChanged() { //qDebug() << "SetupPageELog::slotQRZCallTextChanged"; int cursor = QRZCOMUserLineEdit->cursorPosition(); //qDebug() << "SetupPageELog::slotQRZCallTextChanged-1"; QString aux = util->getClearSQLi (QRZCOMUserLineEdit->text()); //qDebug() << "SetupPageELog::slotQRZCallTextChanged-2"; if (util->isValidCall(aux)) { //qDebug() << "SetupPageELog::slotQRZCallTextChanged-2.1"; QRZCOMUserLineEdit->setPalette(palBlack); } else { //qDebug() << "SetupPageELog::slotQRZCallTextChanged-2.2"; QRZCOMUserLineEdit->setPalette(palRed); } //qDebug() << "SetupPageELog::slotQRZCallTextChanged-3"; QRZCOMUserLineEdit->setText(aux.toUpper()); //qDebug() << "SetupPageELog::slotQRZCallTextChanged-4"; QRZCOMUserLineEdit->setCursorPosition(cursor); //qDebug() << "SetupPageELog::slotQRZCallTextChanged - END"; } void SetupPageELog::sloteQSLCallTextChanged() { //qDebug() << "SetupPageELog::sloteQSLCallTextChanged"; int cursor = eQSLUserLineEdit->cursorPosition(); QString aux = util->getClearSQLi (eQSLUserLineEdit->text()); if (util->isValidCall(aux)) { eQSLUserLineEdit->setPalette(palBlack); } else { eQSLUserLineEdit->setPalette(palRed); } eQSLUserLineEdit->setText(aux.toUpper()); eQSLUserLineEdit->setCursorPosition(cursor); //qDebug() << "SetupPageELog::sloteQSLCallTextChanged - END"; } void SetupPageELog::slotClubLogEmailDefineColor() { //qDebug() << "SetupPageELog::slotClubLogEmailDefineColor"; if(!clubLogEmailLineEdit->hasAcceptableInput()) clubLogEmailLineEdit->setStyleSheet("QLineEdit { color: red;}"); else clubLogEmailLineEdit->setStyleSheet("QLineEdit { color: black;}"); } void SetupPageELog::slotLoTWEmailDefineColor() { //qDebug() << Q_FUNC_INFO << ": " << lotwUserLineEdit->text(); int cursor = lotwUserLineEdit->cursorPosition(); QString aux = lotwUserLineEdit->text(); if (util->isValidCall(aux)) { lotwUserLineEdit->setPalette(palBlack); } else { lotwUserLineEdit->setPalette(palRed); } lotwUserLineEdit->setText(aux.toUpper()); lotwUserLineEdit->setCursorPosition(cursor); } void SetupPageELog::setDefaults() { //qDebug() << "SetupPageELog::setDefaults()"; QRZCOMActiveCheckBox->setChecked (false); QRZCOMAutoCheckCheckBox->setChecked (false); QRZCOMPasswordLineEdit->clear (); QRZCOMUserLineEdit->clear(); QRZCOMLogBookKEYLineEdit->clear (); clubLogActiveCheckBox->setChecked (false); clubLogSendInRealTimeCheckBox->setChecked (false); clubLogEmailLineEdit->clear (); clubLogPasswordLineEdit->clear(); clubLogAppPasswordLineEdit->clear(); eQSLActiveCheckBox->setChecked(false); eQSLPasswordLineEdit->clear(); eQSLUserLineEdit->clear(); lotwPasswordLineEdit->clear (); lotwUserLineEdit->clear (); lotwPasswordLineEdit->clear (); //qDebug() << "SetupPageELog::setDefaults() - END"; } void SetupPageELog::setClubLogActive(const bool &_b) { clubLogActiveCheckBox->setChecked(_b); clubLogSendInRealTimeCheckBox->setEnabled(_b); } void SetupPageELog::slotClubLogActive(const bool _s) { //qDebug() << "SetupPageELog::slotClubLogActive: " << util->boolToQString(_s); clubLogEmailLabel->setEnabled(_s); clubLogPasswordLabel->setEnabled(_s); clubLogEmailLineEdit->setEnabled(_s); clubLogPasswordLineEdit->setEnabled(_s); clubLogAppPasswordLineEdit->setEnabled(_s); clubLogSendInRealTimeCheckBox->setEnabled(_s); //qDebug() << "SetupPageELog::slotClubLogActive"; } // END of CLubLog // Start of eQSL.CC void SetupPageELog::slotEQSLActive(const bool _s) { //qDebug() << "SetupPageELog::slotEQSLActive: " << util->boolToQString(_s); eQSLemailLabel->setEnabled(_s); eQSLpasswordLabel->setEnabled(_s); eQSLUserLineEdit->setEnabled(_s); eQSLPasswordLineEdit->setEnabled(_s); } void SetupPageELog::slotTQSLActive(const bool _s) { //qDebug() << "SetupPageELog::slotTQSLActive: " << util->boolToQString(_s); setLoTWActive(_s); } // END of eQSL.CC // Start of LoTW void SetupPageELog::setLoTWActive(const bool &_s) { lotwUseTQSLCheckBox->setChecked(_s); lotwTQSLPathLineEdit->setEnabled(_s); lotwSearchTQSLPushButton->setEnabled(_s); } void SetupPageELog::slotSelectTQSLClicked() { //qDebug() << "SetupPageELogr::slotSelectTQSLClicked: " << QStandardPaths::ApplicationsLocation; QString appsDir= util->getTQSLsPath(); //QString proposedName = util->getTQSLsFileName(); QString filter; filter.clear(); #if defined(Q_OS_WIN) filter = "TQSL (*.exe)"; #elif defined(Q_OS_MACOS) filter = "TQSL (*.app)"; #else filter = "TQSL (tqsl)"; //filter = "TQSL (tqsl*)"; #endif QString tqslFile; tqslFile.clear(); tqslFile = QFileDialog::getOpenFileName(this, tr("Select File"), appsDir, filter); if (tqslFile.length()>0) { lotwTQSLPathLineEdit->setText(tqslFile); } //qDebug() << "SetupPageELogr::slotSelectTQSLClicked - END"; } void SetupPageELog::slotPathLineEditChanged(const QString &_q) { if (QFile::exists(_q)) { lotwTQSLPathLineEdit->setPalette(palBlack); } else { lotwTQSLPathLineEdit->setPalette(palRed); } } // END of LoTW void SetupPageELog::slotEnterKeyPressed() { emit enterKey(); } // QRZ.COM void SetupPageELog::setQRZCOMActive(const bool _s) { //qDebug() << "SetupPageELog::setQRZCOMActive "; QRZCOMActiveCheckBox->setChecked(_s); QRZCOMAutoCheckCheckBox->setEnabled(_s); } void SetupPageELog::slotQRZCOMActive(bool _s) { //qDebug() << "SetupPageELog::slotQRZCOMActive: " << util->boolToQString(_s); QRZCOMUserLabel->setEnabled(_s); //qDebug() << "SetupPageELog::slotQRZCOMActive - 1"; QRZCOMUserLineEdit->setEnabled(_s); //qDebug() << "SetupPageELog::slotQRZCOMActive - 2"; QRZCOMPasswordLabel->setEnabled(_s); //qDebug() << "SetupPageELog::slotQRZCOMActive - 3"; QRZCOMPasswordLineEdit->setEnabled(_s); QRZCOMAutoCheckCheckBox->setEnabled(_s); //qDebug() << "SetupPageELog::slotQRZCOMActive - END"; //if (!QRZCOMActiveCheckBox->isChecked()) //{ // QRZCOMAutoCheckCheckBox->setChecked(false); // } } //void SetupPageELog::slotQRZCOMAuto(const bool _s) //{ // emit qrzcomAuto(_s); //} void SetupPageELog::setQRZCOMAutoCheck(const bool _s) { QRZCOMAutoCheckCheckBox->setChecked(_s); } void SetupPageELog::showEvent(QShowEvent *event) { //clubLogSendInRealTimeCheckBox->setChecked(clubLogRealTime); //qDebug() << Q_FUNC_INFO << ": " << util->boolToQString (clubLogSendInRealTimeCheckBox->isChecked ()); //clubLogActiveCheckBox->setChecked(clubLogActive); //clubLogPasswordLineEdit->setText(clubLogPass); //clubLogEmailLineEdit->setText(clubLogEmail); //QRZCOMUserLineEdit->setText(qrzComUser); //QRZCOMPasswordLineEdit->setText(qrzcomPass); //QRZCOMActiveCheckBox->setChecked(qrzcomActive); // QRZCOMAutoCheckCheckBox->setChecked(qrzcomAutoFill); //QRZCOMLogBookKEYLineEdit->setText(qrcomLogbookKey); //eQSLUserLineEdit->setText(eqslUser); //eQSLPasswordLineEdit->setText(eqslPass); // eQSLActiveCheckBox->setChecked(eqslActive); //lotwUserLineEdit->setText(lotwUser); //lotwPasswordLineEdit->setText(lotwPass); //lotwUseTQSLCheckBox->setChecked(lotwTQSL); //lotwTQSLPathLineEdit->setText(lotwPath); event->accept(); } void SetupPageELog::saveSettings() { //qDebug() << Q_FUNC_INFO ; QSettings settings(util->getCfgFile (), QSettings::IniFormat); //settings.beginGroup ("eLogs"); settings.beginGroup ("ClubLog"); settings.setValue ("ClubLogActive", QVariant((clubLogActiveCheckBox->isChecked()))); settings.setValue ("ClubLogRealTime", QVariant((clubLogSendInRealTimeCheckBox->isChecked()))); settings.setValue ("ClubLogEmail", clubLogEmailLineEdit->text ()); settings.setValue ("ClubLogPass", clubLogPasswordLineEdit->text()); settings.setValue ("ClubLogAppPass", clubLogAppPasswordLineEdit->text()); settings.endGroup (); settings.beginGroup ("eQSL"); settings.setValue ("eQSLActive", QVariant((eQSLActiveCheckBox->isChecked()))); settings.setValue ("eQSLCall", eQSLUserLineEdit->text ()); settings.setValue ("eQSLPass", eQSLPasswordLineEdit->text()); settings.endGroup (); settings.beginGroup ("QRZcom"); settings.setValue ("QRZcomActive", QVariant((QRZCOMActiveCheckBox->isChecked()))); settings.setValue ("QRZcomUser", QRZCOMUserLineEdit->text ()); settings.setValue ("QRZcomPass", QRZCOMPasswordLineEdit->text()); settings.setValue ("QRZcomSubscriber", QVariant((QRZCOMSubscriberCheckBox->isChecked()))); settings.setValue ("QRZcomAuto", QVariant((QRZCOMAutoCheckCheckBox->isChecked()))); settings.setValue ("QRZcomLogBookKey", QRZCOMLogBookKEYLineEdit->text ()); settings.endGroup (); settings.beginGroup ("LoTW"); settings.setValue ("LoTWActive", QVariant((lotwUseTQSLCheckBox->isChecked()))); settings.setValue ("LoTWPath", lotwTQSLPathLineEdit->text()); settings.setValue ("LoTWUser", lotwUserLineEdit->text()); settings.setValue ("LoTWPass", lotwPasswordLineEdit->text()); settings.endGroup (); } void SetupPageELog::loadSettings() { QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("ClubLog"); clubLogActiveCheckBox->setChecked (settings.value("ClubLogActive").toBool ()); clubLogSendInRealTimeCheckBox->setChecked (settings.value("ClubLogRealTime").toBool ()); //qDebug() << Q_FUNC_INFO << ": realTime: " << util->boolToQString (clubLogSendInRealTimeCheckBox->isChecked ()); clubLogEmailLineEdit->setText (settings.value("ClubLogEmail").toString ()); clubLogPasswordLineEdit->setText (settings.value("ClubLogPass").toString ()); clubLogAppPasswordLineEdit->setText (settings.value("ClubLogAppPass").toString ()); settings.endGroup (); settings.beginGroup ("eQSL"); eQSLActiveCheckBox->setChecked (settings.value("eQSLActive").toBool ()); eQSLUserLineEdit->setText (settings.value("eQSLCall").toString ()); eQSLPasswordLineEdit->setText (settings.value("eQSLPass").toString ()); settings.endGroup (); settings.beginGroup ("QRZcom"); QRZCOMActiveCheckBox->setChecked (settings.value("QRZcomActive").toBool ()); QRZCOMSubscriberCheckBox->setChecked (settings.value("QRZcomSubscriber").toBool ()); QRZCOMAutoCheckCheckBox->setChecked (settings.value("QRZcomAuto").toBool ()); QRZCOMUserLineEdit->setText (settings.value("QRZcomUser").toString ()); QRZCOMPasswordLineEdit->setText (settings.value("QRZcomPass").toString ()); QRZCOMLogBookKEYLineEdit->setText(settings.value("QRZcomLogBookKey").toString ()); settings.endGroup (); settings.beginGroup ("LoTW"); lotwUseTQSLCheckBox->setChecked (settings.value("LoTWActive").toBool ()); lotwUserLineEdit->setText (settings.value("LoTWUser").toString ()); //qDebug() << Q_FUNC_INFO << ": LoTWUser: " << lotwUserLineEdit->text (); lotwPasswordLineEdit->setText (settings.value("LoTWPass").toString ()); lotwTQSLPathLineEdit->setText (settings.value("LoTWPath").toString ()); settings.endGroup (); } klog-2.3.3/setuppages/setuppagelogview.h0000644000015700001710000000473114542412415020265 0ustar jenkinsjenkins#ifndef KLOG_SETUPPAGES_SETUPPAGELOGVIEW_H #define KLOG_SETUPPAGES_SETUPPAGELOGVIEW_H /*************************************************************************** setuppagelogview.h - description ------------------- begin : ago 2021 copyright : (C) 2021 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include "../dataproxy_sqlite.h" #include "../utilities.h" class SetupPageLogView : public QWidget { Q_OBJECT public: SetupPageLogView(DataProxy_SQLite *dp, QWidget *parent=nullptr); ~SetupPageLogView(); void init(); //QString getFields(); void saveSettings(); void loadSettings(); signals: public slots: private: void addFields (QStringList _b); // read the available fields from the DB QStringList getActiveFields(); void setActiveFields(QStringList _q); QListWidget *fieldsListWidget; DataProxy_SQLite *dataProxy; }; #endif // SETUPPAGELOGVIEW_H klog-2.3.3/setuppages/setuppagebandmode.cpp0000644000015700001710000001402614542412415020713 0ustar jenkinsjenkins/*************************************************************************** setuppagebandmode.cpp - description ------------------- begin : nov 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "../setuppages/setuppagebandmode.h" SetupPageBandMode::SetupPageBandMode(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "SetupPageBandMode::SetupPageBandMode" ; dataProxy = dp; bandsListWidget = new QListWidget; modesListWidget = new QListWidget; QHBoxLayout *layout = new QHBoxLayout; QVBoxLayout *bLayout = new QVBoxLayout; QVBoxLayout *mLayout = new QVBoxLayout; QLabel *bandsLabel = new QLabel(bandsListWidget); bandsLabel->setText(tr("Bands")); bandsLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *modesLabel = new QLabel(modesListWidget); modesLabel->setText(tr("Modes")); modesLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); addBands(dataProxy->getBands()); addModes(dataProxy->getModes()); bLayout->addWidget(bandsLabel); bLayout->addWidget(bandsListWidget); mLayout->addWidget(modesLabel); mLayout->addWidget(modesListWidget); layout->addLayout(bLayout); layout->addLayout(mLayout); //layout->addWidget(bandsListWidget); //layout->addWidget(modesListWidget); setLayout(layout); //qDebug() << "SetupPageBandMode::SetupPageBandMode - END" ; } SetupPageBandMode::~SetupPageBandMode() {} void SetupPageBandMode::addBands(QStringList _b) { bandsListWidget->addItems(_b); QListWidgetItem* item = 0; for(int i = 0; i < bandsListWidget->count(); ++i){ item = bandsListWidget->item(i); item->setFlags(item->flags() | Qt::ItemIsUserCheckable); item->setCheckState(Qt::Unchecked); } } void SetupPageBandMode::addModes(QStringList _b) { modesListWidget->addItems(_b); QListWidgetItem* item = 0; for(int i = 0; i < modesListWidget->count(); ++i){ item = modesListWidget->item(i); item->setFlags(item->flags() | Qt::ItemIsUserCheckable); item->setCheckState(Qt::Unchecked); } } QStringList SetupPageBandMode::getBands() { //qDebug() << "SetupPageBandMode::getBands"; if ( (bandsListWidget->count()) < 1) { return QStringList(); } QListWidgetItem *it; QStringList _bands; _bands.clear(); for (int i = 0; i < bandsListWidget->count(); i++) { it = bandsListWidget->item(i); if (it->checkState() == Qt::Checked) { _bands.append (it->text()); } } return _bands; } QStringList SetupPageBandMode::getModes() { //qDebug() << "SetupPageBandMode::getModes"; if ( (modesListWidget->count()) < 1) { return QStringList(); } QListWidgetItem *it; QStringList _modes; _modes.clear (); for (int i = 0; i < modesListWidget->count(); i++) { it = modesListWidget->item(i); if (it->checkState() == Qt::Checked) { _modes.append (it->text()); } } return _modes; } void SetupPageBandMode::setActiveBands(QStringList q) { //qDebug() << "SetupPageBandMode::setActiveBands"; if (q.isEmpty()) {return;} //QString b; QListWidgetItem *it; if ( (bandsListWidget->count()) < 1) { return; } for (int i = 0; i < bandsListWidget->count(); i++) { it = bandsListWidget->item(i); it->setCheckState(Qt::Unchecked); for (int j=0;jtext() == q.at(j)) { it->setCheckState(Qt::Checked); } } } } void SetupPageBandMode::setActiveModes(QStringList q) { //qDebug() << "SetupPageBandMode::setActiveModes"; if (q.isEmpty()) {return;} //QString b; QListWidgetItem *it; if ( (modesListWidget->count()) < 1) { return; } for (int i = 0; i < modesListWidget->count(); i++) { it = modesListWidget->item(i); it->setCheckState(Qt::Unchecked); for (int j=0;jtext() == q.at(j)) { it->setCheckState(Qt::Checked); } } } } void SetupPageBandMode::saveSettings() { //qDebug() << Q_FUNC_INFO ; util = new Utilities(Q_FUNC_INFO); QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("BandMode"); settings.setValue ("Bands", getBands ()); settings.setValue ("Modes", getModes ()); settings.endGroup (); } klog-2.3.3/setuppages/setuppagesatsnew.cpp0000644000015700001710000003355414542412415020635 0ustar jenkinsjenkins/*************************************************************************** SetupPageSatsNew.h - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implements the Dialog to add a new log // #include "setuppagesatsnew.h" SetupPageSatsNew::SetupPageSatsNew(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "SetupPageSatsNew::SetupPageSatsNew" ; Q_UNUSED(parent); dataProxy = dp; util = new Utilities(Q_FUNC_INFO); editing = false; //checking = false; shortNameLineEdit = new QLineEdit(); nameLineEdit = new QLineEdit(); uplinkLineEdit = new QLineEdit(); downlinkLineEdit = new QLineEdit(); modesLineEdit = new QLineEdit(); shortNameLabel = new QLabel(tr("Short name")); nameLabel = new QLabel(tr("Sat name")); uplinkLabel = new QLabel(tr("UpLink")); downlinkLabel = new QLabel(tr("DownLink")); modesLabel = new QLabel(tr("Modes")); clear(); //satData.clear(); okButton = new QPushButton(tr("&Ok"), this); cancelButton = new QPushButton(tr("&Cancel"), this); createUI(); okButton->setEnabled(true); //qDebug() << "SetupPageSatsNew::SetupPageSatsNew - END" ; } SetupPageSatsNew::~SetupPageSatsNew() { delete(dataProxy); delete(util); } void SetupPageSatsNew::clear() { shortName = QString(); name = QString(); uplink = QString(); downlink = QString(); modes = QString(); hasShortName = false; hasName = false; hasUplink = false; hasDownlink = false; hasModes = false; shortNameLineEdit->clear(); nameLineEdit->clear(); uplinkLineEdit->clear(); downlinkLineEdit->clear(); modesLineEdit->clear(); } void SetupPageSatsNew::createUI() { //qDebug() << "SetupPageSatsNew::createWidget"; shortNameLabel->setWordWrap(true); nameLabel->setWordWrap(true); uplinkLabel->setWordWrap(true); downlinkLabel->setWordWrap(true); modesLabel->setWordWrap(true); shortNameLabel->setBuddy(shortNameLineEdit); nameLabel->setBuddy(nameLineEdit); uplinkLabel->setBuddy(uplinkLineEdit); downlinkLabel->setBuddy(downlinkLineEdit); modesLabel->setBuddy(modesLineEdit); shortNameLineEdit->setToolTip(tr("Enter the short name. Try to use the LoTW short name so you can upload your QSO to LoTW afterwards.")); nameLineEdit->setToolTip(tr("Enter the name of the satellite.")); uplinkLineEdit->setToolTip(tr("Enter the uplink frequencies in this format: 144.300")); downlinkLineEdit->setToolTip(tr("Enter the downlink frequencies in this format: 144.300")); modesLineEdit->setToolTip(tr("Enter the modes in this format: USB")); connect(shortNameLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotShortNameTextChanged() ) ); connect(nameLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotNameTextChanged() ) ); connect(uplinkLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotUpLinkTextChanged() ) ); connect(downlinkLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotDownLinkTextChanged() ) ); connect(modesLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotModesTextChanged() ) ); connect(okButton,SIGNAL(clicked()), this, SLOT(slotOKButtonClicked() ) ); connect(cancelButton, SIGNAL(clicked()), this, SLOT(slotCancelButtonClicked() ) ); QGridLayout *dataLayout = new QGridLayout; // Widget, row, column dataLayout->addWidget(shortNameLabel, 0, 0); dataLayout->addWidget(shortNameLineEdit, 0, 1); dataLayout->addWidget(nameLabel, 1, 0); dataLayout->addWidget(nameLineEdit, 1, 1); dataLayout->addWidget(uplinkLabel, 2, 0); dataLayout->addWidget(uplinkLineEdit, 2, 1); dataLayout->addWidget(downlinkLabel, 3, 0); dataLayout->addWidget(downlinkLineEdit, 3, 1); dataLayout->addWidget(modesLabel, 4, 0); dataLayout->addWidget(modesLineEdit, 4, 1); QHBoxLayout *buttonsLayout = new QHBoxLayout; //buttonsLayout->addWidget(validCats); buttonsLayout->addSpacerItem(new QSpacerItem(10,0,QSizePolicy::Expanding,QSizePolicy::Maximum)); buttonsLayout->addWidget(okButton); buttonsLayout->addWidget(cancelButton); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(dataLayout); mainLayout->addLayout(buttonsLayout); setLayout(mainLayout); clear(); } void SetupPageSatsNew::slotShortNameTextChanged() { int cursorP = shortNameLineEdit->cursorPosition(); shortNameLineEdit->setText((shortNameLineEdit->text()).toUpper()); if ((shortNameLineEdit->text()).length()>2) { hasShortName = true; } else { hasShortName = false; } shortNameLineEdit->setCursorPosition(cursorP); } void SetupPageSatsNew::slotNameTextChanged() { int cursorP = nameLineEdit->cursorPosition(); nameLineEdit->setText((nameLineEdit->text()).toUpper()); if ((nameLineEdit->text()).length()>2) { hasName = true; } else { hasName = false; } nameLineEdit->setCursorPosition(cursorP); } void SetupPageSatsNew::slotUpLinkTextChanged() { /* Format: Single freq: 145.600 Range: 145.600-145.700 Two freqs or ranges: 145.600,145.650 or 145.600,145.600-145.700 */ //qDebug() << "SetupPageSatsNew::slotUpLinkTextChanged:" << uplinkLineEdit->text() ; if ((uplinkLineEdit->text()).length()<2) { return; } QStringList freqs; freqs.clear(); QString aux = uplinkLineEdit->text(); // QString str = QString(); freqs << aux.split(','); hasUplink = true; foreach (aux, freqs) { if (aux.contains('-')) { // It is a range //qDebug() << "SetupPageSatsNew::slotUpLinkTextChanged: It is a range: " << aux; } else { //It is just one freq if (!isItAFreq(aux)) { hasUplink = false; } } } } bool SetupPageSatsNew::isItAFreq(const QString &_st) { //qDebug() << "SetupPageSatsNew::isItAFreq: It is one freq: " << _st; bool ok = false; double freq = _st.toDouble(&ok); return ((freq>=0.0) && (ok)); } void SetupPageSatsNew::slotDownLinkTextChanged() { /* Format: Single freq: 145.600 Range: 145.600-145.700 Two freqs or ranges: 145.600,145.650 or 145.600,145.600-145.700 */ if ((downlinkLineEdit->text()).length()<2) { return; } QStringList freqs; freqs.clear(); QString aux = downlinkLineEdit->text(); // QString str = QString(); freqs << aux.split(','); hasDownlink = true; foreach (aux, freqs) { if (aux.contains('-')) { // It is a range //qDebug() << "SetupPageSatsNew::slotUpLinkTextChanged: It is a range: " << aux; } else { //It is just one freq if (isItAFreq(aux)) { hasDownlink = false; } } } } void SetupPageSatsNew::slotModesTextChanged() { /* Format: Single mode: USB Two modes: USB,LSB One mode per up/down USB/LSB */ //qDebug() << "SetupPageSatsNew::slotModesTextChanged: " << modesLineEdit->text(); int cursorP = modesLineEdit->cursorPosition(); modesLineEdit->setText((modesLineEdit->text()).toUpper()); QString aux = QString(); QString aux2 = QString(); hasModes = false; if ((modesLineEdit->text()).length()<2) { return; } //qDebug() << "SetupPageSatsNew::slotModesTextChanged: length >=2"; QStringList _modes; _modes.clear(); _modes = (modesLineEdit->text()).split(','); //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Starting to process the list" ; foreach (aux, _modes) { //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Processing: " << aux; if (aux.contains('/')) {// It s a pair of modes (up and down link) QStringList _pair; _pair.clear(); _pair << aux.split('/'); foreach (aux2, _pair) { //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Processing aux2: " << aux2; if (dataProxy->getIdFromModeName(aux2)>0) { //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Checking2: true: " << aux2; hasModes = true; } else { //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Checking2: false: " << aux2; hasModes = false; } } } else { //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Checking: " << aux; if (dataProxy->getSubModeIdFromSubMode(aux)>0) { //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Checking: true: " << aux; hasModes = true; } else { //qDebug() << "SetupPageSatsNew::slotModesTextChanged: Checking: false: " << aux; hasModes = false; } } } modesLineEdit->setCursorPosition(cursorP); } void SetupPageSatsNew::setShortName(const QString st) { shortNameLineEdit->setText(st.toUpper()); } void SetupPageSatsNew::setName(const QString st) { nameLineEdit->setText(st.toUpper()); } void SetupPageSatsNew::setUpLink(const QString st) { uplinkLineEdit->setText(st); } void SetupPageSatsNew::setDownLink(const QString st) { downlinkLineEdit->setText(st); } void SetupPageSatsNew::setModes(const QString st) { modesLineEdit->setText(st.toUpper()); } void SetupPageSatsNew::slotOKButtonClicked() { //qDebug() << "SetupPageSatsNew::slotOkButtonClicked"; shortName = shortNameLineEdit->text(); name = nameLineEdit->text(); uplink = uplinkLineEdit->text(); downlink = downlinkLineEdit->text(); modes = modesLineEdit->text(); if (hasShortName && hasName && (hasUplink || hasDownlink) && hasModes) { gatherAndSend(); editing = false; close(); } else { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("Some of the data you have entered is not correct; the satellite can't be added.")); msgBox.exec(); if (!hasShortName) { //qDebug() << "SetupPageSatsNew::slotOkButtonClicked hasShortName is FALSE"; } else if (!hasName) { //qDebug() << "SetupPageSatsNew::slotOkButtonClicked hasName is FALSE"; } else if (!hasUplink) { //qDebug() << "SetupPageSatsNew::slotOkButtonClicked hasUpLink is FALSE"; } else if (!hasDownlink) { //qDebug() << "SetupPageSatsNew::slotOkButtonClicked hasDownLink is FALSE"; } else if (!hasModes) { //qDebug() << "SetupPageSatsNew::slotOkButtonClicked hasModes is FALSE"; } } //close(); } void SetupPageSatsNew::gatherAndSend() { //qDebug() << "SetupPageSatsNew::gatherAndSend: "; // The previous lines will be removed once more contest types have been added satData.clear(); satData << shortNameLineEdit->text() << nameLineEdit->text() << downlinkLineEdit->text() << uplinkLineEdit->text() << modesLineEdit->text(); int satId = dataProxy->getDBSatId(shortNameLineEdit->text()); //qDebug() << "SetupPageSatsNew::gatherAndSend: satId: " << QString::number(satId); if ((editing) && (satId>0)) { satData << "1"; editing = false; dataProxy->addSatellite(shortNameLineEdit->text(), nameLineEdit->text(), downlinkLineEdit->text(), uplinkLineEdit->text(), modesLineEdit->text(), satId); } else { satData << "0"; dataProxy->addSatellite(shortNameLineEdit->text(), nameLineEdit->text(), downlinkLineEdit->text(), uplinkLineEdit->text(), modesLineEdit->text()); } //qDebug() << "SetupPageSatsNew::gatherAndSend: EMITED"; emit newSatData(satData); } void SetupPageSatsNew::slotCancelButtonClicked() { //qDebug() << "SetupPageSatsNew::slotCancelButtonClicked"; satData.clear(); clear(); emit cancelled(true); close(); } void SetupPageSatsNew::setEditing(const bool b) { editing = b; if (!editing) { clear(); } } klog-2.3.3/setuppages/setuppagelogsnew.h0000644000015700001710000000710414542412415020264 0ustar jenkinsjenkins#ifndef KLOG_SETUPPAGES_SETUPPAGELOGSNEW_H #define KLOG_SETUPPAGES_SETUPPAGELOGSNEW_H /*************************************************************************** setuppagelogsnew.h - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implements the Dialog to add a new log // #include #include #include #include "../dataproxy_sqlite.h" #include "../utilities.h" //TODO: Read the data when the user clicks the OK button //TODO: Fill the data from the list of logs when the user wants to edit a log class SetupPageLogsNew : public QDialog { Q_OBJECT public: //SetupPageLogsNew(QWidget *parent = 0); SetupPageLogsNew(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~SetupPageLogsNew(); void setEditing(const bool b); void setStationCallSign(const QString &_st); void setOperators(const QString &_st); void setComment(const QString &_st); void setDateString(const QString &_st); private slots: void slotOKButtonClicked(); void slotCancelButtonClicked(); void slotStationCallSignTextChanged(); void slotOperatorsTextChanged(); signals: void newLogData(const QStringList _qs); // void cancelled(const bool _c); // Cancel button is clicked private: void createWidget(); void gatherAndSend(); void showOK(); void showNOK(); void clear(); DataProxy_SQLite *dataProxy; Utilities *util; QDateEdit *dateEdit; QLineEdit *stationCallsignLineEdit; QLineEdit *operatorsLineEdit, *commentLineEdit; QString stationCallsign, operators, comment, dateString; bool stationCallsignFilled, operatorsFilled; QPushButton *okButton, *cancelButton; QStringList logData; bool editing; //QLabel *catAsLabel, *catOpLabel, *catModeLabel, *catPowerLabel, *catBandsLabel, *overlayLabel; //QLabel *typeLabel, *validCats, QLabel *stationCallsignLabel, *operatorsLabel, *commentLabel, *dateLabel; bool checking; //, bCass, bCOp, bCMo, bCPo, bCBa, bCOv, bCTy; }; #endif // SETUPPAGELOGSNEW_H klog-2.3.3/setuppages/setuppagesubdivisionnew.h0000644000015700001710000001012314542412415021651 0ustar jenkinsjenkins#ifndef KLOG_SETUPPAGES_SETUPPAGESUBDIVISIONNEW_H #define KLOG_SETUPPAGES_SETUPPAGESUBDIVISIONNEW_H /*************************************************************************** setuppagesubdivisionnew.h - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implements the Dialog to add a new log // #include #include #include #include "../dataproxy_sqlite.h" //TODO: Read the data when the user clicks the OK button //TODO: Fill the data from the list of logs when the user wants to edit a log class SetupPageSubdivisionNew : public QDialog { Q_OBJECT public: //SetupPageLogsNew(QWidget *parent = 0); SetupPageSubdivisionNew(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~SetupPageSubdivisionNew(); void setEditing(const bool b); void setStationCallSign(const QString &_st); void setOperators(const QString &_st); void setComment(const QString &_st); void setDateString(const QString &_st); private slots: void slotOKButtonClicked(); void slotCancelButtonClicked(); void slotStationCallSignTextChanged(); void slotOperatorsTextChanged(); signals: void newLogData(const QStringList _qs); // void cancelled(const bool _c); // Cancel button is clicked private: //bool isThereAnyNotManagedLog(); void createWidget(); void gatherAndSend(); //QStringList getValidCatOptions(const int _currentCat, const int _higherCat); //int getSelectedTypeContest(); //void fillWithType(const int _n); //void updateAllCats(); void showOK(); void showNOK(); void clear(); DataProxy_SQLite *dataProxy; QDateEdit *dateEdit; QLineEdit *stationCallsignLineEdit; QLineEdit *operatorsLineEdit, *commentLineEdit; QString stationCallsign, operators, comment, dateString;//, typeConteststr; //int typeContest, typeContestSelected, contestCatMode, contestCatOperators, contestCatAssisted, contestCatPower, contestCatBands, contestBands, contestCatOverlay; bool stationCallsignFilled, operatorsFilled; //int typeOperation; // DX, CQ-WW-SSB, CQ-WW-CW, CQ-WPX-SSB, CQ-WPX-CW QPushButton *okButton, *cancelButton; QStringList logData; bool editing; //QLabel *catAsLabel, *catOpLabel, *catModeLabel, *catPowerLabel, *catBandsLabel, *overlayLabel; //QLabel *typeLabel, *validCats, QLabel *stationCallsignLabel, *operatorsLabel, *commentLabel, *dateLabel; //nameLabel->setBuddy(); bool checking; //, bCass, bCOp, bCMo, bCPo, bCBa, bCOv, bCTy; }; #endif // SETUPPAGEREGIONALAWARDSNEW_H klog-2.3.3/setuppages/setuppagelogs.h0000644000015700001710000001032114542412415017545 0ustar jenkinsjenkins#ifndef KLOG_SETUPPAGES_SETUPPAGELOGS_H #define KLOG_SETUPPAGES_SETUPPAGELOGS_H /*************************************************************************** setuppagelogs.h - description ------------------- begin : feb 2012 copyright : (C) 2012 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include #include #include #include "../dataproxy_sqlite.h" #include "../setuppages/setuppagelogsnew.h" #include "../utilities.h" //const int CONTEST_DX = 0; //const int CONTEST_CQ_WW_SSB = 1; //const int CONTEST_CQ_WW_CW = 2; //const int CONTEST_CQ_WPX_SSB = 3; //const int CONTEST_CQ_WPX_CW = 4; class SetupPageLogs : public QWidget { Q_OBJECT public: SetupPageLogs(DataProxy_SQLite *dp, QWidget *parent=nullptr); ~SetupPageLogs(); int getSelectedLog(); void setSelectedLog(const int _i); void createNewLog(); void setDefaultStationCallsign (const QString &_p); void setDefaultOperators(const QString &_p); void saveSettings(); void loadSettings(); private slots: void slotNewButtonClicked(); void slotEditButtonClicked(); void slotRemoveButtonClicked(); void slotAnalyzeNewLogData(const QStringList _qs); void slotLogSelected(const QModelIndex & index); void slotLogDoubleClicked(const QModelIndex & index); signals: //void exitSignal(const int status); // 1 = OK, -1 = NOK, 2 = Cancel clicked void newLogData(const QStringList _qs); // Station QRZ + Operators to be shown in the main tab void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution void focusOK(); private: //void createActions(); void showEvent(QShowEvent *event); QStringList readLogs(); void createLogsPanel(); void createLogsModel(); void createActions(); //bool addNewLog(const QStringList _qs); void updateSelectedLogs(); //void readSelectedLog(const int _i); void showError(const QString &_errorC); /* Wizard to create a new log*/ //QWizardPage *createLogTypePage(); //QWizard *newLogWizard; // Wizard to create a new log /*^Wizard to create a new log^*/ QSqlRelationalTableModel *logsModel; QWidget *logsPanel; QTableView *logsView; QAbstractButton *finishButton; QPushButton *newLogPushButton, *editPushButton, *removePushButton; int lastLog; QString currentLogComment; QString currentStationCallSign; QStringList logsAvailable; SetupPageLogsNew *newLog; QString stationCallsign, operators, comment, dateString;//, typeContest; DataProxy_SQLite *dataProxy; int selectedLog; QString defaultStationCallSign, defaultOperators; }; #endif // SETUPPAGELOGS_H klog-2.3.3/setuppages/setuppagedxcluster.cpp0000644000015700001710000003620014542412415021155 0ustar jenkinsjenkins/*************************************************************************** setuppagedxcluster.cpp - description ------------------- begin : nov 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include "setuppagedxcluster.h" SetupPageDxCluster::SetupPageDxCluster(QWidget *parent) : QWidget(parent) { //qDebug() << "SetupPageDxCluster::SetupPageDxCluster"; util = new Utilities(Q_FUNC_INFO); dxclusterServersComboBox = new QComboBox; addClusterButton = new QPushButton; deleteClusterButton = new QPushButton; showHFQCheckbox = new QCheckBox; showVHFQCheckbox = new QCheckBox; showWARCQCheckbox = new QCheckBox; showWorkedQCheckbox = new QCheckBox; showConfirmedQCheckbox = new QCheckBox; showANNQCheckbox = new QCheckBox; showWWVQCheckbox = new QCheckBox; showWCYQCheckbox = new QCheckBox; sendSpotsToMapCheckbox = new QCheckBox; saveAllDXClusterDataQCheckbox = new QCheckBox; saveAllDXClusterDataQCheckbox->setAutoExclusive(false); showHFQCheckbox->setAutoExclusive(false); showVHFQCheckbox->setAutoExclusive(false); showWARCQCheckbox->setAutoExclusive(false); showWorkedQCheckbox->setAutoExclusive(false); showConfirmedQCheckbox->setAutoExclusive(false); showANNQCheckbox->setAutoExclusive(false); showWWVQCheckbox->setAutoExclusive(false); showWCYQCheckbox->setAutoExclusive(false); sendSpotsToMapCheckbox->setAutoExclusive (false); showHFQCheckbox->setChecked(true); showVHFQCheckbox->setChecked(true); showWARCQCheckbox->setChecked(true); showWorkedQCheckbox->setChecked(true); showConfirmedQCheckbox->setChecked(true); showANNQCheckbox->setChecked(true); showWWVQCheckbox->setChecked(true); showWCYQCheckbox->setChecked(true); saveAllDXClusterDataQCheckbox->setChecked(false); sendSpotsToMapCheckbox->setChecked (false); addClusterButton->setText(tr("Add")); deleteClusterButton->setText(tr("Delete")); showHFQCheckbox->setText(tr("Show &HF spots")); showVHFQCheckbox->setText(tr("Show V/&UHF spots")); showWARCQCheckbox->setText(tr("Show W&ARC spots")); showWorkedQCheckbox->setText(tr("Show &worked spots")); showConfirmedQCheckbox->setText(tr("Show &confirmed spots")); showANNQCheckbox->setText(tr("Show ANN/&FULL messages")); showWWVQCheckbox->setText(tr("Show WW&V messages")); showWCYQCheckbox->setText(tr("Show WC&Y messages")); saveAllDXClusterDataQCheckbox->setText(tr("Save DX Cluster activity")); saveAllDXClusterDataQCheckbox->setToolTip(tr("Saves all the DX-Cluster activity to a file in the KLog folder")); sendSpotsToMapCheckbox->setText (tr("Send DX Spots to the map")); sendSpotsToMapCheckbox->setToolTip (tr("Sends the received DX Spots to the map to know where is the activity.")); QGroupBox *spotsGroupBox = new QGroupBox(tr("DX Spots")); QVBoxLayout *spotsVBoxLayout = new QVBoxLayout; spotsVBoxLayout->addWidget(showHFQCheckbox); spotsVBoxLayout->addWidget(showVHFQCheckbox); spotsVBoxLayout->addWidget(showWARCQCheckbox); spotsVBoxLayout->addWidget(showWorkedQCheckbox); spotsVBoxLayout->addWidget(showConfirmedQCheckbox); spotsVBoxLayout->addStretch(1); spotsGroupBox->setLayout(spotsVBoxLayout); QGroupBox *miscGroupBox = new QGroupBox(tr("Others")); QVBoxLayout *miscVBoxLayout = new QVBoxLayout; miscVBoxLayout->addWidget(saveAllDXClusterDataQCheckbox); miscVBoxLayout->addWidget (sendSpotsToMapCheckbox); miscVBoxLayout->addStretch(1); miscGroupBox->setLayout(miscVBoxLayout); QGroupBox *messagesGroupBox = new QGroupBox(tr("Messages")); QVBoxLayout *messagesVBoxLayout = new QVBoxLayout; messagesVBoxLayout->addWidget(showANNQCheckbox); messagesVBoxLayout->addWidget(showWWVQCheckbox); messagesVBoxLayout->addWidget(showWCYQCheckbox); messagesVBoxLayout->addStretch(1); messagesGroupBox->setLayout(messagesVBoxLayout); // ( QWidget * widget, int fromRow, int fromColumn, int rowSpan, //int columnSpan, Qt::Alignment alignment = 0 ) QHBoxLayout *serversButtonsLayout = new QHBoxLayout; serversButtonsLayout->addSpacerItem(new QSpacerItem(10,0,QSizePolicy::Expanding,QSizePolicy::Maximum)); serversButtonsLayout->addWidget(addClusterButton); serversButtonsLayout->addWidget(deleteClusterButton); QVBoxLayout *serversLayout = new QVBoxLayout; serversLayout->addWidget(dxclusterServersComboBox); serversLayout->addLayout(serversButtonsLayout); QGridLayout *mainLayout = new QGridLayout; mainLayout->addLayout(serversLayout, 0, 0); mainLayout->addWidget(spotsGroupBox, 1, 0); mainLayout->addWidget(messagesGroupBox, 1, 1); mainLayout->addWidget(miscGroupBox, 2, 0, 1, -1); setLayout(mainLayout); createActions(); //qDebug() << "SetupPageDxCluster::SetupPageDxCluster - END"; } SetupPageDxCluster::~SetupPageDxCluster() { //qDebug() << "SetupPageDxCluster::~SetupPageDxCluster"; delete(util); } void SetupPageDxCluster::init() { showHFQCheckbox->setChecked(true); showVHFQCheckbox->setChecked(true); showWARCQCheckbox->setChecked(true); showWCYQCheckbox->setChecked(true); showWWVQCheckbox->setChecked(true); showANNQCheckbox->setChecked(true); showConfirmedQCheckbox->setChecked(true); showWorkedQCheckbox->setChecked(true); dxclusterServersComboBox->addItem("dxfun.com:8000"); } void SetupPageDxCluster::createActions() { //qDebug() << "SetupPageDxCluster::createActions"; connect(addClusterButton, SIGNAL(clicked()), this, SLOT(slotAddButtonClicked()) ); connect(deleteClusterButton, SIGNAL(clicked()), this, SLOT(slotDeleteButtonClicked()) ); } void SetupPageDxCluster::slotAddButtonClicked() { //qDebug() << "SetupPageDxCluster::slotAddButtonClicked"; bool ok; ok = false; while (!ok) { QString text = QInputDialog::getText (this, tr("KLog: Add a DXCluster server"), tr("Add the address followed by the :port\nExample: dxfun.com:8000\nIf no port is specified, 41112 will be used by default:"), QLineEdit::Normal, QString(), &ok); //qDebug() << "SetupPageDxCluster::slotAddButtonClicked - SERVER: " << text; if (ok && !text.isEmpty ()) { //qDebug() << "SetupPageDxCluster::slotAddButtonClicked - 01" ; if (checkIfValidDXCluster (text)) { //qDebug() << "SetupPageDxCluster::slotAddButtonClicked - 02" ; if (checkIfNewDXCluster (text)) { //qDebug() << "SetupPageDxCluster::slotAddButtonClicked - 03" ; ok = true; if ((text.contains (":")) == 0) { //qDebug() << "SetupPageDxCluster::slotAddButtonClicked - 04" ; text = text + ":41112"; } dxclusterServersComboBox->insertItem (0, text); //qDebug() << "SetupPageDxCluster::slotAddButtonClicked - 05" ; } else { //qDebug() << "SetupPageDxCluster::slotAddButtonClicked - 06" ; ok = false; } } else { //qDebug() << "SetupPageDxCluster::slotAddButtonClicked - 07" ; ok = false; } } else { // user entered nothing or pressed Cancel //qDebug() << "SetupPageDxCluster::slotAddButtonClicked - 08" ; ok = true; } } } void SetupPageDxCluster::slotDeleteButtonClicked() { //qDebug() << Q_FUNC_INFO; dxclusterServersComboBox->removeItem (dxclusterServersComboBox->currentIndex ()); } bool SetupPageDxCluster::checkIfValidDXCluster (const QString & tdxcluster) { QUrl url ("http://" + tdxcluster); //return !((!url.host ().isEmpty ()) || (url.port () != -1)); return ((!url.host ().isEmpty ()) || (url.port () != -1)); /* if ((!url.host ().isEmpty ()) || (url.port () != -1)) { return true; } else { return false; } */ } bool SetupPageDxCluster::checkIfNewDXCluster (const QString & tdxcluster) { //qDebug() << "checkIfNewDXCluster: -" << tdxcluster << "-"<< QT_ENDL; return (dxclusterServersComboBox->findText(tdxcluster)<0); } QStringList SetupPageDxCluster::getDxclusterServersComboBox() { //qDebug() << "SetupPageDxCluster::getDxclusterServersComboBox"; QStringList servers; int numberOfDXClusterServers = dxclusterServersComboBox->count (); servers.clear(); if(numberOfDXClusterServers>=1) { //stream << "DXClusterServerToUse=" << dxclusterServersComboBox->currentText (); //servers << dxclusterServersComboBox->currentText (); for (int i = 0; i <= numberOfDXClusterServers - 1; i++) { dxclusterServersComboBox->setCurrentIndex (i); servers << dxclusterServersComboBox->currentText (); //stream << "DXClusterServerPort=" << dxclusterServersComboBox->currentText (); } } return servers; } void SetupPageDxCluster::setDxclusterServersComboBox(const QStringList t) { //qDebug() << "SetupPageDxCluster::setDxclusterServersComboBox"; if (t.count()>0) { QString text; for (int i=0; i < t.count(); i++) { text.clear(); text = t.at(i); if (checkIfValidDXCluster (text)) { if (checkIfNewDXCluster (text)) { if ((text.contains (":")) == 0) { text = text + ":41112"; } dxclusterServersComboBox->insertItem (0, text); } else { // Not added } } } } } QString SetupPageDxCluster::getSelectedDxClusterServer() { //qDebug() << Q_FUNC_INFO; int dxclusterServerListItems = dxclusterServersComboBox->count(); if (dxclusterServerListItems >= 1) { //qDebug() << Q_FUNC_INFO << ": " << dxclusterServersComboBox->currentText (); return dxclusterServersComboBox->currentText (); } else { return QString(); } } void SetupPageDxCluster::setSelectedDxClusterServer(const QString t) { //qDebug() << Q_FUNC_INFO << ": " << t; dxclusterServersComboBox->setCurrentIndex(dxclusterServersComboBox->findText(t)); } void SetupPageDxCluster::saveSettings() { //qDebug() << Q_FUNC_INFO ; QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("DXCluster"); settings.setValue ("DXClusterServerToUse", getSelectedDxClusterServer()); QList clusters = getDxclusterServersComboBox (); settings.beginWriteArray("DXClusterServers"); for (int i = 0; i < clusters.size(); ++i) { settings.setArrayIndex(i); settings.setValue("Server", clusters.at(i)); //qDebug() << Q_FUNC_INFO << " - Writting Servers: " << clusters.at(i); } settings.endArray(); settings.setValue ("DXClusterShowHF", QVariant((showHFQCheckbox->isChecked()))); settings.setValue ("DXClusterShowVHF", QVariant((showVHFQCheckbox->isChecked()))); settings.setValue ("DXClusterShowWARC", QVariant((showWARCQCheckbox->isChecked()))); settings.setValue ("DXClusterShowWorked", QVariant((showWorkedQCheckbox->isChecked()))); settings.setValue ("DXClusterShowConfirmed", QVariant((showConfirmedQCheckbox->isChecked()))); settings.setValue ("DXClusterShowAnn", QVariant((showANNQCheckbox->isChecked()))); settings.setValue ("DXClusterShowWWV", QVariant((showWWVQCheckbox->isChecked()))); settings.setValue ("DXClusterShowWCY", QVariant((showWCYQCheckbox->isChecked()))); settings.setValue ("DXClusterSave", QVariant((saveAllDXClusterDataQCheckbox->isChecked()))); settings.setValue ("DXClusterSendToMap", QVariant((sendSpotsToMapCheckbox->isChecked()))); settings.endGroup (); } void SetupPageDxCluster::loadSettings() { QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("DXCluster"); showHFQCheckbox->setChecked (settings.value("DXClusterShowHF", true).toBool ()); showVHFQCheckbox->setChecked (settings.value("DXClusterShowVHF", true).toBool ()); showWARCQCheckbox->setChecked (settings.value("DXClusterShowWARC", true).toBool ()); showWorkedQCheckbox->setChecked (settings.value("DXClusterShowWorked", true).toBool ()); showConfirmedQCheckbox->setChecked (settings.value("DXClusterShowConfirmed", true).toBool ()); showANNQCheckbox->setChecked (settings.value("DXClusterShowAnn", true).toBool ()); showWWVQCheckbox->setChecked (settings.value("DXClusterShowWWV", true).toBool ()); showWCYQCheckbox->setChecked (settings.value("DXClusterShowWCY", true).toBool ()); saveAllDXClusterDataQCheckbox->setChecked (settings.value("DXClusterSave", false).toBool ()); sendSpotsToMapCheckbox->setChecked (settings.value("DXClusterSendToMap", true).toBool ()); QList servers; servers.clear (); int size = settings.beginReadArray("DXClusterServers"); for (int i = 0; i < size; ++i) { settings.setArrayIndex(i); servers.append (settings.value("Server").toString()); //qDebug() << Q_FUNC_INFO << " - Reading Servers: " << settings.value("Server").toString(); } settings.endArray(); setDxclusterServersComboBox(servers); QString aux = settings.value ("DXClusterServerToUse").toString (); //qDebug() << Q_FUNC_INFO << ": " << aux; dxclusterServersComboBox->setCurrentIndex(dxclusterServersComboBox->findText(aux)); settings.endGroup (); } klog-2.3.3/setuppages/setuppagesats.h0000644000015700001710000001026614542412415017563 0ustar jenkinsjenkins#ifndef KLOG_SETUPPAGES_SETUPPAGESATS_H #define KLOG_SETUPPAGES_SETUPPAGESATS_H /*************************************************************************** setuppagesats.h - description ------------------- begin : Dec 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include #include #include #include "../updatesatsdata.h" #include "../dataproxy_sqlite.h" #include "../utilities.h" #include "../setuppages/setuppagesatsnew.h" class SetupPageSats : public QWidget { Q_OBJECT public: SetupPageSats(DataProxy_SQLite *dp, QWidget *parent=nullptr); ~SetupPageSats(); int getSelectedSat(); void setSelectedSat(const int _i); void createNewSat(); void setDefaultStationCallsign (const QString &_p); void setDefaultOperators(const QString &_p); private slots: void slotImportButtonClicked(); void slotExportButtonClicked(); void slotNewButtonClicked(); void slotEditButtonClicked(); void slotRemoveButtonClicked(); void slotAnalyzeNewSatData(const QStringList _qs); void slotSatselected(const QModelIndex & index); void slotSatDoubleClicked(const QModelIndex & index); //void slotSatsCancelled(const bool _q); signals: //void exitSignal(const int status); // 1 = OK, -1 = NOK, 2 = Cancel clicked void newSatData(const QStringList _qs); // Station QRZ + Operators to be shown in the main tab void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution private: //void createActions(); QStringList readSats(); //bool readSatsFile(); void createSatsPanel(); void createSatsModel(); void createActions(); //bool addNewSat(const QStringList _qs); void updateSelectedSats(); //void readSelectedSat(const int _i); void showError(const QString &_errorC); /* Wizard to create a new Sat*/ //QWizardPage *createSatTypePage(); //QWizard *newSatWizard; // Wizard to create a new Sat /*^Wizard to create a new satellite^*/ QSqlRelationalTableModel *satsModel; QWidget *satsPanel; QTableView *satsView; QAbstractButton *finishButton; QPushButton *newSatPushButton, *editPushButton, *removePushButton, *importPushButton, *exportPushButton; int lastSat; QString currentSatComment; QString currentStationCallSign; QComboBox *currentSats; QStringList satsAvailable; QString arrild, satname, uplink, downlink, modes; DataProxy_SQLite *dataProxy; int selectedSat; QString defaultStationCallSign, defaultOperators; Utilities *util; SetupPageSatsNew *newSat; }; #endif // SETUPPAGESATS_H klog-2.3.3/setuppages/hamlibserialconfigwidget.cpp0000644000015700001710000002344414542412415022256 0ustar jenkinsjenkins#include "hamlibserialconfigwidget.h" HamLibSerialConfigWidget::HamLibSerialConfigWidget(QWidget *parent) : QWidget(parent) { //qDebug() << Q_FUNC_INFO; serialBaudsComboBox = new QComboBox(); serialPortComboBox = new QComboBox(); dataBitsComboBox = new QComboBox(); flowControlComboBox = new QComboBox(); parityComboBox = new QComboBox(); stopBitsComboBox = new QComboBox(); scanSerialPortButton = new QPushButton(); //qDebug() << Q_FUNC_INFO << " - END"; } void HamLibSerialConfigWidget::createUI() { //qDebug() << Q_FUNC_INFO ; QLabel *serialPortLabel = new QLabel(); //qDebug() << Q_FUNC_INFO << " - 10"; serialPortComboBox->addItems(serialPorts); serialPortLabel->setBuddy(serialPortComboBox); serialPortLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *serialBaudsLabel = new QLabel(tr("Bauds")); serialBaudsLabel->setBuddy(serialBaudsComboBox); serialBaudsLabel->setToolTip(tr("Select the serial port speed.")); serialBaudsLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); //qDebug() << Q_FUNC_INFO << " - 50"; serialPortLabel->setText (tr("Port")); //qDebug() << Q_FUNC_INFO << " - 52"; serialPortLabel->setToolTip(tr("Select the serial port. Only the serial ports that are detected are shown.")); //qDebug() << Q_FUNC_INFO << " - 53"; serialPortLabel->setEnabled(true); //qDebug() << Q_FUNC_INFO << " - 54"; scanSerialPortButton->setText(tr("Scan")); //qDebug() << Q_FUNC_INFO << " - 55"; scanSerialPortButton->setToolTip(tr("Click to identify the serial ports available in your computer.")); //qDebug() << Q_FUNC_INFO << " - 56"; QStringList strings; strings.clear(); strings << "1200" << "2400" << "4800" << "9600" << "19200" << "38400" << "57600" << "115200"; serialBaudsComboBox->addItems(strings); serialBaudsLabel->setEnabled(true); //qDebug() << Q_FUNC_INFO << " - 60"; strings.clear(); strings << tr("5 bits") << tr("6 bits") << tr("7 bits") << tr("8 bits"); dataBitsComboBox->addItems(strings); QLabel *dataBitsLabel = new QLabel(tr("Data bits")); dataBitsLabel->setBuddy(dataBitsComboBox); dataBitsLabel->setToolTip(tr("Select the serial data bits.")); dataBitsLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); dataBitsLabel->setEnabled(true); //qDebug() << Q_FUNC_INFO << " - 70"; strings.clear(); strings << tr("None") << tr("Hardware") << tr("Software XON/XOFF"); flowControlComboBox->addItems(strings); QLabel *flowControlLabel = new QLabel(tr("Flow control")); flowControlLabel->setBuddy(flowControlComboBox); flowControlLabel->setToolTip(tr("Select the serial flow control")); flowControlLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); flowControlLabel->setEnabled(true); //qDebug() << Q_FUNC_INFO << " - 80"; strings.clear(); strings << tr("No parity") << tr("Even") << tr("Odd") << tr("Space") << tr("Mark") ; parityComboBox->addItems(strings); QLabel *parityLabel = new QLabel(tr("Parity")); parityLabel->setBuddy(parityComboBox); parityLabel->setToolTip(tr("Select the serial parity.")); parityLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); parityLabel->setEnabled(true); //qDebug() << Q_FUNC_INFO << " - 90"; strings.clear(); strings << tr("1 bit") << tr("1.5 bits") << tr("2 bits"); stopBitsComboBox->addItems(strings); QLabel *stopBitsLabel = new QLabel(tr("Stop bits")); stopBitsLabel->setBuddy(stopBitsComboBox); stopBitsLabel->setToolTip(tr("Select the serial stop bits.")); stopBitsLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); stopBitsLabel->setEnabled(true); //qDebug() << Q_FUNC_INFO << " - 100"; QGridLayout *serialLayout = new QGridLayout; serialLayout->addWidget(serialPortLabel, 1, 0); serialLayout->addWidget(serialPortComboBox, 1, 1); serialLayout->addWidget(scanSerialPortButton, 1, 2); serialLayout->addWidget(serialBaudsLabel, 2, 0); serialLayout->addWidget(serialBaudsComboBox, 2, 1); serialLayout->addWidget(dataBitsLabel, 3, 0); serialLayout->addWidget(dataBitsComboBox, 3, 1); serialLayout->addWidget(stopBitsLabel, 4, 0); serialLayout->addWidget(stopBitsComboBox, 4, 1); serialLayout->addWidget(flowControlLabel, 5, 0); serialLayout->addWidget(flowControlComboBox, 5, 1); serialLayout->addWidget(parityLabel, 6, 0); serialLayout->addWidget(parityComboBox, 6, 1); setLayout (serialLayout); fillSerialPortsComboBox(); connect(scanSerialPortButton, SIGNAL(clicked(bool)), this, SLOT(slotScanPorts()) ); //qDebug() << Q_FUNC_INFO << " - END"; } QStringList HamLibSerialConfigWidget::getAvailableSerialPorts() { //qDebug() << Q_FUNC_INFO; QStringList st; st.clear(); const auto infos = QSerialPortInfo::availablePorts(); for (const QSerialPortInfo &info : infos) { //st << info.portName(); st << info.systemLocation(); } //qDebug() << Q_FUNC_INFO << " - END"; return st; } void HamLibSerialConfigWidget::fillSerialPortsComboBox() { //qDebug() << "SetupPageHamLib::fillSerialPortsComboBox" ; serialPortComboBox->clear(); serialPortComboBox->addItems(getAvailableSerialPorts()); serialPortComboBox->setCurrentIndex(0); } void HamLibSerialConfigWidget::slotScanPorts() { //qDebug() << Q_FUNC_INFO; fillSerialPortsComboBox(); } int HamLibSerialConfigWidget::getDataBits() { return ((dataBitsComboBox->currentText()).left(1)).toInt(); } void HamLibSerialConfigWidget::setDataBits (const int _b) { switch (_b) { case 5: dataBitsComboBox->setCurrentIndex(0); break; case 6: dataBitsComboBox->setCurrentIndex(1); break; case 7: dataBitsComboBox->setCurrentIndex(2); break; default: // should never be reached dataBitsComboBox->setCurrentIndex(3); break; } } //FlowControl { NoFlowControl, HardwareControl, SoftwareControl, UnknownFlowControl } QString HamLibSerialConfigWidget::getFlowControl() { int ret = flowControlComboBox->currentIndex(); switch (ret) { case 0: return "None"; break; case 1: return "Hardware"; break; case 2: return "Software"; break; default: // should never be reached return "None"; break; } return "None"; } void HamLibSerialConfigWidget::setFlowControl(const QString &_st) { QString _s = _st.toUpper(); if (_s == "HARDWARE") { flowControlComboBox->setCurrentIndex(1); } else if (_s == "SOFTWARE") { flowControlComboBox->setCurrentIndex(2); } else { flowControlComboBox->setCurrentIndex(0); } } //Parity { NoParity, EvenParity, OddParity, SpaceParity, MarkParity, UnknownParity } QString HamLibSerialConfigWidget::getParity() { int ret = parityComboBox->currentIndex(); switch (ret) { case 0: return "None"; break; case 1: return "Even"; break; case 2: return "Odd"; break; case 3: return "Space"; break; case 4: return "Mark"; break; default: // should never be reached return "None"; break; } return "None"; } void HamLibSerialConfigWidget::setParity(const QString &_st) { QString _s = _st.toUpper(); if (_s == "EVEN") { parityComboBox->setCurrentIndex(1); } else if (_s == "ODD") { parityComboBox->setCurrentIndex(2); } else if (_s == "SPACE") { parityComboBox->setCurrentIndex(3); } else if (_s == "MARK") { parityComboBox->setCurrentIndex(4); } else { parityComboBox->setCurrentIndex(0); } } //StopBits { OneStop, OneAndHalfStop, TwoStop, UnknownStopBits } QString HamLibSerialConfigWidget::getStopBits() { int ret = stopBitsComboBox->currentIndex(); switch (ret) { case 0: return "OneStop"; //return QSerialPort::OneStop; break; case 1: return "OneAndHalfStop"; //return QSerialPort::OneAndHalfStop; break; case 2: return "TwoStop"; //return QSerialPort::TwoStop; break; default: // should never be reached return "UnknownStopBits"; break; } } void HamLibSerialConfigWidget::setStopBits(const QString &_st) { if (_st == "OneStop") { stopBitsComboBox->setCurrentIndex(0); } else if (_st == "OneAndHalfStop") { stopBitsComboBox->setCurrentIndex(1); } else if (_st == "TwoStop") { stopBitsComboBox->setCurrentIndex(2); } else { stopBitsComboBox->setCurrentIndex(0); } } bool HamLibSerialConfigWidget::setSerialPort(const QString &_port) { int _index = serialPortComboBox->findText(_port, Qt::MatchFlag::MatchExactly); if (_index >= 0) { serialPortComboBox->setCurrentIndex(_index); return true; } else { serialPortComboBox->setCurrentIndex(0); } return false; } bool HamLibSerialConfigWidget::setSerialBauds(const int _speed ) { int _index = serialBaudsComboBox->findText(QString::number(_speed), Qt::MatchFlag::MatchExactly); if (_index >= 0) { serialBaudsComboBox->setCurrentIndex(_index); return true; } else { serialBaudsComboBox->setCurrentIndex(0); } return false; } QString HamLibSerialConfigWidget::getSerialPort() { return serialPortComboBox->currentText (); } int HamLibSerialConfigWidget::getSerialBauds() { return (serialBaudsComboBox->currentText ()).toInt(); } klog-2.3.3/setuppages/setuppagelogview.cpp0000644000015700001710000001252114542412415020614 0ustar jenkinsjenkins/*************************************************************************** setuppagelogview.cpp - description ------------------- begin : ago 2021 copyright : (C) 2021 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "setuppagelogview.h" SetupPageLogView::SetupPageLogView(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "SetupPageLogView::SetupPageLogView" ; dataProxy = dp; fieldsListWidget = new QListWidget; QHBoxLayout *layout = new QHBoxLayout; QVBoxLayout *fLayout = new QVBoxLayout; QLabel *fieldsLabel = new QLabel(fieldsListWidget); fieldsLabel->setText(tr("Fields")); fieldsLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); fLayout->addWidget(fieldsLabel); fLayout->addWidget(fieldsListWidget); layout->addLayout(fLayout); setLayout(layout); //qDebug() << "SetupPageLogView::SetupPageLogView - END" ; } SetupPageLogView::~SetupPageLogView() {} void SetupPageLogView::init() { addFields(dataProxy->getFields()); if (fieldsListWidget->count ()<1) { QStringList aux; aux.clear (); aux << "qso_date" << "call" << "rst_sent" << "rst_rcvd" << "bandid" << "modeid" << "comment"; aux.removeDuplicates(); setActiveFields(aux); } } void SetupPageLogView::addFields(QStringList _b) { fieldsListWidget->addItems(_b); QListWidgetItem* item = 0; for(int i = 0; i < fieldsListWidget->count(); ++i){ item = fieldsListWidget->item(i); item->setFlags(item->flags() | Qt::ItemIsUserCheckable); item->setCheckState(Qt::Unchecked); } } QStringList SetupPageLogView::getActiveFields() { //qDebug() << Q_FUNC_INFO; if ( (fieldsListWidget->count()) < 1) { return QStringList(); } QStringList _list; _list.clear (); QListWidgetItem *it; //QString b = QString(); for (int i = 0; i < fieldsListWidget->count(); i++) { it = fieldsListWidget->item(i); if (it->checkState() == Qt::Checked) { _list.append (it->text ()); //b = b + it->text(); //b = b + ", "; } } //if (b.size()>=2) //{ // b.chop(2); //} //qDebug() << Q_FUNC_INFO << " : " << b; return _list; //return b.split(", ", Qt::SkipEmptyParts); } void SetupPageLogView::setActiveFields(QStringList q) { //qDebug() << Q_FUNC_INFO << " - Start"; if (q.isEmpty()) { //qDebug() << Q_FUNC_INFO << " - Empty list - END-0"; return; } QListWidgetItem *it; if ( (fieldsListWidget->count()) < 1) { //qDebug() << Q_FUNC_INFO << " - END-1"; return; } for (int i = 0; i < fieldsListWidget->count(); i++) { it = fieldsListWidget->item(i); it->setCheckState(Qt::Unchecked); for (int j=0;jtext() == q.at(j)) { //qDebug() << Q_FUNC_INFO << " - Adding: " << q.at(j); it->setCheckState(Qt::Checked); } } } //qDebug() << Q_FUNC_INFO << " - END"; } void SetupPageLogView::saveSettings() { //qDebug() << Q_FUNC_INFO ; Utilities util(Q_FUNC_INFO); QSettings settings(util.getCfgFile (), QSettings::IniFormat); //settings.beginGroup ("LogView"); settings.setValue ("LogViewFields", getActiveFields ()); //settings.endGroup (); } void SetupPageLogView::loadSettings() { //qDebug() << Q_FUNC_INFO << " - Start"; Utilities util(Q_FUNC_INFO); QSettings settings(util.getCfgFile (), QSettings::IniFormat); QStringList aux; aux.clear(); aux << dataProxy->filterValidFields(settings.value("LogViewFields").toStringList ()); aux.removeDuplicates(); setActiveFields(aux); //qDebug() << Q_FUNC_INFO << " - END"; } klog-2.3.3/setuppages/setuppagedxcluster.h0000644000015700001710000000604214542412415020623 0ustar jenkinsjenkins#ifndef KLOG_SETUPPAGES_SETUPPAGEDXCLUSTER_H #define KLOG_SETUPPAGES_SETUPPAGEDXCLUSTER_H /*************************************************************************** setuppagedxcluster.h - description ------------------- begin : nov 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include "../utilities.h" class SetupPageDxCluster : public QWidget { Q_OBJECT public: SetupPageDxCluster(QWidget *parent=nullptr); ~SetupPageDxCluster(); void init(); QStringList getDxclusterServersComboBox(); void setDxclusterServersComboBox(const QStringList t); QString getSelectedDxClusterServer(); void setSelectedDxClusterServer(const QString t); void saveSettings(); void loadSettings(); private slots: void slotAddButtonClicked(); void slotDeleteButtonClicked(); private: void createActions(); bool checkIfValidDXCluster (const QString &tdxcluster); bool checkIfNewDXCluster (const QString &tdxcluster); QComboBox *dxclusterServersComboBox; QPushButton *addClusterButton; QPushButton *deleteClusterButton; QCheckBox *showHFQCheckbox; QCheckBox *showVHFQCheckbox; QCheckBox *showWARCQCheckbox; QCheckBox *showWorkedQCheckbox; QCheckBox *showConfirmedQCheckbox; QCheckBox *showANNQCheckbox; QCheckBox *showWWVQCheckbox; QCheckBox *showWCYQCheckbox; QCheckBox *sendSpotsToMapCheckbox; QCheckBox *saveAllDXClusterDataQCheckbox; Utilities *util; //QStringList dxClusterServers; }; #endif // SETUPPAGEDXCLUSTER_H klog-2.3.3/setuppages/setuppagehamlib.h0000644000015700001710000000740114542412415020042 0ustar jenkinsjenkins#ifndef KLOG_SETUPPAGES_SETUPPAGEHAMLIB_H #define KLOG_SETUPPAGES_SETUPPAGEHAMLIB_H /*************************************************************************** setuppagehamlib.h - description ------------------- begin : feb 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include "../hamlibclass.h" #include "../dataproxy_sqlite.h" #include "../utilities.h" #include "hamlibserialconfigwidget.h" #include "hamlibnetworkconfigwidget.h" #include class SetupPageHamLib : public QWidget { Q_OBJECT public: explicit SetupPageHamLib(DataProxy_SQLite *dp, QWidget *parent = nullptr); //QString getData(); bool setRigType(const QString &_radio); //void setPollingInterval(const int _msecs); //bool setSerialPort(const QString &_port); //bool setSerialSpeed(const int _speed ); //void setActive(const QString &_active); //void setRTS(const QString &_state); //void setDTR(const QString &_state); //void setDataBits(const int _st); //void setFlowControl(const QString &_st); //void setParity(const QString &_st); //void setStopBits(const QString &_st); //void setPollInterval(const QString &_st); //void setReadOnly(const QString &_m); //void setRadioNetworkAddress(const QString &_m); //void setRadioNetworkPort(const int _p); void stopHamlib(); void saveSettings(); void loadSettings(); public slots: //void slotScanPorts(); void slotRadioComboBoxChanged(QString _r); void slotTestHamlib(); private: void createUI(); void setRig(); void setDefaults(); void setTestResult(const bool _ok); QStringList getAvailableSerialPorts(); int getDataBits(); QString getFlowControl(); QString getParity(); QTabWidget *tabWidget; HamLibSerialConfigWidget *serialConfigWidget; HamLibNetworkConfigWidget *networkConfigWidget; QComboBox *rigTypeComboBox; QPushButton *testHamlibPushButton; QSpinBox *pollIntervalQSpinBox; int pollMin, pollMax, rigctlport; HamLibClass *hamlib; QCheckBox *activateHamlibCheckBox, *readOnlyModeCheckBox; //, *RTSCheckBox, *DTRCheckBox; bool networkRadio, hamlibTestOK; }; #endif // SETUPPAGEHAMLIB_H klog-2.3.3/setuppages/setuppageworldeditor.cpp0000644000015700001710000003014214542412415021475 0ustar jenkinsjenkins/*************************************************************************** setuppageworldeditor.h - description ------------------- begin : jun 2012 copyright : (C) 2012 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "setuppageworldeditor.h" SetupPageWorldEditor::SetupPageWorldEditor(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "SetupPageWorldEditor::SetupPageWorldEditor" ; //worldPanel = new QWidget; dataProxy = dp; world = new World(dataProxy, Q_FUNC_INFO); util = new Utilities(Q_FUNC_INFO); setupEntityDialog = new SetupEntityDialog(); worldModel = new QSqlRelationalTableModel(this); worldView = new QTableView; worldView->setContextMenuPolicy(Qt::CustomContextMenu); worldView->setSortingEnabled(true); createWorldModel(); createWorldPanel(); worldView->setCurrentIndex(worldModel->index(0, 0)); addEntityPushButton = new QPushButton; delEntityPushButton = new QPushButton; editEntityPushButton = new QPushButton; exportWorldPushButton = new QPushButton; loadWorldPushButton = new QPushButton; addEntityPushButton->setText(tr("Add")); delEntityPushButton->setText(tr("Delete")); editEntityPushButton->setText(tr("Edit")); exportWorldPushButton->setText(tr("Export World")); loadWorldPushButton->setText(tr("Import World")); addEntityPushButton->setEnabled(false); delEntityPushButton->setEnabled(false); editEntityPushButton->setEnabled(false); addEntityPushButton->setToolTip(tr("Still not implemented.")); delEntityPushButton->setToolTip(tr("Still not implemented.")); editEntityPushButton->setToolTip(tr("Still not implemented.")); exportWorldPushButton->setEnabled(false); loadWorldPushButton->setEnabled(true); exportWorldPushButton->setToolTip(tr("Still not implemented.")); loadWorldPushButton->setToolTip(tr("Import a new cty.csv file")); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addWidget(exportWorldPushButton); buttonsLayout->addWidget(loadWorldPushButton); buttonsLayout->addSpacerItem(new QSpacerItem(10,0,QSizePolicy::Expanding,QSizePolicy::Maximum)); buttonsLayout->addWidget(addEntityPushButton); buttonsLayout->addWidget(editEntityPushButton); buttonsLayout->addWidget(delEntityPushButton); /* QHBoxLayout *wbuttonsLayout = new QHBoxLayout; wbuttonsLayout->addSpacerItem(new QSpacerItem(10,0,QSizePolicy::Expanding,QSizePolicy::Maximum)); wbuttonsLayout->addWidget(exportWorldPushButton); wbuttonsLayout->addWidget(loadWorldPushButton); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addLayout(wbuttonsLayout); buttonsLayout->addLayout(ebuttonsLayout); */ QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(worldView); layout->addLayout(buttonsLayout); setLayout(layout); createActions(); if (isWorldEmpty()) { QString ctyfile = util->getCTYFile(); QMessageBox msgBox; if (QFile::exists(ctyfile)) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("An entities information file (cty.csv) has been detected in your KLog folder and will be loaded.")); msgBox.exec(); world->recreate(ctyfile); worldModel->select(); //slotImportWorldButtonClicked(); } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("No entities information file (cty.csv) has been detected in your KLog folder.")); msgBox.setInformativeText(tr("KLog will not be able to show entities information.")); msgBox.exec(); } } //qDebug() << "SetupPageWorldEditor::SetupPageWorldEditor - END" ; } SetupPageWorldEditor::~SetupPageWorldEditor() { //qDebug() << "SetupPageWorldEditor::~SetupPageWorldEditor" ; delete(world); delete(setupEntityDialog); } void SetupPageWorldEditor::createWorldPanel() { worldView->setModel(worldModel); QString stringQuery = QString("SELECT * FROM entity"); QSqlQuery query(stringQuery); QSqlRecord rec = query.record(); // Number of columns int columns = rec.count(); for (int i = 0; i < columns; i++ ){ worldView->setColumnHidden(i, true); } columns = rec.indexOf("mainprefix"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("name"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("dxcc"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("continent"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("cqz"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("ituz"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("utc"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("latitude"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("longitude"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("deleted"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("sincedate"); worldView->setColumnHidden(columns, false); columns = rec.indexOf("todate"); worldView->setColumnHidden(columns, false); worldView->setItemDelegate(new QSqlRelationalDelegate(this)); worldView->setSelectionMode( QAbstractItemView::SingleSelection); worldView->setSelectionBehavior(QAbstractItemView::SelectRows); worldView->resizeColumnsToContents(); worldView->horizontalHeader()->setStretchLastSection(true); } void SetupPageWorldEditor::createWorldModel() { /* WORLD_DXCCid = 0, WORLD_Nameid = 1, WORLD_MainPrefix = 2, WORLD_CQZ = 3, WORLD_ITUZ = 4, WORLD_Cont = 5 */ QString stringQuery = QString("SELECT * FROM entity"); QSqlQuery q(stringQuery); QSqlRecord rec = q.record(); int nameCol; //worldModel = new QSqlRelationalTableModel(this); worldModel->setTable("entity"); worldModel->setEditStrategy(QSqlTableModel::OnFieldChange); nameCol = rec.indexOf("mainprefix"); worldModel->setSort(nameCol, Qt::AscendingOrder); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Prefix")); nameCol = rec.indexOf("name"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Entity")); nameCol = rec.indexOf("dxcc"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("ARRL ID")); nameCol = rec.indexOf("continent"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Continent")); nameCol = rec.indexOf("cqz"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("CQ Zone")); nameCol = rec.indexOf("ituz"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("ITU Zone")); nameCol = rec.indexOf("utc"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("UTC")); nameCol = rec.indexOf("latitude"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Latitude")); nameCol = rec.indexOf("longitude"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Longitude")); nameCol = rec.indexOf("deleted"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Deleted")); nameCol = rec.indexOf("sincedate"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("Since Date")); nameCol = rec.indexOf("todate"); worldModel->setHeaderData(nameCol, Qt::Horizontal, tr("To Date")); worldModel->select(); } void SetupPageWorldEditor::createActions() { //qDebug() << "SetupPageWorldEditor::createActions"; connect(addEntityPushButton, SIGNAL(clicked()), this, SLOT(slotAddButtonClicked()) ); connect(delEntityPushButton, SIGNAL(clicked()), this, SLOT(slotDelButtonClicked()) ); connect(editEntityPushButton, SIGNAL(clicked()), this, SLOT(slotEditButtonClicked()) ); connect(loadWorldPushButton, SIGNAL(clicked()), this, SLOT(slotImportWorldButtonClicked()) ); //connect(worldView, SIGNAL(doubleClicked ( const QModelIndex& ) ), this, SLOT(slotDoubleClickEntity( const QModelIndex& ) ) ); //SIGNAL received from the setupEntityDialog // void entityAdded(const QStringList _qs); // entity connect(setupEntityDialog, SIGNAL(entityAdded(QStringList)), this, SLOT(slotAnalyzeEntityAddedSignal(QStringList) ) ); } void SetupPageWorldEditor::slotAnalyzeEntityAddedSignal(const QStringList _qs) { Q_UNUSED(_qs); /* //qDebug() << "SetupPageWorldEditor::slotAnalyzeEntityAddedSignal\n" << _qs.at(0) << "\n" << _qs.at(1) << "\n" << _qs.at(2) << "\n" << _qs.at(3) << "\n" << _qs.at(4) << "\n" << _qs.at(5) << "\n" << _qs.at(6) << "\n" << _qs.at(7) << "\n" << _qs.at(8) << "\n" << _qs.at(9) << "\n" << _qs.at(10) << "\n"; */ } bool SetupPageWorldEditor::isWorldEmpty() { // I need to check if the world is empty and I have the CTY.CSV file if (world->getHowManyEntities()<1) { return true; } else { return false; } //return true; } void SetupPageWorldEditor::slotAddButtonClicked() { //qDebug() << "SetupPageWorldEditor::slotAddButtonClicked"; setupEntityDialog->exec(); //TODO } void SetupPageWorldEditor::slotDelButtonClicked() { //qDebug() << "SetupPageWorldEditor::slotDelButtonClicked"; //TODO } void SetupPageWorldEditor::slotEditButtonClicked() { //qDebug() << "SetupPageWorldEditor::slotEditButtonClicked"; //TODO } /* void SetupPageWorldEditor::slotDoubleClickEntity( const QModelIndex & index) { //qDebug() << "SetupPageWorldEditor::slotDoubleClickEntity"; //TODO //QSqlQuery query; //QString queryString; //int row = index.row(); } */ void SetupPageWorldEditor::slotImportWorldButtonClicked() { //qDebug() << "SetupPageWorldEditor::slotImportWorldButtonClicked"; QString klogDir; klogDir = util->getHomeDir(); QString worldFile; worldFile.clear(); worldFile = QFileDialog::getOpenFileName(this, tr("Open File"), klogDir, tr("BigCTY (*.csv)")); QMessageBox msgBox; //qDebug() << "SetupPageWorldEditor::slotImportWorldButtonClicked: " << worldFile; if (world->recreate(worldFile) ) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("Entities information has been updated.")); worldModel->select(); } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("Entities information has not been updated.")); } msgBox.exec(); //qDebug() << "SetupPageWorldEditor::slotImportWorldButtonClicked - END"; } klog-2.3.3/setuppages/setuppageelog.h0000644000015700001710000001060014542412415017527 0ustar jenkinsjenkins#ifndef KLOG_SETUPPAGES_SETUPPAGEELOG_H #define KLOG_SETUPPAGES_SETUPPAGEELOG_H /*************************************************************************** setuppageelog.h - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include "../utilities.h" class SetupPageELog : public QWidget { Q_OBJECT public: SetupPageELog(QWidget *parent=nullptr); ~SetupPageELog(); //Clublog void setClubLogActive(const bool &_b); // LoTW void setLoTWActive(const bool &_s); //QRZ.COM void setQRZCOMActive(const bool _s); void setQRZCOMAutoCheck(const bool _s); void saveSettings(); void loadSettings(); private slots: void slotClubLogActive(const bool _s); void slotEQSLActive(const bool _s); void slotTQSLActive(const bool _s); void slotQRZCOMActive(const bool _s); //void slotQRZCOMAuto(const bool _s); void slotQRZCallTextChanged(); void slotSelectTQSLClicked(); void slotPathLineEditChanged(const QString &_q); void slotEnterKeyPressed(); void slotClubLogEmailDefineColor(); void slotLoTWEmailDefineColor(); void sloteQSLCallTextChanged(); signals: void enterKey(); //void qrzcomAuto(bool _s); protected: //void closeEvent(QCloseEvent *event); void showEvent(QShowEvent *event); private: void setDefaults(); //QString defaultFileName; QGroupBox *clubLogGroup; QCheckBox *clubLogSendInRealTimeCheckBox, *clubLogActiveCheckBox;//, *useQSOStationCallCheckBox; QLineEdit *clubLogAppPasswordLineEdit, *clubLogPasswordLineEdit, *clubLogEmailLineEdit;//, *callLineEdit; QLabel *clubLogAppPasswordLabel, *clubLogPasswordLabel, *clubLogEmailLabel; //*callLabel, QGroupBox *eQSLccGroup; QLineEdit *eQSLUserLineEdit, *eQSLPasswordLineEdit; QCheckBox *eQSLActiveCheckBox; //*eQSLSendInRealTimeCheckBox, QLabel *eQSLpasswordLabel, *eQSLemailLabel; //bool eqslActive; //QString eqslUser, eqslPass; QGroupBox *lotwGroup, *lotwUpGroup, *lotwDownGroup; QLineEdit *lotwUserLineEdit, *lotwPasswordLineEdit; QLineEdit *lotwTQSLPathLineEdit; QPushButton *lotwSearchTQSLPushButton; QCheckBox *lotwUseTQSLCheckBox; QLabel *lotwpasswordLabel, *lotwemailLabel; //bool lotwTQSL; //QString lotwPath, lotwUser, lotwPass; QGroupBox *QRZCOMGroup; //QLineEdit *QRZCOMAPILineEdit; QLineEdit *QRZCOMUserLineEdit, *QRZCOMPasswordLineEdit, *QRZCOMLogBookKEYLineEdit; QLabel *QRZCOMPasswordLabel, *QRZCOMUserLabel, *QRZLogBookKeyLabel; QCheckBox *QRZCOMActiveCheckBox, *QRZCOMAutoCheckCheckBox, *QRZCOMSubscriberCheckBox; //bool qrzcomAutoFill; // QString qrcomLogbookKey; Utilities *util; QPalette palRed, palBlack; }; #endif // SETUPPAGEELOG_H klog-2.3.3/setuppages/setuppageuserdata.h0000644000015700001710000001252714542412415020423 0ustar jenkinsjenkins#ifndef KLOG_SETUPPAGES_SETUPPAGEUSERDATA_H #define KLOG_SETUPPAGES_SETUPPAGEUSERDATA_H /*************************************************************************** setuppageuserdata.h - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include "../world.h" #include "../locator.h" #include "../dataproxy_sqlite.h" #include "../utilities.h" class SetupPageUserDataPage : public QWidget { Q_OBJECT public: SetupPageUserDataPage(DataProxy_SQLite *dp, QWidget *parent=nullptr); ~SetupPageUserDataPage(); void setPrefixes(); QString getMainCallsign(); QString getOperators(); QString getStationLocator(); int getCQz(); int getITUz(); QString getName(); QStringList getAddress(); QString getAddress1(); QString getAddress2(); QString getAddress3(); QString getAddress4(); QString getCity(); QString getZipCode(); QString getProvince(); QString getCountry(); bool setName (const QString &_aux); bool setAddress1 (const QString &_aux); bool setAddress2 (const QString &_aux); bool setAddress3 (const QString &_aux); bool setAddress4 (const QString &_aux); bool setAddress (const QStringList _aux); bool setCity (const QString &_aux); bool setZipCode (const QString &_aux); bool setProvince (const QString &_aux); bool setCountry (const QString &_aux); bool setMainCallsign(const QString &_qrz); bool setOperators(const QString &_aux); bool setStationLocator(const QString &_loc); bool setCQz(const int _cqz); bool setITUz(const int _ituz); QString getRig1(); QString getRig2(); QString getRig3(); QString getAntenna1(); QString getAntenna2(); QString getAntenna3(); QStringList getRigs(); QStringList getAntennas(); double getPower(); bool setRigs(const QStringList _aux); bool setAntennas(const QStringList _aux); bool setPower(const float _aux); bool setRig1 (const QString &_aux); bool setRig2 (const QString &_aux); bool setRig3 (const QString &_aux); bool setAntenna1 (const QString &_aux); bool setAntenna2 (const QString &_aux); bool setAntenna3 (const QString &_aux); void setStationFocus(); void saveSettings(); void loadSettings(); signals: void mainCallsignSignal (const QString &_p); void operatorsSignal (const QString &_p); void enterKey(); private slots: void slotMyLocatorTextChanged(); void slotOperatorsChanged(); void slotEnterKeyPressed(); void slotQRZTextChanged(); // void slotContestOverLayChanged(int i); private: bool checkOperatorsLineQString(const QString &_auxLine); QTabWidget *tabWidget; QLineEdit *maincallsignLineEdit; // This is the callsign of the user. Will be suggested as station callsign for new logs QLineEdit *operatorsLineEdit; //Operators QLineEdit *cqzLineEdit; QLineEdit *ituzLineEdit; QLineEdit *myLocatorLineEdit; QLabel *myLocatorLabel; //Personal Tab QLineEdit *nameLineEdit; QTextEdit *addressTextEdit; QLineEdit *address1LineEdit; QLineEdit *address2LineEdit; QLineEdit *address3LineEdit; QLineEdit *address4LineEdit; QLineEdit *cityLineEdit; QLineEdit *zipLineEdit; QLineEdit *provinceLineEdit; QLineEdit *countryLineEdit; // Station Tab QLineEdit *rig1LineEdit; QLineEdit *rig2LineEdit; QLineEdit *rig3LineEdit; QLineEdit *ant1LineEdit; QLineEdit *ant2LineEdit; QLineEdit *ant3LineEdit; //QLineEdit *powerLineEdit; QDoubleSpinBox *myPowerSpinBox; QPalette *defaultPalette, *wrongPalette; QColor redColor; Locator *locator; World *world; DataProxy_SQLite *dataProxy; bool operatorsOK; bool mainCallOK; bool slotQRZRunning; Utilities *util; }; #endif // SETUPPAGEUSERDATA_H klog-2.3.3/setuppages/setuppageudp.cpp0000644000015700001710000003243414542412415017735 0ustar jenkinsjenkins/*************************************************************************** setuppageudp.cpp - description ------------------- begin : sept 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "setuppageudp.h" SetupPageUDP::SetupPageUDP(QWidget *parent) : QWidget(parent) { //qDebug() << "SetupPageUDP::SetupPageUDP"; logFromWSJTXCheckbox = new QCheckBox(this); realDataFromWSJTXCheckbox = new QCheckBox(this); logAutomaticallyWSJTXCheckbox = new QCheckBox(this); UDPServerCheckBox = new QCheckBox(tr("Start UDP Server"), this); UDPServerPortSpinBox = new QSpinBox; miliSecsSpinBox = new QSpinBox; networkInterfacesComboBox = new QComboBox; //qDebug() << "SetupPageUDP::SetupPageUDP: 1"; util = new Utilities(Q_FUNC_INFO); defaultport = 2237; // Default WSJTX port defaultTimer = 2000; // 2 secs //qDebug() << "SetupPageUDP::SetupPageUDP: 2"; createUI(); //qDebug() << "SetupPageUDP::SetupPageUDP: 3"; createActions(); //qDebug() << "SetupPageUDP::SetupPageUDP: 4"; fillNetworkInterfaceComboBox(); //qDebug() << "SetupPageUDP::SetupPageUDP - END"; } SetupPageUDP::~SetupPageUDP(){ delete(util); //qDebug() << "SetupPageUDP::~SetupPageUDP"; } void SetupPageUDP::createUI() { QString msgAuto = QString(tr("Automatically log QSOs from WSJT-X")); logFromWSJTXCheckbox->setText(tr("Allow WSJT-X to send logged QSOs to KLog")); logFromWSJTXCheckbox->setToolTip(tr("QSOs logged in WSJT-X will be sent to KLog and KLog will ask before logging into KLog unless \"%1\" is selected").arg(msgAuto)); logAutomaticallyWSJTXCheckbox->setText(msgAuto); logAutomaticallyWSJTXCheckbox->setToolTip(tr("KLog will automatically log any QSO coming from WSJT-X without any manual confirmation.")); realDataFromWSJTXCheckbox->setText(tr("Update status information from WSJT-X")); realDataFromWSJTXCheckbox->setToolTip(tr("KLog will automatically show and update data coming from WSJT-X (DX callsign, Report, mode, ...)")); UDPServerCheckBox->setChecked(false); logFromWSJTXCheckbox->setChecked(false); logAutomaticallyWSJTXCheckbox->setChecked(false); realDataFromWSJTXCheckbox->setChecked(false); logFromWSJTXCheckbox->setEnabled(false); logAutomaticallyWSJTXCheckbox->setEnabled(false); realDataFromWSJTXCheckbox->setEnabled(false); QVBoxLayout *checkLayout = new QVBoxLayout; checkLayout->addWidget(logFromWSJTXCheckbox); checkLayout->addWidget(logAutomaticallyWSJTXCheckbox); checkLayout->addWidget(realDataFromWSJTXCheckbox); QString labelTip = tr("UDP port number where the UDP Server will listen for packets.") + "\n" + tr("Make sure it is the same port that the other programs are sending the data to. Default port is 2237."); UDPServerCheckBox->setToolTip(tr("UDP Server will receive QSOs sent from other programs like WSJT-X allowing you to log in KLog automatically from those programs.")); UDPServerPortSpinBox->setToolTip(labelTip); UDPServerPortSpinBox->setMinimum(0); UDPServerPortSpinBox->setMaximum(65535); UDPServerPortSpinBox->setValue(defaultport); QLabel *udpPortLabel = new QLabel(tr("UDP Port")); udpPortLabel->setBuddy(UDPServerPortSpinBox); udpPortLabel->setToolTip(labelTip); udpPortLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); udpPortLabel->setEnabled(true); QHBoxLayout *UDPPortLayout = new QHBoxLayout; UDPPortLayout->addWidget(udpPortLabel); UDPPortLayout->addWidget(UDPServerPortSpinBox); networkInterfacesComboBox->setToolTip(tr("Select the interface to listen for UDP datagrams coming from WSJT-X.")); QLabel *networkInterfaceLabel = new QLabel(tr("Network interface")); networkInterfaceLabel->setToolTip(tr("Select the interface to listen for UDP datagrams coming from WSJT-X.")); QHBoxLayout *networkIfacesLayout = new QHBoxLayout; networkIfacesLayout->addWidget(networkInterfaceLabel); networkIfacesLayout->addWidget(networkInterfacesComboBox); miliSecsSpinBox->setMinimum(0); miliSecsSpinBox->setMaximum(30000); miliSecsSpinBox->setValue(defaultTimer); QLabel *miliSecsSpinBoxLabel = new QLabel(tr("QSOs notification timeout (milisecs)")); miliSecsSpinBox->setToolTip(tr("Miliseconds that the notification of QSOs received from WSJTX will be shown.")); miliSecsSpinBoxLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); miliSecsSpinBoxLabel->setEnabled(true); miliSecsSpinBox->setEnabled(false); QHBoxLayout *UDPTimeLayout = new QHBoxLayout; UDPTimeLayout->addWidget(miliSecsSpinBoxLabel); UDPTimeLayout->addWidget(miliSecsSpinBox); //QHBoxLayout *UDPLayout = new QHBoxLayout; //UDPLayout->addLayout(networkIfacesLayout); //UDPLayout->addLayout(UDPPortLayout); QGridLayout *gridLayout = new QGridLayout; gridLayout->addLayout(networkIfacesLayout, 0, 0); gridLayout->addLayout(UDPPortLayout, 0, 1); gridLayout->addLayout(UDPTimeLayout, 1, 0); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(UDPServerCheckBox); layout->addLayout(gridLayout); layout->addLayout(checkLayout); setLayout(layout); } void SetupPageUDP::createActions() { connect(logFromWSJTXCheckbox, SIGNAL(clicked()), this, SLOT(slotLogFromWSJTCheckBoxClicked() ) ); //connect(logAutomaticallyWSJTXCheckbox, SIGNAL(clicked () ), this, SLOT(slotAutoLogFromWSJTCheckBoxClicked() ) ); //connect(realDataFromWSJTXCheckbox, SIGNAL(clicked () ), this, SLOT(slotRealFromWSJTCheckBoxClicked() ) ); connect(UDPServerCheckBox, SIGNAL(clicked()), this, SLOT(slotUDPServerCheckBoxClicked() ) ); } void SetupPageUDP::slotUDPServerCheckBoxClicked() { //qDebug() << "SetupPageUDP::slotUDPServerCheckBoxClicked"; if (UDPServerCheckBox->isChecked()) { logFromWSJTXCheckbox->setEnabled(true); logFromWSJTXCheckbox->setChecked(true); logAutomaticallyWSJTXCheckbox->setEnabled(true); realDataFromWSJTXCheckbox->setEnabled(true); miliSecsSpinBox->setEnabled(true); } else { logFromWSJTXCheckbox->setChecked(false); logAutomaticallyWSJTXCheckbox->setChecked(false); realDataFromWSJTXCheckbox->setChecked(false); logFromWSJTXCheckbox->setEnabled(false); logAutomaticallyWSJTXCheckbox->setEnabled(false); realDataFromWSJTXCheckbox->setEnabled(false); miliSecsSpinBox->setEnabled(false); } } void SetupPageUDP::fillNetworkInterfaceComboBox() { QNetworkInterface loopBack; QStringList interfacesNames; interfacesNames.clear(); networkInterfacesComboBox->clear(); QList ifaces; ifaces.clear(); ifaces << QNetworkInterface::allInterfaces(); foreach (QNetworkInterface i, ifaces) { if ((i.flags().testFlag(QNetworkInterface::IsUp)) && (i.flags().testFlag(QNetworkInterface::IsLoopBack))) { loopBack = i; } else if ((i.flags().testFlag(QNetworkInterface::IsUp)) && (i.humanReadableName().length()>0) && (i.flags().testFlag(QNetworkInterface::CanMulticast)) ) { interfacesNames.append(i.humanReadableName() + "-" + i.hardwareAddress() ); } } interfacesNames.insert(0, loopBack.humanReadableName()); networkInterfacesComboBox->addItems(interfacesNames); } void SetupPageUDP::slotLogFromWSJTCheckBoxClicked() { //qDebug() << "SetupPageUDP::slotLogFromWSJTCheckBoxClicked"; if (logFromWSJTXCheckbox->isChecked()) { logAutomaticallyWSJTXCheckbox->setEnabled(true); } else { logAutomaticallyWSJTXCheckbox->setEnabled(false); logAutomaticallyWSJTXCheckbox->setChecked(false); } } QString SetupPageUDP::getUDPServer() { return util->boolToQString(UDPServerCheckBox->isChecked()); } void SetupPageUDP::setUDPServer(const bool _t) { //qDebug() << "SetupPageUDP::setUDPServer: " << t; UDPServerCheckBox->setChecked(_t); slotUDPServerCheckBoxClicked(); } void SetupPageUDP::setUDPServerPort(const int _t) { //qDebug() << Q_FUNC_INFO << ": " << QString::number (_t); if ( (_t>=0) && (_t<=65535)) { UDPServerPortSpinBox->setValue(_t); } else { UDPServerPortSpinBox->setValue(defaultport); } } QString SetupPageUDP::getUDPServerPort() { int t = UDPServerPortSpinBox->value(); if ( (t>=0) && (t<=65535) ) { return QString::number(t); } else { return QString::number(defaultport); } } void SetupPageUDP::setTimeout(const int _t) { if ( (_t>=0) && (_t<=30000)) { miliSecsSpinBox->setValue(_t); } else { miliSecsSpinBox->setValue(defaultTimer); } } /* int SetupPageUDP::getTimeout() { int t = miliSecsSpinBox->value(); if ( (t>=0) && (t<=30000) ) { return t } else { return defaultTimer; } } */ QString SetupPageUDP::getLogFromWSJTx() { return util->boolToQString(logFromWSJTXCheckbox->isChecked()); } QString SetupPageUDP::getAutoLogFromWSJTx() { return util->boolToQString(logAutomaticallyWSJTXCheckbox->isChecked()); } QString SetupPageUDP::getReaDataFromWSJTx() { return util->boolToQString(realDataFromWSJTXCheckbox->isChecked()); } void SetupPageUDP::setLogFromWSJTx(const bool _t) { logFromWSJTXCheckbox->setChecked(_t); slotLogFromWSJTCheckBoxClicked(); } void SetupPageUDP::setAutoLogFromWSJTx(const bool _t) { logAutomaticallyWSJTXCheckbox->setChecked(_t); } void SetupPageUDP::setReaDataFromWSJTx(const bool _t) { realDataFromWSJTXCheckbox->setChecked(_t); } QString SetupPageUDP::getNetworkInterface() { if (networkInterfacesComboBox->currentIndex() == 0) { return networkInterfacesComboBox->currentText(); } else { return networkInterfacesComboBox->currentText().split('-').at(1); } } void SetupPageUDP::setNetworkInterface(const QString &_t) { //qDebug() << "SetupPageUDP::setNetworkInterface: " << _t; if (networkInterfacesComboBox->findText(_t, Qt::MatchEndsWith) >= 0) { //qDebug() << "SetupPageUDP::setNetworkInterface: found: " << _t; networkInterfacesComboBox->setCurrentIndex(networkInterfacesComboBox->findText(_t, Qt::MatchEndsWith)); } else { //qDebug() << "SetupPageUDP::setNetworkInterface: NOT found: " << _t; networkInterfacesComboBox->setCurrentIndex(0); } } void SetupPageUDP::saveSettings() { //qDebug() << Q_FUNC_INFO << " - Start"; QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("UDPServer"); settings.setValue ("UDPServer", QVariant((UDPServerCheckBox->isChecked()))); settings.setValue ("UDPNetworkInterface", getNetworkInterface()); settings.setValue ("UDPServerPort", getUDPServerPort()); settings.setValue ("LogFromWSJTX", QVariant((logFromWSJTXCheckbox->isChecked()))); settings.setValue ("LogAutoFromWSJTX", QVariant((logAutomaticallyWSJTXCheckbox->isChecked()))); settings.setValue ("RealTimeFromWSJTX", QVariant((realDataFromWSJTXCheckbox->isChecked()))); settings.setValue ("InfoTimeOut", miliSecsSpinBox->value()); settings.endGroup (); //qDebug() << Q_FUNC_INFO << " - END"; } void SetupPageUDP::loadSettings() { QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("UDPServer"); setUDPServer (settings.value("UDPServer").toBool ()); setNetworkInterface (settings.value("UDPNetworkInterface").toString ()); setUDPServerPort (settings.value("UDPServerPort").toInt ()); setUDPServer (settings.value("UDPServer").toBool ()); setLogFromWSJTx(settings.value("LogFromWSJTX").toBool ()); logAutomaticallyWSJTXCheckbox->setChecked(settings.value("LogAutoFromWSJTX").toBool ()); realDataFromWSJTXCheckbox->setChecked(settings.value("RealTimeFromWSJTX").toBool ()); setTimeout(settings.value("InfoTimeOut").toInt ()); settings.endGroup (); } klog-2.3.3/setuppages/setuppagesubdivisionnew.cpp0000644000015700001710000010130614542412415022210 0ustar jenkinsjenkins/*************************************************************************** setuppageregionalawardsnew.h - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implements the Dialog to add a new log // #include "setuppagesubdivisionnew.h" SetupPageSubdivisionNew::SetupPageSubdivisionNew(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "SetupPageSubdivisionNew::SetupPageSubdivisionNew" ; Q_UNUSED(parent); dataProxy = dp; editing = false; checking = false; /* * bCass = false; bCOp = false; bCMo = false; bCPo = false; bCBa = false; bCOv = false; bCTy = false; */ logData.clear(); stationCallsignFilled = false; operatorsFilled = true; stationCallsign = QString(); operators = QString(); comment = QString(); dateString = QString(); stationCallsignLineEdit = new QLineEdit; operatorsLineEdit = new QLineEdit; dateEdit = new QDateEdit; dateEdit->setDate(QDate::currentDate ()); commentLineEdit = new QLineEdit; dateLabel = new QLabel(tr("&Date")); stationCallsignLabel = new QLabel(tr("&Station Callsign")); operatorsLabel = new QLabel(tr("&Operators")); commentLabel = new QLabel(tr("Comm&ent")); okButton = new QPushButton(tr("&Ok"), this); cancelButton = new QPushButton(tr("&Cancel"), this); createWidget(); okButton->setEnabled(false); //qDebug() << "SetupPageSubdivisionNew::SetupPageSubdivisionNew - END" ; } SetupPageSubdivisionNew::~SetupPageSubdivisionNew() { delete(dataProxy); } void SetupPageSubdivisionNew::clear() { //qDebug() << "SetupPageSubdivisionNew::Clear - Start" ; stationCallsignLineEdit->clear(); operatorsLineEdit->clear(); dateEdit->setDate(QDate::currentDate ()); /* typeComboBox->setCurrentIndex(0); contestCatModeComboBox->setCurrentIndex(0); contestCatOperatorsComboBox->setCurrentIndex(0); contestCatAssistedComboBox->setCurrentIndex(0); contestCatPowerComboBox->setCurrentIndex(0); contestCatBandsComboBox->setCurrentIndex(0); contestBandsComboBox->setCurrentIndex(0); contestCatOverlayComboBox->setCurrentIndex(0); contestCatModeComboBox->setCurrentIndex(0); typeContest = 0; contestCatMode = 0; contestCatOperators = 0; contestCatAssisted = 0; contestCatPower = 0; contestCatBands = 0; contestBands = 0; contestCatOverlay = 0; typeContestSelected = 0;*/ //qDebug() << "SetupPageSubdivisionNew::Clear - END" ; } void SetupPageSubdivisionNew::createWidget() { //qDebug() << "SetupPageSubdivisionNew::createWidget - Start"; stationCallsignLabel->setWordWrap(true); operatorsLabel->setWordWrap(true); commentLabel->setWordWrap(true); dateLabel->setBuddy(dateEdit); stationCallsignLabel->setBuddy(stationCallsignLineEdit); operatorsLabel->setBuddy(operatorsLineEdit); commentLabel->setBuddy(commentLineEdit); /* catAsLabel->setBuddy(contestCatAssistedComboBox); typeLabel->setBuddy(typeComboBox); catOpLabel->setBuddy(contestCatOperatorsComboBox); catModeLabel->setBuddy(contestCatModeComboBox); catPowerLabel->setBuddy(contestCatPowerComboBox); catBandsLabel->setBuddy(contestCatBandsComboBox); overlayLabel->setBuddy(contestCatOverlayComboBox); validCats->setText(tr("Select categories")); validCats->setWordWrap(true); */ stationCallsignLineEdit->setToolTip(tr("Callsign used for this log.")); operatorsLineEdit->setToolTip(tr("Comma separated list of operators: callsign1, callsign2.")); dateEdit->setToolTip(tr("Start date of this log.")); commentLineEdit->setToolTip(tr("Add a comment about this log. If filled, it will be shown in the main KLog title to identify the log.")); //typeLabel->setText(tr("&Type of Operation")); //typeLabel->setWordWrap(true); //nameLabel->setWordWrap(true); dateLabel->setWordWrap(true); /* typeComboBox->setToolTip(tr("Select the kind of operation for this log.")); QStringList _qs; _qs.clear(); _qs.append(dataProxy->getContestNames()); typeComboBox->addItems(_qs); //qDebug() << "SetupPageSubdivisionNew::createWidget - contestNames: " << _qs.at(0); catModeLabel->setText(tr("&Mode Category")); catModeLabel->setWordWrap(true); contestCatModeComboBox->setToolTip(tr("Select the mode category.")); _qs.clear(); _qs.append(dataProxy->getContestCat(6)); contestCatModeComboBox->addItems(_qs); //QLabel *catOpLabel = new QLabel(tr("Operators Category")); catOpLabel->setText(tr("O&perators Category")); catOpLabel->setWordWrap(true); contestCatOperatorsComboBox->setToolTip(tr("Select the operators category.")); _qs.clear(); _qs.append(dataProxy->getContestCat(1)); contestCatOperatorsComboBox->addItems(_qs); catAsLabel->setText(tr("&Assisted Category")); catOpLabel->setWordWrap(true); contestCatAssistedComboBox->setToolTip(tr("Select the assisted category.")); _qs.clear(); _qs.append(dataProxy->getContestCat(2)); contestCatAssistedComboBox->addItems(_qs); //QLabel *catPowerLabel = new QLabel(tr("Power Category")); catPowerLabel->setText(tr("Po&wer Category")); catPowerLabel->setWordWrap(true); contestCatPowerComboBox->setToolTip(tr("Select the power category.")); _qs.clear(); _qs.append(dataProxy->getContestCat(3)); contestCatPowerComboBox->addItems(_qs); //QLabel *catBandsLabel = new QLabel(tr("Bands Category")); catBandsLabel->setText(tr("&Bands Category")); catBandsLabel->setWordWrap(true); contestCatBandsComboBox->setToolTip(tr("Select the bands category.")); _qs.clear(); _qs.append(dataProxy->getContestCat(4)); contestCatBandsComboBox->addItems(_qs); overlayLabel->setText(tr("O&verlay")); overlayLabel->setWordWrap(true); contestCatOverlayComboBox->setToolTip(tr("Select the Overlay category.")); _qs.clear(); _qs.append(dataProxy->getContestOverlays()); contestCatOverlayComboBox->addItems(_qs); */ connect(stationCallsignLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotStationCallSignTextChanged() ) ); connect(operatorsLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotOperatorsTextChanged() ) ); /* connect(typeComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotTypeComboBoxChanged() ) ) ; connect(contestCatModeComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatModeComboBoxChanged() ) ) ; connect(contestCatAssistedComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatAssistedComboBoxChanged() ) ) ; connect(contestCatOperatorsComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatOperatorsComboBoxChanged() ) ) ; connect(contestCatPowerComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatPowerComboBoxChanged() ) ) ; connect(contestCatBandsComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatBandsComboBoxChanged() ) ) ; connect(contestCatOverlayComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatOverlayComboBoxChanged() ) ) ; */ //connect(typeComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotTypeComboBoxChanged() ) ) ; //connect(contestCatModeComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatModeComboBoxChanged() ) ) ; //connect(contestCatAssistedComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatAssistedComboBoxChanged() ) ) ; //connect(contestCatOperatorsComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatOperatorsComboBoxChanged() ) ) ; //connect(contestCatPowerComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatPowerComboBoxChanged() ) ) ; //connect(contestCatBandsComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatBandsComboBoxChanged() ) ) ; //connect(contestCatOverlayComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatOverlayComboBoxChanged() ) ) ; //connect(contestBandsComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotBandsComboBoxChanged() ) ) ; //connect(contestCatModeComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatModeComboBoxChanged() ) ) ; connect(okButton,SIGNAL(clicked()), this, SLOT(slotOKButtonClicked() ) ); connect(cancelButton, SIGNAL(clicked()), this, SLOT(slotCancelButtonClicked() ) ); QGridLayout *callsLayout = new QGridLayout; // Widget, row, column callsLayout->addWidget(stationCallsignLabel, 0, 0); callsLayout->addWidget(stationCallsignLineEdit, 0, 1); callsLayout->addWidget(dateLabel, 1, 0); callsLayout->addWidget(dateEdit, 1, 1); callsLayout->addWidget(operatorsLabel, 2, 0); callsLayout->addWidget(operatorsLineEdit, 2, 1); callsLayout->addWidget(commentLabel, 3, 0); callsLayout->addWidget(commentLineEdit, 3, 1); /* callsLayout->addWidget(typeLabel, 3, 0); callsLayout->addWidget(typeComboBox, 3, 1); callsLayout->addWidget(catModeLabel, 4, 0); callsLayout->addWidget(contestCatModeComboBox, 4, 1); callsLayout->addWidget(catOpLabel, 5, 0); callsLayout->addWidget(contestCatOperatorsComboBox, 5, 1); callsLayout->addWidget(catAsLabel, 6, 0); callsLayout->addWidget(contestCatAssistedComboBox, 6, 1); callsLayout->addWidget(catPowerLabel, 7, 0); callsLayout->addWidget(contestCatPowerComboBox, 7, 1); callsLayout->addWidget(catBandsLabel, 8, 0); callsLayout->addWidget(contestCatBandsComboBox, 8, 1); callsLayout->addWidget(contestBandsComboBox, 8, 2); callsLayout->addWidget(overlayLabel, 10, 0); callsLayout->addWidget(contestCatOverlayComboBox, 10, 1); */ QHBoxLayout *buttonsLayout = new QHBoxLayout; //buttonsLayout->addWidget(validCats); buttonsLayout->addSpacerItem(new QSpacerItem(10,0,QSizePolicy::Expanding,QSizePolicy::Maximum)); buttonsLayout->addWidget(okButton); buttonsLayout->addWidget(cancelButton); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(callsLayout); mainLayout->addLayout(buttonsLayout); setLayout(mainLayout); clear(); //page->setLayout(callsLayout); //qDebug() << "SetupPageSubdivisionNew::createWidget - End"; } void SetupPageSubdivisionNew::slotOperatorsTextChanged() { //qDebug() << "SetupPageSubdivisionNew::slotOperatorsTextChanged - Start"; // connect(stationCallsignLineEdit, SIGNAL(textChanged(QString)), this, SLOT( ) ); if ((operatorsLineEdit->text()).length()<1) { return; } int cursorP = operatorsLineEdit->cursorPosition(); QString currentQrz = operatorsLineEdit->text(); if ((currentQrz.at(cursorP-1)).isSpace()) { currentQrz = currentQrz.remove(cursorP-1, 1); cursorP--; operatorsLineEdit->setText(currentQrz); } operatorsLineEdit->setText(((operatorsLineEdit->text())).simplified()); operatorsLineEdit->setText((operatorsLineEdit->text()).toUpper()); operatorsLineEdit->setCursorPosition(cursorP); if (currentQrz.length()>=3) {//TODO: Add a check of the format (comma separated) operatorsFilled= true; } //qDebug() << "SetupPageSubdivisionNew::slotOperatorsTextChanged - End"; } void SetupPageSubdivisionNew::slotStationCallSignTextChanged() { //qDebug() << "SetupPageSubdivisionNew::slotStationCallSignTextChanged"; // connect(stationCallsignLineEdit, SIGNAL(textChanged(QString)), this, SLOT( ) ); if ((stationCallsignLineEdit->text()).length()<1) { showNOK(); return; } int cursorP = stationCallsignLineEdit->cursorPosition(); QString currentQrz = stationCallsignLineEdit->text(); if ((currentQrz.at(cursorP-1)).isSpace()) { currentQrz = currentQrz.remove(cursorP-1, 1); cursorP--; stationCallsignLineEdit->setText(currentQrz); } stationCallsignLineEdit->setText(((stationCallsignLineEdit->text())).simplified()); stationCallsignLineEdit->setText((stationCallsignLineEdit->text()).toUpper()); stationCallsignLineEdit->setCursorPosition(cursorP); if (currentQrz.length()>=3) { stationCallsignFilled = true; } showOK(); //qDebug() << "SetupPageSubdivisionNew::slotStationCallSignTextChanged - End"; } /* void SetupPageSubdivisionNew::slotTypeComboBoxChanged() { //qDebug() << "SetupPageSubdivisionNew::slotTypeComboBoxChanged"; // connect(typeComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotTypeComboBoxChanged() ) ) ; contestCatMode = contestCatModeComboBox->currentIndex(); contestCatBands = contestCatBandsComboBox->currentIndex(); contestCatPower = contestCatPowerComboBox->currentIndex(); contestCatOperators = contestCatOperatorsComboBox->currentIndex(); contestCatAssisted = contestCatAssistedComboBox->currentIndex(); typeContestSelected = typeComboBox->currentIndex(); contestCatOverlay= contestCatOverlayComboBox->currentIndex(); typeContest = getSelectedTypeContest(); if (typeContest < 0) { typeLabel->setStyleSheet("QLabel {color : red; }"); validCats->setText(tr("Categories not OK")); validCats->setStyleSheet("QLabel {color : red; }"); okButton->setEnabled(false); } else { typeLabel->setStyleSheet("QLabel {color : black; }"); showOK(); } } void SetupPageSubdivisionNew::slotCatAssistedComboBoxChanged() { //qDebug() << "SetupPageLogs:slotCatAssistedComboBoxChanged: " << QString::number(contestCatAssistedComboBox->currentIndex()) ; //connect(contestCatAssistedComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatAssistedComboBoxChanged() ) ) ; contestCatMode = contestCatModeComboBox->currentIndex(); contestCatBands = contestCatBandsComboBox->currentIndex(); contestCatPower = contestCatPowerComboBox->currentIndex(); contestCatOperators = contestCatOperatorsComboBox->currentIndex(); contestCatAssisted = contestCatAssistedComboBox->currentIndex(); typeContestSelected = typeComboBox->currentIndex(); contestCatOverlay= contestCatOverlayComboBox->currentIndex(); typeContest = getSelectedTypeContest(); if (typeContest < 0) { catAsLabel->setStyleSheet("QLabel {color : red; }"); showNOK(); } else { catAsLabel->setStyleSheet("QLabel {color : black; }"); showOK(); } } void SetupPageSubdivisionNew::slotCatOperatorsComboBoxChanged() { //qDebug() << "SetupPageSubdivisionNew::slotCatOperatorsComboBoxChanged(): " << QString::number(contestCatOperatorsComboBox->currentIndex()) ; contestCatMode = contestCatModeComboBox->currentIndex(); contestCatBands = contestCatBandsComboBox->currentIndex(); contestCatPower = contestCatPowerComboBox->currentIndex(); contestCatOperators = contestCatOperatorsComboBox->currentIndex(); contestCatAssisted = contestCatAssistedComboBox->currentIndex(); typeContestSelected = typeComboBox->currentIndex(); contestCatOverlay= contestCatOverlayComboBox->currentIndex(); typeContest = getSelectedTypeContest(); if (typeContest < 0) { catOpLabel->setStyleSheet("QLabel {color : red; }"); showNOK(); } else { catOpLabel->setStyleSheet("QLabel {color : black; }"); showOK(); } } void SetupPageSubdivisionNew::slotCatPowerComboBoxChanged() { //qDebug() << "SetupPageSubdivisionNew::slotCatPowerComboBoxChanged(): " << QString::number(contestCatPowerComboBox->currentIndex()) ; //connect(contestCatPowerComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatPowerComboBoxChanged() ) ) ; contestCatMode = contestCatModeComboBox->currentIndex(); contestCatBands = contestCatBandsComboBox->currentIndex(); contestCatPower = contestCatPowerComboBox->currentIndex(); contestCatOperators = contestCatOperatorsComboBox->currentIndex(); contestCatAssisted = contestCatAssistedComboBox->currentIndex(); typeContestSelected = typeComboBox->currentIndex(); contestCatOverlay= contestCatOverlayComboBox->currentIndex(); typeContest = getSelectedTypeContest(); if (typeContest < 0) { catPowerLabel->setStyleSheet("QLabel {color : red; }"); showNOK(); } else { catPowerLabel->setStyleSheet("QLabel {color : black; }"); showOK(); } } void SetupPageSubdivisionNew::slotCatBandsComboBoxChanged() { //qDebug() << "SetupPageSubdivisionNew::slotCatBandsComboBoxChanged(): " << QString::number(contestCatBandsComboBox->currentIndex()) ; //connect(contestCatBandsComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotCatBandsComboBoxChanged() ) ) ; contestCatMode = contestCatModeComboBox->currentIndex(); contestCatBands = contestCatBandsComboBox->currentIndex(); contestCatPower = contestCatPowerComboBox->currentIndex(); contestCatOperators = contestCatOperatorsComboBox->currentIndex(); contestCatAssisted = contestCatAssistedComboBox->currentIndex(); typeContestSelected = typeComboBox->currentIndex(); contestCatOverlay= contestCatOverlayComboBox->currentIndex(); typeContest = getSelectedTypeContest(); if (typeContest < 0) { catBandsLabel->setStyleSheet("QLabel {color : red; }"); showNOK(); } else { catBandsLabel->setStyleSheet("QLabel {color : black; }"); showOK(); } } void SetupPageSubdivisionNew::slotBandsComboBoxChanged() { //qDebug() << "SetupPageSubdivisionNew::slotBandsComboBoxChanged(): " << QString::number(contestBandsComboBox->currentIndex()); //connect(contestBandsComboBox, SIGNAL(currentIndexChanged ( int)), this, SLOT(slotBandsComboBoxChanged() ) ) ; } void SetupPageSubdivisionNew::slotCatOverlayComboBoxChanged() { //qDebug() << "SetupPageSubdivisionNew::slotCatOverlayComboBoxChanged(): " << QString::number(contestCatOverlayComboBox->currentIndex()) ; contestCatMode = contestCatModeComboBox->currentIndex(); contestCatBands = contestCatBandsComboBox->currentIndex(); contestCatPower = contestCatPowerComboBox->currentIndex(); contestCatOperators = contestCatOperatorsComboBox->currentIndex(); contestCatAssisted = contestCatAssistedComboBox->currentIndex(); typeContestSelected = typeComboBox->currentIndex(); contestCatOverlay= contestCatOverlayComboBox->currentIndex(); typeContest = getSelectedTypeContest(); //qDebug() << "SetupPageSubdivisionNew::slotCatOverlayComboBoxChanged(): typeContest = " << QString::number(typeContest) ; if (typeContest < 0) { overlayLabel->setStyleSheet("QLabel {color : red; }"); showNOK(); } else { overlayLabel->setStyleSheet("QLabel {color : black; }"); showOK(); } } void SetupPageSubdivisionNew::slotCatModeComboBoxChanged() { //qDebug() << "SetupPageSubdivisionNew::slotCatModeComboBoxChanged(): " << QString::number(contestCatModeComboBox->currentIndex()) ; contestCatMode = contestCatModeComboBox->currentIndex(); contestCatBands = contestCatBandsComboBox->currentIndex(); contestCatPower = contestCatPowerComboBox->currentIndex(); contestCatOperators = contestCatOperatorsComboBox->currentIndex(); contestCatAssisted = contestCatAssistedComboBox->currentIndex(); typeContestSelected = typeComboBox->currentIndex(); contestCatOverlay= contestCatOverlayComboBox->currentIndex(); typeContest = getSelectedTypeContest(); //qDebug() << "SetupPageSubdivisionNew::slotCatModeComboBoxChanged(): " << QString::number(typeContest) ; if (typeContest < 0) { catModeLabel->setStyleSheet("QLabel {color : red; }"); showNOK(); } else { catModeLabel->setStyleSheet("QLabel {color : black; }"); showOK(); } } */ void SetupPageSubdivisionNew::slotOKButtonClicked() { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked"; stationCallsign = stationCallsignLineEdit->text(); if (stationCallsign.length()<3) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("You need to enter a valid callsign in the Station Callsign box.\nThe log will not be opened.")); msgBox.exec(); return; } operators = operatorsLineEdit->text(); //TODO: Check if operators is really including a comma separated list of QRZ comment = commentLineEdit->text(); dateString = dateEdit->date().toString("yyyy-MM-dd"); logData.clear(); logData << stationCallsign << operators << comment << dateString; if (editing) { logData << "1"; editing = false; } else { logData << "0"; } emit newLogData(logData); //gatherAndSend(); clear(); accept(); //typeContest, contestCatOperators, contestCatAssisted, contestCatPower, //contestCatBands, contestCatOverlay, contestCatMode /* if (typeComboBox->isEnabled()) { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked ENA: type"; typeContestSelected = typeComboBox->currentIndex(); typeConteststr = typeComboBox->currentText(); } else { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked NOT ENA: type"; typeContestSelected = 0; typeConteststr = QString(); } if (contestCatModeComboBox->isEnabled()) { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked ENA: mode"; contestCatMode = contestCatModeComboBox->currentIndex(); } else { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked NOT ENA: mode"; contestCatMode = 0; } if (contestCatOperatorsComboBox->isEnabled()) { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked ENA: oper"; contestCatOperators = contestCatOperatorsComboBox->currentIndex(); } else { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked NOT ENA: oper"; contestCatOperators = 0; } if (contestCatAssistedComboBox->isEnabled()) { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked ENA: ass"; contestCatAssisted = contestCatAssistedComboBox->currentIndex(); } else { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked NOT ENA: ass"; contestCatAssisted = 0; } if (contestCatPowerComboBox->isEnabled()) { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked ENA: pwr"; contestCatPower = contestCatPowerComboBox->currentIndex(); //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked ENA: pwr - " << contestCatPowerComboBox->currentText(); } else { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked NOT ENA: pwr"; contestCatPower = 0; } if (contestCatBandsComboBox->isEnabled()) { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked ENA: Cbands"; contestCatBands = contestCatBandsComboBox->currentIndex(); } else { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked NOT ENA: Cbands"; contestCatBands = 0; } if (contestBandsComboBox->isEnabled()) { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked ENA: bands"; contestBands = contestBandsComboBox->currentIndex(); } else { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked NOT ENA: bands"; contestBands = 0; } if (contestCatOverlayComboBox->isEnabled()) { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked ENA: over"; contestCatOverlay = contestCatOverlayComboBox->currentIndex(); } else { //qDebug() << "SetupPageSubdivisionNew::slotOkButtonClicked NOT ENA: over"; contestCatOverlay = 0; } //typeContest, contestCatOperators, contestCatAssisted, contestCatPower, //contestCatBands, contestCatOverlay, contestCatMode // typeContest = getSelectedTypeContest(); if (typeContest < 0) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("You selected an invalid combination.\nThe log will not be opened.")); msgBox.exec(); } else { } */ } void SetupPageSubdivisionNew::gatherAndSend() { //qDebug() << "SetupPageSubdivisionNew::gatherAndSend: " ; // The following lines will be removed once more contest types have been added //contestCatMode = contestCatModeComboBox->currentIndex(); //contestCatBands = contestCatBandsComboBox->currentIndex(); //contestCatPower = contestCatPowerComboBox->currentIndex(); //contestCatOperators = contestCatOperatorsComboBox->currentIndex(); //contestCatAssisted = contestCatAssistedComboBox->currentIndex(); //typeContestSelected = typeComboBox->currentIndex(); //contestCatOverlay = contestCatOverlayComboBox->currentIndex(); //typeContest = getSelectedTypeContest(); // The previous lines will be removed once more contest types have been added logData.clear(); logData << stationCallsign << operators << comment << dateString; /* << typeConteststr << QString::number(contestCatMode) << QString::number(contestCatOperators) << QString::number(contestCatAssisted) << QString::number(contestCatPower) << QString::number(contestCatBands) << QString::number(contestBands) << QString::number(contestCatOverlay) << QString::number(typeContest); */ if (editing) { logData << "1"; editing = false; } else { logData << "0"; } //logData << QString::number(typeContest) // Update the SetupPageLogs::slotAnalyzeNewLogData if you add or remove any field (Today 12) //qDebug() << "SetupPageSubdivisionNew::gatherAndSend: EMITED"; emit newLogData(logData); } void SetupPageSubdivisionNew::slotCancelButtonClicked() { //qDebug() << "SetupPageSubdivisionNew::slotCancelButtonClicked"; logData.clear(); emit cancelled(true); setResult(QDialog::Rejected); clear(); close(); } /* QStringList SetupPageSubdivisionNew::getValidCatOptions(const int _currentCat, const int _higherCat) {// currentCat is the current category and highercat is the category we want to know the information // being: // 1 - contestcatoperator // 2 - contestcatassisted // 3 - contestcatpower // 4 - contestcatband // 5 - contestcatoverlay // 6 - contestcatmode //qDebug() << "SetupPageSubdivisionNew::getValidCatOptions: " << QString::number(_currentCat) <<"/"<< QString::number(_higherCat); //return dataProxy->getValidCatOptions(_currentCat, _higherCat); return QStringList(); } */ void SetupPageSubdivisionNew::setStationCallSign(const QString &_st) { stationCallsign = _st; stationCallsignLineEdit->setText(stationCallsign.toUpper()); } void SetupPageSubdivisionNew::setOperators(const QString &_st) { operators = _st; operatorsLineEdit->setText(operators.toUpper()); } void SetupPageSubdivisionNew::setComment(const QString &_st) { comment = _st; commentLineEdit->setText(comment); } void SetupPageSubdivisionNew::setDateString(const QString &_st) { dateString = _st; dateEdit->setDate(QDate::fromString(dateString, "yyyy-MM-dd")); } /* void SetupPageSubdivisionNew::setType(const QString &_st) { typeConteststr = _st; //typeConteststr = typeComboBox->currentText(); typeComboBox->setCurrentIndex(typeComboBox->findText(typeConteststr, Qt::MatchExactly)); //findText ( const QString & text, Qt::MatchFlags flags = static_cast ( Qt::MatchExactly | Qt::MatchCaseSensitive ) ) const } void SetupPageSubdivisionNew::setCMode(const int _n) { contestCatMode = _n; contestCatModeComboBox->setCurrentIndex(contestCatMode); } void SetupPageSubdivisionNew::setCOperators(const int _n) { contestCatOperators = _n; contestCatOperatorsComboBox->setCurrentIndex(contestCatOperators); } void SetupPageSubdivisionNew::setCAssisted(const int _n) { contestCatAssisted = _n; contestCatAssistedComboBox->setCurrentIndex(contestCatAssisted); } void SetupPageSubdivisionNew::setCPower(const int _n) { contestCatPower = _n; contestCatPowerComboBox->setCurrentIndex(contestCatPower); } void SetupPageSubdivisionNew::setCBands(const int _n) { contestCatBands = _n; contestCatBandsComboBox->setCurrentIndex(contestCatBands); } void SetupPageSubdivisionNew::setBands(const int _n) { contestBands = _n; contestBandsComboBox->setCurrentIndex(contestBands); } void SetupPageSubdivisionNew::setCOverlay(const int _n) { contestCatOverlay = _n; contestCatOverlayComboBox->setCurrentIndex(contestCatOverlay); } */ void SetupPageSubdivisionNew::setEditing(const bool b) { editing = b; if (!editing) { clear(); } } /* int SetupPageSubdivisionNew::getSelectedTypeContest() { //qDebug() << "SetupPageSubdivisionNew::getSelectedTypeContest: "; //is/contest/catoperator/catassisted/catpower/catband/catoverlay/catmode int i = dataProxy->getContestTypeN(typeContestSelected, contestCatOperators, contestCatAssisted, contestCatPower, contestCatBands, contestCatOverlay, contestCatMode); //qDebug() << "SetupPageSubdivisionNew::getSelectedTypeContest: " << QString::number(i); return i; } void SetupPageSubdivisionNew::setTypeN(const int _n) { //qDebug() << "SetupPageSubdivisionNew::setTypeN: " << QString::number(_n); typeContestSelected = _n; fillWithType(typeContestSelected); } void SetupPageSubdivisionNew::fillWithType(const int _n) { //qDebug() << "SetupPageSubdivisionNew::fillWithType - n = " << QString::number(_n); typeContestSelected = _n; QStringList contestData; contestData << dataProxy->getDataFromContestType(_n); //qDebug() << "SetupPageSubdivisionNew::fillWithType-1 (length = " << QString::number(contestData.length()) << ")"; if (contestData.length()== 8) { //qDebug() << "SetupPageSubdivisionNew::fillWithType-2"; //setCOperators ((contestData.at(1)).toInt()); //setCAssisted ((contestData.at(2)).toInt()); //setCPower ((contestData.at(3)).toInt()); //setCOverlay ((contestData.at(4)).toInt()); //setCMode ((contestData.at(5)).toInt()); //setType(contestData.at(6)); //setCBands((contestData.at(7)).toInt()); //qDebug() << "SetupPageSubdivisionNew::fillWithType: " << contestData.at(6); } else { //qDebug() << "SetupPageSubdivisionNew::fillWithType-3"; return; } } void SetupPageSubdivisionNew::updateAllCats() { //qDebug() << "SetupPageSubdivisionNew::updateAllCats"; contestCatMode = contestCatModeComboBox->currentIndex(); contestCatBands = contestCatBandsComboBox->currentIndex(); contestCatPower = contestCatPowerComboBox->currentIndex(); contestCatOperators = contestCatOperatorsComboBox->currentIndex(); contestCatAssisted = contestCatAssistedComboBox->currentIndex(); typeContestSelected = typeComboBox->currentIndex(); contestCatOverlay= contestCatOverlayComboBox->currentIndex(); typeContest = getSelectedTypeContest(); } */ void SetupPageSubdivisionNew::showOK() { //validCats->setText(tr("Data OK")); //validCats->setStyleSheet("QLabel {color : black; }"); okButton->setEnabled(true); } void SetupPageSubdivisionNew::showNOK() { //validCats->setText(tr("Data not OK")); //validCats->setStyleSheet("QLabel {color : red; }"); okButton->setEnabled(false); } klog-2.3.3/setuppages/hamlibserialconfigwidget.h0000644000015700001710000000237314542412415021721 0ustar jenkinsjenkins#ifndef KLOG_SETUPPAGES_HAMLIBSERIALCONFIGWIDGET_H #define KLOG_SETUPPAGES_HAMLIBSERIALCONFIGWIDGET_H #include #include #include "../klogdefinitions.h" #include "../utilities.h" class HamLibSerialConfigWidget : public QWidget { Q_OBJECT public: explicit HamLibSerialConfigWidget(QWidget *parent = nullptr); void createUI(); //void setRigList(const QStringList &_rigs); int getDataBits(); void setDataBits (const int _b); QString getFlowControl(); void setFlowControl(const QString &_st); void setParity(const QString &_st); QString getParity(); void setStopBits(const QString &_st); QString getStopBits(); bool setSerialBauds(const int _speed ); bool setSerialPort(const QString &_port); QString getSerialPort(); int getSerialBauds(); private slots: void slotScanPorts(); private: QStringList getAvailableSerialPorts(); void fillSerialPortsComboBox(); QPushButton *scanSerialPortButton; QComboBox *serialBaudsComboBox, *serialPortComboBox, *dataBitsComboBox, *flowControlComboBox, *parityComboBox, *stopBitsComboBox; //QLineEdit *dataFromRigLineEdit; //QLineEdit *serialPort; QStringList serialPorts; }; #endif // HAMLIBSERIALCONFIGWIDGET_H klog-2.3.3/setuppages/setuppagesats.cpp0000644000015700001710000005752314542412415020125 0ustar jenkinsjenkins/*************************************************************************** setuppagesats.cpp - description ------------------- begin : dec 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include #include "setuppagesats.h" SetupPageSats::SetupPageSats(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent){ //qDebug() << "SetupPageSats::SetupPageSats"; dataProxy = dp; arrild = QString(); satname = QString(); uplink = QString(); downlink = QString(); modes = QString(); newSat = new SetupPageSatsNew(dataProxy, this); util = new Utilities(Q_FUNC_INFO); selectedSat = -1; //defaultStationCallSign.clear(); //setupD = new SetupDialog(); currentSats = new QComboBox(); satsAvailable.clear(); //newSat = new SetupPageSatsNew(dataProxy); satsModel = new QSqlRelationalTableModel(this); satsView = new QTableView; satsView->setContextMenuPolicy(Qt::CustomContextMenu); satsView->setSortingEnabled(true); createSatsModel(); createSatsPanel(); satsView->setCurrentIndex(satsModel->index(0, 0)); lastSat = 0; newSatPushButton = new QPushButton(tr("&New"), this); editPushButton = new QPushButton(tr("&Edit"), this); removePushButton = new QPushButton(tr("&Remove"), this); importPushButton = new QPushButton(tr("&Import"), this); exportPushButton = new QPushButton(tr("E&xport"), this); newSatPushButton->setToolTip(tr("Add a new satellite.")); editPushButton->setToolTip(tr("Edit the selected satellite.")); removePushButton->setToolTip(tr("Remove the selected satellite.")); importPushButton->setToolTip(tr("Import a satellites file. It will replace the satellites you have in the current list.")); exportPushButton->setToolTip(tr("Export your current satellites to a file.")); currentSats->setToolTip(tr("Select the sat you want to open.")); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addWidget(importPushButton); buttonsLayout->addWidget(exportPushButton); buttonsLayout->addWidget(newSatPushButton); buttonsLayout->addWidget(editPushButton); buttonsLayout->addWidget(removePushButton); QVBoxLayout *widgetLayout = new QVBoxLayout; widgetLayout->addWidget(satsView); widgetLayout->addWidget(currentSats); widgetLayout->addLayout(buttonsLayout); //widgetLayout->addLayout(SatDataLayout); setLayout(widgetLayout); //connect(newSatPushButton, SIGNAL(clicked ( )), this, SLOT(slotNewButtonClicked() ) ); //QObject::connect(manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(slotDownloadFinished(QNetworkReply*))); //connect(setupD, SIGNAL(newSatRequested(true)), this, slotNewButtonClicked() ) createActions(); updateSelectedSats(); //qDebug() << "SetupPageSats::SetupPageSats - END"; } SetupPageSats::~SetupPageSats(){ //qDebug() << "SetupPageSats::~SetupPageSats"; delete(util); delete(newSat); } void SetupPageSats::createNewSat() { //qDebug() << "SetupPageSats::createNewSat"; selectedSat = -1; //newSat->clear(); newSat->setEditing(false); newSat->exec(); } void SetupPageSats::slotNewButtonClicked() { //qDebug() << "SetupPageSats::slotNewButtonClicked"; createNewSat(); } void SetupPageSats::slotEditButtonClicked() { //qDebug() << "SetupPageSats::slotEditButtonClicked"; //QSqlQuery query; //int nameCol = -1; selectedSat = getSelectedSat(); QString shortName = dataProxy->getSateliteArrlIdFromId(selectedSat); newSat->clear(); newSat->setEditing(true); newSat->setShortName(shortName); newSat->setName(dataProxy->getSatelliteName(shortName)); newSat->setUpLink(dataProxy->getSatelliteFullUplink(shortName)); newSat->setDownLink(dataProxy->getSatelliteFullDownlink(shortName)); newSat->setModes(dataProxy->getSatelliteFullMode(shortName)); newSat->exec(); //newSat->setStationCallSign(dataProxy->getStationCallSignFromSat(selectedSat)); //newSat->setOperators(dataProxy->getOperatorsFromSat(selectedSat)); //newSat->setComment(dataProxy->getCommentsFromSat(selectedSat)); //newSat->setDateString(dataProxy->getSatDateFromSat(selectedSat)); //newSat->setTypeN(dataProxy->getSatTypeNFromSat(selectedSat).toInt()); /* //qDebug() << "SetupPageSats::slotEditButtonClicked-1 (selectedlog: " << QString::number(selectedLog) << ")"; QString stringQuery = QString("SELECT * FROM logs WHERE id='%1'").arg(selectedLog); //qDebug() << "SetupPageSats::slotEditButtonClicked -2"; bool sqlOk = query.exec(stringQuery); QSqlRecord rec = query.record(); if (sqlOk) { //qDebug() << "SetupPageSats::slotEditButtonClicked Query OK"; QSqlRecord rec = query.record(); if ( (query.next()) && (query.isValid()) ) {//id/ /stationcall/comment/logtype/logtypeid //qDebug() << "SetupPageSats::slotEditButtonClicked Query Valid"; //nameCol = rec.indexOf("stationcall"); //newLog->setStationCallSign((query.value(nameCol)).toString()); //nameCol = rec.indexOf("operators"); //newLog->setOperators((query.value(nameCol)).toString()); //nameCol = rec.indexOf("comment"); //newLog->setComment((query.value(nameCol)).toString()); //nameCol = rec.indexOf("logdate"); //newLog->setDateString((query.value(nameCol)).toString()); //nameCol = rec.indexOf("logtypen"); //qDebug() << "SetupPageSats::slotEditButtonClicked -3"; //newLog->setTypeN((query.value(nameCol)).toInt()); newLog->exec(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } */ } /* void SetupPageSats::slotSatsCancelled(const bool _q) { selectedSat = -1; } */ void SetupPageSats::slotRemoveButtonClicked() { //qDebug() << "SetupPageSats::slotRemoveButtonClicked"; int selectedSat = getSelectedSat(); QMessageBox::StandardButton ret; ret = QMessageBox::warning(this, tr("KLog"), tr("Do you really want to remove this satellite?") + "\n" + tr("This satellite will no be longer available to be selected ..."), QMessageBox::Yes | QMessageBox::No); if (ret == QMessageBox::Yes) { QString stringQuery = QString("DELETE FROM satellites WHERE id='%1'").arg(selectedSat); QSqlQuery query(stringQuery); bool sqlOk = query.exec(); if (sqlOk) { satsModel->select(); updateSelectedSats(); stringQuery = QString("DELETE FROM log WHERE lognumber='%1'").arg(selectedSat); query.exec(stringQuery); sqlOk = query.exec(); //qDebug() << "SetupPageSats::slotRemoveButtonClicked: LastQuery: " << query.lastQuery() ; if (sqlOk) { stringQuery = QString("DELETE FROM awarddxcc WHERE lognumber='%2'").arg(selectedSat); query.exec(stringQuery); sqlOk = query.exec(); //qDebug() << "SetupPageSats::slotRemoveButtonClicked: LastQuery: " << query.lastQuery() ; if (sqlOk) { //qDebug() << "SetupPageSats::slotRemoveButtonClicked (AWARDDXCC REMOVED: " << QString::number(selectedSat) << ")"; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); showError(tr("Sat has not been removed. (#3)")); //qDebug() << "SetupPageSats::slotRemoveButtonClicked (AWARDDXCC NOT REMOVED: " << QString::number(selectedSat) << ")"; } } else { showError(tr("Sat has not been removed. (#2)")); //qDebug() << "SetupPageSats::slotRemoveButtonClicked (QSOS NOT REMOVED: " << QString::number(selectedSat) << ")"; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); showError(tr("Sat has not been removed. (#1)")); //qDebug() << "SetupPageSats::slotRemoveButtonClicked (NOT REMOVED: " << QString::number(selectedSat) << ")"; } } //ASK FOR A CONFIRMATION //DELETE ALL THE QSO IN THE REMOVED Sat } void SetupPageSats::createSatsPanel() { //qDebug() << "SetupPageSats::createSatsPanel"; satsView->setModel(satsModel); QString stringQuery = QString("SELECT * FROM satellites"); QSqlQuery query(stringQuery); QSqlRecord rec = query.record(); // Number of columns int columns = rec.count(); for (int i = 0; i < columns; i++ ){ satsView->setColumnHidden(i, true); } columns = rec.indexOf("id"); satsView->setColumnHidden(columns, false); columns = rec.indexOf("satarrlid"); satsView->setColumnHidden(columns, false); columns = rec.indexOf("satname"); satsView->setColumnHidden(columns, false); columns = rec.indexOf("uplink"); satsView->setColumnHidden(columns, false); columns = rec.indexOf("downlink"); satsView->setColumnHidden(columns, false); columns = rec.indexOf("satmode"); satsView->setColumnHidden(columns, false); satsView->setItemDelegate(new QSqlRelationalDelegate(this)); satsView->setSelectionMode( QAbstractItemView::SingleSelection); satsView->setSelectionBehavior(QAbstractItemView::SelectRows); satsView->resizeColumnsToContents(); satsView->horizontalHeader()->setStretchLastSection(true); } void SetupPageSats::createSatsModel() { //qDebug() << "SetupPageSats::createsatsModel"; QString stringQuery = QString("SELECT * FROM satellites"); QSqlQuery q(stringQuery); QSqlRecord rec = q.record(); int nameCol; //satsModel = new QSqlRelationalTableModel(this); satsModel->setTable("satellites"); nameCol = rec.indexOf("id"); satsModel->setSort(nameCol, Qt::AscendingOrder); satsModel->setHeaderData(nameCol, Qt::Horizontal, tr("ID")); nameCol = rec.indexOf("satarrlid"); satsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Short")); nameCol = rec.indexOf("satname"); satsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Name")); nameCol = rec.indexOf("uplink"); satsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Uplink")); nameCol = rec.indexOf("downlink"); satsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Downlink")); nameCol = rec.indexOf("satmode"); satsModel->setHeaderData(nameCol, Qt::Horizontal, tr("Modes")); satsModel->select(); } void SetupPageSats::slotSatselected(const QModelIndex & index) { //qDebug() << "SetupPageSats::slotSatselected" ; int row = index.row(); setSelectedSat((satsModel->index(row, 0)).data(0).toInt()); } void SetupPageSats::slotSatDoubleClicked(const QModelIndex & index) { //qDebug() << "SetupPageSats::slotSatDoubleClicked" ; int row = index.row(); setSelectedSat((satsModel->index(row, 0)).data(0).toInt()); slotEditButtonClicked(); } void SetupPageSats::slotAnalyzeNewSatData(const QStringList _qs) { Q_UNUSED(_qs); updateSelectedSats(); } void SetupPageSats::createActions() { //qDebug() << "SetupPageSats::createActions"; connect(importPushButton, SIGNAL(clicked()), this, SLOT(slotImportButtonClicked() ) ); connect(exportPushButton, SIGNAL(clicked()), this, SLOT(slotExportButtonClicked() ) ); connect(newSatPushButton, SIGNAL(clicked()), this, SLOT(slotNewButtonClicked() ) ); connect(removePushButton, SIGNAL(clicked()), this, SLOT(slotRemoveButtonClicked() ) ); connect(editPushButton, SIGNAL(clicked()), this, SLOT(slotEditButtonClicked() ) ); connect(newSat, SIGNAL(newSatData(QStringList)), this, SLOT(slotAnalyzeNewSatData(QStringList) ) ); connect(satsView, SIGNAL(clicked(QModelIndex)), this, SLOT(slotSatselected(QModelIndex) ) ); connect(satsView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(slotSatDoubleClicked(QModelIndex) ) ); //connect(SatView, SIGNAL(doubleClicked ( const QModelIndex& ) ), this, SLOT(slotDoubleClickSat( const QModelIndex& ) ) ); //loadAllPushButton->setToolTip(tr("Load all the Sats")); //loadSelectedPushButton->setToolTip(tr("Load only the selected Sat")); //clearPushButton->setToolTip(tr("Clear selection")); } /* bool SetupPageSats::addNewSat(const QStringList _qs) { //qDebug() << "SetupPageSats::addNewSat: " << _qs.at(2); QString aux = QString(); int nameCol = -1; QString _dateString = _qs.at(0); QString _stationCallsign = _qs.at(1); QString _typeContest = _qs.at(2); QString _comment = _qs.at(3); QString _typeContestN = _qs.at(4); QString queryString = QString("SELECT * FROM logs WHERE logdate='%1' AND stationcall='%2' AND logtype='%3' AND logtypen='%4'").arg(_dateString).arg(_stationCallsign).arg(_typeContest).arg(_typeContestN); //"logs" //"id, logdate, stationcall, comment, logtype" //qDebug() << "SetupPageSats::addNewLog query1: " << queryString; QSqlQuery query; bool sqlOK = query.exec(queryString); QSqlRecord rec = query.record(); // Number of columns while ( (query.next()) && (query.isValid()) ) { nameCol = rec.indexOf("id"); aux = (query.value(nameCol)).toString(); //qDebug() << "SetupPageSats::addNewLog: id = " << aux; return false; } queryString = QString("INSERT INTO logs (logdate, stationcall, comment, logtype, logtypen) values('%1','%2','%3','%4', '%5')").arg(_dateString).arg(_stationCallsign).arg(_comment).arg(_typeContest).arg(_typeContestN); //qDebug() << "SetupPageSats::addNewSat query1: " << queryString; sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << "SetupPageSats::addNewSat ADDED! id = " ; satsModel->select(); updateSelectedSats(); return true; } else { return false; } return false; } */ void SetupPageSats::updateSelectedSats() { //qDebug() << "SetupPageSats::updateSelectedSats"; satsAvailable = readSats(); satsModel->select(); if (satsAvailable.length()>0) { currentSats->clear(); currentSats->addItems(satsAvailable); } else { //qDebug() << "SetupPageSats::updateSelectedSats Not selected (less than 1)"; currentSats->clear(); } } QStringList SetupPageSats::readSats() { //qDebug() << "SetupPageSats::readSats"; QString aux, aux2; QStringList _sats; QSqlQuery query; int nameCol = -1; bool sqlOk = false; //QDate date = QDate::currentDate(); aux2.clear(); aux.clear(); _sats.clear(); aux = "SELECT id, satarrlid, satname, uplink, downlink, satmode FROM satellites"; sqlOk = query.exec(aux); if (sqlOk) { QSqlRecord rec = query.record(); while ( (query.next()) && (query.isValid()) ) { aux2.clear(); nameCol = rec.indexOf("id"); aux2 = (query.value(nameCol)).toString(); nameCol = rec.indexOf("satarrlid"); aux2 = aux2.append("-"); aux2.append((query.value(nameCol)).toString()); nameCol = rec.indexOf("satname"); aux2 = aux2.append("-"); aux2.append((query.value(nameCol)).toString()); nameCol = rec.indexOf("uplink"); aux2 = aux2.append("-"); aux2.append((query.value(nameCol)).toString()); nameCol = rec.indexOf("downlink"); aux2 = aux2.append("-"); aux2.append((query.value(nameCol)).toString()); nameCol = rec.indexOf("satmode"); aux2 = aux2.append("-"); aux2.append((query.value(nameCol)).toString()); _sats.append(aux2); } return _sats; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); return _sats; } //_sats.clear(); //qDebug() << "SetupPageSats::readSats: " << QString::number(_sats.size())<< QT_ENDL; //return _sats; } int SetupPageSats::getSelectedSat() { //qDebug() << "SetupPageSats::getSelectedSat: " << currentSats->currentText(); QString selectedSat = currentSats->currentText(); int i = 0; QStringList qs; qs.clear(); qs << selectedSat.split("-"); i = (qs.at(0)).toInt(); if (i>=1) { return i; } else { return 0; } //return 0; } void SetupPageSats::setSelectedSat(const int _i) { //qDebug() << "SetupPageSats::SetupPageSats::setSelectedSat: " << QString::number(_i); QString n = QString::number(_i) + "-"; int selected = currentSats->findText(n, Qt::MatchStartsWith); if (selected >= 0) { //qDebug() << "SetupPageSats::SetupPageSats::setSelectedSat selected>0: " << QString::number(selected); currentSats->setCurrentIndex(selected); } else { //qDebug() << "SetupPageSats::SetupPageSats::setSelectedSat not selected"; return; } } //void SetupPageSats::readSelectedSat(const int _i) //{ //} void SetupPageSats::showError(const QString &_errorC) { QString text = QString(tr("An error has occurred showing the following error code:") + "\n'%1'").arg(_errorC); QMessageBox::warning(this, tr("KLog - SetupPageSats"), text, QMessageBox::Ok); } void SetupPageSats::slotImportButtonClicked() { //qDebug() << "SetupPageSats::slotImportButtonClicked"; QString fileName = QFileDialog::getOpenFileName(this, tr("Open Satellites File"), util->getHomeDir(), "SATS (*.dat)"); if (fileName.isNull()) { return; } UpdateSatsData *updateSat = new UpdateSatsData(dataProxy, this); if (updateSat->satDataFileRead(fileName)) { //qDebug() << "SetupPageSats::slotImportButtonClicked IMPORTED OK"; } else { //qDebug() << "SetupPageSats::slotImportButtonClicked IMPORTED NOK"; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog warning")); QString aux = QString(); aux = tr("An unexpected error ocurred while importing the satellite data.\n\nIt may be caused because the file you are trying to import does not have the right format."); //msgBox.setText(aux + "MW-1#" + QString::number(errorCode)); msgBox.setText(aux); msgBox.setDetailedText(tr("Please check the format or contact the developer for analysis with the error code: ") + "SetupPageSats error #1"); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Ok: break; default: // should never be reached break; } } satsModel->select(); updateSelectedSats(); } void SetupPageSats::slotExportButtonClicked() { //qDebug() << "SetupPageSats::slotExportButtonClicked"; int nameCol = -1; QString queryString, aux; QSqlQuery query; int satsN = -1; bool sqlOk = false; aux.clear(); queryString = "SELECT COUNT (*) from satellites"; sqlOk = query.exec(queryString); if (sqlOk) { if (query.next()) { if (query.isValid()) { satsN = (query.value(0)).toInt(); //qDebug() << "SetupPageSats::slotExportButtonClicked: Sats: " << QString::number(satsN); } else { return; } } else { return; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } QDateTime *dateTime = new QDateTime(); //dateTime->currentDateTime(); queryString = "SELECT id, satarrlid, satname, uplink, downlink, satmode FROM satellites"; sqlOk = query.exec(queryString); if (sqlOk) { QString fileName = QFileDialog::getSaveFileName(this, tr("Save Satellites File"), util->getHomeDir(), "SATS (*.dat)"); QFile file(fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) /* Flawfinder: ignore */ return ; QTextStream out(&file); out << "SATS"; out << "" << QString::number(satsN); out << "" << (dateTime->currentDateTime().date()).toString("yyyyMMdd"); out << ""; QSqlRecord rec = query.record(); while ( (query.next()) && (query.isValid()) ) { nameCol = rec.indexOf("satarrlid"); aux = (query.value(nameCol)).toString(); QString satText = "" + aux + " "; nameCol = rec.indexOf("satname"); aux = (query.value(nameCol)).toString(); satText = satText + "" + aux + " "; nameCol = rec.indexOf("uplink"); aux = (query.value(nameCol)).toString(); satText = satText + "" + aux + " "; nameCol = rec.indexOf("downlink"); aux = (query.value(nameCol)).toString(); satText = satText + "" + aux + " "; nameCol = rec.indexOf("satmode"); aux = (query.value(nameCol)).toString(); satText = satText + "" + aux + " " + ""; out << satText; //satText.clear(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } //qDebug() << "SetupPageSats::slotExportButtonClicked END"; } klog-2.3.3/setuppages/setuppagesatsnew.h0000644000015700001710000000723014542412415020272 0ustar jenkinsjenkins#ifndef KLOG_SETUPPAGES_SETUPPAGESATSNEW_H #define KLOG_SETUPPAGES_SETUPPAGESATSNEW_H /*************************************************************************** setuppagesatsnew.h - description ------------------- begin : dec 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implements the Dialog to add a new satellite // #include #include #include #include "../dataproxy_sqlite.h" #include "../utilities.h" //TODO: Read the data when the user clicks the OK button //TODO: Fill the data from the list of sats when the user wants to edit a sat class SetupPageSatsNew : public QDialog { Q_OBJECT public: SetupPageSatsNew(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~SetupPageSatsNew(); void setEditing(const bool b); void setShortName(const QString st); void setName(const QString st); void setUpLink(const QString st); void setDownLink(const QString st); void setModes(const QString st); void clear(); private slots: void slotOKButtonClicked(); void slotCancelButtonClicked(); void slotShortNameTextChanged(); void slotNameTextChanged(); void slotUpLinkTextChanged(); void slotDownLinkTextChanged(); void slotModesTextChanged(); signals: void newSatData(const QStringList _qs); // void cancelled(const bool _c); // Cancel button is clicked private: //bool isThereAnyNotManagedSat(); void createUI(); void gatherAndSend(); bool isItAFreq(const QString &_st); //void fillWithType(const int _n); //void updateAllCats(); //void showOK(); //void showNOK(); //void clear(); DataProxy_SQLite *dataProxy; Utilities *util; QLineEdit *shortNameLineEdit, *nameLineEdit; QLineEdit *uplinkLineEdit, *downlinkLineEdit; QLineEdit *modesLineEdit; QLabel *shortNameLabel, *nameLabel; QLabel *uplinkLabel, *downlinkLabel; QLabel *modesLabel; QString shortName, name, uplink, downlink, modes; bool hasShortName, hasName, hasUplink, hasDownlink, hasModes; QPushButton *okButton, *cancelButton; QStringList satData; bool editing; }; #endif // SETUPPAGESATSNEW_H klog-2.3.3/klog.icns0000644000015700001710000244751614542412415014172 0ustar jenkinsjenkinsicns ONic127‰PNG  IHDR@@ªiqÞ”iCCPICC Profile(‘}»KÃPÆ¿¦jU*":ˆ8¬ÒJ©‹£m…R¨Pj«&iú€6 IŠ Ž‚‹CÁÁÇâkpqÖµƒ« (Š Nþ¾)ñÜ&ÒªèËùñÝsÎ=÷¸MAU -~ ¨Z"âçRó¼ë m@z0*HºŒÇc øÊßãý–¯}lÖïû£+-ëàà‰'%U3ˆ—ˆ‡– •ñ:qŸFKï0ÎZ|ÊX´¸Z¯I&ÂÄ7ļ”ÒįÄ^)§ŽÍ÷¤‹iÒ¹)‹Æ9ÆbSo¶‰‹…²dïÉ~è–•ÙVOgD18xˆ(# ø(+¤èHÐ}ÈW Ö.©«Z>›3ø 9$óQEóò€|g~ÿô±¡•€‰7ÀYihâ6p¾ôß74Ï>ÐM^]¨‚&Ô%'.“žOÈæÐ{t.è™ñ€õ#wh}4Í—aÀµÔ*¦ùqhšµ#j~ªŠå= Çw@r ˆ]»{ÀH–Þ\üãöºG¶ÿÖØ>~ywÙPvä4VIDATxíZtÔUÖ¿3É̤÷@z' )J/É „b¤$n(0¢¸"Ÿ âîPDIJ"¢¢"JYEEiÒ‚Ä„ZH ÒHï½L2IæûÝ2a2™º¸ûóqÏyóõ¾÷î»õ½!z)ð)ðÿ˜¢ÿÆÞ%‰466ÖÞ@_¿}CƒIsS“n  Y.¯)¤¥¥•`]ÿ‰µýG°lÙ233³Im EXkKKöêÙÜܬ[WWGMMMB’Ëå„zR´¶*›šêQ¥¡¡!:¬hk;ógäO#@pp°dü¸qÑb±xA{[[XyE…¸¢¼œÊ‘JKK©° €ÚÚÚz2ú“®®®PßÖÞNHJ¢c®Zõj-×isÌõWÔ/Â|þZÚ™ƒva®ÙhCöþxÿ`` ó¼–Ñ…XÁ“XÌ@¤Ю¹ùɨK’X[×»º¹å×ÔÔ$Ö××3G¬Õ‚KUU \›‘€ûq¤,Uƒê‹µÌÄš¨Ê÷ûŸ?`Éi­6Z‰…mÅ"—¡NÛIZ¡~ƒw\\¬_ì2ìߟ Êʨ>9™½³n”«ËéAƒm–J¥ÓÐo+¸!I ·fV›}‹_ŠõC¬†±õD]…怾ʈ]“¯TCÚˆÍ?Í«V§žmžMÎïqÜSq{œœCõ ÎfegOÅæYÛ«ƒ ?†®Z¹pÈ’%2c{¡MÙуî¤wñÙ³”òö;¤okK†6ý‘Ð52"=;[¡¯¨¦†t=½Hô(÷ÜÓ§CÍôô"7ÕÓÓ›Z}²®<eßœØØIïþóŸîÎ{öìùQK¿^U¿‹^ZþÒo/ï µµµûáE ¤ÈýÃn„WB-’™{¸w7p&ïÄ j*.!×G§¢PqíÝør+IÍLÉ+6–LÝïôW4À§hHŒÉ,/rΜ¡sÛ¶·ûû}7|øpŽÌV€ò·èfee…îÛºí˸uo¾µ]­Mkö¾9`ÒäÏ9³cw#È©:þüä .4ªa&’JŒ\÷fLÐÂgtÛ­Ô†0WŠSUÌÜœªoÞ Ô·Þ!‰µõ $Ç ãI„Èï*êškkÉØÉ™$¤#•’ŽL& ­ÉÍ%±¹ÄÆê˜+Ú¥ý–àˆ¸Ò¿é_þ.BrWvÍÓú“>>>qFFF—/_ÞY^^ÑKdTkâïý@bkkðòßÿ¾ÑÂÂÒ+##ã™5kÖœëBÂ;|×5:ê³ð÷Þ³± Ø9yã‡déíMúÔÞÚJbby·<˜¬‡ ¥¼#¿PÎ÷ß“¡“#Ù BŽ#¨òŸ²úuÒ±0'#K:E]’Z[“ÄЀ,:Ú©Á××øò›CD%¥þ8Œ@}}}7¡DÂä“'OÖKjMLL¢ÍÍÍÝOžŒgsÚ'î*Œ wúŸÅ/êׯ¿&ååÝΟ6mº 2ë—Øôÿ|äÊ•.Ž£G“¸+†/¹x‘®íü†Ü§L¦üÓ ¤giAƒæÏ¸AeþXT¤\¥_|AØì€Ù³ÈÄÙ™‹ŠèÖž=T ñð~f!õ $ˆ§‚Ú›7I¯_?’š˜eB}µm;yÉdŽŽOîÚµû¸ª¾:;wî̵··s¨«­k/+/KZ»ö¨Üܼrµ>BövÍ”_zñ¥ ––VÄb]QVV6™*E¿¥¦¦Íõ˜5kKøÛo™[ûúvÛuÖî‰o®#Ç1£)ïÔ¯4rÅ bâ´âæçâ¦Mä8r$T¶HP††¶6ä0îÂe ¥¬yƒ Y—CX{xЭ¯¿¦’sgÉÈÑ‘ôÀI zVV'1!k/\$Çyó¨ÞØÈäðƣќ†t“ûÍœ3bäð/(í"]‰¸E.wöòö2<~ü›ËpWLytòâÔ«©nõõuÔÚª VE ýúë¯:æÑQ‹C='’BI©CARY @î“&QúwßÛ~†Ôý‹œÇ†‘´¾:0טº¹‘CÄDª¹u‹R×½Ml²_À`rý1¸ kÑ\W/ˆÊŠ0±§'ÉÌÌÈÒË‹L==%·™Šê]HÕcÃÆŽÓÑÑ™ÖØØ]ª¤ü‚|261n8tðЫbõ‚f>''û;C}åæÏ7Ó¥ËHÞÒ\}æÌY_¯éÓ»eT} Ÿ¶sx¸ ÄªaË•¸ªÊÈ yu õƒ·×ÈÌÍÈ–`ØG©üòeJ|qU¦¥‘=ðÞò9õíÔ-êãYy2”C\O¢÷ßßÅ8®KHH8ÕAM ¿¦-[6“º£  ¿×ésß»r@RÒ™K~~~<`€ûñ‹/ι–vm€ó¤‰ƒ !‹šÀ'Ä ÁØÉ‰  ¼.|ô,X@z8-†hûÊ7"IÔ!ncOÑvÄ2‚rl,*&3p[Ä šÀb•1™Gdýk¯‘,ŦM›²Ñï§ÒÒ²{{Û$[¿¼¼|;Sã¯ÿùîú  ½{BŸ€ ‘Œ;ömDkÏâv¶öúõô˜£¿MÅð”Šìœ¹ýôô`ÚúsÈq仡¸˜jaÊL¡äXùýºr%YùøP6,±£É4Ĉ‰ÈæÍk°tÉ¥K¤Ø±ƒ6.zžf̘A°tåÊúꫯ¾Ã˜wéÒå\l÷’µµõ\;;{ß™3gVZÍ`fFƵŠÊ*Ÿý?ïß´~ýúe DË–-[¼ëêm3³2žKK»¦súT‚4Ê콇._nçyU9/*ä=¾8¹flà*L—¼Á”­ÛÈsÚTº¹÷r‹˜ ˆ†Ë¸q¤«X—Â}¶‚YJxT!‹.ËÀsìß¿Ÿ¦NÊV þ“O?)··³“VVU½kgkW2qâÄtˆ±éܹs¿;6ÚÀÀ(Ñ×ßw”jmZ PZRRWY^uÓÇß'”;nذaÜ”)S¤ßH—%I$8”|î‚ Ç dŒlÂ×.|F¯>]>¿ªƒú—O›u€™‹ •]½J&0sÖþþ0“ŸÀyò"—GQï.)Ѷѓ0‘‹/&CCÃíQòõõm²•Ë NMJ™Ð ß›šPpd$…†„¶îÚµkÊòåËÙGåß¾}IÙAN®ÎÝæK«èèPÖ´·µ³V%à  í¦¦¦2öÏùá/<ꋎÂ+%ññ~‡gÎÊ?·þ}j€CÓÀÌ9Ž%˜0#{{º !÷ÄIªº•!ø ªq˜#ñCãûïSˆ 6†)îæ\¡[^’6ÏŸO…‘‘ÉQQTÖØH’½{i-¸«èÜ9ÂåŠÔÍÍm»»»;SMihd,Q´¶Õ¨æào§-Q¯AÏVµ˜ÌJ0dÀ€K¡HìY>; Ä4¢¢f¿ÈÈH‡hÈ÷OŸm¦ôAþä>qbx@ÜõÓŽÅçŸ>-˜Mö<-Xn®Ãcʕ͛i>â…K–ÂoaÎëׯÓH8S 8\GæÎ¥HˆÁrXšó ¸ËÏ?“›ÚCwï!å’¥,*ö³fÍz±Ë;u5u¦ã{@Þ$¯i–7ûº¸¸$·óÓNžSA„Ö–'ÁTÁ³€è#Äî"{œê³ Ò °ùׯ¬ ã™1d_å*«Ö¨oiIþðäJa÷Ùa²öó%&JöÑ£d“|Cz¨Ì-¸O˜_ ø ¬= Õ£0«q£4âÈê€k1ÚŒ§·UÀÇgeeõ,”à‚¢¢"Q‹¢å¶z_­ÐPßÐÔ¡ìñÃ%bpá ßñøäù‰«¥'+¶á‚E‹óæªq»ÓI/ÐÌ´ëà!òž?Oð…]?lœÆŽJÕYY”òñ&Ze:ãXÔpÂøÃ»wSLN¹ º‰ÍŸ’BÑçÏÓudÈsÄóR’wD~‰øy-ºòF.÷¸(éE€ÀÀ@Û¬ì¬0;G;ª¬¬N€7Î Æ@~ÉUƒvÈØÚqÐà*€©aù#ThëÚ[÷E/+€^¢Ûy¹„»x*-+íf%&#log«wøï.L„ë™bxbchx`38ð£ Ìžš5ŒvÿlFΰ¿¥Ý¼N)éc#²„˜™ŠÄ´áÈAn-!å쮫sˆ€"µŠœ0M ÌÙ3°r\½Ár›zgví¹Fè(æ,˜¥e%¤«£KE8fèmP¾ûöz‘´x .2Æ@±&e°,µ·÷ 6ËnÑáÇí&OžLÅem´ï% :› %y´g÷6 ··M@{•’•‰¹ÛÒY6Pa2=Jzi9uŒIR]úéäÚ¿c5-ˆ´£ ãñô|ó§4~ûû+V¬¨À’_U-\ãÛ½!®ojn„Å’wë.‹¿Hƒq)“øß‘Þm" Ü òæ˜}˜‚LNŒL’(DMfÆ úÛ¦¸;ÓþSV9mÕÖÉ)9i'=;[JÆxSMKE>6‚‚)¾µ…nâaD‚€Ç<'¦›Nïl¿Hu.«éE@Rlža7!¸²+‘å7mÐcÂaa­¬¼U"çN}óZ˜z ìÂ,ðˆjÞ°Š±*PµãË,1qþüù«q9Ñ”˜˜HnN:´t9éëéÒ™4O 7‡®B?äe¦¨IäæîG™Å¾4~RÕ€-¿¸x ™°ÍMd ½€¶=[x™—QÁN^_ЃX_ɑؚñÚµZw´¦WwfèD*×Fž\ôú‘#G¼GõÍ /¼ Ìʼ6ס%O™‘¢]Fò1N?üð]8Oc†èP5x­¨fM6“’KŠé{¼±˜A©ó3±?•Ö°½XOèÔùÓƒ¼i>y^3¯] ØŠ  ÇUüU€±ÀÁ¨Ož¶9üñHç?øàª¯«$/)͈0"ss+:*–jåNôó¾­¤'Ê _O Är<…ãBUx;€÷Ç€(¾ì„Ò§ÓBEß?êk€»Þyhšµ€­ªÚ°-Ý!£:XpD¨R2Ï _ºté\¸À…ûöí#©¤UàntÂ%Hðˆ'©ªº‰Nn§QA5ôÈ8=XKÜïu:G|zk×®e—s9¹ôXC{Ggà¦"€†Ø²'´K…OjѸLÕA“Ìžªrvõét±Tî|™U¾ÂSš÷ôéÓßD¨Ü|,>ÐC—BéÁ$Á/o÷'Oÿ:Ÿ|•NÅFv>á“ÓÛ¨d®ºt¯Aw¸ÌÁ_nñŽÁ\‹¤á¼±%a‹"€6pÃV¤…Huê`ÄLMC#Ž'º¡/ª ȬÄfŽ1b7¸BÉñBè`=šfzÊè±ÈIÄfTìUâ+åõªº{|»×`€7DvÖZ¡Tà=XO­Bê³{ ÷ЀÏQv‚›ú¦:"ÜàŽ ›à<¤—RÐÀ£*ÞFfæ‡~8ÚËË+™õCuUýe¤>±©qG>­7r\±E!ráú{@÷Øçç ³"T­ŽÚÇϾðZMaË”iCCPICC Profile(‘}»KÃPÆ¿¦jU*":ˆ8¬ÒJ©‹£m…R¨Pj«&iú€6 IŠ Ž‚‹CÁÁÇâkpqÖµƒ« (Š Nþ¾)ñÜ&ÒªèËùñÝsÎ=÷¸MAU -~ ¨Z"âçRó¼ë m@z0*HºŒÇc øÊßãý–¯}lÖïû£+-ëàà‰'%U3ˆ—ˆ‡– •ñ:qŸFKï0ÎZ|ÊX´¸Z¯I&ÂÄ7ļ”ÒįÄ^)§ŽÍ÷¤‹iÒ¹)‹Æ9ÆbSo¶‰‹…²dïÉ~è–•ÙVOgD18xˆ(# ø(+¤èHÐ}ÈW Ö.©«Z>›3ø 9$óQEóò€|g~ÿô±¡•€‰7ÀYihâ6p¾ôß74Ï>ÐM^]¨‚&Ô%'.“žOÈæÐ{t.è™ñ€õ#wh}4Í—aÀµÔ*¦ùqhšµ#j~ªŠå= Çw@r ˆ]»{ÀH–Þ\üãöºG¶ÿÖØ>~ywÙPvä4?úIDATxí]xÅ>é½W’z ½@EP@ìX°bC,€‚ïÙ°÷†Š(ˆ€…&]zï=¡Z •ôöþn6lnîMnlï»çËɶÙÙÙ™3§Ï^+X{ÀÚÖ°ö€µ¬=`íkX{ÀÚÖ°ö€µ¬=`íkX{ÀÚÖ°öÀÿyØüŸ¿_…×sppêß¿xppp¨­m`QQ‘_~Ag~~¾[Qa¡]aaaiqqqAIIIÎgaÿ\ffæùÇŸÈÈÈ8‰Ê *TøpðÿJ6}ûökß¾}G[›v…­ŠŠ‹›âe½1è6¹¹¹‚Aì ]¡©}ž1”ópê9XPX¸»°¨hCjjêú¬¬¬} ’3üßf·ûÓO?Ý×ÕÕµ¬½]hº   Ò@sðóòòðºžÊ]0û9øR‚­FúmqII1ê8ºýZZZº„ûo#†;Ø?þøã×ûøøÜ‰ï‡Árë°s5ð˜¡.`ß’NLK“sçÎIÎY 666â{{±µµ•RÜH hÄ‚Á/Åù4àà×(²ÞÒúÿîrÿJhÓ¦M@¯ž=Ga`FÚÙÙ…q¦s§§§ËÅ‹åÌ™3rèàA5Ëÿ†.l¾œçþ m°ø‘ÿ*èСCH«–-Ç999݇YîFö Y,gÏž•û÷ gü?ȯ¿G»ŠþAm+oÊ¿‚0àžýn¸aœ‹‹ËcPÄܲ³³åüùój–çä䔿Ì?t‡„°šâÓhߊZÿñжmÛá^žžo@¾‡^¾|YÍö³`ñÿB h˜QFþ)íÿÇ€§§gHpPÐ'N7b–Û\ºtéŸÆâk5† ‚³ÀQÀ_kUÁU¾éIööö7z¸¹}<ˆ&eýÿƒ¼"xï•ÿw¾Û?ìР—mEžA§Øÿó<»D°D0 Ï:÷<Ïä#þIàŽÆ|‹Á¿-ý'µËdÇ]­“ €$BÔwðjÕY“zþ)퟇Æt­IãkP– úYh2p¶¥é¸ÉÃ3é½£­ŽC±Ç?glqÞ[_`Ð Çh¢Ø±{uÏ<‹ÆõC­;®nÍÕ×vÕ_¦úGV*ÁÁ_Œ†´©t¥'Й´·Ï`» Û]ØîÇöð$0XpÇMõ‘hg#`<öÛc°ï€-6u´3Dp-jÙY·šþ]w{bð7bZ•ÖKPG*F`&^ýn`ô_ØäƒñìÏІd¼CqÞ£”u ¾Ø¿°ýë£Ðq kÛaè¬\ÜÿÞà& Ëßú&†‡SiM@›>GÛÒjû^¸ŸF¿¿ê}ð¼¿ðàwÐQâé5jC«ü÷}<]×ÖOžü2n$p:Â[/¾8a-¶u¼ÔÀGѨ¨FïQ0ïIe¸¸.°ä^ŒÁ_è¡xðÃx²ÅƒICǼl€û&k2ø®(ÏA^<¼<‚Hß/ð3,Äþ$à. `1ˆ"ÛºÌ÷ÐÖ¦À‘Ø?Y“ÊÐ7ýÐ1ckrOmËþ†—û —´ щŸ£#§àjð5&[ýxƒ½·w¤gÓ¦¾ØF'$ô€ˆbŸß~û-‡³þøñãw¡ -*xWòÑæ/Ðö&À Ø¿la¥BËK(ÛÔÂòµ.f_ë;ky#^ì] ¿%·£Ãö£ãDÙµ–”7*ãã×€÷‹mû /Jx÷îâ ¶ˆí— ÛÇw×.IÛ³G6oÙr¿ÎŸ¿`ÃÝwßåîááq”u8aÓh‡Yÿ òx¾w™ œ‰wÿ³®'êÀ®yÀEW໸§Jaóç@•øy¦=Ùpu³Ÿ®ÒðÖÏ¢,ÙrMòó`hÈ5×HÛ‡Ÿ¸ØJu"„l7óAooÙ;ý;IšICBuö¬Q£ü.44ô}‡”KĶ8E¶u[túc r3Цª Jßå·ª ÕåÚ_)O#“ÑØ*ƒžŠÁ‚-Äš~=Üó#pž½}hçÿþWz½þšÉÁWKJÚ†âèüüsÒwÆwØ¥‹——×0__ßù@98p°!ê#ø‡ë %x··1°=°Mª¦2öÙsÕ”©Óå¿RôåWéìÁÀïC§ ƪá[‘“¾ô8PâG=(žaaæ«A”þ02‰Rwî––· tuP«VríûïIÉš5â€D“3¾KIIÙŠJ¦@Ðc¨úkÊ”ÉvH‹Äq8BmK[ñ¾Ððd²y¾ƒ)h‡“Ä-¦.Öõ\•³±®•ëïÇÛöПÓí30²ƒOwèiÝyKvcPˆ³þq{—*Íï¾[œ1««ßæÍ%äú¾bïz…S?°µ[d]lØHή[Ç‹}‘Iìwúô©%÷Þ; ÇK€c{õꙿråÊõد ñíÁè›xl+NØ¢_RpmðªÃ_)è¢5üïð’´ÃÓL0sŽ.Ø'»½bÐΞ-½z)%ÏÌ=OC @TT<‡£‚ܱ…’Øø–Á2pቻãÙ¸q£\º”úfþb$™îA±pà}Àÿ€;`[[(À»?ˆ>˜‚ LÚý ‚Fµ­¼ºû*¿}uwÔòzhX¨‹£££œ8zL_òkåCtÀXœ4ùòúºýVØÿØÖ5&Fº<÷œÔkßN±q]™Zï&mÛ.%@—¨hñiÚD:=;NbûÝ ¡›61ñÔöwÞíBÈ>|øGMš4fz9Kk L›ˆ¾HÇŒ|•TàÌ~þ¾i/ÖVÒTݤJ,§êâµ»êíí}S¿~ýf"{×ù—yóD%Q3»ZäM¼85}l,º|_> thí¾Éðaâd»gí©Èfš·Oø’°5yÈ>º|ì˜ø¶l)¶H × tó&¹xâ”|ûõ4É;~BêÕ«WÚ£GÜöGÜrË-ä¯;…~°ÛZõˆà]ܤˆàÍ·Þ’æ-›§^ӻϵ8·­F•YP¸¥YP¾6E¢s梳¼˜W)ààO­áà÷ÀÃçú¶mc—0uªš•ö.–…Š‘Y´}ò+rìëo$'û²x„‡‹ƒ;ƒ|•:kHˆØØUì÷cÇÅ6(PÂ|P\pýð¢E6{÷ìqð¿¯Y³f÷‚°Ï€À^A$†§¡¼ýÀRâÖ²; „>· j;qÒ$‰ŠŠv ê¶há"ê 5µŒ´zMn+¾¡É"u:érËÁs[µŠoÄÅ0¯J‘îõæ͛g¡W&¢fK:‡ÚÜÛÀ÷€mž/Ÿ|R<ë×7;‹‹óò+éœÕçÁ ¸0æßÉ_77ñ@=vMÕA ü§?ÿRÎnÛ!î½{KPëÖsÓM‚’Žaa®`(®¯½öºÝòå+VÀø„ð ð­+VæWW·‰ë›p®pô˜1 »téâɾ ñÏÎÉŽÙ¾m;`–ô›‰j+Ÿ2Ï+—­ñ™.]»¼vûm·?…U4¶\Š…•4ËÇ**°°2FúèÐ «×³§´}ìQñ‹«òVäÊö×^·úaÕ¯Ÿ8ùÐ|7@ œ…ÝðÃ¥0å¢:éRO%AíÛW`÷Ú=úmÊæ-RRX A]º\9 é¶|™Ù¸Yfþðƒ:Læ3ݺu-ðóó.--¡×ó`p-ŽgL˜0 Ð"ðÙ¼yóÚ–-[6Iꦃ=üÈCíݳï#‹î¶ ÐŸÆ@ý=Ÿyæéw)ó¡žÅ2®~h“%š~0Ê} œ 6ìÙé•)ÒfÌqû­.îÞ-I}"é;vʩſ‹ƒ¿Ÿ¸ƒ]Ó¼#K÷Œˆ°¾×‰-#}Ç)Æ2±ó+WÉ¥C‡Ä ~”7§¸…†Š;DGÀÔ÷>qRì:u·ÝåÂÁCrbß>X ^4µŽŒòP:Tj,ú¥ba]…:ÌäaeòúÞ½{ßµŽàž¶þþ~,Xøn1P°ù{-ºòg€ç‹^˜Û±C§²Á/^·n݈­[·’µUäH÷¶¸ù&éùö[ÂÙ‰ÌÇ`Ù;Ñ=oœ¼¼Ä •ŠÁ-Á’”5kåü¶mJ¦»)%ÐuøA»¯×ç)„³õ2-k ’.”Øÿæõã'a­B6î»°ÿ€@!ëß_\ñü3ë×Û ¼i@C¤´{|þùçó0hã¡dãþA €/Œë1w|âĉsXΞ۪U«ëÀIm¼½¼]lmmšlÛ¶}î±”“˜«¾¢¹a¶T /ôÐoò}÷>0 ‚·‘£G~ÿòË/ÿ§šjbpÎø'ì}}]ºÁ¡Ó‚2NÖ¾ö¥—1SŠ_£Ff Z»w\¬„b–—89JÆî=Rxñ’œ]²T2““Å2ßÉÇà$rôð`—o‡r9å‚䃲`)œüù±‚h‰~@bâÁÃR$>Íš ‰+ iS‰»±¿D@ï ÿ`ÿþmð^DGG…À":˜ ßA<bp0 çN˜ëŸåË—oIHHèE:Šk Â÷ìÙs ^Ê[ÆÏø38@ûW¦LùòÏ)//—«qÏß{cð`R¿) ý8n£wÞ)=^ý¯ÂK§×ÂÏmݪd»£€D_n¤¡WLM> >^ºu•\pŽ\˜m90íNýú«B$Ñ PÔ%À_B{&ˆ{Ã’QPœ‘)©÷Éü!ÎAÁâ=m xÞ¯u¼xƒ£èÁÅÙY|%Ž©,X ™‰‰Î;v쨇s¿óÎ;C±ð…~ ö +ž"X"8¥¯C·_Šk›ûôéstG|®ÀÖË˳ݪU«æ Œ%"UWUÅÝ«ETtnŒ‰‰î3æ¡Ñã:uÁϾœSºpÑÂ'¡¹®®øØò£–Ø#»áå˜ðæÒøÖ¡âhdžÁg¿ú…%‹@{¼/ðŠ.pç Í“Ó˜r®]Å«EsI‡WÆ®Ýrjá"±÷õÈ}¥` 9ãî»Vì2NÛº­L?X)AîaõÅÅϼ~`üìœóÄ÷øqÉ€"úŽÛ%VÃŤ$±ËÎöÄ`wJJJº‡ÒSØ×qÜ÷»c¹q=Ú1–Å]€t íÁ\¸¹¹¹B¼FC1Ì@g u‚[¦{M{jõ[›nÝ»<<âž/Æ·jíëéé U40,uÇŽÛŸzê©¨ÆØ Lãýyà3@‡æ=$M1ç¿Oš?_Ö{VX.þÁ‘’V} ¬úÄŠræ\ä ÒòÞ{Å;* Õ™‡¢Ü<5«}ø‘ÒXÒVE£‘€[´ª0Ës°ø4é§9rfÎÜò CÝ,±·Ü"®ÁÔQ«†¬£ÇäÀ¸ç$p؉LÓúBñª?¤qN¶¼OVÖeØB(˃ðG´xª÷Þ{ow½àHGGÁbY,™,.Á’ø¢ 7øêË/Çååå/­ªãku⽯éùÌ³ãÆ¿Ö¤IS³çÎÙ^HI¿ü’ø€êÁâ„Z»víwx¨^Yi‹ã߃|ZÇÛõ¤CçÆ~vlÜ:ç Î¥£FK)ìpo°èíŸ|";§¾%' ág:-GŒ0$z€+sbµ°Î{§¯ÒÖÁ^¼c úA)X49A!——/]*§OC?/×è$ ‚{Ù¯cɾtQòN'üê4?úôVÞDM|Ðßà½Ã Ä• ”²m'`ƒ 6z>|ètffÖJêÛl´_=¢{·n݇AÑÄrx›Â‚"[www{œ¬×°aÃÁðJNOÏØotŸÙú@ÔØ±cgDFD¹‡|uvrr–‚BY[ÛÏÇWÂÃêGJ<”˜œœÌ€ _ö!à,`pø×;>õ”xÒ¬2þQNö|ó­œ[g°š.A¡ËCçE"]^~YÚŽ}\ꃽ³~>¾2oè­â ^‘‘f4ëÒ€²?¡ßÀÝ%³’ºAăA?(¹¢à éÑCÜ5”tˆ‚"M?XµJœ ø¹Õƒ~`F±Ãs´Áמ]tD<àŒ²¹¦Ä ¼Yr2³$#1уω1ÈÌœÅJШQ£ëFõ²§‡§mbb’¸¸ºãË%’u9[vlß!­ããœ]»®]»î[ÜœS©'Lk6& Ÿ ­×76:ÖfŠxÚ@ÝȼR/ìææ.[!CÝ\ÝlÚ´iMþÇç¼üÀ­AœÓõßÏfPö̹bµg¥>,{à´ñiÓFúÍþQüò³ºD/ _cXFnà$˜cy'OJd/ÝÎÕ'ˆ¤Íøg¥õÔ7ÄÜ…pâÛïdÍÝ#ääïKRç¨#ÔëÔIº~ò±4x챇)8{Nv¿8Q6½ð‚Š1 À¡ÊV÷ï 8ÎO³çIáå,¼Ccé …·ÛÔ7µÛcg5ÐdôÎ¥;üìvs¹¸@ïAA˜3¸™Ÿ/EÒ&¾M°³³mA­9@ÏÞ ƒ[¶jÕm7fefÑå¬Ë†oóäH¼e! ƒ䨉cÙ7lŠAkÆ2=«÷ëoˆwLtµ£×nÃë¯K&§îÈì jÕR½ì¾¯¾Ø5óõ•d…¯€¨p€(èÿ¹¬K€Ê#gqÚæ ÂJEçã}RÀuÎÁp@™Ïrdá>0AC (á8 )eùgÎJò‚…’]æ?0V`Ûà)×õ)w(‘{ø@,´i-G£GÜ}€Ó€ÄA„îãëׯºqã&€³8 ÙhoVV¦\q‡Ù¤¦]:±B]¬æ_õÓÄL{vï=SP_šrá¼lß¾]¶mÛ ¥o»ìÞ³KÐ))-–Âb¸^Ïœ½Œ*ž À ê>ùeÅžÍTYát6X}^Zº0»'f66!æ•^ë§³iïŒB_C·.¾¾ª\MþÙ9;Iøµ}¤û×_I䈻խ9xÎö§ÇÉÖÿüG2 &4p‘5‡û¸Ã'‰7tÂÙy?˦'Ÿ’¢2®¡•­´á8BG2†ÐŽ¥Ñ=÷h§bç í@Û^¾œ•žW/çΟ•“àtÇ!¶Ò0Ñ’“OKZê%|)¯*’äÓÉéÚ=ÕmkÍÒÓÒ3:th?ÂÏ?Àq R¨Ž=‡Ç~õõ¬ؽáðÅcJ>üàÈ4è†Yì –k)8A‰ŒÆL jÑB±O »ÛóÙç’‹A5¿ÿ¾r"HAfï¦ ™Ï‡T°Q•A–>“å(Vüê™ yH É9rTrÑѧamÀk¨üeÜ…fa¹~qÕQB/ ¸›q{h$-X ;ß~[n¼ñFõq+$Þ–Ëz`ÇŽú@_°9ó÷2¢š;áñvú¼Á·H|-Tž<㻸äDÔñåË¡#”Byì"õ±@¤6í(€™ybɉ¼þúj-ãvhÇlÿiÓº)S$?ùŒLœ8Q‚ƒ þ}­ˆL›6Mà>çq7àÚò Wv\||¼!L<s¢)ï79„/§u‡ßå•bÕïÕZÀí"""ž†‹ò[(|ïç5±]ÓðsÝ£©¸ä&'w+BúgHÛ¶fífÝ=fw9+é¾eÔï¢|GçÎvªƒ¯tŒˆ Ú?•Â]_|!›&NRQ?z ÷|ú™œ…Ü íܹBY³Ô]°ÃìôC Ç’Ýmå»t[o}÷]Ù†|…ö˜õ3±qºuËËpç+X:Èà.×˜Š¡@×ÌÛÓÆßß?A7uà߸qãÛ@›7mÚt’7[µ"5ÐÀYˆwÁ7ûìø…N„=ù•Ε ÀG‘ÁBÍ_kpÐåâŽQ™çÎÃIQ+M]_!÷½ §ca%Ø@qÛ =àÐÏ?ä VëLAnÀºgÆIø€þÒ®×ÈkzK4¼Ž»Àv `¶†ü@“öزe²ôÁQr ›7ß|S¦ÂÚ AƒrEVk=©·ß~;•é½8÷†vÞÔ_I= â¹bÃÞ@rÏèèè»zö왇‚ Káá¬jL¨´#Øýp€vü`#öñ+9räÈ+ˆùßÁÏ4ñPº‚ç§<ØðÐX"“Î+"³aÚYy¹õ!?³`’îûø9‰l,²ýó›6KøÜaëÎAxøÐ7ßHÓ{î1ë6®}‹*Þ™ Ýgfüž÷?ëákà¬õdyºgãö>–´½LIš`§V¯‘³[¶J!, ÚøÕ…š-i½ˆI¿Í—e#” ¸?A 9±iöö .ÈСC9©(6ïZâÎ̓Èý¡, xO(ãTÎŒÅ4ÂþP$“¬Þ¶mÛ9sµØ ønúôÇ:uèðvaQ±$&%ª3cƯ={öpˆ‚Óæ0ôÖÁ!·G€3Ïž5çg”£—‹ŠÍÁ””^kž|Ò' Kg•òE-ž2¾¶@¶‰„ÍpøîY5x.ø¤Â$Âñå+$«‚[<ò°Šüþð#’¹o_ù#£±¤Ó³ÏVr3—°`‡.ì-ï½/çV®¤lÄñ•†O6]PöÓÁ ¶<åÿœ›6Ücogï1ûa÷î= \ÐAéêÕ«§‚#lÀÌŸ_UZµhݾ]ûua7=÷âsËtåËw-²8ûñ1æäÈððzEE¥2{ÎìÒŸæüôæ¢E‹¨¤TõÞzë­ÁøUŽÇ!Ã<¶ïÜz‹7’Ï$;PO˜ûÓÏ,«':ÎÀ[y>îÎ;¤̹*×ô¡ ¥ÀÙýÇ‹/Êy§Z• 8u·¸X¹á³Ïd'tÄïfH§ÿ¼"Ѥ<´qÍK/‰–„ù5i,‘HDÕ¼–<³"ñ0<‚[_}Uðùzùú믥#<|óÁé®C ‚9f«Ù"lŽ$ôu! 9° :ö²åËhunذ¡žÖ'ÇŒz˜e#Sh*¬° ³à?f̘o x} (¬îž^²nÍú×ô½¦ ë4ý`_+?F¥¥û÷íwb˜f¿å}‚Á¦¼@Ùd[£aÆ-ÃçÜCiŸž<}B ¨(E‡ßÖ?/ çèæk|7qúwÝ“¾ÿAÚŽ/1X‰Co`]€úAÉ“å|õ»0»ò‘«Å=w+K„ƒÏ[>ywø1šâúÊÑSÚ}út¤ÜÐU¶³-¸qŽTX&×ÃLÄÀúAÝöè£Vy;Ó¼¨rÖ:ÁÙõ#œkah?dªÃÏŽ—݈CD&t³‡è}‰¦BŸ ¬®Ûn×{ÆŒå¾ÔqñÃ?¼ñÖ¡CgB” a…(kP€x`ÆbtùÊ!Ø|Ó—9êÈP½r¡lòÆ ?Óòk»víBi\œ]¤¾iR‹ËJVÚ܈3£€ À!0é^ß2eJÄþ™?Häÿ‡"† _ƒ25³ŒÁËVŒ •æ)¼Œ¤‚?f‰>œ«yÁD’Huðð~(m»aÞQöRÎc!ŒÀ$+¿•ï_ H¾‡Rz+ôƒ¯”ÒÄ x¬ sæH/(·»û!×cÀ:ÃÃÃC:wîüëï¿ÿÞ˜^ù.EpÁ íAú˜@gK5÷|‹.¨4ƒrµ¤¸Dìì+®¨¦Ë«]»vÓŸJ"ת°,ÞƒA 3ÀÞé $ùÿl |);éHö ÌÄ•ÇÌþ©+ØØÙ–>ëb†ppÏ9„¥jŒ$²™§N)‘ѾU g+R î»O ~ èa’rrÐ3g @LʼモÍxÇ|¸g^{mùà— þ%h×Çðc4ÇàOE… (ï~(Q¹Ýù|¶¯iÓ¦q ¸ÿ?ÏÑÑÉÍæq1&Æ"Ëøºvl1€ã!ƒOêÃÏ(ùip –Ôkäî‡&ªÅÆ‘­ÑAa[¢ˆ ©âtרøLú: MžØlôhiÌj=à/t=vÄðrÐ8Ï‘h ‹¨Û˜c™B…å*E_BQ#KÝ‹ ÉÜþ$Q9Æê™Ð´—Ã)SˆhZï·¦Jÿ9?IÛ29íEYǦ€Gº•6\`ðéÅ{ÿý÷•¬‡T&ܸxéÓÿé§ŸzR…j0(rÌÓÆÉXš|ÑÑ屉" ü=—#Ê¿ÂÍeÝPnãhú‚êo¡=ôާõå‹ ŠÜòr ?Œë¡î ';'•ŠÙV©”úAÁ‰‡ÓáQ8n5úhìRÛ’ÊIøÙ6urõí«jŸÜø ãäûÑn…/¼[òí·ßÊz(ˆf·–v>‚<ÖäwU•ê¯ÅbÉMµ÷ŒPËÍÜê…È‘E‹U‘ŽðÐYd ÙHãÚùÅ—’„å_Èí—ÿ“G¶Ï÷¥B†…Šã1’Û º‹fö¥‚cÜ…Ôµ/±áK¸±` ¹èψ.¾õeu¦ê”Ù­aÚ¦NšÄ¤Põ|ÞçÏðgŸ}6ÖÄ<8“¾ÁÌ÷ÍÍÉUÚ¢’¢KæjµX ã'Kq°òâ’âFxÁmÈõ³áoöhƒ®=„3žÄb%.*`®``è CAØô0`€Š’i÷ áQ&á¥átdÆÊ sù5ï¨H­˜E[Æü;>óŒ„'$`Æ})Q'õ~Sˆ^E=PTœXµJÖ½8AŠî&kG/’0’•¬'’ýSßÑEÃ^Ħ±ó9ˆw~7Æu®À%äLÜ åñ{lg^9]å§ÐKÀõ ¸ixMàMx¾uÝAŒÝ¡‡L‚KÙÞßÏ_²²³Ÿ¡X5 ìøK”ㆵ‡]jX6!jÇä¶øÔ ÁÀ9Ì*,¢)-Si:rçõñ<M5ó/^,ŸÁ–?:{¶´~æi‰Áh«ˆXauÀ8~B¡ð<˜¬ ðh‰'Ú½Û z¸’ΧC9ýõˆ‡ÈX8B.Àsä¾ÿO0“?úHÆ‚+| q ©üˆh"fð4ìÏ×.T³¥/—Ž’û€]%0UÉ]a™áÈäÌ\/Às ¯Ü‚\IËL®ÏÀXÕÀ̸L9N¤rGÏAæàò¥‘×A€õs[ ШãY¼NJ¹Ò^NÛîFp‡/HÝ'ÅfüñGYû{ß÷ß«Y]3­&Ñ:jüÌüÕ“L(6B™Cã‹Zåšge üîÊ»Gÿ×_• &ô Y™ 4÷¡0ÛÀÊå;~3dþò_~Qá½éú‡U±OCupplY¹NŽÒ-ãþÖ@LGÉÎ5L|ÄlêÎvïÝmW\ˆÍ=c?Èû§[DÇ\¿$ÿÏE.a"·c¿¢pa‰ÊÀ{¶©ÝÔë¹8þ½I#|vÔЯÚäcsŸcCE“}OâÔœ¡Îà”_?–ì{ä¨ÙÈsp=p_‰;:€ _PµÀw› ta:”¦&j"€\’\ZôËhì ÔªÔ.UrÍ–_Ðï@ã ö’‰ÔcŠÊHУßò¼£“CùÌçqÐ×\ Ge­Úüe«SÓ¤3Œl¸5¿ÎûHúÇË A»Ÿ!ÕȪaÈ·ÝÄ ö\U5üUÏ=¯”AúìiÞ!Ц:•@b;~ü¸šõ~0÷f#ƒQYŠøhÃ?"|vüãú Uìóݦé«öj£tû·ï¼ëNùøþûeÍÚÕJœšësædõJ)2…š¡šë à ™T8]ñ•ÝÉÁ¦Fiko«Ø @)hè©P#E…vå ¸ŒT¬¹üh8ت âjöigµŽ°…3£áŸÉ…î]$-¾¹âÞç“ú™X*dHPU¹tdÍ4»AøzÁꉓdÿ3ÕçbpÍÕßOiüÔK¸’èÖl„>MY×jùìá,âl‡C%k¶Ehy88Áp ¾hÊÝîñ òü>Ð_¨bŸ2òý.`7£r‰8©;—•?ü=d:â…piký¬m5ÀÁç9= §Ü ¬¸að{¢2²2˜p ‰aè’Í} qK %5:»8©†óéÙL¤4Ádýìhc@¾¡„ŸŸÖ²¹8 #â>üB=:Jìðœ|o/¥,Á­‹ ˆìÛÕôfÛ<‡ÏÇqFúé§² _#8bfûÂÙ““raàýêEŸEÂÐ-2Zÿ‚ÐPÛ˜žW®ŸÃ¤ %t&Þwþ¦*öº»8¨çäv›€ ¯´&씹-ÛÀüÆx÷ð<ö³6øÚ–“”@_„œœ§àâÜd¦TË`ÞtFÅü<‰ªœ@àC8È(÷Ù8&ŠATPñcC —1xæËže4\½7Ñʱ®½˜uÛ@dœ‰ÍÃ#$ /÷é4É÷÷•Ë1Ñr±}kÁJ!ÔôZ ¤zŠ“öp¾PQ㱦;E!Ðüû ®Ò²èZåïã &JÖkÚ>Sª&>/Ûv‘Œ ~ˆ>Â~„¿†þ¿è\¦9Y;Qè] §á‹º8ð‹€Pú¦Ã¨»Sw©|—¿xξe? ÖÏi×HDZ)p‚–5“Ú7h׸­–ps<)š/©KzÃ4 •iaŠ˜Ú/ã …e ‚v~K›ŸÎÖÏÏß&ëàû‚‚ïäãå”Ç-ã[J“]Äû`¢8¤gˆ-Ê9&¢#+è ëׯWAB`ýÄÛn»MußG›ílŸ«Éz ßyXoo‰ö•ˆ¾¾ò›Ãv9÷ÍV)Œ‰÷}]µ°úsQd70ÈÁ×€? º1ÓÀšïÀ¡I rÐ)FÉ€¨‡iÏ-ûŸ éšO‚ÏâXè€æL̓҄òž ¯L Fð<Îk@R Ž2‹ &²Zg³¼1P»'pæQ†Ã­©= ƒp4ÙKbâšKdd¤ ÎÒDp!j´!8r¦)’7ðeÏ|˜>gš7Sb*Ú9F^Óx?VËÀÕ·‡ÜÉA$´Uðü=8(VZ5`HÂý¯i#ó·'Ê« rX;on;‚€|³ ?y|£Ð* ‹ŸqÈSmk8Òýg2 –á£8~@»œÔdC“4 ½#«ÐOZ^y¡²ú9ªtT$•=²u>@ýCHlª5ˆ3¿¨çqP艉åX!뎎n(vyÉ‚Õ`÷y>*»†iñ¡²¿~(ôbq¹"yˆ5\¾RœËütÇÒAÃÄŒÓpÐ,Àâ Š¶Õpæ4ƒ’7¤wˆôêhÔW˜z×µÌV³À¹v+³¾°3@ŸÝS°èn‚&M̃OÆ tý>o)²q¤Önrö³Ö×ì¢FŒhÀ2:ˆÑí«Ýj ¥BY¹RD@yèå gINÁF)¿Éª˜ ŸmÚýú­±Ë—õðr‚1÷„Ã÷î.K7xË΃îâã ?ÔÖ™uD—ðÖ}{e_,—ÂÀÛ!â†E¥±ë7ˆ ˆ–îcr®¹c& õXãv‘P/&-‘[0Ц ¾I¤ìhQéÒœé\ ôj»1þ}‘áµ ªxéíšÑÖì,a»HìK‚~ð¹ÏñaŠ^è'-n SèþYBJØ·iÛ$¸ÛnÞ¢©L˜ø¼ªŠçƒ4Š$M1­™.ºgVÚ¥<Ö€uá³j*àsþÜ)éÔÚ]ž$Jºu –“ç½dÕ/¼¬­b×Ô袎0fà[IêÑUÅÖíau4øm¡;.® ÍÀt-ê/ÔSǵ Ú£å±Ç“tX:B”ŸSs8ó~öi¦8$ÿ 97x–O[NáÀ½@ö„À·9 |éfHÈ“"ÝqXóÀåòj¹_ rÉŽ'pb±¯Õ$Ö}¦q€~ý¯ŽˆIýðúÚáÅ­ìŒþMµBÆ[žpó ¬+¬ÅÉÑYÚwl§"cl@…Á/k¼‡Êtá’¬ª@ÏH Ì¢¥EÀ¼:æÑ—gʽ·Èý·GI|‹z2u Dƒ'MUêg7¹õƒŸ¡¤íÃK'·‰—´fM$ EüŸT„À6Њ¡¹G$×¢ÿ€ÆI“&1Å]ÆNœ.ŸÌXŠaƒ¸;õ¾ñ¾Ã‰]jèüøxõS&/£.’f·RD±QOÃr.¬ '˜‡ûñ€o€›¹S ˜å¼/Ÿ ãÚàkýÎ1àû\Ó§u)2ÐEîºûvíÑW̃²3ÕZ(gDzînîJ-»^$Îø• ¸(5 dcˆDnÙ f¥0½©*ÐsvcZN¬<ñäóXú¼AæÀÜ¢‹wРA*Ø$.Dró]‘K•ÙK\¤GÛt °QúY=¿U@ýà0äk(”AàDŽà§¡(Ú “JËf7MOrú˜³O¯¢Kþ"£ºœ59'ӲФ' êÙ'áAŒEqiq?ÏcàÊÅùP€Í©W¸WÕMÃÕÏ?ýR#!1,¼žøxA¦:Ê´/¿V÷iÈÆhÔIyÅE°a&§’ºÓðÖApÅïvèã†ÙÈ«§ÉÚm*ÕŠž:zü˜‚Å„Œôd¹} ¯Œ.ƒnŒ•ŒlOÙ²ÏòÑNBB#”ÿ€fõæå'‡p$z‰õ@¸a{öÉÍøâ7Ec š9Ú§S°Ø:c0¡Sè!§ D2>>¬Xý¸P ô Ô5‰¡ÚàSŒ<ƒd¥Á‡Ü±ªdžÉİ»!ß’ÇÆ€}?ç§yâàd/.•ÌË©Êþä£OÍ6ÁbÀ^š8E<¼<$Ë‘$) Ws†s ¹e#”@Çä+öT%a«û9@dõ\åëm'ý{»ÉñÓ…²qGž,_—#)©E2¬¨<òÈ#Ê3Ȧ_3lL3ÏÃÓ_¶îu’ôìTùm•“4о,M¢K¥ –‰1c‡ÞD2‰_Ò¯ zÍ:±A;‚ky\.6QQê:ÄòÏ!Žpâè!¹|a·Ø¥É“·ÇÝÉù¥Ò –Ä·0õº ïãà¢Ï2Ž÷8N]1›X j¨’”õÓ Û×DŸÉç•=S~˜1K6nØ,]»uFòèEY¼ð÷*ŸZ‘ÄM%ßQz€éËøX ;›Om›Ž ?VÿOÇ!- f0c>4ò* ÷z3¹‚ ÖmÍ•ÃÇÈ’áñ󵓾 ®˜zø´x _œú¾«5}ŽòñôTÉÍI—I¹2 á’xºc]*Ô²x¨õÓ?ë!žŸ²Û _Œ/d$”%›Á¡üáAHe#!S9$±±“±ÚIåÐüå{šŠ(ú)” ƒL•©âÜ0\ûÁÜõû¸W22ÓñÙš|¼“'‚V] yÎ> ƒm­8+Œe…37?ŒóLÕ2 \Ag¢ÍŠcÇŽ!êFw+âÕ Š*€²²Õ?üà¦-Î ;‡[ÆÏÕÔÃ?¬ ­Ž¾B]lØõèh?(±ÚU=‚¢82ÌA¢Ã ×JdÉšqs±•Gl¤kçÒ¥³ÁÓÇA"áÅņIïnÁà,a!¾Òµƒxcàù%æ˜ù}ñ%q&vRô`Q¥x!w¯ž·Ø†Á^&KE§Æ—ÈÂBÅ YH$pf±MÆ^KÕ@ücèK²xÈ÷ 3°¦@0Ë5#ˆbŸä´‘zÁõÔà“S±¿IüN`5@mð=}K|Q¢ô7ïÓÎÁbC4]€_®¢ò§q„j8ÀÏ(¼ 8ئ\ÃTI—&½wZ†¾>ëÀIڵć=íä×eÙ²~[žDGøHÿ~à:Ž–-[¶ÈB|0’îëNí£¤Q¬'¬Ìh{(uî2{A¡´jêë Få²ÜÏø°Ä^]PlŒøA|An ‡bÃu4AÔ$sƒO«ãäûc0N¡ýÃ¥CKÜa–6ŠSbIåV hòŸO¢h³€ö¡è4–×Àè‚Âm´Lmµ™ÁÁ×àÔ©“XØ+':xØÔ­Ú9Àn ¶Ê’¦ã¤ œ4þœY \f"œñ‰wX ~PSR‹eïaä€ñ¶o‚Õ8]U,a ¾å³“¦NR39'×V>û>Câ"åèÉB9©Xê¹Kûv-˽‰ä çÀÂZ¶p ñÑèÁ„ì'Ñ¿ŠÕÀ\ß Ü®¿¥û$N6“× 3Þàgá35Ðúœ€Jn5𮳯ËÁˆAi¸²Í“/ÀÑsÎ 6N9&ìì«#€_Pû.ݨ0|¼„¸@{¬²qá’+‰Aã*þvÒ¶¹³œ> §”ƒlÀÇ0Šá&îÚ1VÉj²GM?¯ ƒûEHzf©;EKÅ ¡ÖnÉ“NmÁ :ª|C~óp1¼ƒ%.xÚr0Aøø‚Ü `ðÉò²5ß»QºƒÉ;ã€@Þ¡VÁ$.Ÿlìw*¹9ìzý,!–§`˜Ÿ§€FÉɧ±Î­³ÕQ@O|›€ÔÜ Û[ãëY¶üŠFýºE#'‰~°yW¾¬Ùœ'GObv»J·.ÐôaöQécˆzI‡¶’Ð9žM[Ù²;_ì `\J+†¾à€[†(¥Áê$úè5T`D´Ã?ëÅ(Ž2¶¶P € ¶B€®uröµ†IIIÕ=ûU8¦/d œÇ ¯D‚ô5`ߘب3g’Ѹ5ƒÁº«!€_PÍN£jµCŠ……À¹ÀXhû1`mõ‚–ÆïèH»ð ƒH]ÁÕ… W`ó8xH«øöø)’Hõå-®×cÔ¬Y“‰r—ûòá5³U¦æ¡#…Œœ„¦qJ?`T’YFjµ¯Ñà³q$’—àú| 4ïma‰ê¡ŠÜl®Xl\l™ã‡ê…A ÔŸ[r-ƒÙLy8ÿf}9XB¤îÆ@6Ð$53¦o“1¸*˜€l´ø›#í™)Øùˆ¨ª´÷Пv/(**ª\?ðpÇS†:ˆ—ØÍ;ódÎÂlÉ)ð“‡è 3ÐSèZ¦Ìöõq“~}¢ÐŸ¶²jC®øA±\ž+=Ú;«*3ˆÌ-õ挣[A«t´g 0X ¸É\±q10ûèûÏÇðÛTâ ž•¹ŸÍU±Ø Jï“®$å±YàÀkÊH…-œ**y[ 8Us]y> ¡É`íéL'#Ò•Ëgk`‡7+..• ‹%<Ô^üáDZº®H£»Ë+¯¼¢²™ð9eÊd)È>$ãFûȉ”yn´—Ò´zÌm§cùWË% ¸`®\ ÎWÓX sšI6Åeʶ¾¯9ÕÀ4S×-á¼ï0 ¬t·ÒÁ¢oÐx(œœ`ι"Pq¨Ò}º+°¿Qw\Ý.õ–ÿ 葘˜•A¶ÌG¤Ù¨™k”ïÍ¡D€èbN„G‘VÝê-%rÛ6X_ÐJédå'O—[nˆ'ó,¶Ö§ÆÜÿ¾úEÏ €fÕ}À+”dzµƒî¸í:s·’`…6Ä@BŒÂUèoF é1ô=¬D%–rÖKù‘ÏcàÀk!m˯t*‚@/’hž=ã{ËŽ«¡~3w~±›¦WkàÊw±¤‹zÁ;ï¼S!уƒ_¿ž=Ø]ÖÁo@gÕÜÅ—eîRO¹çÞ‡åa¤Œ3uÒ¤IÊJ÷ªƃÏ÷cývæX …òÕ³}À¾£âÇ%öÛ¿rkÁ43 y çMiM€‰/cL=@?ó¯ì—9…@\¨¨ý¸©ûqÎ`à›¹hÁiúz“¸^°Vý2V ¥Dq é??ÆGÚ4Çg\üì¥iGY³%_ÎgÆ©u̦gw >Ï17ù€ŸK¹s•ÀÞ\=ø¥OQp ¯ôqÙ$+›lfî çéd3 5!V@–; XA“dƒ´™¯mÉþy^S ÝÊ–O³PÓv˜¨Bš‡ÿÍ€Ï@!Ê nÀ@¾g¨Ú§ÝßÔI:´Â/nÀ™”‡·K©ZíÄPüŸŒ¹ !bS@¯!?î  ¿ÿ)SeêpÎl¸ ïȘ^§tlµ~Ö¶ìkð!Î7q¾ü”Ù‡–—¨¼Cs§3°\fóádMzÔ>‰Àº@@)qµ€bê `CàgH-b@‡öºÞQB3±[;¹éWiÝÊU=›2Ÿ ^èÓ0óðA)~0xÔT™:œ3ÛÌë£2Í>倛ëoݳ©”Þd ¯’Üו+OgÓŸ³d uv¾OÕ(QÛj VÚ)š`oo©¾iÉã-*CÿŃÀ¶Àå Ô0¨Ãßë£ÛT?_{å7à1Y>‰À@ÑTŸuǵ“@²Õ¿ :8ªšù\gaZ_s‹¨ :Q p:°Z¨ ÐWJ·âp¬ÌÔ7†ûìÉr."Ô¯W×WP¶OgÏŸ»Pqà@´'ñI|{‘=Êy:„ŒÁ”ܧuÁûò%yP¾¢%WPûãÊ)«‹ÜSM(ˆÕâ"ŠVÃ÷ô}ŽÐ0Q½TP,n_] @51ðYPüõJÉ7%¹@5€fÊŸ 8*mÍOÓ0ߢ~@¥N¬™§Ó¼7nœÊ@ÊT:­þ 8`®R~v–}Èþe‚MÅ~.aä³±—Yæî¯êüUáËð‰Ÿ€K¶ B¦1ZãØqdULK¦»örV¶œ?G®\ ¨PQVÕ$}ªR%ž ÿ€\ëk \§­_`æ“+êËfp0Áƒ?ÚÀ_ó(³ ~Äå‘@“Úï­#œÃý4++YÁÁpm»ð§fUv#œÌ¿ÐúIµË‘¬2¥6ϯô°ÚTÂ{à‰øýF(PA<&ÅRsÅFí;8˜}Ô4Ïâ=!iÍ|œ ×p ‹ö|-©¥ì˜ÏëÀ @П™¨øk ÛUH”4¥5. >¼I1 ÀD;¾ Â 580;*5¨C…½}Q±> ý¯`#P'DU©-Î?3Ž °Ÿ¯é³®byúhó¹€”¡-ÑÑþØr@hé|<ü+`<Â6Äé¦~¿ l"©ï-B€ëÒóyæîè2Çõåk²oÖô¨I%Fe‘ÔÆÎζ¬.+„à·|332N¬]³>BW–Á‰ûd}V¸Òõ°K…îzíTÇÎN!¯¢þ™ä³øÈÔ3¶v¶Cìílὤ5Fí¿ÖpÕ8€®ˆ”màqóÍš"1t(œBÅ®®n³pª'и˜´Bå8‹S7[ ¼<=V b9 ?Çgòãš?֦㼬=`íkX{ÀÚÖ°ö€µ¬=`íkX{ÀÚÖ°ö€µ¬=`íkX{ÀÚÖ°ö€µ¬=`íkX{ÀÚÖ°ö€µ¬=`íkõÀÿÉz˜^ë ÙIEND®B`‚ic13ª×‰PNG  IHDR\r¨f”iCCPICC Profile(‘}»KÃPÆ¿¦jU*":ˆ8¬ÒJ©‹£m…R¨Pj«&iú€6 IŠ Ž‚‹CÁÁÇâkpqÖµƒ« (Š Nþ¾)ñÜ&ÒªèËùñÝsÎ=÷¸MAU -~ ¨Z"âçRó¼ë m@z0*HºŒÇc øÊßãý–¯}lÖïû£+-ëàà‰'%U3ˆ—ˆ‡– •ñ:qŸFKï0ÎZ|ÊX´¸Z¯I&ÂÄ7ļ”ÒįÄ^)§ŽÍ÷¤‹iÒ¹)‹Æ9ÆbSo¶‰‹…²dïÉ~è–•ÙVOgD18xˆ(# ø(+¤èHÐ}ÈW Ö.©«Z>›3ø 9$óQEóò€|g~ÿô±¡•€‰7ÀYihâ6p¾ôß74Ï>ÐM^]¨‚&Ô%'.“žOÈæÐ{t.è™ñ€õ#wh}4Í—aÀµÔ*¦ùqhšµ#j~ªŠå= Çw@r ˆ]»{ÀH–Þ\üãöºG¶ÿÖØ>~ywÙPvä4@IDATxì|ÇÇ'JB àî.-…º…¶T¨@Ýÿ¥Bû¯Pw¥ö§îN¶h‘RhiqwwIˆÿ¿¿MöØ\î’Krè½O^voevvvÞ›góƘZ д@ -h@ Z д@ -h@ Z д@ -h@ Z д@ -h@ Z д@ -h@ Z д@ -h@ Z д@ -h@ Z д@ -h@ Z д@ -h@ Z д@ -h@ Z д@ -P>-T> <¥’¶@0õŠÎêl#@³!“ 0 L÷9`Ž0€#äCº½†¾kbDDDýîÝ»·hÞ¼y½ðððFUªTiZó`jjC¨¸VpPPTVvvpvVVPvvvPvNŽaß°o²msØÏá§²²Ó32RÙî ÙpðàÁ]éééÛRRRÖoÞ¼yÃŽ;VñÜuà6·ú~VÒ0€JúaŠQ­Ú 6ìxÜqÇuªU«V§ªU«¶@[‡GAôÁìA¤&=-ÍÚfdd¸ˆÛIè%Ù70Œ à`I9&>’™)‘Å3vQÞß©©©‹wîܹdÏž=s¹f1˜]Œ÷ \Z-`åÐÈ~|„ÄóC† éÓ¢E‹¾xÐfŒô¡¸à‚ÒØBôÖ(^¢vÞƒtP@"Ðyo×Xçφ9d a™0†}Ôkvrrò,Âôœœœ9¼‹T‹T` @6¾N8õÔSOêÒ¥ËñUÂÃTŠªœšœlDìîéþÛIÄNµ‰Õ:ŸGè®}§ à`…–í ü| Èí~”‰ª‘™–žžcø 5â×ÌÌÌh‹õ>¶Gà2?¶@€ø±1ýUTXXX—+®¸â¬øøø3ÝÛAø!°Dx[Gw'FO¿„‘ˆÍH`4–J`íë3¸1Þˆ ô[¯£r0kËÈmí£äîKÐu…2ÏcŽër`È™é™YYó)ïkò¸ÒzXà_™·@€”yûö¬Ýˆ#ÎOHHÝ¢ I>p —¨ ž¢_Žxm’SRL [†µ¿g÷n³}ëV“ ñ—`40)f´,t0 ›ð=1)û˜ê†1!LÿâçÇà—`À H#”@Yµ¬oåÖ8çœs†´mÛvdõjÕ:3ªj¤/@ì6‘ØÛ”ÔTs`ÿ~“””dvCà[¶l1Ö¯·Faß[~WIRSpJö{H‚ðyŒ •í÷\óø+èýoŽÚPhó”Íɘ˜˜®Ã‡¿¶NíÚC£€ýIIAÁm°·"žû!v g7›Y³zµÙʈþ/)!¡ü%¼ókàGàÑû—é«@™6o¾ÂCðÉŸÙ¯_¿[!üÞèÚ!øÏ-=Ú&x{‹5ßìbdß¡/Y¼Øéó•ô/ý‘'lcû:Mð*¸ë_Ú~{íð[Sz-(¢¿°k×®·Ö¨Q£uÊÁ2Äit· ^[òÖ¿f5Ê{--p¶ì‚Œ£9^·š¥d-`%k7_î ïÓ§ÏÅÚ·¿«zõêMó”ã"|1›èW®\i¶¢Ç x-Ñp8–;_®€b´@€£±|¼4¨eË–ƒ{ôèñ†½VXòƒ¥ß‹à…ŠÊ#:ά]»ÖlܰÁÇ"—Ö0€tpø(×½jC|hð¡‘|½„Xû>ÇücµkÕê‹+.Ô&|‰ø²îo۶ͬX¶ÌríùZfà:ß[pƒáßÜq;8Ý÷;ÿ½W€¾}l¯^½Š‹‹»˜@ø*åm_®:ôÛ·ÔTÿ4u‘¥äÀ’apå½àŽ"ïø_`¥ûøAî\™˜˜ø0±©))Á"|éú6áËÒ€ iLÁzÁ]<ýÓ ©ÁaðÐ(ùGjѦuë—jT¯>·]˜Bg-QŸ(ÀŠ÷¹b‰â{¥ZLÌ)™èúõ%î+_¾ýTê°mÏSËÁôJ]Ûrª\€øØÐIJúzxXXS&æ„Øº¾@Ÿ@ HC˜F/7>5/›š@Ñíª6º£ƒ‰a?ÐfE·Ye¿Bl{ •¼œYÙ+[–õ )Ë€²•0óMÿZ0Šýñ•W`Ž¢©ÉöP3«þÿ•`Þ?{§ÆÓQN„êý_8s˜¶€2DR÷ãAeCžþë À<òÎþ–Æé@' õ|Iàè‘Ðbî`/lbøò`"ø÷ï·8†FyŸ‘¿Ǥö¡[;[;y`ïjkïÛçìwÏ·Íû¡C»ö9ûžÃvËËË8¨td—ƒ©‡í‹³âGÌ,æ{{»ü dÄ_› §¶QË‘ÅV#˜P9Àvò{[-è¡™r»óPç„r…©³k_÷;}™R{h £C„UòP¶: thÙHêÓPñle e_í&©)˜ÃJz¢­Òi8IçƒÿŠN}¬ä¶ÀÙ4† ~5*qƒrdÍtËÌÛîf»€ú®•Hs}nb[Þ¹ô¤O7ãÀæ`C°mÚšm"[11I•Võ¤=3L ™ºÑÀ÷-PY‰_#»æ¼‹à5›h6ø'¨oJ‘%B?@Ì¡(ÛŠ°OÌAR†tðJÅò˜€rJ8¢cº À˜“iéüµøØy¯ùí"øÉàtp¸<’@íÝìÍ7芈)°©X ý¥|J-.ØüÞÐû™Màkˆ¿^EÖ#è•ør!õø”ª‘^ºü¿d…?<…o2Œ¥6°©à{È0ø2O¿­bjxjY¶@kzÖdÏl0§0“ç+»íï X´(Ë—=ÌÊ®F}‡€ŸÐF»aÐið}¬>Áóe¸ù0k¿@u‹hY±çÓ©²Ê»cÑ™òìàS`70…·€¤³ÀÙ"ÆŠøfBUðÿeGñaŸãY³(YÒÔa ¼Ï¿4Ÿo*Fào 1˜Ù>IÁ=ÁÀò$þNioñH58Tœ¿ÄŠ…?þž{þ»žýŠYÝÉ74ð"}@¹ü&ÅP^å>Æ3ô-Ø=¶ÛzhŒìÚ—ä#¼Dx×ã1xÇy°‚÷Å  H‘Ð/ýžV–Áw$å½_ÁïWâÇ—…N\âÊøùFHïñÁ±õÇ—kïý9ÊnË Tÿ3ÀïÀA ¯• ÁUª˜ÞÜoº^w­‰Ž‹³¹ A¨ÎªÄ‚”† Mp£ÓhÀ×»—Ù·e³IÙ´ÉY†ž×[ϰðé­0µFTšÄr+Ê &Q[êÈɃ œ4yòä ìW·“w¦/©zºÚýå„ñò-¹yxXJ¥n„µ\ùÜt/'÷•?ˆ? â_ËÇ–+Lz·ÂyË âyF˜¯Aí» Ñi§™3¾üÒ´<çá:îËήµë¬•ŒtmÊOL‹—J…ˆëÞÝœ8v¬9êé§LDÃ|Ó¥5Ž;î¸ÇpJìL§y{ƒ YY™Mù}¨°Y1ÿ€• ~æ¥N`ë—oHkÎKª_–à⨌/®‘i.âM‡ÒVŽŽ"‘å ×—¶¼bÜOß²ž)ks=ç}¡Õ«›¾÷ßoaÙ ׫Dè ~Ôô­Uä§¥›50ƒà³Ï2±GõwÄoRwí6+Æmæ=ûœe<Ä`.¼ðBböìÙcÞ}÷Ý?wîÜu7Mi&| c|“Íeà\Œ®¾ú®lJ…þKç¿…F–JP*€¡üA½JUHݬ†8á<>l‹Ò¾=ZÑ|oSŽ,í~1|¬S3® æcÒÍÏ?ßt9ÂDÅÆúXTÁËd ¯YÃL˜0Ñu²©x9@–ÿˆZ5MÇË/7 2 Þ}×tƒ)ˆø“'OÁs°«»?ƒ Š‘d´LA$«Pš°ÒA&5ú/û‹o<–¾¢ÆÃ-ð’í)k7O-QxӑʆñQò¹ÆŠÙÆÒ÷“ø¨ò‹‹Ë ÂxÐõàƒ`¾‘)">Þô»÷Ó°o_—K¯4•J`ÄOY³Ö¤®Xeª÷ímêtíê±81‚jx úÝs‰ýõW¦0ígôßkþþûoûzÎéà à[\Œ¤€ ¢½4á!ÀxÈ;åt¤HÜð¯ /þš ®bÿ¶Öšúär·CUöi· œ!\|Ø1ëKùô–‡ÏEUx©ÍôÊZ%¬²f›ù —q?=¾Ü 3OzD§vÄÔnÄ•¦ýÅ›ˆÚµ}²ð;î.tW1™Ä„ÅÄ0^Ý'L0¡\¿…À¡7ßy×$–À "üîÝ»™Ž;æÄÅÅzøáGžÒù1cÆÔ¤â÷°{X]Çò`3Ûû‘*ÆÝ}÷hš½Â@ éCúÌQ´‚˜p±&²‰›š€ž¹o(Ç«ÀúúòèD>âõ`ñ•c,¹|Èå<ä,ðw_æ‡k䢺|L]P£cGsÌSOš–gŸ]À¯ïº¨;²„àEð…ø%È×\¾Ü+M½ê_6ÜDÔ­c¶Îžöˆv7oÞlˆš>}z+ª¶wôè»SCCC'³*èn©„ó˜Óöà1   ƒdžü9¯Ø‚~#,‰d¬{&€b‡ H|;Ò@úß²xÀ ™¿:áñàÂâÝ]â«âÎy ôg—Ê¢‘´ë¨ÛÍÉo¼nb½ˆæ%~bIo„*² #DÔ¨a:\r‰9ëÛoLËaà 0ˆºqÍš5ßbñTé ÍA}“ÀÓÀ¶ ˜ìJ’Í}>ø \s ²]\ +{L-nEò˜†˜Þa%át•ý7PÁ`>ºˆJkšçD®¹Ü[ĵþ8-õäðZ0Ž#(§û7äôøãI~*ãà¶í&yÛ6Sƒ°âlôÿ}¸«·nmª5jdúÜu'ч§šy¯½f¶NêzâÉ'Ÿlˆ$Œ€˜eË–m˜4iò½Hå]°M£fMxžT+4xܧÚM¸ƒãäTTÝJ"uUf™ž?€’p¬eSÇ+ ¸Bn>ÅŽ_ j(KÐh'ú3`çƒ4A§çï5Í ÷0^çuµ¿‡y!ÌH‚lÙ²ÕlÛ½×T·£¡Þz:šãž{Ölœ1ÃÌ~òI“½u›iÚ´‰5ÙhûöíæÃ?j”=“ú¿>®gð_íÖœ¶ŠzMû¹cè{éÀ|H¸Ü¬µ 8\¶G"¸¾C‡ö-ë7h`&N(|@á#+ëëG|¬«Àô2þhq”ÿ¨™vô«CÑ+Œ·zb⡃•l/ ‘æs¡VB‚%»Ó†.PL‚\†qݺ™äŸ6Ød_X¸p‘tT…‹e >Ÿ’’¼¢jUW”¶$·Ê/ònÉôå(R=iÒ¬IتUkÊzñ{ûi à¸fÍ›ÞѳgÏšüá¾Z¿nÇFã´fò½ÃÉëA‰~e"v”dkÔ¯ã|HÖ÷¾LÞI<þ8œ§_;Ï—jÂÛ‹Ñ.÷¡?$ŠZŒð±çœev|ÿ£‰jßÖ42ØÝ Ô‘†¯R­š‰%¤8ç9 ð90€&öÿE%ÈìÙ³‡r$‘{p¾]ÖØ±Ïš]»ö÷à÷p°(cá*ðk8Ê[÷Þ{oûåoÒO$!¾\xøÑGM¿£úeŸvêéÏíÛ·O.ÑíåQ9<#È…T’2šÓ‘ÆŸvÚ©-£¢¢C™ÛN'Úe~üö[¬{˜÷Güã8t#È÷-3hFÉ/'¹?¡ùÐ!¦óˆ&IÅUÅýþ¢~§íÞm¦]~¥‰Œo`ZÌS§S'”ÄSÔ½…ÏNO7Á>DÖfžAÍùóÉ·bþhÖÜü…Asó¯2³ä<›4IܼzõšË8óËC=Xžñ,û—ƒ! ;LçÀiÄ(丼àbå%OL uÛ¶fò”)¦6.Ú>þàÀEÃ.‘Øy!X^LªTmà©KU`ÝEGúàœsÎîŽåÙ9q?™Úuê˜5«W»ªñKì“eIüò%ßJ½hº@=G?ñ„i7ìBÎHY&@o]ùégfϘô;Í–Ÿ1I¸ç¢ãš*5qÉ—|e"‘ûö™È­[- ­_?“x≦n—.f¶„Œ½ùi—À"ðÃÂÃÃ{õíÛw0s Îç·$'¹çDP3@¹K%A5«á6”G¡¼@ÒÉ6pM+5Æ_~ýµi1TиqbxXxhì´©Óô>¹uUåúw¤0€§Î<ëŒSÚ´i­Ñc“5ª*ç]=Bf;uîlæýù§üP"þ·øûÙ-è@©_W€ù:K»«Fš£|ÀÔnÝÊ/Ñ|Þj¿µgÁ˜‡-ñÛ¾&eͳñ»ïM~üô÷PŒyeŒê٫טê{÷Zv‚ UñÉc ˜†¨„x³yÖïÎüªJ ¼Eƒ ZêGffæ4¾ß1Œô¯Cìã=vÐî¶4ðŽg°_^ È^pLÀ²ö¿÷Áæ”SN±ž¯~'lÞ¢Eä† ëš-]²l-'–X'+ñ¿#\اoï[3¨ŽÞþjsýƆyRAÀ‡–ë­,ˆ_Ö¬{ÀwÀÆ  Ð3ËxKÂoý¡» ö²³ôí·Í¥Ë ž¥ƒî›¿ÀlüåW#ûC´¦ç¥+xqÉd¡~­yúYÓõCaÃË¿ÿÉDõíc½{ϫ۾½ivæÄÜ…™ór ‹UH:óÌ3æ$%%™^x¡Ö„ ?‹ÀuÁAìY½*5¬‚Ä÷&Çöè@9Â\ž•è_§NÐç^x!(2/ñŠúL˪óæÍ«Îš5« s%$½ì*ÇúûQ‡;hѸqÂCÏ¿ s=ò«Dü„¤f~üñÇðAŸÈ!u¤gÁ²0ø  Ü/Á! Ë°*ýV=½þóS£IN•r˜œ¼i£ g&`QP§C‚Nº÷tp7û‡îÍ&gçÌYfÛÜ9&26ÎT‹õ«D"°üýÍâÅKÍòå+MòdSïÄrCŽUˆEY‰â™×pì “Œ½¢ B ò"˜¸—/_!éIíz(U`  'ÛÓÁÚöIÀ~öËf2%§¤ KR8*KM{àbƒ nаAôø¯Ç·§rŸeÑçüòÞ‡3PykäU#;5n”nüÚŠðš4i’óÏ?ÿ,|ÿý÷E”»Á¥ ¿G~QãÓàó`}Ðõñ>ûŒI<öØbÏÕwâØÙ1ož™}Ý VOŠnܨPIBFºÚ§êóìLÚcÿ½zAÈ`ºï&øìÛ¸ÁòT©¥ø¤ÒƒÂ‹³Ý÷iÂÔRçäLÜ€£ ÆN7ˆÄFÓäøãM|TUãHÇÈøÉ'ŸZ„”w© %"ú3:vìÐ.***ýMAAÁMš4‰Òsᡇ8pPü AÛ‚µ ”„ŠPV„÷Oý˜ç/nß¾ý©íÚµÃp™+ØL nÝz¡Øjýþûl© SrkYùþü"•¯ŽÞj4úÂaÜzòI§ÔR£§¥¥YGH¾e2Ýî¸õÖ[‘3Ë$¦_ívø˜º@F²žÌœk~Æé~!|œÅˆ=ó–[Mò²åÖs$¾·&Pƒ£2!E&Á¸l™YúÖ[f¯Ür^@õntþPÓ„zGHT£t©€ûS6m6ÙYŒˆŒîEã`pÑØ)’RRÌ3/¿b²’ò U—0˜J¿~ýÒÚµkûéË/½DÇ}ô¦'džÅîh°3(ã¡`'86''û‘ÿþ÷þ²´ÈßÂÌȇ‘6#åy²Q™–·lÝb˜ ±é·iÓU×IªTeƒÃUèÙ¥K§'.¾èâXt° {ôWãJØ2bĈ{ù)±Üß €žWA¬l&ŸI=þ¤Í gž1 Gõ÷«_ã¤Ifóøo\ï‘“Û1}†Ù†a37bU ’z¼ADÚ¦!9c0>î!6 +Ƀä ÁîÃBoÙÏ?P*ûõ ÃËN‘&ÕðR„á9â}êÀÜ‚ªD˜ý•ï6©xk×® 3gŽDë6 wéÒåQöŸ%9A6™´Kƒ“N:îÛ_-3úûcÅŠíO=õÔ6x1‚åjP’*>¡aäO?ýÔ!##ósês¬Tp82¹üÞ½ë®;[&$4u¿Z6>>>kìØ±ãW¯^}'?K9ŒåûVêŃ_€}@WgÓˆÜÿ‘‡ñë4‘›?!¢øóî{ŒˆÞ2vî²\|û˜–e¿0Ÿˆ0+|ü Ç›ðzuÍŒŽ,À®¢³‘¤vΚe¶"-D’cÐßö׃Üvª.\…,CYØ:´kgâûÉ>p¬IÝÀ$­Xávµ5Ê·<øÜë˜p¤€!Á&PLùð[0Œ;geå(?ázöËrXTejDDÄ©ýû÷¯'&%â·AõjÕCªU‰ž>}†ô«Ë¢¥)ópd÷ÞxÓõ§ 00Z/. ÐXCáªsç®zë­·.äP’uÂ?ÿ)F„ÿ€ÖsÙZÐì¼óÌ1O>abñq#Fû$â×êÖÕ$ãÏ?¸I}¼ (±Ç†o¾5Œ<1yè¡ðÚ+\·1ü Ž;ÖdÑfIy©ÁÝ/ÌÀ0gÙÖ¯Çm—`er¿Æ_¿3ÉG˜òõxS‰!83Ã̃ùÔìÚfZÊ S—‘»×®5a6ôéÓOK´ØK\Á?þø<ó žÐW€K°|͵×ÒÁwpìWûÞ2ئL›6mu:=111Â&~m³³sL\lý*[¶lJX½zÍRž]€›•A}|.Òÿ=ÖçG—èž}úözôšk®‹­YÕEü*I¢?v€ý×üü£D¥¼)ŒCׂõÛ‚®Q?¢8ê±GM‡K/1áHîÆÈ½{éRU?ŸmÐý2Ÿ~GbÑoxÌ€\;@Ö~"<%ÉÅ·áÇŸŒråâÓb!õzt7uiSöì6©Lôñ)Älúá“Rsñt¿/Çö““p 1 ÉÄ üõ×?fç‚E¦þi§Z*ˆ$Å4;ù$“˜h¶`XÌF×>[Vxk¤ýì³ÏÌ¢E‹ð¬ó@q‰eçž;äÀÁƒ)—±¯‘w @RAYÂ*Dý:äLìŽZJÒå\U@[¹6ëׯ9eÊ”¶ôQy**p81€Fù·{ü±ÖM›4µ\mÎÑ¿ZµjYøû?Ú¸qãc~úÊ)GzÛU F( §?1üuU=#ë&Ül¿^y¥ÙϨU«ys¡¼RÖ,¦“€;-”D{äâCÔt© rñm% Ðáe(DÀò߀)ÈÕðì[»Æd"†Ë>°0¹T+½}ÀíbÞ«¾þÆlݸÙ2¢Åtëbâ#±Îu¥$—:H.ÍÈ„SÍt&§¡tìMHE¿×Ò¿ÄíÚµsKË–-¯`_ßn `"[09)¡+HPÑ Oºúf®m¦ÅT‹ ŽŠª5kæ,yŽ~ò¡¸r¹äpb7ßöŸ[ŸxÂÉ1Ò³l›ÍªíááU .™U¸ü$úËg\PÈ© ˆoƒM@T‡à!]v V4‚zƒ F²_D2©÷ b/ýðCKG¯Ýª•·[|>._M¡¾DxîJBÊð»÷ ÂO4û$¬Ÿ&ß-¹Ì%ÞÄwœ Ç·›àœ"™ ’e|,„¹ä{H!?B¦©˜ŸÍHÓ©ƒI:Ô«£vOà;ÔÆc XÊû3à^z#€¯àôô ‹ é>o « mˆ”‘ƒ/R†s¶ï³˜ £î¾ Äa|´ï)j+oAmôþš1…Vöá¸Øª3¿C_aÌp+ñ ©xœ°{÷î ?°%le>¢y¢÷Ÿ/®‘$Дzgƒl àP˜€¤…­ö‰l×ýöÛoqD5vçÞà´t¹§…VQ0$–ÖHŸp ÷` â¯[ óÚÃ<Ô¹I“¦a¹Ä/®š);@öK/½üãªU«î)E£H,{|̧´×eZëÀgž6Mqñ… iÉt¸‰7ÞŒÕ>Íui߇bŽ|W×oî(QhVô‰aBЦÿfFë ö1%wㄟM#h4±ø…¹ødDÔÄØcŽ1©ö[Ùƒ=•™‚î¾Aó øÊ\aΪGjŽ€Ì¿YÎ9ÛÔDºÚ4gŽåè¬ëN˜#Äß«k×®—·iÓZb P„÷>xîE¶«@1qÇÆññ ?˜ÏLÆ’ÂþýûçbŸ8‹¡:`í…ŒŒt“ΠU52*$:&*zÞ_óÄ¿¦•ôþºïp`—\}ÍÈ+N=õ´šÖ«‘?âÏuµd›ßgÿ¾ë7Þ¸˜ÙQ‚FÑG8 žŠÙX Å2{Þ{éyóÍ–AÍ>^ÔöŸ7þg¶ÿ>Ëu™–äî†_»,<öC\"<.¾P\|{,49´“;Xöß7[~Ÿm"Xâ+ 7_aö*ŒÊ Ž:ÊTg*ñ¾5«<@öøÑ„¢—Ç(~€¶+KHg’Qm¤ÁnŒ­9Íš™š-Z˜–ge°µlãÝáüó‡VÅ8WEº9~ûqÏ?ÿÂÕ¨òlg0òkèÆ3µ÷9Žl@÷B½ÿN9sæÜ‚'ÅÄD‡kôÏ•Xs­:ujG¬_¿¾ù¶mÛœ Y†•‰H$;¼¼§FÍê£[¶jy{ºuÞ|óMüT%âK„O#J¯bÔÙ½kwÆnûÏ 0‰SÅ…ºÜð:ø0XËysCBS>û¬I€x )÷h×â%fæÝw»K§ ¦aC×1çŽ:ãn¢ô¶ÌþÃTÓ¨Œ~_°í.ßÏ“ÑdèÛ:q’Ù‹­€+ݸ·óQõã¬ø*ÔqÏ_ó¼3—3s~´¸WKmºüíwLãð0‹¨6ÏûÇ$#Ebì”"I«1ƒ ˆNöAÔ &…Y^£åHIï¿ÿA7jä_æÀ³=Mh¦aimI‹öîÝÛ—ç6ÇN¤Y˜™yj+L7¨^½ºU¦NÖ‰gI-9l J‘.“ – xWfËåñ®‡œ‚õtôµ×_Ó¢W^Qä’‹$€‚v ¶Œ'j<…XJÐÈo«Ÿ|üÉòwÞyGúÜWIEïh”?|$æõ„Þë~ÓN(á«„lê5ñ–[Íf¢ölhE.ÿÞwŒBÊÌkf¶Ùt‚ýŒ^;a+Ȩ»í·éÖåUÔ7ýxÀ4D¤-ÌÆ`—íËvïòfù{ï™ÝÓgªƒÛzVüóLS¦éF"ê©àZ%YcÝ{HÐ00oP·e‹‹†™êM›z»¤DÇUß>l²!ää䫌&7]Ï\ƒ£ó•§Õ¶Á¬æ¾ø¢9 ¡}ûvV_¢¿˜Õ«×Ø×f±#cÍ==4æRòíìï>Ž}oª}Q)¶]ï»ï¾_º÷èN¸:R@ž$`1~§$§¤áÉÈQ߯{•ðàÔ)S·ïرóžù ¸·ÏöéÖŠf’|Þ9— 6¬n›ÖmC££òŒTê\Ví‚r ‚ý$BX·_­xÿ¥K—¥Þpÿ>½iîEê/€§ºßÓœ8x-ƒUQ#s±€N¹~Ê3ùÚë\·I×>ó‹Ï-Ý8 ½|/nÛßóÌò/¾4V®t]羣ѻ„Zã #0÷û¼ý–5;!ÃK^{ÝDg÷!ÑQ¦9nËž_X ‘u?ï›´f­YñþûfǤÉÞŠ´˜Nãa0¿à AP¿`÷ßÿ˜ec±Ú'¤z5Óñ‰Ç¬5 <•Ÿ‰Á0vòS35Å®Ë<õÔÓž.K%Az›6m‰è›N‚<]T’cøÿ_|ì±Ç®©U5DL jÕ(W/VÙ’­~-ï/b1§½ÔoõšÕÙ%1¸­€ÁÝÈÉ‚úLI*â垊Vž¼þÆë.~éðØvmÛG ÂÉhBh¥b¾Íæ-[ÌäL¯ŒÂÕn4g\Áû˜(‚%5‰(^â½$Âb4¢N© œG ÖýÄã¦íX¹îç|ÝOÇݧÑ?ÝÔ†æç 6‘µj¦#šé£î0Ë?þØlaškº'=š›4²5"¹D"®¸ª‹òîûCȵ$˜xò†!&ï%Þß³} ÃìÂ6 :F"ÂKì/Ê>PI¹öñ­4³Ðä'a°‚“J¯æèŠo¨stS½gwÓøÂó –=¢Ö®&Œo”ÌH;{Î\Ä5]>[²diÄü½0íçuëÖOá¬_Äð¬Ç¦pA³fM«¿b„UéÏ!!H·9„=)û@dD¤‰ŽaŠtBBPëV­#5nToûŽmÇoß¶c)u‘ªR&P‘Àe—¿èÑaÃ.ŠmÖ¤…Õ1ùc餢3ÇìA޳ŸQŸi½¦Y³&¦oß~&4,]*ÓÌ_8?çùçžÿ—Ë@Zæål¦8I×?ÝýT›+¯0ÓrZR‘.|ÿ3÷F¤b‚Òƒµ2ÄÄ’±¨)´”“oÔ§lÙ”-¸$«»WGuMپìþú+³á£ÂÍ&µˆlÅÂÕ[4w/¦Àï,ælb=€ešÅ¡yƒª”ÕŠ6¯‡Ï¿¨ÙÞÊ(Éñ†¬^IÀÐAÇBpÁÛo›Õ_~•¿­ó<›Ÿ#ÀùûWÀ;wÜ9jèÑG ‰Ž©Ë5¹ûL**LDzQm•…éæ+•kÑĦý65óÍqãÖ.Y²ìlž¼°ØO÷ᆊ’j7oÑìÌåoÔ,±EP:èçŸ'˜Ú5‰JkÐ1)’(¯‹Ø#qI‰cnÞ¼ÕüñÇlrÍ75¡ŒDGÇ…‡‡Õš8q"SÞs¦xy×ÿìá<ƒx­€žÖçœSh@óoûû™ˆ3MÄSàL{øú ±ÔwbÉì.7Þhº^{©O8n4#®'ZªÎäÛG™Eèñ5!ž‚tJ aØ9êu'ø¨þ„ï!س•ŠbÓ÷ßãBK51¸øÂlÕÌC4ÊV'Ú1Û‰aîÂ>¼ùYÞ=ò"l%8iïúuVü€Åð<”çïCa‹›HÜpYÕžF­h¸^=Í^b'ÜãòžÏöRp'8,¦NȹpîÕW_uç±ƒŽ­ZMâþœ9·²SùMß³fš¦¯ÔuIûö›Y³fZAnñ ‚œ ŽŠ©Zuê”i-(î#°¤õÈ«NÁME1€«0øÖ®uûH¢# £¸iÖ´™Å C |¹Ìlñ3‡ÉiOäCUèçB\N-qùk~xÈŽ;š®^µz¯–îx½`öoßYø!ÀNäôe¾~ §ÄŽK ¾ô²ÙÅ\vàVþIï½k:ag1+4Ø~G÷rpí²äÿ³Ô†U$ŸÜ»qƒ©5;U¨´ ç7ÀpV­!À¨\C€yHÒÂÅfã÷?éÚEM«Cü@=B‹j‚åz‚Ôuë­à¤4ˆRqþe™ŸpÿªÕ&ý—_LuT$Þ?“¦˜X&i®„b;ĸ¶Ò§²ˆÞtƒ0~KjTÜÀ¯`½c…APçÎÇ 2¤Y|ƒîÎ1þÅôíÈ(£5+dà–­É²7å‘uQ­‘ÐØ²ì\ ñ¬½Lb‘ꬭ°„‡-/ì%9WQ à‹/¹¨U|ý„àMŒ aUÈ`ƒŠfMžÐËȧ¶A/C$ÚoKÆ& aéƒJ¤Ý½wwØï³~ŸÃevãˆ:^ï¥û[AÄÚ@V®iqºÿuì@5™åÞÔ§Á A¦ÃȦ¾ÿúdZ÷ÓO®ÓÍÏ=Çò½»²“M¼éf“‰aȆ¸ž½LãcŽ)’qØ×µUû‰¨sC€ëçN¦ã¹ƒl;Iâ¹…9‘Ø|‰¨ß¿Ÿ©Aü@Ò:Ùv¹iýNBRPü@H5òò}JëõôÔm[ÍâO>gm‚ÅøÿW‘\%‰F§X*ˆ\¼µ j~ê)&ý{ó'<@oŽ1Z˜ïAy |…§Ÿqúm}zö®RûѪøÖ¢ÞbQø´:7í¯¾¬ï ”‡K1.R—.Ylâ¹V¡ÌYé!“&NR¼Š_š”;DµlÕ¢uêÕCåªYϨŒA$i’IM9hÍ:SChä·%µUHH.-W¯^Ã,¦qÒè¨j´Úµk‰à;æ½E[‰JW€®á½ñ§›ÓÞzÓ4`ôT£û$žÏyáÅÜ™W`ÛWšã_zÑ´Àê­¸ÿªuëæ{T:ö _@ïµêûò‰ç¡ˆ‰.îÝ™ÆÕÈÈÚ~G½ù?ÓˆtåÞ uíZ3ïλÍÜƘ}+¼{2t¿¤›º]:›¾0ݶwÞA€ŽÒ‚ ‘wéÓÏš×ßh §†ïòýH5$½*r]€º«á…Có»xyÙ€:_u•é1ØKÿ¸ˆ[å=*NçéÙ ~\dšþBJ1'aÀ–;Pϱˆ?˜"Õ'ó6Á!A¨¾!¦q“&Ö‚*Uˆmˆ‹‹  ¨Ï÷;½ºFH //hØ¡cû°l>ýr –~5€¸d8¢mÂmÑ´•4 n)÷‰TYMCáÚ[·m3©S,Šè.TÐИ†¤™w@L\ÐùÖ[M» /ð¨c».*æŽtíĉf‡#â,«}[&±Xœ=¯¿ïÃáۿ̯įòSçfý÷>ç£L÷Ûn-0÷ß]WOóç._!y?áUPfjc´kŒÏÉ\ìs~ßÒ¸ÕðHt=ÚteD”åÞ¨Ón yçô˯4k´ú¹ü¼e*[‘¼ }ǽabO<Þó»ðw5kÄH³ø7L*qüÖèèµ`ßNHµ¨Þ²…wâwkó¸W_1 wõ1qåvnÇ=þÄ>Äè.·öž½{,w¶âXöaí—Å}:%…à6Ô++L˜­Ô\å]*Ú•9æ @åÔ´fs{µbus¬°uùòèR"i-àAÄ @ÏÒÑøþÁÍ›rÁÖÍf݆ufûömVƒiV•¤”›ùW%$íÛ—EŠmÞc¿˜øÁ€çž3-ˆnËå ö™ÒoÕñ]–åèðÕ÷›žpbNíž°ó#{Q†¿LÚYú*Ê»t»áz†˜^ž£UÂ~´cR›+°É¨–=û<"ü f+î6EDz’Št5ÊtG5ˆ"G¡7XÿÑÇæ·Ë® àh·KÊìx}\q½¸ßSùúOƒEÒ F¼}©))h²d Ƹ§x–¤ýû,âßC¼ˆ> n,j¼Ü~¹L!™„¶ÊŽœÛ×e$¤ ˜;vJôKòT©Ò+ÀæJS˜÷îý{Þ?«÷8P?:ªZHF¥¹sþ´Ä!‰üáˆø– €;‰¨,Ë% ˆ#J£ óxTŽe)…qh¨lr2:1'‘ˆ¶²1EÀÝqá)¾ÿŸç¥ÓÏB‘tî ñ× ûVÞ™ádæ¯—Çæ«w³ÁƒM~ó Ú:$2Š­eêñB€×#X–k· ¥"bÿ}×h£ø–—\lj´çÊ Ð£ëtêhú’6}ÓÔifùk¯á…(ÊQ£s'k#/¥”Ùa‹èðDy|¦/8ÝËyë0e,ß±sg:3V‰o‹°Fyüä÷·æ î§©A?Ù¹{—9Àˆ¯ó!2‚ z³ûù´©Óiµ¹°g–äœ×·,IaŸ'¾{®=jÔ¨Y¾!­2Üq±žÌ:Ü ðCïÁm£!uA†Aá.ÄBÅu“Õ`ùä£O1°îbg ‘1t¼~÷Œö!]v1jëviŒHK`7F·•Y¸5±ôžfÀIZX8nœ‹ %¨´¿{’Xº;plÔ)fá«r`ä‚ô×£yØŠ(´UÔVö õê1õøàþB\||·05Ši´/,qŠ? ÉWÌ“-?ЙïèÏb_Ú.Õk5ž›Y£(é{7)ROœýK+R!à‹;uê©Ö°Í¨¶*ËÖù•Ôf騔>\R¯úºúˆúyyQÅÈ"d6oÚ”òãä'¯PQ `-úÍÐnݻ֨[»nôø¥‹‰ŒR#¡ HøÍøï¾¡Ed!µ 3qôqÝ»Ù?Ët«PßF­¼¹¯ô±2ùĽU.»v— Ïo…Ϋ¡rþrÃV°Š]éηÜbc«L;E˜0\FgËÅGfbODðrËŇ«±°HF+~—a쀣Mß8yõjk‚’Œ‡åò>leÎÄï_—üïÓÖó_DåSß\»v­]Æì<¢ï˜ü€Î]:5­W/6¸Ní:f*Ñ’Á²å jš™øùg´rÕ*‹1D£j¥“?@ƒaoÜÈ©©Éæ×‰w-Z¸øAž·ô+T؇¡/¬~ƒ¸®,¡dÅH‹®Äµ$q_Aõå6÷”È$ÎW?Ö‡h¯$‹k×­É~íÕ7V$íKzqÿÚ`hªßЯThažFó¼¤.,ûê+“a[ÿùðm=v×çÅ(–|ü‰Ù0a‚ëQJ:ÚCœ»'ÁuAEîP_Å(~ ’UŠvãâÊɳ^;«¥èHÍ/Ø:kù|‹ˆC…¨ s‰íÕ«PéÁùœRíó.IH-³ŸxÒü ñ@•qÂ=iΙúÜøñ.7¼ÜÍ7:¯ußg$߀ëŒöÚG)n…”õfÆôxB,àüó-B×$%õóƒH‘ôÿ4 §¯"M`Õê•É/<÷’:†l~‡Šbz‘Ùèþ›4N¨¿´u«6ÕV²Kï—ûŸeˆF¿>Ñ€ ևظicö¯½±yÙ²å#(gx¹ 4Bœ¬µ2€À’O>1é¨26´bÖaÔ'$;ùÆ›òMRéK€Q]TÊ –».þ”“ bšÙû÷?«›‰8«üûÖo0qýûj3¬ s)LuðøT,Ç*\““®»ÞìÁøê >ãPß®½öZ«jPúQ™˜Íþ_Žßžvׯ]»Ž`Þª[´h΂KõXJ¼•Y†KpÛö­V€›:ì]šôÖ±ÿ,MÍF%Ú¼ecú³Ï¼°œAî2.ñ»PÏ­H ë§™3f5«Ù€Ñ=B‹*òhþòƒŠ¨QFŽašÐ0J¶`áüƒ¯¾òÚú ^Çý¿€ ]»„_bÀ¨Ø°o?íV<ðq¼ý–•Ô®L3üæší礂¹w/Xà:Gž.W_åѮຨí„Òy뢖ŠÈ—d“²r•G;GãÁç’ÐTy/*ö¢fL¿ï~³dÜ›.MµÒH7I]Dì°wè·@èóÏ?oíçý·›ì<àeÿ·ùÿÌ'À§YbbcLuƒº¡¢²5‹èë=C @“àÎ&½)ÃÌò•ËSž~ê¹Öo¸”K–[–Á¿Šdz ð[¼»™ñ×2(('jÒ0þ6PÃ4iÖ8gã¦M©_ýõî±/½ò+yÞ®ä>{ž´Ðç€q ÙExi BnËcÑó F³êL¤Ù¶d±Éȳr7!Ø$šXp¶!>ÿñðÃöOËHtÔ£Þ³¹.,dG£¨ån„¹”ð¬p$›Hi5qî#ß\µYSÓîÚk*œ©e`cXþå—fò5×´6_ó\À”ð>øÀœþù–­ÉyRkô°I#äÙ%«øãÙç\Öfo‰ ^Çö%¾o!ÀÝ•¶ÏŸoö`PÊÎÌ"¹¥•X¤6 CÝ]’¾\ü+k“¶»ÿK/˜Ó¦™¥ÏìÄÆ ø}äñê:=zXÁDbD–dàñ*ÿ”$"Œ4bªpyæp¾¶,ýìsó7#¸\pN¸ì²ËŒ }šf^ÈUÍB¤ÎKnä‡OaÁΛòöå²¾è¸ãŽ{ ñ?H}]ËÚIÚµf-2aÃUÌ’ýÄý~=Ta*>ÏàN:ÉB ãÑóÛÉ*·Ÿ˜€-i+îˆaðmÞz}!ožÆ¹=à™ö5°<7pL‰³üØåøs+㟔Eç×#ó1(«sªcÄt7z«G2+M&²nãO‡<îצa¹ê«¯M¬n‡Ötk÷kÊê·$•'ãq¾Ë6’ÌL&#ÓZYð*‘Äí÷Þ{ϰ„<ú¸Ã&ã¼Ù±?›(ÇÉêäÒ«¿‹³+q"ªuëÖ—!úóY"¬>/[€¼±±±5:›@V7šÄ<‚¬â^œk+„@ìQŸþùÃûÑé(–íþq¼>ˆ^ÌFûÅÄaY#l©sV1Y¢/¿_õÇ‹QÆJ=Y׈!¸ ƒ…3áê?b…ßL¬º¿ÓP¹TÂÅÿ7gD?÷‡ïM[tOªâhvòÉ–+K®?'Tcî€7Pçßãp‚»KNa±òLì "qáØrU&æè¬»ö•Š|“ÆŸs®Yû5~œtÒIï’‘±Oþõ’‚r<àÌù˜[ÐãlÊByÚ²lÙ² —‡‘X@*#ñ‹^D;ÚbˆíÛ·ï/Ø2îDM.ÕVª›½5,ÄŒ±år¸ÙsuëÖ’X# Ž&ý^"?‰>¶+çÖÕ/0ª§ïõVf)WáþËÀÀzîe5!=xGüÁ¶‹Îý|…þ¦Í¶"ÖN…aEglÀ$üÚ³ï¿ßÚ׿¡ •éפlÛn¾`Ñ‘l¼M4:÷›ñÖ =M´ZóóÏæïW^5P lPLB»‘#L«sÏ­TC1³=+W™¹/½d6Qo'èÜØ±c Aeység‹¿ÿî»ï©jy"(7^YÂ)Ç{ì;H.uä®T8¼ ‚R l:ƒ`íA1ºo0–_ÂD¥y üÎDü„LŽª]³æÃ:v Vž³mÛ·¹*..–'î$„t8Þí0„JÛšgœqFp•Ȱt‚˜ì윿>ÿô‹ÝyeJÊiŠ È&pxº@ôÎ7Ýh­0k-– áU c§ %ƒ¡=ro™;×ü|épWOþðS)µ€÷økì+f„aCç[o1‘,dHœýäSf%–¼r"q‡‚ªÜƒh¼ÝSVÇ3QW~lΘ‡ ÔE3ídÝ×̽ÜD¥«…òQ0ÊZÓÒóJ’º?(w´üÊú-)Ó2ÈM:¥.Fºaaá:¦Ò烥éD L{ÿi¦_+2N‰ ¸3MÖjZÓ-YÊ º†ú üÎX ñäîݺ}Û¿oßU.„,?äí7‹—.¶$ÿ"B2Ñõ× ö‹g«ÆnzQAw‡„†‡¹Ô””Ìúì“/ˆ²1ƒ§€Îg٤DžƒÝÁ|mµ]K‚+~ 0<÷U(ˆx¿Dü=ˆ,¨Ç4ÚAO?mªXYdr«¦[=ág3`d?8ƒ•´.Â\²/zýuû”kKǵ¾•ë;§~ö©©ƒ­¢`'F¸9Ï)ŒwF¾*hD”¡Ÿº5ȈøÅ0˜å»®8?$fÓÍC=ä¼m?‚ξ”ÁïoÁÑŸñÙ¸ÄÄľi¤'ÃuÙ€Ãr}›6msgüpQ œ2;ýôÓoêÓ§O°ÖÔû Z\eI—íß·ß|ðþ«n¾íæžÐ€=ðùô8¿{]ž¿è [¡¬X|YØKc°ÙEÊ£í;¶Œ*9ß~ûíw0“©¡8¨¯ \òoP ¿wè…COhØ0~RÝ:ue¡H%`̳-$,Y¼ô|®é ºÛ9ô»¨ù5ºÅÌ}IfD³}é2–ìÆõÆNDe+®IS+!§ê–̈µfò”ÜZHYJ\ºôóÏÍŒ–Nètã ¦ a¹š„4ëž{§L눛£Ìt!©JK²…£RlcérÁžuk­¢ÝØ´€jyl‹>øÐüvÛL²Û*FÇ7¯ÃÀäÓ—:)P(í)¨;ö<’’ÔSKÔIôÏLì"j°ãÞ—D?mÀóŸ7¸•fø)¹ ¢y0^¬Äé3~» Uë–ÍûëïÕC‡MÄyÔÀp~3†¢¢€•ÖöOøóÏ?çSúzC&È’ÂæGÊyõË*¨×ÙYÙ¦~½úµ.^Šý ¿^TÄüÊ$þ3ƒé±–­ZV!† GÊ\r5`=«Á|øñ‡ß}÷Ý]ýn¤^©EÔÍušÆ»ôꫯþòÎ;ï¼å†n§†¸Ò¥sç·jת¥UƒH”J*=WRÆŠå+#]xßÑÇ“úñ+Ø t©Ö­3+¿øÂ$¢Pkó)]teÅD%Ä› “¤šÂ1 ®a~ûÒ?2ËëmâµëÝøôÓLFG÷f1ãp¿Ã“ ôéÝ®¿Î AVì€föÉ#¡%Ó·¤”²i³ÙºpYBtݘ@-F (˜c™©ÔQLj„¿K>Ôh¿†Eä è¹Té¸ÄLwêÙœ~ð"™s±YèXIAö©Û""òÎkõPÁs"ÏÙ@›ïÈȨ*ÂDòµˆR3eÍß¹kg$߰ƉS.8ÿ‚÷zõêu9uN@Ò껋U€ÿöúü'ˆ^ú9L®/6µ†½XßB± ’æ$ek­ÌÌôL-š9yÊä×òßZø/§8Sø•¾ÍCU9ùžµÍ‚; ` 9¸dÎa÷;ë€oÿB™¬ñ"zÐÈöíÛ+ D :ÔY²lñ#±õbƒ´F¼5BÓaø³ wQßÀUÛƒï.¥–¸Úe)½VâêJ§Ð 2" ggäÚ -BR•‘g&¹SÖ¬õZ—fŒè=!r¹“I7;–õ®Nhp[•x‚̛ǒÚ ÷-Ì•f7³ÔÖŒ’g|ò±—àé¾ÒÓ"-à¹èõ7 s[‰ç è±Aý¬3ìc‹Èö¹ân']éæösÑ ÌsZ$“Çnfnů0 Ž>ý ³’¨û Ç›Î];çöK¤˜äØ ÄkYò™{¾‰A¼÷£>zðEXÍêÅGoÚ´é¹!ƒ_E¢A»|kÕ÷‰#íR1ÁÕÑ‹yŸÇË!ÄœÇ}l+CLœÅ¡ H£*èßt7z>4xðàWN8á„+˜4d¿Ê«T—ðYq@åLÈ%þ\ ˆºb€¤ {À‹ÀKÀqà â,Pêë9cÆXóÈ»#BË æ) ¨}}yo’;îÌ?´Ö”‘l;¡°rmÊ`Ø·aËsÏ1õ%Õ^‚¤awBGDoù´€g$" *†úA„Z¬4ïÛ:O•x_uÞ2gŽùù ÝÄý&¸@‘­)»2ŠyÉJDåYA?Î2Ô£ŽAÒyÂo//‹úrnνŒýh:ßÅH B8yŽ%ãnÁKÓ«W{&ª‚œ*‰˜ïD߉* ÙUvHÄqV ÿþAÀÝtö‘ؼø¼¬¡)£B …Åöø•¨®Xüw‹] @Å  ¶Œ÷꺢ÃÎ(ô¥Ë±„¹ÇmKÌWƒê®µÕ¶<{u•¢žá8¯áïzPu› öÅ e+°`ÆË‰W]m! (êNëÊUdÒì´ÓLsrÉ¥aÇŸ<„•pÂ=D<º/⡹Þ‡´QŒ€âa*ñGeu:çñïÓa’Y^£þ2\oîp yñò¾FÒ²©¶è_•¾uLç ŒõšxÙ\ôòð ÎA–¡ PÇ^âEi\ý79ÿäÊ6‘Ú·‹p‰óêÝ»÷0åÄÀɃH¹•sp§<ˆü\40ùôýïà ìNüº[aÄÖ²aedÃÉý—[¶ 1ŵÉà'y÷e°•$ðx'xH/È…õÌ-XÏ¢–X´5yûe(´:ˆ}AEmé„ê ,DoŒÐ ¸O5Ö¬Bo ÔYij9¡Ëˆ+sí;΃%Ü×B"ZyÆýh9¡>aÏwÝu—iä)åÓÓdNYÀ’%K 6&S“Qõ6Ü©ÿaî•<‰©°o›B_KðÔí,,ú%Sϳk8&|í’e¦Yó¦V싾4‚£Êã¾{£ø $YÎó^ökÈð§%ò¤f«È<÷bl¼H/…¹[5½\æûaV÷Ù'_¿FgÍò@JІð_Å›Àšˆù|píòd¨±8 ϰTŒ³êj‚$JõÝa7Frþâ,´ü–?dˆY‰Ø-õá5U©Ì—1ýX„ÜA#ÿüqoæ;ÜþÚkü#ùðÁ” e^Š)×ßøõ½eØ;ž¯2¦©/‰øí>•¯B¥ü¡€´ëñz €è߯ï¿Én4Æ<ñ{)}ì\’M™ÑâiŸ ÚįÛú=p§‘æ[}V`Óƒ¶zOõc~" ï}•ÓU­‹ ÿWÕfºWåØ %5…ðÍâßKm•5^i½lž ÀW 11ñÖO<±-âQÂ׫©L¸‹Ðäï<ûg‰·v6ÞñgŸcVãªt‚ýl²âjíéô²ìË(G܈åÝq^[š}¹ OCeêÉ´èó±ol'ô|1FúWa°F. ‡œ‰ºr5± ’¹=*C£Ý,ô«WŠ ¤¹ˆ_çöÀ&×%ÙÚÓ÷oÉ=SèÿÈð°p— ÈZ¹5èâ Ë/BZLîI¿«ˆ5{åöSЂ*¦µüD´¬î+æ[Dã*¹¹k×®–Cת‘lP9‚ Œ|¶D€8€ÅlòÎg¦—HK°0ÐÃE “Á%`è‚Ì1þnZ\p¾i1k4nä:WYv$nKÜW›¶"ˆH!µ+0 ”wéÛï­s¨õ÷/]fµ©³î½î¾Ërý9g_ÏU¾Â? ãÝH¬…;ÜÈ’k0+\œqÃD2ëuò/pÉ5j† q)5—¾qA}DAhXÑMc"+Ÿcöe« /ÌUßòúŽ·2— ‰\Lèq"á·ÏsQ¼· ÝŽ÷âwÒ¡ë]º!YØ`÷e»cßF ¸uà]®ÉoqµobK€Sœ;‰¢­,$7ÑY&³‘rƒ!×µëw€À¢&äˆøÉm/€–÷ªV!R$‚ÖTØ£@#´KÇ´¯õÖm À2r\«­Ø 7, Èûræ#~ç]+XÔr姸 oÿiAN«âRiç%å¿ON½ën³¬ùZ»¯Ïw˜ž·ÝjùóçA˜Åì@Yá÷šöš¯žµXŸ0‘…@J Zrki¹æÕ}ò•Bn™ÝfEïéûj:¬RrËóC܈(¬~ ¥â”¼³1xˆŠÌãg×UejVàŒ‰ƒ±+LËS‡gXߥo£¯6IèLêp1}y"¿ íÀö[I×Ò®ÂhÏ:ë,댳?Ûj$dÞ¹3ogRÐŽ"òí¶iÕ¦–¢î³€FÿŒ¬ ÙÆ*Þ€¨³_A9Nâ× ‹`!æÈ|o“ÿG#Fþ‹Ðá6—T9B•¯Àj<:7罓Y‰µà‹:T›r²ËÖó.ªtÒvuNüÏÇ7ß\t±Y÷ëD“ífE·ï/·-mÖˆe·²_Õ~Ëß{ß$B¬|þ­™F|¡Á}}Ä´"ú-þ¤­e¼Õ¦Nè~+ã/ (wÁÏ,¾ñÇæ#~¸ o÷Þ{¯,âVÝT¾Úׯ¥Ü£ºüòËóÅ÷kñüçŠ*-´:"”'Ÿ|ÒDÑ÷Öpý&¤‡±Œúuä.¤¼†/a:Á,Q>Ʊâ‰cÅ%~»üžì4@z#SûÛ }g¿Qø24p ç½ Mš4‰ÊÊÈ])K@’ôžÂ­[·&Ûeûºõ¥ÓûZ–uQPÛ eK6#Á§;´,1ƒßÍŒÕÄ Õ(Nt¿\ ßuˆDYÙ‡Fýýû‹Ýîðô[q?èRc”?•ÅJ¥Œ1ÚwB ‘vSk'Ý>Êìd­¼Â:󾲨oˆ;«:Á2Ù)4 è k0 ”dDE}îeŽc}dm"£U³%µjq!©b>ºò÷ƒÏ3;åÓ³Š9•éÎ/¡ ñÛUPôb¾³$„|ÐÒÙ5dÐuž@†½áÇ›xV+l)H78æÆÔÜïMç_E …ðì¤u7æ~a1ëþ¨ÖÑ;™€ú¹ý[Œ>T½Aƒy{‘„U,‚WôŸr32É¢… @ MT*ä¶f±n)übÜ5;aô±ì ›ø%ªˆ@äõ•ö;ê2™a(£À¹tÄ~1û\¡[T"£r3©Zú¤©gÙ| L@Êi?CT¾i}@=[“Q$ 0ÁÉÞ…4B¨æ4 íß~Q{ëäj4¡b©ˆÿÖŸ% é/¡Ð~¤§­åÓ ²c.(*M¡zž ª«:èÛŒz )ÕÜt'cZLfÙ¥|`z޾Û4eBŽ·è;»<ok·imN~ï]ó>÷ýˆåûñ}O¾ö:£©ÐŠö“¿_j‚z²D·fú ù–‹?úÈr‘ºßƒÇгW~g»Ù׉‰Òùퟷš'{³]•²û|¼âÐb;hDh3È%~¥äÜÆ@r 1KÔÞäÐ#…\[ÚSó)`ÏkŽAõ×û Õgܸº×\sÍ0\êØT”Íä¤ñ ,x™ë&bS«£Q_ô$ûšúúATÃ~ÿã¹ìá·ß%f/ÀåÈsŠ[A0GóòKßBdÐ ìÎà©1ì:Û ¦ß õµm–À1[PC”QrÁ†rèû°ôS¥™²ëm×VÇ41D1ëbŸ~ú©5bÙ×(øïÌÂ[öù,Öqƒ©ß£»+¢Ë¾¦,·ZàÔqÿ³V-þû™Ü…2´šR ú©;´Æ5¦¹¾€ÔŠ-sæš™,s–Œ¥ß 2êjaWÍÙ'ƒ• F}ïmÐ9_§ðªŸèû+¯ÿõ×\c®¡ÌG•ˆÉSøv±·Ü»)ôªÉ“MUžd&¯òËÕâP¦?a4—ç9ܨê+žú¼Œz:®†°÷`fždt6QŠÓ’S’k)ÒÕ¢hKƒ¡0Ïî–ÂcŠ~gˆç;™m©âP–¥ñDF¨-ÝM„o½Çì­§ZÛçì­®Ñ~/,÷Ÿ 4–Mø™EJÞz füCƒƒ>ÌpôKe9* 4B)’Mi©Ð"ëµ\P6ìADþ• “D,ÃÊFT³y3ûT™o%î뙉ˆÉ+YŸ~ FÁLÜ\6(H¨ÇÝw™–øã‹œó@{¤@H Æ¥o¾eáÚ^|ñÅÕa4³Ž©s3šF6ËÈ'ãŸÚI Á1¸ ÊÛш§4]?òˆy¦² •&”:øóPË.@2ëªó7ø¦púRrþkä„~ TøèCàTp2؃X-}§6( ,«>ï©>­}õ%©;ÄH-]_#~xN¸uyÛòH-rGÔ w;çw0jÔ¨û“ö‹äºÅ´áŠøõB6A»oíºÙÇõ[ûNPYè=ÁÁ¹!ìs6»„àí«ÜEyì2¥‡z3>Ù×8·ª¿‚[dPzim¥"Ù°–åÁ„]pɵ„hòMyA5Yé”í/ºÈJ© ceÑJM3V–b÷¶w¯—Fýõ¬_0sÌC&&à„ÄÄD‹ù©­dÜÒDͳ·m#j-´!F å¹Š"~EÊ0Wâçäü{H¹Ýú†óùö¾zÏÏØN‚ÑÝËþŸ 7K´}OI·û¹ñ>ðYp(ÂWo<N仾5th¾¾Ïaï-Q³ÓV}ÞÆˆªÖ´w‹1Ð×ñ¹[er^5ÿGЊ€à"Îû4K+“œ59ÝéPeêÚ·QÌf:¯ßE¡Å°z:™¾î±Ÿ¡ó%O eÒš$d)C”D{½‡/Ç•­KeðB·³ÄVIî~ÞÓϘ/ÏlåçËÂËQn@Û…c˜«þ­ƒu;´·r¨M½ê~€}:¶…ñº¿õ¢™Âm½§Ê’qK’²÷8¥'RÅ›'žxÂ(ÿž˜„;ˆAtAå:÷ðÄþÝHMƒd'(¤~*CŠàÛË—[®¼¿FåÁ² þu”{:8ìN›‚ê‰2ŠDÒ¶ê?vÿæµooí­¾l¿€“ hMMO5)i)&å`ŠåP\£W¶Äýöü.èÁp¥d1R/%‚”~®}U^.B½ uÚ*û•°+'ŠØ/@òÝ}µ„*kèÄùÅÙœ/¤óB5†§}ûœÝXú­2:¦æVf[r¡ý«X[w ë׉v êÔÁ}V6²D}0ÝÓR¤çJÐ;Èख़n }}ùå—]a¯*ûôæG°Õ¥—˜vÊp[Èt]_ëSÚëÔq53PyùäÒt‚:¥òð ¦ hîwq^‘_ne4¥H?; GƬ1ä]PŒÀ}„û®FÝŠ²¥­"}âNRwãS7:ÿ#ýöK=í[ðlðjðEP#…ÀIøúmþâWξ»Úʽ¯;ëõa›N´/zÑqm†S=îÛkïg[& `ÇÎÛr²rZZ/–7QA•RçXl¿”½ÕËéZO¨sû5‚îä^/À!±ß¹o]äû?§ÜÍmƒ®áWb­D8_A9åmPqÑh¹3+Ž]†/”P£¦+'Yb³ýnºwÙ;ïZQ{=pÅ5#ÏDõŠÍÐŒÇ?“/âRu‘u_:¼¯|Yï5ÑG}A(uH1Z{oî¼×ýÃMVÔ¤»6bK¸š¶ÓÌÂ×9øŠ}ÂÏ[·*_1º÷ƒS@w‚ç Ôqv€ý›Æ7°Flõ§àÞ·íþo÷qõ›FtL¨6ó´ëOÇ‹:V  Á†ººñߖĽdüñôbzyû÷­ý:.Tä“@ûú N¢‘aª„à¡n£Œæv9ZhB¶8 `¬ßZWž5à¬[媑áËfvà“>ªF=Mýꫯ +'[ÌM7é}Dx QzQذOùf#Ú ÓšMJ0oÙx‰é°bö}i›øí´Ý2*pg3„ÿƱǚ~¨¼x.V ŒsËáH"íØ¾Åµu »¾çä¹”Tq?8Ìíuìxþ.P£ÇŠZ5Mß~}¬Q[S‚ýÚÞ·‰^¿íc"t§`3óÆècrjHè8$ó£(ð; ßå|í 4ÉC€Íál®f_ë‰ è˜À¾Æ¾yá'è:­ýWB°}¨Í¸_ ÀuZ’’Z~gû˜¯[%±P¨«ô]Ín¨ãkzkbb¢e(³Cº^¹í¥j¼óÎ;F.6¤0¯|ÁGŠÕWNÿÚÕ”%(Œw9Ìè¯ÇŸp1#ûyš¯A̺Eøz=é˜,þÞ:¨F>EùÉB‚K‹á5'd÷uÞµ)jŽO„O¦3eùLlWA "Fße2»ö¾m7rÙHP£øí๠z¢·áE„¯{Æ€A­[™á—]j}gC«¿K½Qv¢;ñÛçœ À¦{«þè ˜ ~‹kļêé¼·cþf 1ò\."׌@Í´¦)æ¹æÔ9Ôzq›«Ù/¦ Ú  ­Í ´ï›¬ëåëçkØ×9gÿ• ˜Ý6’ôż]²öÈ‘#K•eV:Ÿ$‚9 ³¼®iÕ[µír:c´/_7I -µÀißøÓ#lÍÕ¦5£§2óúÆû^‰Ý¸íœ F¥0^BÉ:/IFß@ ßzYþÅ ÜÃ|eCCSºíó0Œþ‰¨_×ÀÊÖö=eŸIøòsìKÖ ËôÆçƒmÁ@[àΆ8àê0KÁ»Áú0À·‰öܳ—©Y£ƒ¬À®«ÕïÕwÕ.N·÷[]gÓ‡¶Î}o ϵ|ºÛ³\õpßñ+àÃß ˜~1€ÌÈ‹ŠŽ²€^N /€FA…ħ˜ãlu*íãöo«q²œ61“Cï«Æ*!hx>TЖ"\7Ú? lõñm°;H­¹óÌÞÎL¶Ý¹ó.лË 2e°çºë}ìÀÍs—•\ OE.3Ý#oÂLP±‰ME.d)¯Åo½mzߟ5M7Ì‹nh×Ï—­òΧÌùLÒ±FdÇM,Na."^@î¼5¶}s+Ñ?ŒtÜKFÝdêÿ4Ñ,»õ:;išiþÆ;æ÷q/™¬ª¶6y订ìRdX³íj1…ÇÜ œQ´æ¾Û°æË/°ÉÙg™&'ždª“–,ŠÙs¡¨è]¹DHJXòÿöÎÀªâúÿgÙ¾° HW„¥KQP±7ì 5ö’XbILâOMb‰É_&šhlQ£‚…(jbŒ(b»F,Ø Å‚J‘²KgÙÿ÷3÷ÍÛûÞ¾÷ö½·Esœ½sï;3÷¼9gÎ9sfî*ÖKŰsS[åpô¿eQ>4 |Ï]Hñ‡M:.¸àÛS Þ”ºßÍC²a|Õ5KÀdßwP_¸Ne#‰7ÌU¡¨øŸ ÏzÇ^›êbP Ë7 '„®§K®QpýÏõMõÏ0݈Œ îÚA¸'§Éç5iŽ^{H7úÓínÖÑ:ù}øBºtÁ€lÜýéÔ¼@]}k8/çÈK±ÕÑÄJ&„?÷B *£æ¢f‰È:rÝÃJiyBœÌkcßfÎß!AV´ý¶öîiÖÿÆ[mÆ™?µ-û+Õª³Õ;YƒìB Ht)^¡iPÍ ‡ÁûjkkÀKsÞÿÌ…YàãФиF ûÙ‡;ÛìÝo À×}Û÷íc)E´_½l©}1ó]«—/üŒoe_¬}xùÿ¿Ÿ|Ä„9Uë NRxî­e¨ö^j˜?ˆñ_Rðòo¨ß”Us5™ò·âÞ4=ûc!¿è)B<¼´.] a|Œ™«„O³¶ªcÀƒnôK÷/F®yíÕÝ×ußç9†Ñ ÿ ÏÞÿ’ª=š_Æõ¥ €-ŤNýGÐp-[LPÿ}ë˜BUôÜ_ç˜LÎA/í.ªJ¶¨‘°Ê€°¾>GÞ@•ý¶>|‘-àÙ[v.ƒÑù‹+/µš·gÚgûìa›>ô¨uœþ¦µãwlªm:q²}|èw¬n@?[Ù½k3G!ö>Ž?v¬eá BÀLòñ0&ñt:Ä©üØáÿÐ|‚‰’aÊXôÊ«“ï%Ÿ#€pÖ±.º·ülÙuÝ%ß³ËοÍNZ5Ôªcû9¦{É$i6£5â_&º¼£ŒxL÷D~×iý$áBFý? ‹…@&Ƈ0 ¹›Ý°E Ì*X©&*ß§ýÑ ð9ÏÃðþè€i*3HùØšÐõ­•î"d3#H/l=È©·'/‚ÀˆHƒ9r-°'©"ðÒŽ€±´¿æ™Ÿ{hÈ8"«®yX¥Ñ¤5À4B*àgNà&Nœ¨Ï ¿c‹õ·ù»ílÓ/¹À9]}ƒ•/\d%Ú©hþ¨]møo~çÒm? ¼çÉu!„˜} B.ìõÅ?ð¨aÀš #4fƒ öÖc‹-<õ8.³Êày¶ÈÆïÁo÷°|Ä-ð¦~— /¼ÐnüÃ1vøþ#í?]dǽò´ÍV»R¿Ð8 Ë6úšïBúkõ›­k…f~ZŒ³¿*œ"<"v®CJ`ÄŸ#dýh³§ÄüÏ(™3  y ú+S=KÖ¹ž ù=éÏ^õ÷ÌÏ5¿Ynrà RÀ¨ך]Š«½ÍîäpA¶É0¿Ÿ£äÈy*ÈäP †æœ#DñžsW-ˆï=èë"â*_ 6Dà”ddÏÄÔ€ÅAh30mƒq¼ÊŽãî¿×^ak¶Ëq'Ú‚]v°Úqÿ°âU«mØE—ÛòZ}]ömEÏæV/šŒÉ´ ± ¨sä$£Îpü4gÇ®±c.6!jáÚœƒµøœó>ÌB¶Ë,&HÇ¢|¦ï¨ºs>kÖ,7ç_+Í€ö„Í61fGÛ{ç¡Äb[÷Mªí¾ñ¿±p©Ý>dGB|9çrÍvüVÍd€ H,)\jþi{ Ç /NzÖS2%ÐŽéÂßµd÷n°` s46ßo üïå *j®×çOîû®…AºuäI;éÚ=)®'\*ˆPCGx#À8øRAxD ߇X¾ó%…é%®yÿ‚c|‡cx–ò˜ù£(Žõ=#{Â*œE-ij¤Ußp«ìh+,pAeÃNgോÏ×l€ÎϾÀ¦_tžm~ß6óô“⥕¯Xi5ZS¿ Omü ~t¾„‹0`¶À;{ G*ÿ&G€áL¼‡gdò…5 Ôóö$ƒ`$óú¬l˜…ØoÇ.ö½ÃvÓt,@W Gï:Ïö>òÿÙeýFØ=Ò†ž“¯a¬n_ËSèÃ\ø3á‡Â_ Âø™˜ŸÿIáï…j=Ö>ÁpÇI$Žnfh„lHî¿"y ‚º§BßÇ8ò¼^à˜.Ê’ü)`Ûך]*„(Vã#‹;Ð9ÓA2aÏ~pÊ_ìR1ÿßü_VyÇ û qìU &Šçá¿Ü›(¼"PD`z˜?Õ#yu"Àú˜:'Ò¾¹À}Ÿ´G®ÁðÀ_C¡6'@^Û.!Sš“B€jlÞ3 Oc—d´OyÎKOŽ £¿gta`C,ú¹Ëãß©òäD­¥šöC ¼u³À3uÔ¯(¶ù_”jµWðµ|øp ú¶ E0¥G9|Ô‚z>>x´Ó`º¿ó®u‘“î1ß³uš®#ž`ÄM·:³`ÖÞ{ÚêÀ¤<ü©„@½GcHg/¶Dh -í1Ð2 9@ Rךåöç‹OpíLWVûöíì°£÷¶Oϰ-ÒeÊã:¿ì¿…ßâØû«0›LëïÞÌê}_É ÂLW' û©øP ý9 ž©¹îûz¸¿“×_OÖÈ—Nˆ…‡«"])ì-œËI:(„9¶C]D„©*M÷䥃{P&ÌFyž`þ4~Mù<„cüµl餫Ç N9Ôj/(f̪²>«°·?¨²å+3*;³8Õ°¯½à}P¯ ’A,Úf¸už5ÇÚI³xó¨#óSWïXƒ¦ ç)ò®vò£é}ÃÀû#lÏÅæçÜf ÎHöLcú¬¼#ñû¬RÄ_€6S¬/O]ó»ZeY l'A¼ïNC Å+8Ùùfè8Ex„0S+ ÈJá_„ûê³ïbþ=”ÄçØó+KJ­€ëA/Î䢃”‡" [Ü£xŒ÷a ß÷ýÑü}ÚûØ|™þè5N:ö ¥S& !ä "û`Vá,ášÓ92ü‹{¢@$TªäëÑ €Ø4Kƒígóìù–€z Ùl3is*õ#k+ꇺj¤6öÔËíãE03¥Ç|}xVÁû\85íìý=v³Æ6—H€n6é1[:h õ~x²½{èAV!!8|ìmV#3! % s`RÔsБA€Y ó6‚lÎ;/Ûß/=Ñjªdšd];V[§3Iÿ‘»,ʨSž_ ™“¡VÏV& C!<_x œûŠ/¦dGáSÂl!/‚Ñ÷aVú.¿AÂÒtõîùþêèû:ÏÓÏ=ã“Óùϸ—x÷ŒPq]'£ÁIÈ\v*HÇhá—‡0 ’´'(Dó/ë õá—©êÎtÍê™òø{0^mŸöÉÂŽ¶lE;ë·ùJ›ôlG«,×î3éÈ;a“3·N,??‚ÄûX!çg8J5;°zÓ®îþŒc°Ÿ~fCÆß­(ÂvÎ/àNúCøUpFî¥i¼°°áwxA»ä°‡ú¨7W¨W@!Ènü…õèT“õãøP½ƒ³¹³~(–ñCî!ÜAˆÝ>@˜ èÈ *Ô³/?­ï7J6÷Ñé[Â\!ü3fý¬cÔµååpÓ¤<@yß—“¾/sä÷ä>¼ä‘rI§ã¿Ã×:nJ§LB ô%ó^¤™lÓ°€)8÷è‰Äf žH.@Äòþ@¨¿–í1WæX»¶ÑýVµ:¦}ðq„À:›3¯Â&LêbKëKì½+í³…ÃÓlsö»Ã<þ¯²/«¬°×9Úê;ob=Ÿÿ¯ ¸ëÅ:h#K™ õrÐmµ¹Hï—_i& ‰÷ì¨ýó¼°áïðñ\Ëægu¶=tóé6 w·liÊ£ö îÝÅf4ÜEÕ5ÝHŸzI·p]ÿDøC!:jÍÄtà÷„G ×G~^7ë®ü#uŠ<Èš87‡ø Ø«ÏoˆËy$`dß¹GÚnœ{ô|äJŒùIãJáݧ’î÷O:ovZP.•— ±ÒÉ@Ç<à;©#íÈA¼/ÁKJO4Ž~ÓO÷Yäãu¤¨/~¯…DK€º­a  º]ûÉqíõ#šýúÔN¶ýÈÒ!µ[Í{mmòs×$œx-ƒØ~¶¯­­Ó‡²Y"ìü²á?—}?w]í•SO¶×Çom>]`íä‰1îN«}îëþôs¦©ëñfóÁ÷ lüÔ~/̬$%‚:Ð&¾Çwõoµm¶ê‹:“){Ó=ÕoËÅ{M°Ê÷Ùˆm]@NS†Äœ&5Ý©ø×ñ2!Bm…™€Ž;Mx€ÉÔÏ‚U¹ŠãÉ}kl=“ Y¾lòcúhÓZ›½)Gs€g~hí íGŽðU:€ï“MuÅS-JíB€”Æó¶#·‰3K¼9J`Ç{Ü1öÛß¾ìÒþåQ]}Ú†#ƒŒüÌÿK/›„uÞ¿šj÷S˜Í»€ïïZ*{ÑE9f¥=Àevоm­¶g™õêÙΆ î¡©ñjëÝc•Ýûhg›òßæQ…ØÕ˜xó7 }o.ñ¨ìó‰*ÓrêÆ’bûøø#­AÇF©–UŸ}nïvˆÕ¾ð_+^½Ö:ëÛóæÌµ²é€™Âl@*ÿ€68 ¡s*`¡ï§çÝj=ÿ¶¤WàäL•¡gk—k•Í#²ºï0[8U쨀,©/ûŒèä"lš~¥ ÝuŽ=J}M¨'ía‰°%xLö— 9KÇú¦ÌÿQòá¦ÓV¥R%‹"Ýz€ê«aÚ"]ß1»g~¼á>Ïu;ï²£]páoÒjœ€M*hš¶BôI.ûäSN´oÞ/¥@¡Á»ìº³ýø„1 B€8“Çåß îÓgD €aOkfe1¡ªf'á‘2ù&‰µøñW_}µ » ¯gЧÌÎÿé&vèèbÞŽúÀFW;h¯•,öù¢2Í”«­ê1à]a~„NEïà¡a•½NÇÇ#†Û2MËÍúÎV¤¶T‹á»Ý6ÁjµÒ°FšÖùú=1Õ­9ðås¤ïØ[{î1ÏïaƒIàýþ:G¶+g‘ðÞœù¶ïQÛcϼ))ÙÔ~w÷‹éšhÓÏû—†¿ºœÈ;];–[çÔÚ'î`‘ÍJ÷ÂüS„» [ÕäÂÚöWÄc¥„pyb¸³¤ æI¬¼¥BÓß§º¼`LÔÀŒêM…@ôß0ú~Íoå‘û^0°¿}ïûÇZUÛªxi*3H 1Ìö•’Š=“ó&ŸB$˜T°Ç¨Ý¬Tê.,™ÊK[fÔ^£n‡™"xâøëž0HqEÐEc“šÝ'`& Õ‹‘4_XO¨Z¦,Íï©“^Zè¼úíšßM¸Bgœ/üð\]­Pây }fïK`{$Á¯u¾4éZkOs|ɦ꘥¢_ºiÀ­ÔüøhÏ æ€×|¿çèÀ€Á檼wû +TÛµ«v­·ÑÔ •zå*„'spî‡î¼FkÛÃ6r8Ó‡·ª~('à_<ÌôžHá#ª¿Û"£ „ˆLùBºgmòS+lþ¢»éKÕNíX£€ìÌü8ê»ü8Ïðø21›8 ýî¬_ï¶vôwÙê†vø~KŒHÂwçVÚÛ:†›N[XŒ„ÊöPWٱߩW­ÕNC+µ7ßZmE6][Q¯¬‘E¦ëű٠߶ä#u0%Kù0¦1,ªcn:7Þ¨[¹Îžxä#Çûuè„ ã' ¯Ý}w»ïÓOí-­F$l: h'l‚©Jß:/T2·— ÕÊ,U²s:¸hžùý‘¾îó>ÍJ, €À^±{+œ¸ÔÝ.Ö’è-ïoÝ5‚zh·`‘õÕçÆXhìþKô©í4ñäá¬V¬êCMH¸—òD™_Ÿ]g›½¶,åþýt>¹íHá$}ðE­ûxòÉ'­»¶1K(wFDx&2K­xöœ9Ø8‰å†;ÜùåÂýÙŸû>>"¦¿6]B`¥ó,YúEbE±3ü!Õ5m]ðÝ Ï¿˜2O¦‹T6uêSN%9ø»ÙäÇ&Ùãït«âî¸ãvûdÞ‡¶Õð-]›¦Ny2¡mÀ3º'Pøœ4LO>·É¢F,®yàz¾ÀÚ÷pY¾œg^Zi}ºÎ¶^nK—­·÷ç¬Ó”_©œyA]ÅÅenGž /¼Ðí$äçji +Ï=÷\שýTM¿Þ¥6 o™sp è×ÍöÛ½ƒ54V$ø–¯lc>ßä±'~€…D¬/@e÷@{™ÒÃcÖ¶$¦Ëð…l}«¤t}\¿‹·ßcœL'd tA&þyŽ;lÙIû fßeÖiðç?sá»aŽ‚ž~Wøžvž+ó…Òmd-o¹å·?ñp‹„l ‰yA:€c#|Ï3¿?ò[‚¼+Gò®Rdè›o "Õ£«¾Ã03¡k³¬~±ÓäÞzómÍ®eŽíHõB ö{ª Y\»09ÏËÓ^±ƒh}y*çTÏž›Ú&;Ú–[ uš#ÙsÏ>o¹çmüøÄµû6]N^?òqíÓOç¹.°%5;!)} ÄJ©L³gÏñEætDµf¤Mþúo±úûaßng÷OÖ–ÏêÐ#·*7|¯¼¹ÚvغÂ.ºz±í¹S¥“Ò|ùG£>Ëf~H˜”åµxâ .–]еs±L‚R›7¿ÑFïÕɆѬÁ¢:u€uŠèhe¥šQXíœîþE  #$^p?jS€: Fµ©¬Aù=ô}áE["ú/Ù´‡ ™ø°u{eºÕoÞÓÚˆî,fT>ðɧºù¬SŸ8")ÛÃÇôÑÊǘ%Ÿ…¬]°|­Ýzö«ÎóïËxP‰³ô›îqé¥öOùðC´† ýØ¡ƈž.‚ÿ˜þÛ€K}X>o·ÝHçdK<×/E'±µë§=º‹4õëÚ’'LcΉ9á÷¥¿¿3c¦í¼ëNšÂí ©ÀJûèã݇G,œo•UeÖI3Ch—^òG=Ó¤m†Úþ³S®(ÞIDAT»PºYrƒj™òÄTy1+­«Rµ#N•lU¾4_jÿƒÿy(ùÉ —{‡`|„@ØA÷É'óô­½…-Úëºì*Ù\kÖj-êÒœ<õ±ÙQz^q­[9ÙõWݮȎ;¤Æn¿Ô˜ówöZí{ØhÝ»[®%VY°ÒÆ–b(ljìWüÞÀ‘ƒ—FÅ O¾éÔÕ« =_ÕÖÆ?X¥zÚÚ3×¶è»ÂQÌ\‰Xdó”Û&ífÄQÈæ”Áï;M†ºèhþ=ª–,µ^?jït€uý«ä4œ½Û®Öïɧm¾u‘«ƒò³éAJ¬x8Ëzq­Z³ÞÚo¢vÕÄMX(è·yàéOmó'çÛ&¢ãí $NÐÄwÜsӚ¿+´NhN|E™ÍPBpŽÒSBç…Nb• ͧБÛn£~^â¦TœZs>+1{·®Ý],€‘ß^éó Þ$­Ó ÏÛoÏЊÌ~ÎË_Ó¾F¿{µœ‚5î7yÿ½ìŠË¯4Ži £P—m5„ö”…õÐOZÀföчÛ,Mù¥F^:[Ø–fd sDµF 0’¾?ë=M‡õÒ›Tq1?#?3LyüÉTÅg}H?:\ºÎ9éÉöÂ+«l”FýÛäè#/?ÿ#ŒŽ±Úè¼0=üô?(·x¼ü8ùÐd<¼;k­Ýûpi==öôbi+­S|fÛ ®·žÝVû¬ñ#'yJ›´³Ám)®t¥„ i›½ð’ÕÔ/³ÊæX}ŸZ«~ã-“´°vgœf%꼩€ Þu×]n¶À`ì„Ä{Íx}šu®‘)±Yµ¶ç¦6jdgëÖ¡Ì~üÛ—ìógÛ›zÇ»µ]ù¨Q£ÒÒ5U½\cfb´¾Œ‚W•ÞQ˜èÌe(@ò^•qX>åœtò‰ÒÀªlÑ‹œFÇýÉfµÃ·ÜÚ-±öôã·Ãã8õAÏÛo¿ÝmÊ’\ÿ~ûïk#·Ó7%ê–ÕÙ4iÚhÕh ‘Ç3Þl¡`»Eà3f:"ØÐ2,`z4Ð vÙ=çÛT£h¹„DD]ÅÆZ¨Øƒ)O´NÐF¦ô½é‘ªÝhf`•¦Ÿ|q…ýùü.öÄs+ícù к—ÉPRÒDZÔ9?tˆ DF[ö!$,8œóæÌ5öŸÇ—Ûô·Wؾ‹íÓù öÉürë¯U‡ÄTUÄUaWídÔg ç`°íÑHÜra5©¯UÉT(‘º8kß½mÀ«Ó­òÌ_Xùíw(¨þDkT[‹˜Ê•ÐHèŒ“Ž¯‡!‚‹qJòaÓ‰üËÚÖt´ÿûßδËDËpYá4_»AH²ÝZ xñ}„Sü… tü§ÊÅE‘3üH¾L°/$ W0m­H$†ÙÒ} 5,ðô‡û€mÞqzš:bŠ3ÞL‘?Õ%ôÒV›ì¼ð–aŒb^_yõuòÙÖC¶,©@V`ÑÁ %6÷HMeÎ?(Ùþ|Ób9$ÑJmÑâõjo‘u¨iceE¶çÎ•Šˆl"1&Á<à¶ô —˶cGq„ ✌¯½½Úþ5©ÞÊJVZeé›9»ÌÅl5p¹í¸Us{ÏÑ@ZBm(Ìt¨ñŽîÛZg0ø¡ÉÖí[ûZ›[ÆéÃxŠ)ÓÒ$ФîÛᇆ›˜Æ_Â{”ãÛKülHŠ)ᯇÛPH'×]wvÚiáœ+,È .8)ý/’t-«ÓŒù¾¾‰Yå4¥Õ«Ù „ik>˜³FÚØCã>4DÌ6oòR‚à}HYUš>3#of¼™¾Ü„;ØcÁüSÂåÜN`|¦º¼À…ŽD'¹öé¼OmÉÒÅrˆ´u i ri:GßçËx°ÏR!¾ìˆ“¼¢.\6sü»Œ¬´]¶­´÷ç>™³ÖØç ì¥é«¥¬´òø×T»0zï`‡dÿ¡¸ì„ Ä,À?@X1ŽÆ…‹‹RÜͦ½Ñ`ûîø…M{KqáeëmÁ’2ëÜANе /K°îÀû(#Ù?À_Шƒ"0ñ!ôÞz„= ·œTÿ"_Î'Ûo_+Òt¡í±;»¼¨GÊÏ&aêÀÙ‰‰OÇåRöKú¦~„É|‘8&vT^¯RiI¸-(”OÙ[n5Ì™¬06Ÿªw1úmPóÛ×tpB’ä,ýÍ#>49A›ñâLåBœ® }Ò:@õ§CeÔ€j´té9ͪœ@ºÆ€>GÖ ÀÌÔ{ÂÔüSv+ŒÄˆF»Òdõ¯-³«ÖkÝ|™âVÛ… ü¹òr›ó±bÃ¥#õÚL~ I ‚uû¨ýŒÆ0 #×Ùðó)}FboAÔ÷ri[ .·%ŠÝmûj›ôL•õVY¿PfKëÚ8Ç S†lF‚¿ ,ÚÍôíÆV§ƒDüÁ\8"{jAÉþbøm¶Ö{×X£b 솛¬HŸ3¢ ¯¸R1ÔGH¹YT.ÛFšQp4²ëÌΧÂý{ xF0ð›zm ül¦4ÌAÄßÔ©SÃÙ.ÒÉá 0·:lh\4ÈAÝ þɪH¦­kªÛ»™ ° €ðÌϲö£@`©h”1L:ñÍ¢èɽò{´é©°ðW!ôDB5ZªÏ[a?Ó±¸Ž§•t+gÞU½L-m%ŒKÿGyÄ­dM¦ÍLÐzoVj]:•ØöŠÿï:;æ j{O³Evû?ëìÃOÖÚ¶[ú˜îbëÓ§·c ÚŽ à]Ò, FÀ\8A;u,ÖRì´‚ºå%š¨Ð˜b1}£Âeµ¢n[6OuÇÿ`Ê0õX[[ëÊFu÷´ÄVgËoÔvR‘´ÍWZÑž{Hšõ³ÆË.·"EÚ#Y‘FõÆI“­­€yÑÐv„ S‰˜dÌ„ Õå D9ž|òÉáÇpq_˜ûDw¸”ìÓÇ)k| Èþ1-:Øý^^ýwË‚e±` ´k[í~˜ÞkÃP`ÀqC¸üät!Ò²orÁ¹žc n'k^øòœÀB /`œFÿqÂû„ý…ñžËÌA=¨î8Ó`¬t€ FÓ†[ô+Ó»(îÕö̃ž=JeÓ¯±Ñ{¢¹ÙŸÿ¾Øê–7Úíœcû<?€jˆ*ˆ÷MF-óuéTlƒdVÌ›¿ÎöÙµÆÖ4Ôhë­šnÕÜ?ÛfJг0"ËÑdñþ¯²£ô”¶ÐAaÁ’®Ö8þVôóŸá’6­Ô2““Ð^ž¦½vzXŸk£÷W{ÂÀïÆŒ‚Ï6õÀÄ´! MØý´)'(ýFè|C'ò©dðà`ÓXçÓ£4ê7!r³µKç.qÌúÁcÀ ½}:-¤ïÉiivã@]ÉkÎ4\RXøë~DDœ#–Õ-³rÙ¥Åê䌙ܦÃ3Õ2{Ö²æô¸ñBDòýBôi ‡nqšSÏ™ž!V€•m³}»”§оºí:²B[ƒi‡ãåëå¬r>¦ûþzëÛ}‡J',× ÂÖŠ²Ûn»‘ŽY±«ÃñŒÔøÐœ@ŽÅaËU~±}¾ Á¶ÑN›´³[î+³·ïkÛŒècí;ö²‰OÖÈïbCut›œ „Zv*€@Àô@íDT~û[&o¬5* Y©ÿò<8ÉŠŽ>R_–€¹{‚‰VÚ_À-‰ÙAxÿ¿¥ã}÷Ýç¾~Ê÷¨Òç…οŒä÷TI^`ÐàAŽÖ0² Uƒ£¡¢ TVTÅM€0ó‡_ˆçÐÎ d¼©²ÿ.?9]€Ê¼{rÁ¹ž#ˆ­O¶µazÏh¤Yp³¬n©üRh2¨H•WkÚeÖ¬Ù¹Víó£fÞ;A®<%|MÈ$t|cDfg ÚÂÈŠc/ÐÆ­‡–[ß^Z7¨LÒ_æöXæÈŽïÙ½Ô®¸i‰Â‹×ÚÁÚUˆ÷DeÇ®fÄgDð`W3ºzÿÑ„@Ue­-(—^$U“ÉF§Œ½·Î¶B,E‘¢ ƒÀ*,oÆ™ÇW°I9sæÈqù¢Uè:yJ¥ÚIð4jVÁíüEW]#jTXÑî»jmo[¤r ] M(;Wà·=òÈ#ãÂOÏóò‡äZV+ó#Ðs†A[ p}FvÛÖ1ÂËÐ @E…ãdnÁüФ…Á ~çÀC*ã‘LåBȃdûgª$›{Œ„ÒbG†Áæ M'©“P&§ßä:X,µê¬Z%î×­ôLá=Â~¸Mȇƒ †Å£žÇWÞfP-¦D0UøÅ’ûh^ƒüúš’~Vc>±Üieë#ÌùEÆ{ïéÀ&¢L¿QŸ÷øÊí´)ɼÏ×ÙíÿªÓLÄ*7%ÉZ†»¬×õ'ŒD.'h1ipF¢®ö éœ8¡¦M›fôn]Ô†6Ò´ Q.¸‰ò ³¢á’ùCÌï+G ;i¿s⪫®²ûïGùŠƒ¤Ý?ûòÇ«ª¼!ðh£Øùn½Š6­á·C¨(¯tý…s/’_‰>ÌGe $TùO'×>W÷k5 ê¿ßÚRÐa„òß P¯H6kÔkc•—¸x€ðêÂÛ4Kù“Eh±½ÛÀæ%G»`¯è‚úÌ"–ü<Ä®AÇ”»ø€¡Ê<Ô`K´È¨^aÅmª°bù`rh2räH÷ÝAÞ sÁ¤ø&ÐB0¯¢'?½ÂN:¦ÆF ©°©/¬´+Îíl×ß±ÔvÖ”%AL={”¸FjÖ`à¬CË øðþ„›š”}_¤"6œØIxj´o©®5ËÔüñþÇ{l\QŽ…B¢ñåõ¥ý¹_>µˆ€ìéǶuô]âUÊ¥µ¢ø¾ì5Î=¢ðaÖ €kõïdzBzÁ™*ÉæÀuÇÃÃûóÏÑê$(¤`8 SK‚/·B :Üž¦­èiï oj(´í…ñõ»ØìhŒ¢L½ùh*OZ „˜5'=¹ÜEö«-µ{Zn3Þ[co¼³Æþûú*ÛaD…‹ŽDP6uñþv"þ9RÝ}üׇ,³‘[–»éÈ?[gCez ,“ÓqÿÝ«ìÒë—ØV[”;‡"ù¡!ö:v;}ü~þÝû¨³§ÖjT.œÌü©˜>Õ5*K˜9|˜ó*g*ýLèüËL"òrlÐ×­X·ŽÝ|¥ê£î#œP.Ð-\™¾ŸsDði¹ €Ëõó2®€ò×Â’Lµt/¬$ç…0c”ª_^o%¥)™Ÿ–@â2U†ÔͰ("¹ØäsÀmÉ“Î×éüáX!šAœ†¬âºñÆCá‡5+_3ÀQØU^}4…Ò5BWØißïàL‚ºúFÛ|Síó'm€ˆBFÌ<ûL·¡ xÜñ0j{ÿ@ÇöÅNÝß´[‰VÝÕŽÇ_ü¸ƒM{]nY½ÞùðL”éÑW~f.P]$Ô‘Ê?€¦ƒæåüòú·Y ¤Ï:ë¬pqÓur²0øáÃw¾œôUÓ'ŸªúkOÌQ©ûUHP¿E(+C4i©ÊGH¬Wù§ 3Ò0ÞyS5&‡kû)oïò7ËŠ€È;9,“Ótöúzi%¥ N[,õ¿DŽ–÷Þ}¿YÙY^˜«|ã²Ì»\ùp°˜BG‰Û‹´wªücÇŽu6:£v²_Cùæc¤ï¢%ÂÛ«°¹Ÿ¬³—Ũ¿8¡ƒ‚‰êí‰gWÚ9Qáû×VÈü®uLJ!ŒÖH#ˆ‘€I¡%AföÙMÓbÈK¯_lgžØÑ&M]aO]®©Ä*{çýµÎèËÁ C€¡   uŒbx¨‰ö#ˆÎŒÐpÌìÉçA®f—,Yâyó&–áÈ_ŒQÅy LhB j¿Óää«Áh­Ð,ÕÈï¹joé02B¡À0Õ²SÆšZ¸‰p+×ÒŒ,^ –£ˆáñ0HGG#`Dl…˜£&f+üÛ(ÇM³¼¬£tcëìo0ņC‹Q³OŸ>Î?gŸ)鸉FmB€ëêµ÷Z§0ò³8¨Ïæ%.ŽàÀ½]„^îâ&˜rCM‡.4 ~ ¼ÿ@`*ÁÀ’ÒÚÌd`ŸR'LÎ:©£ýãzûù:ØÂ/ìòkã“ §mÀ¿Þ?ÀìL²'!þö&Hò›¥¸í¶Û즛n Sâ^ü)|á+HQµùÔ;``?709`-óüòökÐi1®\ú8€Õ0&©žjªz %P‡NUA¶×¼hI ¬€w†â耄6W+À\µu\¶í åCÅ"âŠ^Œ­™€ÕqŒ¢8v-‹‰v’³Æ>cµí¥|Ñâ;|tµulqc…0 ÉÜ>B_€ï8øší? a‚“`…á3ÓVºXŽcïYfG}§ZB`‰|Z…8 ÜÍ à`´G@«Hö0#߀{²}‚Vùcp–ö/íe;t?Õ©Œ&"\’ö¡/çÆUS›OUìã/ÏT“­ë РiØ@ðƒYª#´À¼ó¿c>mˆ=sŽ L¡PàSÕr¶0Ö2Ö™ò&£M& À?äLíï€FÔVTÔV€9ª#à›¦ñ5îh«4Ó£qnÅÁÅê6ÌÔk|™€Q~€œ‚,4*/o£¨Áõ¶ó6.fàA-¤HCæö—Ö­·ç_Ymýûv·}÷ÙÍÅ%РÀÈÍ^Tyïà:&_5Z±RŸîzkµsÊ&ö·;–Ùw¤aà˜œöÆ*M«j»–<35‰°…щ º:6ˆ•Œq3'KæçYâýÑBð¥[µBù7TrŒ ®Í§plà5 ¬e1ð´ä F àÏi%üRÏS: *”X­:öæí@ÀÙj @È^ìヒ³>/˜«§ÆæõdâCø& ñÐú ãðÄOØÍ7ßlµµµ.~ 9ð)ž1–(/—óOŽÂ-þ+t6ýç Åxò€3?Xcoëû&Ökk²vò£ôs;ýb 0+áuÿšV?PìÊb&b?ùXt4îÞev²¾wxÝíKݵé3ÖØãò? 5°…@{ÔhtÒQ£F¹÷ðõd{D;9á„ÂÙ?Ô aåkÿ¢ôUom>u@óþrâX禠<äL5ú{ÞJ€cèÂlÚ_(@] ißΦÒTy¼h‰!Â@¼ÿÎ( €l¨wg~åÀ¿þ;„¯G ; 0ò  º32gò0¨Âü@±|h0ÿ*Ðì0çãuNX¦Yƒ[',³Íz´µoí»µÛb ÿ4 Ì·3[)NŒ©°ÁÍw/sɶ *bê­ÏöY¥xƒÄ®‚ ammOÓº‚Zøƒä§?ýiÂÂ!=r²ðÕý²nQEµùT†€‘×J¬ÓhŽ&†¶z©\4¢3[)ƪŽG2Õãïź•?mÕñ=ÍÔCÞá<±Ò½äıâÒª#€—»PHZøfÐ04-…ÿ'\*ŒÓ_»küÓO?ÝýèñY&þxÃb»G#ÿÁûµÕ~…ÕN•ÿÅ;ÚŠ\ ï,YÞÝ~ö³3Üâ¼ÏØ‹€¯ë\ýõ ;Ï@C7)¶‹¯ùB VØ_/è,­‚}ýÓMG?Wæçi¾AÀWŠC0Ué ¡ó¯:™(írjMlå*ž­1ÖOéÏÙöK™'+hÅ‹6+¿^W† 7»“Å4BSQå3#Úòåu ¥ökôgF¾CÈ,qæ;øãò†Iy0ÈŸÞ*¬ŽÆu>&ÂBÌ h‘ l/=šÁtiïj#’#F·³ùòæãÑßc‡*û¿KÚö#´ÉçÀ ö{ÑÅû˜zÃgÔÁ¾gf¿B­[`±Ñ#S4M(ó `ôlZÔrf+9äx0“ž@å?\„9¶\Ä—‘ã4U"¯fî0pP7ˆAÓ@F§Ä"3•ÊsøWZ¡¼­òÏÏTGø^!å¢öŽ!‘+Ðéý™žEàá|±1¿;WÛ(ç 4]—ç³Ù>†àA!ZÁÂZaØ{€ýñ1 jkk½¿™"Á!޼m†)´¸TŸÓvåÄœ©é½×5{€ðÛ£ÚÚßî\j¯½µÎÜ ­ÛßÅ <ð£o>KÞ?@ÑnZ­è§]f—_.®˜¢åµîód:^{íµn“ÔPž”¾%t¾1$ÏP#ºäÓÖ°h9ˆÀ̰…5±Tå3 ˆ¿¦æoÑûïë.´˜«‚÷ööd{$x#;ÕÞ©OM1Òþš. Ø)˜ü%%~ãЛñvÆÐçLÍ9¯Ê”¡€÷íÆ ßŽv:`0Û‘±¯‹Œ™[R³ÙihóMÙ>¬Òˆ`’˵W!óû˜ÿyl¹[5ÈÞ;mÛÞÅýÿOÜ?³”Ïȃo¤“²Æ ™ùi gv˜ß§ý1xƒô‰qgÔ u!lµË;Tf!’g©ù4h‹p ðñš #ð»ø¾œêè5¿T;Ç60ÿP„ˆfñp\ Í"o¶Y~•mÆä|éìþðõD¢Åìÿ˜°:llxJ.¼åóÊ–³<Ç}*q¨ð× À?VÛaóÝ>>ÖÁ #PUÉÁëí }$4}x™"ÿزüQ-ÚWêü"­DüÃu‹µ©êæÎ÷3}™'ü).ö;øË_þâüIÑy M€é½p#Í È?ýéO®ó‡²üVé…¡ó%Y‘OCS)Ø¥*°ýQÿÅü.0ᾜœö};ŸºcÏ\¬ãª\ž/´@Ý û ñd hŒxŒè™€m­ÜZå‹É 4œ9ó]gƒe*#Í=lÑËÒÜÛ—‘ÖÏÇ ; ·Æ¥‹}®¹æ§žã#ÁûÞØÃÇK`R¾cˆ @K@\uËR÷¥£+õ÷ÈS+môÞ½mŸ½wq‹40*óÒ̈„§ÿ@<óg;úSS Á«JŸ*l•ã8T^!“窰œúnÿý\4Ÿ3˜ =×7K‚++™Má'N è ‡€6y¢0'znÀÛM/Äá•xS{I˜êˆÚÊZˆÝ$0?«}'Ϊâ¦L²˜íM§_zª^53IˆV°¹0“'OvS‡0#Kã7ñ̈́ﶽvÒzùLí©WÙ¹§w´î\æL…nKœó°²¢Ô¶Ô×Fí±³+„=< ˆÀˆš0~¶ÌÏf̘1n7¥X¹Ðú{ÂbçÛá|5¨,×F!$ûö­uFa0ú¯—s·­[È•ª_ûkô]¢-s0ýÁÂsmó†0hÃáaÂÕœd ¨DžYYìÄp¤ÿ@òH\ÍêoiV¹6|¦ÿªŠ]…Ççã@Ç`ß}§]6‚ŽV²ü÷W§vt?øvRTá”çW¸ˆÂç_]e¿ùÓ"í/Xívä¹à‚ Ü?¿€CjìØ±Î7oL >$¶ç!¸Gé)¡ó-™Y MÓÚòò2uCúb“ºúïÎ1b×3á<à=óbÏ5MEåóp ÏР1 µ9QšÝ Ó×UTS^‘³àö- †6öÕy™»„ÄŒFË„q˜4i’û¶ö;KG¡OKÀl€i>f N=oõ׿›kc¾h´xiƒ­P €–qÊ)§8•ÝÅøëö-;ÿæ øN:é¤ðc¼ >òê ìR﫱>ŠÀÙú±x€øý„Aį¼ç?!k^’.¡„Ì'tbê+l‘¨Þ)¢¼i¡9•ˆñ@+4€ ¥ ¥}—,n03q‘pœùha©Ð<ì?p©¾´ËgÕÂÎ<Ÿ'Õ‘p_¢þf}¸Ö®¼e‰–—ZÏêR«íÍ L Ú™È.Í矾=÷ÜsnÅ¡û¼Xª3\ûÛßþæìÚP–?)='t¾1&óê Äú»®˜ÀÜ óËà„CK#|K÷“ˆõoIº–Ói^/šS A8ìþzfqKÏ5gîæjœîóQžÎšþ‰ð­qÇ[Kíü î¤:¿/Ä4xFwÁ}6ÓØm·Ýl„ .FB÷3¶{…Ö ¤ÍHg|¤•†‡>¯°]OgÆ×B´bKŸIKU!S™,ø Á{J_:ßX“yõ¾U‰ðýÓh, ]÷÷Ó³$Ê-ʇ™ó:oø2{\ˆ:û'©Àƒ(µLH§ ¦XBCpÇ1–hi-Aªºc×òúÑ3”·!ná%dÑÌ,apÖuÔQnžÕÙøx˜HþøËŽšeȬ ¶‹oH,Áæ–—\rIø2¿SÄ8;7vÈ«/ GôÑ 1Á®@\ËÔ·¹çŸË@ ¦‹OþXØ!_V·¾,@cæ ¿%Ä[9]˜¼x&õÇÆåsB &iUŠ»‡Ð·QhBÉ߸~tL«áBü8\ãÀLFåÖ°»,´Éü#h¤=æRQ,x Ád¥™åøÆB2 U¬oê„ÁÊ}À¥[þ-à4¿O2Cô÷Bñ˾̈́ÁŽî#Äá\L›d’Ž^R~G Çôឣ-;ý#)þâÆ TÁn¸Á}ÀóòË/ÏùK³žñUf¦Aübš19óÌ3Ãw N9[(cø› nEg¬Oºþé€ÁÀƾ€\ËÔÇý=x!ÐîV!Èo÷Ñ€ÙúøÍDÃE‡›…˜z„?nú}•@ïä`þ>.›õF21>÷ŸÇøþ»ÇÊÀ<Õúë øö?ð~øE`F>µ}ðÁ»Ý²õø2^øk©Žü.|5‰}þB0[é߇οɼúkRó;!¤ðþ3úëø¾›îH8MYOþC¸A×Il @ïèà9m\±Ü«úéŽä ¤©'&GaP†•â‰Íè¨_wX§¸[¸µð|a‚€Ýˆð°»ûÒ =ö˜[»*“öœ"lq(ôÌÆœ›O#pºž£+ô¥¯Æ.Ý´<8U×b7¦~ŸË§þ|žÙ˜ÀBmýQgé¤cøºãzÈíˆMG$n+6y7n¤Ïxÿ‘Œ&•ÌÍó¡ç|ª­ØWàÀt6n¨¼+•N;óÊ·±%óê ô=ºc€1 É îÃÉiú¾BÝ1¾´R“Ðçç]¯ #’ >§§4;wùÃÖYy¿ÒóA ߨ¿Ø’?î&œ~3¶%;çœsÜ÷rõ„ËÁqÅî>£Gv1ð¡{*}nèüë”Ì«/3Pbü à"™Þ‹9Ã}79Mß—ØÐ{R$üysKB)…;™¬ÐÑgØÙ{D“Tå#2#?"hS\$rÿûu©²}K²÷-LðÌž=Ûùø¾A;˜ ¬„Æ-{ ð #Ò6Ö/èÙÃ…øw¾Ž09ŸF³KµëˆžtôK¡1z&÷gý´Uª^uçÓ^žÉÛc–o…-<×(-àL §µ4¸2íh#,eA×€ÞÁ_<±yÀzæ¥<žû:=âýÕèŸ ™–kï_€­ÂÎ;ïóMÈþ‰^âáNÂk…hAißÁ†ùñòŸ*$På›ÀüÐáá\ÙB<\ÚN1æ÷BÚ%§¥ñ6j™÷iV ‹&²­³µùræ–ÖV˜åó š8Ajé]8F|Çs¯Є”癟´ßãžt€8þ‘h«ÿE€tŒ:§  ·þ\ø„騖à3e ã^/l>¼éâטG› w¯Œ¯Â—ªƒÜÁ#NPÖ \1!@,#¿úøõuú`CÆÂ7ÐÍÕoÕ‘o±+—.]z¼¶Gš¦2ÏÕfŠ›° ΚÕkVh쪀Òáß"óጜ^‰QëÉ|ø {Ž83†WéX)$ž€5ý…D¤• ±íq$âXü¯pµð› SôbG4¤€ãàº$±ëù$3jµ´ÛrB}¥Ý.VÜËÔ·ÿ¢üøg¾ȉ[¾‚6ÔÕÕýY8^~ïh·ÚÍ䀺{ÓM{\"Az ï´½œÖÖ`œIgFüŸÇeÌõ¿}“uâ•ÿ—i9„G`Z(ÑgÓV)ÚuGÔT@¢µYÈD-ÎúM¯^½Ž–ãô#MÃ> »˜a_)lìÀç3IÍ›ð>ݺu?bÉÒÅW‰ÍÁ±ù+;Œ9\~°=…É@–ÿñ€3ÚEQ  ܬL/ÙÌäÛixRÓ€º·ƒ¿OgcVª{÷n×õêÕûçÏ.xv­¾×øº¿¿1¿. V¯¾ú**Ói[n5ìÙ]gˆëwÒ¹¢ÝŸ³Æ¢s”Æ)…-ËŸãc!„PˆÓ/‚ˆ¹Rà-=0Z8Px e¹› Ñ6™B¾\ÌÞ©]Û¶—)½‹>ÞF_€~¾²ªòʧŸ|fêGÑ#ˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q`££Àÿ¦¨ù):÷xIEND®B`‚ic08ª×‰PNG  IHDR\r¨f”iCCPICC Profile(‘}»KÃPÆ¿¦jU*":ˆ8¬ÒJ©‹£m…R¨Pj«&iú€6 IŠ Ž‚‹CÁÁÇâkpqÖµƒ« (Š Nþ¾)ñÜ&ÒªèËùñÝsÎ=÷¸MAU -~ ¨Z"âçRó¼ë m@z0*HºŒÇc øÊßãý–¯}lÖïû£+-ëàà‰'%U3ˆ—ˆ‡– •ñ:qŸFKï0ÎZ|ÊX´¸Z¯I&ÂÄ7ļ”ÒįÄ^)§ŽÍ÷¤‹iÒ¹)‹Æ9ÆbSo¶‰‹…²dïÉ~è–•ÙVOgD18xˆ(# ø(+¤èHÐ}ÈW Ö.©«Z>›3ø 9$óQEóò€|g~ÿô±¡•€‰7ÀYihâ6p¾ôß74Ï>ÐM^]¨‚&Ô%'.“žOÈæÐ{t.è™ñ€õ#wh}4Í—aÀµÔ*¦ùqhšµ#j~ªŠå= Çw@r ˆ]»{ÀH–Þ\üãöºG¶ÿÖØ>~ywÙPvä4@IDATxì|ÇÇ'JB àî.-…º…¶T¨@Ýÿ¥Bû¯Pw¥ö§îN¶h‘RhiqwwIˆÿ¿¿MöØ\î’Krè½O^voevvvÞ›góƘZ д@ -h@ Z д@ -h@ Z д@ -h@ Z д@ -h@ Z д@ -h@ Z д@ -h@ Z д@ -h@ Z д@ -h@ Z д@ -h@ Z д@ -h@ Z д@ -P>-T> <¥’¶@0õŠÎêl#@³!“ 0 L÷9`Ž0€#äCº½†¾kbDDDýîÝ»·hÞ¼y½ðððFUªTiZó`jjC¨¸VpPPTVvvpvVVPvvvPvNŽaß°o²msØÏá§²²Ó32RÙî ÙpðàÁ]éééÛRRRÖoÞ¼yÃŽ;VñÜuà6·ú~VÒ0€JúaŠQ­Ú 6ìxÜqÇuªU«V§ªU«¶@[‡GAôÁìA¤&=-ÍÚfdd¸ˆÛIè%Ù70Œ à`I9&>’™)‘Å3vQÞß©©©‹wîܹdÏž=s¹f1˜]Œ÷ \Z-`åÐÈ~|„ÄóC† éÓ¢E‹¾xÐfŒô¡¸à‚ÒØBôÖ(^¢vÞƒtP@"Ðyo×Xçφ9d a™0†}Ôkvrrò,Âôœœœ9¼‹T‹T` @6¾N8õÔSOêÒ¥ËñUÂÃTŠªœšœlDìîéþÛIÄNµ‰Õ:ŸGè®}§ à`…–í ü| Èí~”‰ª‘™–žžcø 5â×ÌÌÌh‹õ>¶Gà2?¶@€ø±1ýUTXXX—+®¸â¬øøø3ÝÛAø!°Dx[Gw'FO¿„‘ˆÍH`4–J`íë3¸1Þˆ ô[¯£r0kËÈmí£äîKÐu…2ÏcŽër`È™é™YYó)ïkò¸ÒzXà_™·@€”yûö¬Ýˆ#ÎOHHÝ¢ I>p —¨ ž¢_Žxm’SRL [†µ¿g÷n³}ëV“ ñ—`40)f´,t0 ›ð=1)û˜ê†1!LÿâçÇà—`À H#”@Yµ¬oåÖ8çœs†´mÛvdõjÕ:3ªj¤/@ì6‘ØÛ”ÔTs`ÿ~“””dvCà[¶l1Ö¯·Faß[~WIRSpJö{H‚ðyŒ •í÷\óø+èýoŽÚPhó”Íɘ˜˜®Ã‡¿¶NíÚC£€ýIIAÁm°·"žû!v g7›Y³zµÙʈþ/)!¡ü%¼ókàGàÑû—é«@™6o¾ÂCðÉŸÙ¯_¿[!üÞèÚ!øÏ-=Ú&x{‹5ßìbdß¡/Y¼Øéó•ô/ý‘'lcû:Mð*¸ë_Ú~{íð[Sz-(¢¿°k×®·Ö¨Q£uÊÁ2Äit· ^[òÖ¿f5Ê{--p¶ì‚Œ£9^·š¥d-`%k7_î ïÓ§ÏÅÚ·¿«zõêMó”ã"|1›èW®\i¶¢Ç x-Ñp8–;_®€b´@€£±|¼4¨eË–ƒ{ôèñ†½VXòƒ¥ß‹à…ŠÊ#:ά]»ÖlܰÁÇ"—Ö0€tpø(×½jC|hð¡‘|½„Xû>ÇücµkÕê‹+.Ô&|‰ø²îo۶ͬX¶ÌríùZfà:ß[pƒáßÜq;8Ý÷;ÿ½W€¾}l¯^½Š‹‹»˜@ø*åm_®:ôÛ·ÔTÿ4u‘¥äÀ’apå½àŽ"ïø_`¥ûøAî\™˜˜ø0±©))Á"|éú6áËÒ€ iLÁzÁ]<ýÓ ©ÁaðÐ(ùGjѦuë—jT¯>·]˜Bg-QŸ(ÀŠ÷¹b‰â{¥ZLÌ)™èúõ%î+_¾ýTê°mÏSËÁôJ]Ûrª\€øØÐIJúzxXXS&æ„Øº¾@Ÿ@ HC˜F/7>5/›š@Ñíª6º£ƒ‰a?ÐfE·Ye¿Bl{ •¼œYÙ+[–õ )Ë€²•0óMÿZ0Šýñ•W`Ž¢©ÉöP3«þÿ•`Þ?{§ÆÓQN„êý_8s˜¶€2DR÷ãAeCžþë À<òÎþ–Æé@' õ|Iàè‘Ðbî`/lbøò`"ø÷ï·8†FyŸ‘¿Ǥö¡[;[;y`ïjkïÛçìwÏ·Íû¡C»ö9ûžÃvËËË8¨td—ƒ©‡í‹³âGÌ,æ{{»ü dÄ_› §¶QË‘ÅV#˜P9Àvò{[-è¡™r»óPç„r…©³k_÷;}™R{h £C„UòP¶: thÙHêÓPñle e_í&©)˜ÃJz¢­Òi8IçƒÿŠN}¬ä¶ÀÙ4† ~5*qƒrdÍtËÌÛîf»€ú®•Hs}nb[Þ¹ô¤O7ãÀæ`C°mÚšm"[11I•Võ¤=3L ™ºÑÀ÷-PY‰_#»æ¼‹à5›h6ø'¨oJ‘%B?@Ì¡(ÛŠ°OÌAR†tðJÅò˜€rJ8¢cº À˜“iéüµøØy¯ùí"øÉàtp¸<’@íÝìÍ7芈)°©X ý¥|J-.ØüÞÐû™Màkˆ¿^EÖ#è•ør!õø”ª‘^ºü¿d…?<…o2Œ¥6°©à{È0ø2O¿­bjxjY¶@kzÖdÏl0§0“ç+»íï X´(Ë—=ÌÊ®F}‡€ŸÐF»aÐið}¬>Áóe¸ù0k¿@u‹hY±çÓ©²Ê»cÑ™òìàS`70…·€¤³ÀÙ"ÆŠøfBUðÿeGñaŸãY³(YÒÔa ¼Ï¿4Ÿo*Fào 1˜Ù>IÁ=ÁÀò$þNioñH58Tœ¿ÄŠ…?þž{þ»žýŠYÝÉ74ð"}@¹ü&ÅP^å>Æ3ô-Ø=¶ÛzhŒìÚ—ä#¼Dx×ã1xÇy°‚÷Å  H‘Ð/ýžV–Áw$å½_ÁïWâÇ—…N\âÊøùFHïñÁ±õÇ—kïý9ÊnË Tÿ3ÀïÀA ¯• ÁUª˜ÞÜoº^w­‰Ž‹³¹ A¨ÎªÄ‚”† Mp£ÓhÀ×»—Ù·e³IÙ´ÉY†ž×[ϰðé­0µFTšÄr+Ê &Q[êÈɃ œ4yòä ìW·“w¦/©zºÚýå„ñò-¹yxXJ¥n„µ\ùÜt/'÷•?ˆ? â_ËÇ–+Lz·ÂyË âyF˜¯Aí» Ñi§™3¾üÒ´<çá:îËήµë¬•ŒtmÊOL‹—J…ˆëÞÝœ8v¬9êé§LDÃ|Ó¥5Ž;î¸ÇpJìL§y{ƒ YY™Mù}¨°Y1ÿ€• ~æ¥N`ë—oHkÎKª_–à⨌/®‘i.âM‡ÒVŽŽ"‘å ×—¶¼bÜOß²ž)ks=ç}¡Õ«›¾÷ßoaÙ ׫Dè ~Ôô­Uä§¥›50ƒà³Ï2±GõwÄoRwí6+Æmæ=ûœe<Ä`.¼ðBböìÙcÞ}÷Ý?wîÜu7Mi&| c|“Íeà\Œ®¾ú®lJ…þKç¿…F–JP*€¡üA½JUHݬ†8á<>l‹Ò¾=ZÑ|oSŽ,í~1|¬S3® æcÒÍÏ?ßt9ÂDÅÆúXTÁËd ¯YÃL˜0Ñu²©x9@–ÿˆZ5MÇË/7 2 Þ}×tƒ)ˆø“'OÁs°«»?ƒ Š‘d´LA$«Pš°ÒA&5ú/û‹o<–¾¢ÆÃ-ð’í)k7O-QxӑʆñQò¹ÆŠÙÆÒ÷“ø¨ò‹‹Ë ÂxÐõàƒ`¾‘)">Þô»÷Ó°o_—K¯4•J`ÄOY³Ö¤®Xeª÷ímêtíê±81‚jx úÝs‰ýõW¦0ígôßkþþûoûzÎéà à[\Œ¤€ ¢½4á!ÀxÈ;åt¤HÜð¯ /þš ®bÿ¶Öšúär·CUöi· œ!\|Ø1ëKùô–‡ÏEUx©ÍôÊZ%¬²f›ù —q?=¾Ü 3OzD§vÄÔnÄ•¦ýÅ›ˆÚµ}²ð;î.tW1™Ä„ÅÄ0^Ý'L0¡\¿…À¡7ßy×$–À "üîÝ»™Ž;æÄÅÅzøáGžÒù1cÆÔ¤â÷°{X]Çò`3Ûû‘*ÆÝ}÷hš½Â@ éCúÌQ´‚˜p±&²‰›š€ž¹o(Ç«ÀúúòèD>âõ`ñ•c,¹|Èå<ä,ðw_æ‡k䢺|L]P£cGsÌSOš–gŸ]À¯ïº¨;²„àEð…ø%È×\¾Ü+M½ê_6ÜDÔ­c¶Îžöˆv7oÞlˆš>}z+ª¶wôè»SCCC'³*èn©„ó˜Óöà1   ƒdžü9¯Ø‚~#,‰d¬{&€b‡ H|;Ò@úß²xÀ ™¿:áñàÂâÝ]â«âÎy ôg—Ê¢‘´ë¨ÛÍÉo¼nb½ˆæ%~bIo„*² #DÔ¨a:\r‰9ëÛoLËaà 0ˆºqÍš5ßbñTé ÍA}“ÀÓÀ¶ ˜ìJ’Í}>ø \s ²]\ +{L-nEò˜†˜Þa%át•ý7PÁ`>ºˆJkšçD®¹Ü[ĵþ8-õäðZ0Ž#(§û7äôøãI~*ãà¶í&yÛ6Sƒ°âlôÿ}¸«·nmª5jdúÜu'ч§šy¯½f¶NêzâÉ'Ÿlˆ$Œ€˜eË–m˜4iò½Hå]°M£fMxžT+4xܧÚM¸ƒãäTTÝJ"uUf™ž?€’p¬eSÇ+ ¸Bn>ÅŽ_ j(KÐh'ú3`çƒ4A§çï5Í ÷0^çuµ¿‡y!ÌH‚lÙ²ÕlÛ½×T·£¡Þz:šãž{Ölœ1ÃÌ~òI“½u›iÚ´‰5ÙhûöíæÃ?j”=“ú¿>®gð_íÖœ¶ŠzMû¹cè{éÀ|H¸Ü¬µ 8\¶G"¸¾C‡ö-ë7h`&N(|@á#+ëëG|¬«Àô2þhq”ÿ¨™vô«CÑ+Œ·zb⡃•l/ ‘æs¡VB‚%»Ó†.PL‚\†qݺ™äŸ6Ød_X¸p‘tT…‹e >Ÿ’’¼¢jUW”¶$·Ê/ònÉôå(R=iÒ¬IتUkÊzñ{ûi à¸fÍ›ÞѳgÏšüá¾Z¿nÇFã´fò½ÃÉëA‰~e"v”dkÔ¯ã|HÖ÷¾LÞI<þ8œ§_;Ï—jÂÛ‹Ñ.÷¡?$ŠZŒð±çœev|ÿ£‰jßÖ42ØÝ Ô‘†¯R­š‰%¤8ç9 ð90€&öÿE%ÈìÙ³‡r$‘{p¾]ÖØ±Ïš]»ö÷à÷p°(cá*ðk8Ê[÷Þ{oûåoÒO$!¾\xøÑGM¿£úeŸvêéÏíÛ·O.ÑíåQ9<#È…T’2šÓ‘ÆŸvÚ©-£¢¢C™ÛN'Úe~üö[¬{˜÷Güã8t#È÷-3hFÉ/'¹?¡ùÐ!¦óˆ&IÅUÅýþ¢~§íÞm¦]~¥‰Œo`ZÌS§S'”ÄSÔ½…ÏNO7Á>DÖfžAÍùóÉ·bþhÖÜü…Asó¯2³ä<›4IܼzõšË8óËC=Xžñ,û—ƒ! ;LçÀiÄ(丼àbå%OL uÛ¶fò”)¦6.Ú>þàÀEÃ.‘Øy!X^LªTmà©KU`ÝEGúàœsÎîŽåÙ9q?™Úuê˜5«W»ªñKì“eIüò%ßJ½hº@=G?ñ„i7ìBÎHY&@o]ùégfϘô;Í–Ÿ1I¸ç¢ãš*5qÉ—|e"‘ûö™È­[- ­_?“x≦n—.f¶„Œ½ùi—À"ðÃÂÃÃ{õíÛw0s Îç·$'¹çDP3@¹K%A5«á6”G¡¼@ÒÉ6pM+5Æ_~ýµi1TиqbxXxhì´©Óô>¹uUåúw¤0€§Î<ëŒSÚ´i­Ñc“5ª*ç]=Bf;uîlæýù§üP"þ·øûÙ-è@©_W€ù:K»«Fš£|ÀÔnÝÊ/Ñ|Þj¿µgÁ˜‡-ñÛ¾&eͳñ»ïM~üô÷PŒyeŒê٫טê{÷Zv‚ UñÉc ˜†¨„x³yÖïÎüªJ ¼Eƒ ZêGffæ4¾ß1Œô¯Cìã=vÐî¶4ðŽg°_^ È^pLÀ²ö¿÷Áæ”SN±ž¯~'lÞ¢Eä† ëš-]²l-'–X'+ñ¿#\اoï[3¨ŽÞþjsýƆyRAÀ‡–ë­,ˆ_Ö¬{ÀwÀÆ  Ð3ËxKÂoý¡» ö²³ôí·Í¥Ë ž¥ƒî›¿ÀlüåW#ûC´¦ç¥+xqÉd¡~­yúYÓõCaÃË¿ÿÉDõíc½{ϫ۾½ivæÄÜ…™ór ‹UH:óÌ3æ$%%™^x¡Ö„ ?‹ÀuÁAìY½*5¬‚Ä÷&Çöè@9Â\ž•è_§NÐç^x!(2/ñŠúL˪óæÍ«Îš5« s%$½ì*ÇúûQ‡;hѸqÂCÏ¿ s=ò«Dü„¤f~üñÇðAŸÈ!u¤gÁ²0ø  Ü/Á! Ë°*ýV=½þóS£IN•r˜œ¼i£ g&`QP§C‚Nº÷tp7û‡îÍ&gçÌYfÛÜ9&26ÎT‹õ«D"°üýÍâÅKÍòå+MòdSïÄrCŽUˆEY‰â™×pì “Œ½¢ B ò"˜¸—/_!éIíz(U`  'ÛÓÁÚöIÀ~öËf2%§¤ KR8*KM{àbƒ nаAôø¯Ç·§rŸeÑçüòÞ‡3PykäU#;5n”nüÚŠðš4i’óÏ?ÿ,|ÿý÷E”»Á¥ ¿G~QãÓàó`}Ðõñ>ûŒI<öØbÏÕwâØÙ1ož™}Ý VOŠnܨPIBFºÚ§êóìLÚcÿ½zAÈ`ºï&øìÛ¸ÁòT©¥ø¤ÒƒÂ‹³Ý÷iÂÔRçäLÜ€£ ÆN7ˆÄFÓäøãM|TUãHÇÈøÉ'ŸZ„”w© %"ú3:vìÐ.***ýMAAÁMš4‰Òsᡇ8pPü AÛ‚µ ”„ŠPV„÷Oý˜ç/nß¾ý©íÚµÃp™+ØL nÝz¡Øjýþûl© SrkYùþü"•¯ŽÞj4úÂaÜzòI§ÔR£§¥¥YGH¾e2Ýî¸õÖ[‘3Ë$¦_ívø˜º@F²žÌœk~Æé~!|œÅˆ=ó–[Mò²åÖs$¾·&Pƒ£2!E&Á¸l™YúÖ[f¯Ür^@õntþPÓ„zGHT£t©€ûS6m6ÙYŒˆŒîEã`pÑØ)’RRÌ3/¿b²’ò U—0˜J¿~ýÒÚµkûéË/½DÇ}ô¦'džÅîh°3(ã¡`'86''û‘ÿþ÷þ²´ÈßÂÌȇ‘6#åy²Q™–·lÝb˜ ±é·iÓU×IªTeƒÃUèÙ¥K§'.¾èâXt° {ôWãJØ2bĈ{ù)±Üß €žWA¬l&ŸI=þ¤Í gž1 Gõ÷«_ã¤Ifóøo\ï‘“Û1}†Ù†a37bU ’z¼ADÚ¦!9c0>î!6 +Ƀä ÁîÃBoÙÏ?P*ûõ ÃËN‘&ÕðR„á9â}êÀÜ‚ªD˜ý•ï6©xk×® 3gŽDë6 wéÒåQöŸ%9A6™´Kƒ“N:îÛ_-3úûcÅŠíO=õÔ6x1‚åjP’*>¡aäO?ýÔ!##ósês¬Tp82¹üÞ½ë®;[&$4u¿Z6>>>kìØ±ãW¯^}'?K9ŒåûVêŃ_€}@WgÓˆÜÿ‘‡ñë4‘›?!¢øóî{ŒˆÞ2vî²\|û˜–e¿0Ÿˆ0+|ü Ç›ðzuÍŒŽ,À®¢³‘¤vΚe¶"-D’cÐßö׃Üvª.\…,CYØ:´kgâûÉ>p¬IÝÀ$­Xávµ5Ê·<øÜë˜p¤€!Á&PLùð[0Œ;geå(?ázöËrXTejDDÄ©ýû÷¯'&%â·AõjÕCªU‰ž>}†ô«Ë¢¥)ópd÷ÞxÓõ§ 00Z/. ÐXCáªsç®zë­·.äP’uÂ?ÿ)F„ÿ€ÖsÙZÐì¼óÌ1O>abñq#Fû$â×êÖÕ$ãÏ?¸I}¼ (±Ç†o¾5Œ<1yè¡ðÚ+\·1ü Ž;ÖdÑfIy©ÁÝ/ÌÀ0gÙÖ¯Çm—`er¿Æ_¿3ÉG˜òõxS‰!83Ã̃ùÔìÚfZÊ S—‘»×®5a6ôéÓOK´ØK\Á?þø<ó žÐW€K°|͵×ÒÁwpìWûÞ2ئL›6mu:=111Â&~m³³sL\lý*[¶lJX½zÍRž]€›•A}|.Òÿ=ÖçG—èž}úözôšk®‹­YÕEü*I¢?v€ý×üü£D¥¼)ŒCׂõÛ‚®Q?¢8ê±GM‡K/1áHîÆÈ½{éRU?ŸmÐý2Ÿ~GbÑoxÌ€\;@Ö~"<%ÉÅ·áÇŸŒråâÓb!õzt7uiSöì6©Lôñ)Älúá“Rsñt¿/Çö““p 1 ÉÄ üõ×?fç‚E¦þi§Z*ˆ$Å4;ù$“˜h¶`XÌF×>[Vxk¤ýì³ÏÌ¢E‹ð¬ó@q‰eçž;äÀÁƒ)—±¯‘w @RAYÂ*Dý:äLìŽZJÒå\U@[¹6ëׯ9eÊ”¶ôQy**p81€Fù·{ü±ÖM›4µ\mÎÑ¿ZµjYøû?Ú¸qãc~úÊ)GzÛU F( §?1üuU=#ë&Ül¿^y¥ÙϨU«ys¡¼RÖ,¦“€;-”D{äâCÔt© rñm% Ðáe(DÀò߀)ÈÕðì[»Æd"†Ë>°0¹T+½}ÀíbÞ«¾þÆlݸÙ2¢Åtëbâ#±Îu¥$—:H.ÍÈ„SÍt&§¡tìMHE¿×Ò¿ÄíÚµsKË–-¯`_ßn `"[09)¡+HPÑ Oºúf®m¦ÅT‹ ŽŠª5kæ,yŽ~ò¡¸r¹äpb7ßöŸ[ŸxÂÉ1Ò³l›ÍªíááU .™U¸ü$úËg\PÈ© ˆoƒM@T‡à!]v V4‚zƒ F²_D2©÷ b/ýðCKG¯Ýª•·[|>._M¡¾DxîJBÊð»÷ ÂO4û$¬Ÿ&ß-¹Ì%ÞÄwœ Ç·›àœ"™ ’e|,„¹ä{H!?B¦©˜ŸÍHÓ©ƒI:Ô«£vOà;ÔÆc XÊû3à^z#€¯àôô ‹ é>o « mˆ”‘ƒ/R†s¶ï³˜ £î¾ Äa|´ï)j+oAmôþš1…Vöá¸Øª3¿C_aÌp+ñ ©xœ°{÷î ?°%le>¢y¢÷Ÿ/®‘$Дzgƒl àP˜€¤…­ö‰l×ýöÛoqD5vçÞà´t¹§…VQ0$–ÖHŸp ÷` â¯[ óÚÃ<Ô¹I“¦a¹Ä/®š);@öK/½üãªU«î)E£H,{|̧´×eZëÀgž6Mqñ… iÉt¸‰7ÞŒÕ>Íui߇bŽ|W×oî(QhVô‰aBЦÿfFë ö1%wㄟM#h4±ø…¹ødDÔÄØcŽ1©ö[Ùƒ=•™‚î¾Aó øÊ\aΪGjŽ€Ì¿YÎ9ÛÔDºÚ4gŽåè¬ëN˜#Äß«k×®—·iÓZb P„÷>xîE¶«@1qÇÆññ ?˜ÏLÆ’ÂþýûçbŸ8‹¡:`í…ŒŒt“ΠU52*$:&*zÞ_óÄ¿¦•ôþºïp`—\}ÍÈ+N=õ´šÖ«‘?âÏuµd›ßgÿ¾ë7Þ¸˜ÙQ‚FÑG8 žŠÙX Å2{Þ{éyóÍ–AÍ>^ÔöŸ7þg¶ÿ>Ëu™–äî†_»,<öC\"<.¾P\|{,49´“;Xöß7[~Ÿm"Xâ+ 7_aö*ŒÊ Ž:ÊTg*ñ¾5«<@öøÑ„¢—Ç(~€¶+KHg’Qm¤ÁnŒ­9Íš™š-Z˜–ge°µlãÝáüó‡VÅ8WEº9~ûqÏ?ÿÂÕ¨òlg0òkèÆ3µ÷9Žl@÷B½ÿN9sæÜ‚'ÅÄD‡kôÏ•Xs­:ujG¬_¿¾ù¶mÛœ Y†•‰H$;¼¼§FÍê£[¶jy{ºuÞ|óMüT%âK„O#J¯bÔÙ½kwÆnûÏ 0‰SÅ…ºÜð:ø0XËysCBS>û¬I€x )÷h×â%fæÝw»K§ ¦aC×1çŽ:ãn¢ô¶ÌþÃTÓ¨Œ~_°í.ßÏ“ÑdèÛ:q’Ù‹­€+ݸ·óQõã¬ø*ÔqÏ_ó¼3—3s~´¸WKmºüíwLãð0‹¨6ÏûÇ$#Ebì”"I«1ƒ ˆNöAÔ &…Y^£åHIï¿ÿA7jä_æÀ³=Mh¦aimI‹öîÝÛ—ç6ÇN¤Y˜™yj+L7¨^½ºU¦NÖ‰gI-9l J‘.“ – xWfËåñ®‡œ‚õtôµ×_Ó¢W^Qä’‹$€‚v ¶Œ'j<…XJÐÈo«Ÿ|üÉòwÞyGúÜWIEïh”?|$æõ„Þë~ÓN(á«„lê5ñ–[Íf¢ölhE.ÿÞwŒBÊÌkf¶Ùt‚ýŒ^;a+Ȩ»í·éÖåUÔ7ýxÀ4D¤-ÌÆ`—íËvïòfù{ï™ÝÓgªƒÛzVüóLS¦éF"ê©àZ%YcÝ{HÐ00oP·e‹‹†™êM›z»¤DÇUß>l²!ää䫌&7]Ï\ƒ£ó•§Õ¶Á¬æ¾ø¢9 ¡}ûvV_¢¿˜Õ«×Ø×f±#cÍ==4æRòíìï>Ž}oª}Q)¶]ï»ï¾_º÷èN¸:R@ž$`1~§$§¤áÉÈQ߯{•ðàÔ)S·ïرóžù ¸·ÏöéÖŠf’|Þ9— 6¬n›ÖmC££òŒTê\Ví‚r ‚ý$BX·_­xÿ¥K—¥Þpÿ>½iîEê/€§ºßÓœ8x-ƒUQ#s±€N¹~Ê3ùÚë\·I×>ó‹Ï-Ý8 ½|/nÛßóÌò/¾4V®t]羣ѻ„Zã #0÷û¼ý–5;!ÃK^{ÝDg÷!ÑQ¦9nËž_X ‘u?ï›´f­YñþûfǤÉÞŠ´˜Nãa0¿à AP¿`÷ßÿ˜ec±Ú'¤z5Óñ‰Ç¬5 <•Ÿ‰Á0vòS35Å®Ë<õÔÓž.K%Az›6m‰è›N‚<]T’cøÿ_|ì±Ç®©U5DL jÕ(W/VÙ’­~-ï/b1§½ÔoõšÕÙ%1¸­€ÁÝÈÉ‚úLI*â垊Vž¼þÆë.~éðØvmÛG ÂÉhBh¥b¾Íæ-[ÌäL¯ŒÂÕn4g\Áû˜(‚%5‰(^â½$Âb4¢N© œG ÖýÄã¦íX¹îç|ÝOÇݧÑ?ÝÔ†æç 6‘µj¦#šé£î0Ë?þØlaškº'=š›4²5"¹D"®¸ª‹òîûCȵ$˜xò†!&ï%Þß³} ÃìÂ6 :F"ÂKì/Ê>PI¹öñ­4³Ðä'a°‚“J¯æèŠo¨stS½gwÓøÂó –=¢Ö®&Œo”ÌH;{Î\Ä5]>[²diÄü½0íçuëÖOá¬_Äð¬Ç¦pA³fM«¿b„UéÏ!!H·9„=)û@dD¤‰ŽaŠtBBPëV­#5nToûŽmÇoß¶c)u‘ªR&P‘Àe—¿èÑaÃ.ŠmÖ¤…Õ1ùc餢3ÇìA޳ŸQŸi½¦Y³&¦oß~&4,]*ÓÌ_8?çùçžÿ—Ë@Zæål¦8I×?ÝýT›+¯0ÓrZR‘.|ÿ3÷F¤b‚Òƒµ2ÄÄ’±¨)´”“oÔ§lÙ”-¸$«»WGuMپìþú+³á£ÂÍ&µˆlÅÂÕ[4w/¦Àï,ælb=€ešÅ¡yƒª”ÕŠ6¯‡Ï¿¨ÙÞÊ(Éñ†¬^IÀÐAÇBpÁÛo›Õ_~•¿­ó<›Ÿ#ÀùûWÀ;wÜ9jèÑG ‰Ž©Ë5¹ûL**LDzQm•…éæ+•kÑĦý65óÍqãÖ.Y²ìlž¼°ØO÷ᆊ’j7oÑìÌåoÔ,±EP:èçŸ'˜Ú5‰JkÐ1)’(¯‹Ø#qI‰cnÞ¼ÕüñÇlrÍ75¡ŒDGÇ…‡‡Õš8q"SÞs¦xy×ÿìá<ƒx­€žÖçœSh@óoûû™ˆ3MÄSàL{øú ±ÔwbÉì.7Þhº^{©O8n4#®'ZªÎäÛG™Eèñ5!ž‚tJ aØ9êu'ø¨þ„ï!س•ŠbÓ÷ßãBK51¸øÂlÕÌC4ÊV'Ú1Û‰aîÂ>¼ùYÞ=ò"l%8iïúuVü€Åð<”çïCa‹›HÜpYÕžF­h¸^=Í^b'ÜãòžÏöRp'8,¦NȹpîÕW_uç±ƒŽ­ZMâþœ9·²SùMß³fš¦¯ÔuIûö›Y³fZAnñ ‚œ ŽŠ©Zuê”i-(î#°¤õÈ«NÁME1€«0øÖ®uûH¢# £¸iÖ´™Å C |¹Ìlñ3‡ÉiOäCUèçB\N-qùk~xÈŽ;š®^µz¯–îx½`öoßYø!ÀNäôe¾~ §ÄŽK ¾ô²ÙÅ\vàVþIï½k:ag1+4Ø~G÷rpí²äÿ³Ô†U$ŸÜ»qƒ©5;U¨´ ç7ÀpV­!À¨\C€yHÒÂÅfã÷?éÚEM«Cü@=B‹j‚åz‚Ôuë­à¤4ˆRqþe™ŸpÿªÕ&ý—_LuT$Þ?“¦˜X&i®„b;ĸ¶Ò§²ˆÞtƒ0~KjTÜÀ¯`½c…APçÎÇ 2¤Y|ƒîÎ1þÅôíÈ(£5+dà–­É²7å‘uQ­‘ÐØ²ì\ ñ¬½Lb‘ꬭ°„‡-/ì%9WQ à‹/¹¨U|ý„àMŒ aUÈ`ƒŠfMžÐËȧ¶A/C$ÚoKÆ& aéƒJ¤Ý½wwØï³~ŸÃevãˆ:^ï¥û[AÄÚ@V®iqºÿuì@5™åÞÔ§Á A¦ÃȦ¾ÿúdZ÷ÓO®ÓÍÏ=Çò½»²“M¼éf“‰aȆ¸ž½LãcŽ)’qØ×µUû‰¨sC€ëçN¦ã¹ƒl;Iâ¹…9‘Ø|‰¨ß¿Ÿ©Aü@Ò:Ùv¹iýNBRPü@H5òò}JëõôÔm[ÍâO>gm‚ÅøÿW‘\%‰F§X*ˆ\¼µ j~ê)&ý{ó'<@oŽ1Z˜ïAy |…§Ÿqúm}zö®RûѪøÖ¢ÞbQø´:7í¯¾¬ï ”‡K1.R—.Ylâ¹V¡ÌYé!“&NR¼Š_š”;DµlÕ¢uêÕCåªYϨŒA$i’IM9hÍ:SChä·%µUHH.-W¯^Ã,¦qÒè¨j´Úµk‰à;æ½E[‰JW€®á½ñ§›ÓÞzÓ4`ôT£û$žÏyáÅÜ™W`ÛWšã_zÑ´Àê­¸ÿªuëæ{T:ö _@ïµêûò‰ç¡ˆ‰.îÝ™ÆÕÈÈÚ~G½ù?ÓˆtåÞ uíZ3ïλÍÜƘ}+¼{2t¿¤›º]:›¾0ݶwÞA€ŽÒ‚ ‘wéÓÏš×ßh §†ïòýH5$½*r]€º«á…Có»xyÙ€:_u•é1ØKÿ¸ˆ[å=*NçéÙ ~\dšþBJ1'aÀ–;Pϱˆ?˜"Õ'ó6Á!A¨¾!¦q“&Ö‚*Uˆmˆ‹‹  ¨Ï÷;½ºFH //hØ¡cû°l>ýr –~5€¸d8¢mÂmÑ´•4 n)÷‰TYMCáÚ[·m3©S,Šè.TÐИ†¤™w@L\ÐùÖ[M» /ð¨c».*æŽtíĉf‡#â,«}[&±Xœ=¯¿ïÃáۿ̯įòSçfý÷>ç£L÷Ûn-0÷ß]WOóç._!y?áUPfjc´kŒÏÉ\ìs~ßÒ¸ÕðHt=ÚteD”åÞ¨Ón yçô˯4k´ú¹ü¼e*[‘¼ }ǽabO<Þó»ðw5kÄH³ø7L*qüÖèèµ`ßNHµ¨Þ²…wâwkó¸W_1 wõ1qåvnÇ=þÄ>Äè.·öž½{,w¶âXöaí—Å}:%…à6Ô++L˜­Ô\å]*Ú•9æ @åÔ´fs{µbus¬°uùòèR"i-àAÄ @ÏÒÑøþÁÍ›rÁÖÍf݆ufûömVƒiV•¤”›ùW%$íÛ—EŠmÞc¿˜øÁ€çž3-ˆnËå ö™ÒoÕñ]–åèðÕ÷›žpbNíž°ó#{Q†¿LÚYú*Ê»t»áz†˜^ž£UÂ~´cR›+°É¨–=û<"ü f+î6EDz’Št5ÊtG5ˆ"G¡7XÿÑÇæ·Ë® àh·KÊìx}\q½¸ßSùúOƒEÒ F¼}©))h²d Ƹ§x–¤ýû,âßC¼ˆ> n,j¼Ü~¹L!™„¶ÊŽœÛ×e$¤ ˜;vJôKòT©Ò+ÀæJS˜÷îý{Þ?«÷8P?:ªZHF¥¹sþ´Ä!‰üáˆø– €;‰¨,Ë% ˆ#J£ óxTŽe)…qh¨lr2:1'‘ˆ¶²1EÀÝqá)¾ÿŸç¥ÓÏB‘tî ñ× ûVÞ™ádæ¯—Çæ«w³ÁƒM~ó Ú:$2Š­eêñB€×#X–k· ¥"bÿ}×h£ø–—\lj´çÊ Ð£ëtêhú’6}ÓÔifùk¯á…(ÊQ£s'k#/¥”Ùa‹èðDy|¦/8ÝËyë0e,ß±sg:3V‰o‹°Fyüä÷·æ î§©A?Ù¹{—9Àˆ¯ó!2‚ z³ûù´©Óiµ¹°g–äœ×·,IaŸ'¾{®=jÔ¨Y¾!­2Üq±žÌ:Ü ðCïÁm£!uA†Aá.ÄBÅu“Õ`ùä£O1°îbg ‘1t¼~÷Œö!]v1jëviŒHK`7F·•Y¸5±ôžfÀIZX8nœ‹ %¨´¿{’Xº;plÔ)fá«r`ä‚ô×£yØŠ(´UÔVö õê1õøàþB\||·05Ši´/,qŠ? ÉWÌ“-?ЙïèÏb_Ú.Õk5ž›Y£(é{7)ROœýK+R!à‹;uê©Ö°Í¨¶*ËÖù•Ôf騔>\R¯úºúˆúyyQÅÈ"d6oÚ”òãä'¯PQ `-úÍÐnݻ֨[»nôø¥‹‰ŒR#¡ HøÍøï¾¡Ed!µ 3qôqÝ»Ù?Ët«PßF­¼¹¯ô±2ùĽU.»v— Ïo…Ϋ¡rþrÃV°Š]éηÜbc«L;E˜0\FgËÅGfbODðrËŇ«±°HF+~—a쀣Mß8yõjk‚’Œ‡åò>leÎÄï_—üïÓÖó_DåSß\»v­]Æì<¢ï˜ü€Î]:5­W/6¸Ní:f*Ñ’Á²å jš™øùg´rÕ*‹1D£j¥“?@ƒaoÜÈ©©Éæ×‰w-Z¸øAž·ô+T؇¡/¬~ƒ¸®,¡dÅH‹®Äµ$q_Aõå6÷”È$ÎW?Ö‡h¯$‹k×­É~íÕ7V$íKzqÿÚ`hªßЯThažFó¼¤.,ûê+“a[ÿùðm=v×çÅ(–|ü‰Ù0a‚ëQJ:ÚCœ»'ÁuAEîP_Å(~ ’UŠvãâÊɳ^;«¥èHÍ/Ø:kù|‹ˆC…¨ s‰íÕ«PéÁùœRíó.IH-³ŸxÒü ñ@•qÂ=iΙúÜøñ.7¼ÜÍ7:¯ußg$߀ëŒöÚG)n…”õfÆôxB,àüó-B×$%õóƒH‘ôÿ4 §¯"M`Õê•É/<÷’:†l~‡Šbz‘Ùèþ›4N¨¿´u«6ÕV²Kï—ûŸeˆF¿>Ñ€ ևظicö¯½±yÙ²å#(gx¹ 4Bœ¬µ2€À’O>1é¨26´bÖaÔ'$;ùÆ›òMRéK€Q]TÊ –».þ”“ bšÙû÷?«›‰8«üûÖo0qýûj3¬ s)LuðøT,Ç*\““®»ÞìÁøê >ãPß®½öZ«jPúQ™˜Íþ_Žßžvׯ]»Ž`Þª[´h΂KõXJ¼•Y†KpÛö­V€›:ì]šôÖ±ÿ,MÍF%Ú¼ecú³Ï¼°œAî2.ñ»PÏ­H ë§™3f5«Ù€Ñ=B‹*òhþòƒŠ¨QFŽašÐ0J¶`áüƒ¯¾òÚú ^Çý¿€ ]»„_bÀ¨Ø°o?íV<ðq¼ý–•Ô®L3üæší礂¹w/Xà:Gž.W_åѮຨí„Òy뢖ŠÈ—d“²r•G;GãÁç’ÐTy/*ö¢fL¿ï~³dÜ›.MµÒH7I]Dì°wè·@èóÏ?oíçý·›ì<àeÿ·ùÿÌ'À§YbbcLuƒº¡¢²5‹èë=C @“àÎ&½)ÃÌò•ËSž~ê¹Öo¸”K–[–Á¿Šdz ð[¼»™ñ×2(('jÒ0þ6PÃ4iÖ8gã¦M©_ýõî±/½ò+yÞ®ä>{ž´Ðç€q ÙExi BnËcÑó F³êL¤Ù¶d±Éȳr7!Ø$šXp¶!>ÿñðÃöOËHtÔ£Þ³¹.,dG£¨ån„¹”ð¬p$›Hi5qî#ß\µYSÓîÚk*œ©e`cXþå—fò5×´6_ó\À”ð>øÀœþù–­ÉyRkô°I#äÙ%«øãÙç\Öfo‰ ^Çö%¾o!ÀÝ•¶ÏŸoö`PÊÎÌ"¹¥•X¤6 CÝ]’¾\ü+k“¶»ÿK/˜Ó¦™¥ÏìÄÆ ø}äñê:=zXÁDbD–dàñ*ÿ”$"Œ4bªpyæp¾¶,ýìsó7#¸\pN¸ì²ËŒ }šf^ÈUÍB¤ÎKnä‡OaÁΛòöå²¾è¸ãŽ{ ñ?H}]ËÚIÚµf-2aÃUÌ’ýÄý~=Ta*>ÏàN:ÉB ãÑóÛÉ*·Ÿ˜€-i+îˆaðmÞz}!ožÆ¹=à™ö5°<7pL‰³üØåøs+㟔Eç×#ó1(«sªcÄt7z«G2+M&²nãO‡<îצa¹ê«¯M¬n‡Ötk÷kÊê·$•'ãq¾Ë6’ÌL&#ÓZYð*‘Äí÷Þ{ϰ„<ú¸Ã&ã¼Ù±?›(ÇÉêäÒ«¿‹³+q"ªuëÖ—!úóY"¬>/[€¼±±±5:›@V7šÄ<‚¬â^œk+„@ìQŸþùÃûÑé(–íþq¼>ˆ^ÌFûÅÄaY#l©sV1Y¢/¿_õÇ‹QÆJ=Y׈!¸ ƒ…3áê?b…ßL¬º¿ÓP¹TÂÅÿ7gD?÷‡ïM[tOªâhvòÉ–+K®?'Tcî€7Pçßãp‚»KNa±òLì "qáØrU&æè¬»ö•Š|“ÆŸs®Yû5~œtÒIï’‘±Oþõ’‚r<àÌù˜[ÐãlÊByÚ²lÙ² —‡‘X@*#ñ‹^D;ÚbˆíÛ·ï/Ø2îDM.ÕVª›½5,ÄŒ±år¸ÙsuëÖ’X# Ž&ý^"?‰>¶+çÖÕ/0ª§ïõVf)WáþËÀÀzîe5!=xGüÁ¶‹Îý|…þ¦Í¶"ÖN…aEglÀ$üÚ³ï¿ßÚ׿¡ •éפlÛn¾`Ñ‘l¼M4:÷›ñÖ =M´ZóóÏæïW^5P lPLB»‘#L«sÏ­TC1³=+W™¹/½d6Qo'èÜØ±c Aeység‹¿ÿî»ï©jy"(7^YÂ)Ç{ì;H.uä®T8¼ ‚R l:ƒ`íA1ºo0–_ÂD¥y üÎDü„LŽª]³æÃ:v Vž³mÛ·¹*..–'î$„t8Þí0„JÛšgœqFp•Ȱt‚˜ì윿>ÿô‹ÝyeJÊiŠ È&pxº@ôÎ7Ýh­0k-– áU c§ %ƒ¡=ro™;×ü|épWOþðS)µ€÷økì+f„aCç[o1‘,dHœýäSf%–¼r"q‡‚ªÜƒh¼ÝSVÇ3QW~lΘ‡ ÔE3ídÝ×̽ÜD¥«…òQ0ÊZÓÒóJ’º?(w´üÊú-)Ó2ÈM:¥.Fºaaá:¦Ò烥éD L{ÿi¦_+2N‰ ¸3MÖjZÓ-YÊ º†ú üÎX ñäîݺ}Û¿oßU.„,?äí7‹—.¶$ÿ"B2Ñõ× ö‹g«ÆnzQAw‡„†‡¹Ô””Ìúì“/ˆ²1ƒ§€Îg٤DžƒÝÁ|mµ]K‚+~ 0<÷U(ˆx¿Dü=ˆ,¨Ç4ÚAO?mªXYdr«¦[=ág3`d?8ƒ•´.Â\²/zýuû”kKǵ¾•ë;§~ö©©ƒ­¢`'F¸9Ï)ŒwF¾*hD”¡Ÿº5ȈøÅ0˜å»®8?$fÓÍC=ä¼m?‚ξ”ÁïoÁÑŸñÙ¸ÄÄľi¤'ÃuÙ€Ãr}›6msgüpQ œ2;ýôÓoêÓ§O°ÖÔû Z\eI—íß·ß|ðþ«n¾íæžÐ€=ðùô8¿{]ž¿è [¡¬X|YØKc°ÙEÊ£í;¶Œ*9ß~ûíw0“©¡8¨¯ \òoP ¿wè…COhØ0~RÝ:ue¡H%`̳-$,Y¼ô|®é ºÛ9ô»¨ù5ºÅÌ}IfD³}é2–ìÆõÆNDe+®IS+!§ê–̈µfò”ÜZHYJ\ºôóÏÍŒ–Nètã ¦ a¹š„4ëž{§L눛£Ìt!©JK²…£RlcérÁžuk­¢ÝØ´€jyl‹>øÐüvÛL²Û*FÇ7¯ÃÀäÓ—:)P(í)¨;ö<’’ÔSKÔIôÏLì"j°ãÞ—D?mÀóŸ7¸•fø)¹ ¢y0^¬Äé3~» Uë–ÍûëïÕC‡MÄyÔÀp~3†¢¢€•ÖöOøóÏ?çSúzC&È’ÂæGÊyõË*¨×ÙYÙ¦~½úµ.^Šý ¿^TÄüÊ$þ3ƒé±–­ZV!† GÊ\r5`=«Á|øñ‡ß}÷Ý]ýn¤^©EÔÍušÆ»ôꫯþòÎ;ï¼å†n§†¸Ò¥sç·jת¥UƒH”J*=WRÆŠå+#]xßÑÇ“úñ+Ø t©Ö­3+¿øÂ$¢Pkó)]teÅD%Ä› “¤šÂ1 ®a~ûÒ?2ËëmâµëÝøôÓLFG÷f1ãp¿Ã“ ôéÝ®¿Î AVì€föÉ#¡%Ó·¤”²i³ÙºpYBtݘ@-F (˜c™©ÔQLj„¿K>Ôh¿†Eä è¹Té¸ÄLwêÙœ~ð"™s±YèXIAö©Û""òÎkõPÁs"ÏÙ@›ïÈȨ*ÂDòµˆR3eÍß¹kg$߰ƉS.8ÿ‚÷zõêu9uN@Ò껋U€ÿöúü'ˆ^ú9L®/6µ†½XßB± ’æ$ek­ÌÌôL-š9yÊä×òßZø/§8Sø•¾ÍCU9ùžµÍ‚; ` 9¸dÎa÷;ë€oÿB™¬ñ"zÐÈöíÛ+ D :ÔY²lñ#±õbƒ´F¼5BÓaø³ wQßÀUÛƒï.¥–¸Úe)½VâêJ§Ð 2" ggäÚ -BR•‘g&¹SÖ¬õZ—fŒè=!r¹“I7;–õ®Nhp[•x‚̛ǒÚ ÷-Ì•f7³ÔÖŒ’g|ò±—àé¾ÒÓ"-à¹èõ7 s[‰ç è±Aý¬3ìc‹Èö¹ân']éæösÑ ÌsZ$“Çnfnů0 Ž>ý ³’¨û Ç›Î];çöK¤˜äØ ÄkYò™{¾‰A¼÷£>zðEXÍêÅGoÚ´é¹!ƒ_E¢A»|kÕ÷‰#íR1ÁÕÑ‹yŸÇË!ÄœÇ}l+CLœÅ¡ H£*èßt7z>4xðàWN8á„+˜4d¿Ê«T—ðYq@åLÈ%þ\ ˆºb€¤ {À‹ÀKÀqà â,Pêë9cÆXóÈ»#BË æ) ¨}}yo’;îÌ?´Ö”‘l;¡°rmÊ`Ø·aËsÏ1õ%Õ^‚¤awBGDoù´€g$" *†úA„Z¬4ïÛ:O•x_uÞ2gŽùù ÝÄý&¸@‘­)»2ŠyÉJDåYA?Î2Ô£ŽAÒyÂo//‹úrnνŒýh:ßÅH B8yŽ%ãnÁKÓ«W{&ª‚œ*‰˜ïD߉* ÙUvHÄqV ÿþAÀÝtö‘ؼø¼¬¡)£B …Åöø•¨®Xüw‹] @Å  ¶Œ÷꺢ÃÎ(ô¥Ë±„¹ÇmKÌWƒê®µÕ¶<{u•¢žá8¯áïzPu› öÅ e+°`ÆË‰W]m! (êNëÊUdÒì´ÓLsrÉ¥aÇŸ<„•pÂ=D<º/⡹Þ‡´QŒ€âa*ñGeu:çñïÓa’Y^£þ2\oîp yñò¾FÒ²©¶è_•¾uLç ŒõšxÙ\ôòð ÎA–¡ PÇ^âEi\ý79ÿäÊ6‘Ú·‹p‰óêÝ»÷0åÄÀɃH¹•sp§<ˆü\40ùôýïà ìNüº[aÄÖ²aedÃÉý—[¶ 1ŵÉà'y÷e°•$ðx'xH/È…õÌ-XÏ¢–X´5yûe(´:ˆ}AEmé„ê ,DoŒÐ ¸O5Ö¬Bo ÔYij9¡Ëˆ+sí;΃%Ü×B"ZyÆýh9¡>aÏwÝu—iä)åÓÓdNYÀ’%K 6&S“Qõ6Ü©ÿaî•<‰©°o›B_KðÔí,,ú%Sϳk8&|í’e¦Yó¦V싾4‚£Êã¾{£ø $YÎó^ökÈð§%ò¤f«È<÷bl¼H/…¹[5½\æûaV÷Ù'_¿FgÍò@JІð_Å›Àšˆù|píòd¨±8 ϰTŒ³êj‚$JõÝa7Frþâ,´ü–?dˆY‰Ø-õá5U©Ì—1ýX„ÜA#ÿüqoæ;ÜþÚkü#ùðÁ” e^Š)×ßøõ½eØ;ž¯2¦©/‰øí>•¯B¥ü¡€´ëñz €è߯ï¿Én4Æ<ñ{)}ì\’M™ÑâiŸ ÚįÛú=p§‘æ[}V`Óƒ¶zOõc~" ï}•ÓU­‹ ÿWÕfºWåØ %5…ðÍâßKm•5^i½lž ÀW 11ñÖO<±-âQÂ׫©L¸‹Ðäï<ûg‰·v6ÞñgŸcVãªt‚ýl²âjíéô²ìË(G܈åÝq^[š}¹ OCeêÉ´èó±ol'ô|1FúWa°F. ‡œ‰ºr5± ’¹=*C£Ý,ô«WŠ ¤¹ˆ_çöÀ&×%ÙÚÓ÷oÉ=SèÿÈð°p— ÈZ¹5èâ Ë/BZLîI¿«ˆ5{åöSЂ*¦µüD´¬î+æ[Dã*¹¹k×®–Cת‘lP9‚ Œ|¶D€8€ÅlòÎg¦—HK°0ÐÃE “Á%`è‚Ì1þnZ\p¾i1k4nä:WYv$nKÜW›¶"ˆH!µ+0 ”wéÛï­s¨õ÷/]fµ©³î½î¾Ërý9g_ÏU¾Â? ãÝH¬…;ÜÈ’k0+\œqÃD2ëuò/pÉ5j† q)5—¾qA}DAhXÑMc"+Ÿcöe« /ÌUßòúŽ·2— ‰\Lèq"á·ÏsQ¼· ÝŽ÷âwÒ¡ë]º!YØ`÷e»cßF ¸uà]®ÉoqµobK€Sœ;‰¢­,$7ÑY&³‘rƒ!×µëw€À¢&äˆøÉm/€–÷ªV!R$‚ÖTØ£@#´KÇ´¯õÖm À2r\«­Ø 7, Èûræ#~ç]+XÔr姸 oÿiAN«âRiç%å¿ON½ën³¬ùZ»¯Ïw˜ž·ÝjùóçA˜Åì@Yá÷šöš¯žµXŸ0‘…@J Zrki¹æÕ}ò•Bn™ÝfEïéûj:¬RrËóC܈(¬~ ¥â”¼³1xˆŠÌãg×UejVàŒ‰ƒ±+LËS‡gXߥo£¯6IèLêp1}y"¿ íÀö[I×Ò®ÂhÏ:ë,댳?Ûj$dÞ¹3ogRÐŽ"òí¶iÕ¦–¢î³€FÿŒ¬ ÙÆ*Þ€¨³_A9Nâ× ‹`!æÈ|o“ÿG#Fþ‹Ðá6—T9B•¯Àj<:7罓Y‰µà‹:T›r²ËÖó.ªtÒvuNüÏÇ7ß\t±Y÷ëD“ífE·ï/·-mÖˆe·²_Õ~Ëß{ß$B¬|þ­™F|¡Á}}Ä´"ú-þ¤­e¼Õ¦Nè~+ã/ (wÁÏ,¾ñÇæ#~¸ o÷Þ{¯,âVÝT¾Úׯ¥Ü£ºüòËóÅ÷kñüçŠ*-´:"”'Ÿ|ÒDÑ÷Öpý&¤‡±Œúuä.¤¼†/a:Á,Q>Ʊâ‰cÅ%~»üžì4@z#SûÛ }g¿Qø24p ç½ Mš4‰ÊÊÈ])K@’ôžÂ­[·&Ûeûºõ¥ÓûZ–uQPÛ eK6#Á§;´,1ƒßÍŒÕÄ Õ(Nt¿\ ßuˆDYÙ‡Fýýû‹Ýîðô[q?èRc”?•ÅJ¥Œ1ÚwB ‘vSk'Ý>Êìd­¼Â:󾲨oˆ;«:Á2Ù)4 è k0 ”dDE}îeŽc}dm"£U³%µjq!©b>ºò÷ƒÏ3;åÓ³Š9•éÎ/¡ ñÛUPôb¾³$„|ÐÒÙ5dÐuž@†½áÇ›xV+l)H78æÆÔÜïMç_E …ðì¤u7æ~a1ëþ¨ÖÑ;™€ú¹ý[Œ>T½Aƒy{‘„U,‚WôŸr32É¢… @ MT*ä¶f±n)übÜ5;aô±ì ›ø%ªˆ@äõ•ö;ê2™a(£À¹tÄ~1û\¡[T"£r3©Zú¤©gÙ| L@Êi?CT¾i}@=[“Q$ 0ÁÉÞ…4B¨æ4 íß~Q{ëäj4¡b©ˆÿÖŸ% é/¡Ð~¤§­åÓ ²c.(*M¡zž ª«:èÛŒz )ÕÜt'cZLfÙ¥|`z޾Û4eBŽ·è;»<ok·imN~ï]ó>÷ýˆåûñ}O¾ö:£©ÐŠö“¿_j‚z²D·fú ù–‹?úÈr‘ºßƒÇгW~g»Ù׉‰Òùퟷš'{³]•²û|¼âÐb;hDh3È%~¥äÜÆ@r 1KÔÞäÐ#…\[ÚSó)`ÏkŽAõ×û Õgܸº×\sÍ0\êØT”Íä¤ñ ,x™ë&bS«£Q_ô$ûšúúATÃ~ÿã¹ìá·ß%f/ÀåÈsŠ[A0GóòKßBdÐ ìÎà©1ì:Û ¦ß õµm–À1[PC”QrÁ†rèû°ôS¥™²ëm×VÇ41D1ëbŸ~ú©5bÙ×(øïÌÂ[öù,Öqƒ©ß£»+¢Ë¾¦,·ZàÔqÿ³V-þû™Ü…2´šR ú©;´Æ5¦¹¾€ÔŠ-sæš™,s–Œ¥ß 2êjaWÍÙ'ƒ• F}ïmÐ9_§ðªŸèû+¯ÿõ×\c®¡ÌG•ˆÉSøv±·Ü»)ôªÉ“MUžd&¯òËÕâP¦?a4—ç9ܨê+žú¼Œz:®†°÷`fždt6QŠÓ’S’k)ÒÕ¢hKƒ¡0Ïî–ÂcŠ~gˆç;™m©âP–¥ñDF¨-ÝM„o½Çì­§ZÛçì­®Ñ~/,÷Ÿ 4–Mø™EJÞz füCƒƒ>ÌpôKe9* 4B)’Mi©Ð"ëµ\P6ìADþ• “D,ÃÊFT³y3ûT™o%î뙉ˆÉ+YŸ~ FÁLÜ\6(H¨ÇÝw™–øã‹œó@{¤@H Æ¥o¾eáÚ^|ñÅÕa4³Ž©s3šF6ËÈ'ãŸÚI Á1¸ ÊÛш§4]?òˆy¦² •&”:øóPË.@2ëªó7ø¦púRrþkä„~ TøèCàTp2؃X-}§6( ,«>ï©>­}õ%©;ÄH-]_#~xN¸uyÛòH-rGÔ w;çw0jÔ¨û“ö‹äºÅ´áŠøõB6A»oíºÙÇõ[ûNPYè=ÁÁ¹!ìs6»„àí«ÜEyì2¥‡z3>Ù×8·ª¿‚[dPzim¥"Ù°–åÁ„]pɵ„hòMyA5Yé”í/ºÈJ© ceÑJM3V–b÷¶w¯—Fýõ¬_0sÌC&&à„ÄÄD‹ù©­dÜÒDͳ·m#j-´!F å¹Š"~EÊ0Wâçäü{H¹Ýú†óùö¾zÏÏØN‚ÑÝËþŸ 7K´}OI·û¹ñ>ðYp(ÂWo<N仾5th¾¾Ïaï-Q³ÓV}ÞÆˆªÖ´w‹1Ð×ñ¹[er^5ÿGЊ€à"Îû4K+“œ59ÝéPeêÚ·QÌf:¯ßE¡Å°z:™¾î±Ÿ¡ó%O eÒš$d)C”D{½‡/Ç•­KeðB·³ÄVIî~ÞÓϘ/ÏlåçËÂËQn@Û…c˜«þ­ƒu;´·r¨M½ê~€}:¶…ñº¿õ¢™Âm½§Ê’qK’²÷8¥'RÅ›'žxÂ(ÿž˜„;ˆAtAå:÷ðÄþÝHMƒd'(¤~*CŠàÛË—[®¼¿FåÁ² þu”{:8ìN›‚ê‰2ŠDÒ¶ê?vÿæµooí­¾l¿€“ hMMO5)i)&å`ŠåP\£W¶Äýöü.èÁp¥d1R/%‚”~®}U^.B½ uÚ*û•°+'ŠØ/@òÝ}µ„*kèÄùÅÙœ/¤óB5†§}ûœÝXú­2:¦æVf[r¡ý«X[w ë׉v êÔÁ}V6²D}0ÝÓR¤çJÐ;Èख़n }}ùå—]a¯*ûôæG°Õ¥—˜vÊp[Èt]_ëSÚëÔq53PyùäÒt‚:¥òð ¦ hîwq^‘_ne4¥H?; GƬ1ä]PŒÀ}„û®FÝŠ²¥­"}âNRwãS7:ÿ#ýöK=í[ðlðjðEP#…ÀIøúmþâWξ»Úʽ¯;ëõa›N´/zÑqm†S=îÛkïg[& `ÇÎÛr²rZZ/–7QA•RçXl¿”½ÕËéZO¨sû5‚îä^/À!±ß¹o]äû?§ÜÍmƒ®áWb­D8_A9åmPqÑh¹3+Ž]†/”P£¦+'Yb³ýnºwÙ;ïZQ{=pÅ5#ÏDõŠÍÐŒÇ?“/âRu‘u_:¼¯|Yï5ÑG}A(uH1Z{oî¼×ýÃMVÔ¤»6bK¸š¶ÓÌÂ×9øŠ}ÂÏ[·*_1º÷ƒS@w‚ç Ôqv€ý›Æ7°Flõ§àÞ·íþo÷qõ›FtL¨6ó´ëOÇ‹:V  Á†ººñߖĽdüñôbzyû÷­ý:.Tä“@ûú N¢‘aª„à¡n£Œæv9ZhB¶8 `¬ßZWž5à¬[媑áËfvà“>ªF=Mýꫯ +'[ÌM7é}Dx QzQذOùf#Ú ÓšMJ0oÙx‰é°bö}i›øí´Ý2*pg3„ÿƱǚ~¨¼x.V ŒsËáH"íØ¾Åµu »¾çä¹”Tq?8Ìíuìxþ.P£ÇŠZ5Mß~}¬Q[S‚ýÚÞ·‰^¿íc"t§`3óÆècrjHè8$ó£(ð; ßå|í 4ÉC€Íál®f_ë‰ è˜À¾Æ¾yá'è:­ýWB°}¨Í¸_ ÀuZ’’Z~gû˜¯[%±P¨«ô]Ín¨ãkzkbb¢e(³Cº^¹í¥j¼óÎ;F.6¤0¯|ÁGŠÕWNÿÚÕ”%(Œw9Ìè¯ÇŸp1#ûyš¯A̺Eøz=é˜,þÞ:¨F>EùÉB‚K‹á5'd÷uÞµ)jŽO„O¦3eùLlWA "Fße2»ö¾m7rÙHP£øí๠z¢·áE„¯{Æ€A­[™á—]j}gC«¿K½Qv¢;ñÛçœ À¦{«þè ˜ ~‹kļêé¼·cþf 1ò\."׌@Í´¦)æ¹æÔ9Ôzq›«Ù/¦ Ú  ­Í ´ï›¬ëåëçkØ×9gÿ• ˜Ý6’ôż]²öÈ‘#K•eV:Ÿ$‚9 ³¼®iÕ[µír:c´/_7I -µÀißøÓ#lÍÕ¦5£§2óúÆû^‰Ý¸íœ F¥0^BÉ:/IFß@ ßzYþÅ ÜÃ|eCCSºíó0Œþ‰¨_×ÀÊÖö=eŸIøòsìKÖ ËôÆçƒmÁ@[àΆ8àê0KÁ»Áú0À·‰öܳ—©Y£ƒ¬À®«ÕïÕwÕ.N·÷[]gÓ‡¶Î}o ϵ|ºÛ³\õpßñ+àÃß ˜~1€ÌÈ‹ŠŽ²€^N /€FA…ħ˜ãlu*íãöo«q²œ61“Cï«Æ*!hx>TЖ"\7Ú? lõñm°;H­¹óÌÞÎL¶Ý¹ó.лË 2e°çºë}ìÀÍs—•\ OE.3Ý#oÂLP±‰ME.d)¯Åo½mzߟ5M7Ì‹nh×Ï—­òΧÌùLÒ±FdÇM,Na."^@î¼5¶}s+Ñ?ŒtÜKFÝdêÿ4Ñ,»õ:;išiþÆ;æ÷q/™¬ª¶6y订ìRdX³íj1…ÇÜ œQ´æ¾Û°æË/°ÉÙg™&'ždª“–,ŠÙs¡¨è]¹DHJXòÿöÎÀªâúÿgÙ¾° HW„¥KQP±7ì 5ö’XbILâOMb‰É_&šhlQ£‚…(jbŒ(b»F,Ø Å‚J‘²KgÙÿ÷3÷ÍÛûÞ¾÷ö½·Esœ½sï;3÷¼9gÎ9sfî*ÖKŰsS[åpô¿eQ>4 |Ï]Hñ‡M:.¸àÛS Þ”ºßÍC²a|Õ5KÀdßwP_¸Ne#‰7ÌU¡¨øŸ ÏzÇ^›êbP Ë7 '„®§K®QpýÏõMõÏ0݈Œ îÚA¸'§Éç5iŽ^{H7úÓínÖÑ:ù}øBºtÁ€lÜýéÔ¼@]}k8/çÈK±ÕÑÄJ&„?÷B *£æ¢f‰È:rÝÃJiyBœÌkcßfÎß!AV´ý¶öîiÖÿÆ[mÆ™?µ-û+Õª³Õ;YƒìB Ht)^¡iPÍ ‡ÁûjkkÀKsÞÿÌ…YàãФиF ûÙ‡;ÛìÝo À×}Û÷íc)E´_½l©}1ó]«—/üŒoe_¬}xùÿ¿Ÿ|Ä„9Uë NRxî­e¨ö^j˜?ˆñ_Rðòo¨ß”Us5™ò·âÞ4=ûc!¿è)B<¼´.] a|Œ™«„O³¶ªcÀƒnôK÷/F®yíÕÝ×ußç9†Ñ ÿ ÏÞÿ’ª=š_Æõ¥ €-ŤNýGÐp-[LPÿ}ë˜BUôÜ_ç˜LÎA/í.ªJ¶¨‘°Ê€°¾>GÞ@•ý¶>|‘-àÙ[v.ƒÑù‹+/µš·gÚgûìa›>ô¨uœþ¦µãwlªm:q²}|èw¬n@?[Ù½k3G!ö>Ž?v¬eá BÀLòñ0&ñt:Ä©üØáÿÐ|‚‰’aÊXôÊ«“ï%Ÿ#€pÖ±.º·ülÙuÝ%ß³ËοÍNZ5Ôªcû9¦{É$i6£5â_&º¼£ŒxL÷D~×iý$áBFý? ‹…@&Ƈ0 ¹›Ý°E Ì*X©&*ß§ýÑ ð9ÏÃðþè€i*3HùØšÐõ­•î"d3#H/l=È©·'/‚ÀˆHƒ9r-°'©"ðÒŽ€±´¿æ™Ÿ{hÈ8"«®yX¥Ñ¤5À4B*àgNà&Nœ¨Ï ¿c‹õ·ù»ílÓ/¹À9]}ƒ•/\d%Ú©hþ¨]møo~çÒm? ¼çÉu!„˜} B.ìõÅ?ð¨aÀš #4fƒ öÖc‹-<õ8.³Êày¶ÈÆïÁo÷°|Ä-ð¦~— /¼ÐnüÃ1vøþ#í?]dǽò´ÍV»R¿Ð8 Ë6úšïBúkõ›­k…f~ZŒ³¿*œ"<"v®CJ`ÄŸ#dýh³§ÄüÏ(™3  y ú+S=KÖ¹ž ù=éÏ^õ÷ÌÏ5¿Ynrà RÀ¨ך]Š«½ÍîäpA¶É0¿Ÿ£äÈy*ÈäP †æœ#DñžsW-ˆï=èë"â*_ 6Dà”ddÏÄÔ€ÅAh30mƒq¼ÊŽãî¿×^ak¶Ëq'Ú‚]v°Úqÿ°âU«mØE—ÛòZ}]ömEÏæV/šŒÉ´ ± ¨sä$£Îpü4gÇ®±c.6!jáÚœƒµøœó>ÌB¶Ë,&HÇ¢|¦ï¨ºs>kÖ,7ç_+Í€ö„Í61fGÛ{ç¡Äb[÷Mªí¾ñ¿±p©Ý>dGB|9çrÍvüVÍd€ H,)\jþi{ Ç /NzÖS2%ÐŽéÂßµd÷n°` s46ßo üïå *j®×çOîû®…AºuäI;éÚ=)®'\*ˆPCGx#À8øRAxD ߇X¾ó%…é%®yÿ‚c|‡cx–ò˜ù£(Žõ=#{Â*œE-ij¤Ußp«ìh+,pAeÃNgോÏ×l€ÎϾÀ¦_tžm~ß6óô“⥕¯Xi5ZS¿ Omü ~t¾„‹0`¶À;{ G*ÿ&G€áL¼‡gdò…5 Ôóö$ƒ`$óú¬l˜…ØoÇ.ö½ÃvÓt,@W Gï:Ïö>òÿÙeýFØ=Ò†ž“¯a¬n_ËSèÃ\ø3á‡Â_ Âø™˜ŸÿIáï…j=Ö>ÁpÇI$Žnfh„lHî¿"y ‚º§BßÇ8ò¼^à˜.Ê’ü)`Ûך]*„(Vã#‹;Ð9ÓA2aÏ~pÊ_ìR1ÿßü_VyÇ û qìU &Šçá¿Ü›(¼"PD`z˜?Õ#yu"Àú˜:'Ò¾¹À}Ÿ´G®ÁðÀ_C¡6'@^Û.!Sš“B€jlÞ3 Oc—d´OyÎKOŽ £¿gta`C,ú¹Ëãß©òäD­¥šöC ¼u³À3uÔ¯(¶ù_”jµWðµ|øp ú¶ E0¥G9|Ô‚z>>x´Ó`º¿ó®u‘“î1ß³uš®#ž`ÄM·:³`ÖÞ{ÚêÀ¤<ü©„@½GcHg/¶Dh -í1Ð2 9@ Rךåöç‹OpíLWVûöíì°£÷¶Oϰ-ÒeÊã:¿ì¿…ßâØû«0›LëïÞÌê}_É ÂLW' û©øP ý9 ž©¹îûz¸¿“×_OÖÈ—Nˆ…‡«"])ì-œËI:(„9¶C]D„©*M÷䥃{P&ÌFyž`þ4~Mù<„cüµl餫Ç N9Ôj/(f̪²>«°·?¨²å+3*;³8Õ°¯½à}P¯ ’A,Úf¸už5ÇÚI³xó¨#óSWïXƒ¦ ç)ò®vò£é}ÃÀû#lÏÅæçÜf ÎHöLcú¬¼#ñû¬RÄ_€6S¬/O]ó»ZeY l'A¼ïNC Å+8Ùùfè8Ex„0S+ ÈJá_„ûê³ïbþ=”ÄçØó+KJ­€ëA/Î䢃”‡" [Ü£xŒ÷a ß÷ýÑü}ÚûØ|™þè5N:ö ¥S& !ä "û`Vá,ášÓ92ü‹{¢@$TªäëÑ €Ø4Kƒígóìù–€z Ùl3is*õ#k+ꇺj¤6öÔËíãE03¥Ç|}xVÁû\85íìý=v³Æ6—H€n6é1[:h õ~x²½{èAV!!8|ìmV#3! % s`RÔsБA€Y ó6‚lÎ;/Ûß/=Ñjªdšd];V[§3Iÿ‘»,ʨSž_ ™“¡VÏV& C!<_x œûŠ/¦dGáSÂl!/‚Ñ÷aVú.¿AÂÒtõîùþêèû:ÏÓÏ=ã“Óùϸ—x÷ŒPq]'£ÁIÈ\v*HÇhá—‡0 ’´'(Dó/ë õá—©êÎtÍê™òø{0^mŸöÉÂŽ¶lE;ë·ùJ›ôlG«,×î3éÈ;a“3·N,??‚ÄûX!çg8J5;°zÓ®îþŒc°Ÿ~fCÆß­(ÂvÎ/àNúCøUpFî¥i¼°°áwxA»ä°‡ú¨7W¨W@!Ènü…õèT“õãøP½ƒ³¹³~(–ñCî!ÜAˆÝ>@˜ èÈ *Ô³/?­ï7J6÷Ñé[Â\!ü3fý¬cÔµååpÓ¤<@yß—“¾/sä÷ä>¼ä‘rI§ã¿Ã×:nJ§LB ô%ó^¤™lÓ°€)8÷è‰Äf žH.@Äòþ@¨¿–í1WæX»¶ÑýVµ:¦}ðq„À:›3¯Â&LêbKëKì½+í³…ÃÓlsö»Ã<þ¯²/«¬°×9Úê;ob=Ÿÿ¯ ¸ëÅ:h#K™ õrÐmµ¹Hï—_i& ‰÷ì¨ýó¼°áïðñ\Ëægu¶=tóé6 w·liÊ£ö îÝÅf4ÜEÕ5ÝHŸzI·p]ÿDøC!:jÍÄtà÷„G ×G~^7ë®ü#uŠ<Èš87‡ø Ø«ÏoˆËy$`dß¹GÚnœ{ô|äJŒùIãJáݧ’î÷O:ovZP.•— ±ÒÉ@Ç<à;©#íÈA¼/ÁKJO4Ž~ÓO÷Yäãu¤¨/~¯…DK€º­a  º]ûÉqíõ#šýúÔN¶ýÈÒ!µ[Í{mmòs×$œx-ƒØ~¶¯­­Ó‡²Y"ìü²á?—}?w]í•SO¶×Çom>]`íä‰1îN«}îëþôs¦©ëñfóÁ÷ lüÔ~/̬$%‚:Ð&¾Çwõoµm¶ê‹:“){Ó=ÕoËÅ{M°Ê÷Ùˆm]@NS†Äœ&5Ý©ø×ñ2!Bm…™€Ž;Mx€ÉÔÏ‚U¹ŠãÉ}kl=“ Y¾lòcúhÓZ›½)Gs€g~hí íGŽðU:€ï“MuÅS-JíB€”Æó¶#·‰3K¼9J`Ç{Ü1öÛß¾ìÒþåQ]}Ú†#ƒŒüÌÿK/›„uÞ¿šj÷S˜Í»€ïïZ*{ÑE9f¥=Àevоm­¶g™õêÙΆ î¡©ñjëÝc•Ýûhg›òßæQ…ØÕ˜xó7 }o.ñ¨ìó‰*ÓrêÆ’bûøø#­AÇF©–UŸ}nïvˆÕ¾ð_+^½Ö:ëÛóæÌµ²é€™Âl@*ÿ€68 ¡s*`¡ï§çÝj=ÿ¶¤WàäL•¡gk—k•Í#²ºï0[8U쨀,©/ûŒèä"lš~¥ ÝuŽ=J}M¨'ía‰°%xLö— 9KÇú¦ÌÿQòá¦ÓV¥R%‹"Ýz€ê«aÚ"]ß1»g~¼á>Ïu;ï²£]páoÒjœ€M*hš¶BôI.ûäSN´oÞ/¥@¡Á»ìº³ýø„1 B€8“Çåß îÓgD €aOkfe1¡ªf'á‘2ù&‰µøñW_}µ » ¯gЧÌÎÿé&vèèbÞŽúÀFW;h¯•,öù¢2Í”«­ê1à]a~„NEïà¡a•½NÇÇ#†Û2MËÍúÎV¤¶T‹á»Ý6ÁjµÒ°FšÖùú=1Õ­9ðås¤ïØ[{î1ÏïaƒIàýþ:G¶+g‘ðÞœù¶ïQÛcϼ))ÙÔ~w÷‹éšhÓÏû—†¿ºœÈ;];–[çÔÚ'î`‘ÍJ÷ÂüS„» [ÕäÂÚöWÄc¥„pyb¸³¤ æI¬¼¥BÓß§º¼`LÔÀŒêM…@ôß0ú~Íoå‘û^0°¿}ïûÇZUÛªxi*3H 1Ìö•’Š=“ó&ŸB$˜T°Ç¨Ý¬Tê.,™ÊK[fÔ^£n‡™"xâøëž0HqEÐEc“šÝ'`& Õ‹‘4_XO¨Z¦,Íï©“^Zè¼úíšßM¸Bgœ/üð\]­Pây }fïK`{$Á¯u¾4éZkOs|ɦ꘥¢_ºiÀ­ÔüøhÏ æ€×|¿çèÀ€Á檼wû +TÛµ«v­·ÑÔ •zå*„'spî‡î¼FkÛÃ6r8Ó‡·ª~('à_<ÌôžHá#ª¿Û"£ „ˆLùBºgmòS+lþ¢»éKÕNíX£€ìÌü8ê»ü8Ïðø21›8 ýî¬_ï¶vôwÙê†vø~KŒHÂwçVÚÛ:†›N[XŒ„ÊöPWٱߩW­ÕNC+µ7ßZmE6][Q¯¬‘E¦ëű٠߶ä#u0%Kù0¦1,ªcn:7Þ¨[¹Îžxä#Çûuè„ ã' ¯Ý}w»ïÓOí-­F$l: h'l‚©Jß:/T2·— ÕÊ,U²s:¸hžùý‘¾îó>ÍJ, €À^±{+œ¸ÔÝ.Ö’è-ïoÝ5‚zh·`‘õÕçÆXhìþKô©í4ñäá¬V¬êCMH¸—òD™_Ÿ]g›½¶,åþýt>¹íHá$}ðE­ûxòÉ'­»¶1K(wFDx&2K­xöœ9Ø8‰å†;ÜùåÂýÙŸû>>"¦¿6]B`¥ó,YúEbE±3ü!Õ5m]ðÝ Ï¿˜2O¦‹T6uêSN%9ø»ÙäÇ&Ùãït«âî¸ãvûdÞ‡¶Õð-]›¦Ny2¡mÀ3º'Pøœ4LO>·É¢F,®yàz¾ÀÚ÷pY¾œg^Zi}ºÎ¶^nK—­·÷ç¬Ó”_©œyA]ÅÅenGž /¼Ðí$äçji +Ï=÷\שýTM¿Þ¥6 o™sp è×ÍöÛ½ƒ54V$ø–¯lc>ßä±'~€…D¬/@e÷@{™ÒÃcÖ¶$¦Ëð…l}«¤t}\¿‹·ßcœL'd tA&þyŽ;lÙIû fßeÖiðç?sá»aŽ‚ž~Wøžvž+ó…Òmd-o¹å·?ñp‹„l ‰yA:€c#|Ï3¿?ò[‚¼+Gò®Rdè›o "Õ£«¾Ã03¡k³¬~±ÓäÞzómÍ®eŽíHõB ö{ª Y\»09ÏËÓ^±ƒh}y*çTÏž›Ú&;Ú–[ uš#ÙsÏ>o¹çmüøÄµû6]N^?òqíÓOç¹.°%5;!)} ÄJ©L³gÏñEætDµf¤Mþúo±úûaßng÷OÖ–ÏêÐ#·*7|¯¼¹ÚvغÂ.ºz±í¹S¥“Ò|ùG£>Ëf~H˜”åµxâ .–]еs±L‚R›7¿ÑFïÕɆѬÁ¢:u€uŠèhe¥šQXíœîþE  #$^p?jS€: Fµ©¬Aù=ô}áE["ú/Ù´‡ ™ø°u{eºÕoÞÓÚˆî,fT>ðɧºù¬SŸ8")ÛÃÇôÑÊǘ%Ÿ…¬]°|­Ýzö«ÎóïËxP‰³ô›îqé¥öOùðC´† ýØ¡ƈž.‚ÿ˜þÛ€K}X>o·ÝHçdK<×/E'±µë§=º‹4õëÚ’'LcΉ9á÷¥¿¿3c¦í¼ëNšÂí ©ÀJûèã݇G,œo•UeÖI3Ch—^òG=Ó¤m†Úþ³S®(ÞIDAT»PºYrƒj™òÄTy1+­«Rµ#N•lU¾4_jÿƒÿy(ùÉ —{‡`|„@ØA÷É'óô­½…-Úëºì*Ù\kÖj-êÒœ<õ±ÙQz^q­[9ÙõWݮȎ;¤Æn¿Ô˜ówöZí{ØhÝ»[®%VY°ÒÆ–b(ljìWüÞÀ‘ƒ—FÅ O¾éÔÕ« =_ÕÖÆ?X¥zÚÚ3×¶è»ÂQÌ\‰Xdó”Û&ífÄQÈæ”Áï;M†ºèhþ=ª–,µ^?jït€uý«ä4œ½Û®Öïɧm¾u‘«ƒò³éAJ¬x8Ëzq­Z³ÞÚo¢vÕÄMX(è·yàéOmó'çÛ&¢ãí $NÐÄwÜsӚ¿+´NhN|E™ÍPBpŽÒSBç…Nb• ͧБÛn£~^â¦TœZs>+1{·®Ý],€‘ß^éó Þ$­Ó ÏÛoÏЊÌ~ÎË_Ó¾F¿{µœ‚5î7yÿ½ìŠË¯4Ži £P—m5„ö”…õÐOZÀföчÛ,Mù¥F^:[Ø–fd sDµF 0’¾?ë=M‡õÒ›Tq1?#?3LyüÉTÅg}H?:\ºÎ9éÉöÂ+«l”FýÛäè#/?ÿ#ŒŽ±Úè¼0=üô?(·x¼ü8ùÐd<¼;k­Ýûpi==öôbi+­S|fÛ ®·žÝVû¬ñ#'yJ›´³Ám)®t¥„ i›½ð’ÕÔ/³ÊæX}ŸZ«~ã-“´°vgœf%꼩€ Þu×]n¶À`ì„Ä{Íx}šu®‘)±Yµ¶ç¦6jdgëÖ¡Ì~üÛ—ìógÛ›zÇ»µ]ù¨Q£ÒÒ5U½\cfb´¾Œ‚W•ÞQ˜èÌe(@ò^•qX>åœtò‰ÒÀªlÑ‹œFÇýÉfµÃ·ÜÚ-±öôã·Ãã8õAÏÛo¿ÝmÊ’\ÿ~ûïk#·Ó7%ê–ÕÙ4iÚhÕh ‘Ç3Þl¡`»Eà3f:"ØÐ2,`z4Ð vÙ=çÛT£h¹„DD]ÅÆZ¨Øƒ)O´NÐF¦ô½é‘ªÝhf`•¦Ÿ|q…ýùü.öÄs+ícù к—ÉPRÒDZÔ9?tˆ DF[ö!$,8œóæÌ5öŸÇ—Ûô·Wؾ‹íÓù öÉürë¯U‡ÄTUÄUaWídÔg ç`°íÑHÜra5©¯UÉT(‘º8kß½mÀ«Ó­òÌ_Xùíw(¨þDkT[‹˜Ê•ÐHèŒ“Ž¯‡!‚‹qJòaÓ‰üËÚÖt´ÿûßδËDËpYá4_»AH²ÝZ xñ}„Sü… tü§ÊÅE‘3üH¾L°/$ W0m­H$†ÙÒ} 5,ðô‡û€mÞqzš:bŠ3ÞL‘?Õ%ôÒV›ì¼ð–aŒb^_yõuòÙÖC¶,©@V`ÑÁ %6÷HMeÎ?(Ùþ|Ób9$ÑJmÑâõjo‘u¨iceE¶çÎ•Šˆl"1&Á<à¶ô —˶cGq„ ✌¯½½Úþ5©ÞÊJVZeé›9»ÌÅl5p¹í¸Us{ÏÑ@ZBm(Ìt¨ñŽîÛZg0ø¡ÉÖí[ûZ›[ÆéÃxŠ)ÓÒ$ФîÛᇆ›˜Æ_Â{”ãÛKülHŠ)ᯇÛPH'×]wvÚiáœ+,È .8)ý/’t-«ÓŒù¾¾‰Yå4¥Õ«Ù „ik>˜³FÚØCã>4DÌ6oòR‚à}HYUš>3#of¼™¾Ü„;ØcÁüSÂåÜN`|¦º¼À…ŽD'¹öé¼OmÉÒÅrˆ´u i ri:GßçËx°ÏR!¾ìˆ“¼¢.\6sü»Œ¬´]¶­´÷ç>™³ÖØç ì¥é«¥¬´òø×T»0zï`‡dÿ¡¸ì„ Ä,À?@X1ŽÆ…‹‹RÜͦ½Ñ`ûîø…M{KqáeëmÁ’2ëÜANе /K°îÀû(#Ù?À_Шƒ"0ñ!ôÞz„= ·œTÿ"_Î'Ûo_+Òt¡í±;»¼¨GÊÏ&aêÀÙ‰‰OÇåRöKú¦~„É|‘8&vT^¯RiI¸-(”OÙ[n5Ì™¬06Ÿªw1úmPóÛ×tpB’ä,ýÍ#>49A›ñâLåBœ® }Ò:@õ§CeÔ€j´té9ͪœ@ºÆ€>GÖ ÀÌÔ{ÂÔüSv+ŒÄˆF»Òdõ¯-³«ÖkÝ|™âVÛ… ü¹òr›ó±bÃ¥#õÚL~ I ‚uû¨ýŒÆ0 #×Ùðó)}FboAÔ÷ri[ .·%ŠÝmûj›ôL•õVY¿PfKëÚ8Ç S†lF‚¿ ,ÚÍôíÆV§ƒDüÁ\8"{jAÉþbøm¶Ö{×X£b 솛¬HŸ3¢ ¯¸R1ÔGH¹YT.ÛFšQp4²ëÌΧÂý{ xF0ð›zm ül¦4ÌAÄßÔ©SÃÙ.ÒÉá 0·:lh\4ÈAÝ þɪH¦­kªÛ»™ ° €ðÌϲö£@`©h”1L:ñÍ¢èɽò{´é©°ðW!ôDB5ZªÏ[a?Ó±¸Ž§•t+gÞU½L-m%ŒKÿGyÄ­dM¦ÍLÐzoVj]:•ØöŠÿï:;æ j{O³Evû?ëìÃOÖÚ¶[ú˜îbëÓ§·c ÚŽ à]Ò, FÀ\8A;u,ÖRì´‚ºå%š¨Ð˜b1}£Âeµ¢n[6OuÇÿ`Ê0õX[[ëÊFu÷´ÄVgËoÔvR‘´ÍWZÑž{Hšõ³ÆË.·"EÚ#Y‘FõÆI“­­€yÑÐv„ S‰˜dÌ„ Õå D9ž|òÉáÇpq_˜ûDw¸”ìÓÇ)k| Èþ1-:Øý^^ýwË‚e±` ´k[í~˜ÞkÃP`ÀqC¸üät!Ò²orÁ¹žc n'k^øòœÀB /`œFÿqÂû„ý…ñžËÌA=¨î8Ó`¬t€ FÓ†[ô+Ó»(îÕö̃ž=JeÓ¯±Ñ{¢¹ÙŸÿ¾Øê–7Úíœcû<?€jˆ*ˆ÷MF-óuéTlƒdVÌ›¿ÎöÙµÆÖ4Ôhë­šnÕÜ?ÛfJг0"ËÑdñþ¯²£ô”¶ÐAaÁ’®Ö8þVôóŸá’6­Ô2““Ð^ž¦½vzXŸk£÷W{ÂÀïÆŒ‚Ï6õÀÄ´! MØý´)'(ýFè|C'ò©dðà`ÓXçÓ£4ê7!r³µKç.qÌúÁcÀ ½}:-¤ïÉiivã@]ÉkÎ4\RXøë~DDœ#–Õ-³rÙ¥Åê䌙ܦÃ3Õ2{Ö²æô¸ñBDòýBôi ‡nqšSÏ™ž!V€•m³}»”§оºí:²B[ƒi‡ãåëå¬r>¦ûþzëÛ}‡J',× ÂÖŠ²Ûn»‘ŽY±«ÃñŒÔøÐœ@ŽÅaËU~±}¾ Á¶ÑN›´³[î+³·ïkÛŒècí;ö²‰OÖÈïbCut›œ „Zv*€@Àô@íDT~û[&o¬5* Y©ÿò<8ÉŠŽ>R_–€¹{‚‰VÚ_À-‰ÙAxÿ¿¥ã}÷Ýç¾~Ê÷¨Òç…οŒä÷TI^`ÐàAŽÖ0² Uƒ£¡¢ TVTÅM€0ó‡_ˆçÐÎ d¼©²ÿ.?9]€Ê¼{rÁ¹ž#ˆ­O¶µazÏh¤Yp³¬n©üRh2¨H•WkÚeÖ¬Ù¹Víó£fÞ;A®<%|MÈ$t|cDfg ÚÂÈŠc/ÐÆ­‡–[ß^Z7¨LÒ_æöXæÈŽïÙ½Ô®¸i‰Â‹×ÚÁÚUˆ÷DeÇ®fÄgDð`W3ºzÿÑ„@Ue­-(—^$U“ÉF§Œ½·Î¶B,E‘¢ ƒÀ*,oÆ™ÇW°I9sæÈqù¢Uè:yJ¥ÚIð4jVÁíüEW]#jTXÑî»jmo[¤r ] M(;Wà·=òÈ#ãÂOÏóò‡äZV+ó#Ðs†A[ p}FvÛÖ1ÂËÐ @E…ãdnÁüФ…Á ~çÀC*ã‘LåBȃdûgª$›{Œ„ÒbG†Áæ M'©“P&§ßä:X,µê¬Z%î×­ôLá=Â~¸Mȇƒ †Å£žÇWÞfP-¦D0UøÅ’ûh^ƒüúš’~Vc>±Üieë#ÌùEÆ{ïéÀ&¢L¿QŸ÷øÊí´)ɼÏ×ÙíÿªÓLÄ*7%ÉZ†»¬×õ'ŒD.'h1ipF¢®ö éœ8¡¦M›fôn]Ô†6Ò´ Q.¸‰ò ³¢á’ùCÌï+G ;i¿s⪫®²ûïGùŠƒ¤Ý?ûòÇ«ª¼!ðh£Øùn½Š6­á·C¨(¯tý…s/’_‰>ÌGe $TùO'×>W÷k5 ê¿ßÚRÐa„òß P¯H6kÔkc•—¸x€ðêÂÛ4Kù“Eh±½ÛÀæ%G»`¯è‚úÌ"–ü<Ä®AÇ”»ø€¡Ê<Ô`K´È¨^aÅmª°bù`rh2räH÷ÝAÞ sÁ¤ø&ÐB0¯¢'?½ÂN:¦ÆF ©°©/¬´+Îíl×ß±ÔvÖ”%AL={”¸FjÖ`à¬CË øðþ„›š”}_¤"6œØIxj´o©®5ËÔüñþÇ{l\QŽ…B¢ñåõ¥ý¹_>µˆ€ìéǶuô]âUÊ¥µ¢ø¾ì5Î=¢ðaÖ €kõïdzBzÁ™*ÉæÀuÇÃÃûóÏÑê$(¤`8 SK‚/·B :Üž¦­èiï oj(´í…ñõ»ØìhŒ¢L½ùh*OZ „˜5'=¹ÜEö«-µ{Zn3Þ[co¼³Æþûú*ÛaD…‹ŽDP6uñþv"þ9RÝ}üׇ,³‘[–»éÈ?[gCez ,“ÓqÿÝ«ìÒë—ØV[”;‡"ù¡!ö:v;}ü~þÝû¨³§ÖjT.œÌü©˜>Õ5*K˜9|˜ó*g*ýLèüËL"òrlÐ×­X·ŽÝ|¥ê£î#œP.Ð-\™¾ŸsDði¹ €Ëõó2®€ò×Â’Lµt/¬$ç…0c”ª_^o%¥)™Ÿ–@â2U†ÔͰ("¹ØäsÀmÉ“Î×éüáX!šAœ†¬âºñÆCá‡5+_3ÀQØU^}4…Ò5BWØißïàL‚ºúFÛ|Síó'm€ˆBFÌ<ûL·¡ xÜñ0j{ÿ@ÇöÅNÝß´[‰VÝÕŽÇ_ü¸ƒM{]nY½ÞùðL”éÑW~f.P]$Ô‘Ê?€¦ƒæåüòú·Y ¤Ï:ë¬pqÓur²0øáÃw¾œôUÓ'ŸªúkOÌQ©ûUHP¿E(+C4i©ÊGH¬Wù§ 3Ò0ÞyS5&‡kû)oïò7ËŠ€È;9,“Ótöúzi%¥ N[,õ¿DŽ–÷Þ}¿YÙY^˜«|ã²Ì»\ùp°˜BG‰Û‹´wªücÇŽu6:£v²_Cùæc¤ï¢%ÂÛ«°¹Ÿ¬³—Ũ¿8¡ƒ‚‰êí‰gWÚ9Qáû×VÈü®uLJ!ŒÖH#ˆ‘€I¡%AföÙMÓbÈK¯_lgžØÑ&M]aO]®©Ä*{çýµÎèËÁ C€¡   uŒbx¨‰ö#ˆÎŒÐpÌìÉçA®f—,Yâyó&–áÈ_ŒQÅy LhB j¿Óää«Áh­Ð,ÕÈï¹joé02B¡À0Õ²SÆšZ¸‰p+×ÒŒ,^ –£ˆáñ0HGG#`Dl…˜£&f+üÛ(ÇM³¼¬£tcëìo0ņC‹Q³OŸ>Î?gŸ)鸉FmB€ëêµ÷Z§0ò³8¨Ïæ%.ŽàÀ½]„^îâ&˜rCM‡.4 ~ ¼ÿ@`*ÁÀ’ÒÚÌd`ŸR'LÎ:©£ýãzûù:ØÂ/ìòkã“ §mÀ¿Þ?ÀìL²'!þö&Hò›¥¸í¶Û즛n Sâ^ü)|á+HQµùÔ;``?709`-óüòökÐi1®\ú8€Õ0&©žjªz %P‡NUA¶×¼hI ¬€w†â耄6W+À\µu\¶í åCÅ"âŠ^Œ­™€ÕqŒ¢8v-‹‰v’³Æ>cµí¥|Ñâ;|tµulqc…0 ÉÜ>B_€ï8øší? a‚“`…á3ÓVºXŽcïYfG}§ZB`‰|Z…8 ÜÍ à`´G@«Hö0#߀{²}‚Vùcp–ö/íe;t?Õ©Œ&"\’ö¡/çÆUS›OUìã/ÏT“­ë РiØ@ðƒYª#´À¼ó¿c>mˆ=sŽ L¡PàSÕr¶0Ö2Ö™ò&£M& À?äLíï€FÔVTÔV€9ª#à›¦ñ5îh«4Ó£qnÅÁÅê6ÌÔk|™€Q~€œ‚,4*/o£¨Áõ¶ó6.fàA-¤HCæö—Ö­·ç_Ymýûv·}÷ÙÍÅ%РÀÈÍ^Tyïà:&_5Z±RŸîzkµsÊ&ö·;–Ùw¤aà˜œöÆ*M«j»–<35‰°…щ º:6ˆ•Œq3'KæçYâýÑBð¥[µBù7TrŒ ®Í§plà5 ¬e1ð´ä F àÏi%üRÏS: *”X­:öæí@ÀÙj @È^ìヒ³>/˜«§ÆæõdâCø& ñÐú ãðÄOØÍ7ßlµµµ.~ 9ð)ž1–(/—óOŽÂ-þ+t6ýç Åxò€3?Xcoëû&Ökk²vò£ôs;ýb 0+áuÿšV?PìÊb&b?ùXt4îÞev²¾wxÝíKݵé3ÖØãò? 5°…@{ÔhtÒQ£F¹÷ðõd{D;9á„ÂÙ?Ô aåkÿ¢ôUom>u@óþrâX禠<äL5ú{ÞJ€cèÂlÚ_(@] ißΦÒTy¼h‰!Â@¼ÿÎ( €l¨wg~åÀ¿þ;„¯G ; 0ò  º32gò0¨Âü@±|h0ÿ*Ðì0çãuNX¦Yƒ[',³Íz´µoí»µÛb ÿ4 Ì·3[)NŒ©°ÁÍw/sɶ *bê­ÏöY¥xƒÄ®‚ ammOÓº‚Zøƒä§?ýiÂÂ!=r²ðÕý²nQEµùT†€‘×J¬ÓhŽ&†¶z©\4¢3[)ƪŽG2Õãïź•?mÕñ=ÍÔCÞá<±Ò½äıâÒª#€—»PHZøfÐ04-…ÿ'\*ŒÓ_»küÓO?ÝýèñY&þxÃb»G#ÿÁûµÕ~…ÕN•ÿÅ;ÚŠ\ ï,YÞÝ~ö³3Üâ¼ÏØ‹€¯ë\ýõ ;Ï@C7)¶‹¯ùB VØ_/è,­‚}ýÓMG?Wæçi¾AÀWŠC0Ué ¡ó¯:™(írjMlå*ž­1ÖOéÏÙöK™'+hÅ‹6+¿^W† 7»“Å4BSQå3#Úòåu ¥ökôgF¾CÈ,qæ;øãò†Iy0ÈŸÞ*¬ŽÆu>&ÂBÌ h‘ l/=šÁtiïj#’#F·³ùòæãÑßc‡*û¿KÚö#´ÉçÀ ö{ÑÅû˜zÃgÔÁ¾gf¿B­[`±Ñ#S4M(ó `ôlZÔrf+9äx0“ž@å?\„9¶\Ä—‘ã4U"¯fî0pP7ˆAÓ@F§Ä"3•ÊsøWZ¡¼­òÏÏTGø^!å¢öŽ!‘+Ðéý™žEàá|±1¿;WÛ(ç 4]—ç³Ù>†àA!ZÁÂZaØ{€ýñ1 jkk½¿™"Á!޼m†)´¸TŸÓvåÄœ©é½×5{€ðÛ£ÚÚßî\j¯½µÎÜ ­ÛßÅ <ð£o>KÞ?@ÑnZ­è§]f—_.®˜¢åµîód:^{íµn“ÔPž”¾%t¾1$ÏP#ºäÓÖ°h9ˆÀ̰…5±Tå3 ˆ¿¦æoÑûïë.´˜«‚÷ööd{$x#;ÕÞ©OM1Òþš. Ø)˜ü%%~ãЛñvÆÐçLÍ9¯Ê”¡€÷íÆ ßŽv:`0Û‘±¯‹Œ™[R³ÙihóMÙ>¬Òˆ`’˵W!óû˜ÿyl¹[5ÈÞ;mÛÞÅýÿOÜ?³”Ïȃo¤“²Æ ™ùi gv˜ß§ý1xƒô‰qgÔ u!lµË;Tf!’g©ù4h‹p ðñš #ð»ø¾œêè5¿T;Ç60ÿP„ˆfñp\ Í"o¶Y~•mÆä|éìþðõD¢Åìÿ˜°:llxJ.¼åóÊ–³<Ç}*q¨ð× À?VÛaóÝ>>ÖÁ #PUÉÁëí }$4}x™"ÿزüQ-ÚWêü"­DüÃu‹µ©êæÎ÷3}™'ü).ö;øË_þâüIÑy M€é½p#Í È?ýéO®ó‡²üVé…¡ó%Y‘OCS)Ø¥*°ýQÿÅü.0ᾜœö};ŸºcÏ\¬ãª\ž/´@Ý û ñd hŒxŒè™€m­ÜZå‹É 4œ9ó]gƒe*#Í=lÑËÒÜÛ—‘ÖÏÇ ; ·Æ¥‹}®¹æ§žã#ÁûÞØÃÇK`R¾cˆ @K@\uËR÷¥£+õ÷ÈS+môÞ½mŸ½wq‹40*óÒ̈„§ÿ@<óg;úSS Á«JŸ*l•ã8T^!“窰œúnÿý\4Ÿ3˜ =×7K‚++™Má'N è ‡€6y¢0'znÀÛM/Äá•xS{I˜êˆÚÊZˆÝ$0?«}'Ϊâ¦L²˜íM§_zª^53IˆV°¹0“'OvS‡0#Kã7ñ̈́ﶽvÒzùLí©WÙ¹§w´î\æL…nKœó°²¢Ô¶Ô×Fí±³+„=< ˆÀˆš0~¶ÌÏf̘1n7¥X¹Ðú{ÂbçÛá|5¨,×F!$ûö­uFa0ú¯—s·­[È•ª_ûkô]¢-s0ýÁÂsmó†0hÃáaÂÕœd ¨DžYYìÄp¤ÿ@òH\ÍêoiV¹6|¦ÿªŠ]…Ççã@Ç`ß}§]6‚ŽV²ü÷W§vt?øvRTá”çW¸ˆÂç_]e¿ùÓ"í/Xívä¹à‚ Ü?¿€CjìØ±Î7oL >$¶ç!¸Gé)¡ó-™Y MÓÚòò2uCúb“ºúïÎ1b×3á<à=óbÏ5MEåóp ÏР1 µ9QšÝ Ó×UTS^‘³àö- †6öÕy™»„ÄŒFË„q˜4i’û¶ö;KG¡OKÀl€i>f N=oõ׿›kc¾h´xiƒ­P €–qÊ)§8•ÝÅøëö-;ÿæ øN:é¤ðc¼ >òê ìR﫱>ŠÀÙú±x€øý„Aį¼ç?!k^’.¡„Ì'tbê+l‘¨Þ)¢¼i¡9•ˆñ@+4€ ¥ ¥}—,n03q‘pœùha©Ð<ì?p©¾´ËgÕÂÎ<Ÿ'Õ‘p_¢þf}¸Ö®¼e‰–—ZÏêR«íÍ L Ú™È.Í矾=÷ÜsnÅ¡û¼Xª3\ûÛßþæìÚP–?)='t¾1&óê Äú»®˜ÀÜ óËà„CK#|K÷“ˆõoIº–Ói^/šS A8ìþzfqKÏ5gîæjœîóQžÎšþ‰ð­qÇ[Kíü î¤:¿/Ä4xFwÁ}6ÓØm·Ýl„ .FB÷3¶{…Ö ¤ÍHg|¤•†‡>¯°]OgÆ×B´bKŸIKU!S™,ø Á{J_:ßX“yõ¾U‰ðýÓh, ]÷÷Ó³$Ê-ʇ™ó:oø2{\ˆ:û'©Àƒ(µLH§ ¦XBCpÇ1–hi-Aªºc×òúÑ3”·!ná%dÑÌ,apÖuÔQnžÕÙøx˜HþøËŽšeȬ ¶‹oH,Áæ–—\rIø2¿SÄ8;7vÈ«/ GôÑ 1Á®@\ËÔ·¹çŸË@ ¦‹OþXØ!_V·¾,@cæ ¿%Ä[9]˜¼x&õÇÆåsB &iUŠ»‡Ð·QhBÉ߸~tL«áBü8\ãÀLFåÖ°»,´Éü#h¤=æRQ,x Ád¥™åøÆB2 U¬oê„ÁÊ}À¥[þ-à4¿O2Cô÷Bñ˾̈́ÁŽî#Äá\L›d’Ž^R~G Çôឣ-;ý#)þâÆ TÁn¸Á}ÀóòË/ÏùK³žñUf¦Aübš19óÌ3Ãw N9[(cø› nEg¬Oºþé€ÁÀƾ€\ËÔÇý=x!ÐîV!Èo÷Ñ€ÙúøÍDÃE‡›…˜z„?nú}•@ïä`þ>.›õF21>÷ŸÇøþ»ÇÊÀ<Õúë øö?ð~øE`F>µ}ðÁ»Ý²õø2^øk©Žü.|5‰}þB0[é߇οɼúkRó;!¤ðþ3úëø¾›îH8MYOþC¸A×Il @ïèà9m\±Ü«úéŽä ¤©'&GaP†•â‰Íè¨_wX§¸[¸µð|a‚€Ýˆð°»ûÒ =ö˜[»*“öœ"lq(ôÌÆœ›O#pºž£+ô¥¯Æ.Ý´<8U×b7¦~ŸË§þ|žÙ˜ÀBmýQgé¤cøºãzÈíˆMG$n+6y7n¤Ïxÿ‘Œ&•ÌÍó¡ç|ª­ØWàÀt6n¨¼+•N;óÊ·±%óê ô=ºc€1 É îÃÉiú¾BÝ1¾´R“Ðçç]¯ #’ >§§4;wùÃÖYy¿ÒóA ߨ¿Ø’?î&œ~3¶%;çœsÜ÷rõ„ËÁqÅî>£Gv1ð¡{*}nèüë”Ì«/3Pbü à"™Þ‹9Ã}79Mß—ØÐ{R$üysKB)…;™¬ÐÑgØÙ{D“Tå#2#?"hS\$rÿûu©²}K²÷-LðÌž=Ûùø¾A;˜ ¬„Æ-{ ð #Ò6Ö/èÙÃ…øw¾Ž09ŸF³KµëˆžtôK¡1z&÷gý´Uª^uçÓ^žÉÛc–o…-<×(-àL §µ4¸2íh#,eA×€ÞÁ_<±yÀzæ¥<žû:=âýÕèŸ ™–kï_€­ÂÎ;ïóMÈþ‰^âáNÂk…hAißÁ†ùñòŸ*$På›ÀüÐáá\ÙB<\ÚN1æ÷BÚ%§¥ñ6j™÷iV ‹&²­³µùræ–ÖV˜åó š8Ajé]8F|Çs¯Є”癟´ßãžt€8þ‘h«ÿE€tŒ:§  ·þ\ø„騖à3e ã^/l>¼éâטG› w¯Œ¯Â—ªƒÜÁ#NPÖ \1!@,#¿úøõuú`CÆÂ7ÐÍÕoÕ‘o±+—.]z¼¶Gš¦2ÏÕfŠ›° ΚÕkVh쪀Òáß"óጜ^‰QëÉ|ø {Ž83†WéX)$ž€5ý…D¤• ±íq$âXü¯pµð› SôbG4¤€ãàº$±ëù$3jµ´ÛrB}¥Ý.VÜËÔ·ÿ¢üøg¾ȉ[¾‚6ÔÕÕýY8^~ïh·ÚÍ䀺{ÓM{\"Az ï´½œÖÖ`œIgFüŸÇeÌõ¿}“uâ•ÿ—i9„G`Z(ÑgÓV)ÚuGÔT@¢µYÈD-ÎúM¯^½Ž–ãô#MÃ> »˜a_)lìÀç3IÍ›ð>ݺu?bÉÒÅW‰ÍÁ±ù+;Œ9\~°=…É@–ÿñ€3ÚEQ  ܬL/ÙÌäÛixRÓ€º·ƒ¿OgcVª{÷n×õêÕûçÏ.xv­¾×øº¿¿1¿. V¯¾ú**Ói[n5ìÙ]gˆëwÒ¹¢ÝŸ³Æ¢s”Æ)…-ËŸãc!„PˆÓ/‚ˆ¹Rà-=0Z8Px e¹› Ñ6™B¾\ÌÞ©]Û¶—)½‹>ÞF_€~¾²ªòʧŸ|fêGÑ#ˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q ¢@Dˆ" Dˆ(Q`££Àÿ¦¨ù):÷xIEND®B`‚ic04ÓARGB’Q‡™u+†@ã‚ÿª ƒ =ñ0dGNʾƒ ¬¡‚ÿ õ¯ƒåß…ÿÏz’p[˜ë„ÿÃ]{›êÿ€ƒÿ ýøÿÄ3áÿÿï„ÿÚÿÿ\€ÿþ‚ÿ ø2™ÿÿyðÿÿsÛÿ$`™ÿÿfhõÿ3vóÿË–ÿÖ\™ fR’ž“hW<† "ƒ„=hX€ƒ /2RWZ_s¸l²{FMTKJW]_kóˆH]GP\RKX_f”½‰AO_U@S_iØ‘¥¢ç¥¿CJ‚aYKÑçñÕªÒ¨%² €ŽÚðÜ‘šˆ…~€%ŸÂ¸­ÂëÉpq‡P_!IÅÓÆæë­L?€JœÍ÷Ó€84€:!­)€(@ž“eS:‡ŽX† /zºÃ»šs¸l²{ž°¾§¥Ã·kóˆ¤Ñ£µÏ¸§ÆÏƒ”½‰[²ÕÀ”¼ÕÀ⌧ ç¡¿DJ¢ÉÈ«©È˜=]ªÒލ&¡˜ª˜Ÿ?…ˆ…€&¢Å²¦­œLrˆP_"KÈÖÉáë­M?€JžÐ÷Ó€84€:!­)€*@ž“eS:‡ŽŒ~X† .zºÂ»˜s¸l²{ž°½¦¥Â¶kóˆ¤Ð£´Î·¦Å΃”½‰[±Ô¿“»Ô¿âŒ¥ ç¥¿BJ¡ÈÇ«©È˜=]ªÒ¨$¡˜ª˜”?…ˆ…}€$¹Ø´¦’SLp‡N_ YÝéÛâë­K?€J«â÷Ó€74€: ­)€(@žic14ʰ‰PNG  IHDRôxÔú”iCCPICC Profile(‘}»KÃPÆ¿¦jU*":ˆ8¬ÒJ©‹£m…R¨Pj«&iú€6 IŠ Ž‚‹CÁÁÇâkpqÖµƒ« (Š Nþ¾)ñÜ&ÒªèËùñÝsÎ=÷¸MAU -~ ¨Z"âçRó¼ë m@z0*HºŒÇc øÊßãý–¯}lÖïû£+-ëàà‰'%U3ˆ—ˆ‡– •ñ:qŸFKï0ÎZ|ÊX´¸Z¯I&ÂÄ7ļ”ÒįÄ^)§ŽÍ÷¤‹iÒ¹)‹Æ9ÆbSo¶‰‹…²dïÉ~è–•ÙVOgD18xˆ(# ø(+¤èHÐ}ÈW Ö.©«Z>›3ø 9$óQEóò€|g~ÿô±¡•€‰7ÀYihâ6p¾ôß74Ï>ÐM^]¨‚&Ô%'.“žOÈæÐ{t.è™ñ€õ#wh}4Í—aÀµÔ*¦ùqhšµ#j~ªŠå= Çw@r ˆ]»{ÀH–Þ\üãöºG¶ÿÖØ>~ywÙPvä4@IDATxì]|Uö¾ÉKyé…4B„Ð{•! ‚€½+н¯ëêº6V‘¶êª»þݵ¬º–UW]{”&ÒTDé))Ò{ûßäM˜$/É{ÉKòÊ9¿|™ySîÜùfæžsÏ=÷^¥D„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@Úœ¯6¿‚\@œ•32 „Á@ p;á4&¥ØQ ”%—¹À à$Pˆ€“2 €“>É–0мqNW è DøúúÇÄÄt ï1™L~8F+¼jDy{{kkXªêêꨬ¬¬®ªªªÝÎ߀²,¹OÛ_QQQURRRQZZZ )(,,ÌNÂòÒ.Àµi,d‡ƒa@h'Äh'¢å2€ ‚ôbCCC;uïÞ}hlll÷N:ECÁ‡@áSL^Ðñ^~~~^Pƪ²¢B[VÔ(k/Mic;•¹e½f~WUVzñ8,k}•Åà=@ÃkU.5ñò¢¥SK,ˆj‚„.üÍý0,Tu5Œ eeeUÈ_5 …ª9bÁã/ Í(ÀzŒn«†göJE<U0 ªq4r²³³÷Â8XtáôÝÀ@ " -`@ €&§d€míã€~½zõe?ª[·n‰ÁÁÁPò¦ÈÈHo(W/(BM©—–”¨®—•5Pî)\WÜN~Ù A·O•‰K^„ B% ƒÌÜÜÜ-àg-NÙ|HSHšc@ €æ’ý€ãà÷6ŒHHH4räÈ”äääîpÝDGG›è®/).V¬ÁCÁ)¬³6_S“¦k¾^ [¯q·µ‚o¬6¯åÇŽš¿½éèdzyA¿W.é)ð6™ªL>>lZÀ:e4 جP†f„ý0 VàX«ßa@¨Ç€õ‘ŸÂ€`ýT /”}*0*...,**Ê„¾7”•WYi©¦è¡¼4—½QÑqÝVåNeŒƒ;ÎH°÷Ú6¯+kƆvÏŽ,FA%š*tOø­ªxx 1߀ϟñ,¾W " x<bxü+ 8¶ÝOF1bƨQ£† ¦ ¥ï¥ä 75•½‚²×\øTîÖ[­ ï‡’3nch5ÃÀ¨k7œkí¶Ýky0W{®•}]CKù² Àôê_»±tŒ×®]gÞíw÷^{Œå^4)VÂm€V“2•EEE¿aýklÿàRš @‚ˆç1 €ç=s¹cÇ2‹äÎHLL<3%%%.ýëùÂïMe_XTäU\T¤µ×ëµÙ&•®eiT„õ)÷5§L­£)Kd¼±}VòW{¬®¤- ¸¹|ky¯~“§Ú4 iÕn«w·kçÔÛ®__¿GK/„2]‰s`”UÂ(+Cá8öÐñ ½ @‚ˆg0 €g]ºt1£ž7kö¨]ªÂ‚­Ë¦€QJõ•“þÛ¸Ô—q›¾Þ–û,ýúµî¼ë×Õ—:ÜOávºá ý7·5–OkÛq°Ö½ÐÚ>Mù7Á¥µs»¾n0Ð@^ËÐg‘F:T ™ª]8ÆÀ'ÀÞ‹ˆ0à® ˆà®OVîË‘ ð;™äïï?íÌ3ϼhÈ!¨ð'²¿½7Ú–Ú˜µà=*#šª•êÇ5¦¸lÙoí\nƒ›[±¹5\-®€ Ni=,û´ý8F_²!¯Éó[+Z{<"ø}L&…nŒ Áz \)ð§|°„ñ¤ rH[G·?í’ú=ëË–*}ý>ôtôecéiÛq–¥ðŒ”ƒRüdK €·ƒ€ˆ0àV ˆàVSnÆÁ LB°ÞÙ³fͺ`À€1TúÐ’Þpë«ü¼¼Sµ|£âo¢–Z«ˆZx •3= ¤â¦ÒF>úÇ+t’Wùùì"¨)róÐæÉÑ ‘€¦ ü­\§6®ßƯóÉ¥5c¨©ííÓo×+Ø\Àø^ž= ÞþpôBaÀåÀå¡Ü€ƒŒêYPú—#¯;Ä#ã±–ԺõÚ=+‰FåoXoL!•–qÝx<|>®Å;Œôtu<3Saíú¾_§Oކ€n ÐH A÷"0ó:Fõmú²©}<¦ ©Ö<5† 9¿ÁJà#à=€ÛD„—d@ —|l’i3ô.;vìu“&MêÛ£G_o `¯Õômà)|]ÑpÙœ²Ñ¥‹žJ½Š>ûäIuôèQ• eÏß"¶1@Ã@ Bç·þÒø\˜:÷Û#5æž*Æ’^Æïÿ¶"€K1 €K=.ɬƒHA½ËÏ9çœsûôéfbÍ[sï£Í¼¾iÍoÖ곩ìQ£?––¦Ž>¬NBéÛ«„|ÿn™œÑ; ß ñÙéÛZ³„PAC µ†…f¼€%½4D„§g@ §D’A3ZâÓ§O¿i̘1 æóƒ«Ý ÃÉzÑån¬%•†=ëôP¹³½žµúû÷k5}߇$ç$  ‰ Äb°y xÉ‚ãN’EɆ0`•1¬Ò"Ýá˜÷úóÏ?ÿbŒ·Šqö1\¬kûö*}rc4t…Ÿ‹€¼ûö©ƒhQ÷nÈ¡ÜR À W@7À8g_š8Mv Æ€F½\¸ðÁ5.èׯ߭gœqÆðÞ½{ûcè]oÖö9H•8ŨÌmY§ÁÀÈ{¤£öìÙ£~;t¨f -5ùçé à­â‹ULÏ–lØ< pÔAaÀiÀi…dÄ "­«12ßíìëÆ‘ù087sÜ7¦ì™úû؆O·þ¸ôwmß.z|Xîœ,Rœ²˜†ç" !ÀA†D„g@ €’2´®Ç`=7=:Óéúäfg{³ûkí”úŠ¿ÛÎZ~”þÎ;T:÷D„–2€·¬Ìb0N`?ðÀqj^L¬ˆíÍ€í͸\¯-èÈï[Ðwÿª¡C‡†ùdeeicñë ŸÕ×KãvݵŸ‰>÷Û·mÓ\üm‘YIÓs€!À‘Ù}†Ààq€ƒ ÕX¢XÚ‹1Ú‹i¹N[0ˆ>à¿›={ö<(þ“··ÜôÞŒæ§=×ëoão*}ºö322Ô(}¼#" ´5C€/ƒ·OŸ"Â@»1 @»Q-r ±¨ñß>cÆŒë ŽA{|0Ž7Ö1*}^¯±ß€çøñãjÚóÙD " t0ŒM›‡…ÀºŽÈ‹\ÓóÀóž¹+ßq02ÿ{ÌÂwÛ°aÃÂ1,¬OÎÉ“&Ž‹ß˜¢çÍêûȇ¦­MŸµ~aÀY°zÓÀ—È×|à³äOòáž ˆàžÏÕÝîÊ7tÜü`ðžè   ¿“YY¦ú®~Þ´®ìõu½]ÿFÞ;€þùz0 ÷‹ÎÆ KŒ›^–y€ˆ0àpÄp8¥’ ƒ˜œœügtçЩS'?¸úMNW{oë+{þ¦pÉÚ>]ü{víREX\ˆN@T„·™/.Gü ð2Pó‚cEDpb8‚EI£-°têÔ©“ºvíêûL˜îÖÛ¨äë¯ó7ç9ŒÚþ1ô××÷·Eæ$Ma `çÕhý2\ëWàN@&jâ=åbxÊ“vû ÃXý¡ÿ×’A§a@ §y“ÎÔ÷pRRÒ5]Хό©y½Q£¡Æ×HЕ|yy¹6í.'åÑ·iÈ?a@¨e_ GÌÇâÀµ;eEh‚1š Gv9œ±hëÑý‰ò À½~Õ¨ÃèÊ]_2ð/??_Sþú6‡çDÜ‹ŽÀØvü¸ á.Ýë;ünÄp8¥’ 8’ß}ÑÑÑwÄÆÄ z?°¼´´NŸ~žÃQú8€ûòˈ}VX”MÂ@3 ÀàH‚Œ 8 ܬoæÙíÁ ˆàÁ¿n½?&îù¢ûGbdºüYë§èµ{.Ù¥“òèÝþÚ)oraÀ`4 ›J§€Ç€šö5¬ˆ:bèLȲ-˜ —ÿ á¥TQVæÃ‹¿^ë—~ümA¿¤éÉ ÀÌ.„Öçp«fx2rï  !'²¥õ „ ‰ÇÍfóù¨õ›+Ê˃ õ½ŒŠŸëTú¢ø[O¶¤ 4Æc€ýéÀÍÀšÆŽ•ížÇ€ÉónY¡|ßÁT½Ñð‚¡|++*¼¨èéÞgW?üVŒð—vþ6~’¼Ç3€ž ß¡†€?È8`à'FЀ¼Žd`.{/•4—¿#/ i Â@Ë`p œý p Àuf@ ~ø¼u*ú'€ËðBù¡ÆêÀ´%)a@p0Ja°I`;@ƒý7%-ɸ b¸àCs²,Ç ?¯£ øƒðB8Yþ$;€0``@ Î&˜ ÐXkØ-«Ä€ÄxÐÃnƒ[†49èHo(ÿ0(¶3Š€3€ïÔß«? ,ÔùÀ1àW'βd­ ˆõ€d/Ä=¾Dà% G¡"íýðÐå݆/h3îÎu:Àž;+b@ zؼÕ?"­Åt÷Sùc«"€0àj àÃÕ½vC‘÷žÀW`@ nxȼE_¤õwàB*Ô ‚˜¶$% Ä4~ š8„ðwÀUcDÜœ1Üü;ðöè"|˜ˆ—&Øâ>t`ò’”0 t$08hÿfàR «#ó#×n{Äh{ŽÝá Œô  ÅŠ—ÆÏnJîAê2#€=Ø;`p1p¤îòËÀžfÛÜKw$û6 åÏH ökž•*YÖÚpÙŽ‹9ajÚs±Í(úO.­®ë'qÏßXfp]‡e7§Ž±Ìãð )oü0žƒM"ÎÄž½nF¾.ö8Sþ$/ŽcÀò}:.AIÉ­€»yˆ³ÔüEùwÀãEL}L…^TZ”3\§’'šžWpbÎGpHXŽÇmDÀã(<¶±Qâ÷AENa£Ê¹"®sÙÜ;cB!Dã€ÐÊ#ücú<û´mXiGø^¹@&.{.°³//—j'äãj'¢]ð2Cç÷vó ÃR/ô]ðVœ?Ë(h©àËYðb‰…ªÂ?*bn7 ÷s$7¶Ï²ÿö!  '؆› œ°,Y€7¦Ì±«Í…£Ñ@' Ò¾OÁ†x ‹<ޱ&4Œâ…‚ŠÆßA®s¿/–òNYrüz^66Îv8þ’bG2€oHDhÀÀply·(yOPÔ² EÏáX©äYËbMœëºð7•÷a€.—TöG€ý–¥ñxlr+¡ROz4h8$ý€€FD­W/¦f `›è1 Á!†HpèFßIÛ”®$ã à{ê00¿¨üÃDù×áÅîÐÒ¬­—aÉÚ¼î†×Óa-ž }3p8 lö"3À2«70 ÐtØ¡‹ôè1`³„:3ö/u#€†(€mö'!g8#ü˜D„QXù*Ê_§Äö%”<•}…EÙ³&OÁO•üPÙ6Tø"Že '’ $ãz ØÜ ‰ÅмX§§@Ävt#€MJs€=¶Ÿ*G:+øD„Ö¢>¤æoà ­NÅ®)|,éÒ×Ûê ñû` °X d"Ã@w\v<@c`2À¦ÆPè! §@óÔl’ÿM0P…—<ï:›£f‡›8Vv¹b¸ÀCj‡,öÅ5>¢¤æß8Û(øX»§Ògí^˜ÏÃ:kô«€,À!"NÊkþaÀ雨D@¡!ÀàB@š j8©ÿ¿íZ ¤à,€e﹈‡3Ð ÷ÿ!ÐÙ¢ü¥à³¼ÐâTä¬ÝSñ³ë3¢žîüåÀ:Ë:".Ê ‚I ‚Y=l&àw@C€î1À&~ðÐ`ÌÊÙ×E\1\ð¡90Ë‘Ög@7(ÿp,=^ù£pã@:½|èíølç‡ä;€ŠŸÆ€ˆ{2Ûš LR`@ $¤! ÆØ€àû ƒÕ5ÀE€îꈫ0 €«<)Çç3I~ ‚Öçt¾°$ŽByð â" xÔ‹ê"Ϥ­³9ø| =ú¹­¯Ùáé[”>kúlÛ/èÞÿÀv}a ¥ ЛÆ@¸K G$dó îóÁ÷•#€ß¹`¯`行1ÀÚÊóxèPþAî~ß(8_1 ×öµü2ð |îþ´ÿýuÅ%/æ±½øÖ81’Û º2(08 gMÄÉÀɳ7i}ŠŒ)Ìé:]RPøœT‡m“TòTþ¯ì¾'b'?þ˜OiiipUUµÞÕAAùÇg/]º‹XaŸ˜V¾KÆ Ð+@@À}î*#€FÀÏc%ÄÈvò'÷QÄèŒ{d4{W¿âðÀØ<àNj|œ9¸·m‰ Î&neu:¹œ*†gX°¸‹ò‡âgûb!î‹Êf °Xx‚°æÈšù`"0`»¼=ß0 &ÆH0>‚‘ß+JK ÃÿÖÙŸÝšožÃù`LIý.¤ÌÇ£æUXîDšf€ÍS/¯sñnßÐ#À.„ô°éΕŠ7‚ïµ/nb!p+ߌ»æÝžÂÃ]9pÇûbáÁ8öõo¬Pw™ûFÁX ,4Y‹¥âÿÔen å…Дü<,/TÀ-N ¶ Ësûöí›[]Íè~¯ú ×ÈþƒÈÿWp°´´*ß××+ØÛÛ»'âîÄ>¶Ë$w·"¶1@ãêßÀ›ÀxÇ”âÁ›ñíaß—dœÓ-á~æá¾V¸ä¸q¦]öårãgâˆ[›D~‡ÄÕÛý9ÿ8Ûøé®>Pñ³ Ä&·ºô©L¯âÚânÔu×]§bcc0BJ+a¼<ðÀ°ví¼ßÛßßü0ö=Ë‘Cø=xþü?ça)b?á8åÀµ½³ƒ½/\Vð çâíJà LhTŠ8 x·DÜŒ±¸Ÿ[Qp°Ï1Û]RPhÃ_‚ƒí×Fou4~»›°†° Û´M”?ÒUãÆUqq±õ•¿Ú³gOÙóÏ¿°ÊŸ…¶UY´ˆíüÕb'¾QºàG7ãY·‹6³üàwü^ö|ËwÀIª\R dBqÆ–üÕ%oÀ3-€{=\º ÿ °¯1×]NPà•Y ¼dþm`ðÀ¶kw—XÜà[À?*Ò65lذ:Ê5~•‘‘¡Þ{`ÇÓèúУ±LÌŸÿã1¶×ÛïgBT½mòÓ~~Ã)·g›`må¬Iãóp9ñ¶”G³‘ó™.—{7Î0ž‹ˆ1À`›2Wª}QQéWŸŽž |fK»Üý¡½{«„IU—qãTPLŒ ŒŽV¦³2ùúÕ(u#{0*a”¨â¬,•%Ÿ±q£Š‰UUô¹X„ë¿üÒ@ù뻹ìü¸xøäĉ,¬ ŒRŠdÝa Ððºxø;žÞlî Æo¬:·°b€¹9ý°É¹sìþ¹À=žñƒ¸®–‚À%î…géc­? øÀnBž ,¨{læÀck^¼ýüTâÓU¿‹/Q‘ýú*ßÀ;5}]¸Nˆ·¯¯2GD(sd¤ŠìÕK%«Â¿ú >–SçÀ@Ø»w_ƒsëm gi4À`ÌUûöí[•œœÜÉhH`ûáêjñ€‡¶”-H<¸Ïû.Ñåüöñb9½7ù ¤÷y§á;°öÊb³H{0 @{°Ü¶×è‹ä¯ÅÇϨ§žøÚ+¡vàǨfº“i¼h.e,Ý]›q=@ƒ‡®P›„Š0ºëuêß¿ÖmoTü6%ƒàîgiëWR¢¼è{Û_—‚‚B•›kócðÇyÓüñ§i˜!лkׄJ³ÙßÄÖ4)¬ž?ÿAð6Éüù÷yùûÁ‰óòòŽ„Uˆ&„ãH'=0°<û®»ž²RlJÑc"/“†3½Ãñ4]Â# ù¥çˆÍ^4&E:ˆS%@e@.Ûj>@ “P5CáéÜýÀ¶~*ºùٸ̹sìÐÜDjl럠 l^ÐÑ^ºï^Õsöå¿£$(3SÅ#ØÑzºäÅÅ©å»v«­ÿú—*·ÝÐNïܹsé¨Q£  è_:ï¾ûîoÖ›óðÃ…™L&F„³dÀ懌#Ø‚,¾ÃàtIÌá« ðAÞ0X“…`ƒ¯Õ#d#ÊÎŽì è éN•pq¹d«8)lkê^ˆ0WVVNà ¬Õ§;Z…©†£ª««^ò§AÄ&æ”?Ѽ%^ ô6™TxÏdÕ5e² NHP9è9PcÀé„cù¼S€í@”ÚõßÇ: ›øÀqFaÔ㤩SS¿úöÛÇ;d½Tªk€ï€Iøþh0úžF³‰/dŠÁ‹ß8[æúè3Õåö[TÔ¸1h À“¬'48º`Ú†ê×W^UékéenZ¦OŸ®&L_Çh€'@!Và ÙpyDDøºnà,¸ eÁ‚ÑÞÞ^ïcÏ„z{G0à=õ¶ÉϦ ÷å å{ œzøMŸ×æ{QnâÈÂ…˜G»ÚšÚàúëÕ˜{ÿ¤âá¯I½Úx³‰´ð*ð´¯—©¬ï׫ää$Åé€-ÊXq€£GªÜ#GTôĉšQÒà2È'½aIIZ³@h$•}à@£ñœk`<f3ãUO úðÃO¼ùæ››?ùäÓØC—Y¹reQjê¾GÆw½dÊ”ÔרàÙÐ(éØCïT([Ž\Ö:bKÒrÈ9øpËaÁ³K_.p-à ¥25Ú­1¼Ù$—]û8„¯æîo'ÅoÌ\IZº¦ô9¦Nfç¨ôô EEÅÚ¼^ùªðïÔø°UðøjÍ]0ªàî÷ßW¿¾ô²ª,¬kó±æq´tyø £nݺ­'¶½ð}yX 40` lAð ìË:Alá11Q|ÿñú‰ØÁk×—÷€¸»ðÝVÀÀ¸ ,:Nð ½äéäâ)@žk;=1Ú‰h]†J‡£}±Ý¬ÃH ¾TZíŒô¾8Ôá™jû ŒÄ%&6}?Þ˜zwÐÍ7«~—^¢üQ+ÖÚß;@ùsè_ß0”÷pÁoþùm.ôۯØ{pÔ„†@ ‡âÞºMª¶¿ù–ÚóöÛÚ™äGõè‘\'^kúùç-úv8²´^ã°ü ¯?µ‚‘KÙb€ F®MååŒiEQK”}+äy=¾ÝWAlÞö$2òk_j8×7#?¬àÌ>v@’’„ Ôýúm8Aé0X럋Å)jÿPlï§òçÇ:8¸³áæVS› ̈AÕtÏ »ù&å®võƒïN» ž— íÓ§6õ•?óÐ=QùaÎ[…A‹DÒûàêô—_R'MR±0 bb¢ëÔþ9Ýp#n{´_O=M`3Ð]]¿7@n^N"­``5Î=؉o™Á¥­H«Õ§¢\ã3¦AÈŠ„H;1`S!ÖNy‘Ë4ÍÀyØ ‹­nƒjÓç´Å^}T?tÝ2Êße“VÛÿ––Fûæoר†Ür³ê{ÉÅÊ/8¸Í£û›ÏŽ€‚2XuJ™¤²V¬‚ãµ®ýï¶úĹsµv~›Ò3Äi†0~<ºV%Ë–)NPÁ¡ÉÈÈTiiiúOkK6§°Ëè¹À?€`¤Lª¬d%µŽì¨ª¢óI¤• ìÅù4ÞŸƒ0/z%ˆ¦1Ö!‚ëÓ À€Oz2:$vQ1\çÏÀB ™èÁÇY p oÖüo>ßE©nl‹š†¿º3Ú¾GüîÚ?»Ñµu×>{è`ìAòÍ7(s—x•þÑ'h·/ÒbÌݺAù_¦"öoU~Ù,àƒÑ »cÖÁŠ;j³Æ`ÃcÇŽ*ö6°ApÌbœsEaaQƒP{¶¯zðÁE§6Ôî9µòôÓϘrsOöÖ!¸ô0œÞë RÍÆùÛ‘ÞooÓxÀ¦ JÙíÖ¿s°„ÞC@ h÷µ $¡ø\»gÀ/ÎE\„½xX;ÊBGáÀ`¿LÄe^C908°]=Ž(gŠñ`YÖ ølDÚv}¸mxîžôpÜàEøƒ€úí¡mzïø ‹ðAÒ-ÇÚÒ¥k`î(¬)ÎþLlj „=ãY _s ŒŠòxåÞ”^˜0ŒÀ!‡u¡QP9eŠJ8ã -`ðäþýªì$+á¶IQQ‘Ú·oŸ÷¦M›0¡PuœÅž'ôH©Gy$†÷a•qÉÜf‡áØi4Ú&L³fõêï{–ßp÷_g€Î#à×ÎeŽ ×å‹Cϯ€H2Юʤ ïÃÝ“±Ü ¾ÅöÖúñ1ኯt·ßÕÛõJ=qµ7gzšÖhû\q…šùòKZ¸Žê×ßlF;èL ØàÊl^`|@4‘œ Þ†ß}—òaÏ;3ò„[ºíïá€^ên¬?P™7&Tì„5aEè??3k¿"ÚôËj&ˆØŽ§ÈeíEŠÅØ`9׫½®éÉ×€k<}*¨sñUü8Ú\ðáçâç%¾X 4Vx¶y^Úðtñÿø/0°é{BÀÜ„¥KÔÀ+ç*_Dø‹Ôcú„`aÔÚuáK›×£‡ªÄCìà¤b1b"f>¬FJööíöÄL09?uìØ1—ôèÑcjðŒÛ¨/ÌÀr|2/`ùOà=`3ÀçÜ`:ºÀããÕ # ¾…®ŠhŠöx¡ž| LJ%žªm^10W4øìÞv@Z’D Øäælâ|ÙÕ> èmî,˜ÚÚkÃa׈CåOåø.àŽB…ÿ800*‚Fï•Sô¼áÕÿ²K•}å6ȯÑ;h¿•†yxU앃Ö#òÑÐã$ÂaŒþÓ=*éŒéê×—ÿ­Ž­Ze3¯ œ0aB"¼õoŒ äsxÌÎNßúÄÿ¬c¼>üðCE›ÿ8f `,'#sƒ°íG@¤¦‰åñœ –«Qø´1,ãØkC¤°©ÆÓÆyä›g ‡Üø  µVÓi>ÛŽà˜þlW¥õ?øÌ¶Ó\ê(º‰ÿ¼ôlRþáP6—.Ö†¿5ql{(1ë ”åä*ïP¡Q’|hÕjU¦ÌÑÍ[§<²9%¤KÕ-5U‹ÈÞ·¯ÑùôôØCàÌLÈùtc‚ûÐK@eee=ïççwãC-8ºnÝ&ý”ÚåÊ•«ª¦M›²—f°`rí¼ pFìþöÛë Û<}•ÖÕÇ@<ШƳd¼L[J9^–yô܈´!b´!¹Lš5š‹ñáujï_:•p.°p'á»>x ¸°ÉòEõð;ïTcî¿WEôêmsíé{¬ü†Hÿª»TçøS•8*ùòâõÓ« D¤QF† éa!ÇÝgœ¡ÌIðÄÖmªÒHh<|šF­ g¬oç56lØ ÞxãÍ>«V­âÅ÷|Ÿ”|Ujj*¿«óëí<Ž&€÷ëm“ŸJ} øÍŒ*QÙÔC¦%ÄAù3æà7à•–œ/çØÎ]-"®ÁÀçø0ÚÄòFº¨7imþÇ@Ål€ýpÝI:áf§ÙtcP&ñSRÔôžWæ^6ë`ÅAnDšf <7WX±ZÈ:YëZáà?Ç1 ñɓ٪âd–:±ñÔµ¡Bê Œ€jø ""Ô@ŒH8ëÍ7T¿+¯l`,PÑsl€úrôè1µ|ù7ô A›_~9–êËßH†ï{}iwýkºÊï%Èè”%–ÊB[å›Úþ¶J\Ò=ÅÀ)Ý©m²æ| °´ì ˜0,ÊHàŽ|Ìø˜Ùæ¸8¸‹°Ö6ð —­7űðGÜù{•<{¶ò»_Úúme3Ë”–©ŠÜ•Yà«vìÜ…)†ÓTqqMö–(:zDóµ76èæÒ‡1Ö½»: Ó&'9Smyþyulõm "Dþks Ûþ¹¾zõ*UZZjÌ,» > \< ¼е¬ .©¯–Œ}iœg°‹½ƒC¹Á€$[¤Í¤rh¢’˜UÄ`•§Ûx?r46!¡KÅgÎ@J½Öz1(ÿHí,à`ëSušXëc⛕Ò9g«Yÿy½¦­ë¢üí{žÞUó T¡&¿qÓOêè±4U7>kí„&ll²A4î¡¥c† Q©O=¥Ržþ» äC½1Ø’¿!È馥¥i3 6’llçŒi9@¥šÛëË¡úäw^Å–ÛP~[* h餉?üÜÒ4ä<ÛÀv®:êHÖʯˆŒð9j¤o||5â4Û¼ØMe_‡öEX¶fi³–œÖÔñ.´ÖÑ£¿®lréúc¤¹I}\M\ðˆ E7?‘–1à‹(ÿˆñãš<™ÙDICÀƃg¾öª‚Æói>Üì<|/Æ4ß&༠XÖ—mõ7Èo« ¼‹­× )t”Àç8}&žmàF,E?‘6Ÿ6L[’n=CÄ"|^'މÓ>ô{V¿lÞ¬Õ¬Zr |´eøhð÷#p1À&wdÜÄÀÀ¦ÂÃËË[õ¼è5ôÆUP|¼cÆÂo&é&¯FÛº·¿ŠKÇÍ]·ïÞ8>¸°ÖÜìŸ,PgΞáURRZ´rÅ*Z‘ ð$ÒF Ð*qNb­·€3fœ›Øµ›™®vs¢¥¢å5fÌø!©©S`dzý ]Œ=65ÑËÀ˜ƒËq\ïÔÔÔÍèU@cÛ]…–ƒ†<\…ÏÒ¼bßíúÃÃó¯_T}z÷U‰Ýü×®ý¾(ûd6›h2€­ö¥&GÛÊ€M¥­‰ÉqcÀ)ÑÅ6ø´Ñ£Â‡a6(ZÚtªúrÓÆjïîÝ6_Ô ü¿ÃI—5‘Y6§àt²–?x ˜jkîØ­ÿ¼yªÿå—©@Ô]-º¿¢¨Pm¸ç^•¿m»2ahÝnž¯fÌPÑó µa§©ÌK%FÔ¦ÆÈ^ •ùóÆ7¸|¹ò±ò^«Ð}pmpˆÚøÌ3*w×.½6o3 ô$&v­0`À¿?ûìó[qbƒ@ÀE‹r‚»±ï6 ÈæÄÑ ûÕ¸íð8Éñ#÷¶Jßý+xê-ñ¼üê«êJôø 0fäÝÿý·lÞU×Cp'-½K $9ñ8˜P%·é¤28`䈑Ѭ0Ê™nJ}Éõpt—:väˆ*3Ô†»¾Aù¯Á1Tþ ¹ÆÎuÒít¹Þ<X 沚í¨ÃQë_ zŸ{Ž6.½«ù±öøó/Õá÷?P\g3@öÏ[TÆúõZsNEÜZEk•¼ldß~jüaÇâ…æŽˆ;1áÐ)]Zå맪ðáÅjötg<€FPö/¿*ïM›ThØ)ƒ†|úæ•1-Cz&×Í:î5,)IõBïƒÀ¸X•… ÙŠüæ›’‡¦&Áƒ@%¤ ¯SPP˜UZZvæ¢E‹¾X¶ì›îèåË¿V˜g  55¤{]…sÍúùXƒåõ& …“†mîºÊÈý,` ÐÀ0ÿ¡‡ÔøƒÕwYWþô°Ü‹ŽŠñ 5ùÅ×|p“€e€'pˆÛl[qý’±mùi¯ÔçáB×ôéÛÇ?5uJ,^øZåÏ ÔWþÜÆš? ¤ ¸;¡ü+Ï?ÿüÒ¢âb}Œ`޵Fåÿp1àŠ]ý膽xHlzWýPë3ÿA5üÖ[T<#®ªìp¿µÂ`¿ãPz»ž}Î~cïHeA:Žnƒ'·ïÐÜãˆapž«I5ÜþÛ-Q‘m0::ª6ûü Õ¶/¿VQÆ)Æ{…î;b„Jš9:ØKeïÝ‹ø˜7;gÎì3 r8ã·Þz3ðóÏ?§Ïš^€Ã@EÃÁ›:5ÛÏ’ ûùà a›;¯þŒ›£×q9‰ÊK-|ã,÷tÅo\…¨ÈN[¶l):™u²'Ò<l÷ Ûæ.Åh^mMu ;9ebÈ„ ÃB0˜ E7ôum£åŸ®üÇŒ£222rï¾ûn*ù«]kûït½¹’°Úþp;PCD3¹g­ÐÍ7©±PþуµJ)6s)ÛwC •ý³×ù£ ÂÌf!Ý»«øÔ© ã×¢æzHUäåµìž‘ºÓsݪ27nÒÞ· xŒàäñ4ì2¾^¦Õä©ð)üta ¿Ëùç)3º@6+P2üÎÂ1¬vò¬3UÆÈ9pPU‚Ó)0B82¤E8\ô÷߯…±qHßd\Ò­Í&ósæÌ`³Ù\ûùb¬Ýoð *áܳ4ŽlåA‹ð6aü€aªÛéÓ”/ÆÕ 1“§ŠÆòò2õÕWËTaa“¡4|'s¯Áƒ– >‡ïµá}ö:Š|/ÅXlÇöDY‹›fÛýQ`åîÝ»gcé“’’L/—.õ•¾ñ7Ÿ{TT” ¬ú`|€rœCãëÎ{8õ–Û{¦ßºàä—ÿ¹W^ׯß@ !*zJý%·ñÅ'ü0fvjjjåyç—Ž6Pú$Ÿâ~Zðüx/žÞ¼°Ö?ôŽß©Ñú“ OJrXíºù+ÛpžOqf†úyÁB­†Í¶ûœ_~QG1t­ Ê+¸K‚6« )5y•kë±cƪ¨Q#áÊ/Tlo©ð½*Í<®Ò1ž~þo¿)3ìÌp‘s»³Iš{Š3ÒUÉoèÛÌ1‡ü^̨Á÷¾ãvä=šìË6ÑÆ§‰H¨â póµiääähmúúwY»Ãú ½Óa@\C=c`è=?^_c`!6ù5)‹-ðMMÖuÊ”É)øÖ'§¦N99uê”(–?®`õêÕubšLÐ9w"[Ö®];'99ÙoèСþz6É•~cKÄtêÔÉ?=ýX)¼2pž/ð½~¾,mg@ Û¹rÔ‘,Yèêîqö9gEN?1ˆ^ðe× }i¼ cbúôéê¹çžË@°ûÙÎ_i<ÎEÖYH.h¼tN•¶øÑ˜ÄŽ«¦<ù¤êŽ‘ÞL0„œQö¢8ûµ Ϭª¤Tøþ{•‰8MFàŽ¾£!@EMo@â äÇ€Z¬¸¡§ŠàæN_½F•ÂÎa…9ûž3‰ÉßOEŽ޶þ>ÊÝ_ƒô3}šê~ÅeÚè‡Õ*¸5âeÊAµ @VÖIõÃ?Ø“¬÷‘#G·nÝêU\\RTŒïЫ¥úe®o,¡… †"øðOâXt{õºÇÒ£0 ˜\‚íWø˜–š:¥øôÓ§ìþæ›®l0ðâø‡~8îì³ÏÆëÖá-€±æ¯¯ëûB1 óäIÊŒ¾îy¨ÅWäæjïŒ=IiÇ"1Æä`ü€Ì !_­M“ì4ñ¼_¸çÁ§Ž8@uëVc:àµ0Ã>ZWäVW©=¼Ôf6´ƒPNjsàÀŸM›~ÀìÅ'ÓàIxzïÞ½‡ë'±tésJÊäK±ý-€Þ°@S†X…†²H.á%ø ±=ÜUe2žÃ(A!h6Ñ<&º¢¯¿Ô=ÜÎx€À ³ßºï×Ó›0 7ÑS›Wpëö‹ösÖš3zãägÐÞåsÕ¼¹ûöéß ËçË­‹^óçXÙñ¯ä¢‹.:}hñº’°Ùã1àQ Ö–Œsà—n¨íOzt©ê–šZ3¤­[Òh¯cªàîßö쳨Alü’ÔÔø+D-ûÈ_ª (Z¾hдxãg6»Gˆ0@Åqð#Ìx˜óªÐ’´ùÞU ›]‚³¶nÃüÚ@BN3~ßx@m šáùÆ[FμaxG_z‰6ÇÂÉ=?ŠÝÁ÷쓞žå¼¦ÜÂR (X´ha”ã_èζUh ôÃsâôÄ_BÙz¢·2++ëŒŠŠŠ tÔâtE¯/ëüÍfÓN"}ó ó*wïÚÃÊ£?—9áý9m–Äh¿GC®_âç^yyô¤ “ÍhÔ®®+|}iÌ bNú3zô誳Î:+­°°ðmìÖxŒ“¯óü`Ûç4ÀZÍ›ëJãi÷ݧ†Þx£æ2§‚sZÁ3:¾éµ÷…Ao°\¶Ap?9ÕîÈW_+ ÓŒûõv@³†€Á¡¢GŽPQ§RePV¸¶Á܆¬Õ9÷SŠîw™kÖ¨¼‡”=8­÷Y'1çÿÁi†CàA1Þ_z”öì©âÑó&Æ[r8í°ýï$¿…QÀ5dâœsÎÞ·7ký6¾8<³Ž$áW—3¦}¼|ù·Nü‘ÔÉsýذaýúõçôìÙÓoðàÁþF…o\¯o©Ðà€Ÿ~ü©0?¿ ÒÙ ¨ùm1¬óÒ[oG¢gŸ0.àÜsωŒÂh]éëKm£á ”¿zíµ×2Ñç;vݸJ»oäõià~À¦Ú ‡íísÅåjüŸRO;Í©ký¸'MQpêÙŸ—þE•£?º½RÑèN¬ý^e ™ƒóp¸Z/|­Ô˜ã&ÂÑk ääIU|ä(øl¡žAzE4ÌÀDDÅ'³µfW?À.}i0 Ò`àT 8°€ãÀËO\b.¢‡ SÅ9Ùªc´@àêž6yò¤0 ‘ó‹°ý;àÀÇ=~üîéI3–Û| }++«„`Ö]U²ñLÄŒÇüAŒôו½¾lÌÀ|^AÁþß­Y˦ñÀ»€}nœà‰b|‘<ñþÛëžù‘?‰A~|n¼é†ÎýúöG[xMA\_ñó·^‹ä²+F5ËÌÌ,¸óÎ;éú¿Ho¯L·â:¬éÜüØôž£Oö¸GQýànõÀ€àÂùÅ }é7ª#ï}P“_ƒâ°9ï8§fiè-÷sƒï""jŒ›±r å] †òŠÃ¹ôª z¾íÜú;f嬯7!Ÿ>7wÛ6•¹~=jˆ@ žÓÄ4žsÛöðÙašåðCë¥ù*#úGFhµ~rÖ½»6ã`<yˆ(AŒ€=rÑEr$¼`Ý©¸^F.+,,ù¿… ùŠ}-°"%%õ-\zöŒã ðû2á ®,¬àôDœSW¡ô|ZSþFC ¦¼ôV>%eÅÕ;wìBÙªø¹+Ñ^y·©`n¯Ì¸éuøBRÆÞpÓõÑ)“Rü9¬%EWþúRÛˆzáÌ&ˆüOLJð7ìúL?Ɖ—C‘·×¡¶ä“A]ƒn¼AMX°@Eõë×zÅgËEx ,Òò´;P̘ >wÖ²|ö™6~@Æ{ðå€4TL­¸ª½1|n¸›8Ay#Í|ø(tÿqãÆê±ŒlÌà>³9ƒ7ìÚ¹³èäÉìàf/àÊd¿íÅøµýÕ<ó wâ¶g¥L™€¾H}¢ŠúÊŸÛu`ÜŒýë_36oÞ¼›ïÕÏqÒ%ûñÿ@íEËŸ†O³ŽÂpÒ_–b¶¶s”jY®*PÖ]0Œ5âÜ]˜qÍúslÉ=q?Žà„îxœA}­->î쨡ƒU4Ú³+`äÃhq>¡´Ê²²ðÊE×¹ŒÀ€n‰H°µYm÷óµ™aÌ‚¢ïÕ§—‚•®åAçfÿî½*],£Ñ¤b¼?rꇘ‹¸‘#UWËàLÙTÉÚw­ßÔ\ B Ó3ó<þÝwßõúâ‹/9"&{Pq”Ï:‚A„0KáøCÞÞ&öÙµÂZf\™Y»Å5W`•ªÝhŠ>§.¾ºâ×—äʸÎßDºú›×Ô4àAiC£7o‘¹&Oɵ¡±ÑDza]ÿ¾¿»ãöøáS¯)ùÂ6&,èúG?⼇~8Ç] ä6v|oç ±Ýí}`.`“¦b4ù`ÌØ7áá‡UD¯žv¹û+ÐNËqì9ß{UY9 d\Õ „£ô…c šxôX€Qù{öh.s]‰Ø•E¼áïø÷ëÔqŒÀ&Ž! ÐÄ»cÓ5ðê1> fÌh9l(ÚôpøpË=/ÈOÚÂ9¿c 8ò¡_8œ?¿â6e³=¢öÕ2L·¼‹“Î(|²j;Sí‡a³ùç_TNN®*MÏP±ÓO·nŒ¾]ÆSq§V¥ðäíÛ×àúõë«ÆŽ[Çèâû±³5~±" ´p£â׳ ¼}1£ÙÒ¥K31ëÕJì[¬ïw¢%ߛ郎ÎXkiV|0ªÜp ã;òÎß«P Þ¢)ÅfϪ{€\áëÿò¨æf?‚¡k÷}þ™6¡KDrr!ÂÀ)ùðG{qgøaè›_€vÙ :·Lønp”¾£_}©Ê (¨Eác{«ù¤ç‚Ál'OÖÚ¸s¶Á… eÞƒ…çT¢ùƒñÇøé…i=œ=>€ü–a €“ë6(¶;Ó‚Ñ¿G_?4q$œwv³£8òÛÖælÀèŒÝ¦MUAqq*“Õè’‰6|`hꢧÝß´éŒõëÔ[ÒÍO#`2À&cÇŽöÅ’†·±g -̧`؈DœThôüºfÍš³16@›‹Ð}ɉœü;þ߯]GÏ &ß4ã K­,= )ɪ‘h7õ‰þïï:yâÍÐâ LK–Kk ‹1®&ÉÈ»ôÒK#™—Î$¬é³[ßU€Mî~¤=Î=G ¼újÙ«—â 9-ÖÀN`PšO/¼°ÎéÜÞyâ5ãt‚ñTäLÂû¯()VÇV¬R{_{]•`ûúÊÅ®üBÁø""½Çå—©.S¦(?Ž(ˆm­ä“RcåÀG©#ヌ©lèÈj¡ O^&Õiô(•|ùå*¢¿&Ô>§•aôÄí ©âƒqÁºEc5¾Û^÷ÝS`×úsÎEš>þDÍÆDCúø¼+–Ú[knàïf„~Ë.¹äâw ðÖA3‡ð{äüùnÒX¼x±¹ªª²'”å(äåÓ(ÃýîÅãÿ‘÷Ûî½÷>*_g‘ùݺu»FRWäÍ‹|Ù‚ôŒ4õúë¯üø£OÙtÊŠÊ=ÎrCΔM19S†Ü$/Ïà>zÜrÛMΜ9+À ×?>¼Z«ÆuÞ7Û°Ð/¸bÆŒØ÷06­åv'äã|à?Àé7+f´[~à~5pÞ¼Öèƒj ”|ÁázÍœà2Ñó»ßyW• Æï>–A–šÍ`; ÇÄ¥LVÞÈ[z T¢F¨+»²8݉õÔ‰-[”ohˆÆ­ÉCØô\Ä ¨- !ȯ]idÙ-4(ðlŠ`P¤¯\©JмœØUù!XË…M7¡hR*€§¥ó*PøòÅ_p¾ŠŸyFËžÒá´Ð‰0~#9Ê A8ÑÐ7hÞ±QøÍõIJJšƒ±?Ë æÏ"ËÂÃÃ^C¡þ»vÉc|}M ©©SîÄ: ‡?ážÎÅ2`üÎ$àà2”;3q\!†&>°råJ¸:\6¢)`‚&ƒ'MšTÏï§>Œe)÷±Ì Â,+¿lùE è܉³U¦:œ\1ÿø!]?ê´‘þ×_}]ÿzm_I¹Ô ‚š¹Æ0ÀG­ž~úéÌM›6­F Ÿµ§Øg¾°']’6I¯K.V“–,Ñôá?­*ÐëV©mmœYÆG$wºä…£IZ;¬ã¶!?µñ£OSe…EšrÄË€ Xݧ-™¤b*Ãøéß®PyP²T2fÔ0[˵ÆÒ„ëº3Ú²C¸–³{O«Æ` :oû•†@Áj FŒvr6ç8›øÁø‰;Z… ¬’º©Äqt»üR=q|ËŒ ýñìrsŒ2˜‘‘¡~Bì=rèÐ!SnnFÅœèÕ˜¡*¼ ‹ï¾û¶w×̲zõ*öÎù70ˆ³æØ“€¾ ^_ÌDˆyVÔ @ľöz#¶Ã™ƒŠQ†C÷5zQuo€^¦ËÚà ö ðÛ°~cÒ¼ ´ÌýˆÝQZW*»##­»'¶É½˜ï»ÿqC3QéÊ^_ šu¨}ìß¿¿ðÞ{ïeÄÐu€ýÃÊá$ Û¯^øÙô¾£}’Ū?ܾþìîäEÌÈÿµ=¬ ר@i ºù&ÕݬZ¢PM×Ñ;ÀúaŸü0tƒ,ÂÂŒ0oiži0ÐðزåZÐa`BÛ{«ùdÐežg´]û¢y**óåù¬Äsd|@ƆÊÁŒë EÞ…Vß\# àžÙC…=.BÑœC’±丵Rž¦xÆß6ô<°g~–#G\ˆsÔŽ;5CÑÿNœ8ñ ’„;¿F-ZØÆòøu=€%lfí5c§M›òÒîè65~ô1?ýôSot¥Õ•¾®ìK£!ÀGâST\X±oï~6uøß"l*Ð…-›Xˆ#‡]wÃ5á³gÍ ö÷°(ºÿkPYi½CƒVÏ›7/=??ÿŸHú® @>h1ÿ°©ð ²è;w®š¸x‘Š4¨^+*Ri¡˜P ïùècµëMf§q …‹uüŸç׌L×øaN³‡J…]æ|‡('¸žªò–ÎâÇ»‚òÊC°Y:ÆíÇlêÄ@Bè£Þj é²§E$‚9ÖA%\Ïy¿þZc´D1âö6H_¹ž…]ð$hCì:̓i‹ŒàžíDÖÂú¶)ïQ£Tü¼yÊ„šüñÍð`›­BOæQ;wîô‚òOÅy d¤é¾%KÅWUU¿‹õ‰@K¬žÓ—èú¿ÝxN,›à-9^ÒÀ` `UQ‰x ²§b«jÊ[ŒÑ€A×ЈóÑ|0÷ÀöV²DÀ€Ž{ Ø–vBb‚ï¿¿#¶s\U©)}ºûk ×üi±VWÓ¨Y†……ª>ø ë‹/¾Ø‰4nª—-»S ÆTút²`“p¼ù‰¬õ_†YÓ0*nΦól9¨í±k~¤ÉQöXk÷ÈÕ £ÝÙSˆÚrý6=†J€ã`~ûXô "ÈG4kÊ-ªuB¹èµì[~ÑŒ!Î/@Þj^Wv‹…ҊƤ8Åh¿.B,C‹jðšD|ÚÄ-ÿF•Âð î–X€ë¸£øçç© £§ %QѪ¼¦rušJ„—…ÝFs08S „nýÎÀ9h3~ü¸¹€ƒ Y““ØÈÀ8-ü_Ø+°Î¾ŽqkÊFéϦ€ƒÆ°NÏÆ±eË–¥ž}öÙA¦Jx¢P\ã@‹ò”ëµå¬¥üåÃÁ¡Á>?ý¸™÷ÈŠ {ˆ€1óø!™W€ð‡~0fèÐátk/gÍËxê¥Ô•~Ívt^êĉ¬ÒÛo¿ý~Pù:BX€Œ^èö¯_`SC¡Â|Ójìý÷©Ht{jÁ i 5l¡rÜò‹êȲ¯ [®vŸ=[ ºz^î²…Ê\F ®¢¡`Ë‹1‹ßáߨ~„WÄþ ŽÒÇà»\HúGvR1Ñ-SÖV8 @¬Aü”6h Ê†º¥ó 0ŸŒÝ`×Ã4Ä2x›ýµøGÌŒh%ۺɃ#VÃø<ËЛ£0&ùªH¨;Œ€Ø‘£TŒ€’,ìðiš;÷Šž˜><ÁJ¬Ìq¼fKL&¯ë|ðϯC©¯…{3–ëO?}ê»8~®6 `œ€.&<"SBB—ÙäÐÁ²×/i—”É)!åðPé[bª4ïªîm­©`q !ê‡!‚K>ÂfZ6iüÔÁ÷â—À1án$3õÒË/:ï¼ Â9à|¥%ê_³P-ëpËÕìËI/€? ¼'Ÿx2íÿ!“»S‰Âó§d›ÎF©Ð%5UG­»'”¯6à‹kýÌk–'¡\Ö/YŠ6RïÖÅŒ>ñãzÃÐòÛvqA í`¾XLÞ>` *:ž©ŠÓÒQˆÙo žÇ(~*×ޱm[›hÉA4± £ëÌÊÏ ûçŸ[<~óÉ^'0"^榔?že Òl‘wÁA÷æÐdp&Ü_(…2H9<=¹ˆ¤¡« Ž A“Hϳæ¨îÝTÆR¨âœ 6J?xÀ¦NMÕjÂÆSP@¯ ï¼óæ·¦M›É ¸:òÍ7ßVÃ8”š:e;v\_¸NÑÑ‘Ï}û­Sô ؼcÇŽ ‡ ‚Ï>Þ^6èM¬§Ê]½ÒUSÞúùúÁ6¯^õ]>îmð1x´ˆÐúÇßI<äóÀ÷uŽ‹‹÷Ò^BÍ2ÅKH«…:kÆ5/gÍ‹Iëãy«Í?mÎöÙgÙçˆílãkÎ^Îܬø"(jÄÝw©á·Þª8ꙕšF³iØt8ÛðØcêd35Á˜H¨;Ú¦[åâFÁ«u¡3{6e²m¢BÔFéC~`BUˆ /Fü·H!òÞÀe.F·Ëøî;M9%8.>€Ê+MñgLWUˆðÏƒÑÆëkº6³„¼Öx.V©Üýû´Ñ9lq‹Ò²ù¢m ½Ç>ùLu5á“ãó°H)‡úáëoTäˆáZ𡾜r¢¡ä9s4ÏÐñŸ|IN›‘+0•¶q !¾Gì:÷öÛóλ;–,y|?’(i,™ÔÔ©iø.Ã~£  ºÚëUΘœ‹¼ùmذaÈYg £Æ«Æí_­½×¬ñW[*Y,o5Ã-–QA˜+Èû×_¶²gA7€F€G‹Í?þA8dpðàÀÐe)`šÿЃÑÇôǀܚ¢×\ý|«-–¨¡Í¿¦ý¿šCŒVÝu×]™X>…4Ví) ¸ØãÀB€ë§J%ühL’Î:KM\ºDê”Áym%,¯^£¶üß3M|¨Óî¾»å]Êð¼*Ptâ—_U`t”ÖMÏ™†&áhZ‰›0^y# /ÿ Æha|€VËfþ?`ü€_´¸Ž(è°ø4aÄœvâƩ“?àð‘£Ì ðlz_x< ìBÌ/p "•æåÃJÐÆ;0*O›Òr‚ƒ4Oº§xñ%Õ³gmž=[ôn_³V•ùx+ÆÑÔ1bÁƒ8ã1qSWxÛs‘·ÿ@Ýcô„°ìƒ÷mÿZù£oæ3‡âV?üðc0¶Í¦Œ +¢A?ÿ+¯¼¢2//ï\ìëèRtþ…æg žÛ\TTtºan…ÀŠ 4XÚûk•¾ö›e¯¥ò.Ùîøð‘âãÇ'âæèZé ’x hïŠ.Ù1"€uÞég×*ÈI_p Ýé—ܳ‡yÈÐÁæ˜ÏÛ×ÏÏ4~ÂÌïáçgÖ,MÖøùâiMôX,RZ¦ºuJ}ûå—_f¯Zµ Õ%m½æÍ{è¡¢¿x `a`“çt§£çÏWƒ¯»VrÆ·6–ò‚µvÁ#¨ùB‰4"ìï>êÞ?©˜!îç6 E/x_ص0îæu‹«-O?­ö|ü± ÁÔ¾èM ¥gOš6_¼"? jø0ÁyØîY¸Š …µl*Ö²3``åîßo‰ˆi™w¡þí ¯ìâ C1ò_ÞÞ}ª Ћ״WxN5 ÷ôlH[±R@‰Ý]i~Þ3 €£Ÿ~Љ†v«Iݵ‘ 1DæñãjøÉ<ž¥ ÑLÃyhð5pʉ†ºŸ~ºŠÁ;I†J­ÄLFoìieÓ iuòƒ>Ä«R[¼PÉÑÛ7@D¢šÔÈøñcM¨Qߌ_]ômXòáqž öŽ\e~ctÀé« ((8ÈÄ`@ÝËZcÔÔú¹ÎÚ¿î…Ey­¢¢#ýÖ~÷=›¸Mèé–åÙX^\°Ì²€À-Åþ¯Ò-i¨½©P¬ÝÐæÏ­)©“Î8ã 3>¬àÎq§ˆ~·>ÊÖ$¥ 5ûJR^p} 9]éë/cM^D¼¨Üvôè±r t/ç Hf¹–XÛÿ£ó(ÀÝJIc%(D’Ï;W »åVÒ%^Ë¿•£º‰ž…m¯ÿGmX¸°ÉtÐÖ™òøã55Ø&¬) 9¬m±²1¨Í±MÕîÿ½‡Zæ¡:g²°Ž’óÀ*]qXaz(NÀ%¼ï­·ÔÉM›4c¦ÎMØó…#G&ì ÷}žspRRaaO .+Á÷‘eËÔž_Våkßø4vZ£Û‘× ädÕëê«4Oƒ(ˆmÎ.|§¶/}Lå`샸¸URRª8˪Vm†P|g#ÿý/x9X5.ä¯ ]ÿ`Ä¿Íÿø‡*Á@BŽ xæÙ@­¸ödncíùòoj·Õ[aM÷}à)àg zñâEÁÈ×n¬³f¬K6.;ƒô8“¼>gΜi·ÜzK+Vº ¦[ ÊYT¾jâ°jÊ\6ð¸Ò²Rv,—åä^+ÃqlQQAõ®»+6lØXˆ±ô‹Ë-ÀK»gëÛ±êú"À©gH÷Ø#@x``€÷m¿»5lĈ‘¡q±qÞÁAÁ*]Û̘â•Ê¥˜v–NË rD¤– X‡ýrK´ƒ´<µ—βäÏm¥˜æõùçžOÿüóÏ¿EB—k‰µí?3—‹Öl’@ ÛJ÷z×””Ö.gÓq¸-D­å‹«¯E­èP£gù`ÂÓŸNÅÖh ^¢}¯óPÃ:ˆž¿¡0,ƼîÍ g)ì}É%jè-·¨ ÎU!QàÍÜûy_x×Ò¾[«ö¿ý_U¸gŸ6hOK/ÍÚ“?š@Ï=W êûöΠŠcëムUQPì(önŒšXb¢FcLÏ3Åô˜ž—ž˜|/½÷ò^zï¦WÓ5[ì=öÞ VDª‚øýþsY¼Â½— \„£ÃîÝÓÏ GÊ(Uˆúš+çêï0~€ÝKdŽ ô±!ù©MÚÝæÁ}²«-/£ g]ÿ#¹>þ4oíÈßÕÂ9ûæk~ǰP›iÌã%_~e– nêáMpõÕ×à÷~P §,†o@$ˆØ(DE §¼ñüóÏ5býǾ;ƒ0+$¤ê ÷Ýwß¾BÚ9ܧ[qÃ__xá…†mP¸˜,$®ñçb¸¬úõ 󥱋 ¥r2¯Å¢t­ß¯T$'%%å$&nI™>mzúüù ›‰•ÜïIÊÄÃý ¥u?ž¾Âƒ¾qÅàÃo½ý¦šÃîV÷˜N#Ç7ªËâ_½Zu…Ûd²„Xj]T¸Š%HïÏb‰„Ñ5ÏŸIxÀd2¡˜{– âW‘¾jÁüï¼óÎ.îy¥4õjBY(ŸPî¢T§ C¶ºäs"xÝÎ ­È º÷Ü×ß4›'NðÙl+ ·>ïgîxÄRoÐÐó̇ŒqÁK ?B_åâ'û€ÝMÆŒ5ÚvõTŸö$¹Ù‚}À¾TÙ4tqÎEm«(÷-IÝÜçß1™4ÉØ›Î×;çL‹xßoàÙ4ìÙÃ4ês’©ÓÑ’µÊ¶oßa&A ú²èE9«V­Ú½kÕŠ1º¿˜Ñ<ðà÷~´s¸«H<_5Gë^={E‹9“ e´¤veŒ\jÔR0o ê74M71ML]\/kヺ*FáŸQ±ÀìÖ|êÕç| ˜˜Øð–­ZUïØ©C$ã±ýú Z?%=5‰’M)×PÑ ÉÛ>¤œÒ¢eóªO?óD½Ý{VkØ QP|£xg[b4+¢£’ƒøµÎØ}眶®ƒl!™ˆÕàPk`-Ÿ‘‘nµÊêÿ™ÉèC?øàƒíLÚïhòsJiA ¾ò¥£¿7‰#Fý O ($؆ÖX”EP8a¥Nš5G)óžYet玦é•WÛ¶!".ÎÄ7mvHŒÏÆÌ‚ ‹2±¸Ø5Ú¶m[VxxX È1…v4 ¡JXQ”†cÝèïEd Œh@‚$}›–ã‡ó’±5–ÿ¦6=ÍŸ¨WÂDТ®Óf×l­îšÛZÃuœ";ê0r !€eSô7„„ÕÚuh±iãÆ½{ö¤´åùN¥Œ§*^¡N™…ŠLDòV>¡t;åÔá÷Ü3¬~ƒúª&4ijbY¤4øJíýÑd±Gr'ŽÕùÛÉ“{Î×w­ZM2PðákK…S!0mêôÔ~øA“æaÊÕ,èA›ŸR®¢ˆº/dXÕ‘€>ÇÝu—MÙ[è¥PA‹á´§ž1»—Ê.Ò 0–]ïºÓ4êÝNC6§.B:í™gÍ’?4›áú3¤e!p¿0qFÑM¬¤8ï2<¯ŒïêvïnbȆ¨¬ˆÊ`·ât–çÎØ¸É$‚\ÓÈS .[ñ 1®úFªAÄ5èßß„œhÏŠå¨3Òݾÿ;¬¶G'úõmx7Te ¢HbdßQ æ€ÿÝñY3 •Z î~ÁpœA ™p~Ç_~‰irá~‹þ½Ý bç‰êLk@Œ‹ `©( )%òÁý AO¾®~ýúcYÃ>*ù¼=†„C¸téÝû„èðˆpܰeño,Òoò@úäZ½s‡‡“ö·•ÞºŽY65_ÿ,qK (¦ c`ââêÈ2¤S§ŽÑUC«f¯\±JëêÙIvPÊ%8ت\v¾ÖsD9iðyçF\vùeõ”9ªyS ²ßPî$AˆdÖ¬YcV¯Zm“olFŸ,¿><˜õL{¶´lÙÂ4oÑÂc].Ðy-–ö»¸Ö˜µëÖ˜+Vf¿öêk‰þ‘a 2l늢K5iä~ÊõIü‚ú„ ízǦúT êûa-Ø2lšâKÌ·Ó~è•fÇÂEfÃ_ù”÷Ô—X¨’ Å´hn3 J ƒ?uyåd±c"ÄЪ/°X¹²DöÈTM(’€Æÿ:×ÄŸ~š• øzGE#õ5cÍß›?ýbrèw±¥ š·,ܵ{öÄ>à"S³-j$‡SŠUس‹`9 ÕéEÞs–ô{£ÍX"Æ*?C.èÿ°nýˆ¡k6kO ‰k¿¤žÈ÷)ÇÙ¨d²盈D ¯²7¨ß·‰& Mʆ fŸ|Ý„V”›èˆ•dâlññá¡Âhà³òN‹r›²T7 Ú=Ó Æ- UÃŒWŸ|²ÍΙòË`M³ ]Ñ;Ç%Br2€›NATsÄAÔìðN:5»ôÒKêÕ«W7¨es#§×l™/Ûo¶ƒØ¿ùö[3"©Æݺt31p–ÔVÌ6iji:vèh gÏžmþ9Šd«´×ÕÔAÔV§ÂX¶é’eaô£åç#>"Eì@E$äÏYçñ'©S·N½°úuX®ÞáÒ×®]kÞ'bWçNǘ–Lˆj¸çá[c@>*-‚°Zc=€&È>DÄ2þ¥ùÛo¿™ºýˆ8¥)ƒqKápÝòC%›UÕŒôŒlTBÚÒ×ûÆ6ÎÍÝJä/ÑÜ£´…C(m÷4]o¾Å•‚•>IÐx*YÍÔÇŸÄB?¥Ôº¢ûH?Üïcpí늪¡bâÚâöY(å}PTnVÀÒo¾1ëGŽ2+ ¶²‹øq:Z·Á¤Cþ‘b¥öÈf5 ãëÀÕÄ"²öà[ÀXf‚LÉ/ —Í(²ø…ÅØ>Â4 ©LÊš5&ä¦÷WTÐ5Š£¿sÆL³]>ö‘Øij¡¨)Íú¡(ª_¡ViZìÆ·ÏÓO™†¸¹/\Ä@ùfýï³uÚÔ€÷AbåºèƒÛ]y…érç¦Ë-·ØE0‘°µçóbŠ}_q©î¸Óu=íìÆã`‚=ÕîØÁT…û”®¼Øt.Ì}N%Ø©ÛûÕ¬™å²e…_äªù#‚iDOâø‰xdÛt¾!X]—dLmw髤R1p¯uQ5°2[G!óâö5 ×íxs$¯]á[‡ÄQµ]v%xÿÎÐé­ÞÆ៛ø(Ö+ ÛØ‹1숴š >¹°Jå§àVûö%øS¸Ib,rÐ ô Š ð$ÁÜO9ÜÃ ß¾à‚ êöìÕATC«ªu´æ ¾ÃŸ~ú±þVÓ¯ïɦ*\Im…èí"N×ëwmu­þY# ‰ü‰b¯SGÄVû|1^ÕE2ð–D8qk"R„facÿ/îåxŠ˜¹²¥ ´=÷ü§¢/3 µïv{ªÁ¡!ñ ÷â¿/Þ{÷î$3ü³á¦ÿÉýñ µ”¤åú…øAžzá¥|dü¶†Yb'm$ïI¶nXÁp“ 2QBcþcct¯’z.Ë™09÷Ø_eoæÞœ•+W6¤_Bæþ€¨p!ýÏ("R!üðÕsõxèAÓéš«M8–ÜEåt=µˆcÒQ'b¹=ûÅ—ÐùÂ1Zħÿ믙¶C.´Á‚¤ÓR Ô³ËílÖ+¯š]ùܬ`8mšYŽ:C–ó±X!ç-J|¾b7¥Å‹q¯Ñ²…©ÿ¸¤"ÉË–™D§R/*ع,+|âlÿjêö¹%Q)1ÐWùº+¿@­nÝðùO5éâr%µ*j_UŸ¢ü›±‰È¤-©/Âr½tJÜ×#Ô€Ö¦mO6¿ùŽu¦• ¹Ñ½—æû ›Ñ„e¶ c âjaÜ‘,Þ] ¸bª‘ÜfEˆxeåp¸è8ø¼ÁqÈþƒÖ—‡l·´œóuù×_±ë±Ô¸âêƒáî-8u\•]ß'ÇΠo655 ÕpUAÆI𜹳­ 7q{MhÕ0ëÙ…8˜$C9 .õ%B`¶Ú*P‘€ö¼ÛŽë~\ØgœÃ;3qµêØB#¾ùækŒ÷ºY£éù…ìåêl% °ÒŽKäo!wÒhÖiÂÈÒ?NH E–´Öïtê´)蜺òQB4p/© Ry}*dÆôš8S(2&ñœ”Ñà ”Z¾*êœ8à¶W\nz‚ü1¯¬’ðL}òI³‡ØæE-|¾ Á‰½Mnf."-Àj×Mìq×¢ê¡#ŠÒ·Õ@¢ÃZms½+<Ô;b‡˜ƒrý¬…Ê¢.¡ÆsÏÒâK/…pdd¸„³kÉûÜJ=àÛ ‡{«Ç;•}@ê^óeÙ²¥&…FÙ´"X„¼%Ò—Ážö5 ì>Ü.:ºÈÎ4;rw1°¢ ¥Þt@’]—´+É^×P‰:¬Ä1ÿr2;;« ¦öîܹ3‘ë&;×zØ á¿B¹¢ÙîÂø¸{<ü°iùe..‡¿, ÿVÿö»YŒ±¥¿ o0â»:p‚ÝHEÜáškL"ùç8%]oÓ]¼ÇÅ?(cò£Yý´¯V”¸§+)“m¶=_ä9DkpÜq–ËÎLÞmÒ‹k‹e°Ñsú¶íøûÇÛöý}Ǿ†BßžâÔï×ׄó~Sá\³0Ò*ŒôØ&m)ÈÓÎ3ÌÖÄ ’b¤ !*D_=Þ³ Q%"ÑØÇXïØ±WåEfÑâ¥f’ޤÝÂGLI]r=xš‡bj6mjšô?ÙTC5¶¤¹WÁ™üQâ²cRO\ÚpºÿÁgŸ}Ví†TiPGv‰@.ñ’„}×_}IfÄÞ6*«tü®Óváfå§Ï_kiã ÿ\ÆNçÄü‰’äWçµ–ËE<õíß“þ6]a脤NPÄW »ƒöíÛ›½rå*&ͰV÷,ëP‘€xqW\yYÂEÕ¯SŸËÜ!øi„9–0œÕªGÛ*ƒ!î`–ÈEüîoÓ5—8âÚ±\¥ µDfîd”Nó ¿QÓãøîv2ÙHU6d%YÝÒRƒ¶lIÌZµjU}æ~ ·ýxö¿ ü‹â›õ¥B}rÈŸôôÓèú{Ùûq¨ÌA&ˆ{Ò£“Õl»×¾iqŠnÞÜíµG}Ñý?ÿ1­/¸ÀfëSv´ÕˆøÒ½Äõ«{ãÙy‹‚×›ñ„ú´éïIfþ[x\æ¾cOMTÅèî$ì-ª³¨–yÈ}‰ÄeP½e “ ÉqÅâWdà‰”÷à)°½»¾ Eo”M„¯1óë>ôÕeÐÖö­Iƒ`Ù(Ûç~5âV‰¾f0¶Ž}ÀZk«ÈzzÏ%î«ÛmJkWϬ°È©K–ÁPdZ‘·Þ˜ûXD`¤Yo =“'`LEÔîÐO˜abö™]ÄÙ("ˆóíLEI+âµE­~M—.]ŽïÞ£{µõEE:.Ì"ÍùsÔ(ŒöêâÓ_ËÅÀ1FBäv]`w,ª IÑŽ»ˆƒ ËÐ9j_]_I€¤{ :U[‚„?tn˜bbkšñã&êÙea9Ræ¡PdRæŸÀ¿ê9[âÇ\3¦&y^$A‚`‘ÚŒ³,ýEá‰{Ïä#R¶.ùøgg»2ý)¾´“iÊ…Ýu¹ƒøY'rû uTD…3itB“C±"à^W@í(\«TVE&*U}SЧ/´ Çå×â¤wmíµñÄ#¾z=Ÿíê¤ð%_cö yñ2Z<‡þPcÔ‡ó—ážU¡0~zV…Wõ»W¬4û1 4(MñlRû[‘ŽW_m ®}ÿÒlOÏ$ÉŒRùöxéÓê–›Œ’.Š3r]ñîûfúw™Mu½»ø–ìIÔW!êv7Ü`ŽÿïK¦Þ€þ|||æ¹ÄL‘[§¯;‰Õ?ýÖÛÍÂ×^7©$²’…ôµÈ})Âúê¸ ߆7¨3p€Íøèí¼s\m)Ýrûî³QAÅáN¦þGïfôRý$¼«Â«U‹ ’è_븈L%Ú´uöÜ9Ö Pë,6V”ÌC$³’‘d_¯¶úÇÖ"XصÎM•*ÁlaååÕ€ ¼÷gÁìAH5 -ì"‡rE~Ãåâ© v² ‡.ïÛ¯OTçc‰ªžBw£dKABró“ûˆlD –wmyÁ¤…´‹½Õ%ƒÐõ¢eÉo×þh¢pØþIB|Ê4ѯ܅Hg\Té>Q&"ÿ„„›H™«taòžÝñÐìÙsR©<šâÎ7æ÷JŠOÇà¬÷SO˜¶¿„Óòy·âŸÔ¢*ä<õɧlªXo-I…Ñëá‡L$‹¼GdËÇ*BoœŠ>æ¶—^êéz»I‹èXNF»Uß}çóÊšX¯Ï=,…jj|¶sÄN2¯e GXŽ0‡çNQxf©‘×¢‚ޅ岑œ$-^b]ñ"x¿Åi«À½é«ò ÈŽA†nH”2PAK-Ûøú(b 5h )ãöa15M(oÒÌÙÓf[Df…÷UûÔSLüàs‹4Bü2 Å@T¡µ‹@TirHÀË5PJCï(JçÿºuëÓªuËÚ±¬0cZUæÍÿÇ2qJ‹,)®Y»&Ó3—T•.óQÓØNåÜ­]©iÀ&â‡5u»lÔ¾jˆ¡ÓuU ®Ö0æ«.‚¥ >Ž š;{núîÝ»E¼Ca‘/ÛPQ!Ð3O=í”ȆFTÅýOú½Ôé3§C-FÛÙ d/àP" Ëú÷ëœï[äïšš® âJ,£>NJ& HoßÞ ³c·.¨„ü­$€45=`—™9cæÚšÈõ«rÛØÿ[ŠŒl|B- üN|ü1>ÚYT}Þ­¤'sâöïügžÏ†: òo6h×ÅGÈxËÌY6s§†¶·Í%—Z+rOç‹sL>ïï½×¦áõv½¤µ<Ú@IDATÝï¿׾{»¶Ìg‚KÊ×­+öÄ ø‰Í/ ŽÚÕ³=έoíÆ7éÛ·Ûà<¾¤8EhÝriÖ>·ÁpD³)ʼnè(!@_•µoÇôéfÛÌ™ØàÙg,W:>ø¢të°Õ­–ÐÄ攬VŒ©Z»–©Ža_£‹.4 OTì@_R T‡ÛÝ‚„\0‹©«  ZË/8©Ï‰1øàWQ”V­Áò°’jõ‡~´~$q/&d­©'¤/J7Ï P´†Û5]ÆÙö‡%²xÿ2êvË%t]º-fNÄBƒõ-㘎rb YK/•GÄ8J"¥LƒË:¢Lw1 ÃÄŸND5¨¢´¼.JYúœšÑ59‹¡”¯ Q…Àì‡` `ƒDè¸~;ç1*±Qýôä®É%Q“ÄG9H!åG*Ñ¿ Ö„ýIB$ ÒeíÏʰ¹“Jwæ:bã`û©®R>¡t§x]×ü‚óM×Ûn³Ij$ +Ë ä¸vô³/PŽ÷V¤úÕ‡æ t.’Ht^Sá…}ÖñzqÁŠ)¿ð“O­EuÁ³Äl¥\³¯¾¬]ö÷œçˆÅ¼.[qõ[ñÉ'&)Nq‘«ÉFü³·NœhÈ:ÙxЩ&4‰†¬ ƒ…?ÀuH;¼î—_Íz4)~qú*yúšµæŸ‡5y§-† ±R‰‚q)+oPýP½y3+w¡;Ñ+BjB[ŃægŸ‰ëpŒ™üø–øó³ᕇ)3)cü¼Æßjµñ "[u8¸ÒZ­ƒBôbÜÖ­_gÈÜgö²¯÷ä:GÓÔavmÙÑú­qÑø‘Û}úÇoå{‘DX c®ñtµ¡ûZ•îêU¦+ÉD$¨½L…ß‚¤ e* `%B⮞ƒžî¼Ï,Tôº¢- ¤î^D ˆ 8Q£ô².b &Œ£3 I)‘‘föuoÙ„@@hRYÐÜã¿&* ~Êð)J?Šw ~ûk¯1Ƕ*‹^YGþz¥ìñì3>ÃåjÑípÕPMÏ£è߯2T¢Y ®  wº}þ³œP¢¾@H¬ÃUW¹¬­µ¨E w§ÄQ -¼‘ø«>ýÌÅe»æn‘žV‹hvòìÞ3›Gýiš_~©©G†G©´—ŽYa…Ûð}(ÖÁ*ÜäÇüaN»Åé+ßû®)SÍôI“MüyƒM³Áÿ²F–(a_Kòœù¯Õú"€ d#x°e¥\nHé¾Ï=kÆÞ5Ìd"ó¤ÿz“Ò“âÙUÇφòU‹„Y‚ײ륵¥r!y"Š¢‚•m•©\]¬ù~:ZŒµ.(ÒŸƒ4nšsåÛÿìËCKß¼ä~ö޹÷¥6o€ðˆ½ž“:]‚Óݼç@YÜ:ÔJYì[ û”®ÆH¾c ;¬Ÿ7ëÒ÷àxš%Dä•öU@ì:–f§™4ÕqÎåî§Àa¸²JeØŒQyB“E³•víÊOM4} *"d¤Bª`a+YžC¹žâh«ËwÚÈvÖ0N¸ŒƒbÒÏÿàC“¶a£ÏžÖÇs¡‰ü÷ýf„b\é Ò”8“½ßÌyý Ÿ6 º¤ -¬Åäh!½ÐѦÏz›o˜&Z*‰Å¼æt¬Ø<ý¬™ùÀƒf¹E¸iÕhÑÂt¾ï^s܋ϛšÇvÎCÅy?"Z6`2ùß7™Ÿi Z%‚:ÚAëVâæ÷{éE#ï–"€ìž¤h °d"lß¿Ÿn±’Ò·Üß6™U…Z·ÆÚBȨ۵ÍTÜ›ýO"{‡Ë·×Ó¦¤ÃúÖÅL)±›³¯ß"*eT¸Ÿ­~ËÐÛz] ÎÍ9 É+Þ³jד†ûÔ¨yiç蟽®ß® îv9égcÜçB¿Šb'Â~&€(B½D¥ôµ[G Ç,çϾ¼l]ÎKMÅ„HÏH·çC²ä*RÕJ ,ÖgêkáÐD%ªëÜAkòîdæ..x„W“^‰Ñ{¢ïoyî¹.1d9@6Òׯ3Æ,xûm÷G/°/îOÖóŠþV˜ˆÕ"" p|A*!}qAÿÖÿ9Îl‘1”¨Ž»bk¡3¯|T-÷§ìx2¦‘$Øiã ¦Aß¾f%!´wL˜èz6Q»EulvÏžcfá~V÷”¦ª-éŸ-”àýižhÄF¡…7Ÿ`õ—_™ Â~{u‹óÑw}Ëû‰·üÍ7ͦѣM+ÂLK*r´ƒÆ±^׮طÜg&ýçÞ¢¹W26Ã)S4Féb–$IâÎÿeïÃ…‘ó&ä/‡i;ù£©5ÞAâBäûáâC1·q˜c޾_j1zyRZ®µÞ½ÝÒž¤ r tª_®Îá y;β¸už ,ö-}ZHc9³gÍÊrÑù&#=3¯íp3{vï±>Ÿñë?H¸öõÛ™Kb#ùYÕçҔðˆŸ:!L®ªlm!¦ž>ž4¤ qd‘rGZHe‹°aÃEÒ\>‰ÒŽâ„HðÓ⬳ E8B3,2ûÅ0ò MÐ×#£ÆËðØÄý:IÄ¡àc-.(iŠúîK"¡9ÓáŠ+Lutþö½¸ý)K×9σõ}Lm8Ó,ÿ)ÏÊU.žÏ®¾Eè1õsX¼·üú›Ù>ño“pñê©&,ö|g"0H×­¤HkGüdÖc0¶Ÿ[ﯨ o1cõj“ºiSQ/-·õÅ7Å0wňf+*?AÌÌ=”!”@„ ÞÏÙ±cÇþì¬,¸©ƒ$€|ô-ò‡8‘·¦Ÿ¶v$-p¹rñ;FØâè)ŠÊªµ_…Ê®¤]VŠàþ|jG^Eû þSÃJC\÷§3&,<Ô¬Z½Æ¥ƒ)Y†W÷[—ê~E!2ÅÄ•+V7HOÏ8€ˆu ÄòA¦Zf'αb~Mû’e)j_¶¿K"àNX œ¡>3ËJ,òç‘”@@¶&ûºGÇ’È5€ÛÊ!/S"(‘qj«(’Ý”‹©ïGK2Ùµ< ,î[^ /‹Ó@ «ÿifúWúù¡*Öæí‡Å ÂÿgËKÛ›¿±Üß²Úç‹ör¶ðÃŒ0ËQh¨â8¢è%@¼8±ð–®znIÖëÝËÄÓ‘»ãÌJÞ·BÛ¹ZÔÇå›QÀ•ï¼g6-²åÐ+M=Üü ²¤ó^sOöm¯¿ÉE³ê›oÍV"é IB uÜä´Ó\×–£ï±¨Ïé^_R“PäN§¾Ä$ñ:OÕ—q0{ýº ûп‡ km(9¬ü¥êu.Ý¿ÎiŽªX1¿?¢~Ù7èz »VkÍ—N;®¤bÌœ¹¦5\Å…‚í5Šúîp`qc"£"Ìô©Ó…k´À­tΕå­käÊr×·¦4Õ©÷‰'„E’ŠWAx„ CÃBÍ"âºË€D”áÁ¸ ‘394lA\o'LîVb$ÙH´äPYÑTî1M:Ù¬Y³†¸ÔÇÙIêyOîâûr¾þòÛ$‘ò¹ë.eûoE"$í8+"2"¨Ûq]£öfìµ®ÊÚ·‰À!¤Å”1Ÿ£'%¨I`·ìK´DÀ&G²Eú²2•HÅR–LŒDÇt~×É0å$t…¢$Ø•´Ã€ü÷Í›÷ÏŽER¤#(Zðz>ôÐQa`&î¡!™È R·o3©„q•8µ×»rxzï²ø—~À8{|…L«Áƒ=*ô˜\ˆf½ô?³`C¾ )ê˜v—]vÈ{õU¿Bœã}Tå=ǽ±vÆæ@çnß“Ûü÷k,rë+¸,ùÓvì°ÁyÂjÖ(×~È=é§¾-Šõ  '¢/ âþrMî]:›6C¯²®fžÎUÇô+åOa—‹ñ\ó3ÅÚcãz÷KêÃukݦUT\8‚ jét‚ýLŸ6Ý&ëÉ‹dh—‡\ᵂb AìV-€4@ÀÞ¬½f3ˆÝ2y¬ýÖøãv]×5"Øîa~l Þ¢OJúý«¿ò/¤Œ;A€/)Ór»T¦7E —0†²cÄ?›sÏ=;6++;¸FNMÄ:Áørv5[ þe!ªÀ.ñ¿KߣI¤€+V¬È“ˆ²Tv(e„j‰o4a)MU&J6׊ • @*I öñ±lfñ8XÜn‹Ÿ&Í®»Ìœ9;…I%à $~ÀŠb!n};Z­}Àø &áÒ‹Mü@ìjźnZ‚ñ×üQ´¿„³Ï"õðqfíÏ¿˜ è¹eìÇGëöP¹»Ü«ÕWbSà &V°ÂQt„ç߭Â>6«øÁç<׺(dé$HYäå|QAÿïÙ³æd¶iÓ:*¦flÞÚÚ’ù¦ lZ³µv a[±?ýÊcÐØc—’MŸ=&))É2uòB…«A¿¯kõþ5÷ì³qNRÇm0.DZËP ë"øç¿*š«`¤kSöÿV$ €ÞF¥gl­ZÚµk¹Ý|zªÃ­(ìczZ:\þ+.rÄBÊ,µqãFÅë·B’M‚ô`©6à 4¬$À™hLžÌô +1˜è8 wpqÿS÷MŸ>#‰‰&â¤7¥Àj#dÔùÖ[1·òùñ¹·]^öõl5›&˜F'övE+ÓWÐx/A Ã1O ãí‡^A|{ׇ꩎§cÒOzð!›'ÝÓyçX{<š¢b¨DþΈxÞj­NVÀ†pLa$J^´Øì‡Øv'ˆ=_éá(méýìš5Û$Nž„[Z W”¾\1°‡+ü>¤?D’‹.]Lm¼² SA~ù¡ÁYgZcB!‡£ômf YþãfÊ#˜…HÂ4÷sÑ¢E–‘ò2.µ9þ¥hzÁÆaהּ´ômÛµ‰$`ÖbÖá(ÒÿÎ z¡¶zÝÎþãý:[­ï .0a>VÐGk¼Ò+ÄïZÔò2¨‰]’åúYg47d7°|ȸœvÆé¬ÿ¡Hx÷aà*""óý÷>”×bÊ«”rõyéÜ9ó‚ 89 J•e¸Eè 44kÖ®±.‚¢E-J|¿ñ}mt…–›¡è˜M4M:žHlT$¯ÍIEŽŽ_矾­ -iÿÉðoõšÕ9Ÿ ÿb'RÉOD) •ÚõŽ;l"œ'’ö#-"ò·ÎG¼ôë¯ ÍëòÂ(0´Ùбåù 2f[óÇ(³äÓO}"vE+T¼ÿªQÅþÞ£BÖã]È…5¦MkSB ˆÅsÏÒeÖ¿º¸„@vJªÙ†·€ì$ ˜}/ÈÚ ¾Ã˜LÖ…0ÂW8àŽØâ„Ë3á(}‹{yÞ¥_cÆÝq'ŸÆâ)áåûr{þÓO?ݼ‚DO ’ªˆá¸tãB”%…ÖÎþ2æjÙªy¨ò(úªVØz¤Š&»ªÙ±}‡µÐ3 [ªC[ÊòËÍüóm8¹îIb £l“MRK"¬œΚž‚úWÈ¿?Ñ>ÇÇÛ{%%'ÁFšÏ>ûbÇ—Àc<b®òu¦tPAìûz÷îU]/?JQ¢û&„Òõ'ä¯À>™L‰ù…ð…øEèœ; U€ÄCš8" dX²—(RŠ­ë/ATC(Mf‹-ò1MܺÙüðýˆ=+V¬Tò€Ç)M)²’-QL4EÆ+Ö"Y µ£ë€ Ζ}÷½ÙÇ‚åx-±Pê`!“lbãI;ìµM’%t·»ïÆe±‹O"Áß{V¨z¼©nä9׫§E®édÞãb`‹ÇQÛüÄ™H‡XWl‚°5‹ÝVÞ» ?BÕH¥[—àT´›‚½Š"6 ßÀÑróÛH,‡±wßcÖýú«WÉZþg?‰ô㯒!S!xµ~B¨h/ k½)”@¨–ÓΉ[«7kž[ [¼D˜BrÏ–jv<ª"­ÙÖ½ÛÎ-!cm½æÎ˺i×u­íN\!•j¨„„$c]OEU° ÝKØz÷²÷Q´À,ì ¤}ðÞGÉôGÜÿc”rЋYB9fãÆMñQQQÙíÚ·Ò‹ 0J-ÙŠ‰#1¹¶‘LMjM‰"tÞ‘ˆ( Â@È_‘å]p饗X齈?ª·s×3zô_é£ÿ³‹kd(ò(EÜ?³ª ( ‰"ÌUdžbÖâ•&îÌ ´8ÿ<òÔñröÐÃÒå/üèc³áÏ?=‘ï—@gB0Ëx±Š9|/aHÍ”z¸F§ŽÖÕr¼Xó\‹;í¥,[n63røY­QCWVÌbv/ï2Ú•äBŸz¨ñ”!±°øy×–“´Šg0÷­·ÍìçŸ7û@|þ¸ᷠðÕ†ñH"*À- Nþ¦ÖsÀ÷–ÿ Ï¿ÅÐ/e]>wÓÆ-†u<=|+Õ;‘Ô :ÓÉJ#ÄÙ+`›kn0»±ò—ŸÖkÎÚ®u^ÈßY×­›7kv1’aš53ƒNdmÄ„ v'ï’aöC÷?²ɇ˜Ëë)Û¨iÓ„p˜:›kEk®ì¶d¬'uÁÖlp6ÝIqä¾­uÜ‘êê¸#Ùu–—1„BWlBh¯‘”wŒ\Hhð÷Þù`ëÊ«²©úå'J¹‚ŠJìã-§œ=kæì Úqµ4IˆØ‡Q`Xh¸}É M¬Þ~õê5y€¸|O€…”<–´¼gb Ô#¢P(IM \MvìÚnÆþ5.½¿ÿ_BÙ ó@Êév/߹ܴ@Œ]Xâ›|—UˆŸZŒWÿñ‡Iåãö ûöõË€Raš§?û¼Ù9¾·¦ìñHcÚ(ä/ `%hô]±ÈÖlÛÖ44Ðä‡`°ôÐÜöE¹ï&›>}û6’õ9ê8ö¢ …·º’^í1Næ³ðíwLúm!µä믿n† fjæË  õQ’ÓQÞ3~ʇð]JŽ¿÷+¤Þ$Î÷X¿~C-’÷Ti’Ð8LÜ¿¹`퇺I†ØS§Mµ¢~e€eÊÙuÞ±Ó5c'BF¿cð2rÑEæXÒ¸KB`ÃÝ;1,6Ã?ù,qì_ã‰9lqÉ}…ô³Lž®È2Ì5¼‘Ë(¾ýæ»rÉËtÚÀ8;T‰®^“—bÂ#Â-W/ÃM !zM w"@T¤&ÙàóþeŽ9æ˜/Y*M›7øsÔèä_~þ5™6dse©[e…*öZÈÒ6o$;blÍÚJÈlˆ£lÆ×¤#°F@¼;o Ÿÿ-S§™u¾ §õùg!¨„À€2Ù…V6nú7!€šeœÙ'oç} .IÜš“¾Wjon¢‚²ß¢¾…ì½™f ùfÿ÷¿>ƒ\åq×÷Þ{/ªÍK‘š6Í:ï7)qóö=ì4ä˜\a¨æ¥—½æì³Q#Gw ñÏþ!C.ˆ©_¿UëŠiStÀ>¦ó1f £a/Á` Gš«5] ß*Zçë :ìC6ɦÍ\Ϫ qÉ{„_áÛo½›8éïÉBþ3(7ëÚò™Ðû’=ÀÊûˆå[ü=qÒ¦›n¹1¶e«–QÒ%ÉTÁ™$šL¢À™,ö<õ]SˆõŠ] %RÌÂ… ÷~þùWIXˆ Sm¤\CYAq‡•üH£D¹tö׌úÓÔ=¶«uaqŽUn5¤íÄ*פnÜþðŽüum6îš³^~Åcˆb÷¶Û^r‰©Ù¼™µ v?^¹ØûfuÔ6Ç?ý”Ù†ûÙâW_'¿ÀJÿÕ`|§uúœhêbÅ_‰ü¾­[IÄa˜ùÒKf³“¸éài¯{2–»îºëÌU¤ºnO4O­w¾ ÖÜ„ûº¾ç$¾¸Šõùýñã&tÂ¥oßUW_Y«UËVxuVg½vìbÔºÀÉË}o8©¬5bì,‘KÔ;k½Œ¿EðPÉvGq[öîË0[·mÍ|þ™·¾]bÿ©”)ZÛË%èeTtÐäù†ƒ^¨Ý¸±ãÓw''ï IMM Ù´qsž•¿&ŒMG\¤ã­±‹«Í$Á/”‹/Êúá‡IŸ|<|¶2‘~è:ÊJ~^Œ â&>ÿ ýN^·žìçÕ®€žž»ÐcPZYHH¶Î˜éµj8¾’'IºòçŸÍ rÆû’°ÄvìhºÝu—),ÿ€×ŽTž(òÈý* ©Kc|®Ã •´p‘_öUðép×öZ_ï´È*§h}’´lñgŸ› ¤ßCXr@×E¤ËáÇ[ä/÷:‰Á ƒõD}üøã½UÇ.}¹Ô ­¡Zc›íÚ•”!J6À ØØšxk‡)sŸ=Óv˜†EÄ¢²ò×1÷u½Æ×:V;®Iªa𗜃wç Ïýwgjjšžá+Êí”b…Eäº2•€ë5è…Ž£Œ¥´]»f]ÜÔ)Ó÷ÎûîÀµQ5‡ÚZšúœ‰¢ã*R ÄÔªÁ$IÚOÆÁT »póKZ½zl –Sn¢|HÑoO µ¥ŸÇ“|¼áµk™ºD,¬\ÐŽÞG=ô{2ôK'ÙÒtšÝ~›‹/.pØ9 ÁÒ›fáì D$‡k`¬ÕØøkîAx:Æ d³òÖÝ£ëxîKÆÁøÓOÃÂ?ÈÆº@ï??ˆhˆ‡Xn|æGî]åïÔü­ñØá4™`>+ˆ™¡ßþ@sÒ[¿ñÆæò\4öLj֭Q}ô‘Û‘CvÕb¼ âʧl±¿hábT¯cR䯔 ²ñ¤ p$:¦uÝáþeß}gæ¿þóFêêÂAÌÍ-·ÜbEþ÷þÆ›@±¼€Tí(뽜Ôa­£wPDý‡ ówézlD¯z†§¥¦F-Z¸a^¸uÔº.Õ®@Ï/I‡ÔŠ 0yòä¼ ¶³þ ñHy‹âß`R±¬C%û†@üUxÉuo¾ùæ–/_>#ð;9¿qï“Ûˆ 5Q¨g¯ÐDÑyI$Rš4iÒ:NŒ¦H/$¤/}Q@²5‰•.ðvQK¬Q{ÜŸå½Õ©èÇ¥X…1ßÌ'Ÿ²QæäÃ}Á¸±&c°C¤±“°¥\~…Ïä&JS<à­·L] ˆœwH;þ!nd?smãÄ¿Í|¸¨¤ ìsxºˆ„¨„Óc·Õ©!ì£` ,ÇÆ{Mœ>Ý,y ûÜ7…ðD¶¾å&Óœï¤Âêþ™?–ž2ÅÌñkþø âú_|ñE3hÐ küìïuùë}ÑqÁ^—±ÔoMñ?Ø@þíw,ÕÕ™QZå^Z“ü/1Šò§u]Èß!d' î_ë»­ù‹/Î! ÜûD;¼åµ×^“:÷¨J¯’…½êøñãOzì±Ç>ƒÛïO)r¹|D5ZtT41TÕãšýˆ½^ ÚÿQæR¼Ë“9éDYˆh¸œâñ½$-^ ÷WßÄ!ŠöW”çå^Gía¹Æ¬¥Ù9ç($i‡ç˜æ¸fæ¨ErâýÝm­Ï±hú Õ¿´v”>è&Ξm&?þ¸Yøî{Ñç{V}mÙǵËæ}É{¬ñ\˜\³ŽrB@ï¯:RxDý¡uêšä%KLd“Ʀí¿ÿíQÚSúoïÈßAa*­Eâ™ùÔÓ&ÝG€,÷ÞJü}ß}÷ÙP¾ÝI;®µ­$0nÜ8ó;iƒ½@"Ç_¦¸Xn/•xXz’Æ~Fù•²ŠR·I“&Mõ³¤Tëj-—[£ÆÃQ H@]å8vΜ9‘ #¦€¤½Gø6ç<*Ñ÷C€ük~ÿý÷WBµ>凄½QD?Šåp|š$ú(„ø¥ïh_“$À éÖh–(дü™/¼`âp7TþùJ" ÀÙzoÕpE:þîa¦ÜLæÎ]‡¸Š[\ýÇH³uÚtÏ ä EjÐú‚óm¶?…I-mX1â'3¿ìýHœŠ {Yø¼óŽYû×_¦ãС6IQU/gµ½òP_ïD_š(«~ïÞ¨K6UL·?Ö'|Љ1X&„£¿ ®_a| 7þ^ç«Þ&¢ ú©I-ä¯Òdß—5=Xk»¸­ë"Túnœ¢µžàpUðnè¾`Á‚YHH.9räo¶b9ÿp V^ƃ—[…ÒŒHVïüùçŸ/ÁõGcðÇ—t(h4QÜ9ÿR@þΟbÇ+…™MËÉ=J“¶OÎE•[Ï#P»C{S¿'î`¹„›ü :x ÑüøÌ=_”{t™¿æ½ù–ÙNp  š¥Js;5ÃT¢ù»÷)w¹©=„«×™#ÛÏýem_ 8úíÐÑ&–ÓMôoç3ÊOš‰x©ø‹ü…èbž ã6Jäã ¾’¾^1NóæÍóÕÌ2Nº¸(_µJùœÃÔ9†Ü÷‹Ûw‡pp@ݺuƒúõëC½HJ^à¸GI­{e}¿Ü?@q˜†egbXŒ__¸~ ¬]q¡%òWUèì;ÀÛ½p<€ `ç'y«S„ã;©+vóŠGŒ“±%Ñ$ý®!\ÏÑš´cT쪲˜‚}Àn"Íù»ñ›^83‹ ŽÑM¬-CLøs}au4·f>÷<†ˆVµHçw.\h¶ þh@"›P¬š+á(ÍÃ5¿ÿaþºí6³}&®°¾éÙ¼8ž°¶Ÿ’ír(’"Y¼Ö¢R{IQ½Àû÷-zóraŸˆXÿdòÀǹ¼ºD¹øÚ×±üE6xET!F@Ï^x¡Ñ_G/]ºTIÝÊ%T( ‹-ÞSjÍš5ëÖω΃¨½Dþš’×Ö½øóVeHxñþ´‘¯ÎÛü–¾Ê+lDç;‹8ܰ¯ÿG@‰\š :ÕÔÅhÎ_ÈÆ d:ù‘×^k–~ñ%ƒÒm‚¯÷Uoõ¯¿™e_|á«Ê!ç´0‰ëóv!¹˜ôÈ£&CÖJ8ŠF€9°D;ñ¾ûÍDRRû›¼GMÏ=÷œùUAß¾}AxÊ¡â|Š|\Wj§Ü¿§›¸ãí窂N>ùä©?çŠ+®èëéºòp¬ÂHxqZ5Û0ù_ÄeïVÂ<"ɉ̳u¸}wÎß9¦—î ä%A °ï^êÈU$ Ù\ЬW½’è»àò‚BÃðOïäBH>úˆN myÆ’ì©ÉÉ'›ÚØRìÆg9ý¹? •ÀÆñãÍöE M8ÆBrÅ ’ΰã®~$-[fSû#ö¯M~‰n÷Üm:Ýp½iwå•FQ õícöÅP™Ü¼‰¾Óx¾ýpŠõ¸^Fb•PŽGÄ¯Ü k°_7ìn³ëŸüz!¸s0ŠUÖ¾!xŒäuûÕˆ•´N꬯Þj‹•Š3Ù[…Ãt¼3ƒ°ùòII Ñ;€üûúÁ`PBBBRäK ”µlÙ²©’{G‡éáŠr"æ¢4Pê21Ãpã8å·ß~{ê´­^œ»|ûÝ‹ÄVÎoí;¿ÿüϺcÇŽèÐ2Aþ7sî£üçKø[ïFæçŸR¢¼µ%D’€%tûË/7µñÛµ³¯É[ûGóqÝ^­ÃpNbø¢$DÑµÍ 8ÓþŠ+L,Il„€}ŠùÇQ‘Ù¦b©½ú‡òŸ:ä·lz<úˆiÁŒ!jõïzóôfê“OšT/ÞÔמ}Æ´<ûlÂ[WJŒàròCH|'j«y Ø ¤<öÏþ‰'ž°ˆ_ÙIK$ íAøå¹sÅ»x©HO¦)#@§S±H}—ôéÓ'Γݗ*i¼e Û÷¢¸/*:æìK‚¼fÍš¸ ŽnÛ¶íÅ>úèárqtž§ØÛ£^À¢\ÊìvÜR^„š‹òB÷Äéç?¦ß*ùv]O  œiÓ¦­âüiŒþÅ~¾/”ÁŒ‚N ôZ °›<èkÈaŸ•žfSߊ;-€(¼6PO0vR ÔF"Ðd^µFM“H0!¿€kwMl5yÄ•E'=’ÖŸqBÞÂ}æ¼ø’OéA"Ûo¾aša¤e¥ ܳ°PIÑdà)&™Ø ×m[°Ð´¾ðÂJ)@Á)ÛDJµìÛïÌ$¢òÉØ_/þ{ï½gN;í4›°ÌßëŠ[Oœ?zñD'³rÄ›F×ýœö•U²._µZ·ÎªòwŠŠ 1ñÍÊo¾1úÆý¸Zó.¡÷ß¿ÁÆ©Ttýùû¡uõƒ>0ãQ‘yÙHÝEñOßæ¥‘V?>&uqcŒ¸Ûƒ°U=¤ùüß]à ÷­$, 5 w9ãžF"¸ée]%pT ÿ0¢÷ €ë1}߸¸8¾%r9»!ék+×ç·'âÀ™èzä"“í=»›âßé4P¼­0ø(J;J›ÂšAÐÆqãÍ£(ú]5’©(†|qôÔ…Ýëh<¯1krr?Sç¸nf'’•½;vøõ˜{wî4P%ˆÓ…sWÈf«sÏϵÃYìZ²îÿEŸï¤Ó7š6D´ó7þ€¤T ¼›”m O¶c§i3äŸÄ‰§ë*Þмه»ïü>´.é¾ýêéÜå¨?!îj%èsHÃ…üHÄñ†n0 So5¥`Ò¶@Þúá~\ÞV#õ»iÀ)Nð‘yjq¹;ˆß!œãž¶b2ñ0¦ØC{Ùe—ý1zôèÃ'ÜŸËïý£Ž`!ŒY½zõcÆŒù/¬‰";iqòW¢wŠÃá;ÈßÙº×1]·jÕªD\«ù}6£û£ß#˜Šr3Pà IÚûÓd*ù®×b훺m«%"ãâü¹¬²# ñŸx‹³Ï2Õ¤lA´©ä3þ@qû×iváI'$"bTÞ¥Òã/ÄK ½A­c5Ýï»·ÈâzI >–ó­Ç¦÷B¶<ØJ†’èíÞW&o5ÊÉq¼\üšÏ˜1ã¿'N|qL¬ãã*À[Ñ㹟s~;ÒYùÏž=;ÖŸ8×2CuŽˆ´¾…ò—¿÷÷¸Ýá¨k¯3óß{Ÿˆx;‹ŒTü½×ÑXO¢üÖ„L€7Þà÷#ÊÐN‹÷Ÿ×\kFÝøo³íŸƒžOÒél ο/h{ñE&’xäÅðš1^ßqFZé„•PöF@âþ½ÉÉf6jŸ1×_oÒÖù§Y”Øzذaf**(éü…€7 F·¶ZG½@ÇÅÀ”eXDçŽ'ˆÑ—3gÎÌ’ª×/äß׃x:&¼áWJa¢¶ÂXðï+¯¼òjŽçIÊÊ@×kĈ_’ÈçJB6†È‚S/B/Ľ8/G[O/Queͪ +$ ™P†ÿ¡î`Ê‘v_ÙN.¦ÜOñ›¢ÜKD¸9/½dFß|«Y…ß¹"§É¸¨ ͓ȺuLW8²³~øÞ40 ð‹rkä ZJœ4É$¯Y›7@é‡ÈÉTEbÕ¤ÏPZvˆ0¼5OFAâLù8ïõÂÊ¥:뉟ÿÓ‹Ì·߱ë–?7k=Ç7Ø<ûì³&!!ÁŸKJ¥Î¯¿þj@š¾Úþ‡“K|U(#çD¨\FP·›‰›†.Á_¶Åꟃ;œ}gëwGþÎ11¡}ûö '³âû—\rɧ?ýôS„®++Pî±] ‘ÿ%?ÿüó[ˆmÚ`ÌaõýÎ p¶z9ç»—üú~¹J‡…NÈZùc@¸:gò²¾++/Œ~(P¼Üi”m#’Ҋª_8ÈB|œénRd\…Ø0(Ð;å^x£¨FÆUM±¶¯Eü€­èúýqT¶¾Þ>êco‘—}ù¥×Qk?t¨‰ïs¯¤xÆ›™aYòép¯ï´9î„5Š˜ßÝkg+O”l˜©„¥–k߬gžõk>é†òãÇÀÙ¼þú놬v¥‘“Äïçbí5wß}·‘ €§u¥<Î#ÌOüγõAÂR irJI[ÜÕŽÈßQ è·Š£>PcÚ×yÔA¨:Ž5êìž={Ž'vÌçfGr[n% v‰üë"úzè—_~yJ«¬0…ðJL[÷âÎVïì ù+À¦öåådS$²êJ™®ze–Ò§)"PÆPüÆë%ž&ªÝ Ñ’5VJ=?Acâ‰æœo¾6Ç?ô`¡©™{?þ˜õßWóâË÷ÉHÊÁUGi‡™·Å›” ë}^ïUH›ÿ†´%±´ H«T%Lj~s¬J>WÍu£G›?P-ùøŸïÌýŽ'2÷~ v„î‘Ðõ»÷E ”ì ‰ý?‹kƺ_WNö¥·ëú÷;l¿²·!¹Žpð…¶÷ßîûùqêB8èÔSOíD½™C‡•DùˆC¹”0€"\Zýõׯ|a(ºÔµ.ÉŠ³Håz!âþ­ö5å ŽqÙ¸qã &샚}‚öÿMÉ8âoÈw„)ÖRä’¸œ"¯8J¡ £¶$íX7a¢ELѤR вºÐ‹++Ø u:v4‘ìMK÷è6Øè”S̱ظ[òg`ˆ·òû<Ž ænû«¯*ºØcee=¾àãÍN9àÛ^r1)¥ëy¸ÚÅ­1¥lÙb¶eNj-!§—|õ5 ‘Ø IºRÀT p y:  ùïB 4 Póß|Ód]Ò÷)Qÿ‹íHw}$týùû‰½•%Dð¸ÊÊù­õéŠOý€S¹ ne½ÿÁã’ôÓPÊ!ä®q—ä—8R=¾iá"p‚á" Î9Ÿöjc89úÝwß-&Åo›-ÑŸrGÒ3˜UñÁïC:Æ—AâíÐ÷+W³}!lgð@ƒ®â {!|éù5qeÀ"ñ¶9Lè \w%#:¡D£zä.nÀ­E¸ÈbÍ/BÀéjÜqÇ™ŽW µ~ç ŽSl.Ôi°‚lµ +ÖþZ¢³Í{÷]“ŠHT ãÿúãwëMà>ÛæÎ3\v™û¡ƒûÌßsùÙÔhÚôà1?÷4÷Ó·š_i;±²'At¬ö¥ú9´HAož:ͬøñG³ÄïN´R—a(¶À8²%Á“j$$Øgu¹üu+»F@óÁåþò‹™ýò+Fé›ý¸F+ò?Žo´, ~õ;X×c¬ø…ï<c©ªh¦{tM9‡žôÿS"6Cí¢ÔÀ6‘’TŽz@[îľK‡Ð7âà"áðؼþ]Žj`ý‘Ÿr%`à ½{†/ï K^E„3ÈÚ ÜÜt‡û× Ð¾týpüfYõ$òÇ]Cñ5åâ·Pm”SPVªñ=KŠ0I¥PHi¬%³X “Dd8;Ž…^XÑ+ðQ‹ó®Ý¾ªÌnT*©ëÖ›N7ßlšŸqzD*Ýþ’áèè½@K,¹#Šá QýòG˜ux,xƒº=º›¶Ä‚çÅæU©g™–›Nv.†¢É¸/Füí‡à‘ã I2¸^D€ˆ‹Jð<š;-6þs¯YŠ è~§? µí%Þ‰ø4kÖìˆêúó÷W†b‡àƒðÓCÞL‘ªòh€<Ä—àŒ)))ÍÀ?Udà'æSïÉÑÿ;[w\¤‡wðÃê·l ˆ=Є6/$„ð4‚ ‡{ Ê À€EËÿÚï¾ûîÕøøøòïwÛÙ:ƒî ¢;ÿÀ‹û'Y»v­|ûŒ;vß–-[žåšk)rµ;@9?Sd}ÛŒÒâ$@hõ¨‘F.cÕ 1žkWáן’õÁgN¶:÷\S ¾åYgYÎ8ÿˆ\úõ×DuSh‡‚CXâÚˆx‹jsDǤ4¾ µz%Ñ»æåbJÄzû÷+‡e,*HjˆûÙFâ$Ä´lej Fò–”¨¨mõ!´äq#вö¥²æø ƒW“uígY–€õÒŠþµ†ú€Ï8÷&åhJ>!]Çx‡eb x"êü bk¹~i+È\äl…ŸD@Ã!FôrÞó$Ò^)ØFüç +à†ÙFúÞˆ¨ôRŸ“N éŽ(L"˜p¸Žt‰_׬5ëÖ¯³®Áw—8—¿|ú7Ãé¢Ï1ÄlV,ÿ휿¾N dKÚÖÙgŸr>Â#qðŠS]#'çÀ¨ï¾ù~¤—¶eÑ—âŽèe¿°•²ˆråvJŠßݪ•éÒHÀõMÑí*w?†Ê^†‚Þ¸h!ÝÿýŸYD¨VOP«sgsÚï›`"Šù r7Tb¡•ß~ëõõ霟25!N´éÙŠ Ș›nö[íµqNT…P<ñé§LÓAƒŒUtÐxo‡¨šþìsf‡ OùÇIºþã?Þ´lÙÒÀèØ,~±5)KD€¤2Bô›87€²‚r,EªÉjÄMO§HÇ^&L?¸E‹ï‡„Tcž¦†V ]·ü ûã©<‰íÓ™»u¶7ûŸa” 'T!úŸU ¸«‚À¹ÆÁE’@×`='ØXu¶YØc‘[Æ ÿtøþ‰O|ÂêçšÒÞ–y€Å*èÇ<àû+¯¸"²7±Ñµx…ð¡„B=i»7s¯Ù¾m»™7žïë¼9§HÿØÆ0°âúeµš 0‰Á½œ¢ÉX&àÂ!ƒ/ai¾ŠÎô§xz7ƒ¾ýúûQ¹•‡‚êJ¡\#÷˜·tp"„UúR¢)~CÒÎ*Û`}/‰Œ½!7¿¬à·’-mäešzž¡Ë°»LÇ«¯ö|2ßQ!š…þÍ~îy;ßóÎûwò+/Ûßú>’!‚ÿºë.³g™lGgàªÈsD}–£™÷ê«FÄ™? w"¤ßÐñfÒuB:væ™gš„„»öùÓ^iÕ!¾½%Jäþç¦r® %ÆGÚAù8·ˆQ17ÝrãÀ;x”Æ Jö5¬Ý™Ö7º”zuëÏÚþ9ªþɘù7¸j¸t .Í~ŠÿÉ'Á˜²5ôѺ :j½Wà¶±R¾†ªHv ô¥¾Û›A.—­ÛÌo¾±ÿãO?~)ÃÓ¥ÓåC[-ó*ôLÕ|ðÁÏÏ=çœF§ ¤‘´ª¶ÆUÈ–Å$ ©b"Â"̶.ãgÀuŽÁ”Á…Y²d‰¬ü³·¼È0ÈØ¯L§€øÏnסÝÈ  *× j`‘¿>þ|Ðyñ¢%ïsìŠVóã)þ°ŠaÔkOiMYGYJ©Oñëý§¬]gÖüö›IOÚe¢62áÅÐQs¯JȨºuÍ6ÒÔõë=މ’ E᫯ä>P´ë8 ËRÄË3žzÊcç ¤ =yØT'/„¾‹ý¨w¦<ú¨ÙNò(AjG´éëšÄÙsLÂ)LUÄ¢|¨¾ª]çrŸ5qö,3é‘GÍj‰ ‰á"Í1Ä—…¹Þ‘zϹËféHûüË î)æArœîyÛÆsBRÉÂ@†#½(7Q$üåœsÎù®eËVõ$ Ñ|³ó5{¿ ̆±vØ¢E šÌ_°àtNÔyûíwæ’lÇ?ƒ /н?ǃ,©rÖî`ì‚dà|+z=‡pÖ±¼ãêú6$.ÕÇ…§‚ÁeÛw¬²qÓÆ“-^4kVÙŠ¥øÇ/PŠ÷/´i¬%OÅeâö{† ƒPr‰V5¨`  ¦ýY¸ôe¹ˆ€”ÔK1ªaMØM$Òñ‹ëÏ!‘ÏN,ÿÏãÔ{…Þø0T¸ôÒK#Û´ký ÀãèjÆÄÄšP&¾@b"•|pÇd¬X\¨Å…ú@¿£T¡ÄQ &ð.ÖÞhÌ•‚Öº‚¹-V…7RYC# Š?¦E ³ò»ïYìóF‡1Ý0zŒÍ'P ]° ؤ“w±ÈÌyãMóÁ`tÜ´ þ¿Üÿ„tý*ˆ¹Å~TèuUccpK¼Úôxà~Ó­‚)Pt‹æ“Zm²öÈæôPØG ¢*áaÖ›$iÅJ³/=ÕD7Š·)“V‚@cšŽñ‚>4Ó{ܤc\ìh » )ÌE$}RäQYä¿VŒÎPÆž gùOÖßãÇ·eÁ^ UÁ1§qZŸ&øË‡„8\û³ñÚ’çÖ^ÖôLÙp…Ï™3»Ç¬Ù3;?ñÄ“?“…У*¡úè­Éq¨—'#ÓVõ<?‹Ü Dth×Ίþ÷ƒìEX&V„ëÁ~ˆ• ¢7‰oüÓ/?õ¦ÍWëKk[¦ -ˆ@×\xá…'  RŒu»ˆ‰`ÐôaÀ5Ûe‘:;“vZ7‰©ˆ`pïË&…ïÚÄ@#‹Üç\Êå” (}(-(bùD5šó‡œß‰®OjÞ¬yφ šM&z6“ ;;ËR„ù €ÌŒÌ åËV´Ôõ%Í¿”¿)˜r[É@5¶…‚,˜7Þ6qÎ\£´Ê6(·ÁÂP¡ W¤ ,dî ®a6ý­Wà’ñ_òùçVWŸ²i3¹vÙ,‹?ÿÂL!7üvT …{t›Öæ¸}Åx(Äøaw›,Tb¾ =t?|ΛŸ~º•ø„ò®ÅÕËC¡\L1²P½íZ´¨@3É$¢jŠëÚ‚>2“ï½Ï¤€ëwëfÂ0’”qéÑB8{ˆqâý¸’÷$Ú Œ´B üãsÝu×¹÷µÁøS.É2PvÚU=­'Ÿ|²•8\¥ŽnÀÞ܃!£ÖÓR„6½zõ B`ÅèU>u ç€]³˜7{-À–y—Á„D ÙĉÎkÓ®í˜Å‹ïÈíW­+®¸âZ«KÉÄwñi§Ö›ŠVXk‘üÚµ·”ú¿–v¿çtAâ$§Šˆù ”%°*!á*}R_‹‰! Ü¥ã*‘‘fÛömÑóþ™§k‰m ”þ„”R»j¶ ¢ûcÛµkÇ7áÒ¥ˆÚ¶œPîo4ýütq@Ú ³"éú1¬8@§,D4oÐ!Y­©ª£¹í´éÔ©Ó0ŒøÎň¥FÆ C˜AøÌ€Iøá‡/áƒ>ë¼ ·«<öØÎÇÂðcÀ¤BÂþ5kë |¤ÚôTÝŸcƒ©ô&åTʽI$–+vb@6þö;L“3Î0í.»Ôê}E”ù+ö,ôG{¸ñ¶—^bhÁ[oyZæöæñlñ^Éû™^ ÕIJ"tØ*³7Á ïa[mC°è÷ "zŽ¡w‰£çƒØoO¹êÝA>îÿ¼÷nžQâòÏ>3*½ž~Ú´>)Ç\÷W7îÞnYÚ—íE*œþùHR‘ïØ¿MÙYU ;‡xôÑG«ïú®›oº¹n8º1+`õî…l\®6POV À"'ñÔo#S¿œ¿þúk7È÷bª¿Fñ5Þ‡Þ¸¿ÐûÜL>ì‡ rÆZ!‡Q[,oûý4óÖ×#rÜ"£*f Ï<öŽ;ÍvßIp颸þO>ùÄrýÕ‘¨äI4‰gºwïn9GY†Ÿ…;©lŽ$ÈxúŽ;î°Šâô£Üï#H€^;é$sñ ZÀ÷‚ø¹ õÖ`~·g\NDÄTÖïÕ§~…]Ë\f¥¥§YƒÈà`Öþ+È„û—@*1OˆÝ¥7½ .»Æé§ŸÑÀ€BúZ{cccƒTËS:À”]ÍïÝ éYÅy?¯ƒø~Æ‚ Ñ·©`bM­ØXTÕ.鮕`ÃüY)¸Ì] uvÆÞŒ ¯¾þ*“û}æç=‹U­¬Kµ¯ê¾¬}é;RË-[jÐÚÚ÷¯ÿ¢úäÈg>'ΡcæéjPy¯<ø~$ªÊg *"ETŸâ4oÞ¼Ú–­›¯«Y3&8Ž@“Ú> O§g°—×¼¹ãRGÒ‘W!p;ŸÐT#Êï”É”K)wQšS …ýø´/"Ýðš‘£°^¿Êº‚…óñUº :tvŒºÞz‹©—0ë…çÑ•—\ ·ÑûÉ'Lã¾}ºä1™ö`t˜äAdïôR=îý+$4\~¡Àä ­VÝtC=i? Ð·#/½Ì4?ï<Óç¹g­Ÿ¼?ו…:úFå=1ë•W­¸ßß> ±Ã•ZÎ_¢þÂ@¢c!~2(;’ Ä{ï½g”Vänô`ÞŠ!ë@\äj+–³ÜM«\kcWbW,âo Þ"æÆ<Ô 3PýAüô´iVt.éˆhËV-ìÚzpÍ<¤Kàÿð‹€r׿ h –ž58ˆRý—9Þ Ï²ëiAîÒ¥‚ü»áïŒ8ûöë×Ï…k™Cê“ÅeÜõàjŸÛ‹ÆØ<Ô‹¡Òè[^›e@Ú˜“²ý§ª}ñ  m)Gº#FYR¢‡Ñ¨Iä_ÚÈ?†ôs,W€ø«êã†Ú³/X½&žŠ>"‰ú™˜!Òi‰HXKÙ¡…ðí£ÐYm]ϨMîsrÈý¥7¢¹ÇÓ”[)É©~£ÜFJ‰¥ éDUœŽÔ:âÇwz•uTzZ½£Jð<š»'ËH¯N—cÍ\âÃoݸ  D½~ÈÔG‡ï>îâ86ø°7ÐýšŸž©w^j¡ÜÚ—„ΈEÊÐõ¶[ †TrbÇŸû¢Žžs){§=þ„Ù‡$ÅÐ7Ü ÏÅ_lP ZîÞŸëTG×Ú5Ïß J©ârƒ‘ß­kÕÌúv#¢þžÄj’wGüb}ãD$]`®@R’§¼{£Éqÿbà[å·qFDF˜Í››ž'ô´k§{{ä„ù Á槈)ù룖•êõ"$qßÿýùÔMÍ_?@¿…B<}•‘žN\-û »àó[à0°ö÷I²ÂÞ;‡Je[¦ +êo³,ù=¶³ý(4€mí>“gË!] ´ýj¢§ù½Rºõ•Á‡(MmIèôS¿Eä VA œ—oGô<üóL"_§Kzîß4ðÅ1¦YÇþ0Ê”‡(})úN …ÄÉSŒJKÂζÅÂ9¦v‹zÆ\ê¿Ð*`!ëX8éÞ7O›næa n]ˆÇaqëLøáVèØÃ˜_1㯨¾À† öUÁË9E‹¬Ž(Wê B~1™\! ô±Ð‹©9v±Ïzå³yÜx¿; Fàrbg`„fÕOœ©³vùÝÈ®¨xÿ/¿ü²_¢ÿÖÜk@ÜCyÖNpþ’É[(ê7Ïw ¤ÍZÙ ©i7Úºb∀‡ FRð<‘z@ÁsN:©wîM\‚¥åYÞ[ÂZkN>Ð,ÒcûGª»./ÊߪèóÞëß¿?¢u…ˆóâõ™K|äµåH'Ô_Óoé}$À)+ñ;È_åìç5’»“FÖ¹RQM·QÎw©Î¥ ¦ü‡Ò‘RðËâ`~XAÈÛ5u¼îZÓH‹¾;Wš¿~…ÿÍÜ>þ¤­n};zôD¢È­ýc$ùÖYq¹ûøUE\ nºÅ9g›úˆ‹#ãâìzB¬JX”N o ?ÑpGÅú›°ã7š:óžúXœ{—Ö5ú^÷*x>ï³ÿ÷r‘¸~tÐ t‹ô•²·iÓ¦yëUiõ·4Ú•¿¿Rû‚ºpª·1‡`ÓÑŒõÏ. Ìã㿉ÒTb |²t©ù{-PC(QŽY²Ô´#ÿFpðÁ¥ÈÒÏß!_IW´vc´Ýo÷îÝ‘Vþbêù'ÂÊß`á¿·cíÚ+–†îïN¸Ð}.s†Ž-Rä…7]²eZ GCg“¼;i·P;ß$¨Qp¶.üÏYgÒ1p1ø/õ(È‘<×·oßÓ™@¡¢îEíÓσ}ÊwK§ov«k%<‹,[õÏ™Ãy;N:áÌäT)¥%©rîgna/? “2Fù‚2šrEÒ¹: Ù,¢s }»ê·ßÍ1×^câûö5r)«´ð>tš'UXXëáÖ GÓ™¬krLÃxﮢˆ‘8_•„MuLÜ·¾gŽykU@–$4µÑÁ†V¯‘á2ôÖŽÇãôׄçÕú|!Íç{õØà<ÈXŠCSß™díÛ:Yô¯ £^ áa-C C?1R–7P†ÔFyóùoÄéþ.]Ìé ¦.Ì}Ÿx§Œ âÿI þ7x¿ïBÒ‰"/£ˆûk4€Ù²êÞC6ÌžÁ×7!ŒM–Y¿~}(DÀ™h?·ýž[*ñÑxÅwÑwj‘?óËpð‚ef¹•~Ûl(ñ i ÌÏL¬<÷&ïI¶ƒ" *(WŸìvÐâH;pâÄKòüE> ÈhBBB¤btë^¾¿ssÈb58êO€ :Æœ5c·ÚAà:¨+ÝŒ_©>pÕhÌúQÆyiKæãOR¾§H ©@uJ¡°1êß÷üŸ‘‹Y{¸#黃ù(Ü9ÚB©`D$É~DSÓOCàk¡sêCPÈõp޹o«7Ž7ð>)d@˜¤±PÝqUº<ˆ¢°›ã¼Ö—LüÝ}:Ü,Bï]WEqýW,I9JäÑ#¦@!|%r.€œ+.Ðõžì= aÚb®šžMï2ï“±ß ‘:uïÓˆúÿ!œ²B Ê5é,Š»édW~‹¾z †ÍãQ!¤ªœ/þ|\nõì …‰ Œïµ=³“““¿Ö¹CmÂþÂﱺÓG…¶¸,w+â9`,-À÷u1^¥ ežIîEDcq¡ã êB˜.®Ç–‹^Ê{ñÕ¢¬å¬¥”—)»(~Á^DÇÓŸxÒŒ¹å³©€ÖXϯ«++i˜dÐM{ůßDˆg þ‚ÞÕúqãMâ”)>/iEÄCë^XRÄáó.E?©ÅwóÔiæw\V‹‚üÅá8ÐH|,+m! ­ÒõË_]âÿòë00}€ˆ‘²W6l˜‰‰¾ûâü .0O!Ùh‚ÌCþ%y0Æ(›90 7Ê;˜kǾúQŒ\{ü?{ç`E‘ôñ†%#9‚è® "Š ˜#0çtzÌgÎzætfôÌs8³g:æ0¡(AAP‰"9~ÿ_¿WKïìÌÛy»o—]¿«Ýz=ÓÓiº{ºª«««56¾ t?¢Ž_ñ§E“¹Pz_õ­Ï'¹úÕ®‹‹‹Ñ h(ÉÍFjÇð+ 4eÜç{!OÊé—åV¾ÐÍJ{«]é+ý×^ÀÚÈ')‰Ñ¦ª2–dÄçØþÏ]_qb—øó×4röºYÍ4RФ}äŠÖÑ?\Ä¿%=b¿°óD£—)£Êx@®aÞû+Ãûíµ2®¬f×~-k[5Tðáóyæ7Náù&"Aè/L5 šüégîµOs+ë ™ž"m5ˆR¿q­ÒüT¢ØNˆÕÁFáÎO× #…Û¯±¦ªx·Ø4I޽袜[‹4ë_]ûàk“âñ,)¹ ¿óN7Rç*¤ú$G¾24Ó{Ñ?!ž2ûê0V#{ ~&š6½eŽñã>ƒµÝ”õ~¶ü­¯IÍõ[oí¶’½å‘Ö(ŒÇªTƒÚ„5#þ·,Q¶­,|¬ˆ0ò±ÅZ³lôÓO»çe%n¸ŒápÚ—X[+¡ÿAÕj Ìi¯¥êx± aÈéͳÏvÓ$–õý;.œüX/×e÷æyçU¸=®÷‰'¸VÅÅ~ÀÍ´&=UvûƾòªŸõçCü±ÛÏž~ÄþᑽÔÒ9™–u·Þz«{WÒdÖó®=D˯IÚ¶·f÷²câî¸ýv·ÿ+:ÓãU10ûJ3~y–/"ãOÞAuó‡ÿËêW»h;ðæú¾ÓmÇiŒ|Ga½¶V†ø+št(½¯¿üÆwkfÎ6îÚ8œ êÐÏ÷ñà!LcÈ­ Ž:ö‚¯NígúÌœxöY÷¥Ç¢ ìR´1YE„…ŽøË`&ÿéG÷Åw¹ÑÚÛž¶?!Ö—™oo“>Ê”‡ï÷ÌR%'ü½ùæ›>¶ÿk pØs:úz4B»¿Hå=JR ìñ÷’D“ƒz|¢¨ -# Ó²Ò¥ñ¦%fcç ÷ö,`¥¬¡´ŽÞðÛ$÷ûï3ÊNåG£YÛŒÜü‹‹‹¤½¥¸¹ŽßKþÙ³*¸í9¤ŽþS_ŠŠ6±¡l¥Ä?+ à Roå7± y¦ŠZ뀧Ÿ~úw1‹M@¥‰äú†åÚ£ç2ï˽fèPÓ¿¤ªÜ–·vŠ;4E³Û sÇÈ>¥!а~ –€ ñW1õ±èß¿¿Àâì{ù›ì‡EÔ ¬_ ¼a >!¼^¸“0°&ýî¹ç¹12F²–¶WuОãÿmLUu9aƒaF7Y'±ÍÑ–«8˜­3>”nƧÚëÝjÕUýÉôÑwÏøaTêíqëêÄ»&š]z—Q ø1Ø.Òäa´N²ûD6üçŠI Ó{¤l0héÏ´ã9e”?ßoÌC|®½öZ̯,…zËsѰ5uÏ~þ|ÐÝ|ó͘Hw­ÄÐ\Ò·¯ÛCÌÙjZÛ/²qÊܪLu2^3ðç”Ï:Õp¬,—2 û—pwáJUI;GÜ#õì•Ô£ÝÌgæ$úá¸Ìu”  5áci§–HÎиýœ’Ÿ“#û É>D—Œ¸_Û¾³§’7gÁ þ7¢ïýDü¹ÏÚ_˜PaâU PëÞO„s¡Î€nD€mð×øg™Üìö›v>`Õ~ßh£VÖº_=Ly"º1°Ý\óÇÅÏÊiþ`®kÙ¤¬­j˜ÏÏG./þÇ›ø5…dÒ)ö¯ÂU+Sþ‰o¾åÀÕt˜ÊêÝ×µÒÀå!Û*“æŸ6Žú'xó.É§ãV‘ª `‰¥@€]:»-]í†ýã,7[D= jÖȱϕ‘Cbï¡Ë¦ZÝ]†í„äbª¬È}tÍ5n‚Ž™M |¿—ÅÂvØÁ‹ûÑÇaLѹòžàÈÞ‰2TÃ7žôý‡åÂn»í¶N‡ÁÔèÁ>#FŒp·KJ3tèP¶¸¹ÕÄÌ –èö²Ó¿’®5 ¬md¢Í”Á¯G´,t£˜¤Éêo½TÙw áøÓ(õ¥m›¸p V,\1mºgÐ+“Ú&?®ýPð–·úZîYUÒ’Cç–h¼|îe¢ƒúz‹øF3ôrú²š€ú³üÄd2ã+äN„Ø"×@õ±xž$ÍhT*J鯹Bû=ýÏÞg€V±oœÞ³­¶ò¡Ã#Zcð'n[u\ëp¾<‘<ð£QçiKq2Èëpm‘2ëBvg.R„B~³¼Ê=ªRþ廊4ê©§dïþ·ŠNJÓžÌÔbܪä[§âª¼qæ?ÜÍîçk‹ÕBä.ß…ú_ÿ!w¹.ÒêÆðÈòZëÜæúëü¬xÂo´.aBÐ5(b-¹fû­o.Ù\u ¥Dõ̓¹ÏdË~a´8¼‡YqqqéÖ>ëÌü±ö1—nGŽ£4Vniá™õ!õ{JýöYÜm·Ý\_;³ã“+˜ Óñ¾NÐû׿þåÅýHMÈ0ÑZëßJ˜¶ÒD÷í¡¾P€B}*æâ^é?Ü=r¤›¥ü·ĸ¿PlFÁ!Êéjõ5–7L#‹¹ï­`6†Û½¹({J°µÚøïš?(ÿJ+äÉ4};ÆÐù:Îh‚ù›KÂèyµÞµ.0»ÏQgnãgýõ²„PŽ5ªš6sí¹©ÿËLª ª{qþ.pöôjÿ?é•B\§Á/®ƒ™ƒÇB™q•MèÒ£\:Y.@§Z•æe ¤?Pƒà+°@ù1e?­i1|ÕÕn¤”‰ú}´ßÖÆÞò´ë¹…(CmNM{¶ÛQýÄÁ¸ao¸®Z×_¤¾¨ÎêÚâŠËÝè^p_ ½ÇÍ”1–B@O-Ù´×wC5 Ìú'iúÁåWºI”:{ûŽVŸÂ¢ [|¯qÀ÷ °‰ê‘°Ìò_Ôò[C aF`²4àïÔ®ƒ7ÄlÁ Pîû#åqÂØ+2°uÅW¸?üЗý0é+±1…^ߟ§:xW[xï>Ü=ª>Cì¢ò+„(äà‘¶º)à9‹¥‡A› ° @XsAt ÀÂrr ’_1x+I§ãù_mÏòuÛµm×Òx‰üýdÏ$º7ÂOš”`ÑâEèT» Þ£.0TÒL³ðdÕ»à%{Ÿå°½1€|+¾•füÈÖKöõæ²åë#Ë W w× (Så¥ñDô=ÝϦˬ EaîÜ*-CE“«è¾P»CxÙK„‰Ò¤+œ§ðÌ3ÏøuÖŠ ÆóßtÃN:ÙuÐ_Êj»å•û×­¾Ó¤ñg #Ô¾çêž°ÄÕÅ÷Úw½æAÊo'ÿú„çŸ:µ±Ë¦›zÃL£¤(ö»D¹q@ŸK7 Û°u+×coÙûÑ«i€åŽo}Ô}qãM9·&†ååúõëç9äL7„?éñÇh }–}Ý`ÿþý½%9Îa–ÏŒ?ލØ÷®Y¥×`7Ê…¤WYÙZ÷ðÃûôtø™k¨:ÿ‡Ê¶—t8‘¯žÊëÁÜÊfD<Õ3ü7µ;çFm|A’ýÂã…½……4”T¥à Åú§ÞõÒK/õí’kܶ6¶v‰Ë»ZJi©v>HR–°y’7´nÓº¹w¤×õ—d¶8Cü—,ZJø¹‡øS6™'ž™wF•ˆP$SÙ§JÅXÕ^ÓÇF@!ÌڞרDem‘éñÿè,a‡ ¯“ò±òÂ,VãÒ)-ïÒ#²à¯ôC'ˆâ¼:Û¨Ì{%•›ôoZÛß|óÍýz+k–|ðA9IñÇý÷e7þåWÜGáVÑiѹ‹ŽŒRèB xI™Öf½w;õÙå×íë~ûèãr%]¤™âwO>ézëÀ¿/?F`91ˆí»é8áRääÀ™ägj­»±ˆz»«k=}„ûB;4Ÿ}O:É-§5Ý(5~¨Ãk&}˜~Ör§öaÆ—ICÒ¬ßÞ?Hé·!pâý¢þ¼¶»±%Á2é܈“8«»ÎU&Þs‚˜ÅÏÅÐLÒºwZ0"5?ˆ³}£¹âóG¥Iá™|Й< ÆÒ€lÌ—aØQ¤ÝEII”ñgÜx[fs!ü¯¾úª·u¿“$,GhÉf€ÜƺPu.=’ï¥Ø÷̘1î­ñÿ$É£´9¼F?«ê ¨µVQá.ž-Mê “Íaû¾ŒÏqãwø~è{H¼¾¶¢wûöÛo×Õ³ò¢µ0BùkÍGZ1¾Õƒ,®§ïM$Âfýæ2î›ôW:%윪v¨ €ˆÅ/ZïRÛ‰È6^VS2Ó¸T&þY—ñ€3ës1,c¢NÐ[ Ã>ŠÓ–FÀÔ/ÇzVÔ9È N©@d €ø6ÿ÷Ü¡ÞÎ}ꔨ¬§'•—úØKç—ù8 €2³³~ýúy&ॗ^ªP1bu C£Šˆ×?~|û„ ÚS3ñĉffi=¤˜ßÀhˆ,3Nâ›è.M!Lt0 ï¹6@œ fK˜a}G ãfŸº¹5£jÙUÅ•,Ò(˜ÓŒfaìŽ{O‹@[  u¶LÓbceo´¶ÇYœÐ-‚5Vh/ÍJ»ï¶«k.ιò ãþ®›‰‰Ýô ÝKÒX õ8õØcn´tº‹ÙZq«-];Y†k¤fJÙ>8õÛïÜÒ\Ÿ`5ÐÒl°\s×ëÐC2ͳÐ.ߘG”?Ö6·ÙãÒˆq9²BNÿIÛø>û³Æ_Y .£Bè&J¯I ßŸÈÇŽ µ×dæ,mÙÜOýk ‘„@øÏUy>ÕòÎí"ú÷ËÈÛwSáÐèGFÑ,© µØ¿»Êvªðb1N¯¿þzα†öH‹Š¤ °»–uvWýKqþÞ#|Cø˜0 :2…È[^H¢KÐv‰1±dÀ)þ£MÊ¥’þu‚Ðz—Ž+ŸîE&’ø3qT•šT€ºÈnÝ WtWNÑ?¹¤¤¤5\â5Dëfè!Xc…~•¹¶Á†¼¸¶%€¥i©fû !ˆ_G€‰ÇÇïÂË+iˆ9mƒ8õ¦›nò&Vo¼ñFÇ ™Øï>\3¨ïDè°J·Ò6[»Ëhozšò2 }­vl}ƒL¿ÊªßïÒˆêwZCŠáb‡@CôY&ºÙR¬ôVݶQU0ëÿCea"i‹c\Þ0ñk—Ûî8Á/M Ó¡ß¡#PU`,áQì 0ÎÄmdw}ü¡‡òý»§–RnÖVÃ]YƒFš‰t&alÈ»|*6ú?•À+‘˜IÑ“iÉÂC…k K—t]WÙÓ‡„ƒ³…FzÂd0z^§ç‘ ³µ3!D [hBrœ$;ÇI:ÍÉ=· ‡¿&ýÚÕ/ªGßÃVò¤,øÁ ö‡ø£`eÔ±Äóƒ4ªí²N0ª°¹ZQÝ,Û±nb÷¥®ç«è™3žå@ôéË—ˆë>I  *~#Êz^ÒvŠ2‘*¸!/¼HÛI?šG–(] “K*g¦À×™JÌ?Qö4](”˜x`ÿ4ÚÒù ÆÆ¡4ÈL %(N0cËU˜+âñög¸QR ZçÈ#Üòš Ö¦ÓéÒ¼C¥Âè{é(#0ÛÜ|“ûüÖÛܨ Äø ÄdÃhç·Ø\æŒÕ,A|/»\t‰[4/ýNfÞ¬³cx¦“1"XQó´ 8Ÿ(†EG›Ò+:/ˆý·Ãqœ¶b¸§•fÿ*xAû¦jÜ{S„ÿbí¶ùLmÝ\¥¾@¸p5aF>©‹:Ì™¿BïÚb)“À–kû°/DÇaEâx‚­1œå t`ê°!©@3 }Š–zN]y] °ròŸlB­Yâ%.y1ó÷®Ò ×þãmœƒ>é>Ýà[Úôžu‚P…ü1yÊä ÁQ„«}#eE(Ùí{»h¶õf›mÖq²Íö­zÂŽ`׿¦í–VÔ%K —üaY€<<‘ãlD¥Að꺤F+S¤M’"2ëßWÊi ‚V7Iaãü!øèw*C3[mµ•7¬ÂÚª}8qqB¿‰2®®A¡‡Ì ·Ô ïAíóg¿ÅOÇ»ntî9þ8àOÄ Ì=¦ ¯Ûjõn½ÓNs µ=®2홫Hfüø“ûXK??Itž ö}¶oÑϰևý~Dùô4̳~i³Ì;uËV>ú/R˜ý”ß‘*ãzša6a™>Y¨~©ºœ¨]¯Š¾D3⑺^A¥¾A¸£på¼ß vD@fË‚<ôŸ2‰‚…r²Hž‘vsé*q}4ŸqÞÒ ¯9!†€>§ƒë¶TŸÛR3x4SуZ®žN^bŒ‚¨§}Ê>O5/iàïgÿ’˜ €©BµC`´àw,mq N=ÎO†ØѧAB¤Ö$â/ÒVŸÑÈ…€R©aˆ»ý¬æãüìY’‡††û«_¯¾fÄ¿LêÁ‹Ô)¢°pA‹ÿ+CGNš0#úŽƒQ°€W?åçð€‘C1çâ‹/öû©ÑЇ—:ÝC‡º‘<âúžzª[y‡íµÏ]‚‹B ¶9ʽ,¡í¿òöÛ¹¿ôéígÔ_¾U3êÊO2ZHc‹Ë¯p­KJR×{ª÷S¼@z8£þó÷ñÕƒÜ"ÍŠÓß³vˆ?âZúˆ¸]FUüöRjŒø ÆÂ#9Æ·gâÂTÅý¢!C†xÂÏ–¾f"̧‹èï§üVi {ß Õ•ÞGúÏØ±î*I0^ß âý¡ÂÂNº3Uè„7 ß¶(DжÆ@!Ìú„6 6yb}sOøèÇ]Ã\²Ã Á¸qãÖ>|ø²Óð³ú gû= 2‘Oü59ôëÿÙr2¾ Ð1¨v¨ €*k2•2[ö½[4@ªŸa¨@ i¥26”½3~ˆD¸ÕÇW:/ôñ"×Þ³?–ž¥—Lˆo|™,øeü½™ÖH:G C¾ €d•^ï¦8©œ(bÁ ¨sv p~÷mÒYŠj¸XGKÅùðŸÿt#d9nÝ“Nt]$.F{ÞÀi¨ƒa¨3”!×>üp·b¿~î{)IŽ”½| ÊVÚq{·þi§»å4»b‹`¡€YÿÆÏÄœT¤xæÉì‹Ó:‹‹‹½„(ü-ãÀo¿ý敇"ñ,,.* ýÄ­Ñ[:•q1ÜsÇwø5~LwqºQƇv󴢤'ž)ÿBõ½Å"0#%ÞHz7°Dm„bÎu­„¡bTeÞgYÅAóçI!òõï„]„§y7±ð>Òïxá Ú Œˆ>l_»Î„ÌЮÓ0ÄeáçÚ»ý¸† ÅÀ”,4RL·@ǹ3þÓ·ÈϧÇÚ¿ÚfÁ¢ž eþ§˜©-â7nü‹*e ³x”÷DÂÕz™¤"£H<¬vAtÃg–žù…÷q׿—äZ:Ö Üص…¡¡ÙþQ_Oø¤NGìIQ¤†!ß 7Vù`ÂcÁq30>˜B‚­©>wÚi'¿æ‹iÔ'tÞ{Úe“?4H¾~̱nE°éu˜lØË’ž§`ƒq!ßµiù~©÷k+IÌz’€t×¶¸1: `¬lÉÏù}Î,kv¼–ÙºiWE#}_…"þþy"X#$•ùRº ß›°öÆL%?NÞ“èÕóqß—}§, h‡Ÿé£èÇ–<â³LPHâ¯óäÝ]wÝåSúc7]7©¼[uéâ–•Qƒq#í{— §6] oë+IJoÑY÷þðƒ›¯û]ðh!D².jôóžã„÷ /2-^Mx™pas!# #/ò¬g„ÌÀO9åßt[llæAx].`ă°^’+7dB&€0†D‡^5jÒÈxúŸÔþ´¥Sö'ôÇXoÄßÄÿÄÑR'¯¿SíP'$ú0ÇKÉb œ• 'e•Œë™ªT¯jÓ¾~/ökjµLüàžgI`i'=7 g.e€ð" Ä@êqñMWÀÒÂ%~ C>"’9W˜ÍÄNxS.©Î÷@€‚'Û½¶1g}õ£>JçO:Ðå'ÙXû¸c=QäèÜ?3Ð7!¼­5Kê£:ë)“¸³¤ ŽéßI_|égâó$M¡Újm³ÃÚk¹ZNkŒ6=ËY|wU}høO”!ŸO®»^‡÷¤·±Â ë„Nð³,#Ú˜”Æ4.šßßIúÆ`H!È:ïÝ;Öîa§@E{óÓ¼.õ‚ñfüg•.·Ð’Ã:J˜õýåô¾ª¼ ¦I°¢0ªÃyjw$Ýø— çµÎOW¼ƒ…ë Ù—[×€èKá!º ÀúBÞ«DÈ;Æ*Dï ßî#%JÆÿrõWú†~ij\€8:CÆs§C`yxú%zEz<ü5–ñqMðªùG½±öðaÃæK¤¯‰Á܆VQ¸QôKp”ÅŒaˆk„ñ¹Ì/s·ôÀ\{’æž06SE â€\¶×s¥U…g‹òˆ»¯Ân™xï½÷öd´®’âTÅŸ6g-øÊ+¯ôë¾l­²³Û+LWí4\É|sÿnýœéŠ5[ã´A5z…QërúWc‰Ã1ÌY+é½ñc§„ü² (~ÿB@=¹²Þ8ü¶Û݈{îÉ+I4¯™õ£¬2•|;h~â¢5X¯YŸ‹À¤.'ô±<€ #ù éäcÚn ã‰f?ó"=‰ã´ãd 1+Z\Ê@¡ú’ÒÿCLïK"ø×i+ß»ZZXN9œ%Ü[ØK˜!kº¨C€úÛ»Â;„!P; ÷¢³À;ñ5á×¥¢n5là'áXõݛ›‰•þ—xô5£%Æ „~–OèÂh¢@ß´‰k)C¡%$áìŸ)m^ñ·ô¥«|È:Áèõ–¨"çkpoâ×ýECÃJö×6ûÏŽÕ0|”Ö`q EµEÓIS•'MX·ïÌx„IÀØ@ÇŠùÕ0”/D|V’÷B©-Ç{g­Öä;õYaÖ†Ÿ“ñÌ ³Í* `8ç3ÿá¾íÓGöNâ\?[N·.‡ñmô5´Ó«£ç‘Ï„·ÞvïË^ûU§»cŽ9ÆÏúmŽÆµ~Æú/ Y2ßê‘8#€R{ñÙ:‘vÿ?ŒÃ½÷ÞëÅüf¸çõNä[M Ué‰|Ñ‚Vö^ãÇ$)o¢Ø7H3þo¤äW¬´®î&,ÖE˜¢B¿&¼E8Lˆbß¡Âm……Fðãú#LÁKÂñÂ.éPªÛmoë Vf<ІãyŸ~‡kô$êò,DÆ!Ϡǥ¡ŸIjÈðœð!Èq½rø¨à×u‚P…-‘5¥¹óæÎki•V2צ¨ê÷•À¶1ÿLØÂÓ`v „÷iü|¤ ^˜†= ý2 ÀÍ,–Šþ-Ÿ0<§Æù/P'©aH“!œÌIÂnIe+..v;ï¼³_W{¯¤xiü!æhU3ãKú€íãcë!âáûî»Ï½ õî8&+.OÌ ¿tð@·Š$½>ȵ*Ñð ù`ãâþϯ| ™ê§·ÜâF>ð`ù >´/³sNîCKŸv­øæÐÊFI´Dí†4@šÙ~àŽë/Ìú‰£³ßk÷Hè3ái až0¬ï£ÕÏrCwIºîÚl3×_[ »j™D‰¶Ÿ¨Æ©Ï?"•ëô.?klc |ˆp'a]]°úQeQø/áwÂ.Â3…ˆûy'f"QÂé ó„°I“Æ®s—ξЖÖÎáØÃµÝãÎÀž™õ7¦Óâ7îÚâãšÒô‰e€ÅE*—þ SÆLX>æj×J~Z¹±n`x/UÖ¬yó3OZEû{3ØÀé]ˆƒÃF²ðø™?~€=³kïüX¸À«Ü¥… Ó"yÙ „NÉsëœa" µÍ1ÄøÄyW§_fÁ*wéñÁ¹‚°®ª“´üûæ —ï3êîK):¡ÌÅî$ ,5$ú¬Ÿ!c@œ7xð`b›µWR<ó¥=Û£¥XØû”“]·]vuMÛ¶¡Ëýò¨¶ŽÑñÍéP›9ÒŠO ì­>Jdz×à´q G‚e Äë (ˆ&>÷ 2`ÃX¢HŠ(qÐG3zfq¤ÅqÕôÄýŒ/›ˆ!9]Îl¦GmQ샠€…õõï4Ë¿G 4úg© ›*m¶Àm%d¦\×€Ú!D£};k/Ϻ­å2Ɔzl¸p¤êi ûÑPLhû¶m,¶{‹ÞÛ˜lÏâ\‡tîC:^[¾Ð!ü`^+ÊOÛÞY ©¨3 €*oÆüyó3 ë'aYNf€Æ ˆ?5Ç‹Àʇч‰k>3?\ ¼ýÒ<ó iÏíåg–QOJ€–¶…ƒ¼G CE 6ç w¡øÇqœVw…,?8k¼ÔçèÑ£ý±«lß⌹’êF‚rÝu×ù™Þ-š‰¦5+Œ8üSíKG?`óÏr+jvÈ:öÿ w Ô+ªïfýò«Î¸K³þR÷ÚñÀôâx¶ô¦™õç* Äé§ÃA¸Y÷§%­÷à ÞÇ&?ý IÆ{пö).vÇȦÀºRìk®°z±Â~½ÌÇÒ‘¢ó/nÿî;·Hé³~ªpC¡Œ×9`oÄz¨ðv!£Ì̾BĈ˜eLCøÌaï¶Pû—{i )Ú(gí:ê’HÔÏîyØ=iÒ¸ç:Ša8 UF´ô| ?²Æ‰©ƒ:3‚©B§Š3Ê4†Ÿò #âÀy1à‡db e.aìïíÿhظðß\Âd8?V«2¦™õQçZh˸µØCܺL!ƒ–_vß}w¿G}¨7fqpÓ䈉¾`ñÜÚÆÂâZy0+¬Ã=üLïÁLoVXZòÃŽ?ÁusÓW;ÚIú ŒÂ,þw­ ]ˆÐŽ–þþל0Ö쟽úå¿“´©”GÛ‹p#5Â$5LGÆ¢Ç µƒÁd¶} ûN£¹¿‚^Zz’Fr&sËg™·í5õ±¡:œçA1¹(× wŒ°·pé|R7uf¨œÙ¿¸Ÿwb{âÎÂa=!5™ïHñzVø“°Ïª%~ €V&°ï?ε~eÏ”Di_³gøàGÿ¸NB ‹›´„d鯹êk¿ÇùW‡_aTÙ¿Nÿ}ú)²„’õk,¿PŠ€0Ö`aC…SW ^[¡Ÿ]Ç=3?s X: Òtðg€ôa²³®­sùÁÏ2XÈ%r褢ýCØ((b™K þ°öJ½XÇ5n˜6õ‰èöwÞñ \0¦`톇!ã”®zIÅСCKgwa¸¤kL ÿGØó°C]Ïý÷wËI—ORü?³?§ N“BÝð!w»±²ãŸv ßì±Çë×ß‘à²>I Ã`ú F€ïÃrJ[Fùþ¬iÛ±C1Eâ®’F\ åÀ]VZÉ­¬x:Ù…» M8KiþW}{°¶&¾,[ýˆØN$\SѬkð‹ ü†ð2áBiFøm|,]°Öo£Cek–MúÍJÅ+éJ»¤g5¾ÖÚ³cínýÈ®£÷Ä ŸÙ5þ€ÝÁϮ͵0QéU¾0eŠìÞ×Ô@û³ß^‰"Û°¾ÂEøã$QEÀ°±Âëh£Ù}\DŸqo`ÏB—gä…X*³éPøù¸Šn)Ä@üe Èŧ"±d hO3°R÷aÝÄÎÓ“:û*æ|û0êÑ-–‹‹‹½~@hñ- Ë5³<´ÅÏ?ÿ|oV˜m\HÒ–ý›»†¸oÙ6¨e•¥_€]|EŽfóÿâžmƒ E0¿ù÷cîÓk¯ÍË »5þ.ëmæI[÷ùT*Ì [üŒñ¶¸ØŠgK!Úÿ(ô±c„Y?ýbs-©¥¬mµû }5­ïO–”òùtƒ¤pú¥&~­T°+„{ WÚ\G—uƨ¤/ ÿ)üYX"ß8• _gñ½9Ô#®±¨|Ï ”Î¥3ÕÁú âİ|ølƒZcZ£årI5.«|‹†ãšŽÂŒ`)·†§èIÛýæ×€Ñó\aÞ)ÐÔæ”>«£¸0UõÃ^; †%%%~'[°’&€ºÇâJƒ( ²—<éD8úD‚%Œõe¹µß|Ì ÏÔžöWŽ8ÒuÕ¡;½ú»k#­dUFRñþþþ…ZëG9òóë¯ÏË<0mÁV;úMuõ&H¢ÄÑ>³}?ÛþX¦8VŒâ~’l Å>à–i»B¶ŸêêÙ˜x\†Ë¤Ç2W}³—zÁá&Âü…Å˾ !*üZÈúþ£B´‡·Ë"ï9¨*៥4Ðü¡®F û¯µzW\²¢ßååþˆÀú“¹ö×üp£×ægþ{ÆÆ JOâh aóÕ€• @UªËŠœÊ­+ À‘ÒÞîõûŒßË5˜Íþq£FåÃá3à§i0k|j.¼ïãü“DH–¼9Ñp––¿(ýÉ ôâ€5 qsvQ¶O*Ì ³4ï[]@’¢[ĺØ~gY€= ~À{ï½çÅ»v"\R»Á¹óG}´_F<³Âã^xÑé¿®—Ö³{ì½—k¦rRî?ðN¿Itý¾ˆè´¯ éÍè 6ØÀÖBÛ ˆÇ2 õžÔ.éR_Š|H3$þœ*Šáv‚ !ZN3ü Å `¸guÖk­Ì]š\å¯ôŽiYê1ˆ×©¯.VÚ|H§ ÙïÎz]2rž …o ™£Í¿µpU!½¬ÊH@šHÞ"gLßvã ¥ ÚC¶ô¹iÓ¦úIžyÀлŌ ãI?µ{® 312¿ø¹ž‘†mv¦k׿Âäk^…TÁI«…TsµB]`Š´®|J]¿j;Q´¡üÌŸN`˜!Â-Òa£Ù5éYƒ™K[G07Î/,KÒsKŸƒØÂÁ­4>‘õ¹ÄûkåöAjî'Ê´UÖçw±¿:uX@Ý1°³E f¥-,¹Q_I±aÛ"~,ű4À€bí#@¸K/½Ô‹‰ÙÿÍÉnIáÃøÌ(¿ÐrÂÚ@ú+ɰLõÃ?¨sxÏ·?â¾ÐVÊ´‡Ñ÷Y‡gFnõN]âÿ³LÚR·F¸¹°“¯¯ª#„Ÿ|† Qò›$D·hàvÛº¾ëöõÒÔiS§yâ_®¨/yƒ;úþìnÚ˜}Žcö ?_¸NB OXÆœ| k­”j½XÈ®Ïj…ºÀœ¼Þzëµc°÷J€hú#ãO ë%4v°Àj ñ‡ƒµ³ ï¹öée]#Ô¡ŸÅ‹º–_ÔßîIÛwuNÓêáPêê:î$À$½¹ú~¢Ói–òÖJÊŽzÞu×]sîÁOŠkþ˜L]Býä ÔÄ¢‚îú öV¯IÉ¡è‡ô€³ßÑ`-:.Žù±mŒ /êР¡C‡z‰BRÚ¡ÿÊ·Ï8Ó}£ò­§Ê:ö‘E%Þ3Ls™]«ÜKÄý¢Ãv>ú×unšŒ1¥N‚¤þآɠhõÆÇ {?J)Ž™;íY™Ý¤oÆ¡Ø2zÍ5׸§tô1R M¥Øw¢˜±Z~hÉú>ý37UÿýCÿÇÒäÿç'Ÿ¸×5þЫÏ¢Ø×G˜/W¤e ã•ÿSÂK„¿ Wž-ÜHˆv?£Y2ë­‡€Õ ÄþyáÂêo0à‡IŠÖ¯_?7gî7mú47]RÆÿ8àÓB€¾d},tã®IÇ›M£<³ë¨†ƒî –%Èhí@IDAT`£" 'ȽJø«yT‡[Û€ú2ÞqÜkùTk$Ìèʶe€haŽ%€h#C¦a׸®¡ÝûÙ{fáÃ0¡ysOžtNv0à‡²Ji8òÔ±_¤ÝËB`uå¬0±'ï¯mp%%%þ½*[V#þ•a¬9%Á_4ø²î¸7 `ð¨o, Á8ÁhÒ>Q ý`8Øfࡇòf…ãÚ,—û©Zg~é ƒdVx/·Ö!‡¸–ÅÅt²¸ µÒ ÿYª×oî¿_‡÷Üëë»Jã¿þõ¯Þ$4³›¯µ¿{I@»ð³ä‚m}$|ÿIv¢é©û®—N°aÃÜ"µónjÛ£dûaKm¬–™·ò¢r¿§::E[Q¿³ÑH…C£g!Q]Fž„w o"œ^OÈ´F†z¤W¥Cø‰?Nø¤ð¡-x^rñÅn=÷psµ¼÷»úÌì9L*°}6qLí¯ccü7lã®]+ùÒëÐ?éÚÂóÜè~\1 ciñIT>ËÏ2öVäWºj+FbÂGjÖК ¥a©ÐY³õa5Ôaýá÷  %€(03%NˆÖXæZ£qo G:\˜èZü(›Å³°ø“6ëû jKž¡ìÚÒÂek€1ȯ`ô“™Ac7:ˆ+š²‡Dß4ñ¢aÈŸr°$€Õ7ÿT¤Àºf_;Hù ýf«IïÁç9ço»í¶~·LDÚw¥-r£ŸxÒõ>õ×]R“ÆZóVäè«Ôš{êa±–¯ÆèˆÛOn¸ÑÍR¦˜B4ü‘ÎXÛ@Ì‘¾0Ó»rI’¯,¢yc=0fÌèÑÈ0,zê©^±¯‰˜–Ã$Ý9Lq×sè?¾B×µœqê?¯iÿ©Ò1™"ƨƒ y‡p[a×\®¥Ï˜ƒ~#¼Nˆž¨¿ F!@­J¯5ÂÏÎÇ„¯£°ÕÖ[ù‰:2ãÓøKþfظ԰¥éãùtHk)Ússy Ï8-ð3’ËE‚•0a àH]_ ¬6»µšh÷tr*.°UËVe€õÿ˜%fl 2¹ˆgÑÆ¤¬Ñ“\â™(“0¹âÖr½ƒÜ Ðãgÿü>ÞAÌi˜3¤/quluÁwÂ’ú,ÕÀp†iŽvØÊ„ètRœÈ·Ÿt Vገì÷YêZâUqU®‘š•>«µý %꟩þÀ¬x°p+a»ª¤½ŒâÎP¾¯¾,d†¿‡€£\f¤ÓE%ïú™ðq! ~I0OiFH¦þŠ1ÄÚ6›ˆš¥TêkÏ|<âf‘ vM߳먖‹g„µ¾j׌vkápy–¯ q`P@!ðÜÀ¯ —µoÔYúzý5P°Ôä+ •ÃlÎÏ–ÕB €uŒ¥ÑÕ5€±d@<ŠºÖxaÃq à&¡åcÏ-¼¹¡¿ÏW3G:'$gôãL.ÕYDýÄ]€Š­»›'åß¿'ýŒÒ")\¼¿fëÔU10QhñÃh·Òû&“&»Ž¯ sßs¸ûcåâÌL.8æžú… dí™-gˆŸ!¾þc›’ÂÁ@€¤×øÁ8`V˜YîÓ²zÇÒ@®™­å;WDÍ›Þ|3×G3åöZ÷Vá ËìšíTST_Ïp [(qvZ`ÍöÄOô¢{¾µ¸ºÆ%@¶Zž]èêäêÚô` ŠÅ¤aò™gžñR¶÷ÒžëKÄLíPRâþ‚Â%uYÈúT?]¨ôFH2qŸ$7¨~æ©\ˆøö6Ö5 æ!øÌø?¼%Ü^ˆÌ…¨ª½’¡-ƒ VsçfÎrÉ4c†¸ú‚X›š$ø ;é³¾皟Eå>ŠöÌ\ú } ,÷qhÏV‘ +€ó…ÕBj30™%n³e\AL|^ZùžK,ßE™‰0'ýÒøÙ†´†£ÖÃνŸÙµ…1×üɃü‘Ø{ðL´/“GöÓ²ŽEüˆ¿ŒàpåÛ7)ofrØû§ƒWºŒªÄþQÑ‘¸ÿ®O<ëÍ®þ¸ïî®ÓËÃÜz?Ùý¸ï¶€?©|]+ú¬Ý£À¹ˆ—“À"Å™~…´¤uhÚ‚Ƭ—î×:9kÏiëeâ›o¹çßzÛõ8ø`×󀿹2@“v¶ôUõŸ.1ýÛ]œšø£oÃûcC>‘ÔŸ­\´ õ̲ ¶ æ0hò$ <ú(ô±Œ0vìX¯Ç1@ëú'mº©ÛDnK$)|_`¡@ùÎ×wø¥$ ×H—ãQå‹XúP¥ ps!ý¸®Á(øáMÂÑÂU„g 7ÂõSƒU}¨tÞ>$$Ÿ´Àé¯&þÏ4)%‚P'7¯ÿvExùöìÛÇÍu>£laøðž>mÏp¹'Ÿ8äye€ýš‚®v'e)4ÔV y—.]öeý„J¦QAà¹óæ–.¾âEüqã€ø¶6Vx6žI H+lèð:é™åÖò+*Zº`éøxÙÎdi„.À2¶¡&LìˆþÉ&Õ}Ee†àûASï'þo÷Á'nù·ÞsÓÖéåÆ ü›·ç®n•!÷¹žyÁÍ\¥ÄýºåfeQæ9íB õ˜yÒæIÀìý,ÅaÍtÖ°Ò‹í £pöÙg»í·ßÞÝvÛm©Í “Þˆ¡CÝÈGvëj×À*;ʬp(¾ŽfVM÷ˆý§i¹äÍsÎqS‡Qa.Ô)3ùƒÅ¼ žç=¨‡´@x¾ë’’o«?I?€~†R öùù7P¾‡È®?ëûëÈÎBcµ•2Ï`ÚÌ+ §<折°‡ÿ)¾¥-¤EŠs²ðoÂu*Š_ ŸÓk¿ÿ[x»pš.ÿ(!ïÓDÈhZ¾wË3 ž& !üP.òÉ2§¿Šky—~’AÊ–igï–KTR1ïôÂKãZ»Ñd- ëÛ!ݰkÂØ5. ÒÃ| îœÅ(üŦºˆÊf6ÀÏè³GÓø~ hèhE3KJHÓÉ®qèMÛôìº"×ò&œ][>EÌNDõÌ߇ó[ËRŒƒe4Ü\eéWü§£GÛ”y—¤ þ¾¦4È–Šÿ©;Ý7šþ»[ñ±§}¬ö|ìúœrŽyô¡î›ÓNpÍ÷ÞÝÍ툚UŠXâQ;§Êkúb2½núô‰$ ÿa?€Y=ï#€‰Ï¸8V}ûöõÆfÐ)ÀPھ͙ë>¸è"7âA/pú鮳lÔ#ޝ @³Œ¶9¾sι©ìø£”wÄGø%¾µ¸úH[nê4Ы@?B?vìX¿ä‡ú|£-Ä,\"Ë{JÓ¿»ÚÃ/ê„L›YEá”æ’¾¦e ÿ×Zëo¡8ÿþU¸JEñkásû Æ÷È–oK¹{ W²ÞÏüèa `Æð“ð}á-ÂøQMR€·è'âoR¢øïKííÿ–µ¥©ÑØN͘kቓ £áìÞ' ‹kt»Žs-<ákò|yvŽ‹{X¿üJW•œòˆ+²Š>4¢1Dg¦@§X´D«Æ‡hš@\òp_uÒ1´ãžkžc„{|€çÖ˜¸@xú'úÌîáÙŠÔ¨qÑÿ¬@iZ¼Š:y¿Ï(ûcy„~5pÝKyd*!’ïy¶³¡œY²QoÔ·ê×2ìüüÝr£ÇºïN8Šã½\·[‡¸uO8Ó}wÜ‘nün;fJ¤ðÍÇÿìÖ¸ìZ7¥ï:nô¡¸%yJÊŽýÌÐûmƒ²ÁóˆQ"ºf?€~ü…ï´ÓN~†üä“OºÇ¥HgLf4|ô~Æ÷2+|äQ®«­µ?ܵé¦OÐEP?*(dëþw)ã}yׯìWQúôDý{챇gˆW¥“ôœå˜,7¾ôÒKž‰ïظ±»IKýåßã>j æ&%–¿Þk’–ž“ÈÅRì£]ÅŠÏ8”á2²]Ô!`¡ë áuÂaÂÆÂ½„|E+ùæ¨Éò=Xž)4˜ñ¾%*,,É3‡ãq¶ùåƒè›~¼ÕxÊ3{n×q÷öŒ2Ûµ… ýèã …±{ó ]®ó]ÿ'¯€G/ç¢P€å$fÝœ—„(Ó ~ @(•K¯ÅµJ·0¡K„ aCF€õD4·}zaD][#‡®åúqm`þÑpH!XÏjÞ¢)—í”þó˼«¥ºaú¡5_3!ˆÖÑ99­`å ëOmÝxÒ×E @}ÕY£iÓÝø=vv“7\Ï­|÷î÷5zd¤jÇv}êz^y«¯>ÒxÊT7nï]ÝüJ¼Á{0“Ýl³Í,ù 1_igŒqq í‡Nžûîë9[{ÏBç1oùvî³+/r=®½Ù­zç½®ãëo¹‘Çî¥,ID^üÀ£nÅÇŸv¿lµ…SGqÍçŠ0UxúKìñg½?~–åÐ`݃5Ä¢uÃ=ý5I¼‘NL³#ÁÞiœöá×ÇþŽ›nâ:m°¡k·z×J:MÚµwE ˜ƒ ô,ØÒáÙv,”þÌ<™PýCŒ_5ÃýÜóîw½´ÁÇþA¿~ý|”è{¦M'Žt`Š’|,+ƒˆõwÖÙÿÐV¾µ%ij¦÷áÑGZ¥ûEÊç{)ƒÞ¥å…›´äÀá<[+EÖÆ·æ·z[¥¢,ò÷Jé9á…Âß…Å …}„0Ô`Uk‘ž6_ˆ&ÿã·…åGQyVšz‚ª¶§øþF?Ѐ(d$‰oi"?®íYܽ…ó²qgô_.¥çZÚ•9 0‡`Ue[ðe€¼Lm5àf¬RÙq æ€}ÂÐRLâÃ…YÃá‚h§µéNÚ4¨¹Iׯ¤Xã›Ël‘÷¥Œ}Øþ¸.LØHüÚ¼Vð°ÓnuP¨rYzV?³»tvŸ ú§kÿÞ‡®Çuƒ½Àð‹Ïq³‹Wt=®¹Ñµùâk7a»mQùØ^7H»Ç{ ¯°ºÖ˜œÜ‹õ0PO³„_ ‡ G³-¤«ÂcâR;€®à‘ñ3&s¾ ú”§Ù6¾Ä}“iKMć~v_Vd¸*.ï Á÷^¯²~µŽÁÞF¤¢°—cpF™ ¢o `ka¢.Û¿°,<Û,0,R„jqq£×ÜæÚ5÷h˜[§Y,1Výúšéò#ªR$Ï/b«8˜/»ÖµXógÝ׈t!Ë3†è—½ôˆËjuÒÆh}¿·Ÿí/jÚÄõ=á ×`Öl¯3ÐéÅWÜôµtØËOãýN)ûS_z-FŽr+ß÷°ûqŸÝÝÔÞk'h4„±–^Óv<ùØ§Ž¸?—~ý•8µ!º0J¤AûG?Ó½öÚËmüïÿÛ²±Á%>éž<J1îP&òiRÐ*ù#Ù8÷Üs½•ÄBêã–Ñh ÆâE‹]{ÕYO-É”ÿ*•<ˆ¬6š£1åmµÏ­Úýñ„Î`†Œðh!„W—€ý+ ï>˜-øNr·vò>|Gå{ <óÒ™.ü\x«p‚°& s¨FG¿ —ñ’±Ÿ??ìfüÊ”EíŒ>ßáL¼LX»¦ïqmnÔŸ{ƒðá‹Ë}’?ÛØóÒAÑ5ì gj`c)56âe¨ ÏÈõ cöo•H#0(3HCüÙoœ¬áC—2Dï)gF»³Ÿƒ†°PRRâû^\½Ñ—Xv8餓¼9å!C†xf#.li&5|Q\\ìˇv>mU(à9Xé>–¸Ýkº+Ï?Ð]vÝãîÌ'ßõßű’pTo•þ¡6yYßý`þWµì‹y¡­ªaÙ¯Wµí£e©ðm!‹ÂÍ„¼_¨¡.+ ÔËdáÇBe¶ò)Z¥a¶–ØXÊbœ\:î*9Æ aÜw¢æöþôU{ŽkhéP¨¸kÂáøÛ3»Nró;ò–­Ì ñ6•?Í_À„H¹¼k›`K¬÷À€`Û2WAeù¨4D…?4¸ÓÄ!LEáÂ0\[Y¹¦Sغ?…XÊÔÏtfÂóÀçÃE²`m`I"XQdÞ$¿_ÖÛQº³úc=Ýça&M ß9::–Ð×ÛûwÝäV¹ë>×õñgÜ«¬ìZ~û½ëqíR"œì~Û|c×ô—_Ýo›n䦬ß×3ëœ}‘›´Ñúî§½vͤ‘_1½ý ʇ~@®™0ïbö8¢˜Ø DÁê¦çŠ+®pïè ôXV°gÑ85q¶Áx†Œ¥Þ×Ìð"Öú9šw­Õ:¹k.躯°¼»åòÃ] )Êžuß«nÚüõ»ÒûòÍTm0Iº7ÏK*s½ ?}&ÉáŠJƒ­i; WÈ7½Zž™÷[ÂÓ…LcXÓ?U¸®°³ÞUÊ…A‰ð=!ÒÄþ‚©Â¶þª†~ ˆ%ÀÌ[ñ=ø?è?p9àÛã™j‡x‘Àá}xIÎßZ¤iß0~vº\ƒ0 ùêð¾M³»Õ‹‚@­b4ÓÜ1Èaàm©X€Š,¬ÖaXó‡ È'ž5°¹Ö°æâoϘ!s ದK8ƒ QT€ á÷a—vä¤%ÌZ.K€8°Zÿ¨'ˆK´7õÅl›õwˆ'³d_Ç\X„M€ÈÝÏô»>¼ã·‚,Ö—RåØöñçt~ùu×ê+ÑnÏ@X:yºôMˆ kýÌòa^ÂvŽ&Ç»°¦÷Úk¯ùír4Ä `ƒHž~C]o%w–Þ|óM÷è£zEÁ0\u_£8ËR ’4þ­³Æ IR ôt¬Ïç[&ÚõÊ+¯t-šÖs·\u¤'þ|-›4rWžû7×¶ESwÁàÿx#XÍýÚoS×bÔ×ú˯]ó±?y낳ºv±,S¹´56g ¬"Kt˜ÆŽ}Ø„¬¼HŸì|ÕW_Ýи>‰§Xî¹çžnë­·öÛT_xáǹö1a¾ù\ÃØ¬ ­{;†ŽŒ¸‡ïÄ{ Óò©ˆ*ï‚Ä©†NÂpåËΛ /¼ÐÍ™=Ó=1ä×§GWQ°¥ßOK1tgž¸§Nülà.ºþ)7QýãmÑl®2ò­$ÁbõͲçño1ÿó¸Haû*ð!rÓIk©?_=”B|½7ûêûzÉEì_~£š"D¢O:c…P•ç…Ù4ßÔ%„£À¹§æ~gΚ©&gü]:ûÑ’~ ŒíwŒ«zÆxjÏq m,æ>¼ŽÞGß’çašÄÍ…Fâé亇n¤ôU/H.UÚ$è®§‘Uœ1á[Pá&`@JI3®4q­ÓĹ”ÅÏJ³‰kü`PX­ãÔ“ÀÒ¬ŽjÊ-r‰ÃXVÐI¶ÕÙóÍl= fpÖö^U)udV²¸NJ,óÜP?`~Û6î‹‹ÎòŘ׮­ûøÆ«ÝÚç\ì ú­¾ùÖoìúÔs^€a½l`0ˆ%$ZÐb¹¼_…2#]b?<úÆ\Ì)ïAÝ!9`&4 ¸¸¸ C‚Á%BòñÇïu_X~@!‘Óa&CßÊ( Æv®`Ó©Jž¤‰>F®™qÑ×@Bd=‡´ÊN0t\pß~ûÀÍǹ-×[MS×òý¾e£î´£wq ¹s=æf鸥_?×V}\K_Wea©àc-—Ü'fr°ú',*Jpç™!£_—!0Š},U@yŸí…; QT´Ú jA¾ùéÒsÐäPø¶P@òÏ ¯¾& ¡ªY†i¥ºöK6Fªý¸šu3ã(É”-ý†ÁÆ\ÂâÈÞ3¢˜ýñùêšpö½ágqñ³ëеñ-L+×uÊ-ßtƒ‚Ambv€ˆR™qÄ߇Jb&Âà˜Ø»^°üâ\°g\ãǺ¯•Ÿgøqï:t}=ƒSåO—¦Ó`áC¢±,€²²gâÀ @$˜…BÀx^ >#:5–h˜‰&6y£\3@Û†õÜL–[ÙØ3Nts:þÅ3_x9c!Pñ›ŸàÆí¾“ûYŠsô.3, œ”e*òç|ôXïG? ׇÌ{0°a?† q;uk}*.S¤JH`„`‰‘¾†+˜–¸·k–VlPâ;Qa7 K”“x Úf¨Äê¶æ]0LÙH# xòcF}˜Ò³´¢ñx¿óÏ?ßëP\uîþnÿ=6—Œ9yy«yã†îÔ¿ï¬/¤ž;w&¡ªç¤‡ÒAKê|n–¾‹w•÷`õ'ÕwøÊ)´r´ µùžö·„W ߸(ÜFX"dÈŒ:º¨ðÕ2¥€ÉxHˆ”AÀÔ~c0륫²Pˆì˦XÁÝœÙs2J€ê;ôú–)N3nF‰?>`élÝú#®oéd]ó'.½ý(ƒ}§––}göÌ\üYÒËRŽõ ’µ²<[>9”[›€åi<*âÀµ¡›J§’lvdþ¹Ü\D%)žu‚Ð¥a£÷”?€r1ðRfÂâðN„Ã/Cô‡hÙNÉó$HÙ)’¢WÚ]­½²ï?8ZöÈ#.†@@€òår-=«Kˆ“iÙÃ@Ìrµõ8"eú„'½ÝWuïÜw‡[в…Ÿý¯yÙ5Þ@Ðð‹Îövúœqž›·|{7k….VŒxWíZ®ÎÐÖC UäM_`ë_qq±ŸEìÐrV¿† ægÒ(Z"­ÊÇêŒ0&€"o€ç€õAÂÑ>¾ßeŸ…}ÍÂûHÙÒ…É ]¤+"ú ï_¢e[B°t sÙe—ùå’·‹;ý˜]r‹×¸¡$'î®÷«çξêQ7Omq…˜€šñ_-‰Ë»:¨_"D3j ‹X‡ÜŸUVÖ÷ÙÛõ½°“ðD¡Ø#o±Â_ˆ)£kúPG…ß Ó… ¯þ(̙Ε+DŸy]*Íæé?ôUoóÅ»sËfj}ÝÆ\žÚw“Ö-›âÒø”þK ¿$ÌwòI:)a…ûs1j¸¬‚C€ ±ÊÆŸÙUʵ_—ù6‚”ý±|£.C?îm{¢•çVC3}\.½†«8¤sˆÏ1Â5 ¼³ÿ¤m,fCbíAœÊ€ÕL³Ó1cÆxB”')M>rÓ`Í , ,47Þßy;7½WO]3Ôª*¬OøÉçnÅ{ïußy„›"Ý´À»@ü8Y1Ë0II`ƒÄ“™4ÌU.ûqé§ JÑ礟ô,6z3‚Ùg–_`Ìr˜(õõβé°,€$ÆŒozèСžÑ9â¯[¸óNÞKŠ-)IŸ–Î:~7×®uswÌy÷¸zÈÍSšÅz4X8@¸²°.¯±‡ß(¤‡ô^ ÜPØL)HYK ™ füq¼ÃäBéÇ „÷ ™ñO¦ÔÔ)MbiÂ0® Ðgã'K¦¡ bË%ÇX sJÓUBôÓðÞšË3€@xoþ¡Kþù*2æ¥øÄ‚@ƒ‚¤R€D4Ø÷ ÒôA¯(PéÌó¨¨ÔKa^60G;DØèá3:ª,ó·4H—2sÏ+ÑYP*Å\KG©i`mwã7®0[ÄÈXµC,ÏŒ<óŽåۭ„€‚a1nÐO °Õ˜Ûay÷áMƒÜ–|Å«Uåõ$«õT†UŸ|έ0ô!7îØnª$ •Þæi›m¶ñ ¨FDôIÀûÑGЀb^\\ì¿úӲʅ¢K?”‹å\Ì7áÑ@GÁô°øˆö.ÛôvW]p°kÖ@í‘ï;é8lÿ­¼e›£Î¼Û¯ï§J鸬*¦’ùò%&¼SxŸõþÍ„g תf¼`°_<_ Ë ¯ ïþ!ŒÞ*¼Mø»0(D±òÉÏ3ù6Óç›BzJß17S[å“ä› BظºÓ¾1sÍß\ó7?~vçV†ÈÅd[Y²®DhÞpeÄ;ÿÛÚ´PÑKã|*Üf¹ÖX£U/F|kp\Ckd»ÇŲ2ûý¹pøù÷òiê[R<‚á¿(ÈóŒ¸5 ̨ÑDO¼âbÖ±YgÇEšeÅ‹ë‰À•­'òã}i³>²oZöèäJ“2  ‡v:Ä“Ù7ëo å>_ê‰Èb( KŠÄtÎ_àÖ¼û~×öÅ×ÜgèÆËf€?¥0æ Ù¯¿¹™Z>¨XЉĻ@©Ääø\}—÷`&ÍYÔ%í€T$ÚŸ¢å¯î{¾;l2ð.¼ec€Ë,@üÑuØyëµÝMWéZ7kL‡Ï-ñY‘Df»l»»pÐãî»I3Ü_CÖ¾ô¸×…H,аƒ8ï ÜQØ]P+•«½ô9Üxák¡Âl+ÁI#æÿ·p¶°2PãQF°t Tšöl@޾2|?Ihcsôy´‚xNXë÷ž{ü£C¤4˜¬%­”°bÊp£¿ÔØ– ¥2ãÊÄßfÒ¹Œ°D_&ßF°øÖàÖ°Öàv‹3;u{ƳkÊn (~ ÌtfÒÈ={ºa¼Ð¿º¯QèòÌJ±Ô‚è­r;Ê9WôÑ㛸+‡¬è~™Ü¨\0«KÄМÒÇL­õ\õAyifÛX˜3»ö³º®à¾=é7¿Më²DHR„ã'ºŽ?õú|¸ûꪋÜO›m\†øÃ¬uøz„ë£m†«>ö„kÄN$ )€w¡ ìŸçh`í\T,¯@@™M³» MœŠÒ¬ÊsÞÆ ¦¤ÿþ^$WzÔ?ü¬Ý£³»ô¼]×6b(éìU€ŽË·rGÔßÛ¼ÿº éÔTT¦ØˆÝ7¢Éÿ¶ð`!3ò“…j¤jµ¢ôÆ„LíÞ¥aE£Î§º„ÏX[x°²Ä_Q RLÒI Œó|ó6 È,›ª0Ù¥¤Äˆgc´Å·±›{»67 cסK>Ö\ËÃ\ó'Àr`>@swÎ'í¤°µE°*•GEšøßn+8•ÊL€H •e,ý°XÚåe["e5?\»' î § ‚@ P÷ô8YÞ=–…øŸr0ë¬,@¨7ÜpC¿¦?óîþåË$ùýOMÝø_1&“ñ^¸¨žkPTv(¤îÖ“C³Ôð‰N±c`H"ˆøÃ”¡\G<ÑÁMÜnëÌq™ÆðD¼Ýˆ‘2)|½›SÜÕ}uü‘n®¶FgøH Šï{L2ª†®ËãϹo¾ë~Ü{w÷Ëúëf!²—ȼJì/mÌ€ÀÒ –ðøàí£‘¬ñÎlÁ4ý€¨‚]4^Mܳ¼~åB? z|2V Ù&¸|›¦î¶kvk«?•mÚÊsÁ"·û¸Kþõ„{I`ÍÊ¥Rí±~Uê-~}¬ÜbáéB4·Ä~úª(DuØWõ…Òü¯é‚Òep|Kx¾ð]aüà¢yB!ŠœW–,«2~,%¬z?}ksu(U 4ÂÂ’©]GݤgÑ‚Z<«¹·rŹ•¡;y,P¼¡\Tj Д—0bÁàPÙ\€pi™)˜Ô€´­Áí:ldk|Ñèh”Íl{fåç>SÞŒ€ç\ëé=øG«ŸD%À\ºiß¿2áòݾ—kÇì3zôh/š7æ°» @·•f»ŽËÏwS¦7t×ÝßÅí¸ùT·áZ3Ê%GÝŸÙ3Ê‚(²¦Ä’úÏ?ÿ¼'¸ÌÀýùPý«ø­w]ñ¿nrÓ7ÛÔ}}ÄÁÚ1ÐÔ!ê/b(º¾ók.éÀ7—Ÿç~×Vº•Ÿ{Ñu¿üz×vÛ-܈#u‹t^AZ ¿@@ à·S"±`[ õ—h:ø'Ô5ÿ£ákêžrÁ`±¥p¬–^h–/`ˆ_}õU× þbwïà]ïn+ø>^¨r­¾r'·åÆ=ÝÅoíQ¢bíj ŒRIî^-œ%\CˆvÿZBSì‹ô.=É¡òŸ Ù»÷¾PŸÔ9O /ò¨Î’UÆN‹M ãÒ­ôÖ1 ‘¶”àñÒøæñ$ê—”–ÅÇ5`aí—r†÷H/ó¤~y@—<Â&­- Àz”Š¥ðâÀ*› ¬Æl%-X>Ö Üš.¢YB{f®åÃ=!ÇÀŒßûë–Lj´ÐtòX4»Î·,aSêc혙!DûYEnô¸&n§-¦ºß¦4rw=ÑÑMÿC&}aŒ³çÖwM£_Q6Gê f14ÌVø >¹ôÈ5ktØGÏZ6iiqsé+Œ=æ7f»þÝ€l{…¹6™6Ýu½ûa·¤a×xÆL7_öׇàÚ¯ÛGK²ûдq†£¡¨ë%ès„iò ù¡A’-w0©¹,kêµI?€ºGçý¤7ß|³WÞzX†~úõé–©›ðå«xÝHúǺÛ] À{J ùö²zìÇÂ{„ïáž™þÂU„ …øâKfáÆE»…0J{Žœ;…Xí)¬.à5j¢ €ÿ{Ñ?cg†ˆÇˆoȞ󽌧Ñëp<·k„Æ!]Àü¢„ßÒ¨`¹°Œ•½®- @{«àp ´Ê†0QÁÌ2òDÚù0¤mÀò6?»GÌLY¢³PžS`îBižÃ•ò§„3i«Á pï÷·Æ¼Ð²Zë>¦Xy{!ƒh#ò†øá›"ÕÛ·Rç¹îNè|}Í»k9³H~´ý±ž;é€ñ’º—ÿ)K è Ng­1t´-¬ ÖØÏ±ß>n‰>èú Ûo°XòüË®Á´Énò€-]ñ­C]Ç7ÞvcvßÙMÒQÄ^IæMNÇφ»¦2Œ3¾ßænÒ¡]+ú€iàââbÏРmÏ7Ôø›~†}0ŠÄ`cýµ¢<«ë9R#Žõ¥¯•¡Ÿ½wÙXsÒxF¾JeP}oл›k¯m÷MŸå¶UbËb›¯|_Þ-|D¡G5{O!S3+é÷ªHkªð!Š„“…T þ%¤? « ÁÃäUFÓ Ïó­xé)£¦'þ|bñµKx&‘ö×Ч“>ÏU°0®}³øq Æ1Ø7Éò\Ø,ßôãÂW¬«ð~™ÍÛÙt­R©X׊Gë>¨Ìš¶5º¹ÖØÖð0Ñg„±çá3Ê(]F‰Ò¯?ãf/HoY@ñ©JYH“u|”GOèì:¶[à|¾ƒkÑl‘[¥ë·R§y®i“EÞoÂoÜf}§—#þaþV¿ˆ wÜqGŸ®1ˆa¸ðéÑo¼áì&i;û¾j«6c~tyä÷ËÁû¹/N=Æ ¿â|· ISW|ª]¨§þXüú›nµ‹®q%×ÝåV¿óÞŒåA Â¥ • n¶Ýv[¿õ.W4ÊËû³;‚-HBX/}\ èýôòË/÷Ë瞸›;éï;WñÏ–·“”9d€'¼ßèÒ&3]Ÿ²»ðááÂû„(ö­(dP'Mz@ø' ŸþMx‰PÄ‚œS„« /ÖñW6y%ÒI ^°0TæË2T®ú?ß@ððM…cv4,÷ÑçÜãEò°ðF‡,n’›Ö<¶•Ÿï7Iòma"nÏÈ}¥n—óWÐ2å ²=ÑTH®\àó•@xòË3l\ü Y³µòÑÙl@¶ç–÷–†è‰^ÌþÌ-i¢ÙO艻, : ÉÜyõÜØŸ¸Ÿ~‘ñ“Uº¿˜èî~º³ë¶â÷ä«íÝÈ›º½úOqö’¦½^Þ×[ŽJ Ž¶ ²6ÎZ9Ši¹–xÆrç ¾f÷B93¶J¶Íw#epºkùÞÇ®]ïµÝäž=܌ӎwÄ€.V æÎsÝžùët×nâ!:Åî•an^Wæ™2ù‚åñÃ`öТG?À–™â’±.ª£cõ¯Ð~wÞy§gªÚswî {h»eFLZè|JÓSú{íº‰»äº§ÜójÖÚ«Æ)ƒÿ /ŽbƒàÂõ…í…¼qåZ]#1^8Lxiƒ^gCv[¿®j õz©Kl“?–O#ýäÉÏþ3׉ iÐ`ì´oÀ\‹ÍÅ?¼æÞ0.m Ë3 g~¡ mÈWMÉZæ>6x¢ú={ÄeAS‘¸ÄŸŠŽjÇÅýPF« Ä52e2¥-{ŽK¹Œó²g2Þ„N̬Êf€$;„]P À¸‰ ݸ ÝݹÛ.[Áýoå~ÒÐuc°f7”ä251w~}ItSöÞê‡z¦°ÔQg=šr.…FúK„CIxlu£-iŸ1Ûnã~[§—ëþÔSníãOwS¶ïïFÿmo÷G‡ö®Ù¤É®ç]÷¸–ÃÞw£Ï9ÕýºZw×éî‡Ü:™°Ë•Þƒ>†nöÐÈuj"ÙÐ^qöxFzÕ ˆý9¶x‡-×r·\v˜k\C?•(`⎮߆«¹+ßûÖ¦øÕ¡ HÍ2¿X8W¸ªÅ>˜F`¡Øº4Œù „‚ß„'Ñ÷«†5¥šª·#Å”ïpá"ÙîÞc¥:s– È\'õm–Z‰ŽÉ„5´g¸æu£Åá¹ÅãYxoþæV†ÈW¯ME(Â+Vi–X€µô±@%S™€U8×ùJòÇX~¸!PŒSP&ˆMÆÀfhmþl–’Çó±«Kfþ 81°$Á?&hA½ ŒÕ=Viäî»®£ëÜ¡kۺȽ÷iy<Óý0®…Û£ÿdÿîþç:ºoÇ4sk®:Ë=òÒònüoÝö›NõEzð¹næœ"wì¾ÔKëÚÊËGˆÎA¿~ýüzô;ï¼ãûKR{ñ®´çç:BvôèÑÞkë„§-gi‰á³£ŽrËoÙÏu»ãN·ÒãϺŬ5è&×äë‘nQ›V®ÞÌY®õ¸ñ®þ‚yn¦NÑŠ“q‘i=¼¾³…*[t›aÙÀ™;ÞƒþcRRRRz¾³¢\ Z¨€Q$ :…}2.¯Êú½üòËŽÙÿv›¯éîºú(×¼‰"£ï^ÙÄsÅS½4\²Ðû÷-ÝÖbÞTØÝr…ÏóÙ<…g½ýAáÍB¾Õ¾ÂC…0zK?ê‚ð“6éü(¼WøVö^À ÀÆÂQÜ,cˆ¤ª±PôÛúnØe$¥™1ÿ—Ô×T©FŒù¾}xâd1,²ù…nøœkž¤iôÈîÍË—Gù |% ·âÐU+ µèPQé©\Á¾|uìÔ³Šò‰>'O3t­¡ð3Ê6$žöÜ+óé9Q–Kft,aÒv¿?£€×î³&Ch^y{ŽkÒ¸ž;öàÖnÿ;¸‡žúÉ ÿ¶‰+Ya¶ÛmË)îËï›»ÿ¾×ÆõßhšûYv¸°ñ4Í "DÖ̺´ûÿwÛm7OØß{ï=_ïÖ‡"Á=ÁG²ƒáfÞì`éˆð´×¤nÝÝÔ /ÒÑ¿ºuÎ<ËÍYâF\v¶k>ñ·’fþn¡‡FÝìö:‹¢&S¦¹ÎŸ~î:>ý‚[ز©ûöÈÃÝ I Ò}ý€ 6ØÀK(PdD¡5é=¬¼ØÀg  (YhûHXn¹å·n¯Ý5ì:vh­2w›¤}çäpªÐRžõ“ ÜëÖj7õoÙÀÝ>c¡·¬×(9bª'ÈÕߢh÷¬ž„{ ‹…… „õ•ŒÆHá]BöíEj¾à am þ*F´xxU?,ÐΘ&b,½ø_ý˻ٱ7)w$Œ©Œö=ø17Ï®£c»ùÇ¥Ë3ƒ€…5?\cpC:—^Ô€JÒó:Ï´HóâVñ4h¾Kp4ˆ¥‘&¿hsV*Š)Ì-½¸¦oÃü¸9áŒÎì1Û©,L©«çËx§ª3QÖ³“fÞ–þ¥§·sï|ÜÌmµq3…uî«Ú¸µWŸïVÔ"ëewvuÚ. Ï'¹§_oïZ6_è¶ÙpšŸ•Y¹\>Æââb.öP˜ËU&žqÈVCfàhÙûv”€™«–¸ßèšÿ6ÙMíÑͯwO쳎[çR-Ï.jåm 4#ñ—ïG¹o¼ãZ½ð†›ÛkU×hŒ$+,ïæ´“°ZõÛL‡ÿÌ£QÎî@¢~ÀV[må ; ìîçhxwöç#Ù`i„m‡„§/W8£ášk®qÚ4q×_rˆë¹Jçê#þôÅE¾Ï–ÒÈŒ¯ÅhI”-~ûÖÜiû•¸³nÓ1Ìz¡>•|)TA‡ ¯~(l#›¬Ñ Å5 €³³gtʆ~!µÎB7$Ìb‰¦-–B£æ°qþIßÖÒΛ»´…}–¿2)#FŸ =ñ ³Å~ýú¹­·Þ:•fì~»¶tï~2ÏpÒ$Õ“¶VÖÙwœäN¼Äùm[-p—ßÕÕ ÓÁØ8`Ç_sn´w  §3‹ÆJ é$½/þ @ˆÝͳhë–n㙳ݒåŠÜ¬Õ»igÀ\7gÅήé¨iX7¿¡ÎH¸ùN7cÀn‚ ëkM³äGÝ’æË¹«®’™ÌJBU$ær‘öÒ§‘X¿Ã~åAIÐè¡/&R™×^{Íï–`‰#_ý–Þ®¼òJ¯4I·>ðšû÷s¸M×[Í|ôÎn‹ WOÔol!Uv/â'ÿ7¢¾ÐA{sËF\­K37 owë‡SÝ1zTÑ~úw‡…7¡°ë ®-l)d.V©ù˜âER“Ç«ÂG„¿ ›4i"æFRd`âùäÇËäÉ2Œøþèï¦à™€ %ê:úÖ3ñ–2 ™ñ·¬ t|öcs†ÁˆÖ.ñ†„:šRÝcŽ;ÊK ›6mM&ç}˜n΀eæ5y.5sW€ÌhWº¿ÓÎ8Ž1ìͼ:ƒã€meõ­~‘»ê vÔ䆰áã:Ï£2¤n† Óa²œ,µx+þÛŠ÷Í]æB<ÍED*J"óì³Ï–Î0‘šp8ì8 ‡sü˜Pë–õ¥$ø1"¤s»uÖhìxj‰›:ãwwâAsÜ­ÿÅué0Ϲ×D7sv‘êªÝ…Á„$Ëy³ŒÃ6Ó l|€Iï ÁG?†]H°?ЦsÚ¶vï‰06Q˜yZ.øâ„cÜò[õsÅ?æÖ?ø)ý-pßœ|¬·Ðåƒ\Ëw?q?œv¬[ ÉÔ }ê–ÿ×`êT7f¯ÝÝ”ž"¢Ù¾á3ÈñC™©K$f‘uÿ¤÷°¤ØõÀLˈ¤Á{äÚñŠ+®ðÌFnŠŒñ<ýò§î¥7¾p/>x–Ûb}-K&ôç0^é5ïºPÄpŽDü|+½7ÊÂæ† $-Ú·Äm/@2¿^ƒV– ®JcÃørYãï)d$… /$áçM^’³ô1ú©ï<òì`ÅÖÇÏ…:¡i‰RTн°÷Þ˧>{/ÏŽ]Ÿ½÷Þ»ˆ ËS)êÑ곋€ô„’ïÿ›Í$›Ëݽ7ä’Dß;0Ù½;egvgÏ9sÚ¼+ ð×+e«+‘7ªdFÔ*¥’ÍT®ø -Üb©”ð §÷¦lMsÊ« À¿@€{ËϹæqº?R&ê;ðõ}¾/ëñ{}…¿ôŠ‹¥jì$‰á÷•Þ)]s-lçÍ«”ЧÊb·J­¾yhkøþ2‚¿p¬í´óÁUÆh׮Šýêaç]v´Ã. üË%ߟÃ@„û‰|Í—w…õÇO.8 ׂëª ·åë¹c¤\¡l¤# Q·b{o(éËÑ«Ççž{Ή {Ëøã`ëMØNÛH5 ®ú™×ÚÁ{4µü‚n6YA‚öݱH¡‚—[Ùl»q¡{®‹>ø›ŸÛc¹(‚qmû<Þi~~¾zè¡.@º>Á?€X÷ˆÔñFñÒƒ•’,ý‹w¦ñÎìÛ[Dÿ ¹|ÛJI ºßÿ˜5š2Õº*f<†|hÛx¬õ¼üFË:ÓæËÈoYóÖò§_­‰$'jØw3íF{‹~ýú9i ÌMº±P‡÷ÀûÂF€òQï²÷Üs5*²/KŠ—ÛñçÜo_|7Þ?² Ëa/ña6¹TÄïˆ?Òþ²öE6_·¹µ”æ ]LžUö}¨´£ÒfJÏ+ñå?¦t©R%°hr=]Z-à­I~a*¦Ä}ÖÕÖÖ/¾ø¢s—Dš”Vþ·iÊÔD6\YµÃrͽòUÀð83u—˜ÇÌgå’Ïý5Žá58_†vø’õ.–Šâ°À@ê\@mzýׯÆ/IÑ^÷×*u©6H22dhÞ¢¹í½Ïžá"Æ­,ìgyÀûÙ ×G¶ã_:OÓO ÎýuŽ\g²ù çòýo&Œ¯‹¾Ÿ”PÜ{’oÏHú“zz'Z?=Q«lÓXž:Ô;ª.«Ï{ï½×­¢÷ÙggœU–ëH^º¯5i\Lj! §môéa­šÍ”(z¢°£ˆçÂzvó“]tÔ¹+­yÓvüÓ¬UóROê˜ð…¤Ù·ëvÆõ x§D“Õ6öÔcíÛrô§’éÇÜzå.\`¿ýÞŒŸl‹zõ°:¹u­¸]ùÀ­² @ð,МéóîÖL„vÔM×Z±ˆz¦À<° ò%ýÃvy7˜5$ H60 {>ø{?û쳎Q𿣎¿OšmνÏ^|ôëUÐ^rØd²ªgçDü“œ¿-_b*Aô“:Ð2/×.:jm»TÆ€_)os%–Ñ) T«$ÖÌNWÚNI=s?›ß„ÿ¥!Jo*ñÌÙùqàÀŽ)ãý\yå•.®ƒ²£!ÅýQ™5|=ùeVKwVÈuÖáL1ŒÁÊßÁ©»ÀLÂóŠïÑã×ð‘ë>/ùÜG©ZöeÉóíqío'c]ó»–U)ZT+å,+Í (@IDAT:Y(üнǶvÑ%Úõ×Þʉ=­2ù2#¶UÊl’Ií“N>Áé,)‹\V¦ÃС}Ç uZhÛדO=1¶ ÿ’!àþ<îžT”ã7uG¹E טÈnb™YÌÄNp¾5Q#]_°Éèß¿¬Ë™gŠˆrGøØW_}5mhçµ»Ô³¶­êÚÆRìº}C»öîB»ñ¡FöÒÝ­i^;{]‰•ö÷ã&Ù¥´þødTžë.E<Þ ÃA§ÿ„ãM§ç1‰:HDA.ïÜ3Üôç½ö´ßq½Í•q`Q‡öÖñá§mÖ^;Û—·^ks¶ÝÒê,ZbËY)ðž•VÊ®Éhvì`Å¡XâìI ŠR¡¿Q?˜[ô ÆCA¼’m’ëÒgT7^²Ž>øæ›oÚ3Ï<“\%ò÷~™b‡žx«¢=Î Ê(æ…­,–ëžÞËÔ÷Èv°”â"Ó+…ˆds™eÈpÏíDÖ%-ByŽnŸ•ýQJ¬p.Wb‡(µUÊöWÅšþ*¥S•†ÈŽc=öpûSÀ ï²Ë..Ò“»ï¦g‘ ‡äÜþ¤ ©•íÇ–Ñ Ü‹š”$¢Oå[‹Íg=NŽû.C¹ääïãp9ßi(u츖m½ÍV¾ˆ;.]Z\i À’¥K\Ým¶ÝÊ6ذo…öb~À×V 2Ã*UºEÚÊ Ó–P>}z—êߋäË.¦9éÝ«ýøÃOJõé šH áIàé§ŸvôtÐAnÕÕ-òìà=Ë…F )êVúֹSgíÐÌFž¢Xl—-çÙ»#Z $ìía-í½ÏZØ>Û϶חØ9 ðžø¸1¬ÃÊbH ®Gƒþbà­ìÙ_ÀÇàOÜ|3›þô㶬igéá`eKœ×À2¹  §Ï´:EKlÞÚ2Ó¨>ô~ìikûÒkÖdÇ~6ÿïç:)AšîWÈfþÑm·ÝÖBbÁŽ}¼§( .ƒ¼»Ê2ھͱ?ŠC^©Þ4œ‘æ¼m›¶6Oû»cO0Qúh[×éVd|3©^€1ý„J>R?;4•mÀßmjO½¶À¾ý©‘ú¶³ué°L¡†‹mˆˆ~¿ÍæÙÖÚ+¶Q ¡Vr\iM®´.k-Ye?ä{ñþy¬¢Ù'à믿vzÞmªqp<ÔØÀ!Š÷öÅÍš–Ý"!BË_}­=Puó&O‘”@»]JŸ˜«ðÂë?ú¤µüM>ñ8ûéðƒ‘y â+k<éÄÏEo0~üx§ºˆ²`[R¿*Ij.£Ÿ§*V‡pZ4›‘Q3™WøåómÄ·…v™j€-ÊÑifMÄ•I"»øRé%É5œ­Äõçœc p纔˜ÓwÞygʼÐŧuŽ@¡6Cj$µ†{¼B?9ñ©Øß3©psYWô-‘Obî‡Søº?÷G_®¬Ð y, øÆýwÞY È¥´„¢´S/§ EªšÑi˜=n*<Ñwƒ¾6fô˜tu+· NÑZm`Ê©FŠr)¼//b¡ãêÈ|¡\µ<àÚI2iÓO’¸#íxá'—®¸‰ˆAK‰;{ɯ”Þ:SQ¶& ² À£Û5w͵ÇnnkÄú«Ot¢¸ÎAT08c?ÿ|Âeý‡¡e¥ºóÎ;;j³fñÌÞ ‡åÙzÝêÛð/‹ìˆýšÚa{5±S.˰ÔÚy¦ž{›¿ Ç娷¶ÙóêÙîÛ̵ݶ•§V!¨vØa›¦~ès㘞Ä+{ˆ->÷HD¸Î¼Ñ›¼ÕæVG¡„ëɽNÃJ´áI3µ½´C[–[Ïú<ò„å}0ÂÆ^|–ß¹ÐIêV˜‹ôff€ $®û÷gÃðáÃÛcnec'Ù …GÆ‹cMCñ²•öƧÓÜÎ(ëfU{Jå½eeò‡ÒçJ+-Ö{ÊÏÏ·k/¸À‰ûñ¼ˆÆóÏ?o#GŽŒ+6V™w(ÕëXR^ôÍ€œ æ(ó”Å”cb¾feyþa<Í5|Ý_s™IÜ7[ZÇ×§È:ëT(9K„±‰×ê@-NðžvÍ€¨2ý®ráN¯æyZ Ü.ˆ $¢jß{ÞÌaöl½ Æ*TˆBOá—^¡‚~„'OÔ¹G¨Á¤ P’ÃýLB$Ðû¯ÐУ: û8ãÁä›WÃožoe`Ä—K$©ÄÖjL§_Ç-³üÎ9â†Ë·ÖZkÙGa›m¶™-³…­ÆÉ÷âÙAtTµ±ðãvöÃm<;hýøÛr{â–Ö©m}{è¹™6k^Ž(Ï€¾=Ù}/¬e£Ip×­ç@{ÕGƒ“»±Êoú„•üž{îéVù¸tÁÌD=/®?—AõÀ1g™öý¡1¹›;d–°úL´åò èóðÖà·±öã—Ù´>½VéGU/p¤HZ ÜÊH-`ZFŒáTU½ÇÄ™ÅV´D—­y3nÚb{ýã©nC ÖêxU)=†*¢ô¼Ò2%ÞÝ…^hp@Æ+<@"bƈá6¥ñ1ejKVUëjI©3œÖ7ñÏÜ0 öî[suË%\ƒ9àNà#·“;KuÂÀâ& KeÏ“S§~øRÆç;wqøÐß¿¥ŒÔ3€* Ø*‡é3èÑš(2]"ÿ0¬µV7n\øRÚs^àײmi[oTb®·ØIÆOmࢠ²«àûŸ·°gßng#¿k¦¼œañm%ýû_guœš¢wïÞå+ûäÂ¥¿z÷O>ùÄ14ŒÉ1 ¡±'Ä\X=y|­½ $áúæú«lšb ¬p,Y?_Ab¸«m·ÝvN:ÃFCÙ€ÂE+l^QE„™vWiC€Þûb†MŸ·ÜvTfU¨Oöw¥[”NPzJi[I} äÜC:ꨌ‰?î•>ø ³»P3Q0Bð¨Ê£]íñ­ô*'9-µ(ÅÏQâ*–Dáh«ýѾ¼?zåó9 6 õdÜ›ÆÐ3\¼Âù2{âOF1’ÁôPed°æÙóôƒH[âÛo¿«Pfƒ 7°Áo¼å¢Ê%sa †~°¯zÅ-oŠÑÌ‹üNQ›¢À¿øp>×xQ p&ç\ãœk¾Ž?“¨”ÈQN ®6!Ñh>©éŸA0aòrûù÷b;öà¦6ld‘]~ë7¤µ»äêY˜}õ­¬óÛäHç^>ÕX}Ht•±¸ýöÛ]Ô»ýöÛÏíØ~/áóÖ-ëÚÑúö—ßaß³+Ïí¬„ZÛE7N…ÎÚv›Ì·'·³)ÚjxãuÚ;Ã[ÚŒ9õlï~³ã„2e·á½b±Ë*f·F¢ëáÙWðó•Dû"Ã…cù{âñÖªßvÚQP›±à† D÷köÛX[ u‚{ÈIù¡¢H#.¿´0óÉî~ÄÈ&Ì),¶üÖ«·"Ê´s.³W>žb]T¡g¦•BåÀ Xô3òg”÷óÔ>ø`;õÔSÚ'ÕûT‘X:t¨=öØcqe0ø»^I–’ ¨ ØÕ/Xý¢-šÒÍk½Ôï+|ž.u|"s_ÆŸsŒò’%Lø£Bq¼ ¾=ÜXTæÌ]¡Ê„¤¶+dfñÇŸBðë/¿†zõ^_"Ìú·<™ óeÂGvM{ùå—l»í· _–ÑÙ$›¦í\«LŒðÄIþL6¾M8þ1ù”|  ·UpD([g!žÜŸ1?,µyu­Qƒ:vÙ-s¬çÚõ¬iÎõεï~^j¿q– ¸hº-YºêÇåíÎ;ï<Å.NÄÏ}AÄØ\uÕUöÆoþêéàôcòìÙ»Ú[§9öãïõì³7´Ã÷͵s›Ø/ãi³¡e¶ý¦ó݃£ä.˜‰ |O{÷ïìw€„)î½Á$"jdz¢wÀ™Ù Í»âȨ™mrÚ¹Ö륵ͰF*æQϨьYÖú»ïû¡w7å9zjžg6¡…æ@û¹ÙlrÕ¶4þѿη‘?.pQ÷*s7ž×£•pã;Eé_z7'ʨ9öÊ+¯¸=#ü{QvÆ€7Ƭ0V1ðŠò†Æä×¶¬AFÎP’R7Äi@ŠïÃ?0f<ù®N)~ö¿“¯%ãkßFª#uùÞ}úî»ÿè[.ÇþZYiûèS«6å’iîóﯙ™kþ ‡í¡™¬$RÜôo¿ûƹaµ¸ =ðà¶^¯u¥ï̯Pì»$ÉB8ÓOŒTG^O>?ê·»Î$TãÌYïÎ7¤hŽ–º5iWY—Ï??]l­ZÔ±·Ï6DïÛçX¯¹¶`Q‰]pÝl«Ÿ[Ç5¨Mˆ¼}ÀÙgŸí æÊnqÂsyûí·íòË/w„tý]¿[@¦ÍÐÖÀëÚIGv°ß§¬e­_b¯Wdw>Ûцg ä!G/—h—Â"…N ŒUñ¹Gº^Ù§*aA\ˆQ$.wÄHÇx-èÜÑ~¹v å}ò¥mqÒ©ÖòûŠq-Ü}„;|ù•õ¾ô:ës߃ÖTžq€ßeýĵÎÛu³ÖŠÄ¸fWÿR¸ÚSoO´&r7ØD7Ïäk‘ðÇ0!Fö~ŽÒ¹J¿+€±+>üðÃÎëC—W^{í5gçÓÀTåݤTQ†S¡dUƒ>gÕQáÛ¾Lk¥o+ŒÃça|Íyª<_&ÕÑ—ç{_°`á*ªèM6ÛØ¾™¹C÷øì³Oµ'Ç:eƒ7n¼T†%e™Y>á{¨i¸*“üüÓ϶ëî»8ÄJùvíÚ:ÜáÃ?uK¸ÆËau… „?æAo ’Hf=Ûs¯Ý½+såxÅeW¦äÒ1ôB¬‹o*y³’ã˜*ñR=`6ö·±¶TÆbìbˆ ‚aJCÈp_‹óÙ³¢™_.ÛǾ}û:pºv-.±ûžžg&-·½vllžÒÂxf¾m·y#{üåBéÛWÚíÛØº’ (8–Ï+u«úø#ë¹~w«Ãg¿ÿÞòøÆÿLw¼:]¸ürÅl\©ZGôÎ[Cìð#-ëÍ[n®—ÜÙÞïCûø“mÈ{Cœx=!¤H  ˜„£9BeÖ+«Ã ~ð 7µiM4²÷/¹BÅÐò£ÈÞ×çèŒý‚;&ÅÛH²å_6Ô¼;EZP€>˜Õ8“9fϬ@ÂWåAî¦hð§žxÆ7µÆ€'ñøcOZÇNkUÐåwGÀqÇ£•òl›-UÀréd yÚ`…èœ'ÃG~lÏ?÷bòå ¿ý ®p±ôv}™ðÑO?Qø­‚®¦›ÀΚU“‹sVÄ©nPzvkð[Æum§vн}×N96äɵDÄNÄÿíOK®ú¬vÇ­­Sûzv¢ôÿKå"xÞ ÍíÕ! íÒ[f+^@;÷Hnyx®Íž»ÒÞy¢ƒ[•‡oOü6¨!F=Ì@ÜÊ”÷ÁF>èoÙvxÇw4V·Q€ÇÂC7´µodÃP¬à;=×ΕíB›¢ø~ýõ7­Êu{¼…AÚo nÝ•¶ÿ޳õî3{/ /ú€…=Òœ1cƸUDª9I?™3Œ÷±±cÇ:iHÜô€Uæó*=p·ÞÕÜʱ±{í¦øÚ ARúó ­ÓW_[¥Ëlö:67$rôÍ€¨HD $!C4^Ò úƒ+#ê ŒIŒ/ é1¹€®ú‡ÀFup•¯~6a™š¼ù©_­¯í®”üF”í6b™=X ¾Ž¹tÝ)§Ø1Çã¤,º”UøòË/í¡‡Šk“IuR¬x ®Ì[‘VCgÀŸåzÿÒó$¼¸Ê·¡ïȹª®«ïñoéo®…õùä{&=ù^ü~ô‘Çí’Ë.r®µ¾ 7Ú@ûḵO†ýÓJ„ë;vìähj¿±ã~Óï¶ÃNÛU¨ùÔOÇöÅ·Ÿ­ãŸFàüéˆÏlm!°0ÇE«UD¯mÚ¶±ÖmZ;ä剰¯Ëñã‡ÚÍÿ¸-|i•sT Þ(hÛ'ÿ;¹!&‡Sy/+vâ¢ È P¸zú³pQêð´SÅ Î37¹Ùjù ÂßÿýÓ"ÊF %m¼ûI‘M˜¼ÌJ°ãÖìýá‹lÐû‹,·^ºäZßõd¸)&àð}šÚP¹ >'WÁkÏoi=D|SÏ—w€‰ÁwÒˆV]3?+n> Ľ<«Ü(h/ìêËFû!Ò[‘hgo~”cÍ›,c³Ò~×ÈÞÖÊöÚ~ŽÛipè—-œÇ@»VËÔv9é)UJa—y@_Ð>¢~VÛÜ/pF¯"  ñ’‘Ï*uU¯ö»(¸óa›tê±6m“ el u×–§oÍG|a¹Óg[§W[ŽÔ s’¤áö ñç»B5ƒ×¶ Ä»?á„ —8\é"YTWHìÿâ{Sì¹!íç ’(LXhâœçK‰Vî ë}È}4–û w&ÅùW¿Ú?žüÝWžFéôÿäÞË&Ba¼D?žöE{sðÛÉͧû}uºqùј1®V æñâ®x­û·ÿÓöÀ{¹•~&Ýâ:˜nåO[~"øcrû\K|TåýÄs˜˜IV*  ¤c¥Vg‘PN["‹¬© 6‚yRþ÷è33…ó4·C§¿s©Ë߉Ø{÷¨oÖÂnyh®ý"wÁ6-s’¾çÉyò¨o»lÇÆN…C‡ó8'²íË/¾b¨ªþt €@èI^u¶ô=I:þu¥è¸ Aà¥Müc¢ŒÄ~°ïØé1}ýtG?aR•ã…úüäcryŸÏu΃É' AJDôRKQ]3šÚÉÍUëï‹.ºÈ¶Ùf§ÇÊôÆ]:–O©þ[6”=Àl7±ØN9*ÏfÌ^î¤øæc„wó%­íÅ·ØÛÿ\d-[Ôµ¿i—¿ Ö¯ŸÒ»ûCxXÁyû¶á…л>E!¬ˆ¯o¾ùfì†íq!¾Qå}ëÉkàÀÝ›Ø=OY^ÓÖr\n§>ÛÆüÔÄ~ŸÔÀ¶Ý¨ÐzäÙC¯t°OGçÙa»Í±Ë± O QƒxÆûgU1/((pŒXâ37¢úEö0=lï›Ò>@s²ë§ÿ²&_|m?Ýp¥ÛtHºýœžÂ!/b"–ÀLÅv׳i,‰Ê|­NêŠq¨S¼ÜV4j`uë×·Md»Eüý3òGÆpÉ%—8cLF‚µmÛÖe³J#!µaUc0NéÇIsíé÷§9F¦ G'=S ®_ÐT6yÖ©uIóX^}Ñ1Ì02ŒÅN§ÌXbw¾2Ñéþ‰ü7J Ò;R ’ƒ÷ÙÇõ ƒÒ8æJųHiˆøÇ»‡•‡@âÏ 5¸H€z®èþ‰‹Ƨ Gÿ›cPÀ(ûëaBŸêÜ— ·áÏãò|ޝ‰}+fû”ÓNrRK5q@»ìPûðCÚßÿWtåÅ÷pݶBÃß\…¬Ì úÇø¢U«ÀŸræÌY6úë1nŸóÌ[ J²ºA‡ ±ˆ\¶|É„S‘ãÞ…»hñ"'öA\ZWH8GõrÒ$™«ÕRªIöÕ¨¯mÜï㣺P-×!Tï¼óN쳈ê+ûWÞYd½<ß žphžkcÛÀTy 4T¤¾úv¹lð hÞ¬ŽSùçgEöŸŸ‹mÃõsÀ‹fZ‡6K­p¡âhÛaöØs»9¶ÞÚEvÓcí˜}§[ß‹¤‰%þîÈ\0bt—‰+ ã†òa|ÃD'G+ðÎAÿ±Ùæ¶BF°%9u­á´™¶27Ç6?ÿ2+–øqæ¾{Z«Ÿ[Þû#ìË'ï±¼_ÇZÁƒ[Ý¢b›·ýV÷Š‹­ùV[Tèc¦?Xý³ßÄìáïÀ·AÿQ‹!-Àà‘±ÀÄ1~Þ‘F²èÑ©¡mØ£™m»aKëܶ‘tmlòr­~ƒºö‚T G_ÿÇLUÃXÕ¡bA-qâôcä—êÞ¾Ù<òüa0a‚bà7åm¯Dwÿ¬€¶å…êîüÞ{ïeHŸ^\,û"¢-VZäËÀ¦Êñy2’°9Ò½·kÛÁ-^P¹yÜÊ»ò |ABïN GÉcÄ.ˆy”+S@€«:QkÛwh_fȽˆ=3Eé×gÃß¿J4¼J•3}iÊù7—¦Xõe³ÂLÇ€¬MÃpî ž0ò €Úâ%‹ ƒÅ¼¼æ®^ŽV>uHp“«O!émŒúòk?n|õ <âN Vü£ÓyDT·EE+q`+­ò/Á2t‘½ñppñ Û@v7^Ì:Î쀓¦Ø®R œq¬tÊbXPyû‚¨¶Yab¯€wÀð³OU‡½E‹n˜P&ðÂàvû£óìé;ZØ”Iíª{ pf7Éž~³Mž‘k?Ñ”T€Ý·è»@L^fS›>ƒŒVî¯æS€Ô`&±2Æf%°Ñ57Ù²­ì‡sN²uß|×þü›å nóûoi¿º¿m|îeV¸Íæ6MÛ wûáG«§=ìm™Í‰YX]@m1xð`‡4Y‘{œª=úá!âz¤H:0¦ÃÉß+)ì {4²M{6·Ï¾›m?ü±Ä5‡ëûH™ì™ªU¹ã²ï¾ûº~Ç´sœòžŠÉÿ3d¡N>_ÝÝcÏ=Äì Àâ"'MbÞxbž<¿`Ú´igÛl½M£Ou¨ë“g’ÛÓ3¨ìVø¾7näª.ZTû=¬FûIT£r-”Ëk+Wï/_:nBøÁûIåL.˜¼x7I5ñ0 UƉ³dš€@HT î×w^öÇ×+»P3'Ï=÷œ»³Ê ®dÚ›Æ$nÖüg83f¯°#µcžå6xÑ©-µc\ÐÒ×µu×?þ|±=þR¡ JlÏÛaû4‰dÂöì ˆ}"Ù(F€÷}ôÑGÝ®x¸ bà–n\H)Æü¸Ô.¼¡Pͳ9…ËlÀ!…6V¶?ŽkhGï=ÃFÿÔTîŽ l‘öøú‡¦¶ãæó¬wwÂÎÄó‡~±K»‰áKÎjäžOáVã@ ‚}À&›lâ(ˆÍÛ ÏÝr3[ç÷ÚÙLÜXa‹'I'Ÿ×Ø~=â ËÓʦNÑRûåP­TvßÕêÕÓ±é¶Vò½©v;øf*}„Á:î¸ãœîýé§ŸvvQ†w0:0q¸žbãáé±ÇëÞ î“ÄzÀ¸Ž÷ûâpl –;‰Ô¹çžëÊÂÕ Ÿï¾ûÒÿÕ·×j¢Y¾g9bËrÃqÍù=SœU¿ÃŸåj€G¿i,ë1(õø2/öv¬äY £Ç€ñý÷ß É a%¸Öá[mµ•S ? Šà6kZÇn’¤Çkîší6>:þÈõíÐÓ&[×µ–ZÏüÅvóã¬@„úm:Ï>ÿ¦™=%ÉÀYGM¶†ò$hÝ":p‰sÅ[ß³}0;&bd0_¢"‰}ÞØ@TÝœ’ÎtÂý î+ÿ¾‡¬ÛôB[Ú­³ýpõEÚO ³Õa~*„s/Wi,ÉT‰ô‰y‹,¡ &rM‘5Ýp+‘*ͺw³„˜“Ke   À®¼òJ·¢Ç 3Îà•ºtÔ0f0¨áx¯Ï‰Ï„qfºHeú\™²øy§‰¢ˆ˜â ¥Ôn>•¹YÍ—­ °¸ÔÅTѼ7ø48úÇã®ëåa<þ Êmøëäùäë§:FáçTe«ùíÄË«ÔtÆ•/WÉ™\Q=Äí)???Ö º)û£oß~ÂaÂ"¤e“ÆM‚w¢ºh}©ô[”On‡•ìüyó}³5~ÄU*„&¹¯•é~âl¼^·úöôk ìY¹ýb‰ÿãÀ^·_ÑÆ¶Ø°¬ë;‚£öob7Þ¯˜ÙÍëZÛVÑÓq2:`Äû|èƸ˜qP¦§h"iÆîý;†Á.’ëãb»ëʶöþ§9öÓïuí¼c&[AÇ%nŸ?´ëà~kì ñ,èÞuqÙ %îyÑ_Dç¬ìé:s\‘¢˜ßÄéúpDãnÜš`ó;w²É{ìfÓwégãÜǶog‡~j ¹ø5Ýok|ö9fw?d‰Ç%ámÞÄJÎ=Óìò«,qÅuÚw‚%î}ÐJ´ÚMl·-¦úþvÍS) «ø8i Ì ã6l˜ó(`uj€÷Dbl<žOM.aØð¼càQå‘1_LÁ?AÖ†êãÕÝO˜Èš¯ÄåX.W;¾QsÛ‚p,#‡ [¢¹Ú ACÇ<ò-eIg<áGúÄy`£ŸÍþµ ñ5UéRå¿æªÜ-u]¬g²ï˜›ú^]õ È&@H eœ8&ƒ›<ãÇ)ðO°iLn®tÇÒiº:VŒ§‚ÓŠõ'+Ž{mbøðеã[ȹª€ÿýA{4q[ }`S·kà½b¶Ù´¡õß2Й½"b‘é–Ÿk×Þ3Çm=~éâP$€ŽQ3HÂ%¶Æ¸·‰ t®çb´lžk·<\d'ÖÈ6^™ý4v¥½òAÛAnƒGI50oAŽ}ù]žõצCu3´ ðã‚ø! @ßnC¨8F€q GG*À<¦¾£Šø—z¬‘Íÿ×H+xæ˽úrK\x¾Ib‰w>ñ?ÕL CâÜó­ä{,q×ÍV²íV–8ýïf²°u |×*uäYò.¶ß~{7jÔóå}0F‚ ±WLsæ®¶+6ü‰éÊ;V©fyÄtl5³$²ýW³îjW[[ @»휚(ˆÄuwîdB§ºßHýú Ä8tpvKä|œs$±@ðÒW ⋸ñ²Ï©… bEq髵¸@ݯYv>éùPÎ3Àr!,LjʹEƒЄÃ¤^½ÜÀøÏÑzÕS‚11“û”ÉSE¼j€±Á¼õÖ[NüНxÜj.ùY¤ú#IÆØ è1Šx.³o¥kïQ+©Àb{J‚ãɳÞ\àŒ 7êÕÀ¾úf‰½,ïì ¥ž'ï‘2«P$*|̼«TÀu:g Ñe“ @©€ Žˆ ˆ·Ãü•vÎ -m-Eøºñ!xÚ ;þ€©²]XalaM>x‹> Š3¾¡}ós+^®¾å±G@в$–{¥êýbE#dõ âJ7"÷Á€ÂÌ ZpˆRó¬e^žuÝegË‘¡]‰6®Q8D³§Ÿ·ÄNÛZⲋ,ÁΛ>-Æàl³µ Ì´$ñüKЏÓËLYU I7Ûl3·e* WœÁ#ï†v¨Cùóª:çªÒê˜`&(’M"ÿU`¿ê tÚI Æ®€Ûÿ,×ÜlXÕ«Ž–hAU?W €ö¸ð†Ë~î{&À~ôuSù†j)€Šé†T}ÎôZjÌ–iíì”;KÍ4ÍNSÙi¢‘ŸŸ^ÀÝ@ÂaDÌ9“ àÈä™ îÝ“±‚l¯òLj`@FZ5Ä`î˜æ»ž­úçÃ?t"6t±Q+¹Uk¥¿²Q¯úÆO¾Zh#GÛA ,ÄV¾Ï¾¾Àn¾´µt„ ðæ­´?/²OMðõ÷: Îu‚qR Ü‚ø˜!,QÀ{ –è[üÚ‘(„ßs¸.ö;o«w+FäˤÖXd×^ÐV æ6â«ûð3ÅØe–}ûK{ퟭ¥ò©c_ÈF`‘‚õ,Ôc`èÅ!m­k‡¥ŽY·Ï9s‰qÐDà .¿ fT¿¸ŽôB ã™÷Îp—=H :ŽS¦š²¿%Î:]¡)4Ÿå­RòÛ¯–Ð~%Í${åuK¼1Ø©BÈe àB6æS§ú·ræD|cxÚ ¥ ¸SCCßaÜxH6`h`’¿—²~­Áæ ûNàåÿVž¸' D{1ÿDYˆüö­îþ´÷©0ŒõD; êÞ¨¯´g©K—hIœÚµkHÀôíPÖ¯ü“™òâ K°H¾%®ïéòj0@Œ%6é‘í|«­tG¾=Bò×èW0yô0Ëd€2@nN$P: @0/ÛÃˤ½›T¨‹Rä{á£ñ†v›nºi§IãqeÊ(m­ìqdÞ­6n`^¯èzÝëk…Ý\6+Ýï^ÝÙX¨…Í”WÁ3ƒ íнšÈF-Þ”½1öH.@ä“8à=b€¤áñ+Ѝzì@ ¡Ý¶od…‹rìÊ;—Ú¦}ëÛv›Öµ_T¼ƒ¦ËíäC¦YþZKìÍa­m› çkÞ(^½vüe‚|ßL¨E³hæ„û2$Ø`'ûb& v‡øS׿bBF“ y$6ÔÊ^ jâþ‡¬ä‘§¤÷¿ÝJšH óù–xVR!akžÔý}¼Ù™ç™=#»ƒÀ?¸^‰¿<_¾3ˆ<«ü(i Í’‡}q°‹@-î­Dw2* B€,<"jr¼’Ä*)ØT£Ù§ºGÔ¥k·§ «~l*0¨îq޾o¨TëåäºïÃÏOô¦aUfÀ×Mut‹8명*€™êï©úœéµÚÀ¦Î†–™v}Í•ó?yâî#yâŸ\ÖO¶Fl1bbº6 ”{ÌS÷€WuÏ›•ú)µ‹º?ÄQ3D•ç–-h&C@Ô¿Ž[fŒXlWÓÒÿÝùØ<£ |º±­óþåb›5g¥¾oSiðË1Á†DmZÖE¸² ð®x¯2â1‰}Ä·¼Ñ£G;<«Ö(OTݺ1F|¹ÄI)®¿°µúO®ó ظW‰½4¤™³ ˜=/Wá…çÛÔ™¹n¯·œg›KM)0¤¬ì±€(EÍCÚ„Ñ5j” ì V½ÓÄ¥WYI«fýiÅ•xk•Üs—%¶¬ñK¾ûÞgh+RWòôc–¨•kH"ÒZv­ÒlÜž%ïo $.¨jï*ü÷†ž±l½õÖÕf3ñGE|;·)Å[–Å4PK³jŒh/Fí€Ù€9H˜|Òå;€s¥RXª½Ça` Lip,8ËKü‘ëqÀ{'Zg-d&¨ßÆõ=]^m`-ɺ¨ö@¦zìRªIÄ5§?š0ÞY©6Ô +§^Î*/ŽöŒSjŽx[}x_i¨ÒöJ‘L€òA!RVì&²…­mëºnuÏÂcÿXf—Þ<ÛýÞw—&bŠíú{çÚÑ6Ó35;åÒ™öù×Kìíi—Á¶å& S2ôÃ{F-1DÀ‡žŠèPžëX˜ÜÓÙP§[~=Û£#[»K=;~™³ÄnØÉ¶Û¬¾b ,·ö­Û¦½ ÙNÛ&7\i‡(¤p½ÐæB´‘„œ•4’LìP`e䢂×Ûšn+Bç–¸æ6KŒþÖJ{Àî瘒_±ÄáÚ^Áoì–-•õ€3,qæ¹–xLÒ€Ï?µ’u{ZB†„•ïʉ Fœdƒ÷göÕo¼ñ†Ýx㎈DÜîí0%Vf5€Ø»ºÕYóBî6°RUàV·¯ ˜ÕpOģꜺõœºŒ9åʪ Ä?œ<nLµ˜€ÕG·úP€ÍÔýþ«?„ì×Ì”ðÄßéIøœßnòü£& €t=éJ=¡wë!2 \4WYõLU¸È¹5#xWþJi–Ò[JÂþ&eq4`Åf(øncíMC-ö—ôÝ;·ÀÓÉ“Ž¯Ž ¼}¶‹xþ€vîµ³P(aOÞÚζ”Ú—A‚÷äI?†QßÈåR0ˆ•‰c˜Æj¡2öˆ£Q `WÀ{O¸4];Õs q †\fûí–g§ÛÖ&Lmh¯P׎Ús†µkUœª‰Œ®ñ¼éK~~¾ MÔ*šé/«šO>ù¤L¥PöÎÔFB»þ•`pöi–Ødã`…u÷ý–¸øj+¹ófüÓôð¤÷¿æ¹>c%O<( ¬dÂDKÜ~‡ÙQb$ñZ@ÂÂ>|‡DF„AN~¾¨b Pm«¢Áyæ™N%3&Tg¯Çäÿ™³X¤íUÝ€Ae[woÈ\pD|…ˆ9XëY˜÷U½+–€pëmÛ¶;\¥Žg’éÆT‹æÚ?Óõ?.¿60¬0wˆëduçyc)¸Çtà ~2‚òõà–Ťc¥µª€0°ÒùŠ~ø¶|]·pÍ2tC“W”¶VÒò0à¨Y%¡7‡ ‘gØz˜ †8¢¸ëñyvÞ‰-lþ‚•R)f}{âåBgŒ÷ïï–Úr1l-Øœ1p¦‹2HŒ¶ö€u=1°g`•‘IüDÕ„­E/‰q^œ}!±m øQAçÛr£†RqÔµE¹Ö»§Œ÷h/õPŽ›'Á*' GÍ+ßoæÀꛀ޽{»謌Y2Ž2Âî+…Ž FB(3.«-wOÜUÛµ•y®¾y”\p‰ôýÏ™= Uƃ²°‘£ÌN=G $Ž—@{ÉŠÚZâæ;Å<èŒ e±é‚ %ø–Ód0/H5üN~¨™úƘ8âÁ1Ãæª\Œˆi‚þŒÓMŽUú+þ…Ÿ[0:w´¶šSàHˆ¿ÿ6Ê9úïÉ?ÑTƒ¸*9bNÛ´nãÔ}a‚ï%~õ￟ð@“Ï=àn“ókð7ÄXUî_Ž«ÒJÕê¢XÜ¥jMd·6ˆ•l:ÀO¤ýÑ_çXÆ8 €€馅)ëСþíJlì*+6 ·ØÆ¸ €°{,ÔÙJë*u/»q‚Û!jùØ ¤H÷#š‰½ÜNÄ{Ó¾ lû-ÚÄ)Ëí£OÛ·¶u«ÿ·´»`®6”9í˜æhÎKo-´w>ÖF"ŠBxÌAͬ¥‚ …w‚"ŠNqzœÞò ìpƒ'«ð(û ­#û€¾Úÿ€{ßöÈ\AZh+r^3]“.iÄô¹­lÞÂV¶v>n£uGRQ$Aìé'¢ÔùùùŽyáÞäÑ/òPo°ý0R8w;Ê£Þ€ @·Îª«,ÊÞ¤Éü"F ¾ÙÃRôÛ¶<Ð#Ošýú³ ïr„îY* Râµ·7à$yün‰ÝöR,¬DÏ'ѳ‡cÂÏ<Ý9ŒïÆ ÌJœgt¤$qƒéÚ­L>ïöœsÎq*‰˜z§(‘ì_`ö¬îÁuî0ŸVjÕOr*áX÷¯”¦N  u«ÖÎ{'¼ú÷ ¸Ù§tc‚`WK€éú—_Æ•\syë©é}×\ó•o9S€–Ažqà<ÈÑ”÷puU"B3É"ÛéÓf¸­âÚ_CyCÔn˜à6H)!Ù@IKÀhàcyï½÷œ‘ „ ¢E£[‰ÎáyuR !ŒîÚ)(®ƒø_¥kߤO};ûoÍ(¨\ü?mæ »êŽÙ–'‘|Cí(wÚÿåi³Ò ‚`C3ç¬pí±ñ ï9ÑÀòñcm”'̘1Ž€B|ãâøv:ˆ‰! ž4ì¹ÁEvß3²î_ÔԶߪ³õZ¯‹ëÏÆ´¨¸½=÷VCíAÐÔÚ·m.F¡‰ú¼ê<„@â ½å–[:5î€Á\[µ,÷g>Âô`€•}G½aëVf}Ö·„Dú‰‚|•*u´äîûô:[⸣©l¦MXì Ù¬'>ñÅóò¶F Dt¬Ôc¾“MÁV‚Ç’…Jn˜Øx/¿åp%›©tq,Ê ƒÍ3‰O”'IHSøOšÅB­Ú€N²`§Wæ-«Ž©ˆx@ÿõ1 0¬['Ç}èçÏ„þ܈ùS‹Ô³_Ät=mVm`Ú¨—ÿ—¶§ÕX 2*ºâ„$ƒ—8w3áÇ ê‹è6u@˜’ð—‰È¹'>¾3´Ï<¾ÖÕ0_¦¸- >Rš©´“R, |G<_ýu§Ë%®;«·TÏŠ²« øßï,·AVØK–”X¯žõmcí+àqi£÷?Shßý¼Ôvܦ‘ãü‰@ÈŽƒÄ¸U+ñÁ,² ƒ kÇò!yû(êÜè@@QÀ<ÀäÈ‘Ž2âì€D܃00ˆ„ˆ+áêS×N¹ Š„WA 5Z&mÑWδo~’u¾*/Ú4$ `¼ œPúÏ*?Ý꙱ѫ/¦u­-·°ïþçoBG5?ϼj%›nh ©/ì>Ù¼6ÄJn¾Ö ’´«Dï<±©l6ÞÀ·ÞoÚ,AÞ[úV*}„ðÜU°ÝôW\áˆOÄ=™*)˜Â_xi{T÷ ÉVØ€ @. 0R€²•|iÏô- ’«S§n@ ¼lP/À»¥õbµXðŒºý]L×ÓfÕ wqÚžVc «­LD×L*³ŸdÉÝD0iÒD'¦jаp"îi‹Šºè³8‡0†‰ãÌ™³l–R ##î ·ò•ú§í”Ò*úùÐ~üñG4hóãF,m$ÐW›õߪ¡³¾çyzøù÷evÓs픣òìÇߊµÒ¯çTw?1ßžÕÂÂ6eâ|œ“\tïÞ݉ÔA.Ž¡óG)ƒ›¢uôêqöÉMÐ÷| îµc#)‡˜œmäÝ@Ä“´AÒÜù+]„Ã÷ijD&Œæ™Wol°Á.Š›ïÄ10 Øõ6áù™èÑÝJÍ“Kàfw)~À(M‹[®±ÄÁ¢‡ØŒo‰v±’9…–øü3­U$T:æKôíÕÍZuÑ3Î8Ã1L1{@yOÄäÿU²`v¯îÁÀ´nÓªLüï$¸ÿɰœ ÄÝ÷ @DÀxU–_í'}¸c-–ܬ~OŽë{º¼ÚÀ,Q'¯TŠÆ^éF‘å|VnˆZA˜éÄ „#¿ýädòLœ8É®¾$ Ü@ BÔUr–¬^ 4K«ÿ™ZeÕÄ1¾;L<˜€ •ºø‹qGÂì²:f?    £g×fºü´È¶Þ¤±·Àu´2ö&ˆBˆ'ÁtðˆÓ 2/@Vlƒ™Ux\ü€T÷mP¿ŽSq$çÁì ¾øá×b2´Èm±|ÜÁÍlÒôåFìÉÓ–»è‰0 ÉÀ |ÇÂì&¸ÐN8¼™uh«h|ÏÎwR€YÒùßtIk'Ø^žûìÜÄ®¾sŽv÷+2½"Ëï([zuÞ+óq:Äpüøñn•¾gøœ÷éí` žÔ[y‡ëûspÕÏ¿ÛCÏÏ·; é±— µÂB…]=¹¥cνz–B9ÆækyAì°U#ÅD/L¾¡Ò#ž¨cŒ Vö ÙðWá:®ž#FŒìT×Å`âJÂa=´e°öMÐ;ƒÙpþŸtÿ›ob%¨±´šNœ}†fHhŠ„0íÔ" ÖÃi§kªî^¤4¬u{Mv@Ü[õB§.ô½´psÓ­þ!þ¥L€S0‡”ÂÄÜ©´ 3ôÚ3þ<Ó‘x x«ª§««ÚŸÚÂSXå-ƒª:úˆú«Ã$#N?ÙPL”+ø ‹æºB ÐuHÁä-·ðmÍ–!†€5èž™0t‰8\‰e½(ÉÔÛ O‡xÀËû¼XbpçÇ_3ó܆ ¶ß®­{~=óýRí°ÈºäÚW¶Ñ~‹åNXl7_ÒÆš6N¸ˆ8>#»€ßÿXî¼—ž@IDAT< ¢è„þn³Í6ŽB0@PQÀ¸@ ¨¦OŸîDêe+é¨J¡ëoË{á’›fÛwÒýo±A©‰±ê?Yj€æÍëØÙWͲ|¹Þ][·]1 î’É6¡&Ý©w$ˆ“U¾cB“ †~3VÂñâõ€ëaæ–¯•ÿ-÷Jð»7,°Ä+/Yb†"Zw\nÐR2ñÿfúðÔð=ðçí·ßŽëÁ·Ê T¥XÜ jYÞÖêOõ3úÆ`ðð €³pR$¥„× ÿL›€Ðn¡bH½ €géq²“ ¨~¦Hq'ºï7Ó:ÕPN”‹ÖZ¥[բީV'SxÅ®ûÉ€¿8³d[Ç©Âï¸&W/ÉA\§M›^±áêùð¯JÜJ#°iJƒ•¾RZW©ƒRZàcde #€X}MØ ˆÕ`¤B½DëØû5µ½wÒ6Á2Xl¨ß×ß3×&KüÏÕmœ›!aQq4ÐêGþ>q™ì8{¢d _Húöíë\ y¤(F€ò d6ñÁóïIŽ—j$ÖYÛ‡ì'ËÿÑ–¸ãA Ê +à–ÐsrÚ{&=Éÿ^µcÉWªå7jªóÏ?ßí sÃ#”'ç¿`v­îÑv–¯ˆÀx’€R€hx /s8Ô3û£¯—éXP`ÓSË$i?™é¢ÊÕ`3up‡¨NV÷u/ÈÄÀ÷Í#wÿÛá! à¹úõµp)‘ç‚.•-t¨_GÒ0€ÒÔ)ÐÕjtûŸ¯Æ]—«ÎÏJ/+Ññ¾JM•Òö虉&ˆxš <•1œK{@wÞ»g}ð… þé÷å6ðì–v¦¬ê ®t.yÏŠP~:j‰“´{SYÜÏpÖøXå7ñl¤ ‡æië_˜…01e®|Ÿõ©2®‹Cž€Âø ý€‰Àºcl Ø¨)¦ˆÐ?òâ|ý}±u3ƒÄý𻿨»76Â#_ÿg©S{ºwSëÕ#×I6–íÃóƒXÂc`˜ ˜{a÷GVú0)Qs›ë G&’1àõà‡Ö­,±çîfGf%çŸm‰Þëë–ð‰¥À„17×üuòÂçü®`¼øüó^b`ònŠÉÿ+fm«AíRÝë$cìæò@ñ«Œÿ0šVñšOš?ú PÖµeËð T©$ž(«æ¤–JžQ·?IÓõ´Ùµ…XO=Ý;mo«©@6#Í1S&»ž; €[á£Ð%•ñÈ•à@ž9ð×æÏ›¯À'S«iÔnó‘~}VáJå~`Ø9R F˺>J©©Ž2ÂÀó"ˆ6ˆ—óóóc c¸neÎûÈc`wÅéGäÿÔ« ¬Ÿ s|sGs cðÍKm¶fõÿ¦‚ ’ú`…‚ ¹Ä-Áný¯byÏÜaSúÅ< xßH XE£ƒ‡x&[Ú‡ë6ÑæH;É‘¸ôˆ‚°¯¼»ÐÎ>¾…uÖ¶É‹Š$¾Vä…‹VºÝ yL¼„äý0vÂrÛwçÆiaÀPoàþcƒÛ ØÏËpŸ8ç:ì  ØF`àʳ²l_V!ôÉ U¼ªv«Þ|óÍtñþy¡Ä-AûßÛi°;W÷€;k6ËkVJðË ¿g1‡øÃ¸ÎÉP ­‘o¾ùæNäæADiOXýþH"8Kûu‚ Qòí³V»º )¼ÀžWúuÜr6u¡Žq\²7ȹbä¥wv+I<ê8šúé¨Å6ð¶9öœêUÌD2Ð/oÀþx-Ð÷7Uyܵp}ÄF©F1Î> Žxû¼"On»ì·/[v!;'¸ü=ÿüóq1S*Ž+ôÍÛ^ãÚ©ºÇÖY»S2‡À§Nüñ—Ìß1ºÆu&´;Ò9Máe’pÒ¢y‹ Œ´ÇÉee3L-eŽW÷«<k À« ÄmäW ‚—€øVüãˆ`êÔ)aBˆè‰=€C¤:=°€I.(!°:¨Z€Ukb•ÚØü¤ô¢Ò ¥ •2zÀœ§þÅ_tR¢ÚEFµ¹ZÀ"˜z#мY·íð¾Ze“<ŒspßÓóí<í>xæqÍIPño´!×»®•£zåŸv>0’$üî{öìéìAˆËÌÄí0>ì;]†‚qöx5`¸ÕÆ íèš:/€z¥Áƒðx~°TË36@†|‚GÁ[Kª6WzmˆŒœ¦.×y#¦dJ`N¢žÀØ‘ˆŽx À¤Ä1Ì}Þ«' •Ù¤¼Cš‹ÉKþ¦zºlU|òÉî{){†òFÅäÿ•³`v¬îvé –”ªÄ8)@)ñ‡ðà€æyÍ˼Â8Ù—ËôÈ<®eÔP3í\¹rŒWªzò t›-ªçVñwñ @œ € •*ù–ý„C€XÌŠ  L Dë‰?G®“pä,\(ÄüÇDßdu‡êfÃ×Ð ™¼Þ>Š„}Êì´'N!ܳÐ3ã1€¾:›À*˜´‡ìÔPFÀÒâ»NÖö^xJ çQ°xñJÙ ÛÒe%Ž1(qv‹Žø"ÿtö¨s>ÿüs·1Ì ßU㊧ºæ;A^\¾/W‰# æ%—\â\cª1gÏŠÉÿ«gõÓ«èÚµ‹6¤ ‚¿@'þ/%þ:pp©@„E… âTiqx:“—V \PΤïéÊØ-]©êÉŸT=·I?aÊ'[xâç¾Lò1¹ŽÏ×uщ¯`Ô ¿›y>QÞC’ôªïÈw´&Aþ¡BÝFé]¥Œ€çóý÷ßÛÁlûï¿¿Ó›gT±’…„]ÿÆOZf_È oï\GæŒ/¼¹ÀîÔê¿‹VþŽÈSøá\{Uj5£—:¯‚äÛB@‰píµ×Ú^{íUæ:—\Îÿ†à?Þî¹ç{ôÑG3 Cìëb8aÒrõ¯™a@<ýÚ1–+¡¿TqN½l¦ ÚÃ7¶•—C9:ÀË ”¢€Õü>ûìã6ÊÁè1¾Õ©ó‡}Xx„l¤T.;×(€sÇêüñÇwbò5aÀ½ñùÇêƒõëK)·Åà¿â¬–Æ&<_Êm¢wíù­\dÁ§´Ê&oÝur£º]vŠ^u†Ë_–™tÂ=WÿôÓOÎuKû( óÑSLÄ?€ ÊaOõkÇ­ m*r“<šÊUp§ 0·¿Ài—Ït ­[.mí˜6SÂPÆG]X˜Ïèø +Œá"‹töÞ¯¾úÊéVQ ®¥2Hu#2£®—U¬Ü ¦÷ÝwŸ[1FÔ\ ëû+âˆBÿ—ûiŒ;T÷8aXˆñ*¶fu¯äŒË%¾oËÅdZ‰€R€¿¾ºG\[kp’ÆÂ¼¬2Ô&€Áì¦Ô¥Ê£ªb^PÀw¡L $Œ!HìÈjß—êÿA„”[(Îó ø¦ªó8T7V7,½×?WzN  cûôéï¼óŽ‹(˜ŸŸïªL§v²XÕã1ÐIºö\EÙ#~Àï/²_';Ã@¶ þû³ls…êÅ¿œð¦¿=„Õ+â±cÇ«˜ˆjÌÒèÑ£]E(‰9dã¶H”ÃÉSW8×Çÿü\l§Ó\1êÙ{Ãç¹>j7ü½•Saœ£ý0t|ãƒ…ÎØq;¹Hz»ˆä{Áˆà® #€„CÁtö¸ÞŠUVAA«WÖnòx’—\½Ü>úh'AŠiá*当ÿß’Õ_%U+tÍïê' À 1 T±0¥ªÇ±–öl™˜d–W¨©²!¬eÑK²õj°–¶c¶·ºí0iV'@ªû1y‚» F |;` ™ƒÐ}òF€ óE2œP3 À0…TSwËÞ¤µK“é4«:Œç±#*Ï6  >%2$Šàeg´´ï)v¡x÷Öõ¼G@¦÷‡aÉÏÏw†‚ 6$£€9ÂxQ @HY}#QˆƒžkדÝB=ûüß‹Íp¥zTsÛiÛ†ö"²ÉÐÑû7µ Ona¹’°÷vWžƒ¤£‰½*›‚é3Wº-—ãîd•‘‘°zbQ y”Ûa‡V•fhŒîãá˜eøÇ?þaï¾k~ò›nyŒR´1D–ûT‹›ë¯¾‘ªòµ¯ ±²Õ( w„ø3‡Ü—¢iâŒ5_°˜«*Àl£~CUW ñÿëÙêGmcøÐŽÏÖàV·ìK6 A§û/=€BR1Ç,*² ãÿXÝaT¥ÞPUV•²P—ïyŠÒËJX½bÐF)#Àr„Fdm`§½Í´ÚßC ¥G?üÌΕp×í˵ tý–‡æ:=:û¤¢c¨æ®p«s˜ ¬ë{õêåtëøÜ“¢€yòc5KH^$!qöH%Ø æå@¹ÆŒ×öÛoïÆ±‡¦_ôwNŽÕÄ’À^$ˆUq~LþcVʼn[MO ì¦š+C:ÄYŠ—uéóh• ÖU¯§*›áµjrÜmf+“ErÖ |©’µ&«ÜPKµ°O•[©BØTÕ ÐßžUÛ´©I-³Å:ñ¿;/µpF€'ˆqÑb?n‚oª:Ãt³¡ÕyÃJÜ îìÍ míÒ¤Cz˜={¶=ûì³Î]ûJSÀ»^[qû Ô¨aJs·Æ²~/¹Ú‘·Ýæ lð‹löÜNDîvH0Ø †Ý÷¢ ì˜;$o€‹!jdûqnŠÉF}\"/¤05#6ø¶‡çFާÉ`#È}yp[í5°i߯Šl=¼Ýæé3aû d{÷îí6O uMž3Ž<òHÒ8æ>w)CÔÿAùè¯SRµBÁÚùV_›I­«äΊ ß‹¥âXƒ`ÑIJi¹$|eÍä˜-€Z"¸_Ãú0›/ FEíyR×Tª¾%ADG¢VNÅS^vœ©ãFË)L[8X÷N–&üDÖT®ÆUQÊÎ×Þ‹,á¿TÂk­(uSÊØr˜tÍ5×8pŒçªÂÛûû­oª¶øÅÕî_2ÌûcÊ ç“Ïjû®'æ9é@ï¹vÚÿå9Õíˆ#Žp†‚l–D”@æ?¸’ÄM’Øü»ì²‹õïßF ¹¶ çŸçÄüûž0ÅæÎ_i=d<È‰Ä (ýûmü2¦‘,*±zÇÇ$߃~Á`ãSÈ6Ì10My×Çäÿ/«:Ÿ€ŸÖ E·Rð¥C–îwéêQ òàSÜláp×XÍÿy?Û]¨û¦J=³=ØLÛCU€Ò8e6ZY9Ý¿lœ$@„¨×ÿ»sýFW:î÷q™v;›å†©±¡Ùlp µÅWÿ£ÒãJÈÍ™7S""Óa(ˆëZ·nÝ*º ©¡5 ØÜxß»A‰¨‚£¾-¶b…>JFxûíÚÄŽ;ºìrÙäÚHYâTXa áŠ0G½}«üêS1”å:ö0 øÞX¦'ÎM‰ÅnÛ7v¾ÿ„ >óØæŽÐ³Câòxû£"ûþ×bcÏÓŽÉSP¡&ºw @¸¹Âo=|džÇõ!\6ç~˜§˜-š™Oç)eÍÈ*ý®%môW?HÕ ë¬³¶û.@gèmtd¢‘B°|E`­@@ØbÕ ø ýV¡6Jà«J5ª Ùàiǃ“h²ºùʼ xUøU—ø¾'Æ‚ÿƒŒžÇ JÏ(]©t¬RFs1ô1ÇcwÜq‡KýúõSÕ5 ‹¤÷‡À³êï¿eJÃ:òäˆ%¿äæÙ6{Þ {B¶èæ‡}±ØN½|† Òƒ+òýj±ú\ìÜÓÚ-Åáén±Fóaxk +ï¥êÕIÄt¨–eÕN@BàâR¬ ÁçG—bïóÌ‚òåǪ>ÇpÛUm« õ_ªBÝȪ5ÃÕEv§BF+ýڪ•júx£©l¸">r{h"cÈòuÆ¥â¨Ì°ŽvsÓJĶ–¿ý6¶šF]á6£õ‹ <V˜¢ŽÃDþ¤„Û`s¥Œ`̘1Îm¢ÊþUÙ"ê† µÞ=êÛA{4Q0ž{ì¥BGô·ÒÕþ¾Øn–×.ìBxïSóœ¨sÀáyÖP:øNÚÆ÷­ÙÛÿ,rAyü¦EÌWŒêHl9Lp W*‰×È#~‘øÔ^DðKDì#iÄ»7Ñ&AËí¡çç»È»oßPóº|Qˆ}rÿ1Ä=î¸ãÜX“óB¿1ú»;ôû§ŸÀ~ú¹YÅKkþW·nëXN½çèâÈfæÖ¥ˆPÀÎ8V]Ë m\•ž‚à æ·wUÚÏ îd•A5•u(ÿr³Þt•İFÀsÙº¹kq•8W÷ÎÕq±þ¿‚ó ?d)& † c=z õ/“Û²’{A‰B—+-PÊx_]t‘á)ðÒK/¹`BU¬d¡¦ëØYZU¿þpEãkäŒü–h+aÅñ¤?¸ß}þõ;P„·¹ÄþØR!Ì™«ÀCŠÎ‡®>ºvíj§všzê©Î¾!J@=æ¶&b‰Á ‘Ô¢ E^»ôô–öÂ=ííØý´3¢yˆ"þzœ¥3ß—¬Þã AƒœŠ$殸W]“ÿ¿¬JØÖdóa±@ ð1˜‘U?+û qB^ê”Í^Ôx[w¬©Ôf åvJk¯©ÁGµ›M €sÄP«¾º^ Içˆaù³üúËoQÝ\“× ¼3hMÞ Û†š¡xV©R/¥rª¥Q@xZ¼† æ˜ÂC§ZMGÕÏôz3éþ·’»âô6-s\ÈÝ_Æ»…î{z¾m¹Q;ïÄÎe‰ÀuwÏÕÜWsF g7€ô'ÿ*²—ß^`S€­‰ssë8)†‚ì€Û s1Š©d\¬tP… ÁE’zQÐZÁŽÖΧR­"ŽøÓF8†p^øz6Î1ÞÂÖ±EFÇ×*½‘ÿ¿ËÁ8\‡>Õý0zôìæp!« °b0 Ð~¥Ãà•yIôÏlD­a øë %•uÈfý®™7Xcî8©¹Ê(n3þz`©ªA—">×v˜›%ËåéÿK1d²Îüñ­vÉòX¶«ÝD­«8Q=ú?¥í•™w†]üôÓOÛÝÉ'ŸœÎ…,ã‹uS˜Þû¯k£X+í3ùß²÷ÖËZ[³¦Á§úÑçEòXbÇj³¡öÚ˜øZ¿/Vd¾OµUñËï,´#ΜfSgøUFÿþýíâ‹/¶]wÝ5#û¶Y¾õÖ[í‰'žˆÝ¦˜{C¼W‡€‡ë%3´›-xä‘GÒùüãEro¶î÷n§Flœª*@ŠIº¹Â%'yæÉøZWÜ«H¾¾º¿kð½âáû¬NÔf ï´‡R'¥j/yVàƒ@@Ø{@ØSIê¢ÿ×êŸ 8'ØÅÏ?Åú,Wµ{Qõ'(è_`ø¨~UB§™§”üûßÿ¶ûï¿ßùÑwïÞ=+6"É7†0v”ŽŸÛÁ{6µ]û5rÆ”Ãuðª;æÈx0'”Zߣÿ_r|þîör!ll¯ˆ ºàNÛ”óqaû$¬ŒA†©$é*ûB)ó;Î> y þ7x3É×|ž?5²ó÷»ï¾snŒ30ü;M黈üÿ].ÇëtòŸÕsÖsÝŽ–³ê\¥ÿ/sô«“ô)ˆ-‘p®²ìGQUà{ÁŽ«l˜¸¬þçWu Qõk»€~_Õù5u=a”ݲ2œ$38ÀA!IA0e™¶.ñ'@Sþ/aRkŒ?+§e#þKðapP\«)V^@Ÿ~þùç»zЛLj–+Ô«ìüë $ÍQ/àw…è=QÆ€¸ ØüëßK ×·?Zèô°±Ð’¥H¶WìN8á;óÌ3­  ÀÅXµTpÂOå×_ÝÙ°ë` ^ª±êõdžü;š6¯ÚVe®ÐÏ«¯¾Ú‹ÅÔ#°Êà˜üÿe•?Á ,”â^Š 5aü?ºàaN8÷¿Cx–ò)Rù°ÒŸùúéKf½8ꬷjðÏÀ|¬þf=Rè¤<-³4õ§IG?)Òiœ‰ÌPŽ¥Àµ`Ɔ²˜Á¾€o 0_3PuÑGÍô»²w]  •`^R’f=3`}ðÁÛ^{íe¨â í2k1¾îH؆xky _ÿg‰ré ­ö—9UÁýÏÚWÌÔ~¹vºBözX¦ûÞ>Ûnz`®ô¨ [6à9÷Üsu<ºþ8Â#@ü€‡~Ø©PdÉÄ>\ÇOýðµlžðÁΰ1¦ÍyÊ»L)ôÅÅ”þ_Và‚£9â^ú¢.-<ɸ|äS%x­ÉeüïÊà÷zõpðà¦5 5¶Ä¬ä¨¾Wù“”Bë¡J¶P‰âˆ²åèÅG CÜY@¦$Ô)]1Tžßð§Ö¤®v5GëJ<²?{QˆÁ§>QÂÐi-¥Œ`üøñNWÎ<¸ ÆÎeÔ`D!$Û(öþ.òð!…_{w¡ÛÉïEYäï­Øüm´¯À0Åxü–vÖEÛüsPèÌ+gÚ¿Ûq7³.sĬT/WÛSçççÛÆoìlùû½Ô“»áç-û tˆ#F‘•q•õÓXÓ¿‚Z€ßÙvmƒ9ƒi‰ë=JU5Wİ«tùLÕn[¥*Yˆ  ÌýϹúmK]5™=Q§yæRà˜pûdCà‰¶Yp¿îõüš¾_-1+9°Ñ*_%ëT©¸ŸTÙ:Ò™ ­ [œ;&µôà¹Üàby×s Wý€y÷#ŒÐ ·P"˜ÐÔÊ<lÖ_}\Ÿa÷~+Ó@ea› m½ICî„=/Õ‘Ëpîü@A¡cΛ.5E‰3,ì½n®ÝôàÛãØ)vÐ)Sí=b¶lÙÒ<ð@ûûßÿî ³:Šê?Œy#FŒ°ڻロ±Äz7õu_À_ ~eç/®›iâýÓØYòù¨vœàÉ`=Ïßmr,MîZè·¿NAAY¹ÐõÕ¹–ùcÊJI/™ÌJcqÔu‰ëPLÞÇÊ;Y©qL™¬dá:B¬ôl†%õ’$÷(7þcâ{ ÀX ö·ÎÊÐ2m„ ÈŽhÿæ€á|L y#¥zJi‰è×AŒæòóóÝÊ:mÅÕ,ÐA^êÙ/Ú“¯ºy6Ö¦<ì'ÀÞg\1ËÖë–ë‚ QöŠÛæh·Á"Ûe»F.¦À#/Ì·>ëåZçq*Ưl°õìÙÓm)Ì.‚ÌÃT#ÀxøáÃ6€º|3évÔ΀,š£PzSŒ‘·lÑ2íÆW™ôÓãðj”°™IߪZ&Vµ•ê©¿T·9L F`ƒç«z£òvX9©µ€1-åLáPË.•ø: YÔ5©ÃÁÕ@Gþ¿½3—¢8×p8›²Š D½¹æ&Hb *j7&rq!FM¼‚[ŒŠ&׫I¸£&*FŒÁ%`bD‰O1F QÁ-¸¢×Š€Ëá~_UWOÏœ™9=[Ï™s¾þéîªêêžwþóWuu-U¼$_ ° `Eà èhhöÒQYºt©9ꨣ̨Q£ÌÏ~ö3ûTÍ… Ê-,@¿ñõÍñj þ§˜5°Õì¹k³ù󃚫oZegüÑ }ì(†q–ÁÓÇma×@Ùm^Xø¦]~xïÝR¯wÙ?€-; ò2þ|»¾+¹îŸþûï¿o&Ožl+lzßi§ò~UÞw¥äšk®É;‘®Ë‚Z¥®ß‰ó-¿·Ëú>ë/QÀ3-?è/Cu›8# u®.C¦®«ÝÕçà[$fŸ±šÃÚ!>—à.¶„²™¶bR©€Ì>©<ñsh ž¶Âa€Øgàõ%Ë*6]€\‡áÊ<ñ])Š/’ï€>ÝÊ÷ ±Š°×^{-ìÀÞ÷ìÐÞ2ò.XêÌŽƒð>­¿ÆÄASîXmÎ:¹ùþw·°«õÑ7ž{åJ<õw7Ÿµ• {#n»k­‚.õË„¿>ö‘iÀjƒ¶înš› ïyذavõ@>YsD@®û§­ò;;Dò|¡ý þÒYNxòÉ'íÃY¢|[¶N‚.öÚÆ&ðS¤Lt$W­4ø3®Oþ|·ßvU@®˜^ðÃùj«W¯^±¿`®„l`%8ŽFÚJ;MDj¥@Æÿâ€Î¸¢âŸÂKÝò&míÔUVÃ{vùºJ-?íŽÜžOÈ×UÄkûUøŽ…^ò¯8á+ÐS Ë¡é?rÉ 7Ü` Ò«¯¾:Ÿ+m)á,è‡ìÜh~u~?säè^áÂÅËÖ›W¯GXÏpNýȬ^³Ñ쎅Kߨ`îž½-ëÌ´˜«Ðz°#(}ûö5£G6çœsŽÙgŸ}ìhkÏYn”• Þ9ï¼óìY’U$ˆÓs²£v„¹GÛI£èìwD þ’lâÇMYż †¾•÷ì¢\Úà;8?ëÒ—²dWéÍx\àJ_$š-VÐxiÒ WLJ1–Ìsy“)ÛM¯½y­ÿ6‘?pÛú 4§_!ëQ­µ eýäûã¡ìpt-4–p zv²;à€ÌôéÓ+2©[8s G D¥OõxHBë’ ýç¿×™ßüaµÙõ MvH¡}m0e;sû5Ìy?ìkn¿gY€Q^X°8ÐŒ7ή‘Àå‡ÙK˜žÃ Ëñô•ë™á3gÎ4sæÌÉ ŽÓ_ü< ý‚$îê»×»‚Þ:Hç£.’~–ÞÓú[̇mT2ýp©ÇÑ*<ñ 8ezá§•vF-Vø[ ‡Bc;`žW¬!ÅM#]¦aòkŒ®Zàj4Z†û8kÜè}V€ÄÿØÉ¤†dîõlèpèL(û§Äγä‘GÚ>=ô]ˆ'Ö‰%$„!ì+À×ç\±s´ 93lÖ×¶°u€áO=ÿ©y } 6¢cçÈö`á?a»ЛX³Í@Û:t¨ÕÌ<*qÜÒÒbï'OÞñKèâÁ÷²–ˆëùa÷ƒ‚?§÷ô>ÕyÒü_¦ƒÅÎÁýœZ{ªÕ Y͇~ʧ²²‹5&[9¶´XØ©UÞ(ó´Bã v‚ƺ¸à“ÓWAÿc¯Âw,Ç%9?Ř@ÿ- šXrÿý÷›#F˜³Î:Ë,X°À¾ßŒub‰Ø2Ù·ÂÔÂ=Ͳ·6˜/i´Ãÿ…a‚/¿ºÎ4c(!Mò´óÞ5O?É…¾·…† ‡¢âM–aÍÍÍføðáöµÀرcíÄBà…¹%àÃ+µ½í¶Ûòùçe9ªã·•º~É7qŸÀ §s‡ôŸô‹Ág†_¦ñ†…¿ÝGÊÀ`Ëã¿+ú ³;¸¢WÈ“yâ?jž{)&ŠÍzB¿ -Ûwáäýû÷/Ë0@¾›| «vƒ¦AÓ)²#·œéû¶ãÚgý\€Ã¯ÇŽU--|àLTø×vq¢W¬í‹½†ÛŸ }ú%({Åê(øôÓO›iÓ¦a¥¿&Ûq޶W‰‚³S ³©ÿ‘=̨}ݤA—Mzß<ðèÇæ„£zÛu8¥ðþ{onÎß÷€o ü¨Ý÷aö¬pM„=öØÃö¼g§GÚìÈ‘#Í^{íå“Ut»hÑ"sÈ!|#˜Sرê è 9S("‰HT6ç‚ý±"å–[mi+Ç­ìÈ5°måP@T8²ðvÄðT6oáÏ-T=zôˆs©¼i8лï¾[‰N€œRs?h¢3 E¿l-·øï1;_ƒ–½çd9jÌsÿõWwË©ÚiXÁEÊ\»’køUF²rÆ*¼Ê}ÑÏ#'8{×0诠+¡±dÍš5æì³Ï6t­ pX]¥¤;úpB!æÇ}§·Y¼l™xÕ ;€ë ükÉú°ð÷÷À´¾ðg…À+ãYYaeù˜cŽ1çž{®b˜«&!ü;úÅ/~ÑÞ¥f!URÄ}BCëtŠîÉßoýOý8p~švIãDe âH]œOSܶ4l9Ï~1û@cû‰œ9•Ñ*üúOA sJo4¥æ“:?å5i£ibÉr7Ô a•ú$þǞƤ¶ÞÁíŸ Ýzôch,Y¸p¡9öØc­²‡URöÝs3sýEýÍ«K6`•Á•huª3ß¾zš/ø£÷áâ¶Ì+¶œvÚieYƒ=z½\ûìôwë­·æŠfø»ÐK ±_Íð$IV‰—á+ëƒbFg zÜ¢ÛF uƒ! wq>]ÖoS@`ùËó4.χVÚgU/Y:¼ˆo²ôhYAÊa@Öxľ˜÷åò Û¦ ‹ÿà ®P•>ª„¿@Ñ; pæÐoA/„rXo÷Þ{¯™5k–ílwÜqÇ™]vÙ%çD<ȳhaA>|·fóû/mcZÞÛ`6kì†Â;¿Ÿ÷…?·ÎѦZx#¹f,ú&sœ¸víZ»*cŽhó‰#6ÔôO5(ìÿ”æYøßÃûfïKiŒ>Îf;òé:Ð×çPÔïASfªxsùÿÚ«xcE^šL£ ?€–Ô9ÐV©[~¾ðÞ’N3*öQ$°µàÈqB»¸aI™܇|ö…þÊw~ö'Ç6¯Ðî®»î:³ÿþû›+®¸Â,Y²&ëÔ¼ùf‹ÄûÙfëzÓ»w|wàoÅW²å[É0N·üì³ìÛ—S"æúœ±Š(”@â>ÁU&SŽÑZ? ¯­O¦{El ©Ýli‹ +V–ôv:ôhh‡(üyñÿ♺v„5ŽÕ~¨˜[ö޶­¡o<83ðü©<ì½9«Æ®Ýq·ëw±­D‡°LÿcqOµœ„ÑX±ÙïJhì÷~|ðNx̘1fêÔ©vÚ]œ_ÉW˜Ó©F…i3Ó§o4eù÷—-[fN=õÔ|s’ŽùçëIy$î¬}Ñî"5CçŸK=¶É#Þ–q%*ñ1d>Îý"tR yTäÔÎZ ¬— # ‡AÙ;» )ñO» qÚ3ÄT”»5ÍÆ£UjUR7©½r þz t4öKþ_|ÑNÄÃ>BÈžÉII{¾ÏÙv2wÿ®¼ØNÿˆ9¸›»“¹#]¥R¬ßDæÞ?Ú½Ðr‡‘ÑÂßöÎÙ2Š J—òùW? º;”-RN:sÀÃfŸ€m¡ÇC—úÀ|[?Ä„?|¡êÏnù€bí1’§ ³1ŒôGÎh½ÑU©Àß•¶•!ÀÀG:[6Æö8øàƒÍ™gži›À³MÄ+£ù'ýLÊcÆ4>ßp‰ØI9lòòË/Ï—žC(.‚Æ®\åËLqÕ#à|ý! ÍÙš{\r÷ýf¼KdÏÀ~¡¾;WzïË ÁN§¿î½ Ê[êÒ*ü-ØÙz ”³·åüQ¸˜ô\‘/ù¶‘°b¢e>6ÀûöìTªnu]é'jƒ®3ð=à,èAÐ Pöˆ%´Ío¼Ñ®6xå•W®>Xiñ…zàc³^Žq•”÷Þ{Ï\tËö¼ò{ÄÎË›B‘5A sJ¤ùGðX¸sßkzï¿`*mz|!áü{s ù\snù7=:z2´ê½üqy¥+–.·ƒÈèöÐs OAaF)Y¿~½Ø¤#É•Öçj/à­Õ†ÛÈå¹9송Y’NM`-¾û¬ìåÓBìYŸ8.éaÿ€)S¦´7².MüS¾¯ øcæê Wڕڞ͵®½öZ;:¢ml²{WC#AaœvŠ'P'ćïý6í§ üiÊ÷2)Î0J*®ø €/òàc üÿ ½¡'B߀քtÅ €ÿa–c‡…ö„„rì6›mVqö>.ÞRãa¶)‹FéÌ3Ì×J…Ù}§„é»ù\RÁÚëœè4ø¾ýVþý’ÿ…^0'žx¢í#ð—¿ü¥½÷ãȺ¼-ô¿[Þ ·Ù³g›«®bý(§ðé‹…ÿ¿s¦PD±¢n©Ø< >¯fJu‘…ºÛõöe}³÷ž ¤õxÑð؇¹eYÀ2!CÞÄñ…ÐÏAw€ÒöøÎ¿¦¤+W¢?Ô[8ø%ôdè–¨ñ½™å¦/hßwfqFœú[¢zÃv6ëâR)8®º*?Qô ú®J\2ö8Ê>õàÜ\º—ýžy晬 õ”|wY2 S¢-.¤<Ÿ¯¿þº]ì‡cÿóÈ㈛š'^Q¥HÜ'„¾Ï^™N­ßäºÂßURa¥}ÝÔÙ, ÐÅ~:×Bù„ßÊ‡Æ  ¯@kVªRºtpZ›ð¾g!{³Ù±µHû}a©î ÔZtC`Ü6Øíû4IM¬¹îfÞ`F´+L€Î†óp¡3 ± ;Nž<Ù|ó›ß4—\r‰Y¼x1N¯¬Tªàç]ó½ÿĉÍ[o±ŽžSV#f"ôƒœ)Q*Ä}×D¡'â…C îÂùGFz¿ê*6Œ¾•?|)ÆcùwÃäëÖ&S6_w鈵2 ã°J€ØÍÏî;è³BX°Ý=z4v§".^rá…šÃ?ÜÜrË-¶ Åù5%¬Ì\ýõ†«ýµ#ìCñ÷vÒ(º4‰ª ïsîŸÜ |£÷«|޲Å?·xdÃíÃUi…~Ôç‚ÈÝ<\¾Žy¶*Ù—çÐÜø!›£ÆPì>Gi)c²3b²S{;A<÷«4àR{úè(Ø?à\è(衱+hÏ=÷œ9þøãÍøñãŸ?÷Y´°ç5‡<ÆXìç9\ä (‡^I*G€}¦•îõhð¥~º‡ {ë?Ó|«ó³þ¼b}¶?eÀ‡ÜHÞi'SÆ‹©惫V­ZÁYØèˆJ߀Æê‹zX(‘Ò?j£Y vãaÃÔIìðݳ¤ã`aw,ô;P>ñÆ.ôfΜi—Í=ýôÓÍüùóãkÂ%ª#óæÍ³ïýïÍylŠ= {äDΜÑD‡VÒçqii+pŠÞEú‚™áÖWº@äA áAzwrñŸ¼ˬι¹óæ›o¶Ã/½ôRÃÎuQØñ°Ã3o¿Í‰s ûIp-àD ¦œwÓù#–$ùÖÏhaqŒôÅ,éýó~jß…Ó‰ë¯ýy|úÇŒ›( ZïÇwÿ4ÉïŸÔµTÈMúÔüVsmvoÅn£-¡Á×ež¡Dw#á a’„v^Kè:ºLñÖàÔßBG@95^ì§à7ß|Óœþù¶åüìhׄ­m\™ó¬XÑî×¹÷<©#Üw¹‡D_ 6Ðç±'\~„;)Ú6mü2{¿Ú&Ž•†˜ŠV`e?¾v딢 @îŸõ‘Õ«W¿Ä& R‡Ú&|[ ÓZyÁ”º£ ظD<²ÒÔÔäw“Úþ)© é:%`kÍ9Ðo@§Ac÷à“öI'dŽ>úhÃùJµs\»haáÿÀ˜N8Á¼ñ»<ä•W;šw\`ÞY(D}BsšÏ³E½õŠ©Â·OŸšQ˜»c~µT% Ð/Êôü[ ïGð2ç0¬3Š*ùÕkakV®\»Ö˜2ÐT!ŸÞàì6í²¶R@“Í.M͉V8Þ*ñ¿Ù¿¹Bc é°“Ò ÐC¡ìËœ•Ú+ ÞC=ÔL˜0ÁÎsÚÓT&%îñ5Û´iÓÌGgZcþGCµÒ_‰Ü žþÙÊv]ôªm_€ü¿èÝh}‰MA\}-Žád¦ ³·vìL¶­oF¸6~Ÿ5\Hccc˜M;·&p ]¢2Ø?à¯ÐC 'CYXÆ>ñðuÀÈ‘#m<‡ß=ÿüó=Ày Ø1qܸq†ï\Û‘ÄßN:EW†À­•ɶm®Môy#ôÑÑC»þ•]m}h¦Onž>¾ŸOÿwùËwÆm}güReüNa,—â}äÔ=zô4hPÁYÓØ\ @`œ0Po׌K‰·ÜTˆßKøÀþºÚÖ,Nˆst6ôûÐS ý í ûÜwß}Vi·Ûo¿½;v¬ùêW¿j† f P– )ßñ?øàƒvqŸ… ¶{_Hð>”Oþ\»CR‰±z¼[´®’>4P~‡cþ |)÷ùß‹÷Çq¶\c-«p.ûÖ°³i§´”ä'ð æ‚þ áÏC»577çOËž×kÖ®±-õ×Ê¡-œßŸ[öî·ÇØrß)âÃ}7ß}—?:Ùã+~] )l¶åë€û ½¡;C ªôó=èã?nî¼óNsÓM7™ X[æ)ü[ £Ž;J…¯–-[f_9œrÊ)fÒ¤I†Î6†p+2ü’êà1½©ø;Éí¶ÛÆôíÛ×l€ÍlÜݸS[s›©­¦a›0Ëýnœ–R‡…„¶Új+k£6 æŸü1‰ÖFè½8å’˜§Õl²‚œAÍ~ËÒoü| IŽ ÀŽtz…<‘³j—ôe •jk§ö#í®\HÛp&jLë“vZ¹&•;CåWuœÈbôDèï çA¿-HhÇl¢gE€ÊŠ+[†jFŒa† bnÏž=­ÓÝl³Íì‚Z¾9•OùÛ?cÆ Û¹ª€‹³†À¾ tÈÙÿ@ ÈLIK&p=røiɹ´“õyá¯î¤Îb æÓ¿1­ÝäÊÿ0]!-|Xã šðõËÁÄ0“N¼£ @¼÷U,tš…~‰'ž>ŒýÔã³÷öjmÖúm›@Dš’éÀ+Nñ·¤m§#ÀqÌìð$”9ràsТ„½ö9??•)|e@mhpÃV9•/0Ó)‹pÞQP.$énÆmüšQÔ–÷æÂWA¶whCxlÃð‘jöç^¹2Ž‚ÈÖäù rÞ ¼û¾þ2$ýgžä&Jãÿ”·¡)þnèÇl¶ôÖÞéLG§h«©Ö(­ÅÚóÓòpÁUFdÞ½>‘zÿ°—¶÷}_óøZ€-ûC/–mÚ3)—O¥²¹¶„ŸµŠPþ€Ð„K§Vú~º£…)(ÂÛ\ÊùMƺ§úVûþÕî·9%oó£OGáÿ ”óKp~.!ªÄÿ™iq?D-ñ1É: Ç+3•q¬8sE´ÑÈ5Ÿ‰ vm¢mp9CØÑåÒrf¨¼:<÷<úu(:;n„V[Öâx_c íNPí›í¢×§¯(ºY'³6>/pšÎ_"‡Ðm²èÇ¡õÃÜÚ„9¿œé£]º”Ïæ1;¤¢uw|ûã8ûô wl:¿¨PØoü! æxtdzF³>³+«h €³c÷éÓ‡aرûéÑ®Á'®ÌöBd»¸2Y+×L€Nü%èx(_åk XÝò‘®œÂJèÃPVH.‚ò•…¤cx·õó¤n-åS{¼6lK}VP'±¿ä’­Ðg+ôáôåðéÏ"l<’sì—‘DÚ–;Íå0”qË—/¿Û]ÑÌÙÔ¯_¿œ}hhì0+÷¬Õ¶O…çR|ÏÖöÏ(*Å 8KOÿE¡ë4'±"À‰uþhlÿ º;t4ô+Ðm •ù\(;—ý ª‚j@ÎÇ=Ž…ÒNÊ.ô™V"¾2p‡‘`Dºÿa €‰<ÒÒzšyƒ,üùäWºë0óä H÷?HózfºÎ~¬ @q¿ðk0 o£p Nß ½G{°mˆ ;BqR ôph°éFp =œGq‡Yµ=³gñ|º{IDATÝ:[v²r—o7¹tâ{r²êdè`èÐoAù„Þº94ânqT˜pÈéèo ƒªà„¾.ú6ôhc¹ïÛù¼¨[Jí»Š€?ÆÖôܸç>0±Õ•}P²UØ?…Oþ¡òžüŸDšãpÿKËýj!?UŠÿ•Øp èòþýûýÖ›o¾y·Þ½{‡ÃYËD˜Y´hÑŒKkhJBãŒf¤aê uäUƒV£¹—_KR;è©Ó¡MÐ~Ð=¡B?ÝÚÚ Úê-º.Øg +K ,08žôM¨O‹]Ix ÷Ë×F3¡ü­Ë&áj€Ì1—… œQVƒÂŸuh=àÌ–ŠÊJ€oM`Á¿f“eæøoyçwØáïÇPöé’¢ @i?;;,MÀØÑÙhNš8xðàÏ¢ÐïƒC%´Î°2£[ýéºO>Bºmh¨“µG9?\bí‡UåL[\Ä‘8mvq§ê¬.L€Oêìœ7#P¢àà–Ðí |}ÀJ[ø”¸ ú”Í«CYt³ðUÆAWίT߯h‚stÿCwj­¬Ïä¼+u,ôW¡eÏNõ½PØ»ÖÊ]L_~ þ1¯9kÃßÁSÿPL’Ò5Lö,eíø§n7÷“O>VYƒ ¸V€ˆAg¹p™+tÊc | “ˆ@9¬C&oZŽü”Gmà(>äÜ -åµPø­ÑIMøAˆß† Òvÿi[ _Å.úè£÷|â‰'.Æôí¡% ¾ø#Ìjù2Nc+ÖPVF»¼¨P>à“ѨxµÔ„ÊÀ@쯆Ú´ú÷°_ËŠ–y˜dâss5W»“ñ‘ÅÒQf¡Í¦ÕRåßÈàhèS¥f¤óE@D Bànìï ý#”-A%ICC}ë§Ÿn *)§¾6µ¹3ܽVe8µWϯ566BË+_/€W´ŸÁv ([ Ö@%e©­EòÓ®#ÀÊ ÛpùÌgŸ}ö½­ûm½'j£¥Ì9®ôhÑâ{ÓR mføk(ß×–’N—ˆ€ˆ@V!tgèmYcãþïñ_Ì—<ÝCº”Ûn»Í¼Ï~vç=–.]ÊÂÞËrì°¯‚ O$²U £Ò»¨|°dñ’¯õê¹ùuì¨âÅsºIGê6mºiO‡r¬t!Âô·B‡@Oƒ²©V"" •"ÀΞ㡻AÙPhŸ¶vž®|ÇyõI?¹úZí²Ë®]¶lù>sçÎeILåhVŽy)%óV¬X9{ðŽƒîÇ`•/"l [«b•Àpß­¸©[]÷ ¦ßy7—veÇ«¿A÷†²v.YˆG 7@òµDØ}‰ˆ€Tšû„ܽÚíM=ùà C–àx,ô±—_zyáÐ/é‰N|{s(õºõë۬ثW/3hûÏ<¹Óì8ö‘¿?6%#/Æ PÖ¡1®§$v¾ûðÖ ­cëG464ôF­·FÿzCcãÜúƆ»î¹ëž…§ðð?¡ûC9ìŠÂ'û· lÞ*ŽH`ÜÔ0è¶Ð&(û¡±Õ€¯ž…¦ÉGþe³©î[Dÿ©­\ö·uÓjôòx³¦¦Ó§Ïx"툀ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@§'ðÿ M™´PzIEND®B`‚ic09ʰ‰PNG  IHDRôxÔú”iCCPICC Profile(‘}»KÃPÆ¿¦jU*":ˆ8¬ÒJ©‹£m…R¨Pj«&iú€6 IŠ Ž‚‹CÁÁÇâkpqÖµƒ« (Š Nþ¾)ñÜ&ÒªèËùñÝsÎ=÷¸MAU -~ ¨Z"âçRó¼ë m@z0*HºŒÇc øÊßãý–¯}lÖïû£+-ëàà‰'%U3ˆ—ˆ‡– •ñ:qŸFKï0ÎZ|ÊX´¸Z¯I&ÂÄ7ļ”ÒįÄ^)§ŽÍ÷¤‹iÒ¹)‹Æ9ÆbSo¶‰‹…²dïÉ~è–•ÙVOgD18xˆ(# ø(+¤èHÐ}ÈW Ö.©«Z>›3ø 9$óQEóò€|g~ÿô±¡•€‰7ÀYihâ6p¾ôß74Ï>ÐM^]¨‚&Ô%'.“žOÈæÐ{t.è™ñ€õ#wh}4Í—aÀµÔ*¦ùqhšµ#j~ªŠå= Çw@r ˆ]»{ÀH–Þ\üãöºG¶ÿÖØ>~ywÙPvä4@IDATxì]|Uö¾ÉKyé…4B„Ð{•! ‚€½+н¯ëêº6V‘¶êª»þݵ¬º–UW]{”&ÒTDé))Ò{ûßäM˜$/É{ÉKòÊ9¿|™ySîÜùfæžsÏ=÷^¥D„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@„a@Úœ¯6¿‚\@œ•32 „Á@ p;á4&¥ØQ ”%—¹À à$Pˆ€“2 €“>É–0мqNW è DøúúÇÄÄt ï1™L~8F+¼jDy{{kkXªêêꨬ¬¬®ªªªÝÎ߀²,¹OÛ_QQQURRRQZZZ )(,,ÌNÂòÒ.Àµi,d‡ƒa@h'Äh'¢å2€ ‚ôbCCC;uïÞ}hlll÷N:ECÁ‡@áSL^Ðñ^~~~^Pƪ²¢B[VÔ(k/Mic;•¹e½f~WUVzñ8,k}•Åà=@ÃkU.5ñò¢¥SK,ˆj‚„.üÍý0,Tu5Œ eeeUÈ_5 …ª9bÁã/ Í(ÀzŒn«†göJE<U0 ªq4r²³³÷Â8XtáôÝÀ@ " -`@ €&§d€míã€~½zõe?ª[·n‰ÁÁÁPò¦ÈÈHo(W/(BM©—–”¨®—•5Pî)\WÜN~Ù A·O•‰K^„ B% ƒÌÜÜÜ-àg-NÙ|HSHšc@ €æ’ý€ãà÷6ŒHHH4räÈ”äääîpÝDGG›è®/).V¬ÁCÁ)¬³6_S“¦k¾^ [¯q·µ‚o¬6¯åÇŽš¿½éèdzyA¿W.é)ð6™ªL>>lZÀ:e4 جP†f„ý0 VàX«ßa@¨Ç€õ‘ŸÂ€`ýT /”}*0*...,**Ê„¾7”•WYi©¦è¡¼4—½QÑqÝVåNeŒƒ;ÎH°÷Ú6¯+kƆvÏŽ,FA%š*tOø­ªxx 1߀ϟñ,¾W " x<bxü+ 8¶ÝOF1bƨQ£† ¦ ¥ï¥ä 75•½‚²×\øTîÖ[­ ï‡’3nch5ÃÀ¨k7œkí¶Ýky0W{®•}]CKù² Àôê_»±tŒ×®]gÞíw÷^{Œå^4)VÂm€V“2•EEE¿aýklÿàRš @‚ˆç1 €ç=s¹cÇ2‹äÎHLL<3%%%.ýëùÂïMe_XTäU\T¤µ×ëµÙ&•®eiT„õ)÷5§L­£)Kd¼±}VòW{¬®¤- ¸¹|ky¯~“§Ú4 iÕn«w·kçÔÛ®__¿GK/„2]‰s`”UÂ(+Cá8öÐñ ½ @‚ˆg0 €g]ºt1£ž7kö¨]ªÂ‚­Ë¦€QJõ•“þÛ¸Ô—q›¾Þ–û,ýúµî¼ë×Õ—:ÜOávºá ý7·5–OkÛq°Ö½ÐÚ>Mù7Á¥µs»¾n0Ð@^ËÐg‘F:T ™ª]8ÆÀ'ÀÞ‹ˆ0à® ˆà®OVîË‘ ð;™äïï?íÌ3ϼhÈ!¨ð'²¿½7Ú–Ú˜µà=*#šª•êÇ5¦¸lÙoí\nƒ›[±¹5\-®€ Ni=,û´ý8F_²!¯Éó[+Z{<"ø}L&…nŒ Áz \)ð§|°„ñ¤ rH[G·?í’ú=ëË–*}ý>ôtôecéiÛq–¥ðŒ”ƒRüdK €·ƒ€ˆ0àV ˆàVSnÆÁ LB°ÞÙ³fͺ`À€1TúÐ’Þpë«ü¼¼Sµ|£âo¢–Z«ˆZx •3= ¤â¦ÒF>úÇ+t’Wùùì"¨)róÐæÉÑ ‘€¦ ü­\§6®ßƯóÉ¥5c¨©ííÓo×+Ø\Àø^ž= ÞþpôBaÀåÀå¡Ü€ƒŒêYPú—#¯;Ä#ã±–ԺõÚ=+‰FåoXoL!•–qÝx<|>®Å;Œôtu<3Saíú¾_§Oކ€n ÐH A÷"0ó:Fõmú²©}<¦ ©Ö<5† 9¿ÁJà#à=€ÛD„—d@ —|l’i3ô.;vìu“&MêÛ£G_o `¯Õômà)|]ÑpÙœ²Ñ¥‹žJ½Š>ûäIuôèQ• eÏß"¶1@Ã@ Bç·þÒø\˜:÷Û#5æž*Æ’^Æïÿ¶"€K1 €K=.ɬƒHA½ËÏ9çœsûôéfbÍ[sï£Í¼¾iÍoÖ곩ìQ£?––¦Ž>¬NBéÛ«„|ÿn™œÑ; ß ñÙéÛZ³„PAC µ†…f¼€%½4D„§g@ §D’A3ZâÓ§O¿i̘1 æóƒ«Ý ÃÉzÑån¬%•†=ëôP¹³½žµúû÷k5}߇$ç$  ‰ Äb°y xÉ‚ãN’EɆ0`•1¬Ò"Ýá˜÷úóÏ?ÿbŒ·Šqö1\¬kûö*}rc4t…Ÿ‹€¼ûö©ƒhQ÷nÈ¡ÜR À W@7À8g_š8Mv Æ€F½\¸ðÁ5.èׯ߭gœqÆðÞ½{ûcè]oÖö9H•8ŨÌmY§ÁÀÈ{¤£öìÙ£~;t¨f -5ùçé à­â‹ULÏ–lØ< pÔAaÀiÀi…dÄ "­«12ßíìëÆ‘ù087sÜ7¦ì™úû؆O·þ¸ôwmß.z|Xîœ,Rœ²˜†ç" !ÀA†D„g@ €’2´®Ç`=7=:Óéúäfg{³ûkí”úŠ¿ÛÎZ~”þÎ;T:÷D„–2€·¬Ìb0N`?ðÀqj^L¬ˆíÍ€í͸\¯-èÈï[Ðwÿª¡C‡†ùdeeicñë ŸÕ×KãvݵŸ‰>÷Û·mÓ\üm‘YIÓs€!À‘Ù}†Ààq€ƒ ÕX¢XÚ‹1Ú‹i¹N[0ˆ>à¿›={ö<(þ“··ÜôÞŒæ§=×ëoão*}ºö322Ô(}¼#" ´5C€/ƒ·OŸ"Â@»1 @»Q-r ±¨ñß>cÆŒë ŽA{|0Ž7Ö1*}^¯±ß€çøñãjÚóÙD " t0ŒM›‡…ÀºŽÈ‹\ÓóÀóž¹+ßq02ÿ{ÌÂwÛ°aÃÂ1,¬OÎÉ“&Ž‹ß˜¢çÍêûȇ¦­MŸµ~aÀY°zÓÀ—È×|à³äOòáž ˆàžÏÕÝîÊ7tÜü`ðžè   ¿“YY¦ú®~Þ´®ìõu½]ÿFÞ;€þùz0 ÷‹ÎÆ KŒ›^–y€ˆ0àpÄp8¥’ ƒ˜œœügtçЩS'?¸úMNW{oë+{þ¦pÉÚ>]ü{víREX\ˆN@T„·™/.Gü ð2Pó‚cEDpb8‚EI£-°têÔ©“ºvíêûL˜îÖÛ¨äë¯ó7ç9ŒÚþ1ô××÷·Eæ$Ma `çÕhý2\ëWàN@&jâ=åbxÊ“vû ÃXý¡ÿ×’A§a@ §y“ÎÔ÷pRRÒ5]Хό©y½Q£¡Æ×HЕ|yy¹6í.'åÑ·iÈ?a@¨e_ GÌÇâÀµ;eEh‚1š Gv9œ±hëÑý‰ò À½~Õ¨ÃèÊ]_2ð/??_Sþú6‡çDÜ‹ŽÀØvü¸ á.Ýë;ünÄp8¥’ 8’ß}ÑÑÑwÄÆÄ z?°¼´´NŸ~žÃQú8€ûòˈ}VX”MÂ@3 ÀàH‚Œ 8 ܬoæÙíÁ ˆàÁ¿n½?&îù¢ûGbdºüYë§èµ{.Ù¥“òèÝþÚ)oraÀ`4 ›J§€Ç€šö5¬ˆ:bèLȲ-˜ —ÿ á¥TQVæÃ‹¿^ë—~ümA¿¤éÉ ÀÌ.„Öçp«fx2rï  !'²¥õ „ ‰ÇÍfóù¨õ›+Ê˃ õ½ŒŠŸëTú¢ø[O¶¤ 4Æc€ýéÀÍÀšÆŽ•ížÇ€ÉónY¡|ßÁT½Ñð‚¡|++*¼¨èéÞgW?üVŒð—vþ6~’¼Ç3€ž ß¡†€?È8`à'FЀ¼Žd`.{/•4—¿#/ i Â@Ë`p œý p Àuf@ ~ø¼u*ú'€ËðBù¡ÆêÀ´%)a@p0Ja°I`;@ƒý7%-ɸ b¸àCs²,Ç ?¯£ øƒðB8Yþ$;€0``@ Î&˜ ÐXkØ-«Ä€ÄxÐÃnƒ[†49èHo(ÿ0(¶3Š€3€ïÔß«? ,ÔùÀ1àW'βd­ ˆõ€d/Ä=¾Dà% G¡"íýðÐå݆/h3îÎu:Àž;+b@ zؼÕ?"­Åt÷Sùc«"€0àj àÃÕ½vC‘÷žÀW`@ nxȼE_¤õwàB*Ô ‚˜¶$% Ä4~ š8„ðwÀUcDÜœ1Üü;ðöè"|˜ˆ—&Øâ>t`ò’”0 t$08hÿfàR «#ó#×n{Äh{ŽÝá Œô  ÅŠ—ÆÏnJîAê2#€=Ø;`p1p¤îòËÀžfÛÜKw$û6 åÏH ökž•*YÖÚpÙŽ‹9ajÚs±Í(úO.­®ë'qÏßXfp]‡e7§Ž±Ìãð )oü0žƒM"ÎÄž½nF¾.ö8Sþ$/ŽcÀò}:.AIÉ­€»yˆ³ÔüEùwÀãEL}L…^TZ”3\§’'šžWpbÎGpHXŽÇmDÀã(<¶±Qâ÷AENa£Ê¹"®sÙÜ;cB!Dã€ÐÊ#ücú<û´mXiGø^¹@&.{.°³//—j'äãj'¢]ð2Cç÷vó ÃR/ô]ðVœ?Ë(h©àËYðb‰…ªÂ?*bn7 ÷s$7¶Ï²ÿö!  '؆› œ°,Y€7¦Ì±«Í…£Ñ@' Ò¾OÁ†x ‹<ޱ&4Œâ…‚ŠÆßA®s¿/–òNYrüz^66Îv8þ’bG2€oHDhÀÀply·(yOPÔ² EÏáX©äYËbMœëºð7•÷a€.—TöG€ý–¥ñxlr+¡ROz4h8$ý€€FD­W/¦f `›è1 Á!†HpèFßIÛ”®$ã à{ê00¿¨üÃDù×áÅîÐÒ¬­—aÉÚ¼î†×Óa-ž }3p8 lö"3À2«70 ÐtØ¡‹ôè1`³„:3ö/u#€†(€mö'!g8#ü˜D„QXù*Ê_§Äö%”<•}…EÙ³&OÁO•üPÙ6Tø"Že '’ $ãz ØÜ ‰ÅмX§§@Ävt#€MJs€=¶Ÿ*G:+øD„Ö¢>¤æoà ­NÅ®)|,éÒ×Ûê ñû` °X d"Ã@w\v<@c`2À¦ÆPè! §@óÔl’ÿM0P…—<ï:›£f‡›8Vv¹b¸ÀCj‡,öÅ5>¢¤æß8Û(øX»§Ògí^˜ÏÃ:kô«€,À!"NÊkþaÀ雨D@¡!ÀàB@š j8©ÿ¿íZ ¤à,€e﹈‡3Ð ÷ÿ!ÐÙ¢ü¥à³¼ÐâTä¬ÝSñ³ë3¢žîüåÀ:Ë:".Ê ‚I ‚Y=l&àw@C€î1À&~ðÐ`ÌÊÙ×E\1\ð¡90Ë‘Ög@7(ÿp,=^ù£pã@:½|èíølç‡ä;€ŠŸÆ€ˆ{2Ûš LR`@ $¤! ÆØ€àû ƒÕ5ÀE€îꈫ0 €«<)Çç3I~ ‚Öçt¾°$ŽByð â" xÔ‹ê"Ϥ­³9ø| =ú¹­¯Ùáé[”>kúlÛ/èÞÿÀv}a ¥ ЛÆ@¸K G$dó îóÁ÷•#€ß¹`¯`行1ÀÚÊóxèPþAî~ß(8_1 ×öµü2ð |îþ´ÿýuÅ%/æ±½øÖ81’Û º2(08 gMÄÉÀɳ7i}ŠŒ)Ìé:]RPøœT‡m“TòTþ¯ì¾'b'?þ˜OiiipUUµÞÕAAùÇg/]º‹XaŸ˜V¾KÆ Ð+@@À}î*#€FÀÏc%ÄÈvò'÷QÄèŒ{d4{W¿âðÀØ<àNj|œ9¸·m‰ Î&neu:¹œ*†gX°¸‹ò‡âgûb!î‹Êf °Xx‚°æÈšù`"0`»¼=ß0 &ÆH0>‚‘ß+JK ÃÿÖÙŸÝšožÃù`LIý.¤ÌÇ£æUXîDšf€ÍS/¯sñnßÐ#À.„ô°éΕŠ7‚ïµ/nb!p+ߌ»æÝžÂÃ]9pÇûbáÁ8öõo¬Pw™ûFÁX ,4Y‹¥âÿÔen å…Дü<,/TÀ-N ¶ Ësûöí›[]Íè~¯ú ×ÈþƒÈÿWp°´´*ß××+ØÛÛ»'âîÄ>¶Ë$w·"¶1@ãêßÀ›ÀxÇ”âÁ›ñíaß—dœÓ-á~æá¾V¸ä¸q¦]öårãgâˆ[›D~‡ÄÕÛý9ÿ8Ûøé®>Pñ³ Ä&·ºô©L¯âÚânÔu×]§bcc0BJ+a¼<ðÀ°ví¼ßÛßßü0ö=Ë‘Cø=xþü?ça)b?á8åÀµ½³ƒ½/\Vð çâíJà LhTŠ8 x·DÜŒ±¸Ÿ[Qp°Ï1Û]RPhÃ_‚ƒí×Fou4~»›°†° Û´M”?ÒUãÆUqq±õ•¿Ú³gOÙóÏ¿°ÊŸ…¶UY´ˆíüÕb'¾QºàG7ãY·‹6³üàwü^ö|ËwÀIª\R dBqÆ–üÕ%oÀ3-€{=\º ÿ °¯1×]NPà•Y ¼dþm`ðÀ¶kw—XÜà[À?*Ò65lذ:Ê5~•‘‘¡Þ{`ÇÓèúУ±LÌŸÿã1¶×ÛïgBT½mòÓ~~Ã)·g›`må¬Iãóp9ñ¶”G³‘ó™.—{7Î0ž‹ˆ1À`›2Wª}QQéWŸŽž |fK»Üý¡½{«„IU—qãTPLŒ ŒŽV¦³2ùúÕ(u#{0*a”¨â¬,•%Ÿ±q£Š‰UUô¹X„ë¿üÒ@ù뻹ìü¸xøäĉ,¬ ŒRŠdÝa Ððºxø;žÞlî Æo¬:·°b€¹9ý°É¹sìþ¹À=žñƒ¸®–‚À%î…géc­? øÀnBž ,¨{læÀck^¼ýüTâÓU¿‹/Q‘ýú*ßÀ;5}]¸Nˆ·¯¯2GD(sd¤ŠìÕK%«Â¿ú >–SçÀ@Ø»w_ƒsëm gi4À`ÌUûöí[•œœÜÉhH`ûáêjñ€‡¶”-H<¸Ïû.Ñåüöñb9½7ù ¤÷y§á;°öÊb³H{0 @{°Ü¶×è‹ä¯ÅÇϨ§žøÚ+¡vàǨfº“i¼h.e,Ý]›q=@ƒ‡®P›„Š0ºëuêß¿ÖmoTü6%ƒàîgiëWR¢¼è{Û_—‚‚B•›kócðÇyÓüñ§i˜!лkׄJ³ÙßÄÖ4)¬ž?ÿAð6Éüù÷yùûÁ‰óòòŽ„Uˆ&„ãH'=0°<û®»ž²RlJÑc"/“†3½Ãñ4]Â# ù¥çˆÍ^4&E:ˆS%@e@.Ûj>@ “P5CáéÜýÀ¶~*ºùٸ̹sìÐÜDjl럠 l^ÐÑ^ºï^Õsöå¿£$(3SÅ#ØÑzºäÅÅ©å»v«­ÿú—*·ÝÐNïܹsé¨Q£  è_:ï¾ûîoÖ›óðÃ…™L&F„³dÀ懌#Ø‚,¾ÃàtIÌá« ðAÞ0X“…`ƒ¯Õ#d#ÊÎŽì è éN•pq¹d«8)lkê^ˆ0WVVNà ¬Õ§;Z…©†£ª««^ò§AÄ&æ”?Ѽ%^ ô6™TxÏdÕ5e² NHP9è9PcÀé„cù¼S€í@”ÚõßÇ: ›øÀqFaÔ㤩SS¿úöÛÇ;d½Tªk€ï€Iøþh0úžF³‰/dŠÁ‹ß8[æúè3Õåö[TÔ¸1h À“¬'48º`Ú†ê×W^UékéenZ¦OŸ®&L_Çh€'@!Và ÙpyDDøºnà,¸ eÁ‚ÑÞÞ^ïcÏ„z{G0à=õ¶ÉϦ ÷å å{ œzøMŸ×æ{QnâÈÂ…˜G»ÚšÚàúëÕ˜{ÿ¤âá¯I½Úx³‰´ð*ð´¯—©¬ï׫ää$Åé€-ÊXq€£GªÜ#GTôĉšQÒà2È'½aIIZ³@h$•}à@£ñœk`<f3ãUO úðÃO¼ùæ››?ùäÓØC—Y¹reQjê¾GÆw½dÊ”ÔרàÙÐ(éØCïT([Ž\Ö:bKÒrÈ9øpËaÁ³K_.p-à ¥25Ú­1¼Ù$—]û8„¯æîo'ÅoÌ\IZº¦ô9¦Nfç¨ôô EEÅÚ¼^ùªðïÔø°UðøjÍ]0ªàî÷ßW¿¾ô²ª,¬kó±æq´tyø £nݺ­'¶½ð}yX 40` lAð ìË:Alá11Q|ÿñú‰ØÁk×—÷€¸»ðÝVÀÀ¸ ,:Nð ½äéäâ)@žk;=1Ú‰h]†J‡£}±Ý¬ÃH ¾TZíŒô¾8Ôá™jû ŒÄ%&6}?Þ˜zwÐÍ7«~—^¢üQ+ÖÚß;@ùsè_ß0”÷pÁoþùm.ôۯØ{pÔ„†@ ‡âÞºMª¶¿ù–ÚóöÛÚ™äGõè‘\'^kúùç-úv8²´^ã°ü ¯?µ‚‘KÙb€ F®MååŒiEQK”}+äy=¾ÝWAlÞö$2òk_j8×7#?¬àÌ>v@’’„ Ôýúm8Aé0X럋Å)jÿPlï§òçÇ:8¸³áæVS› ̈AÕtÏ »ù&å®võƒïN» ž— íÓ§6õ•?óÐ=QùaÎ[…A‹DÒûàêô—_R'MR±0 bb¢ëÔþ9Ýp#n{´_O=M`3Ð]]¿7@n^N"­``5Î=؉o™Á¥­H«Õ§¢\ã3¦AÈŠ„H;1`S!ÖNy‘Ë4ÍÀyØ ‹­nƒjÓç´Å^}T?tÝ2Êße“VÛÿ––Fûæoר†Ür³ê{ÉÅÊ/8¸Í£û›ÏŽ€‚2XuJ™¤²V¬‚ãµ®ýï¶úĹsµv~›Ò3Äi†0~<ºV%Ë–)NPÁ¡ÉÈÈTiiiúOkK6§°Ëè¹À?€`¤Lª¬d%µŽì¨ª¢óI¤• ìÅù4ÞŸƒ0/z%ˆ¦1Ö!‚ëÓ À€Oz2:$vQ1\çÏÀB ™èÁÇY p oÖüo>ßE©nl‹š†¿º3Ú¾GüîÚ?»Ñµu×>{è`ìAòÍ7(s—x•þÑ'h·/ÒbÌݺAù_¦"öoU~Ù,àƒÑ »cÖÁŠ;j³Æ`ÃcÇŽ*ö6°ApÌbœsEaaQƒP{¶¯zðÁE§6Ôî9µòôÓϘrsOöÖ!¸ô0œÞë RÍÆùÛ‘ÞooÓxÀ¦ JÙíÖ¿s°„ÞC@ h÷µ $¡ø\»gÀ/ÎE\„½xX;ÊBGáÀ`¿LÄe^C908°]=Ž(gŠñ`YÖ ølDÚv}¸mxîžôpÜàEøƒ€úí¡mzïø ‹ðAÒ-ÇÚÒ¥k`î(¬)ÎþLlj „=ãY _s ŒŠòxåÞ”^˜0ŒÀ!‡u¡QP9eŠJ8ã -`ðäþýªì$+á¶IQQ‘Ú·oŸ÷¦M›0¡PuœÅž'ôH©Gy$†÷a•qÉÜf‡áØi4Ú&L³fõêï{–ßp÷_g€Î#à×ÎeŽ ×å‹Cϯ€H2Юʤ ïÃÝ“±Ü ¾ÅöÖúñ1ኯt·ßÕÛõJ=qµ7gzšÖhû\q…šùòKZ¸Žê×ßlF;èL ØàÊl^`|@4‘œ Þ†ß}—òaÏ;3ò„[ºíïá€^ên¬?P™7&Tì„5aEè??3k¿"ÚôËj&ˆØŽ§ÈeíEŠÅØ`9׫½®éÉ×€k<}*¨sñUü8Ú\ðáçâç%¾X 4Vx¶y^Úðtñÿø/0°é{BÀÜ„¥KÔÀ+ç*_Dø‹Ôcú„`aÔÚuáK›×£‡ªÄCìà¤b1b"f>¬FJööíöÄL09?uìØ1—ôèÑcjðŒÛ¨/ÌÀr|2/`ùOà=`3ÀçÜ`:ºÀããÕ # ¾…®ŠhŠöx¡ž| LJ%žªm^10W4øìÞv@Z’D Øäælâ|ÙÕ> èmî,˜ÚÚkÃa׈CåOåø.àŽB…ÿ800*‚Fï•Sô¼áÕÿ²K•}å6ȯÑ;h¿•†yxU앃Ö#òÑÐã$ÂaŒþÓ=*éŒéê×—ÿ­Ž­Ze3¯ œ0aB"¼õoŒ äsxÌÎNßúÄÿ¬c¼>üðCE›ÿ8f `,'#sƒ°íG@¤¦‰åñœ –«Qø´1,ãØkC¤°©ÆÓÆyä›g ‡Üø  µVÓi>ÛŽà˜þlW¥õ?øÌ¶Ó\ê(º‰ÿ¼ôlRþáP6—.Ö†¿5ql{(1ë ”åä*ïP¡Q’|hÕjU¦ÌÑÍ[§<²9%¤KÕ-5U‹ÈÞ·¯ÑùôôØCàÌLÈùtc‚ûÐK@eee=ïççwãC-8ºnÝ&ý”ÚåÊ•«ª¦M›²—f°`rí¼ pFìþöÛë Û<}•ÖÕÇ@<ШƳd¼L[J9^–yô܈´!b´!¹Lš5š‹ñáujï_:•p.°p'á»>x ¸°ÉòEõð;ïTcî¿WEôêmsíé{¬ü†Hÿª»TçøS•8*ùòâõÓ« D¤QF† éa!ÇÝgœ¡ÌIðÄÖmªÒHh<|šF­ g¬oç56lØ ÞxãÍ>«V­âÅ÷|Ÿ”|Ujj*¿«óëí<Ž&€÷ëm“ŸJ} øÍŒ*QÙÔC¦%ÄAù3æà7à•–œ/çØÎ]-"®ÁÀçø0ÚÄòFº¨7imþÇ@Ål€ýpÝI:áf§ÙtcP&ñSRÔôžWæ^6ë`ÅAnDšf <7WX±ZÈ:YëZáà?Ç1 ñɓ٪âd–:±ñÔµ¡Bê Œ€jø ""Ô@ŒH8ëÍ7T¿+¯l`,PÑsl€úrôè1µ|ù7ô A›_~9–êËßH†ï{}iwýkºÊï%Èè”%–ÊB[å›Úþ¶J\Ò=ÅÀ)Ý©m²æ| °´ì ˜0,ÊHàŽ|Ìø˜Ùæ¸8¸‹°Ö6ð —­7űðGÜù{•<{¶ò»_Úúme3Ë”–©ŠÜ•Yà«vìÜ…)†ÓTqqMö–(:zDóµ76èæÒ‡1Ö½»: Ó&'9Smyþyulõm "Dþks Ûþ¹¾zõ*UZZjÌ,» > \< ¼е¬ .©¯–Œ}iœg°‹½ƒC¹Á€$[¤Í¤rh¢’˜UÄ`•§Ûx?r46!¡KÅgÎ@J½Öz1(ÿHí,à`ëSušXëc⛕Ò9g«Yÿy½¦­ë¢üí{žÞUó T¡&¿qÓOêè±4U7>kí„&ll²A4î¡¥c† Q©O=¥Ržþ» äC½1Ø’¿!È馥¥i3 6’llçŒi9@¥šÛëË¡úäw^Å–ÛP~[* h餉?üÜÒ4ä<ÛÀv®:êHÖʯˆŒð9j¤o||5â4Û¼ØMe_‡öEX¶fi³–œÖÔñ.´ÖÑ£¿®lréúc¤¹I}\M\ðˆ E7?‘–1à‹(ÿˆñãš<™ÙDICÀƃg¾öª‚Æói>Üì<|/Æ4ß&༠XÖ—mõ7Èo« ¼‹­× )t”Àç8}&žmàF,E?‘6Ÿ6L[’n=CÄ"|^'މÓ>ô{V¿lÞ¬Õ¬Zr |´eøhð÷#p1À&wdÜÄÀÀ¦ÂÃËË[õ¼è5ôÆUP|¼cÆÂo&é&¯FÛº·¿ŠKÇÍ]·ïÞ8>¸°ÖÜìŸ,PgΞáURRZ´rÅ*Z‘ ð$ÒF Ð*qNb­·€3fœ›Øµ›™®vs¢¥¢å5fÌø!©©S`dzý ]Œ=65ÑËÀ˜ƒËq\ïÔÔÔÍèU@cÛ]…–ƒ†<\…ÏÒ¼bßíúÃÃó¯_T}z÷U‰Ýü×®ý¾(ûd6›h2€­ö¥&GÛÊ€M¥­‰ÉqcÀ)ÑÅ6ø´Ñ£Â‡a6(ZÚtªúrÓÆjïîÝ6_Ô ü¿ÃI—5‘Y6§àt²–?x ˜jkîØ­ÿ¼yªÿå—©@Ô]-º¿¢¨Pm¸ç^•¿m»2ahÝnž¯fÌPÑó µa§©ÌK%FÔ¦ÆÈ^ •ùóÆ7¸|¹ò±ò^«Ð}pmpˆÚøÌ3*w×.½6o3 ô$&v­0`À¿?ûìó[qbƒ@ÀE‹r‚»±ï6 ÈæÄÑ ûÕ¸íð8Éñ#÷¶Jßý+xê-ñ¼üê«êJôø 0fäÝÿý·lÞU×Cp'-½K $9ñ8˜P%·é¤28`䈑Ѭ0Ê™nJ}Éõpt—:väˆ*3Ô†»¾Aù¯Á1Tþ ¹ÆÎuÒít¹Þ<X 沚í¨ÃQë_ zŸ{Ž6.½«ù±öøó/Õá÷?P\g3@öÏ[TÆúõZsNEÜZEk•¼ldß~jüaÇâ…æŽˆ;1áÐ)]Zå맪ðáÅjötg<€FPö/¿*ïM›ThØ)ƒ†|úæ•1-Cz&×Í:î5,)IõBïƒÀ¸X•… ÙŠüæ›’‡¦&Áƒ@%¤ ¯SPP˜UZZvæ¢E‹¾X¶ì›îèåË¿V˜g  55¤{]…sÍúùXƒåõ& …“†mîºÊÈý,` ÐÀ0ÿ¡‡ÔøƒÕwYWþô°Ü‹ŽŠñ 5ùÅ×|p“€e€'pˆÛl[qý’±mùi¯ÔçáB×ôéÛÇ?5uJ,^øZåÏ ÔWþÜÆš? ¤ ¸;¡ü+Ï?ÿüÒ¢âb}Œ`޵Fåÿp1àŠ]ý膽xHlzWýPë3ÿA5üÖ[T<#®ªìp¿µÂ`¿ãPz»ž}Î~cïHeA:Žnƒ'·ïÐÜãˆapž«I5ÜþÛ-Q‘m0::ª6ûü Õ¶/¿VQÆ)Æ{…î;b„Jš9:ØKeïÝ‹ø˜7;gÎì3 r8ã·Þz3ðóÏ?§Ïš^€Ã@EÃÁ›:5ÛÏ’ ûùà a›;¯þŒ›£×q9‰ÊK-|ã,÷tÅo\…¨ÈN[¶l):™u²'Ò<l÷ Ûæ.Åh^mMu ;9ebÈ„ ÃB0˜ E7ôum£åŸ®üÇŒ£222rï¾ûn*ù«]kûït½¹’°Úþp;PCD3¹g­ÐÍ7©±PþуµJ)6s)ÛwC •ý³×ù£ ÂÌf!Ý»«øÔ© ã×¢æzHUäåµìž‘ºÓsݪ27nÒÞ· xŒàäñ4ì2¾^¦Õä©ð)üta ¿Ëùç)3º@6+P2üÎÂ1¬vò¬3UÆÈ9pPU‚Ó)0B82¤E8\ô÷߯…±qHßd\Ò­Í&ósæÌ`³Ù\ûùb¬Ýoð *áܳ4ŽlåA‹ð6aü€aªÛéÓ”/ÆÕ 1“§ŠÆòò2õÕWËTaa“¡4|'s¯Áƒ– >‡ïµá}ö:Š|/ÅXlÇöDY‹›fÛýQ`åîÝ»gcé“’’L/—.õ•¾ñ7Ÿ{TT” ¬ú`|€rœCãëÎ{8õ–Û{¦ßºàä—ÿ¹W^ׯß@ !*zJý%·ñÅ'ü0fvjjjåyç—Ž6Pú$Ÿâ~Zðüx/žÞ¼°Ö?ôŽß©Ñú“ OJrXíºù+ÛpžOqf†úyÁB­†Í¶ûœ_~QG1t­ Ê+¸K‚6« )5y•kë±cƪ¨Q#áÊ/Tlo©ð½*Í<®Ò1ž~þo¿)3ìÌp‘s»³Iš{Š3ÒUÉoèÛÌ1‡ü^̨Á÷¾ãvä=šìË6ÑÆ§‰H¨â póµiääähmúúwY»Ãú ½Óa@\C=c`è=?^_c`!6ù5)‹-ðMMÖuÊ”É)øÖ'§¦N99uê”(–?®`õêÕubšLÐ9w"[Ö®];'99ÙoèСþz6É•~cKÄtêÔÉ?=ýX)¼2pž/ð½~¾,mg@ Û¹rÔ‘,Yèêîqö9gEN?1ˆ^ðe× }i¼ cbúôéê¹çžË@°ûÙÎ_i<ÎEÖYH.h¼tN•¶øÑ˜ÄŽ«¦<ù¤êŽ‘ÞL0„œQö¢8ûµ Ϭª¤Tøþ{•‰8MFàŽ¾£!@EMo@â äÇ€Z¬¸¡§ŠàæN_½F•ÂÎa…9ûž3‰ÉßOEŽ޶þ>ÊÝ_ƒô3}šê~ÅeÚè‡Õ*¸5âeÊAµ @VÖIõÃ?Ø“¬÷‘#G·nÝêU\\RTŒïЫ¥úe®o,¡… †"øðOâXt{õºÇÒ£0 ˜\‚íWø˜–š:¥øôÓ§ìþæ›®l0ðâø‡~8îì³ÏÆëÖá-€±æ¯¯ëûB1 óäIÊŒ¾îy¨ÅWäæjïŒ=IiÇ"1Æä`ü€Ì !_­M“ì4ñ¼_¸çÁ§Ž8@uëVc:àµ0Ã>ZWäVW©=¼Ôf6´ƒPNjsàÀŸM›~ÀìÅ'ÓàIxzïÞ½‡ë'±tésJÊäK±ý-€Þ°@S†X…†²H.á%ø ±=ÜUe2žÃ(A!h6Ñ<&º¢¯¿Ô=ÜÎx€À ³ßºï×Ó›0 7ÑS›Wpëö‹ösÖš3zãägÐÞåsÕ¼¹ûöéß ËçË­‹^óçXÙñ¯ä¢‹.:}hñº’°Ùã1àQ Ö–Œsà—n¨íOzt©ê–šZ3¤­[Òh¯cªàîßö쳨Alü’ÔÔø+D-ûÈ_ª (Z¾hдxãg6»Gˆ0@Åqð#Ìx˜óªÐ’´ùÞU ›]‚³¶nÃüÚ@BN3~ßx@m šáùÆ[FμaxG_z‰6ÇÂÉ=?ŠÝÁ÷쓞žå¼¦ÜÂR (X´ha”ã_èζUh ôÃsâôÄ_BÙz¢·2++ëŒŠŠŠ tÔâtE¯/ëüÍfÓN"}ó ó*wïÚÃÊ£?—9áý9m–Äh¿GC®_âç^yyô¤ “ÍhÔ®®+|}iÌ bNú3zô誳Î:+­°°ðmìÖxŒ“¯óü`Ûç4ÀZÍ›ëJãi÷ݧ†Þx£æ2§‚sZÁ3:¾éµ÷…Ao°\¶Ap?9ÕîÈW_+ ÓŒûõv@³†€Á¡¢GŽPQ§RePV¸¶Á܆¬Õ9÷SŠîw™kÖ¨¼‡”=8­÷Y'1çÿÁi†CàA1Þ_z”öì©âÑó&Æ[r8í°ýï$¿…QÀ5dâœsÎÞ·7ký6¾8<³Ž$áW—3¦}¼|ù·Nü‘ÔÉsýذaýúõçôìÙÓoðàÁþF…o\¯o©Ðà€Ÿ~ü©0?¿ ÒÙ ¨ùm1¬óÒ[oG¢gŸ0.àÜsωŒÂh]éëKm£á ”¿zíµ×2Ñç;vݸJ»oäõià~À¦Ú ‡íísÅåjüŸRO;Í©ký¸'MQpêÙŸ—þE•£?º½RÑèN¬ý^e ™ƒóp¸Z/|­Ô˜ã&ÂÑk ääIU|ä(øl¡žAzE4ÌÀDDÅ'³µfW?À.}i0 Ò`àT 8°€ãÀËO\b.¢‡ SÅ9Ùªc´@àêž6yò¤0 ‘ó‹°ý;àÀÇ=~üîéI3–Û| }++«„`Ö]U²ñLÄŒÇüAŒôו½¾lÌÀ|^AÁþß­Y˦ñÀ»€}nœà‰b|‘<ñþÛëžù‘?‰A~|n¼é†ÎýúöG[xMA\_ñó·^‹ä²+F5ËÌÌ,¸óÎ;éú¿Ho¯L·â:¬éÜüØôž£Oö¸GQýànõÀ€àÂùÅ }é7ª#ï}P“_ƒâ°9ï8§fiè-÷sƒï""jŒ›±r å] †òŠÃ¹ôª z¾íÜú;f嬯7!Ÿ>7wÛ6•¹~=jˆ@ žÓÄ4žsÛöðÙašåðCë¥ù*#úGFhµ~rÖ½»6ã`<yˆ(AŒ€=rÑEr$¼`Ý©¸^F.+,,ù¿… ùŠ}-°"%%õ-\zöŒã ðû2á ®,¬àôDœSW¡ô|ZSþFC ¦¼ôV>%eÅÕ;wìBÙªø¹+Ñ^y·©`n¯Ì¸éuøBRÆÞpÓõÑ)“Rü9¬%EWþúRÛˆzáÌ&ˆüOLJð7ìúL?Ɖ—C‘·×¡¶ä“A]ƒn¼AMX°@Eõë×zÅgËEx ,Òò´;P̘ >wÖ²|ö™6~@Æ{ðå€4TL­¸ª½1|n¸›8Ay#Í|ø(tÿqãÆê±ŒlÌà>³9ƒ7ìÚ¹³èäÉìàf/àÊd¿íÅøµýÕ<ó wâ¶g¥L™€¾H}¢ŠúÊŸÛu`ÜŒýë_36oÞ¼›ïÕÏqÒ%ûñÿ@íEËŸ†O³ŽÂpÒ_–b¶¶s”jY®*PÖ]0Œ5âÜ]˜qÍúslÉ=q?Žà„îxœA}­->î쨡ƒU4Ú³+`äÃhq>¡´Ê²²ðÊE×¹ŒÀ€n‰H°µYm÷óµ™aÌ‚¢ïÕ§—‚•®åAçfÿî½*],£Ñ¤b¼?rꇘ‹¸‘#UWËàLÙTÉÚw­ßÔ\ B Ó3ó<þÝwßõúâ‹/9"&{Pq”Ï:‚A„0KáøCÞÞ&öÙµÂZf\™Y»Å5W`•ªÝhŠ>§.¾ºâ×—äʸÎßDºú›×Ô4àAiC£7o‘¹&Oɵ¡±ÑDza]ÿ¾¿»ãöøáS¯)ùÂ6&,èúG?⼇~8Ç] ä6v|oç ±Ýí}`.`“¦b4ù`ÌØ7áá‡UD¯žv¹û+ÐNËqì9ß{UY9 d\Õ „£ô…c šxôX€Qù{öh.s]‰Ø•E¼áïø÷ëÔqŒÀ&Ž! ÐÄ»cÓ5ðê1> fÌh9l(ÚôpøpË=/ÈOÚÂ9¿c 8ò¡_8œ?¿â6e³=¢öÕ2L·¼‹“Î(|²j;Sí‡a³ùç_TNN®*MÏP±ÓO·nŒ¾]ÆSq§V¥ðäíÛ×àúõë«ÆŽ[Çèâû±³5~±" ´p£â׳ ¼}1£ÙÒ¥K31ëÕJì[¬ïw¢%ߛ郎ÎXkiV|0ªÜp ã;òÎß«P Þ¢)ÅfϪ{€\áëÿò¨æf?‚¡k÷}þ™6¡KDrr!ÂÀ)ùðG{qgøaè›_€vÙ :·Lønp”¾£_}©Ê (¨Eác{«ù¤ç‚Ál'OÖÚ¸s¶Á… eÞƒ…çT¢ùƒñÇøé…i=œ=>€ü–a €“ë6(¶;Ó‚Ñ¿G_?4q$œwv³£8òÛÖælÀèŒÝ¦MUAqq*“Õè’‰6|`hꢧÝß´éŒõëÔ[ÒÍO#`2À&cÇŽöÅ’†·±g -̧`؈DœThôüºfÍš³16@›‹Ð}ɉœü;þ߯]GÏ &ß4ã K­,= )ɪ‘h7õ‰þïï:yâÍÐâ LK–Kk ‹1®&ÉÈ»ôÒK#™—Î$¬é³[ßU€Mî~¤=Î=G ¼újÙ«—â 9-ÖÀN`PšO/¼°ÎéÜÞyâ5ãt‚ñTäLÂû¯()VÇV¬R{_{]•`ûúÊÅ®üBÁø""½Çå—©.S¦(?Ž(ˆm­ä“RcåÀG©#ヌ©lèÈj¡ O^&Õiô(•|ùå*¢¿&Ô>§•aôÄí ©âƒqÁºEc5¾Û^÷ÝS`×úsÎEš>þDÍÆDCúø¼+–Ú[knàïf„~Ë.¹äâw ðÖA3‡ð{äüùnÒX¼x±¹ªª²'”å(äåÓ(ÃýîÅãÿ‘÷Ûî½÷>*_g‘ùݺu»FRWäÍ‹|Ù‚ôŒ4õúë¯üø£OÙtÊŠÊ=ÎrCΔM19S†Ü$/Ïà>zÜrÛMΜ9+À ×?>¼Z«ÆuÞ7Û°Ð/¸bÆŒØ÷06­åv'äã|à?Àé7+f´[~à~5pÞ¼Öèƒj ”|ÁázÍœà2Ñó»ßyW• Æï>–A–šÍ`; ÇÄ¥LVÞÈ[z T¢F¨+»²8݉õÔ‰-[”ohˆÆ­ÉCØô\Ä ¨- !ȯ]idÙ-4(ðlŠ`P¤¯\©JмœØUù!XË…M7¡hR*€§¥ó*PøòÅ_p¾ŠŸyFËžÒá´Ð‰0~#9Ê A8ÑÐ7hÞ±QøÍõIJJšƒ±?Ë æÏ"ËÂÃÃ^C¡þ»vÉc|}M ©©SîÄ: ‡?ážÎÅ2`üÎ$àà2”;3q\!†&>°råJ¸:\6¢)`‚&ƒ'MšTÏï§>Œe)÷±Ì Â,+¿lùE è܉³U¦:œ\1ÿø!]?ê´‘þ×_}]ÿzm_I¹Ô ‚š¹Æ0ÀG­ž~úéÌM›6­F Ÿµ§Øg¾°']’6I¯K.V“–,Ñôá?­*ÐëV©mmœYÆG$wºä…£IZ;¬ã¶!?µñ£OSe…EšrÄË€ Xݧ-™¤b*Ãøéß®PyP²T2fÔ0[˵ÆÒ„ëº3Ú²C¸–³{O«Æ` :oû•†@Áj FŒvr6ç8›øÁø‰;Z… ¬’º©Äqt»üR=q|ËŒ ýñìrsŒ2˜‘‘¡~Bì=rèÐ!SnnFÅœèÕ˜¡*¼ ‹ï¾û¶w×̲zõ*öÎù70ˆ³æØ“€¾ ^_ÌDˆyVÔ @ľöz#¶Ã™ƒŠQ†C÷5zQuo€^¦ËÚà ö ðÛ°~cÒ¼ ´ÌýˆÝQZW*»##­»'¶É½˜ï»ÿqC3QéÊ^_ šu¨}ìß¿¿ðÞ{ïeÄÐu€ýÃÊá$ Û¯^øÙô¾£}’Ū?ܾþìîäEÌÈÿµ=¬ ר@i ºù&ÕݬZ¢PM×Ñ;ÀúaŸü0tƒ,ÂÂŒ0oiži0ÐðزåZÐa`BÛ{«ùdÐežg´]û¢y**óåù¬Äsd|@ƆÊÁŒë EÞ…Vß\# àžÙC…=.BÑœC’±丵Rž¦xÆß6ô<°g~–#G\ˆsÔŽ;5CÑÿNœ8ñ ’„;¿F-ZØÆòøu=€%lfí5c§M›òÒîè65~ô1?ýôSot¥Õ•¾®ìK£!ÀGâST\X±oï~6uøß"l*Ð…-›Xˆ#‡]wÃ5á³gÍ ö÷°(ºÿkPYi½CƒVÏ›7/=??ÿŸHú® @>h1ÿ°©ð ²è;w®š¸x‘Š4¨^+*Ri¡˜P ïùècµëMf§q …‹uüŸç׌L×øaN³‡J…]æ|‡('¸žªò–ÎâÇ»‚òÊC°Y:ÆíÇlêÄ@Bè£Þj é²§E$‚9ÖA%\Ïy¿þZc´D1âö6H_¹ž…]ð$hCì:̓i‹ŒàžíDÖÂú¶)ïQ£Tü¼yÊ„šüñÍð`›­BOæQ;wîô‚òOÅy d¤é¾%KÅWUU¿‹õ‰@K¬žÓ—èú¿ÝxN,›à-9^ÒÀ` `UQ‰x ²§b«jÊ[ŒÑ€A×ЈóÑ|0÷ÀöV²DÀ€Ž{ Ø–vBb‚ï¿¿#¶s\U©)}ºûk ×üi±VWÓ¨Y†……ª>ø ë‹/¾Ø‰4nª—-»S ÆTút²`“p¼ù‰¬õ_†YÓ0*nΦól9¨í±k~¤ÉQöXk÷ÈÕ £ÝÙSˆÚrý6=†J€ã`~ûXô "ÈG4kÊ-ªuB¹èµì[~ÑŒ!Î/@Þj^Wv‹…ҊƤ8Åh¿.B,C‹jðšD|ÚÄ-ÿF•Âð î–X€ë¸£øçç© £§ %QѪ¼¦rušJ„—…ÝFs08S „nýÎÀ9h3~ü¸¹€ƒ Y““ØÈÀ8-ü_Ø+°Î¾ŽqkÊFéϦ€ƒÆ°NÏÆ±eË–¥ž}öÙA¦Jx¢P\ã@‹ò”ëµå¬¥üåÃÁ¡Á>?ý¸™÷ÈŠ {ˆ€1óø!™W€ð‡~0fèÐátk/gÍËxê¥Ô•~Ívt^êĉ¬ÒÛo¿ý~Pù:BX€Œ^èö¯_`SC¡Â|Ójìý÷©Ht{jÁ i 5l¡rÜò‹êȲ¯ [®vŸ=[ ºz^î²…Ê\F ®¢¡`Ë‹1‹ßáߨ~„WÄþ ŽÒÇà»\HúGvR1Ñ-SÖV8 @¬Aü”6h Ê†º¥ó 0ŸŒÝ`×Ã4Ä2x›ýµøGÌŒh%ۺɃ#VÃø<ËЛ£0&ùªH¨;Œ€Ø‘£TŒ€’,ìðiš;÷Šž˜><ÁJ¬Ìq¼fKL&¯ë|ðϯC©¯…{3–ëO?}ê»8~®6 `œ€.&<"SBB—ÙäÐÁ²×/i—”É)!åðPé[bª4ïªîm­©`q !ê‡!‚K>ÂfZ6iüÔÁ÷â—À1án$3õÒË/:ï¼ Â9à|¥%ê_³P-ëpËÕìËI/€? ¼'Ÿx2íÿ!“»S‰Âó§d›ÎF©Ð%5UG­»'”¯6à‹kýÌk–'¡\Ö/YŠ6RïÖÅŒ>ñãzÃÐòÛvqA í`¾XLÞ>` *:ž©ŠÓÒQˆÙo žÇ(~*×ޱm[›hÉA4± £ëÌÊÏ ûçŸ[<~óÉ^'0"^榔?že Òl‘wÁA÷æÐdp&Ü_(…2H9<=¹ˆ¤¡« Ž A“Hϳæ¨îÝTÆR¨âœ 6J?xÀ¦NMÕjÂÆSP@¯ ï¼óæ·¦M›É ¸:òÍ7ßVÃ8”š:e;v\_¸NÑÑ‘Ï}û­Sô ؼcÇŽ ‡ ‚Ï>Þ^6èM¬§Ê]½ÒUSÞúùúÁ6¯^õ]>îmð1x´ˆÐúÇßI<äóÀ÷uŽ‹‹÷Ò^BÍ2ÅKH«…:kÆ5/gÍ‹Iëãy«Í?mÎöÙgÙçˆílãkÎ^Îܬø"(jÄÝw©á·Þª8ꙕšF³iØt8ÛðØcêd35Á˜H¨;Ú¦[åâFÁ«u¡3{6e²m¢BÔFéC~`BUˆ /Fü·H!òÞÀe.F·Ëøî;M9%8.>€Ê+MñgLWUˆðÏƒÑÆëkº6³„¼Öx.V©Üýû´Ñ9lq‹Ò²ù¢m ½Ç>ùLu5á“ãó°H)‡úáëoTäˆáZ𡾜r¢¡ä9s4ÏÐñŸ|IN›‘+0•¶q !¾Gì:÷öÛóλ;–,y|?’(i,™ÔÔ©iø.Ã~£  ºÚëUΘœ‹¼ùmذaÈYg £Æ«Æí_­½×¬ñW[*Y,o5Ã-–QA˜+Èû×_¶²gA7€F€G‹Í?þA8dpðàÀÐe)`šÿЃÑÇôǀܚ¢×\ý|«-–¨¡Í¿¦ý¿šCŒVÝu×]™X>…4Ví) ¸ØãÀB€ë§J%ühL’Î:KM\ºDê”Áym%,¯^£¶üß3M|¨Óî¾»å]Êð¼*Ptâ—_U`t”ÖMÏ™†&áhZ‰›0^y# /ÿ Æha|€VËfþ?`ü€_´¸Ž(è°ø4aÄœvâƩ“?àð‘£Ì ðlz_x< ìBÌ/p "•æåÃJÐÆ;0*O›Òr‚ƒ4Oº§xñ%Õ³gmž=[ôn_³V•ùx+ÆÑÔ1bÁƒ8ã1qSWxÛs‘·ÿ@Ýcô„°ìƒ÷mÿZù£oæ3‡âV?üðc0¶Í¦Œ +¢A?ÿ+¯¼¢2//ï\ìëèRtþ…æg žÛ\TTtºan…ÀŠ 4XÚûk•¾ö›e¯¥ò.Ùîøð‘âãÇ'âæèZé ’x hïŠ.Ù1"€uÞég×*ÈI_p Ýé—ܳ‡yÈÐÁæ˜ÏÛ×ÏÏ4~ÂÌïáçgÖ,MÖøùâiMôX,RZ¦ºuJ}ûå—_f¯Zµ Õ%m½æÍ{è¡¢¿x `a`“çt§£çÏWƒ¯»VrÆ·6–ò‚µvÁ#¨ùB‰4"ìï>êÞ?©˜!îç6 E/x_ص0îæu‹«-O?­ö|ü± ÁÔ¾èM ¥gOš6_¼"? jø0ÁyØîY¸Š …µl*Ö²3``åîßo‰ˆi™w¡þí ¯ìâ C1ò_ÞÞ}ª Ћ״WxN5 ÷ôlH[±R@‰Ý]i~Þ3 €£Ÿ~Љ†v«Iݵ‘ 1DæñãjøÉ<ž¥ ÑLÃyhð5pʉ†ºŸ~ºŠÁ;I†J­ÄLFoìieÓ iuòƒ>Ä«R[¼PÉÑÛ7@D¢šÔÈøñcM¨Qߌ_]ômXòáqž öŽ\e~ctÀé« ((8ÈÄ`@ÝËZcÔÔú¹ÎÚ¿î…Ey­¢¢#ýÖ~÷=›¸Mèé–åÙX^\°Ì²€À-Åþ¯Ò-i¨½©P¬ÝÐæÏ­)©“Î8ã 3>¬àÎq§ˆ~·>ÊÖ$¥ 5ûJR^p} 9]éë/cM^D¼¨Üvôè±r t/ç Hf¹–XÛÿ£ó(ÀÝJIc%(D’Ï;W »åVÒ%^Ë¿•£º‰ž…m¯ÿGmX¸°ÉtÐÖ™òøã55Ø&¬) 9¬m±²1¨Í±MÕîÿ½‡Zæ¡:g²°Ž’óÀ*]qXaz(NÀ%¼ï­·ÔÉM›4c¦ÎMØó…#G&ì ÷}žspRRaaO .+Á÷‘eËÔž_Våkßø4vZ£Û‘× ädÕëê«4Oƒ(ˆmÎ.|§¶/}Lå`샸¸URRª8˪Vm†P|g#ÿý/x9X5.ä¯ ]ÿ`Ä¿Íÿø‡*Á@BŽ xæÙ@­¸ödncíùòoj·Õ[aM÷}à)àg zñâEÁÈ×n¬³f¬K6.;ƒô8“¼>gΜi·ÜzK+Vº ¦[ ÊYT¾jâ°jÊ\6ð¸Ò²Rv,—åä^+ÃqlQQAõ®»+6lØXˆ±ô‹Ë-ÀK»gëÛ±êú"À©gH÷Ø#@x``€÷m¿»5lĈ‘¡q±qÞÁAÁ*]Û̘â•Ê¥˜v–NË rD¤– X‡ýrK´ƒ´<µ—βäÏm¥˜æõùçžOÿüóÏ¿EB—k‰µí?3—‹Öl’@ ÛJ÷z×””Ö.gÓq¸-D­å‹«¯E­èP£gù`ÂÓŸNÅÖh ^¢}¯óPÃ:ˆž¿¡0,ƼîÍ g)ì}É%jè-·¨ ÎU!QàÍÜûy_x×Ò¾[«ö¿ý_U¸gŸ6hOK/ÍÚ“?š@Ï=W êûöΠŠcëムUQPì(önŒšXb¢FcLÏ3Åô˜ž—ž˜|/½÷ò^zï¦WÓ5[ì=öÞ VDª‚øýþsY¼Â½— \„£ÃîÝÓÏ GÊ(Uˆúš+çêï0~€ÝKdŽ ô±!ù©MÚÝæÁ}²«-/£ g]ÿ#¹>þ4oíÈßÕÂ9ûæk~ǰP›iÌã%_~e– nêáMpõÕ×à÷~P §,†o@$ˆØ(DE §¼ñüóÏ5býǾ;ƒ0+$¤ê ÷Ýwß¾BÚ9ܧ[qÃ__xá…†mP¸˜,$®ñçb¸¬úõ 󥱋 ¥r2¯Å¢t­ß¯T$'%%å$&nI™>mzúüù ›‰•ÜïIÊÄÃý ¥u?ž¾Âƒ¾qÅàÃo½ý¦šÃîV÷˜N#Ç7ªËâ_½Zu…Ûd²„Xj]T¸Š%HïÏb‰„Ñ5ÏŸIxÀd2¡˜{– âW‘¾jÁüï¼óÎ.îy¥4õjBY(ŸPî¢T§ C¶ºäs"xÝÎ ­È º÷Ü×ß4›'NðÙl+ ·>ïgîxÄRoÐÐó̇ŒqÁK ?B_åâ'û€ÝMÆŒ5ÚvõTŸö$¹Ù‚}À¾TÙ4tqÎEm«(÷-IÝÜçß1™4ÉØ›Î×;çL‹xßoàÙ4ìÙÃ4ês’©ÓÑ’µÊ¶oßa&A ú²èE9«V­Ú½kÕŠ1º¿˜Ñ<ðà÷~´s¸«H<_5Gë^={E‹9“ e´¤veŒ\jÔR0o ê74M71ML]\/kヺ*FáŸQ±ÀìÖ|êÕç| ˜˜Øð–­ZUïØ©C$ã±ýú Z?%=5‰’M)×PÑ ÉÛ>¤œÒ¢eóªO?óD½Ý{VkØ QP|£xg[b4+¢£’ƒøµÎØ}眶®ƒl!™ˆÕàPk`-Ÿ‘‘nµÊêÿ™ÉèC?øàƒíLÚïhòsJiA ¾ò¥£¿7‰#Fý O ($؆ÖX”EP8a¥Nš5G)óžYet玦é•WÛ¶!".ÎÄ7mvHŒÏÆÌ‚ ‹2±¸Ø5Ú¶m[VxxX È1…v4 ¡JXQ”†cÝèïEd Œh@‚$}›–ã‡ó’±5–ÿ¦6=ÍŸ¨WÂDТ®Óf×l­îšÛZÃuœ";ê0r !€eSô7„„ÕÚuh±iãÆ½{ö¤´åùN¥Œ§*^¡N™…ŠLDòV>¡t;åÔá÷Ü3¬~ƒúª&4ijbY¤4øJíýÑd±Gr'ŽÕùÛÉ“{Î×w­ZM2PðákK…S!0mêôÔ~øA“æaÊÕ,èA›ŸR®¢ˆº/dXÕ‘€>ÇÝu—MÙ[è¥PA‹á´§ž1»—Ê.Ò 0–]ïºÓ4êÝNC6§.B:í™gÍ’?4›áú3¤e!p¿0qFÑM¬¤8ï2<¯ŒïêvïnbȆ¨¬ˆÊ`·ât–çÎØ¸É$‚\ÓÈS .[ñ 1®úFªAÄ5èßß„œhÏŠå¨3Òݾÿ;¬¶G'úõmx7Te ¢HbdßQ æ€ÿÝñY3 •Z î~ÁpœA ™p~Ç_~‰irá~‹þ½Ý bç‰êLk@Œ‹ `©( )%òÁý AO¾®~ýúcYÃ>*ù¼=†„C¸téÝû„èðˆpܰeño,Òoò@úäZ½s‡‡“ö·•ÞºŽY65_ÿ,qK (¦ c`ââêÈ2¤S§ŽÑUC«f¯\±JëêÙIvPÊ%8ت\v¾ÖsD9iðyçF\vùeõ”9ªyS ²ßPî$AˆdÖ¬YcV¯Zm“olFŸ,¿><˜õL{¶´lÙÂ4oÑÂc].Ðy-–ö»¸Ö˜µëÖ˜+Vf¿öêk‰þ‘a 2l늢K5iä~ÊõIü‚ú„ ízǦúT êûa-Ø2lšâKÌ·Ó~è•fÇÂEfÃ_ù”÷Ô—X¨’ Å´hn3 J ƒ?uyåd±c"ÄЪ/°X¹²DöÈTM(’€Æÿ:×ÄŸ~š• øzGE#õ5cÍß›?ýbrèw±¥ š·,ܵ{öÄ>à"S³-j$‡SŠUس‹`9 ÕéEÞs–ô{£ÍX"Æ*?C.èÿ°nýˆ¡k6kO ‰k¿¤žÈ÷)ÇÙ¨d²盈D ¯²7¨ß·‰& Mʆ fŸ|Ý„V”›èˆ•dâlññá¡Âhà³òN‹r›²T7 Ú=Ó Æ- UÃŒWŸ|²ÍΙòË`M³ ]Ñ;Ç%Br2€›NATsÄAÔìðN:5»ôÒKêÕ«W7¨es#§×l™/Ûo¶ƒØ¿ùö[3"©Æݺt31p–ÔVÌ6iji:vèh gÏžmþ9Šd«´×ÕÔAÔV§ÂX¶é’eaô£åç#>"Eì@E$äÏYçñ'©S·N½°úuX®ÞáÒ×®]kÞ'bWçNǘ–Lˆj¸çá[c@>*-‚°Zc=€&È>DÄ2þ¥ùÛo¿™ºýˆ8¥)ƒqKápÝòC%›UÕŒôŒlTBÚÒ×ûÆ6ÎÍÝJä/ÑÜ£´…C(m÷4]o¾Å•‚•>IÐx*YÍÔÇŸÄB?¥Ôº¢ûH?Üïcpí늪¡bâÚâöY(å}PTnVÀÒo¾1ëGŽ2+ ¶²‹øq:Z·Á¤Cþ‘b¥öÈf5 ãëÀÕÄ"²öà[ÀXf‚LÉ/ —Í(²ø…ÅØ>Â4 ©LÊš5&ä¦÷WTÐ5Š£¿sÆL³]>ö‘Øij¡¨)Íú¡(ª_¡ViZìÆ·ÏÓO™†¸¹/\Ä@ùfýï³uÚÔ€÷AbåºèƒÛ]y…érç¦Ë-·ØE0‘°µçóbŠ}_q©î¸Óu=íìÆã`‚=ÕîØÁT…û”®¼Øt.Ì}N%Ø©ÛûÕ¬™å²e…_äªù#‚iDOâø‰xdÛt¾!X]—dLmw髤R1p¯uQ5°2[G!óâö5 ×íxs$¯]á[‡ÄQµ]v%xÿÎÐé­ÞÆ៛ø(Ö+ ÛØ‹1숴š >¹°Jå§àVûö%øS¸Ib,rÐ ô Š ð$ÁÜO9ÜÃ ß¾à‚ êöìÕATC«ªu´æ ¾ÃŸ~ú±þVÓ¯ïɦ*\Im…èí"N×ëwmu­þY# ‰ü‰b¯SGÄVû|1^ÕE2ð–D8qk"R„facÿ/îåxŠ˜¹²¥ ´=÷ü§¢/3 µïv{ªÁ¡!ñ ÷â¿/Þ{÷î$3ü³á¦ÿÉýñ µ”¤åú…øAžzá¥|dü¶†Yb'm$ïI¶nXÁp“ 2QBcþcct¯’z.Ë™09÷Ø_eoæÞœ•+W6¤_Bæþ€¨p!ýÏ("R!üðÕsõxèAÓéš«M8–ÜEåt=µˆcÒQ'b¹=ûÅ—ÐùÂ1Zħÿ믙¶C.´Á‚¤ÓR Ô³ËílÖ+¯š]ùܬ`8mšYŽ:C–ó±X!ç-J|¾b7¥Å‹q¯Ñ²…©ÿ¸¤"ÉË–™D§R/*ع,+|âlÿjêö¹%Q)1ÐWùº+¿@­nÝðùO5éâr%µ*j_UŸ¢ü›±‰È¤-©/Âr½tJÜ×#Ô€Ö¦mO6¿ùŽu¦• ¹Ñ½—æû ›Ñ„e¶ c âjaÜ‘,Þ] ¸bª‘ÜfEˆxeåp¸è8ø¼ÁqÈþƒÖ—‡l·´œóuù×_±ë±Ô¸âêƒáî-8u\•]ß'ÇΠo655 ÕpUAÆI𜹳­ 7q{MhÕ0ëÙ…8˜$C9 .õ%B`¶Ú*P‘€ö¼ÛŽë~\ØgœÃ;3qµêØB#¾ùækŒ÷ºY£éù…ìåêl% °ÒŽKäo!wÒhÖiÂÈÒ?NH E–´Öïtê´)蜺òQB4p/© Ry}*dÆôš8S(2&ñœ”Ñà ”Z¾*êœ8à¶W\nz‚ü1¯¬’ðL}òI³‡ØæE-|¾ Á‰½Mnf."-Àj×Mìq×¢ê¡#ŠÒ·Õ@¢ÃZms½+<Ô;b‡˜ƒrý¬…Ê¢.¡ÆsÏÒâK/…pdd¸„³kÉûÜJ=àÛ ‡{«Ç;•}@ê^óeÙ²¥&…FÙ´"X„¼%Ò—Ážö5 ì>Ü.:ºÈÎ4;rw1°¢ ¥Þt@’]—´+É^×P‰:¬Ä1ÿr2;;« ¦öîܹ3‘ë&;×zØ á¿B¹¢ÙîÂø¸{<ü°iùe..‡¿, ÿVÿö»YŒ±¥¿ o0â»:p‚ÝHEÜáškL"ùç8%]oÓ]¼ÇÅ?(cò£Yý´¯V”¸§+)“m¶=_ä9DkpÜq–ËÎLÞmÒ‹k‹e°Ñsú¶íøûÇÛöý}Ǿ†BßžâÔï×ׄó~Sá\³0Ò*ŒôØ&m)ÈÓÎ3ÌÖÄ ’b¤ !*D_=Þ³ Q%"ÑØÇXïØ±WåEfÑâ¥f’ޤÝÂGLI]r=xš‡bj6mjšô?ÙTC5¶¤¹WÁ™üQâ²cRO\ÚpºÿÁgŸ}Ví†TiPGv‰@.ñ’„}×_}IfÄÞ6*«tü®Óváfå§Ï_kiã ÿ\ÆNçÄü‰’äWçµ–ËE<õíß“þ6]a脤NPÄW »ƒöíÛ›½rå*&ͰV÷,ëP‘€xqW\yYÂEÕ¯SŸËÜ!øi„9–0œÕªGÛ*ƒ!î`–ÈEüîoÓ5—8âÚ±\¥ µDfîd”Nó ¿QÓãøîv2ÙHU6d%YÝÒRƒ¶lIÌZµjU}æ~ ·ýxö¿ ü‹â›õ¥B}rÈŸôôÓèú{Ùûq¨ÌA&ˆ{Ò£“Õl»×¾iqŠnÞÜíµG}Ñý?ÿ1­/¸ÀfëSv´ÕˆøÒ½Äõ«{ãÙy‹‚×›ñ„ú´éïIfþ[x\æ¾cOMTÅèî$ì-ª³¨–yÈ}‰ÄeP½e “ ÉqÅâWdà‰”÷à)°½»¾ Eo”M„¯1óë>ôÕeÐÖö­Iƒ`Ù(Ûç~5âV‰¾f0¶Ž}ÀZk«ÈzzÏ%î«ÛmJkWϬ°È©K–ÁPdZ‘·Þ˜ûXD`¤Yo =“'`LEÔîÐO˜abö™]ÄÙ("ˆóíLEI+âµE­~M—.]ŽïÞ£{µõEE:.Ì"ÍùsÔ(ŒöêâÓ_ËÅÀ1FBäv]`w,ª IÑŽ»ˆƒ ËÐ9j_]_I€¤{ :U[‚„?tn˜bbkšñã&êÙea9Ræ¡PdRæŸÀ¿ê9[âÇ\3¦&y^$A‚`‘ÚŒ³,ýEá‰{Ïä#R¶.ùøgg»2ý)¾´“iÊ…Ýu¹ƒøY'rû uTD…3itB“C±"à^W@í(\«TVE&*U}SЧ/´ Çå×â¤wmíµñÄ#¾z=Ÿíê¤ð%_cö yñ2Z<‡þPcÔ‡ó—ážU¡0~zV…Wõ»W¬4û1 4(MñlRû[‘ŽW_m ®}ÿÒlOÏ$ÉŒRùöxéÓê–›Œ’.Š3r]ñîûfúw™Mu½»ø–ìIÔW!êv7Ü`ŽÿïK¦Þ€þ|||æ¹ÄL‘[§¯;‰Õ?ýÖÛÍÂ×^7©$²’…ôµÈ})Âúê¸ ߆7¨3p€Íøèí¼s\m)Ýrûî³QAÅáN¦þGïfôRý$¼«Â«U‹ ’è_븈L%Ú´uöÜ9Ö Pë,6V”ÌC$³’‘d_¯¶úÇÖ"XصÎM•*ÁlaååÕ€ ¼÷gÁìAH5 -ì"‡rE~Ãåâ© v² ‡.ïÛ¯OTçc‰ªžBw£dKABró“ûˆlD –wmyÁ¤…´‹½Õ%ƒÐõ¢eÉo×þh¢pØþIB|Ê4ѯ܅Hg\Té>Q&"ÿ„„›H™«taòžÝñÐìÙsR©<šâÎ7æ÷JŠOÇà¬÷SO˜¶¿„Óòy·âŸÔ¢*ä<õɧlªXo-I…Ñëá‡L$‹¼GdËÇ*BoœŠ>æ¶—^êéz»I‹èXNF»Uß}çóÊšX¯Ï=,…jj|¶sÄN2¯e GXŽ0‡çNQxf©‘×¢‚ޅ岑œ$-^b]ñ"x¿Åi«À½é«ò ÈŽA†nH”2PAK-Ûøú(b 5h )ãöa15M(oÒÌÙÓf[Df…÷UûÔSLüàs‹4Bü2 Å@T¡µ‹@TirHÀË5PJCï(JçÿºuëÓªuËÚ±¬0cZUæÍÿÇ2qJ‹,)®Y»&Ó3—T•.óQÓØNåÜ­]©iÀ&â‡5u»lÔ¾jˆ¡ÓuU ®Ö0æ«.‚¥ >Ž š;{núîÝ»E¼Ca‘/ÛPQ!Ð3O=í”ȆFTÅýOú½Ôé3§C-FÛÙ d/àP" Ëú÷ëœï[äïšš® âJ,£>NJ& HoßÞ ³c·.¨„ü­$€45=`—™9cæÚšÈõ«rÛØÿ[ŠŒl|B- üN|ü1>ÚYT}Þ­¤'sâöïügžÏ†: òo6h×ÅGÈxËÌY6s§†¶·Í%—Z+rOç‹sL>ïï½×¦áõv½¤µ<Ú@IDATÝï¿׾{»¶Ìg‚KÊ×­+öÄ ø‰Í/ ŽÚÕ³=έoíÆ7éÛ·Ûà<¾¤8EhÝriÖ>·ÁpD³)ʼnè(!@_•µoÇôéfÛÌ™ØàÙg,W:>ø¢të°Õ­–ÐÄ攬VŒ©Z»–©Ža_£‹.4 OTì@_R T‡ÛÝ‚„\0‹©«  ZË/8©Ï‰1øàWQ”V­Áò°’jõ‡~´~$q/&d­©'¤/J7Ï P´†Û5]ÆÙö‡%²xÿ2êvË%t]º-fNÄBƒõ-㘎rb YK/•GÄ8J"¥LƒË:¢Lw1 ÃÄŸND5¨¢´¼.JYúœšÑ59‹¡”¯ Q…Àì‡` `ƒDè¸~;ç1*±Qýôä®É%Q“ÄG9H!åG*Ñ¿ Ö„ýIB$ ÒeíÏʰ¹“Jwæ:bã`û©®R>¡t§x]×ü‚óM×Ûn³Ij$ +Ë ä¸vô³/PŽ÷V¤úÕ‡æ t.’Ht^Sá…}ÖñzqÁŠ)¿ð“O­EuÁ³Äl¥\³¯¾¬]ö÷œçˆÅ¼.[qõ[ñÉ'&)Nq‘«ÉFü³·NœhÈ:ÙxЩ&4‰†¬ ƒ…?ÀuH;¼î—_Íz4)~qú*yúšµæŸ‡5y§-† ±R‰‚q)+oPýP½y3+w¡;Ñ+BjB[ŃægŸ‰ëpŒ™üø–øó³ᕇ)3)cü¼Æßjµñ "[u8¸ÒZ­ƒBôbÜÖ­_gÈÜgö²¯÷ä:GÓÔavmÙÑú­qÑø‘Û}úÇoå{‘DX c®ñtµ¡ûZ•îêU¦+ÉD$¨½L…ß‚¤ e* `%B⮞ƒžî¼Ï,Tôº¢- ¤î^D ˆ 8Q£ô².b &Œ£3 I)‘‘föuoÙ„@@hRYÐÜã¿&* ~Êð)J?Šw ~ûk¯1Ƕ*‹^YGþz¥ìñì3>ÃåjÑípÕPMÏ£è߯2T¢Y ®  wº}þ³œP¢¾@H¬ÃUW¹¬­µ¨E w§ÄQ -¼‘ø«>ýÌÅe»æn‘žV‹hvòìÞ3›Gýiš_~©©G†G©´—ŽYa…Ûð}(ÖÁ*ÜäÇüaN»Åé+ßû®)SÍôI“MüyƒM³Áÿ²F–(a_Kòœù¯Õú"€ d#x°e¥\nHé¾Ï=kÆÞ5Ìd"ó¤ÿz“Ò“âÙUÇφòU‹„Y‚ײ륵¥r!y"Š¢‚•m•©\]¬ù~:ZŒµ.(ÒŸƒ4nšsåÛÿìËCKß¼ä~ö޹÷¥6o€ðˆ½ž“:]‚Óݼç@YÜ:ÔJYì[ û”®ÆH¾c ;¬Ÿ7ëÒ÷àxš%Dä•öU@ì:–f§™4ÕqÎåî§Àa¸²JeØŒQyB“E³•víÊOM4} *"d¤Bª`a+YžC¹žâh«ËwÚÈvÖ0N¸ŒƒbÒÏÿàC“¶a£ÏžÖÇs¡‰ü÷ýf„b\é Ò”8“½ßÌyý Ÿ6 º¤ -¬Åäh!½ÐѦÏz›o˜&Z*‰Å¼æt¬Ø<ý¬™ùÀƒf¹E¸iÕhÑÂt¾ï^s܋ϛšÇvÎCÅy?"Z6`2ùß7™Ÿi Z%‚:ÚAëVâæ÷{éE#ï–"€ìž¤h °d"lß¿Ÿn±’Ò·Üß6™U…Z·ÆÚBȨ۵ÍTÜ›ýO"{‡Ë·×Ó¦¤ÃúÖÅL)±›³¯ß"*eT¸Ÿ­~ËÐÛz] ÎÍ9 É+Þ³jד†ûÔ¨yiç蟽®ß® îv9égcÜçB¿Šb'Â~&€(B½D¥ôµ[G Ç,çϾ¼l]ÎKMÅ„HÏH·çC²ä*RÕJ ,ÖgêkáÐD%ªëÜAkòîdæ..x„W“^‰Ñ{¢ïoyî¹.1d9@6Òׯ3Æ,xûm÷G/°/îOÖóŠþV˜ˆÕ"" p|A*!}qAÿÖÿ9Îl‘1”¨Ž»bk¡3¯|T-÷§ìx2¦‘$Øiã ¦Aß¾f%!´wL˜èz6Q»EulvÏžcfá~V÷”¦ª-éŸ-”àýižhÄF¡…7Ÿ`õ—_™ Â~{u‹óÑw}Ëû‰·üÍ7ͦѣM+ÂLK*r´ƒÆ±^׮طÜg&ýçÞ¢¹W26Ã)S4Féb–$IâÎÿeïÃ…‘ó&ä/‡i;ù£©5ÞAâBäûáâC1·q˜c޾_j1zyRZ®µÞ½ÝÒž¤ r tª_®Îá y;β¸už ,ö-}ZHc9³gÍÊrÑù&#=3¯íp3{vï±>Ÿñë?H¸öõÛ™Kb#ùYÕçҔðˆŸ:!L®ªlm!¦ž>ž4¤ qd‘rGZHe‹°aÃEÒ\>‰ÒŽâ„HðÓ⬳ E8B3,2ûÅ0ò MÐ×#£ÆËðØÄý:IÄ¡àc-.(iŠúîK"¡9ÓáŠ+Lutþö½¸ý)K×9σõ}Lm8Ó,ÿ)ÏÊU.žÏ®¾Eè1õsX¼·üú›Ù>ño“pñê©&,ö|g"0H×­¤HkGüdÖc0¶Ÿ[ﯨ o1cõj“ºiSQ/-·õÅ7Å0wňf+*?AÌÌ=”!”@„ ÞÏÙ±cÇþì¬,¸©ƒ$€|ô-ò‡8‘·¦Ÿ¶v$-p¹rñ;FØâè)ŠÊªµ_…Ê®¤]VŠàþ|jG^Eû þSÃJC\÷§3&,<Ô¬Z½Æ¥ƒ)Y†W÷[—ê~E!2ÅÄ•+V7HOÏ8€ˆu ÄòA¦Zf'αb~Mû’e)j_¶¿K"àNX œ¡>3ËJ,òç‘”@@¶&ûºGÇ’È5€ÛÊ!/S"(‘qj«(’Ý”‹©ïGK2Ùµ< ,î[^ /‹Ó@ «ÿifúWúù¡*Öæí‡Å ÂÿgËKÛ›¿±Üß²Úç‹ör¶ðÃŒ0ËQh¨â8¢è%@¼8±ð–®znIÖëÝËÄÓ‘»ãÌJÞ·BÛ¹ZÔÇå›QÀ•ï¼g6-²åÐ+M=Üü ²¤ó^sOöm¯¿ÉE³ê›oÍV"é IB uÜä´Ó\×–£ï±¨Ïé^_R“PäN§¾Ä$ñ:OÕ—q0{ýº ûп‡ km(9¬ü¥êu.Ý¿ÎiŽªX1¿?¢~Ù7èz »VkÍ—N;®¤bÌœ¹¦5\Å…‚í5Šúîp`qc"£"Ìô©Ó…k´À­tΕå­käÊr×·¦4Õ©÷‰'„E’ŠWAx„ CÃBÍ"âºË€D”áÁ¸ ‘394lA\o'LîVb$ÙH´äPYÑTî1M:Ù¬Y³†¸ÔÇÙIêyOîâûr¾þòÛ$‘ò¹ë.eûoE"$í8+"2"¨Ûq]£öfìµ®ÊÚ·‰À!¤Å”1Ÿ£'%¨I`·ìK´DÀ&G²Eú²2•HÅR–LŒDÇt~×É0å$t…¢$Ø•´Ã€ü÷Í›÷ÏŽER¤#(Zðz>ôÐQa`&î¡!™È R·o3©„q•8µ×»rxzï²ø—~À8{|…L«Áƒ=*ô˜\ˆf½ô?³`C¾ )ê˜v—]vÈ{õU¿Bœã}Tå=ǽ±vÆæ@çnß“Ûü÷k,rë+¸,ùÓvì°ÁyÂjÖ(×~È=é§¾-Šõ  '¢/ âþrMî]:›6C¯²®fžÎUÇô+åOa—‹ñ\ó3ÅÚcãz÷KêÃukݦUT\8‚ jét‚ýLŸ6Ý&ëÉ‹dh—‡\ᵂb AìV-€4@ÀÞ¬½f3ˆÝ2y¬ýÖøãv]×5"Øîa~l Þ¢OJúý«¿ò/¤Œ;A€/)Ór»T¦7E —0†²cÄ?›sÏ=;6++;¸FNMÄ:Áørv5[ þe!ªÀ.ñ¿KߣI¤€+V¬È“ˆ²Tv(e„j‰o4a)MU&J6׊ • @*I öñ±lfñ8XÜn‹Ÿ&Í®»Ìœ9;…I%à $~ÀŠb!n};Z­}Àø &áÒ‹Mü@ìjźnZ‚ñ×üQ´¿„³Ï"õðqfíÏ¿˜ è¹eìÇGëöP¹»Ü«ÕWbSà &V°ÂQt„ç߭Â>6«øÁç<׺(dé$HYäå|QAÿïÙ³æd¶iÓ:*¦flÞÚÚ’ù¦ lZ³µv a[±?ýÊcÐØc—’MŸ=&))É2uòB…«A¿¯kõþ5÷ì³qNRÇm0.DZËP ë"øç¿*š«`¤kSöÿV$ €ÞF¥gl­ZÚµk¹Ý|zªÃ­(ìczZ:\þ+.rÄBÊ,µqãFÅë·B’M‚ô`©6à 4¬$À™hLžÌô +1˜è8 wpqÿS÷MŸ>#‰‰&â¤7¥Àj#dÔùÖ[1·òùñ¹·]^öõl5›&˜F'övE+ÓWÐx/A Ã1O ãí‡^A|{ׇ꩎§cÒOzð!›'ÝÓyçX{<š¢b¨DþΈxÞj­NVÀ†pLa$J^´Øì‡Øv'ˆ=_éá(méýìš5Û$Nž„[Z W”¾\1°‡+ü>¤?D’‹.]Lm¼² SA~ù¡ÁYgZcB!‡£ômf YþãfÊ#˜…HÂ4÷sÑ¢E–‘ò2.µ9þ¥hzÁÆaהּ´ômÛµ‰$`ÖbÖá(ÒÿÎ z¡¶zÝÎþãý:[­ï .0a>VÐGk¼Ò+ÄïZÔò2¨‰]’åúYg47d7°|ȸœvÆé¬ÿ¡Hx÷aà*""óý÷>”×bÊ«”rõyéÜ9ó‚ 89 J•e¸Eè 44kÖ®±.‚¢E-J|¿ñ}mt…–›¡è˜M4M:žHlT$¯ÍIEŽŽ_矾­ -iÿÉðoõšÕ9Ÿ ÿb'RÉOD) •ÚõŽ;l"œ'’ö#-"ò·ÎG¼ôë¯ ÍëòÂ(0´Ùбåù 2f[óÇ(³äÓO}"vE+T¼ÿªQÅþÞ£BÖã]È…5¦MkSB ˆÅsÏÒeÖ¿º¸„@vJªÙ†·€ì$ ˜}/ÈÚ ¾Ã˜LÖ…0ÂW8àŽØâ„Ë3á(}‹{yÞ¥_cÆÝq'ŸÆâ)áåûr{þÓO?ݼ‚DO ’ªˆá¸tãB”%…ÖÎþ2æjÙªy¨ò(úªVØz¤Š&»ªÙ±}‡µÐ3 [ªC[ÊòËÍüóm8¹îIb £l“MRK"¬œΚž‚úWÈ¿?Ñ>ÇÇÛ{%%'ÁFšÏ>ûbÇ—Àc<b®òu¦tPAìûz÷îU]/?JQ¢û&„Òõ'ä¯À>™L‰ù…ð…øEèœ; U€ÄCš8" dX²—(RŠ­ë/ATC(Mf‹-ò1MܺÙüðýˆ=+V¬Tò€Ç)M)²’-QL4EÆ+Ö"Y µ£ë€ Ζ}÷½ÙÇ‚åx-±Pê`!“lbãI;ìµM’%t·»ïÆe±‹O"Áß{V¨z¼©nä9׫§E®édÞãb`‹ÇQÛüÄ™H‡XWl‚°5‹ÝVÞ» ?BÕH¥[—àT´›‚½Š"6 ßÀÑróÛH,‡±wßcÖýú«WÉZþg?‰ô㯒!S!xµ~B¨h/ k½)”@¨–ÓΉ[«7kž[ [¼D˜BrÏ–jv<ª"­ÙÖ½ÛÎ-!cm½æÎ˺i×u­íN\!•j¨„„$c]OEU° ÝKØz÷²÷Q´À,ì ¤}ðÞGÉôGÜÿc”rЋYB9fãÆMñQQQÙíÚ·Ò‹ 0J-ÙŠ‰#1¹¶‘LMjM‰"tÞ‘ˆ( Â@È_‘å]p饗X齈?ª·s×3zô_é£ÿ³‹kd(ò(EÜ?³ª ( ‰"ÌUdžbÖâ•&îÌ ´8ÿ<òÔñröÐÃÒå/üèc³áÏ?=‘ï—@gB0Ëx±Š9|/aHÍ”z¸F§ŽÖÕr¼Xó\‹;í¥,[n63røY­QCWVÌbv/ï2Ú•äBŸz¨ñ”!±°øy×–“´Šg0÷­·ÍìçŸ7û@|þ¸ᷠðÕ†ñH"*À- Nþ¦ÖsÀ÷–ÿ Ï¿ÅÐ/e]>wÓÆ-†u<=|+Õ;‘Ô :ÓÉJ#ÄÙ+`›kn0»±ò—ŸÖkÎÚ®u^ÈßY×­›7kv1’aš53ƒNdmÄ„ v'ï’aöC÷?²ɇ˜Ëë)Û¨iÓ„p˜:›kEk®ì¶d¬'uÁÖlp6ÝIqä¾­uÜ‘êê¸#Ùu–—1„BWlBh¯‘”wŒ\Hhð÷Þù`ëÊ«²©úå'J¹‚ŠJìã-§œ=kæì Úqµ4IˆØ‡Q`Xh¸}É M¬Þ~õê5y€¸|O€…”<–´¼gb Ô#¢P(IM \MvìÚnÆþ5.½¿ÿ_BÙ ó@Êév/߹ܴ@Œ]Xâ›|—UˆŸZŒWÿñ‡Iåãö ûöõË€Raš§?û¼Ù9¾·¦ìñHcÚ(ä/ `%hô]±ÈÖlÛÖ44Ðä‡`°ôÐÜöE¹ï&›>}û6’õ9ê8ö¢ …·º’^í1Næ³ðíwLúm!µä믿n† fjæË  õQ’ÓQÞ3~ʇð]JŽ¿÷+¤Þ$Î÷X¿~C-’÷Ti’Ð8LÜ¿¹`퇺I†ØS§Mµ¢~e€eÊÙuÞ±Ó5c'BF¿cð2rÑEæXÒ¸KB`ÃÝ;1,6Ã?ù,qì_ã‰9lqÉ}…ô³Lž®È2Ì5¼‘Ë(¾ýæ»rÉËtÚÀ8;T‰®^“—bÂ#Â-W/ÃM !zM w"@T¤&ÙàóþeŽ9æ˜/Y*M›7øsÔèä_~þ5™6dse©[e…*öZÈÒ6o$;blÍÚJÈlˆ£lÆ×¤#°F@¼;o Ÿÿ-S§™u¾ §õùg!¨„À€2Ù…V6nú7!€šeœÙ'oç} .IÜš“¾Wjon¢‚²ß¢¾…ì½™f ùfÿ÷¿>ƒ\åq×÷Þ{/ªÍK‘š6Í:ï7)qóö=ì4ä˜\a¨æ¥—½æì³Q#Gw ñÏþ!C.ˆ©_¿UëŠiStÀ>¦ó1f £a/Á` Gš«5] ß*Zçë :ìC6ɦÍ\Ϫ qÉ{„_áÛo½›8éïÉBþ3(7ëÚò™Ðû’=ÀÊûˆå[ü=qÒ¦›n¹1¶e«–QÒ%ÉTÁ™$šL¢À™,ö<õ]SˆõŠ] %RÌÂ… ÷~þùWIXˆ Sm¤\CYAq‡•üH£D¹tö׌úÓÔ=¶«uaqŽUn5¤íÄ*פnÜþðŽüum6îš³^~Åcˆb÷¶Û^r‰©Ù¼™µ v?^¹ØûfuÔ6Ç?ý”Ù†ûÙâW_'¿ÀJÿÕ`|§uúœhêbÅ_‰ü¾­[IÄa˜ùÒKf³“¸éài¯{2–»îºëÌU¤ºnO4O­w¾ ÖÜ„ûº¾ç$¾¸Šõùýñã&tÂ¥oßUW_Y«UËVxuVg½vìbÔºÀÉË}o8©¬5bì,‘KÔ;k½Œ¿EðPÉvGq[öîË0[·mÍ|þ™·¾]bÿ©”)ZÛË%èeTtÐäù†ƒ^¨Ý¸±ãÓw''ï IMM Ù´qsž•¿&ŒMG\¤ã­±‹«Í$Á/”‹/Êúá‡IŸ|<|¶2‘~è:ÊJ~^Œ â&>ÿ ýN^·žìçÕ®€žž»ÐcPZYHH¶Î˜éµj8¾’'IºòçŸÍ rÆû’°ÄvìhºÝu—),ÿ€×ŽTž(òÈý* ©Kc|®Ã •´p‘_öUðép×öZ_ï´È*§h}’´lñgŸ› ¤ßCXr@×E¤ËáÇ[ä/÷:‰Á ƒõD}üøã½UÇ.}¹Ô ­¡Zc›íÚ•”!J6À ØØšxk‡)sŸ=Óv˜†EÄ¢²ò×1÷u½Æ×:V;®Iªa𗜃wç Ïýwgjjšžá+Êí”b…Eäº2•€ë5è…Ž£Œ¥´]»f]ÜÔ)Ó÷ÎûîÀµQ5‡ÚZšúœ‰¢ã*R ÄÔªÁ$IÚOÆÁT »póKZ½zl –Sn¢|HÑoO µ¥ŸÇ“|¼áµk™ºD,¬\ÐŽÞG=ô{2ôK'ÙÒtšÝ~›‹/.pØ9 ÁÒ›fáì D$‡k`¬ÕØøkîAx:Æ d³òÖÝ£ëxîKÆÁøÓOÃÂ?ÈÆº@ï??ˆhˆ‡Xn|æGî]åïÔü­ñØá4™`>+ˆ™¡ßþ@sÒ[¿ñÆæò\4öLj֭Q}ô‘Û‘CvÕb¼ âʧl±¿hábT¯cR䯔 ²ñ¤ p$:¦uÝáþeß}gæ¿þóFêêÂAÌÍ-·ÜbEþ÷þÆ›@±¼€Tí(뽜Ôa­£wPDý‡ ówézlD¯z†§¥¦F-Z¸a^¸uÔº.Õ®@Ï/I‡ÔŠ 0yòä¼ ¶³þ ñHy‹âß`R±¬C%û†@üUxÉuo¾ùæ–/_>#ð;9¿qï“Ûˆ 5Q¨g¯ÐDÑyI$Rš4iÒ:NŒ¦H/$¤/}Q@²5‰•.ðvQK¬Q{ÜŸå½Õ©èÇ¥X…1ßÌ'Ÿ²QæäÃ}Á¸±&c°C¤±“°¥\~…Ïä&JS<à­·L] ˆœwH;þ!nd?smãÄ¿Í|¸¨¤ ìsxºˆ„¨„Óc·Õ©!ì£` ,ÇÆ{Mœ>Ý,y ûÜ7…ðD¶¾å&Óœï¤Âêþ™?–ž2ÅÌñkþø âú_|ñE3hÐ küìïuùë}ÑqÁ^—±ÔoMñ?Ø@þíw,ÕÕ™QZå^Z“ü/1Šò§u]Èß!d' î_ë»­ù‹/Î! ÜûD;¼åµ×^“:÷¨J¯’…½êøñãOzì±Ç>ƒÛïO)r¹|D5ZtT41TÕãšýˆ½^ ÚÿQæR¼Ë“9éDYˆh¸œâñ½$-^ ÷WßÄ!ŠöW”çå^Gía¹Æ¬¥Ù9ç($i‡ç˜æ¸fæ¨ErâýÝm­Ï±hú Õ¿´v”>è&Ξm&?þ¸Yøî{Ñç{V}mÙǵËæ}É{¬ñ\˜\³ŽrB@ï¯:RxDý¡uêšä%KLd“Ʀí¿ÿíQÚSúoïÈßAa*­Eâ™ùÔÓ&ÝG€,÷ÞJü}ß}÷ÙP¾ÝI;®µ­$0nÜ8ó;iƒ½@"Ç_¦¸Xn/•xXz’Æ~Fù•²ŠR·I“&Mõ³¤Tëj-—[£ÆÃQ H@]å8vΜ9‘ #¦€¤½Gø6ç<*Ñ÷C€ük~ÿý÷WBµ>凄½QD?Šåp|š$ú(„ø¥ïh_“$À éÖh–(дü™/¼`âp7TþùJ" ÀÙzoÕpE:þîa¦ÜLæÎ]‡¸Š[\ýÇH³uÚtÏ ä EjÐú‚óm¶?…I-mX1â'3¿ìýHœŠ {Yø¼óŽYû×_¦ãС6IQU/gµ½òP_ïD_š(«~ïÞ¨K6UL·?Ö'|Љ1X&„£¿ ®_a| 7þ^ç«Þ&¢ ú©I-ä¯Òdß—5=Xk»¸­ë"Túnœ¢µžàpUðnè¾`Á‚YHH.9räo¶b9ÿp V^ƃ—[…ÒŒHVïüùçŸ/ÁõGcðÇ—t(h4QÜ9ÿR@þΟbÇ+…™MËÉ=J“¶OÎE•[Ï#P»C{S¿'î`¹„›ü :x ÑüøÌ=_”{t™¿æ½ù–ÙNp  š¥Js;5ÃT¢ù»÷)w¹©=„«×™#ÛÏýem_ 8úíÐÑ&–ÓMôoç3ÊOš‰x©ø‹ü…èbž ã6Jäã ¾’¾^1NóæÍóÕÌ2Nº¸(_µJùœÃÔ9†Ü÷‹Ûw‡pp@ݺuƒúõëC½HJ^à¸GI­{e}¿Ü?@q˜†egbXŒ__¸~ ¬]q¡%òWUèì;ÀÛ½p<€ `ç'y«S„ã;©+vóŠGŒ“±%Ñ$ý®!\ÏÑš´cT쪲˜‚}Àn"Íù»ñ›^83‹ ŽÑM¬-CLøs}au4·f>÷<†ˆVµHçw.\h¶ þh@"›P¬š+á(ÍÃ5¿ÿaþºí6³}&®°¾éÙ¼8ž°¶Ÿ’ír(’"Y¼Ö¢R{IQ½Àû÷-zóraŸˆXÿdòÀǹ¼ºD¹øÚ×±üE6xET!F@Ï^x¡Ñ_G/]ºTIÝÊ%T( ‹-ÞSjÍš5ëÖω΃¨½Dþš’×Ö½øóVeHxñþ´‘¯ÎÛü–¾Ê+lDç;‹8ܰ¯ÿG@‰\š :ÕÔÅhÎ_ÈÆ d:ù‘×^k–~ñ%ƒÒm‚¯÷Uoõ¯¿™e_|á«Ê!ç´0‰ëóv!¹˜ôÈ£&CÖJ8ŠF€9°D;ñ¾ûÍDRRû›¼GMÏ=÷œùUAß¾}AxÊ¡â|Š|\Wj§Ü¿§›¸ãí窂N>ùä©?çŠ+®èëéºòp¬ÂHxqZ5Û0ù_ÄeïVÂ<"ɉ̳u¸}wÎß9¦—î ä%A °ï^êÈU$ Ù\ЬW½’è»àò‚BÃðOïäBH>úˆN myÆ’ì©ÉÉ'›ÚØRìÆg9ý¹? •ÀÆñãÍöE M8ÆBrÅ ’ΰã®~$-[fSû#ö¯M~‰n÷Üm:Ýp½iwå•FQ õícöÅP™Ü¼‰¾Óx¾ýpŠõ¸^Fb•PŽGÄ¯Ü k°_7ìn³ëŸüz!¸s0ŠUÖ¾!xŒäuûÕˆ•´N꬯Þj‹•Š3Ù[…Ãt¼3ƒ°ùòII Ñ;€üûúÁ`PBBBRäK ”µlÙ²©’{G‡éáŠr"æ¢4Pê21Ãpã8å·ß~{ê´­^œ»|ûÝ‹ÄVÎoí;¿ÿüϺcÇŽèÐ2Aþ7sî£üçKø[ïFæçŸR¢¼µ%D’€%tûË/7µñÛµ³¯É[ûGóqÝ^­ÃpNbø¢$DÑµÍ 8ÓþŠ+L,Il„€}ŠùÇQ‘Ù¦b©½ú‡òŸ:ä·lz<úˆiÁŒ!jõïzóôfê“OšT/ÞÔמ}Æ´<ûlÂ[WJŒàròCH|'j«y Ø ¤<öÏþ‰'ž°ˆ_ÙIK$ íAøå¹sÅ»x©HO¦)#@§S±H}—ôéÓ'Γݗ*i¼e Û÷¢¸/*:æìK‚¼fÍš¸ ŽnÛ¶íÅ>úèárqtž§ØÛ£^À¢\ÊìvÜR^„š‹òB÷Äéç?¦ß*ùv]O  œiÓ¦­âüiŒþÅ~¾/”ÁŒ‚N ôZ °›<èkÈaŸ•žfSߊ;-€(¼6PO0vR ÔF"Ðd^µFM“H0!¿€kwMl5yÄ•E'=’ÖŸqBÞÂ}æ¼ø’OéA"Ûo¾aša¤e¥ ܳ°PIÑdà)&™Ø ×m[°Ð´¾ðÂJ)@Á)ÛDJµìÛïÌ$¢òÉØ_/þ{ï½gN;í4›°ÌßëŠ[Oœ?zñD'³rÄ›F×ýœö•U²._µZ·ÎªòwŠŠ 1ñÍÊo¾1úÆý¸Zó.¡÷ß¿ÁÆ©Ttýùû¡uõƒ>0ãQ‘yÙHÝEñOßæ¥‘V?>&uqcŒ¸Ûƒ°U=¤ùüß]à ÷­$, 5 w9ãžF"¸ée]%pT ÿ0¢÷ €ë1}߸¸8¾%r9»!ék+×ç·'âÀ™èzä"“í=»›âßé4P¼­0ø(J;J›ÂšAÐÆqãÍ£(ú]5’©(†|qôÔ…Ýëh<¯1krr?Sç¸nf'’•½;vøõ˜{wî4P%ˆÓ…sWÈf«sÏϵÃYìZ²îÿEŸï¤Ó7š6D´ó7þ€¤T ¼›”m O¶c§i3äŸÄ‰§ë*Þмه»ïü>´.é¾ýêéÜå¨?!îj%èsHÃ…üHÄñ†n0 So5¥`Ò¶@Þúá~\ÞV#õ»iÀ)Nð‘yjq¹;ˆß!œãž¶b2ñ0¦ØC{Ùe—ý1zôèÃ'ÜŸËïý£Ž`!ŒY½zõcÆŒù/¬‰";iqòW¢wŠÃá;ÈßÙº×1]·jÕªD\«ù}6£û£ß#˜Šr3Pà IÚûÓd*ù®×b훺m«%"ãâü¹¬²# ñŸx‹³Ï2Õ¤lA´©ä3þ@qû×iváI'$"bTÞ¥Òã/ÄK ½A­c5Ýï»·ÈâzI >–ó­Ç¦÷B¶<ØJ†’èíÞW&o5ÊÉq¼\üšÏ˜1ã¿'N|qL¬ãã*À[Ñ㹟s~;ÒYùÏž=;ÖŸ8×2CuŽˆ´¾…ò—¿÷÷¸Ýá¨k¯3óß{Ÿˆx;‹ŒTü½×ÑXO¢üÖ„L€7Þà÷#ÊÐN‹÷Ÿ×\kFÝøo³íŸƒžOÒél ο/h{ñE&’xäÅðš1^ßqFZé„•PöF@âþ½ÉÉf6jŸ1×_oÒÖù§Y”Øzذaf**(éü…€7 F·¶ZG½@ÇÅÀ”eXDçŽ'ˆÑ—3gÎÌ’ª×/äß׃x:&¼áWJa¢¶ÂXðï+¯¼òjŽçIÊÊ@×kĈ_’ÈçJB6†È‚S/B/Ľ8/G[O/Queͪ +$ ™P†ÿ¡î`Ê‘v_ÙN.¦ÜOñ›¢ÜKD¸9/½dFß|«Y…ß¹"§É¸¨ ͓ȺuLW8²³~øÞ40 ð‹rkä ZJœ4É$¯Y›7@é‡ÈÉTEbÕ¤ÏPZvˆ0¼5OFAâLù8ïõÂÊ¥:뉟ÿÓ‹Ì·߱ë–?7k=Ç7Ø<ûì³&!!ÁŸKJ¥Î¯¿þj@š¾Úþ‡“K|U(#çD¨\FP·›‰›†.Á_¶Åꟃ;œ}gëwGþÎ11¡}ûö '³âû—\rɧ?ýôS„®++Pî±] ‘ÿ%?ÿüó[ˆmÚ`ÌaõýÎ p¶z9ç»—üú~¹J‡…NÈZùc@¸:gò²¾++/Œ~(P¼Üi”m#’Ҋª_8ÈB|œénRd\…Ø0(Ð;å^x£¨FÆUM±¶¯Eü€­èúýqT¶¾Þ>êco‘—}ù¥×Qk?t¨‰ïs¯¤xÆ›™aYòép¯ï´9î„5Š˜ßÝkg+O”l˜©„¥–k߬gžõk>é†òãÇÀÙ¼þú놬v¥‘“Äïçbí5wß}·‘ €§u¥<Î#ÌOüγõAÂR irJI[ÜÕŽÈßQ è·Š£>PcÚ×yÔA¨:Ž5êìž={Ž'vÌçfGr[n% v‰üë"úzè—_~yJ«¬0…ðJL[÷âÎVïì ù+À¦öåådS$²êJ™®ze–Ò§)"PÆPüÆë%ž&ªÝ Ñ’5VJ=?Acâ‰æœo¾6Ç?ô`¡©™{?þ˜õßWóâË÷ÉHÊÁUGi‡™·Å›” ë}^ïUH›ÿ†´%±´ H«T%Lj~s¬J>WÍu£G›?P-ùøŸïÌýŽ'2÷~ v„î‘Ðõ»÷E ”ì ‰ý?‹kƺ_WNö¥·ëú÷;l¿²·!¹Žpð…¶÷ßîûùqêB8èÔSOíD½™C‡•DùˆC¹”0€"\Zýõׯ|a(ºÔµ.ÉŠ³Håz!âþ­ö5å ŽqÙ¸qã &샚}‚öÿMÉ8âoÈw„)ÖRä’¸œ"¯8J¡ £¶$íX7a¢ELѤR вºÐ‹++Ø u:v4‘ìMK÷è6Øè”S̱ظ[òg`ˆ·òû<Ž ænû«¯*ºØcee=¾àãÍN9àÛ^r1)¥ëy¸ÚÅ­1¥lÙb¶eNj-!§—|õ5 ‘Ø IºRÀT p y:  ùïB 4 Póß|Ód]Ò÷)Qÿ‹íHw}$týùû‰½•%Dð¸ÊÊù­õéŠOý€S¹ ne½ÿÁã’ôÓPÊ!ä®q—ä—8R=¾iá"p‚á" Î9Ÿöjc89úÝwß-&Åo›-ÑŸrGÒ3˜UñÁïC:Æ—AâíÐ÷+W³}!lgð@ƒ®â {!|éù5qeÀ"ñ¶9Lè \w%#:¡D£zä.nÀ­E¸ÈbÍ/BÀéjÜqÇ™ŽW µ~ç ŽSl.Ôi°‚lµ +ÖþZ¢³Í{÷]“ŠHT ãÿúãwëMà>ÛæÎ3\v™û¡ƒûÌßsùÙÔhÚôà1?÷4÷Ó·š_i;±²'At¬ö¥ú9´HAož:ͬøñG³ÄïN´R—a(¶À8²%Á“j$$Øgu¹üu+»F@óÁåþò‹™ýò+Fé›ý¸F+ò?Žo´, ~õ;X×c¬ø…ï<c©ªh¦{tM9‡žôÿS"6Cí¢ÔÀ6‘’TŽz@[îľK‡Ð7âà"áðؼþ]Žj`ý‘Ÿr%`à ½{†/ï K^E„3ÈÚ ÜÜt‡û× Ð¾týpüfYõ$òÇ]Cñ5åâ·Pm”SPVªñ=KŠ0I¥PHi¬%³X “Dd8;Ž…^XÑ+ðQ‹ó®Ý¾ªÌnT*©ëÖ›N7ßlšŸqzD*Ýþ’áèè½@K,¹#Šá QýòG˜ux,xƒº=º›¶Ä‚çÅæU©g™–›Nv.†¢É¸/Füí‡à‘ã I2¸^D€ˆ‹Jð<š;-6þs¯YŠ è~§? µí%Þ‰ø4kÖìˆêúó÷W†b‡àƒðÓCÞL‘ªòh€<Ä—àŒ)))ÍÀ?Udà'æSïÉÑÿ;[w\¤‡wðÃê·l ˆ=Є6/$„ð4‚ ‡{ Ê À€EËÿÚï¾ûîÕøøøòïwÛÙ:ƒî ¢;ÿÀ‹û'Y»v­|ûŒ;vß–-[žåšk)rµ;@9?Sd}ÛŒÒâ$@hõ¨‘F.cÕ 1žkWáן’õÁgN¶:÷\S ¾åYgYÎ8ÿˆ\úõ×DuSh‡‚CXâÚˆx‹jsDǤ4¾ µz%Ñ»æåbJÄzû÷+‡e,*HjˆûÙFâ$Ä´lej Fò–”¨¨mõ!´äq#вö¥²æø ƒW“uígY–€õÒŠþµ†ú€Ï8÷&åhJ>!]Çx‡eb x"êü bk¹~i+È\äl…ŸD@Ã!FôrÞó$Ò^)ØFüç +à†ÙFúÞˆ¨ôRŸ“N éŽ(L"˜p¸Žt‰_׬5ëÖ¯³®Áw—8—¿|ú7Ãé¢Ï1ÄlV,ÿ휿¾N dKÚÖÙgŸr>Â#qðŠS]#'çÀ¨ï¾ù~¤—¶eÑ—âŽèe¿°•²ˆråvJŠßݪ•éÒHÀõMÑí*w?†Ê^†‚Þ¸h!ÝÿýŸYD¨VOP«sgsÚï›`"Šù r7Tb¡•ß~ëõõ霟25!N´éÙŠ Ș›nö[íµqNT…P<ñé§LÓAƒŒUtÐxo‡¨šþìsf‡ OùÇIºþã?Þ´lÙÒÀèØ,~±5)KD€¤2Bô›87€²‚r,EªÉjÄMO§HÇ^&L?¸E‹ï‡„Tcž¦†V ]·ü ûã©<‰íÓ™»u¶7ûŸa” 'T!úŸU ¸«‚À¹ÆÁE’@×`='ØXu¶YØc‘[Æ ÿtøþ‰O|ÂêçšÒÞ–y€Å*èÇ<àû+¯¸"²7±Ñµx…ð¡„B=i»7s¯Ù¾m»™7žïë¼9§HÿØÆ0°âúeµš 0‰Á½œ¢ÉX&àÂ!ƒ/ai¾ŠÎô§xz7ƒ¾ýúûQ¹•‡‚êJ¡\#÷˜·tp"„UúR¢)~CÒÎ*Û`}/‰Œ½!7¿¬à·’-mäešzž¡Ë°»LÇ«¯ö|2ßQ!š…þÍ~îy;ßóÎûwò+/Ûßú>’!‚ÿºë.³g™lGgàªÈsD}–£™÷ê«FÄ™? w"¤ßÐñfÒuB:væ™gš„„»öùÓ^iÕ!¾½%Jäþç¦r® %ÆGÚAù8·ˆQ17ÝrãÀ;x”Æ Jö5¬Ý™Ö7º”zuëÏÚþ9ªþɘù7¸j¸t .Í~ŠÿÉ'Á˜²5ôѺ :j½Wà¶±R¾†ªHv ô¥¾Û›A.—­ÛÌo¾±ÿãO?~)ÃÓ¥ÓåC[-ó*ôLÕ|ðÁÏÏ=çœF§ ¤‘´ª¶ÆUÈ–Å$ ©b"Â"̶.ãgÀuŽÁ”Á…Y²d‰¬ü³·¼È0ÈØ¯L§€øÏnסÝÈ  *× j`‘¿>þ|Ðyñ¢%ïsìŠVóã)þ°ŠaÔkOiMYGYJ©Oñëý§¬]gÖüö›IOÚe¢62áÅÐQs¯JȨºuÍ6ÒÔõë=މ’ E᫯ä>P´ë8 ËRÄË3žzÊcç ¤ =yØT'/„¾‹ý¨w¦<ú¨ÙNò(AjG´éëšÄÙsLÂ)LUÄ¢|¨¾ª]çrŸ5qö,3é‘GÍj‰ ‰á"Í1Ä—…¹Þ‘zϹËféHûüË î)æArœîyÛÆsBRÉÂ@†#½(7Q$üåœsÎù®eËVõ$ Ñ|³ó5{¿ ̆±vØ¢E šÌ_°àtNÔyûíwæ’lÇ?ƒ /н?ǃ,©rÖî`ì‚dà|+z=‡pÖ±¼ãêú6$.ÕÇ…§‚ÁeÛw¬²qÓÆ“-^4kVÙŠ¥øÇ/PŠ÷/´i¬%OÅeâö{† ƒPr‰V5¨`  ¦ýY¸ôe¹ˆ€”ÔK1ªaMØM$Òñ‹ëÏ!‘ÏN,ÿÏãÔ{…Þø0T¸ôÒK#Û´ký ÀãèjÆÄÄšP&¾@b"•|pÇd¬X\¨Å…ú@¿£T¡ÄQ &ð.ÖÞhÌ•‚Öº‚¹-V…7RYC# Š?¦E ³ò»ïYìóF‡1Ý0zŒÍ'P ]° ؤ“w±ÈÌyãMóÁ`tÜ´ þ¿Üÿ„tý*ˆ¹Å~TèuUccpK¼Úôxà~Ó­‚)Pt‹æ“Zm²öÈæôPØG ¢*áaÖ›$iÅJ³/=ÕD7Š·)“V‚@cšŽñ‚>4Ó{ܤc\ìh » )ÌE$}RäQYä¿VŒÎPÆž gùOÖßãÇ·eÁ^ UÁ1§qZŸ&øË‡„8\û³ñÚ’çÖ^ÖôLÙp…Ï™3»Ç¬Ù3;?ñÄ“?“…У*¡úè­Éq¨—'#ÓVõ<?‹Ü Dth×Ίþ÷ƒìEX&V„ëÁ~ˆ• ¢7‰oüÓ/?õ¦ÍWëKk[¦ -ˆ@×\xá…'  RŒu»ˆ‰`ÐôaÀ5Ûe‘:;“vZ7‰©ˆ`pïË&…ïÚÄ@#‹Üç\Êå” (}(-(bùD5šó‡œß‰®OjÞ¬yφ šM&z6“ ;;ËR„ù €ÌŒÌ åËV´Ôõ%Í¿”¿)˜r[É@5¶…‚,˜7Þ6qÎ\£´Ê6(·ÁÂP¡ W¤ ,dî ®a6ý­Wà’ñ_òùçVWŸ²i3¹vÙ,‹?ÿÂL!7üvT …{t›Öæ¸}Åx(Äøaw›,Tb¾ =t?|ΛŸ~º•ø„ò®ÅÕËC¡\L1²P½íZ´¨@3É$¢jŠëÚ‚>2“ï½Ï¤€ëwëfÂ0’”qéÑB8{ˆqâý¸’÷$Ú Œ´B üãsÝu×¹÷µÁøS.É2PvÚU=­'Ÿ|²•8\¥ŽnÀÞ܃!£ÖÓR„6½zõ B`ÅèU>u ç€]³˜7{-À–y—Á„D ÙĉÎkÓ®í˜Å‹ïÈíW­+®¸âZ«KÉÄwñi§Ö›ŠVXk‘üÚµ·”ú¿–v¿çtAâ$§Šˆù ”%°*!á*}R_‹‰! Ü¥ã*‘‘fÛömÑóþ™§k‰m ”þ„”R»j¶ ¢ûcÛµkÇ7áÒ¥ˆÚ¶œPîo4ýütq@Ú ³"éú1¬8@§,D4oÐ!Y­©ª£¹í´éÔ©Ó0ŒøÎň¥FÆ C˜AøÌ€Iøá‡/áƒ>ë¼ ·«<öØÎÇÂðcÀ¤BÂþ5kë |¤ÚôTÝŸcƒ©ô&åTʽI$–+vb@6þö;L“3Î0í.»Ôê}E”ù+ö,ôG{¸ñ¶—^bhÁ[oyZæöæñlñ^Éû™^ ÕIJ"tØ*³7Á ïa[mC°è÷ "zŽ¡w‰£çƒØoO¹êÝA>îÿ¼÷nžQâòÏ>3*½ž~Ú´>)Ç\÷W7îÞnYÚ—íE*œþùHR‘ïØ¿MÙYU ;‡xôÑG«ïú®›oº¹n8º1+`õî…l\®6POV À"'ñÔo#S¿œ¿þúk7È÷bª¿Fñ5Þ‡Þ¸¿ÐûÜL>ì‡ rÆZ!‡Q[,oûý4óÖ×#rÜ"£*f Ï<öŽ;ÍvßIp颸þO>ùÄrýÕ‘¨äI4‰gºwïn9GY†Ÿ…;©lŽ$ÈxúŽ;î°Šâô£Üï#H€^;é$sñ ZÀ÷‚ø¹ õÖ`~·g\NDÄTÖïÕ§~…]Ë\f¥¥§YƒÈà`Öþ+È„û—@*1OˆÝ¥7½ .»Æé§ŸÑÀ€BúZ{cccƒTËS:À”]ÍïÝ éYÅy?¯ƒø~Æ‚ Ñ·©`bM­ØXTÕ.鮕`ÃüY)¸Ì] uvÆÞŒ ¯¾þ*“û}æç=‹U­¬Kµ¯ê¾¬}é;RË-[jÐÚÚ÷¯ÿ¢úäÈg>'ΡcæéjPy¯<ø~$ªÊg *"ETŸâ4oÞ¼Ú–­›¯«Y3&8Ž@“Ú> O§g°—×¼¹ãRGÒ‘W!p;ŸÐT#Êï”É”K)wQšS …ýø´/"Ýðš‘£°^¿Êº‚…óñUº :tvŒºÞz‹©—0ë…çÑ•—\ ·ÑûÉ'Lã¾}ºä1™ö`t˜äAdïôR=îý+$4\~¡Àä ­VÝtC=i? Ð·#/½Ì4?ï<Óç¹g­Ÿ¼?ו…:úFå=1ë•W­¸ßß> ±Ã•ZÎ_¢þÂ@¢c!~2(;’ Ä{ï½g”Vänô`ÞŠ!ë@\äj+–³ÜM«\kcWbW,âo Þ"æÆ<Ô 3PýAüô´iVt.éˆhËV-ìÚzpÍ<¤Kàÿð‹€r׿ h –ž58ˆRý—9Þ Ï²ëiAîÒ¥‚ü»áïŒ8ûöë×Ï…k™Cê“ÅeÜõàjŸÛ‹ÆØ<Ô‹¡Òè[^›e@Ú˜“²ý§ª}ñ  m)Gº#FYR¢‡Ñ¨Iä_ÚÈ?†ôs,W€ø«êã†Ú³/X½&žŠ>"‰ú™˜!Òi‰HXKÙ¡…ðí£ÐYm]ϨMîsrÈý¥7¢¹ÇÓ”[)É©~£ÜFJ‰¥ éDUœŽÔ:âÇwz•uTzZ½£Jð<š»'ËH¯N—cÍ\âÃoݸ  D½~ÈÔG‡ï>îâ86ø°7ÐýšŸž©w^j¡ÜÚ—„ΈEÊÐõ¶[ †TrbÇŸû¢Žžs){§=þ„Ù‡$ÅÐ7Ü ÏÅ_lP ZîÞŸëTG×Ú5Ïß J©ârƒ‘ß­kÕÌúv#¢þžÄj’wGüb}ãD$]`®@R’§¼{£Éqÿbà[å·qFDF˜Í››ž'ô´k§{{ä„ù Á槈)ù룖•êõ"$qßÿýùÔMÍ_?@¿…B<}•‘žN\-û »àó[à0°ö÷I²ÂÞ;‡Je[¦ +êo³,ù=¶³ý(4€mí>“gË!] ´ýj¢§ù½Rºõ•Á‡(MmIèôS¿Eä VA œ—oGô<üóL"_§Kzîß4ðÅ1¦YÇþ0Ê”‡(})úN …ÄÉSŒJKÂζÅÂ9¦v‹zÆ\ê¿Ð*`!ëX8éÞ7O›næa n]ˆÇaqëLøáVèØÃ˜_1㯨¾À† öUÁË9E‹¬Ž(Wê B~1™\! ô±Ð‹©9v±Ïzå³yÜx¿; Fàrbg`„fÕOœ©³vùÝÈ®¨xÿ/¿ü²_¢ÿÖÜk@ÜCyÖNpþ’É[(ê7Ïw ¤ÍZÙ ©i7Úºb∀‡ FRð<‘z@ÁsN:©wîM\‚¥åYÞ[ÂZkN>Ð,ÒcûGª»./ÊߪèóÞëß¿?¢u…ˆóâõ™K|äµåH'Ô_Óoé}$À)+ñ;È_åìç5’»“FÖ¹RQM·QÎw©Î¥ ¦ü‡Ò‘RðËâ`~XAÈÛ5u¼îZÓH‹¾;Wš¿~…ÿÍÜ>þ¤­n};zôD¢È­ýc$ùÖYq¹ûøUE\ nºÅ9g›úˆ‹#ãâìzB¬JX”N o ?ÑpGÅú›°ã7š:óžúXœ{—Ö5ú^÷*x>ï³ÿ÷r‘¸~tÐ t‹ô•²·iÓ¦yëUiõ·4Ú•¿¿Rû‚ºpª·1‡`ÓÑŒõÏ. Ìã㿉ÒTb |²t©ù{-PC(QŽY²Ô´#ÿFpðÁ¥ÈÒÏß!_IW´vc´Ýo÷îÝ‘Vþbêù'ÂÊß`á¿·cíÚ+–†îïN¸Ð}.s†Ž-Rä…7]²eZ GCg“¼;i·P;ß$¨Qp¶.üÏYgÒ1p1ø/õ(È‘<×·oßÓ™@¡¢îEíÓσ}ÊwK§ov«k%<‹,[õÏ™Ãy;N:áÌäT)¥%©rîgna/? “2Fù‚2šrEÒ¹: Ù,¢s }»ê·ßÍ1×^câûö5r)«´ð>tš'UXXëáÖ GÓ™¬krLÃxﮢˆ‘8_•„MuLÜ·¾gŽykU@–$4µÑÁ†V¯‘á2ôÖŽÇãôׄçÕú|!Íç{õØà<ÈXŠCSß™díÛ:Yô¯ £^ áa-C C?1R–7P†ÔFyóùoÄéþ.]Ìé ¦.Ì}Ÿx§Œ âÿI þ7x¿ïBÒ‰"/£ˆûk4€Ù²êÞC6ÌžÁ×7!ŒM–Y¿~}(DÀ™h?·ýž[*ñÑxÅwÑwj‘?óËpð‚ef¹•~Ûl(ñ i ÌÏL¬<÷&ïI¶ƒ" *(WŸìvÐâH;pâÄKòüE> ÈhBBB¤btë^¾¿ssÈb58êO€ :Æœ5c·ÚAà:¨+ÝŒ_©>pÕhÌúQÆyiKæãOR¾§H ©@uJ¡°1êß÷üŸ‘‹Y{¸#黃ù(Ü9ÚB©`D$É~DSÓOCàk¡sêCPÈõp޹o«7Ž7ð>)d@˜¤±PÝqUº<ˆ¢°›ã¼Ö—LüÝ}:Ü,Bï]WEqýW,I9JäÑ#¦@!|%r.€œ+.Ðõžì= aÚb®šžMï2ï“±ß ‘:uïÓˆúÿ!œ²B Ê5é,Š»édW~‹¾z †ÍãQ!¤ªœ/þ|\nõì …‰ Œïµ=³“““¿Ö¹CmÂþÂﱺÓG…¶¸,w+â9`,-À÷u1^¥ ežIîEDcq¡ã êB˜.®Ç–‹^Ê{ñÕ¢¬å¬¥”—)»(~Á^DÇÓŸxÒŒ¹å³©€ÖXϯ«++i˜dÐM{ůßDˆg þ‚ÞÕúqãMâ”)>/iEÄCë^XRÄáó.E?©ÅwóÔiæw\V‹‚üÅá8ÐH|,+m! ­ÒõË_]âÿòë00}€ˆ‘²W6l˜‰‰¾ûâü .0O!Ùh‚ÌCþ%y0Æ(›90 7Ê;˜kǾúQŒ\{ü?{ç`E‘ôñ†%#9‚è® "Š ˜#0çtzÌgÎzætfôÌs8³g:æ0¡(AAP‰"9~ÿ_¿WKïìÌÛy»o—]¿«Ýz=ÓÓiº{ºª«««56¾ t?¢Ž_ñ§E“¹Pz_õ­Ï'¹úÕ®‹‹‹Ñ h(ÉÍFjÇð+ 4eÜç{!OÊé—åV¾ÐÍJ{«]é+ý×^ÀÚÈ')‰Ñ¦ª2–dÄçØþÏ]_qb—øó×4röºYÍ4RФ}äŠÖÑ?\Ä¿%=b¿°óD£—)£Êx@®aÞû+Ãûíµ2®¬f×~-k[5Tðáóyæ7Náù&"Aè/L5 šüégîµOs+ë ™ž"m5ˆR¿q­ÒüT¢ØNˆÕÁFáÎO× #…Û¯±¦ªx·Ø4I޽袜[‹4ë_]ûàk“âñ,)¹ ¿óN7Rç*¤ú$G¾24Ó{Ñ?!ž2ûê0V#{ ~&š6½eŽñã>ƒµÝ”õ~¶ü­¯IÍõ[oí¶’½å‘Ö(ŒÇªTƒÚ„5#þ·,Q¶­,|¬ˆ0ò±ÅZ³lôÓO»çe%n¸ŒápÚ—X[+¡ÿAÕj Ìi¯¥êx± aÈéͳÏvÓ$–õý;.œüX/×e÷æyçU¸=®÷‰'¸VÅÅ~ÀÍ´&=UvûƾòªŸõçCü±ÛÏž~ÄþᑽÔÒ9™–u·Þz«{WÒdÖó®=D˯IÚ¶·f÷²câî¸ýv·ÿ+:ÓãU10ûJ3~y–/"ãOÞAuó‡ÿËêW»h;ðæú¾ÓmÇiŒ|Ga½¶V†ø+št(½¯¿üÆwkfÎ6îÚ8œ êÐÏ÷ñà!LcÈ­ Ž:ö‚¯NígúÌœxöY÷¥Ç¢ ìR´1YE„…ŽøË`&ÿéG÷Åw¹ÑÚÛž¶?!Ö—™oo“>Ê”‡ï÷ÌR%'ü½ùæ›>¶ÿk pØs:úz4B»¿Hå=JR ìñ÷’D“ƒz|¢¨ -# Ó²Ò¥ñ¦%fcç ÷ö,`¥¬¡´ŽÞðÛ$÷ûï3ÊNåG£YÛŒÜü‹‹‹¤½¥¸¹ŽßKþÙ³*¸í9¤ŽþS_ŠŠ6±¡l¥Ä?+ à Roå7± y¦ŠZ뀧Ÿ~úw1‹M@¥‰äú†åÚ£ç2ï˽fèPÓ¿¤ªÜ–·vŠ;4E³Û sÇÈ>¥!а~ –€ ñW1õ±èß¿¿Àâì{ù›ì‡EÔ ¬_ ¼a >!¼^¸“0°&ýî¹ç¹12F²–¶WuОãÿmLUu9aƒaF7Y'±ÍÑ–«8˜­3>”nƧÚëÝjÕUýÉôÑwÏøaTêíqëêÄ»&š]z—Q ø1Ø.Òäa´N²ûD6üçŠI Ó{¤l0héÏ´ã9e”?ßoÌC|®½öZ̯,…zËsѰ5uÏ~þ|ÐÝ|ó͘Hw­ÄÐ\Ò·¯ÛCÌÙjZÛ/²qÊܪLu2^3ðç”Ï:Õp¬,—2 û—pwáJUI;GÜ#õì•Ô£ÝÌgæ$úá¸Ìu”  5áci§–HÎиýœ’Ÿ“#û É>D—Œ¸_Û¾³§’7gÁ þ7¢ïýDü¹ÏÚ_˜PaâU PëÞO„s¡Î€nD€mð×øg™Üìö›v>`Õ~ßh£VÖº_=Ly"º1°Ý\óÇÅÏÊiþ`®kÙ¤¬­j˜ÏÏG./þÇ›ø5…dÒ)ö¯ÂU+Sþ‰o¾åÀÕt˜ÊêÝ×µÒÀå!Û*“æŸ6Žú'xó.É§ãV‘ª `‰¥@€]:»-]í†ýã,7[D= jÖȱϕ‘Cbï¡Ë¦ZÝ]†í„äbª¬È}tÍ5n‚Ž™M |¿—ÅÂvØÁ‹ûÑÇaLѹòžàÈÞ‰2TÃ7žôý‡åÂn»í¶N‡ÁÔèÁ>#FŒp·KJ3tèP¶¸¹ÕÄÌ –èö²Ó¿’®5 ¬md¢Í”Á¯G´,t£˜¤Éêo½TÙw áøÓ(õ¥m›¸p V,\1mºgÐ+“Ú&?®ýPð–·úZîYUÒ’Cç–h¼|îe¢ƒúz‹øF3ôrú²š€ú³üÄd2ã+äN„Ø"×@õ±xž$ÍhT*J鯹Bû=ýÏÞg€V±oœÞ³­¶ò¡Ã#Zcð'n[u\ëp¾<‘<ð£QçiKq2Èëpm‘2ëBvg.R„B~³¼Ê=ªRþ廊4ê©§dïþ·ŠNJÓžÌÔbܪä[§âª¼qæ?ÜÍîçk‹ÕBä.ß…ú_ÿ!w¹.ÒêÆðÈòZëÜæúëü¬xÂo´.aBÐ5(b-¹fû­o.Ù\u ¥Dõ̓¹ÏdË~a´8¼‡YqqqéÖ>ëÌü±ö1—nGŽ£4Vniá™õ!õ{JýöYÜm·Ý\_;³ã“+˜ Óñ¾NÐû׿þåÅýHMÈ0ÑZëßJ˜¶ÒD÷í¡¾P€B}*æâ^é?Ü=r¤›¥ü·ĸ¿PlFÁ!Êéjõ5–7L#‹¹ï­`6†Û½¹({J°µÚøïš?(ÿJ+äÉ4};ÆÐù:Îh‚ù›KÂèyµÞµ.0»ÏQgnãgýõ²„PŽ5ªš6sí¹©ÿËLª ª{qþ.pöôjÿ?é•B\§Á/®ƒ™ƒÇB™q•MèÒ£\:Y.@§Z•æe ¤?Pƒà+°@ù1e?­i1|ÕÕn¤”‰ú}´ßÖÆÞò´ë¹…(CmNM{¶ÛQýÄÁ¸ao¸®Z×_¤¾¨ÎêÚâŠËÝè^p_ ½ÇÍ”1–B@O-Ù´×wC5 Ìú'iúÁåWºI”:{ûŽVŸÂ¢ [|¯qÀ÷ °‰ê‘°Ìò_Ôò[C aF`²4àïÔ®ƒ7ÄlÁ Pîû#åqÂØ+2°uÅW¸?üЗý0é+±1…^ߟ§:xW[xï>Ü=ª>Cì¢ò+„(äà‘¶º)à9‹¥‡A› ° @XsAt ÀÂrr ’_1x+I§ãù_mÏòuÛµm×Òx‰üýdÏ$º7ÂOš”`ÑâEèT» Þ£.0TÒL³ðdÕ»à%{Ÿå°½1€|+¾•füÈÖKöõæ²åë#Ë W w× (Så¥ñDô=ÝϦˬ EaîÜ*-CE“«è¾P»CxÙK„‰Ò¤+œ§ðÌ3ÏøuÖŠ ÆóßtÃN:ÙuÐ_Êj»å•û×­¾Ó¤ñg #Ô¾çêž°ÄÕÅ÷Úw½æAÊo'ÿú„çŸ:µ±Ë¦›zÃL£¤(ö»D¹q@ŸK7 Û°u+×coÙûÑ«i€åŽo}Ô}qãM9·&†ååúõëç9äL7„?éñÇh }–}Ý`ÿþý½%9Îa–ÏŒ?ލØ÷®Y¥×`7Ê…¤WYÙZ÷ðÃûôtø™k¨:ÿ‡Ê¶—t8‘¯žÊëÁÜÊfD<Õ3ü7µ;çFm|A’ýÂã…½……4”T¥à Åú§ÞõÒK/õí’kܶ6¶v‰Ë»ZJi©v>HR–°y’7´nÓº¹w¤×õ—d¶8Cü—,ZJø¹‡øS6™'ž™wF•ˆP$SÙ§JÅXÕ^ÓÇF@!ÌڞרDem‘éñÿè,a‡ ¯“ò±òÂ,VãÒ)-ïÒ#²à¯ôC'ˆâ¼:Û¨Ì{%•›ôoZÛß|óÍýz+k–|ðA9IñÇý÷e7þåWÜGáVÑiѹ‹ŽŒRèB xI™Öf½w;õÙå×íë~ûèãr%]¤™âwO>ézëÀ¿/?F`91ˆí»é8áRääÀ™ägj­»±ˆz»«k=}„ûB;4Ÿ}O:É-§5Ý(5~¨Ãk&}˜~Ör§öaÆ—ICÒ¬ßÞ?Hé·!pâý¢þ¼¶»±%Á2é܈“8«»ÎU&Þs‚˜ÅÏÅÐLÒºwZ0"5?ˆ³}£¹âóG¥Iá™|Й< ÆÒ€lÌ—aØQ¤ÝEII”ñgÜx[fs!ü¯¾úª·u¿“$,GhÉf€ÜƺPu.=’ï¥Ø÷̘1î­ñÿ$É£´9¼F?«ê ¨µVQá.ž-Mê “Íaû¾ŒÏqãwø~è{H¼¾¶¢wûöÛo×Õ³ò¢µ0BùkÍGZ1¾Õƒ,®§ïM$Âfýæ2î›ôW:%윪v¨ €ˆÅ/ZïRÛ‰È6^VS2Ó¸T&þY—ñ€3ës1,c¢NÐ[ Ã>ŠÓ–FÀÔ/ÇzVÔ9È N©@d €ø6ÿ÷Ü¡ÞÎ}ꔨ¬§'•—úØKç—ù8 €2³³~ýúy&ॗ^ªP1bu C£Šˆ×?~|û„ ÚS3ñĉffi=¤˜ßÀhˆ,3Nâ›è.M!Lt0 ï¹6@œ fK˜a}G ãfŸº¹5£jÙUÅ•,Ò(˜ÓŒfaìŽ{O‹@[  u¶LÓbceo´¶ÇYœÐ-‚5Vh/ÍJ»ï¶«k.ιò ãþ®›‰‰Ýô ÝKÒX õ8õØcn´tº‹ÙZq«-];Y†k¤fJÙ>8õÛïÜÒ\Ÿ`5ÐÒl°\s×ëÐC2ͳÐ.ߘG”?Ö6·ÙãÒˆq9²BNÿIÛø>û³Æ_Y .£Bè&J¯I ßŸÈÇŽ µ×dæ,mÙÜOýk ‘„@øÏUy>ÕòÎí"ú÷ËÈÛwSáÐèGFÑ,© µØ¿»Êvªðb1N¯¿þzα†öH‹Š¤ °»–uvWýKqþÞ#|Cø˜0 :2…È[^H¢KÐv‰1±dÀ)þ£MÊ¥’þu‚Ðz—Ž+ŸîE&’ø3qT•šT€ºÈnÝ WtWNÑ?¹¤¤¤5\â5Dëfè!Xc…~•¹¶Á†¼¸¶%€¥i©fû !ˆ_G€‰ÇÇïÂË+iˆ9mƒ8õ¦›nò&Vo¼ñFÇ ™Øï>\3¨ïDè°J·Ò6[»Ëhozšò2 }­vl}ƒL¿ÊªßïÒˆêwZCŠáb‡@CôY&ºÙR¬ôVݶQU0ëÿCea"i‹c\Þ0ñk—Ûî8Á/M Ó¡ß¡#PU`,áQì 0ÎÄmdw}ü¡‡òý»§–RnÖVÃ]YƒFš‰t&alÈ»|*6ú?•À+‘˜IÑ“iÉÂC…k K—t]WÙÓ‡„ƒ³…FzÂd0z^§ç‘ ³µ3!D [hBrœ$;ÇI:ÍÉ=· ‡¿&ýÚÕ/ªGßÃVò¤,øÁ ö‡ø£`eÔ±Äóƒ4ªí²N0ª°¹ZQÝ,Û±nb÷¥®ç«è™3žå@ôéË—ˆë>I  *~#Êz^ÒvŠ2‘*¸!/¼HÛI?šG–(] “K*g¦À×™JÌ?Qö4](”˜x`ÿ4ÚÒù ÆÆ¡4ÈL %(N0cËU˜+âñög¸QR ZçÈ#Üòš Ö¦ÓéÒ¼C¥Âè{é(#0ÛÜ|“ûüÖÛܨ Äø ÄdÃhç·Ø\æŒÕ,A|/»\t‰[4/ýNfÞ¬³cx¦“1"XQó´ 8Ÿ(†EG›Ò+:/ˆý·Ãqœ¶b¸§•fÿ*xAû¦jÜ{S„ÿbí¶ùLmÝ\¥¾@¸p5aF>©‹:Ì™¿BïÚb)“À–kû°/DÇaEâx‚­1œå t`ê°!©@3 }Š–zN]y] °ròŸlB­Yâ%.y1ó÷®Ò ×þãmœƒ>é>Ýà[Úôžu‚P…ü1yÊä ÁQ„«}#eE(Ùí{»h¶õf›mÖq²Íö­zÂŽ`׿¦í–VÔ%K —üaY€<<‘ãlD¥Að꺤F+S¤M’"2ëßWÊi ‚V7Iaãü!øèw*C3[mµ•7¬ÂÚª}8qqB¿‰2®®A¡‡Ì ·Ô ïAíóg¿ÅOÇ»ntî9þ8àOÄ Ì=¦ ¯Ûjõn½ÓNs µ=®2홫Hfüø“ûXK??Itž ö}¶oÑϰևý~Dùô4̳~i³Ì;uËV>ú/R˜ý”ß‘*ãzša6a™>Y¨~©ºœ¨]¯Š¾D3⑺^A¥¾A¸£på¼ß vD@fË‚<ôŸ2‰‚…r²Hž‘vsé*q}4ŸqÞÒ ¯9!†€>§ƒë¶TŸÛR3x4SуZ®žN^bŒ‚¨§}Ê>O5/iàïgÿ’˜ €©BµC`´àw,mq N=ÎO†ØѧAB¤Ö$â/ÒVŸÑÈ…€R©aˆ»ý¬æãüìY’‡††û«_¯¾fÄ¿LêÁ‹Ô)¢°pA‹ÿ+CGNš0#úŽƒQ°€W?åçð€‘C1çâ‹/öû©ÑЇ—:ÝC‡º‘<âúžzª[y‡íµÏ]‚‹B ¶9ʽ,¡í¿òöÛ¹¿ôéígÔ_¾U3êÊO2ZHc‹Ë¯p­KJR×{ª÷S¼@z8£þó÷ñÕƒÜ"ÍŠÓß³vˆ?âZúˆ¸]FUüöRjŒø ÆÂ#9Æ·gâÂTÅý¢!C†xÂÏ–¾f"̧‹èï§üVi {ß Õ•ÞGúÏØ±î*I0^ß âý¡ÂÂNº3Uè„7 ß¶(DжÆ@!Ìú„6 6yb}sOøèÇ]Ã\²Ã Á¸qãÖ>|ø²Óð³ú gû= 2‘Oü59ôëÿÙr2¾ Ð1¨v¨ €*k2•2[ö½[4@ªŸa¨@ i¥26”½3~ˆD¸ÕÇW:/ôñ"×Þ³?–ž¥—Lˆo|™,øeü½™ÖH:G C¾ €d•^ï¦8©œ(bÁ ¨sv p~÷mÒYŠj¸XGKÅùðŸÿt#d9nÝ“Nt]$.F{ÞÀi¨ƒa¨3”!×>üp·b¿~î{)IŽ”½| ÊVÚq{·þi§»å4»b‹`¡€YÿÆÏÄœT¤xæÉì‹Ó:‹‹‹½„(ü-ãÀo¿ý敇"ñ,,.* ýÄ­Ñ[:•q1ÜsÇwø5~LwqºQƇv󴢤'ž)ÿBõ½Å"0#%ÞHz7°Dm„bÎu­„¡bTeÞgYÅAóçI!òõï„]„§y7±ð>Òïxá Ú Œˆ>l_»Î„ÌЮÓ0ÄeáçÚ»ý¸† ÅÀ”,4RL·@ǹ3þÓ·ÈϧÇÚ¿ÚfÁ¢ž eþ§˜©-â7nü‹*e ³x”÷DÂÕz™¤"£H<¬vAtÃg–žù…÷q׿—äZ:Ö Üص…¡¡ÙþQ_Oø¤NGìIQ¤†!ß 7Vù`ÂcÁq30>˜B‚­©>wÚi'¿æ‹iÔ'tÞ{Úe“?4H¾~̱nE°éu˜lØË’ž§`ƒq!ßµiù~©÷k+IÌz’€t×¶¸1: `¬lÉÏù}Î,kv¼–ÙºiWE#}_…"þþy"X#$•ùRº ß›°öÆL%?NÞ“èÕóqß—}§, h‡Ÿé£èÇ–<â³LPHâ¯óäÝ]wÝåSúc7]7©¼[uéâ–•Qƒq#í{— §6] oë+IJoÑY÷þðƒ›¯û]ðh!D².jôóžã„÷ /2-^Mx™pas!# #/ò¬g„ÌÀO9åßt[llæAx].`ă°^’+7dB&€0†D‡^5jÒÈxúŸÔþ´¥Sö'ôÇXoÄßÄÿÄÑR'¯¿SíP'$ú0ÇKÉb œ• 'e•Œë™ªT¯jÓ¾~/ökjµLüàžgI`i'=7 g.e€ð" Ä@êqñMWÀÒÂ%~ C>"’9W˜ÍÄNxS.©Î÷@€‚'Û½¶1g}õ£>JçO:Ðå'ÙXû¸c=QäèÜ?3Ð7!¼­5Kê£:ë)“¸³¤ ŽéßI_|égâó$M¡Újm³ÃÚk¹ZNkŒ6=ËY|wU}høO”!ŸO®»^‡÷¤·±Â ë„Nð³,#Ú˜”Æ4.šßßIúÆ`H!È:ïÝ;Öîa§@E{óÓ¼.õ‚ñfüg•.·Ð’Ã:J˜õýåô¾ª¼ ¦I°¢0ªÃyjw$Ýø— çµÎOW¼ƒ…ë Ù—[×€èKá!º ÀúBÞ«DÈ;Æ*Dï ßî#%JÆÿrõWú†~ij\€8:CÆs§C`yxú%zEz<ü5–ñqMðªùG½±öðaÃæK¤¯‰Á܆VQ¸QôKp”ÅŒaˆk„ñ¹Ì/s·ôÀ\{’æž06SE â€\¶×s¥U…g‹òˆ»¯Ân™xï½÷öd´®’âTÅŸ6g-øÊ+¯ôë¾l­²³Û+LWí4\É|sÿnýœéŠ5[ã´A5z…QërúWc‰Ã1ÌY+é½ñc§„ü² (~ÿB@=¹²Þ8ü¶Û݈{îÉ+I4¯™õ£¬2•|;h~â¢5X¯YŸ‹À¤.'ô±<€ #ù éäcÚn ã‰f?ó"=‰ã´ãd 1+Z\Ê@¡ú’ÒÿCLïK"ø×i+ß»ZZXN9œ%Ü[ØK˜!kº¨C€úÛ»Â;„!P; ÷¢³À;ñ5á×¥¢n5là'áXõݛ›‰•þ—xô5£%Æ „~–OèÂh¢@ß´‰k)C¡%$áìŸ)m^ñ·ô¥«|È:Áèõ–¨"çkpoâ×ýECÃJö×6ûÏŽÕ0|”Ö`q EµEÓIS•'MX·ïÌx„IÀØ@ÇŠùÕ0”/D|V’÷B©-Ç{g­Öä;õYaÖ†Ÿ“ñÌ ³Í* `8ç3ÿá¾íÓGöNâ\?[N·.‡ñmô5´Ó«£ç‘Ï„·ÞvïË^ûU§»cŽ9ÆÏúmŽÆµ~Æú/ Y2ßê‘8#€R{ñÙ:‘vÿ?ŒÃ½÷ÞëÅüf¸çõNä[M Ué‰|Ñ‚Vö^ãÇ$)o¢Ø7H3þo¤äW¬´®î&,ÖE˜¢B¿&¼E8Lˆbß¡Âm……Fðãú#LÁKÂñÂ.éPªÛmoë Vf<ІãyŸ~‡kô$êò,DÆ!Ϡǥ¡ŸIjÈðœð!Èq½rø¨à×u‚P…-‘5¥¹óæÎki•V2צ¨ê÷•À¶1ÿLØÂÓ`v „÷iü|¤ ^˜†= ý2 ÀÍ,–Šþ-Ÿ0<§Æù/P'©aH“!œÌIÂnIe+..v;ï¼³_W{¯¤xiü!æhU3ãKú€íãcë!âáûî»Ï½ õî8&+.OÌ ¿tð@·Š$½>ȵ*Ñð ù`ãâþϯ| ™ê§·ÜâF>ð`ù >´/³sNîCKŸv­øæÐÊFI´Dí†4@šÙ~àŽë/Ìú‰£³ßk÷Hè3ái až0¬ï£ÕÏrCwIºîÚl3×_[ »j™D‰¶Ÿ¨Æ©Ï?"•ëô.?klc |ˆp'a]]°úQeQø/áwÂ.Â3…ˆûy'f"QÂé ó„°I“Æ®s—ξЖÖÎáØÃµÝãÎÀž™õ7¦Óâ7îÚâãšÒô‰e€ÅE*—þ SÆLX>æj×J~Z¹±n`x/UÖ¬yó3OZEû{3ØÀé]ˆƒÃF²ðø™?~€=³kïüX¸À«Ü¥… Ó"yÙ „NÉsëœa" µÍ1ÄøÄyW§_fÁ*wéñÁ¹‚°®ª“´üûæ —ï3êîK):¡ÌÅî$ ,5$ú¬Ÿ!c@œ7xð`b›µWR<ó¥=Û£¥XØû”“]·]vuMÛ¶¡Ëýò¨¶ŽÑñÍéP›9ÒŠO ì­>Jdz×à´q G‚e Äë (ˆ&>÷ 2`ÃX¢HŠ(qÐG3zfq¤ÅqÕôÄýŒ/›ˆ!9]Îl¦GmQ샠€…õõï4Ë¿G 4úg© ›*m¶Àm%d¦\×€Ú!D£};k/Ϻ­å2Ɔzl¸p¤êi ûÑPLhû¶m,¶{‹ÞÛ˜lÏâ\‡tîC:^[¾Ð!ü`^+ÊOÛÞY ©¨3 €*oÆüyó3 ë'aYNf€Æ ˆ?5Ç‹Àʇч‰k>3?\ ¼ýÒ<ó iÏíåg–QOJ€–¶…ƒ¼G CE 6ç w¡øÇqœVw…,?8k¼ÔçèÑ£ý±«lß⌹’êF‚rÝu×ù™Þ-š‰¦5+Œ8üSíKG?`óÏr+jvÈ:öÿ w Ô+ªïfýò«Î¸K³þR÷ÚñÀôâx¶ô¦™õç* Äé§ÃA¸Y÷§%­÷à ÞÇ&?ý IÆ{пö).vÇȦÀºRìk®°z±Â~½ÌÇÒ‘¢ó/nÿî;·Hé³~ªpC¡Œ×9`oÄz¨ðv!£Ì̾BĈ˜eLCøÌaï¶Pû—{i )Ú(gí:ê’HÔÏîyØ=iÒ¸ç:Ša8 UF´ô| ?²Æ‰©ƒ:3‚©B§Š3Ê4†Ÿò #âÀy1à‡db e.aìïíÿhظðß\Âd8?V«2¦™õQçZh˸µØCܺL!ƒ–_vß}w¿G}¨7fqpÓ䈉¾`ñÜÚÆÂâZy0+¬Ã=üLïÁLoVXZòÃŽ?ÁusÓW;ÚIú ŒÂ,þw­ ]ˆÐŽ–þþל0Ö쟽úå¿“´©”GÛ‹p#5Â$5LGÆ¢Ç µƒÁd¶} ûN£¹¿‚^Zz’Fr&sËg™·í5õ±¡:œçA1¹(× wŒ°·pé|R7uf¨œÙ¿¸Ÿwb{âÎÂa=!5™ïHñzVø“°Ïª%~ €V&°ï?ε~eÏ”Di_³gøàGÿ¸NB ‹›´„d鯹êk¿ÇùW‡_aTÙ¿Nÿ}ú)²„’õk,¿PŠ€0Ö`aC…SW ^[¡Ÿ]Ç=3?s X: Òtðg€ôa²³®­sùÁÏ2XÈ%r褢ýCØ((b™K þ°öJ½XÇ5n˜6õ‰èöwÞñ \0¦`톇!ã”®zIÅСCKgwa¸¤kL ÿGØó°C]Ïý÷wËI—ORü?³?§ N“BÝð!w»±²ãŸv ßì±Çë×ß‘à²>I Ã`ú F€ïÃrJ[Fùþ¬iÛ±C1Eâ®’F\ åÀ]VZÉ­¬x:Ù…» M8KiþW}{°¶&¾,[ýˆØN$\SѬkð‹ ü†ð2áBiFøm|,]°Öo£Cek–MúÍJÅ+éJ»¤g5¾ÖÚ³cínýÈ®£÷Ä ŸÙ5þ€ÝÁϮ͵0QéU¾0eŠìÞ×Ô@û³ß^‰"Û°¾ÂEøã$QEÀ°±Âëh£Ù}\DŸqo`ÏB—gä…X*³éPøù¸Šn)Ä@üe Èŧ"±d hO3°R÷aÝÄÎÓ“:û*æ|û0êÑ-–‹‹‹½~@hñ- Ë5³<´ÅÏ?ÿ|oV˜m\HÒ–ý›»†¸oÙ6¨e•¥_€]|EŽfóÿâžmƒ E0¿ù÷cîÓk¯ÍË »5þ.ëmæI[÷ùT*Ì [üŒñ¶¸ØŠgK!Úÿ(ô±c„Y?ýbs-©¥¬mµû }5­ïO–”òùtƒ¤pú¥&~­T°+„{ WÚ\G—uƨ¤/ ÿ)üYX"ß8• _gñ½9Ô#®±¨|Ï ”Î¥3ÕÁú âİ|ølƒZcZ£årI5.«|‹†ãšŽÂŒ`)·†§èIÛýæ×€Ñó\aÞ)ÐÔæ”>«£¸0UõÃ^; †%%%~'[°’&€ºÇâJƒ( ²—<éD8úD‚%Œõe¹µß|Ì ÏÔžöWŽ8ÒuÕ¡;½ú»k#­dUFRñþþþ…ZëG9òóë¯ÏË<0mÁV;úMuõ&H¢ÄÑ>³}?ÛþX¦8VŒâ~’l Å>à–i»B¶ŸêêÙ˜x\†Ë¤Ç2W}³—zÁá&Âü…Å˾ !*üZÈúþ£B´‡·Ë"ï9¨*៥4Ðü¡®F û¯µzW\²¢ßååþˆÀú“¹ö×üp£×ægþ{ÆÆ JOâh aóÕ€• @UªËŠœÊ­+ À‘ÒÞîõûŒßË5˜Íþq£FåÃá3à§i0k|j.¼ïãü“DH–¼9Ñp––¿(ýÉ ôâ€5 qsvQ¶O*Ì ³4ï[]@’¢[ĺØ~gY€= ~À{ï½çÅ»v"\R»Á¹óG}´_F<³Âã^xÑé¿®—Ö³{ì½—k¦rRî?ðN¿Itý¾ˆè´¯ éÍè 6ØÀÖBÛ ˆÇ2 õžÔ.éR_Š|H3$þœ*Šáv‚ !ZN3ü Å `¸guÖk­Ì]š\å¯ôŽiYê1ˆ×©¯.VÚ|H§ ÙïÎz]2rž …o ™£Í¿µpU!½¬ÊH@šHÞ"gLßvã ¥ ÚC¶ô¹iÓ¦úIžyÀлŌ ãI?µ{® 312¿ø¹ž‘†mv¦k׿Âäk^…TÁI«…TsµB]`Š´®|J]¿j;Q´¡üÌŸN`˜!Â-Òa£Ù5éYƒ™K[G07Î/,KÒsKŸƒØÂÁ­4>‘õ¹ÄûkåöAjî'Ê´UÖçw±¿:uX@Ý1°³E f¥-,¹Q_I±aÛ"~,ű4À€bí#@¸K/½Ô‹‰ÙÿÍÉnIáÃøÌ(¿ÐrÂÚ@ú+ɰLõÃ?¨sxÏ·?â¾ÐVÊ´‡Ñ÷Y‡gFnõN]âÿ³LÚR·F¸¹°“¯¯ª#„Ÿ|† Qò›$D·hàvÛº¾ëöõÒÔiS§yâ_®¨/yƒ;úþìnÚ˜}Žcö ?_¸NB OXÆœ| k­”j½XÈ®Ïj…ºÀœ¼Þzëµc°÷J€hú#ãO ë%4v°Àj ñ‡ƒµ³ ï¹öée]#Ô¡ŸÅ‹º–_ÔßîIÛwuNÓêáPêê:î$À$½¹ú~¢Ói–òÖJÊŽzÞu×]sîÁOŠkþ˜L]Býä ÔÄ¢‚îú öV¯IÉ¡è‡ô€³ßÑ`-:.Žù±mŒ /êР¡C‡z‰BRÚ¡ÿÊ·Ï8Ó}£ò­§Ê:ö‘E%Þ3Ls™]«ÜKÄý¢Ãv>ú×unšŒ1¥N‚¤þآɠhõÆÇ {?J)Ž™;íY™Ý¤oÆ¡Ø2zÍ5׸§tô1R M¥Øw¢˜±Z~hÉú>ý37UÿýCÿÇÒäÿç'Ÿ¸×5þЫÏ¢Ø×G˜/W¤e ã•ÿSÂK„¿ Wž-ÜHˆv?£Y2ë­‡€Õ ÄþyáÂêo0à‡IŠÖ¯_?7gî7mú47]RÆÿ8àÓB€¾d},tã®IÇ›M£<³ë¨†ƒî –%Èhí@IDAT`£" 'ȽJø«yT‡[Û€ú2ÞqÜkùTk$Ìèʶe€haŽ%€h#C¦a׸®¡ÝûÙ{fáÃ0¡ysOžtNv0à‡²Ji8òÔ±_¤ÝËB`uå¬0±'ï¯mp%%%þ½*[V#þ•a¬9%Á_4ø²î¸7 `ð¨o, Á8ÁhÒ>Q ý`8Øfࡇòf…ãÚ,—û©Zg~é ƒdVx/·Ö!‡¸–ÅÅt²¸ µÒ ÿYª×oî¿_‡÷Üëë»Jã¿þõ¯Þ$4³›¯µ¿{I@»ð³ä‚m}$|ÿIv¢é©û®—N°aÃÜ"µónjÛ£dûaKm¬–™·ò¢r¿§::E[Q¿³ÑH…C£g!Q]Fž„w o"œ^OÈ´F†z¤W¥Cø‰?Nø¤ð¡-x^rñÅn=÷psµ¼÷»úÌì9L*°}6qLí¯ccü7lã®]+ùÒëÐ?éÚÂóÜè~\1 ciñIT>ËÏ2öVäWºj+FbÂGjÖК ¥a©ÐY³õa5Ôaýá÷  %€(03%NˆÖXæZ£qo G:\˜èZü(›Å³°ø“6ëû jKž¡ìÚÒÂek€1ȯ`ô“™Ac7:ˆ+š²‡Dß4ñ¢aÈŸr°$€Õ7ÿT¤Àºf_;Hù ýf«IïÁç9ço»í¶~·LDÚw¥-r£ŸxÒõ>õ×]R“ÆZóVäè«Ôš{êa±–¯ÆèˆÛOn¸ÑÍR¦˜B4ü‘ÎXÛ@Ì‘¾0Ó»rI’¯,¢yc=0fÌèÑÈ0,zê©^±¯‰˜–Ã$Ý9Lq×sè?¾B×µœqê?¯iÿ©Ò1™"ƨƒ y‡p[a×\®¥Ï˜ƒ~#¼Nˆž¨¿ F!@­J¯5ÂÏÎÇ„¯£°ÕÖ[ù‰:2ãÓøKþfظ԰¥éãùtHk)Ússy Ï8-ð3’ËE‚•0a àH]_ ¬6»µšh÷tr*.°UËVe€õÿ˜%fl 2¹ˆgÑÆ¤¬Ñ“\â™(“0¹âÖr½ƒÜ Ðãgÿü>ÞAÌi˜3¤/quluÁwÂ’ú,ÕÀp†iŽvØÊ„ètRœÈ·Ÿt Vገì÷YêZâUqU®‘š•>«µý %꟩þÀ¬x°p+a»ª¤½ŒâÎP¾¯¾,d†¿‡€£\f¤ÓE%ïú™ðq! ~I0OiFH¦þŠ1ÄÚ6›ˆš¥TêkÏ|<âf‘ vM߳먖‹g„µ¾j׌vkápy–¯ q`P@!ðÜÀ¯ —µoÔYúzý5P°Ôä+ •ÃlÎÏ–ÕB €uŒ¥ÑÕ5€±d@<ŠºÖxaÃq à&¡åcÏ-¼¹¡¿ÏW3G:'$gôãL.ÕYDýÄ]€Š­»›'åß¿'ýŒÒ")\¼¿fëÔU10QhñÃh·Òû&“&»Ž¯ sßs¸ûcåâÌL.8æžú… dí™-gˆŸ!¾þc›’ÂÁ@€¤×øÁ8`V˜YîÓ²zÇÒ@®™­å;WDÍ›Þ|3×G3åöZ÷Vá ËìšíTST_Ïp [(qvZ`ÍöÄOô¢{¾µ¸ºÆ%@¶Zž]èêäêÚô` ŠÅ¤aò™gžñR¶÷ÒžëKÄLíPRâþ‚Â%uYÈúT?]¨ôFH2qŸ$7¨~æ©\ˆøö6Ö5 æ!øÌø?¼%Ü^ˆÌ…¨ª½’¡-ƒ VsçfÎrÉ4c†¸ú‚X›š$ø ;é³¾皟Eå>ŠöÌ\ú } ,÷qhÏV‘ +€ó…ÕBj30™%n³e\AL|^ZùžK,ßE™‰0'ýÒøÙ†´†£ÖÃνŸÙµ…1×üɃü‘Ø{ðL´/“GöÓ²ŽEüˆ¿ŒàpåÛ7)ofrØû§ƒWºŒªÄþQÑ‘¸ÿ®O<ëÍ®þ¸ïî®ÓËÃÜz?Ùý¸ï¶€?©|]+ú¬Ý£À¹ˆ—“À"Å™~…´¤uhÚ‚Ƭ—î×:9kÏiëeâ›o¹çßzÛõ8ø`×󀿹2@“v¶ôUõŸ.1ýÛ]œšø£oÃûcC>‘ÔŸ­\´ õ̲ ¶ æ0hò$ <ú(ô±Œ0vìX¯Ç1@ëú'mº©ÛDnK$)|_`¡@ùÎ×wø¥$ ×H—ãQå‹XúP¥ ps!ý¸®Á(øáMÂÑÂU„g 7ÂõSƒU}¨tÞ>$$Ÿ´Àé¯&þÏ4)%‚P'7¯ÿvExùöìÛÇÍu>£laøðž>mÏp¹'Ÿ8äye€ýš‚®v'e)4ÔV y—.]öeý„J¦QAà¹óæ–.¾âEüqã€ø¶6Vx6žI H+lèð:é™åÖò+*Zº`éøxÙÎdi„.À2¶¡&LìˆþÉ&Õ}Ee†àûASï'þo÷Á'nù·ÞsÓÖéåÆ ü›·ç®n•!÷¹žyÁÍ\¥ÄýºåfeQæ9íB õ˜yÒæIÀìý,ÅaÍtÖ°Ò‹í £pöÙg»í·ßÞÝvÛm©Í “Þˆ¡CÝÈGvëj×À*;ʬp(¾ŽfVM÷ˆý§i¹äÍsÎqS‡Qa.Ô)3ùƒÅ¼ žç=¨‡´@x¾ë’’o«?I?€~†R öùù7P¾‡È®?ëûëÈÎBcµ•2Ï`ÚÌ+ §<折°‡ÿ)¾¥-¤EŠs²ðoÂu*Š_ ŸÓk¿ÿ[x»pš.ÿ(!ïÓDÈhZ¾wË3 ž& !üP.òÉ2§¿Šky—~’AÊ–igï–KTR1ïôÂKãZ»Ñd- ëÛ!ݰkÂØ5. ÒÃ| îœÅ(üŦºˆÊf6ÀÏè³GÓø~ hèhE3KJHÓÉ®qèMÛôìº"×ò&œ][>EÌNDõÌ߇ó[ËRŒƒe4Ü\eéWü§£GÛ”y—¤ þ¾¦4È–Šÿ©;Ý7šþ»[ñ±§}¬ö|ìúœrŽyô¡î›ÓNpÍ÷ÞÝÍ툚UŠXâQ;§Êkúb2½núô‰$ ÿa?€Y=ï#€‰Ï¸8V}ûöõÆfÐ)ÀPھ͙ë>¸è"7âA/pú鮳lÔ#ޝ @³Œ¶9¾sι©ìø£”wÄGø%¾µ¸úH[nê4Ы@?B?vìX¿ä‡ú|£-Ä,\"Ë{JÓ¿»ÚÃ/ê„L›YEá”æ’¾¦e ÿ×Zëo¡8ÿþU¸JEñkásû Æ÷È–oK¹{ W²ÞÏüèa `Æð“ð}á-ÂøQMR€·è'âoR¢øïKííÿ–µ¥©ÑØN͘kቓ £áìÞ' ‹kt»Žs-<ákò|yvŽ‹{X¿üJW•œòˆ+²Š>4¢1Dg¦@§X´D«Æ‡hš@\òp_uÒ1´ãžkžc„{|€çÖ˜¸@xú'úÌîáÙŠÔ¨qÑÿ¬@iZ¼Š:y¿Ï(ûcy„~5pÝKyd*!’ïy¶³¡œY²QoÔ·ê×2ìüüÝr£ÇºïN8Šã½\·[‡¸uO8Ó}wÜ‘nün;fJ¤ðÍÇÿìÖ¸ìZ7¥ï:nô¡¸%yJÊŽýÌÐûmƒ²ÁóˆQ"ºf?€~ü…ï´ÓN~†üä“OºÇ¥HgLf4|ô~Æ÷2+|äQ®«­µ?ܵé¦OÐEP?*(dëþw)ã}yׯìWQúôDý{챇gˆW¥“ôœå˜,7¾ôÒKž‰ïظ±»IKýåßã>j æ&%–¿Þk’–ž“ÈÅRì£]ÅŠÏ8”á2²]Ô!`¡ë áuÂaÂÆÂ½„|E+ùæ¨Éò=Xž)4˜ñ¾%*,,É3‡ãq¶ùåƒè›~¼ÕxÊ3{n×q÷öŒ2Ûµ… ýèã …±{ó ]®ó]ÿ'¯€G/ç¢P€å$fÝœ—„(Ó ~ @(•K¯ÅµJ·0¡K„ aCF€õD4·}zaD][#‡®åúqm`þÑpH!XÏjÞ¢)—í”þó˼«¥ºaú¡5_3!ˆÖÑ99­`å ëOmÝxÒ×E @}ÕY£iÓÝø=vv“7\Ï­|÷î÷5zd¤jÇv}êz^y«¯>ÒxÊT7nï]ÝüJ¼Á{0“Ýl³Í,ù 1_igŒqq í‡Nžûîë9[{ÏBç1oùvî³+/r=®½Ù­zç½®ãëo¹‘Çî¥,ID^üÀ£nÅÇŸv¿lµ…SGqÍçŠ0UxúKìñg½?~–åÐ`݃5Ä¢uÃ=ý5I¼‘NL³#ÁÞiœöá×ÇþŽ›nâ:m°¡k·z×J:MÚµwE ˜ƒ ô,ØÒáÙv,”þÌ<™PýCŒ_5ÃýÜóîw½´ÁÇþA¿~ý|”è{¦M'Žt`Š’|,+ƒˆõwÖÙÿÐV¾µ%ij¦÷áÑGZ¥ûEÊç{)ƒÞ¥å…›´äÀá<[+EÖÆ·æ·z[¥¢,ò÷Jé9á…Âß…Å …}„0Ô`Uk‘ž6_ˆ&ÿã·…åGQyVšz‚ª¶§øþF?Ѐ(d$‰oi"?®íYܽ…ó²qgô_.¥çZÚ•9 0‡`Ue[ðe€¼Lm5àf¬RÙq æ€}ÂÐRLâÃ…YÃá‚h§µéNÚ4¨¹Iׯ¤Xã›Ël‘÷¥Œ}Øþ¸.LØHüÚ¼Vð°ÓnuP¨rYzV?³»tvŸ ú§kÿÞ‡®Çuƒ½Àð‹Ïq³‹Wt=®¹Ñµùâk7a»mQùØ^7H»Ç{ ¯°ºÖ˜œÜ‹õ0PO³„_ ‡ G³-¤«ÂcâR;€®à‘ñ3&s¾ ú”§Ù6¾Ä}“iKMć~v_Vd¸*.ï Á÷^¯²~µŽÁÞF¤¢°—cpF™ ¢o `ka¢.Û¿°,<Û,0,R„jqq£×ÜæÚ5÷h˜[§Y,1Výúšéò#ªR$Ï/b«8˜/»ÖµXógÝ׈t!Ë3†è—½ôˆËjuÒÆh}¿·Ÿí/jÚÄõ=á ×`Öl¯3ÐéÅWÜôµtØËOãýN)ûS_z-FŽr+ß÷°ûqŸÝÝÔÞk'h4„±–^Óv<ùØ§Ž¸?—~ý•8µ!º0J¤AûG?Ó½öÚËmüïÿÛ²±Á%>éž<J1îP&òiRÐ*ù#Ù8÷Üs½•ÄBêã–Ñh ÆâE‹]{ÕYO-É”ÿ*•<ˆ¬6š£1åmµÏ­Úýñ„Î`†Œðh!„W—€ý+ ï>˜-øNr·vò>|Gå{ <óÒ™.ü\x«p‚°& s¨FG¿ —ñ’±Ÿ??ìfüÊ”EíŒ>ßáL¼LX»¦ïqmnÔŸ{ƒðá‹Ë}’?ÛØóÒAÑ5ì gj`c)56âe¨ ÏÈõ cöo•H#0(3HCüÙoœ¬áC—2Dï)gF»³Ÿƒ†°PRRâû^\½Ñ—Xv8餓¼9å!C†xf#.li&5|Q\\ìˇv>mU(à9Xé>–¸Ýkº+Ï?Ð]vÝãîÌ'ßõßű’pTo•þ¡6yYßý`þWµì‹y¡­ªaÙ¯Wµí£e©ðm!‹ÂÍ„¼_¨¡.+ ÔËdáÇBe¶ò)Z¥a¶–ØXÊbœ\:î*9Æ aÜw¢æöþôU{ŽkhéP¨¸kÂáøÛ3»Nró;ò–­Ì ñ6•?Í_À„H¹¼k›`K¬÷À€`Û2WAeù¨4D…?4¸ÓÄ!LEáÂ0\[Y¹¦Sغ?…XÊÔÏtfÂóÀçÃE²`m`I"XQdÞ$¿_ÖÛQº³úc=Ýça&M ß9::–Ð×ÛûwÝäV¹ë>×õñgÜ«¬ìZ~û½ëqíR"œì~Û|c×ô—_Ýo›n䦬ß×3ëœ}‘›´Ñúî§½vͤ‘_1½ý ʇ~@®™0ïbö8¢˜Ø DÁê¦çŠ+®pïè ôXV°gÑ85q¶Áx†Œ¥Þ×Ìð"Öú9šw­Õ:¹k.躯°¼»åòÃ] )Êžuß«nÚüõ»ÒûòÍTm0Iº7ÏK*s½ ?}&ÉáŠJƒ­i; WÈ7½Zž™÷[ÂÓ…LcXÓ?U¸®°³ÞUÊ…A‰ð=!ÒÄþ‚©Â¶þª†~ ˆ%ÀÌ[ñ=ø?è?p9àÛã™j‡x‘Àá}xIÎßZ¤iß0~vº\ƒ0 ùêð¾M³»Õ‹‚@­b4ÓÜ1Èaàm©X€Š,¬ÖaXó‡ È'ž5°¹Ö°æâoϘ!s ದK8ƒ QT€ á÷a—vä¤%ÌZ.K€8°Zÿ¨'ˆK´7õÅl›õwˆ'³d_Ç\X„M€ÈÝÏô»>¼ã·‚,Ö—RåØöñçt~ùu×ê+ÑnÏ@X:yºôMˆ kýÌòa^ÂvŽ&Ç»°¦÷Úk¯ùír4Ä `ƒHž~C]o%w–Þ|óM÷è£zEÁ0\u_£8ËR ’4þ­³Æ IR ôt¬Ïç[&ÚõÊ+¯t-šÖs·\u¤'þ|-›4rWžû7×¶ESwÁàÿx#XÍýÚoS×bÔ×ú˯]ó±?y낳ºv±,S¹´56g ¬"Kt˜ÆŽ}Ø„¬¼HŸì|ÕW_Ýи>‰§Xî¹çžnë­·öÛT_xáǹö1a¾ù\ÃØ¬ ­{;†ŽŒ¸‡ïÄ{ Óò©ˆ*ï‚Ä©†NÂpåËΛ /¼ÐÍ™=Ó=1ä×§GWQ°¥ßOK1tgž¸§Nülà.ºþ)7QýãmÑl®2ò­$ÁbõͲçño1ÿó¸Haû*ð!rÓIk©?_=”B|½7ûêûzÉEì_~£š"D¢O:c…P•ç…Ù4ßÔ%„£À¹§æ~gΚ©&gü]:ûÑ’~ ŒíwŒ«zÆxjÏq m,æ>¼ŽÞGß’çašÄÍ…Fâé亇n¤ôU/H.UÚ$è®§‘Uœ1á[Pá&`@JI3®4q­ÓĹ”ÅÏJ³‰kü`PX­ãÔ“ÀÒ¬ŽjÊ-r‰ÃXVÐI¶ÕÙóÍl= fpÖö^U)udV²¸NJ,óÜP?`~Û6î‹‹ÎòŘ׮­ûøÆ«ÝÚç\ì ú­¾ùÖoìúÔs^€a½l`0ˆ%$ZÐb¹¼_…2#]b?<úÆ\Ì)ïAÝ!9`&4 ¸¸¸ C‚Á%BòñÇïu_X~@!‘Óa&CßÊ( Æv®`Ó©Jž¤‰>F®™qÑ×@Bd=‡´ÊN0t\pß~ûÀÍǹ-×[MS×òý¾e£î´£wq ¹s=æf鸥_?×V}\K_Wea©àc-—Ü'fr°ú',*Jpç™!£_—!0Š},U@yŸí…; QT´Ú jA¾ùéÒsÐäPø¶P@òÏ ¯¾& ¡ªY†i¥ºöK6Fªý¸šu3ã(É”-ý†ÁÆ\ÂâÈÞ3¢˜ýñùêšpö½ágqñ³ëеñ-L+×uÊ-ßtƒ‚Ambv€ˆR™qÄ߇Jb&Âà˜Ø»^°üâ\°g\ãǺ¯•Ÿgøqï:t}=ƒSåO—¦Ó`áC¢±,€²²gâÀ @$˜…BÀx^ >#:5–h˜‰&6y£\3@Û†õÜL–[ÙØ3Nts:þÅ3_x9c!Pñ›ŸàÆí¾“ûYŠsô.3, œ”e*òç|ôXïG? ׇÌ{0°a?† q;uk}*.S¤JH`„`‰‘¾†+˜–¸·k–VlPâ;Qa7 K”“x Úf¨Äê¶æ]0LÙH# xòcF}˜Ò³´¢ñx¿óÏ?ßëP\uîþnÿ=6—Œ9yy«yã†îÔ¿ï¬/¤ž;w&¡ªç¤‡ÒAKê|n–¾‹w•÷`õ'ÕwøÊ)´r´ µùžö·„W ߸(ÜFX"dÈŒ:º¨ðÕ2¥€ÉxHˆ”AÀÔ~c0륫²Pˆì˦XÁÝœÙs2J€ê;ôú–)N3nF‰?>`élÝú#®oéd]ó'.½ý(ƒ}§––}göÌ\üYÒËRŽõ ’µ²<[>9”[›€åi<*âÀµ¡›J§’lvdþ¹Ü\D%)žu‚Ð¥a£÷”?€r1ðRfÂâðN„Ã/Cô‡hÙNÉó$HÙ)’¢WÚ]­½²ï?8ZöÈ#.†@@€òår-=«Kˆ“iÙÃ@Ìrµõ8"eú„'½ÝWuïÜw‡[в…Ÿý¯yÙ5Þ@Ðð‹Îövúœqž›·|{7k….VŒxWíZ®ÎÐÖC UäM_`ë_qq±ŸEìÐrV¿† ægÒ(Z"­ÊÇêŒ0&€"o€ç€õAÂÑ>¾ßeŸ…}ÍÂûHÙÒ…É ]¤+"ú ï_¢e[B°t sÙe—ùå’·‹;ý˜]r‹×¸¡$'î®÷«çξêQ7Omq…˜€šñ_-‰Ë»:¨_"D3j ‹X‡ÜŸUVÖ÷ÙÛõ½°“ðD¡Ø#o±Â_ˆ)£kúPG…ß Ó… ¯þ(̙Ε+DŸy]*Íæé?ôUoóÅ»sËfj}ÝÆ\žÚw“Ö-›âÒø”þK ¿$ÌwòI:)a…ûs1j¸¬‚C€ ±ÊÆŸÙUʵ_—ù6‚”ý±|£.C?îm{¢•çVC3}\.½†«8¤sˆÏ1Â5 ¼³ÿ¤m,fCbíAœÊ€ÕL³Ó1cÆxB”')M>rÓ`Í , ,47Þßy;7½WO]3Ôª*¬OøÉçnÅ{ïußy„›"Ý´À»@ü8Y1Ë0II`ƒÄ“™4ÌU.ûqé§ JÑ礟ô,6z3‚Ùg–_`Ìr˜(õõβé°,€$ÆŒozèСžÑ9â¯[¸óNÞKŠ-)IŸ–Î:~7×®uswÌy÷¸zÈÍSšÅz4X8@¸²°.¯±‡ß(¤‡ô^ ÜPØL)HYK ™ füq¼ÃäBéÇ „÷ ™ñO¦ÔÔ)MbiÂ0® Ðgã'K¦¡ bË%ÇX sJÓUBôÓðÞšË3€@xoþ¡Kþù*2æ¥øÄ‚@ƒ‚¤R€D4Ø÷ ÒôA¯(PéÌó¨¨ÔKa^60G;DØèá3:ª,ó·4H—2sÏ+ÑYP*Å\KG©i`mwã7®0[ÄÈXµC,ÏŒ<óŽåۭ„€‚a1nÐO °Õ˜Ûay÷áMƒÜ–|Å«Uåõ$«õT†UŸ|έ0ô!7îØnª$ •Þæi›m¶ñ ¨FDôIÀûÑGЀb^\\ì¿úӲʅ¢K?”‹å\Ì7áÑ@GÁô°øˆö.ÛôvW]p°kÖ@í‘ï;é8lÿ­¼e›£Î¼Û¯ï§J鸬*¦’ùò%&¼SxŸõþÍ„g תf¼`°_<_ Ë ¯ ïþ!ŒÞ*¼Mø»0(D±òÉÏ3ù6Óç›BzJß17S[å“ä› BظºÓ¾1sÍß\ó7?~vçV†ÈÅd[Y²®DhÞpeÄ;ÿÛÚ´PÑKã|*Üf¹ÖX£U/F|kp\Ckd»ÇŲ2ûý¹pøù÷òiê[R<‚á¿(ÈóŒ¸5 ̨ÑDO¼âbÖ±YgÇEšeÅ‹ë‰À•­'òã}i³>²oZöèäJ“2  ‡v:Ä“Ù7ëo å>_ê‰Èb( KŠÄtÎ_àÖ¼û~×öÅ×ÜgèÆËf€?¥0æ Ù¯¿¹™Z>¨XЉĻ@©Ääø\}—÷`&ÍYÔ%í€T$ÚŸ¢å¯î{¾;l2ð.¼ec€Ë,@üÑuØyëµÝMWéZ7kL‡Ï-ñY‘Df»l»»pÐãî»I3Ü_CÖ¾ô¸×…H,аƒ8ï ÜQØ]P+•«½ô9Üxák¡Âl+ÁI#æÿ·p¶°2PãQF°t Tšöl@޾2|?Ihcsôy´‚xNXë÷ž{ü£C¤4˜¬%­”°bÊp£¿ÔØ– ¥2ãÊÄßfÒ¹Œ°D_&ßF°øÖàÖ°Öàv‹3;u{ƳkÊn (~ ÌtfÒÈ={ºa¼Ð¿º¯QèòÌJ±Ô‚è­r;Ê9WôÑ㛸+‡¬è~™Ü¨\0«KÄМÒÇL­õ\õAyifÛX˜3»ö³º®à¾=é7¿Më²DHR„ã'ºŽ?õú|¸ûꪋÜO›m\†øÃ¬uøz„ë£m†«>ö„kÄN$ )€w¡ ìŸçh`í\T,¯@@™M³» MœŠÒ¬ÊsÞÆ ¦¤ÿþ^$WzÔ?ü¬Ý£³»ô¼]×6b(éìU€ŽË·rGÔßÛ¼ÿº éÔTT¦ØˆÝ7¢Éÿ¶ð`!3ò“…j¤jµ¢ôÆ„LíÞ¥aE£Î§º„ÏX[x°²Ä_Q RLÒI Œó|ó6 È,›ª0Ù¥¤Äˆgc´Å·±›{»67 cסK>Ö\ËÃ\ó'Àr`>@swÎ'í¤°µE°*•GEšøßn+8•ÊL€H •e,ý°XÚåe["e5?\»' î § ‚@ P÷ô8YÞ=–…øŸr0ë¬,@¨7ÜpC¿¦?óîþåË$ùýOMÝø_1&“ñ^¸¨žkPTv(¤îÖ“C³Ôð‰N±c`H"ˆøÃ”¡\G<ÑÁMÜnëÌq™ÆðD¼Ýˆ‘2)|½›SÜÕ}uü‘n®¶FgøH Šï{L2ª†®ËãϹo¾ë~Ü{w÷Ëúëf!²—ȼJì/mÌ€ÀÒ –ðøàí£‘¬ñÎlÁ4ý€¨‚]4^Mܳ¼~åB? z|2V Ù&¸|›¦î¶kvk«?•mÚÊsÁ"·û¸Kþõ„{I`ÍÊ¥Rí±~Uê-~}¬ÜbáéB4·Ä~úª(DuØWõ…Òü¯é‚Òep|Kx¾ð]aüà¢yB!ŠœW–,«2~,%¬z?}ksu(U 4ÂÂ’©]GݤgÑ‚Z<«¹·rŹ•¡;y,P¼¡\Tj Д—0bÁàPÙ\€pi™)˜Ô€´­Áí:ldk|Ñèh”Íl{fåç>SÞŒ€ç\ëé=øG«ŸD%À\ºiß¿2áòݾ—kÇì3zôh/š7æ°» @·•f»ŽËÏwS¦7t×ÝßÅí¸ùT·áZ3Ê%GÝŸÙ3Ê‚(²¦Ä’úÏ?ÿ¼'¸ÌÀýùPý«ø­w]ñ¿nrÓ7ÛÔ}}ÄÁÚ1ÐÔ!ê/b(º¾ók.éÀ7—Ÿç~×Vº•Ÿ{Ñu¿üz×vÛ-܈#u‹t^AZ ¿@@ à·S"±`[ õ—h:ø'Ô5ÿ£ákêžrÁ`±¥p¬–^h–/`ˆ_}õU× þbwïà]ïn+ø>^¨r­¾r'·åÆ=ÝÅoíQ¢bíj ŒRIî^-œ%\CˆvÿZBSì‹ô.=É¡òŸ Ù»÷¾PŸÔ9O /ò¨Î’UÆN‹M ãÒ­ôÖ1 ‘¶”àñÒøæñ$ê—”–ÅÇ5`aí—r†÷H/ó¤~y@—<Â&­- Àz”Š¥ðâÀ*› ¬Æl%-X>Ö Üš.¢YB{f®åÃ=!ÇÀŒßûë–Lj´ÐtòX4»Î·,aSêc혙!DûYEnô¸&n§-¦ºß¦4rw=ÑÑMÿC&}aŒ³çÖwM£_Q6Gê f14ÌVø >¹ôÈ5ktØGÏZ6iiqsé+Œ=æ7f»þÝ€l{…¹6™6Ýu½ûa·¤a×xÆL7_öׇàÚ¯ÛGK²ûдq†£¡¨ë%ès„iò ù¡A’-w0©¹,kêµI?€ºGçý¤7ß|³WÞzX†~úõé–©›ðå«xÝHúǺÛ] À{J ùö²zìÇÂ{„ïáž™þÂU„ …øâKfáÆE»…0J{Žœ;…Xí)¬.à5j¢ €ÿ{Ñ?cg†ˆÇˆoȞ󽌧Ñëp<·k„Æ!]Àü¢„ßÒ¨`¹°Œ•½®- @{«àp ´Ê†0QÁÌ2òDÚù0¤mÀò6?»GÌLY¢³PžS`îBižÃ•ò§„3i«Á pï÷·Æ¼Ð²Zë>¦Xy{!ƒh#ò†øá›"ÕÛ·Rç¹îNè|}Í»k9³H~´ý±ž;é€ñ’º—ÿ)K è Ng­1t´-¬ ÖØÏ±ß>n‰>èú Ûo°XòüË®Á´Énò€-]ñ­C]Ç7ÞvcvßÙMÒQÄ^IæMNÇφ»¦2Œ3¾ßænÒ¡]+ú€iàââbÏРmÏ7Ôø›~†}0ŠÄ`cýµ¢<«ë9R#Žõ¥¯•¡Ÿ½wÙXsÒxF¾JeP}oл›k¯m÷MŸå¶UbËb›¯|_Þ-|D¡G5{O!S3+é÷ªHkªð!Š„“…T þ%¤? « ÁÃäUFÓ Ïó­xé)£¦'þ|bñµKx&‘ö×Ч“>ÏU°0®}³øq Æ1Ø7Éò\Ø,ßôãÂW¬«ð~™ÍÛÙt­R©X׊Gë>¨Ìš¶5º¹ÖØÖð0Ñg„±çá3Ê(]F‰Ò¯?ãf/HoY@ñ©JYH“u|”GOèì:¶[à|¾ƒkÑl‘[¥ë·R§y®i“EÞoÂoÜf}§—#þaþV¿ˆ wÜqGŸ®1ˆa¸ðéÑo¼áì&i;û¾j«6c~tyä÷ËÁû¹/N=Æ ¿â|· ISW|ª]¨§þXüú›nµ‹®q%×ÝåV¿óÞŒåA Â¥ • n¶Ýv[¿õ.W4ÊËû³;‚-HBX/}\ èýôòË/÷Ë瞸›;éï;WñÏ–·“”9d€'¼ßèÒ&3]Ÿ²»ðááÂû„(ö­(dP'Mz@ø' ŸþMx‰PÄ‚œS„« /ÖñW6y%ÒI ^°0TæË2T®ú?ß@ððM…cv4,÷ÑçÜãEò°ðF‡,n’›Ö<¶•Ÿï7Iòma"nÏÈ}¥n—óWÐ2å ²=ÑTH®\àó•@xòË3l\ü Y³µòÑÙl@¶ç–÷–†è‰^ÌþÌ-i¢ÙO艻, : ÉÜyõÜØŸ¸Ÿ~‘ñ“Uº¿˜èî~º³ë¶â÷ä«íÝÈ›º½úOqö’¦½^Þ×[ŽJ Ž¶ ²6ÎZ9Ši¹–xÆrç ¾f÷B93¶J¶Íw#epºkùÞÇ®]ïµÝäž=܌ӎwÄ€.V æÎsÝžùët×nâ!:Åî•an^Wæ™2ù‚åñÃ`öТG?À–™â’±.ª£cõ¯Ð~wÞy§gªÚswî {h»eFLZè|JÓSú{íº‰»äº§ÜójÖÚ«Æ)ƒÿ /ŽbƒàÂõ…í…¼qåZ]#1^8Lxiƒ^gCv[¿®j õz©Kl“?–O#ýäÉÏþ3׉ iÐ`ì´oÀ\‹ÍÅ?¼æÞ0.m Ë3 g~¡ mÈWMÉZæ>6x¢ú={ÄeAS‘¸ÄŸŠŽjÇÅýPF« Ä52e2¥-{ŽK¹Œó²g2Þ„N̬Êf€$;„]P À¸‰ ݸ ÝݹÛ.[Áýoå~ÒÐuc°f7”ä251w~}ItSöÞê‡z¦°ÔQg=šr.…FúK„CIxlu£-iŸ1Ûnã~[§—ëþÔSníãOwS¶ïïFÿmo÷G‡ö®Ù¤É®ç]÷¸–ÃÞw£Ï9ÕýºZw×éî‡Ü:™°Ë•Þƒ>†nöÐÈuj"ÙÐ^qöxFzÕ ˆý9¶x‡-×r·\v˜k\C?•(`⎮߆«¹+ßûÖ¦øÕ¡ HÍ2¿X8W¸ªÅ>˜F`¡Øº4Œù „‚ß„'Ñ÷«†5¥šª·#Å”ïpá"ÙîÞc¥:s– È\'õm–Z‰ŽÉ„5´g¸æu£Åá¹ÅãYxoþæV†ÈW¯ME(Â+Vi–X€µô±@%S™€U8×ùJòÇX~¸!PŒSP&ˆMÆÀfhmþl–’Çó±«Kfþ 81°$Á?&hA½ ŒÕ=Viäî»®£ëÜ¡kۺȽ÷iy<Óý0®…Û£ÿdÿîþç:ºoÇ4sk®:Ë=òÒònüoÝö›NõEzð¹næœ"wì¾ÔKëÚÊËGˆÎA¿~ýüzô;ï¼ãûKR{ñ®´çç:BvôèÑÞkë„§-gi‰á³£ŽrËoÙÏu»ãN·ÒãϺŬ5è&×äë‘nQ›V®ÞÌY®õ¸ñ®þ‚yn¦NÑŠ“q‘i=¼¾³…*[t›aÙÀ™;ÞƒþcRRRRz¾³¢\ Z¨€Q$ :…}2.¯Êú½üòËŽÙÿv›¯éîºú(×¼‰"£ï^ÙÄsÅS½4\²Ðû÷-ÝÖbÞTØÝr…ÏóÙ<…g½ýAáÍB¾Õ¾ÂC…0zK?ê‚ð“6éü(¼WøVö^À ÀÆÂQÜ,cˆ¤ª±PôÛúnØe$¥™1ÿ—Ô×T©FŒù¾}xâd1,²ù…nøœkž¤iôÈîÍË—Gù |% ·âÐU+ µèPQé©\Á¾|uìÔ³Šò‰>'O3t­¡ð3Ê6$žöÜ+óé9Q–Kft,aÒv¿?£€×î³&Ch^y{ŽkÒ¸ž;öàÖnÿ;¸‡žúÉ ÿ¶‰+Ya¶ÛmË)îËï›»ÿ¾×ÆõßhšûYv¸°ñ4Í "DÖ̺´ûÿwÛm7OØß{ï=_ïÖ‡"Á=ÁG²ƒáfÞì`éˆð´×¤nÝÝÔ /ÒÑ¿ºuÎ<ËÍYâF\v¶k>ñ·’fþn¡‡FÝìö:‹¢&S¦¹ÎŸ~î:>ý‚[ز©ûöÈÃÝ I Ò}ý€ 6ØÀK(PdD¡5é=¬¼ØÀg  (YhûHXn¹å·n¯Ý5ì:vh­2w›¤}çäpªÐRžõ“ ÜëÖj7õoÙÀÝ>c¡·¬×(9bª'ÈÕߢh÷¬ž„{ ‹…… „õ•ŒÆHá]BöíEj¾à am þ*F´xxU?,ÐΘ&b,½ø_ý˻ٱ7)w$Œ©Œö=ø17Ï®£c»ùÇ¥Ë3ƒ€…5?\cpC:—^Ô€JÒó:Ï´HóâVñ4h¾Kp4ˆ¥‘&¿hsV*Š)Ì-½¸¦oÃü¸9áŒÎì1Û©,L©«çËx§ª3QÖ³“fÞ–þ¥§·sï|ÜÌmµq3…uî«Ú¸µWŸïVÔ"ëewvuÚ. Ï'¹§_oïZ6_è¶ÙpšŸ•Y¹\>Æââb.öP˜ËU&žqÈVCfàhÙûv”€™«–¸ßèšÿ6ÙMíÑͯwO쳎[çR-Ï.jåm 4#ñ—ïG¹o¼ãZ½ð†›ÛkU×hŒ$+,ïæ´“°ZõÛL‡ÿÌ£QÎî@¢~ÀV[må ; ìîçhxwöç#Ù`i„m‡„§/W8£ášk®qÚ4q×_rˆë¹Jçê#þôÅE¾Ï–ÒÈŒ¯ÅhI”-~ûÖÜiû•¸³nÓ1Ìz¡>•|)TA‡ ¯~(l#›¬Ñ Å5 €³³gtʆ~!µÎB7$Ìb‰¦-–B£æ°qþIßÖÒΛ»´…}–¿2)#FŸ =ñ ³Å~ýú¹­·Þ:•fì~»¶tï~2ÏpÒ$Õ“¶VÖÙwœäN¼Äùm[-p—ßÕÕ ÓÁØ8`Ç_sn´w  §3‹ÆJ é$½/þ @ˆÝͳhë–n㙳ݒåŠÜ¬Õ»igÀ\7gÅήé¨iX7¿¡ÎH¸ùN7cÀn‚ ëkM³äGÝ’æË¹«®’™ÌJBU$ær‘öÒ§‘X¿Ã~åAIÐè¡/&R™×^{Íï–`‰#_ý–Þ®¼òJ¯4I·>ðšû÷s¸M×[Í|ôÎn‹ WOÔol!Uv/â'ÿ7¢¾ÐA{sËF\­K37 owë‡SÝ1zTÑ~úw‡…7¡°ë ®-l)d.V©ù˜âER“Ç«ÂG„¿ ›4i"æFRd`âùäÇËäÉ2Œøþèï¦à™€ %ê:úÖ3ñ–2 ™ñ·¬ t|öcs†ÁˆÖ.ñ†„:šRÝcŽ;ÊK ›6mM&ç}˜n΀eæ5y.5sW€ÌhWº¿ÓÎ8Ž1ìͼ:ƒã€meõ­~‘»ê vÔ䆰áã:Ï£2¤n† Óa²œ,µx+þÛŠ÷Í]æB<ÍED*J"óì³Ï–Î0‘šp8ì8 ‡sü˜Pë–õ¥$ø1"¤s»uÖhìxj‰›:ãwwâAsÜ­ÿÅué0Ϲ×D7sv‘êªÝ…Á„$Ëy³ŒÃ6Ó l|€Iï ÁG?†]H°?ЦsÚ¶vï‰06Q˜yZ.øâ„cÜò[õsÅ?æÖ?ø)ý-pßœ|¬·Ðåƒ\Ëw?q?œv¬[ ÉÔ }ê–ÿ×`êT7f¯ÝÝ”ž"¢Ù¾á3ÈñC™©K$f‘uÿ¤÷°¤ØõÀLˈ¤Á{äÚñŠ+®ðÌFnŠŒñ<ýò§î¥7¾p/>x–Ûb}-K&ôç0^é5ïºPÄpŽDü|+½7ÊÂæ† $-Ú·Äm/@2¿^ƒV– ®JcÃørYãï)d$… /$áçM^’³ô1ú©ï<òì`ÅÖÇÏ…:¡i‰RTн°÷Þ˧>{/ÏŽ]Ÿ½÷Þ»ˆ ËS)êÑ곋€ô„’ïÿ›Í$›Ëݽ7ä’Dß;0Ù½;egvgÏ9sÚ¼+ ð×+e«+‘7ªdFÔ*¥’ÍT®ø -Üb©”ð §÷¦lMsÊ« À¿@€{ËϹæqº?R&ê;ðõ}¾/ëñ{}…¿ôŠ‹¥jì$‰á÷•Þ)]s-lçÍ«”ЧÊb·J­¾yhkøþ2‚¿p¬í´óÁUÆh׮Šýêaç]v´Ã. üË%ߟÃ@„û‰|Í—w…õÇO.8 ׂëª ·åë¹c¤\¡l¤# Q·b{o(éËÑ«Ççž{Ή {Ëøã`ëMØNÛH5 ®ú™×ÚÁ{4µü‚n6YA‚öݱH¡‚—[Ùl»q¡{®‹>ø›ŸÛc¹(‚qmû<Þi~~¾zè¡.@º>Á?€X÷ˆÔñFñÒƒ•’,ý‹w¦ñÎìÛ[Dÿ ¹|ÛJI ºßÿ˜5š2Õº*f<†|hÛx¬õ¼üFË:ÓæËÈoYóÖò§_­‰$'jØw3íF{‹~ýú9i ÌMº±P‡÷ÀûÂF€òQï²÷Üs5*²/KŠ—ÛñçÜo_|7Þ?² Ëa/ña6¹TÄïˆ?Òþ²öE6_·¹µ”æ ]LžUö}¨´£ÒfJÏ+ñå?¦t©R%°hr=]Z-à­I~a*¦Ä}ÖÕÖÖ/¾ø¢s—Dš”Vþ·iÊÔD6\YµÃrͽòUÀð83u—˜ÇÌgå’Ïý5Žá58_†vø’õ.–Šâ°À@ê\@mzýׯÆ/IÑ^÷×*u©6H22dhÞ¢¹í½Ïžá"Æ­,ìgyÀûÙ ×G¶ã_:OÓO ÎýuŽ\g²ù çòýo&Œ¯‹¾Ÿ”PÜ{’oÏHú“zz'Z?=Q«lÓXž:Ô;ª.«Ï{ï½×­¢÷ÙggœU–ëH^º¯5i\Lj! §môéa­šÍ”(z¢°£ˆçÂzvó“]tÔ¹+­yÓvüÓ¬UóROê˜ð…¤Ù·ëvÆõ x§D“Õ6öÔcíÛrô§’éÇÜzå.\`¿ýÞŒŸl‹zõ°:¹u­¸]ùÀ­² @ð,МéóîÖL„vÔM×Z±ˆz¦À<° ò%ýÃvy7˜5$ H60 {>ø{?û쳎Q𿣎¿OšmνÏ^|ôëUÐ^rØd²ªgçDü“œ¿-_b*Aô“:Ð2/×.:jm»TÆ€_)os%–Ñ) T«$ÖÌNWÚNI=s?›ß„ÿ¥!Jo*ñÌÙùqàÀŽ)ãý\yå•.®ƒ²£!ÅýQ™5|=ùeVKwVÈuÖáL1ŒÁÊßÁ©»ÀLÂóŠïÑã×ð‘ë>/ùÜG©ZöeÉóíqío'c]ó»–U)ZT+å,+Í (@IDAT:Y(üнǶvÑ%Úõ×Þʉ=­2ù2#¶UÊl’Ií“N>Áé,)‹\V¦ÃС}Ç uZhÛדO=1¶ ÿ’!àþ<îžT”ã7uG¹E טÈnb™YÌÄNp¾5Q#]_°Éèß¿¬Ë™gŠˆrGøØW_}5mhçµ»Ô³¶­êÚÆRìº}C»öîB»ñ¡FöÒÝ­i^;{]‰•ö÷ã&Ù¥´þødTžë.E<Þ ÃA§ÿ„ãM§ç1‰:HDA.ïÜ3Üôç½ö´ßq½Í•q`Q‡öÖñá§mÖ^;Û—·^ks¶ÝÒê,ZbËY)ðž•VÊ®Éhvì`Å¡XâìI ŠR¡¿Q?˜[ô ÆCA¼’m’ëÒgT7^²Ž>øæ›oÚ3Ï<“\%ò÷~™b‡žx«¢=Î Ê(æ…­,–ëžÞËÔ÷Èv°”â"Ó+…ˆds™eÈpÏíDÖ%-ByŽnŸ•ýQJ¬p.Wb‡(µUÊöWÅšþ*¥S•†ÈŽc=öpûSÀ ï²Ë..Ò“»ï¦g‘ ‡äÜþ¤ ©•íÇ–Ñ Ü‹š”$¢Oå[‹Íg=NŽû.C¹ääïãp9ßi(u츖m½ÍV¾ˆ;.]Z\i À’¥K\Ým¶ÝÊ6ذo…öb~À×V 2Ã*UºEÚÊ Ó–P>}z—êߋäË.¦9éÝ«ýøÃOJõé šH áIàé§ŸvôtÐAnÕÕ-òìà=Ë…F )êVúֹSgíÐÌFž¢Xl—-çÙ»#Z $ìía-í½ÏZØ>Û϶חØ9 ðžø¸1¬ÃÊbH ®Gƒþbà­ìÙ_ÀÇàOÜ|3›þô㶬igéá`eKœ×À2¹  §Ï´:EKlÞÚ2Ó¨>ô~ìikûÒkÖdÇ~6ÿïç:)AšîWÈfþÑm·ÝÖBbÁŽ}¼§( .ƒ¼»Ê2ھͱ?ŠC^©Þ4œ‘æ¼m›¶6Oû»cO0Qúh[×éVd|3©^€1ý„J>R?;4•mÀßmjO½¶À¾ý©‘ú¶³ué°L¡†‹mˆˆ~¿ÍæÙÖÚ+¶Q ¡Vr\iM®´.k-Ye?ä{ñþy¬¢Ù'à믿vzÞmªqp<ÔØÀ!Š÷öÅÍš–Ý"!BË_}­=Puó&O‘”@»]JŸ˜«ðÂë?ú¤µüM>ñ8ûéðƒ‘y â+k<éÄÏEo0~üx§ºˆ²`[R¿*Ij.£Ÿ§*V‡pZ4›‘Q3™WøåómÄ·…v™j€-ÊÑifMÄ•I"»øRé%É5œ­Äõçœc p纔˜ÓwÞygʼÐŧuŽ@¡6Cj$µ†{¼B?9ñ©Øß3©psYWô-‘Obî‡Søº?÷G_®¬Ð y, øÆýwÞY È¥´„¢´S/§ EªšÑi˜=n*<Ñwƒ¾6fô˜tu+· NÑZm`Ê©FŠr)¼//b¡ãêÈ|¡\µ<àÚI2iÓO’¸#íxá'—®¸‰ˆAK‰;{ɯ”Þ:SQ¶& ² À£Û5w͵ÇnnkÄú«Ot¢¸ÎAT08c?ÿ|Âeý‡¡e¥ºóÎ;;j³fñÌÞ ‡åÙzÝêÛð/‹ìˆýšÚa{5±S.˰ÔÚy¦ž{›¿ Ç娷¶ÙóêÙîÛ̵ݶ•§V!¨vØa›¦~ès㘞Ä+{ˆ->÷HD¸Î¼Ñ›¼ÕæVG¡„ëɽNÃJ´áI3µ½´C[–[Ïú<ò„å}0ÂÆ^|–ß¹ÐIêV˜‹ôff€ $®û÷gÃðáÃÛcnec'Ù …GÆ‹cMCñ²•öƧÓÜÎ(ëfU{Jå½eeò‡ÒçJ+-Ö{ÊÏÏ·k/¸À‰ûñ¼ˆÆóÏ?o#GŽŒ+6V™w(ÕëXR^ôÍ€œ æ(ó”Å”cb¾feyþa<Í5|Ý_s™IÜ7[ZÇ×§È:ëT(9K„±‰×ê@-NðžvÍ€¨2ý®ráN¯æyZ Ü.ˆ $¢jß{ÞÌaöl½ Æ*TˆBOá—^¡‚~„'OÔ¹G¨Á¤ P’ÃýLB$Ðû¯ÐУ: û8ãÁä›WÃožoe`Ä—K$©ÄÖjL§_Ç-³üÎ9â†Ë·ÖZkÙGa›m¶™-³…­ÆÉ÷âÙAtTµ±ðãvöÃm<;hýøÛr{â–Ö©m}{è¹™6k^Ž(Ï€¾=Ù}/¬e£Ip×­ç@{ÕGƒ“»±Êoú„•üž{îéVù¸tÁÌD=/®?—AõÀ1g™öý¡1¹›;d–°úL´åò èóðÖà·±öã—Ù´>½VéGU/p¤HZ ÜÊH-`ZFŒáTU½ÇÄ™ÅV´D—­y3nÚb{ýã©nC ÖêxU)=†*¢ô¼Ò2%ÞÝ…^hp@Æ+<@"bƈá6¥ñ1ejKVUëjI©3œÖ7ñÏÜ0 öî[suË%\ƒ9àNà#·“;KuÂÀâ& KeÏ“S§~øRÆç;wqøÐß¿¥ŒÔ3€* Ø*‡é3èÑš(2]"ÿ0¬µV7n\øRÚs^àײmi[oTb®·ØIÆOmࢠ²«àûŸ·°gßng#¿k¦¼œañm%ýû_guœš¢wïÞå+ûäÂ¥¿z÷O>ùÄ14ŒÉ1 ¡±'Ä\X=y|­½ $áúæú«lšb ¬p,Y?_Ab¸«m·ÝvN:ÃFCÙ€ÂE+l^QE„™vWiC€Þûb†MŸ·ÜvTfU¨Oöw¥[”NPzJi[I} äÜC:ꨌ‰?î•>ø ³»P3Q0Bð¨Ê£]íñ­ô*'9-µ(ÅÏQâ*–Dáh«ýѾ¼?zåó9 6 õdÜ›ÆÐ3\¼Âù2{âOF1’ÁôPed°æÙóôƒH[âÛo¿«Pfƒ 7°Áo¼å¢Ê%sa †~°¯zÅ-oŠÑÌ‹üNQ›¢À¿øp>×xQ p&ç\ãœk¾Ž?“¨”ÈQN ®6!Ñh>©éŸA0aòrûù÷b;öà¦6ld‘]~ë7¤µ»äêY˜}õ­¬óÛäHç^>ÕX}Ht•±¸ýöÛ]Ô»ýöÛÏíØ~/áóÖ-ëÚÑúö—ßaß³+Ïí¬„ZÛE7N…ÎÚv›Ì·'·³)ÚjxãuÚ;Ã[ÚŒ9õlï~³ã„2e·á½b±Ë*f·F¢ëáÙWðó•Dû"Ã…cù{âñÖªßvÚQP›±à† D÷köÛX[ u‚{ÈIù¡¢H#.¿´0óÉî~ÄÈ&Ì),¶üÖ«·"Ê´s.³W>žb]T¡g¦•BåÀ Xô3òg”÷óÔ>ø`;õÔSÚ'ÕûT‘X:t¨=öØcqe0ø»^I–’ ¨ ØÕ/Xý¢-šÒÍk½Ôï+|ž.u|"s_ÆŸsŒò’%Lø£Bq¼ ¾=ÜXTæÌ]¡Ê„¤¶+dfñÇŸBðë/¿†zõ^_"Ìú·<™ óeÂGvM{ùå—l»í· _–ÑÙ$›¦í\«LŒðÄIþL6¾M8þ1ù”|  ·UpD([g!žÜŸ1?,µyu­Qƒ:vÙ-s¬çÚõ¬iÎõεï~^j¿q– ¸hº-YºêÇåíÎ;ï<Å.NÄÏ}AÄØ\uÕUöÆoþêéàôcòìÙ»Ú[§9öãïõì³7´Ã÷͵s›Ø/ãi³¡e¶ý¦ó݃£ä.˜‰ |O{÷ïìw€„)î½Á$"jdz¢wÀ™Ù Í»âȨ™mrÚ¹Ö륵ͰF*æQϨьYÖú»ïû¡w7å9zjžg6¡…æ@û¹ÙlrÕ¶4þѿη‘?.pQ÷*s7ž×£•pã;Eé_z7'ʨ9öÊ+¯¸=#ü{QvÆ€7Ƭ0V1ðŠò†Æä×¶¬AFÎP’R7Äi@ŠïÃ?0f<ù®N)~ö¿“¯%ãkßFª#uùÞ}úî»ÿè[.ÇþZYiûèS«6å’iîóﯙ™kþ ‡í¡™¬$RÜôo¿ûƹaµ¸ =ðà¶^¯u¥ï̯Pì»$ÉB8ÓOŒTG^O>?ê·»Î$TãÌYïÎ7¤hŽ–º5iWY—Ï??]l­ZÔ±·Ï6DïÛçX¯¹¶`Q‰]pÝl«Ÿ[Ç5¨Mˆ¼}ÀÙgŸí æÊnqÂsyûí·íòË/w„tý]¿[@¦ÍÐÖÀëÚIGv°ß§¬e­_b¯Wdw>Ûцg ä!G/—h—Â"…N ŒUñ¹Gº^Ù§*aA\ˆQ$.wÄHÇx-èÜÑ~¹v å}ò¥mqÒ©ÖòûŠq-Ü}„;|ù•õ¾ô:ës߃ÖTžq€ßeýĵÎÛu³ÖŠÄ¸fWÿR¸ÚSoO´&r7ØD7Ïäk‘ðÇ0!Fö~ŽÒ¹J¿+€±+>üðÃÎëC—W^{í5gçÓÀTåݤTQ†S¡dUƒ>gÕQáÛ¾Lk¥o+ŒÃça|Íyª<_&ÕÑ—ç{_°`á*ªèM6ÛØ¾™¹C÷øì³Oµ'Ç:eƒ7n¼T†%e™Y>á{¨i¸*“üüÓ϶ëî»8ÄJùvíÚ:ÜáÃ?uK¸ÆËau… „?æAo ’Hf=Ûs¯Ý½+såxÅeW¦äÒ1ôB¬‹o*y³’ã˜*ñR=`6ö·±¶TÆbìbˆ ‚aJCÈp_‹óÙ³¢™_.ÛǾ}û:pºv-.±ûžžg&-·½vllžÒÂxf¾m·y#{üåBéÛWÚíÛØº’ (8–Ï+u«úø#ë¹~w«Ãg¿ÿÞòøÆÿLw¼:]¸ürÅl\©ZGôÎ[Cìð#-ëÍ[n®—ÜÙÞïCûø“mÈ{Cœx=!¤H  ˜„£9BeÖ+«Ã ~ð 7µiM4²÷/¹BÅÐò£ÈÞ×çèŒý‚;&ÅÛH²å_6Ô¼;EZP€>˜Õ8“9fϬ@ÂWåAî¦hð§žxÆ7µÆ€'ñøcOZÇNkUÐåwGÀqÇ£•òl›-UÀréd yÚ`…èœ'ÃG~lÏ?÷bòå ¿ý ®p±ôv}™ðÑO?Qø­‚®¦›ÀΚU“‹sVÄ©nPzvkð[Æum§vн}×N96äɵDÄNÄÿíOK®ú¬vÇ­­Sûzv¢ôÿKå"xÞ ÍíÕ! íÒ[f+^@;÷Hnyx®Íž»ÒÞy¢ƒ[•‡oOü6¨!F=Ì@ÜÊ”÷ÁF>èoÙvxÇw4V·Q€ÇÂC7´µodÃP¬à;=×ΕíB›¢ø~ýõ7­Êu{¼…AÚo nÝ•¶ÿ޳õî3{/ /ú€…=Òœ1cƸUDª9I?™3Œ÷±±cÇ:iHÜô€Uæó*=p·ÞÕÜʱ±{í¦øÚ ARúó ­ÓW_[¥Ëlö:67$rôÍ€¨HD $!C4^Ò úƒ+#ê ŒIŒ/ é1¹€®ú‡ÀFup•¯~6a™š¼ù©_­¯í®”üF”í6b™=X ¾Ž¹tÝ)§Ø1Çã¤,º”UøòË/í¡‡Šk“IuR¬x ®Ì[‘VCgÀŸåzÿÒó$¼¸Ê·¡ïȹª®«ïñoéo®…õùä{&=ù^ü~ô‘Çí’Ë.r®µ¾ 7Ú@ûḵO†ýÓJ„ë;vìähj¿±ã~Óï¶ÃNÛU¨ùÔOÇöÅ·Ÿ­ãŸFàüéˆÏlm!°0ÇE«UD¯mÚ¶±ÖmZ;ä剰¯Ëñã‡ÚÍÿ¸-|i•sT Þ(hÛ'ÿ;¹!&‡Sy/+vâ¢ È P¸zú³pQêð´SÅ Î37¹Ùjù ÂßÿýÓ"ÊF %m¼ûI‘M˜¼ÌJ°ãÖìýá‹lÐû‹,·^ºäZßõd¸)&àð}šÚP¹ >'WÁkÏoi=D|SÏ—w€‰ÁwÒˆV]3?+n> Ľ<«Ü(h/ìêËFû!Ò[‘hgo~”cÍ›,c³Ò~×ÈÞÖÊöÚ~ŽÛipè—-œÇ@»VËÔv9é)UJa—y@_Ð>¢~VÛÜ/pF¯"  ñ’‘Ï*uU¯ö»(¸óa›tê±6m“ el u×–§oÍG|a¹Óg[§W[ŽÔ s’¤áö ñç»B5ƒ×¶ Ä»?á„ —8\é"YTWHìÿâ{Sì¹!íç ’(LXhâœçK‰Vî ë}È}4–û w&ÅùW¿Ú?žüÝWžFéôÿäÞË&Ba¼D?žöE{sðÛÉͧû}uºqùј1®V æñâ®x­û·ÿÓöÀ{¹•~&Ýâ:˜nåO[~"øcrû\K|TåýÄs˜˜IV*  ¤c¥Vg‘PN["‹¬© 6‚yRþ÷è33…ó4·C§¿s©Ë߉Ø{÷¨oÖÂnyh®ý"wÁ6-s’¾çÉyò¨o»lÇÆN…C‡ó8'²íË/¾b¨ªþt €@èI^u¶ô=I:þu¥è¸ Aà¥Müc¢ŒÄ~°ïØé1}ýtG?aR•ã…úüäcryŸÏu΃É' AJDôRKQ]3šÚÉÍUëï‹.ºÈ¶Ùf§ÇÊôÆ]:–O©þ[6”=Àl7±ØN9*ÏfÌ^î¤øæc„wó%­íÅ·ØÛÿ\d-[Ôµ¿i—¿ Ö¯ŸÒ»ûCxXÁyû¶á…л>E!¬ˆ¯o¾ùfì†íq!¾Qå}ëÉkàÀÝ›Ø=OY^ÓÖr\n§>ÛÆüÔÄ~ŸÔÀ¶Ý¨ÐzäÙC¯t°OGçÙa»Í±Ë± O QƒxÆûgU1/((pŒXâ37¢úEö0=lï›Ò>@s²ë§ÿ²&_|m?Ýp¥ÛtHºýœžÂ!/b"–ÀLÅv׳i,‰Ê|­NêŠq¨S¼ÜV4j`uë×·Md»Eüý3òGÆpÉ%—8cLF‚µmÛÖe³J#!µaUc0NéÇIsíé÷§9F¦ G'=S ®_ÐT6yÖ©uIóX^}Ñ1Ì02ŒÅN§ÌXbw¾2Ñéþ‰ü7J Ò;R ’ƒ÷ÙÇõ ƒÒ8æJųHiˆøÇ»‡•‡@âÏ 5¸H€z®èþ‰‹Ƨ Gÿ›cPÀ(ûëaBŸêÜ— ·áÏãò|ޝ‰}+fû”ÓNrRK5q@»ìPûðCÚßÿWtåÅ÷pݶBÃß\…¬Ì úÇø¢U«ÀŸræÌY6úë1nŸóÌ[ J²ºA‡ ±ˆ\¶|É„S‘ãÞ…»hñ"'öA\ZWH8GõrÒ$™«ÕRªIöÕ¨¯mÜï㣺P-×!Tï¼óN쳈ê+ûWÞYd½<ß žphžkcÛÀTy 4T¤¾úv¹lð hÞ¬ŽSùçgEöŸŸ‹mÃõsÀ‹fZ‡6K­p¡âhÛaöØs»9¶ÞÚEvÓcí˜}§[ß‹¤‰%þîÈ\0bt—‰+ ã†òa|ÃD'G+ðÎAÿ±Ùæ¶BF°%9u­á´™¶27Ç6?ÿ2+–øqæ¾{Z«Ÿ[Þû#ìË'ï±¼_ÇZÁƒ[Ý¢b›·ýV÷Š‹­ùV[Tèc¦?Xý³ßÄìáïÀ·AÿQ‹!-Àà‘±ÀÄ1~Þ‘F²èÑ©¡mØ£™m»aKëܶ‘tmlòr­~ƒºö‚T G_ÿÇLUÃXÕ¡bA-qâôcä—êÞ¾Ù<òüa0a‚bà7åm¯Dwÿ¬€¶å…êîüÞ{ïeHŸ^\,û"¢-VZäËÀ¦Êñy2’°9Ò½·kÛÁ-^P¹yÜÊ»ò |ABïN GÉcÄ.ˆy”+S@€«:QkÛwh_fȽˆ=3Eé×gÃß¿J4¼J•3}iÊù7—¦Xõe³ÂLÇ€¬MÃpî ž0ò €Úâ%‹ ƒÅ¼¼æ®^ŽV>uHp“«O!émŒúòk?n|õ <âN Vü£ÓyDT·EE+q`+­ò/Á2t‘½ñppñ Û@v7^Ì:Î쀓¦Ø®R œq¬tÊbXPyû‚¨¶Yab¯€wÀð³OU‡½E‹n˜P&ðÂàvû£óìé;ZØ”Iíª{ pf7Éž~³Mž‘k?Ñ”T€Ý·è»@L^fS›>ƒŒVî¯æS€Ô`&±2Æf%°Ñ57Ù²­ì‡sN²uß|×þü›å nóûoi¿º¿m|îeV¸Íæ6MÛ wûáG«§=ìm™Í‰YX]@m1xð`‡4Y‘{œª=úá!âz¤H:0¦ÃÉß+)ì {4²M{6·Ï¾›m?ü±Ä5‡ëûH™ì™ªU¹ã²ï¾ûº~Ç´sœòžŠÉÿ3d¡N>_ÝÝcÏ=Äì Àâ"'MbÞxbž<¿`Ú´igÛl½M£Ou¨ë“g’ÛÓ3¨ìVø¾7näª.ZTû=¬FûIT£r-”Ëk+Wï/_:nBøÁûIåL.˜¼x7I5ñ0 UƉ³dš€@HT î×w^öÇ×+»P3'Ï=÷œ»³Ê ®dÚ›Æ$nÖüg83f¯°#µcžå6xÑ©-µc\ÐÒ×µu×?þ|±=þR¡ JlÏÛaû4‰dÂöì ˆ}"Ù(F€÷}ôÑGÝ®x¸ bà–n\H)Æü¸Ô.¼¡Pͳ9…ËlÀ!…6V¶?ŽkhGï=ÃFÿÔTîŽ l‘öøú‡¦¶ãæó¬wwÂÎÄó‡~±K»‰áKÎjäžOáVã@ ‚}À&›lâ(ˆÍÛ ÏÝr3[ç÷ÚÙLÜXa‹'I'Ÿ×Ø~=â ËÓʦNÑRûåP­TvßÕêÕÓ±é¶Vò½©v;øf*}„Á:î¸ãœîýé§ŸvvQ†w0:0q¸žbãáé±ÇëÞ î“ÄzÀ¸Ž÷ûâpl –;‰Ô¹çžëÊÂÕ Ÿï¾ûÒÿÕ·×j¢Y¾g9bËrÃqÍù=SœU¿ÃŸåj€G¿i,ë1(õø2/öv¬äY £Ç€ñý÷ß É a%¸Öá[mµ•S ? Šà6kZÇn’¤Çkîší6>:þÈõíÐÓ&[×µ–ZÏüÅvóã¬@„úm:Ï>ÿ¦™=%ÉÀYGM¶†ò$hÝ":p‰sÅ[ß³}0;&bd0_¢"‰}ÞØ@TÝœ’ÎtÂý î+ÿ¾‡¬ÛôB[Ú­³ýpõEÚO ³Õa~*„s/Wi,ÉT‰ô‰y‹,¡ &rM‘5Ýp+‘*ͺw³„˜“Ke   À®¼òJ·¢Ç 3Îà•ºtÔ0f0¨áx¯Ï‰Ï„qfºHeú\™²øy§‰¢ˆ˜â ¥Ôn>•¹YÍ—­ °¸ÔÅTѼ7ø48úÇã®ëåa<þ Êmøëäùäë§:FáçTe«ùíÄË«ÔtÆ•/WÉ™\Q=Äí)???Ö º)û£oß~ÂaÂ"¤e“ÆM‚w¢ºh}©ô[”On‡•ìüyó}³5~ÄU*„&¹¯•é~âl¼^·úöôk ìY¹ýb‰ÿãÀ^·_ÑÆ¶Ø°¬ë;‚£öob7Þ¯˜ÙÍëZÛVÑÓq2:`Äû|èƸ˜qP¦§h"iÆîý;†Á.’ëãb»ëʶöþ§9öÓïuí¼c&[AÇ%nŸ?´ëà~kì ñ,èÞuqÙ %îyÑ_Dç¬ìé:s\‘¢˜ßÄéúpDãnÜš`ó;w²É{ìfÓwégãÜǶog‡~j ¹ø5Ýok|ö9fw?d‰Ç%ámÞÄJÎ=Óìò«,qÅuÚw‚%î}ÐJ´ÚMl·-¦úþvÍS) «ø8i Ì ã6l˜ó(`uj€÷Dbl<žOM.aØð¼càQå‘1_LÁ?AÖ†êãÕÝO˜Èš¯ÄåX.W;¾QsÛ‚p,#‡ [¢¹Ú ACÇ<ò-eIg<áGúÄy`£ŸÍþµ ñ5UéRå¿æªÜ-u]¬g²ï˜›ú^]õ È&@H eœ8&ƒ›<ãÇ)ðO°iLn®tÇÒiº:VŒ§‚ÓŠõ'+Ž{mbøðеã[ȹª€ÿýA{4q[ }`S·kà½b¶Ù´¡õß2Й½"b‘é–Ÿk×Þ3Çm=~éâP$€ŽQ3HÂ%¶Æ¸·‰ t®çb´lžk·<\d'ÖÈ6^™ý4v¥½òAÛAnƒGI50oAŽ}ù]žõצCu3´ ðã‚ø! @ßnC¨8F€q GG*À<¦¾£Šø—z¬‘Íÿ×H+xæ˽úrK\x¾Ib‰w>ñ?ÕL CâÜó­ä{,q×ÍV²íV–8ýïf²°u |×*uäYò.¶ß~{7jÔóå}0F‚ ±WLsæ®¶+6ü‰éÊ;V©fyÄtl5³$²ýW³îjW[[ @»휚(ˆÄuwîdB§ºßHýú Ä8tpvKä|œs$±@ðÒW ⋸ñ²Ï©… bEq髵¸@ݯYv>éùPÎ3Àr!,LjʹEƒЄÃ¤^½ÜÀøÏÑzÕS‚11“û”ÉSE¼j€±Á¼õÖ[NüНxÜj.ùY¤ú#IÆØ è1Šx.³o¥kïQ+©Àb{J‚ãɳÞ\àŒ 7êÕÀ¾úf‰½,ïì ¥ž'ï‘2«P$*|̼«TÀu:g Ñe“ @©€ Žˆ ˆ·Ãü•vÎ -m-Eøºñ!xÚ ;þ€©²]XalaM>x‹> Š3¾¡}ós+^®¾å±G@в$–{¥êýbE#dõ âJ7"÷Á€ÂÌ ZpˆRó¬e^žuÝegË‘¡]‰6®Q8D³§Ÿ·ÄNÛZⲋ,ÁΛ>-Æàl³µ Ì´$ñüKЏÓËLYU I7Ûl3·e* WœÁ#ï†v¨Cùóª:çªÒê˜`&(’M"ÿU`¿ê tÚI Æ®€Ûÿ,×ÜlXÕ«Ž–hAU?W €ö¸ð†Ë~î{&À~ôuSù†j)€Šé†T}ÎôZjÌ–iíì”;KÍ4ÍNSÙi¢‘ŸŸ^ÀÝ@ÂaDÌ9“ àÈä™ îÝ“±‚l¯òLj`@FZ5Ä`î˜æ»ž­úçÃ?t"6t±Q+¹Uk¥¿²Q¯úÆO¾Zh#GÛA ,ÄV¾Ï¾¾Àn¾´µt„ ðæ­´?/²OMðõ÷: Îu‚qR Ü‚ø˜!,QÀ{ –è[üÚ‘(„ßs¸.ö;o«w+FäˤÖXd×^ÐV æ6â«ûð3ÅØe–}ûK{ퟭ¥ò©c_ÈF`‘‚õ,Ôc`èÅ!m­k‡¥ŽY·Ï9s‰qÐDà .¿ fT¿¸ŽôB ã™÷Îp—=H :ŽS¦š²¿%Î:]¡)4Ÿå­RòÛ¯–Ð~%Í${åuK¼1Ø©BÈe àB6æS§ú·ræD|cxÚ ¥ ¸SCCßaÜxH6`h`’¿—²~­Áæ ûNàåÿVž¸' D{1ÿDYˆüö­îþ´÷©0ŒõD; êÞ¨¯´g©K—hIœÚµkHÀôíPÖ¯ü“™òâ K°H¾%®ïéòj0@Œ%6é‘í|«­tG¾=Bò×èW0yô0Ëd€2@nN$P: @0/ÛÃˤ½›T¨‹Rä{á£ñ†v›nºi§IãqeÊ(m­ìqdÞ­6n`^¯èzÝëk…Ý\6+Ýï^ÝÙX¨…Í”WÁ3ƒ íнšÈF-Þ”½1öH.@ä“8à=b€¤áñ+Ѝzì@ ¡Ý¶od…‹rìÊ;—Ú¦}ëÛv›Öµ_T¼ƒ¦ËíäC¦YþZKìÍa­m› çkÞ(^½vüe‚|ßL¨E³hæ„û2$Ø`'ûb& v‡øS׿bBF“ y$6ÔÊ^ jâþ‡¬ä‘§¤÷¿ÝJšH óù–xVR!akžÔý}¼Ù™ç™=#»ƒÀ?¸^‰¿<_¾3ˆ<«ü(i Í’‡}q°‹@-î­Dw2* B€,<"jr¼’Ä*)ØT£Ù§ºGÔ¥k·§ «~l*0¨îq޾o¨TëåäºïÃÏOô¦aUfÀ×Mut‹8명*€™êï©úœéµÚÀ¦Î†–™v}Í•ó?yâî#yâŸ\ÖO¶Fl1bbº6 ”{ÌS÷€WuÏ›•ú)µ‹º?ÄQ3D•ç–-h&C@Ô¿Ž[fŒXlWÓÒÿÝùØ<£ |º±­óþåb›5g¥¾oSiðË1Á†DmZÖE¸² ð®x¯2â1‰}Ä·¼Ñ£G;<«Ö(OTݺ1F|¹ÄI)®¿°µúO®ó ظW‰½4¤™³ ˜=/Wá…çÛÔ™¹n¯·œg›KM)0¤¬ì±€(EÍCÚ„Ñ5j” ì V½ÓÄ¥WYI«fýiÅ•xk•Üs—%¶¬ñK¾ûÞgh+RWòôc–¨•kH"ÒZv­ÒlÜž%ïo $.¨jï*ü÷†ž±l½õÖÕf3ñGE|;·)Å[–Å4PK³jŒh/Fí€Ù€9H˜|Òå;€s¥RXª½Ça` Lip,8ËKü‘ëqÀ{'Zg-d&¨ßÆõ=]^m`-ɺ¨ö@¦zìRªIÄ5§?š0ÞY©6Ô +§^Î*/ŽöŒSjŽx[}x_i¨ÒöJ‘L€òA!RVì&²…­mëºnuÏÂcÿXf—Þ<ÛýÞw—&bŠíú{çÚÑ6Ó35;åÒ™öù×Kìíi—Á¶å& S2ôÃ{F-1DÀ‡žŠèPžëX˜ÜÓÙP§[~=Û£#[»K=;~™³ÄnØÉ¶Û¬¾b ,·ö­Û¦½ ÙNÛ&7\i‡(¤p½ÐæB´‘„œ•4’LìP`e䢂×Ûšn+Bç–¸æ6KŒþÖJ{Àî瘒_±ÄáÚ^Áoì–-•õ€3,qæ¹–xLÒ€Ï?µ’u{ZB†„•ïʉ Fœdƒ÷göÕo¼ñ†Ýx㎈DÜîí0%Vf5€Ø»ºÕYóBî6°RUàV·¯ ˜ÕpOģꜺõœºŒ9åʪ Ä?œ<nLµ˜€ÕG·úP€ÍÔýþ«?„ì×Ì”ðÄßéIøœßnòü£& €t=éJ=¡wë!2 \4WYõLU¸È¹5#xWþJi–Ò[JÂþ&eq4`Åf(øncíMC-ö—ôÝ;·ÀÓÉ“Ž¯Ž ¼}¶‹xþ€vîµ³P(aOÞÚζ”Ú—A‚÷äI?†QßÈåR0ˆ•‰c˜Æj¡2öˆ£Q `WÀ{O¸4];Õs q †\fûí–g§ÛÖ&Lmh¯P׎Ús†µkUœª‰Œ®ñ¼éK~~¾ MÔ*šé/«šO>ù¤L¥PöÎÔFB»þ•`pöi–Ødã`…u÷ý–¸øj+¹ófüÓôð¤÷¿æ¹>c%O<( ¬dÂDKÜ~‡ÙQb$ñZ@ÂÂ>|‡DF„AN~¾¨b Pm«¢Áyæ™N%3&Tg¯Çäÿ™³X¤íUÝ€Ae[woÈ\pD|…ˆ9XëY˜÷U½+–€pëmÛ¶;\¥Žg’éÆT‹æÚ?Óõ?.¿60¬0wˆëduçyc)¸Çtà ~2‚òõà–Ťc¥µª€0°ÒùŠ~ø¶|]·pÍ2tC“W”¶VÒò0à¨Y%¡7‡ ‘gØz˜ †8¢¸ëñyvÞ‰-lþ‚•R)f}{âåBgŒ÷ïï–Úr1l-Øœ1p¦‹2HŒ¶ö€u=1°g`•‘IüDÕ„­E/‰q^œ}!±m øQAçÛr£†RqÔµE¹Ö»§Œ÷h/õPŽ›'Á*' GÍ+ßoæÀꛀ޽{»謌Y2Ž2Âî+…Ž FB(3.«-wOÜUÛµ•y®¾y”\p‰ôýÏ™= Uƃ²°‘£ÌN=G $Ž—@{ÉŠÚZâæ;Å<èŒ e±é‚ %ø–Ód0/H5üN~¨™úƘ8âÁ1Ãæª\Œˆi‚þŒÓMŽUú+þ…Ÿ[0:w´¶šSàHˆ¿ÿ6Ê9úïÉ?ÑTƒ¸*9bNÛ´nãÔ}a‚ï%~õ￟ð@“Ï=àn“ókð7ÄXUî_Ž«ÒJÕê¢XÜ¥jMd·6ˆ•l:ÀO¤ýÑ_çXÆ8 €€馅)ëСþíJlì*+6 ·ØÆ¸ €°{,ÔÙJë*u/»q‚Û!jùØ ¤H÷#š‰½ÜNÄ{Ó¾ lû-ÚÄ)Ëí£OÛ·¶u«ÿ·´»`®6”9í˜æhÎKo-´w>ÖF"ŠBxÌAͬ¥‚ …w‚"ŠNqzœÞò ìpƒ'«ð(û ­#û€¾Úÿ€{ßöÈ\AZh+r^3]“.iÄô¹­lÞÂV¶v>n£uGRQ$Aìé'¢ÔùùùŽyáÞäÑ/òPo°ý0R8w;Ê£Þ€ @·Îª«,ÊÞ¤Éü"F ¾ÙÃRôÛ¶<Ð#Ošýú³ ïr„îY* Râµ·7à$yün‰ÝöR,¬DÏ'ѳ‡cÂÏ<Ý9ŒïÆ ÌJœgt¤$qƒéÚ­L>ïöœsÎq*‰˜z§(‘ì_`ö¬îÁuî0ŸVjÕOr*áX÷¯”¦N  u«ÖÎ{'¼ú÷ ¸Ù§tc‚`WK€éú—_Æ•\syë©é}×\ó•o9S€–Ažqà<ÈÑ”÷puU"B3É"ÛéÓf¸­âÚ_CyCÔn˜à6H)!Ù@IKÀhàcyï½÷œ‘ „ ¢E£[‰ÎáyuR !ŒîÚ)(®ƒø_¥kߤO};ûoÍ(¨\ü?mæ »êŽÙ–'‘|Cí(wÚÿåi³Ò ‚`C3ç¬pí±ñ ï9ÑÀòñcm”'̘1Ž€B|ãâøv:ˆ‰! ž4ì¹ÁEvß3²î_ÔԶߪ³õZ¯‹ëÏÆ´¨¸½=÷VCíAÐÔÚ·m.F¡‰ú¼ê<„@â ½å–[:5î€Á\[µ,÷g>Âô`€•}G½aëVf}Ö·„Dú‰‚|•*u´äîûô:[⸣©l¦MXì Ù¬'>ñÅóò¶F Dt¬Ôc¾“MÁV‚Ç’…Jn˜Øx/¿åp%›©tq,Ê ƒÍ3‰O”'IHSøOšÅB­Ú€N²`§Wæ-«Ž©ˆx@ÿõ1 0¬['Ç}èçÏ„þ܈ùS‹Ô³_Ät=mVm`Ú¨—ÿ—¶§ÕX 2*ºâ„$ƒ—8w3áÇ ê‹è6u@˜’ð—‰È¹'>¾3´Ï<¾ÖÕ0_¦¸- >Rš©´“R, |G<_ýu§Ë%®;«·TÏŠ²« øßï,·AVØK–”X¯žõmcí+àqi£÷?Shßý¼Ôvܦ‘ãü‰@ÈŽƒÄ¸U+ñÁ,² ƒ kÇò!yû(êÜè@@QÀ<ÀäÈ‘Ž2âì€D܃00ˆ„ˆ+áêS×N¹ Š„WA 5Z&mÑWδo~’u¾*/Ú4$ `¼ œPúÏ*?Ý꙱ѫ/¦u­-·°ïþçoBG5?ϼj%›nh ©/ì>Ù¼6ÄJn¾Ö ’´«Dï<±©l6ÞÀ·ÞoÚ,AÞ[úV*}„ðÜU°ÝôW\áˆOÄ=™*)˜Â_xi{T÷ ÉVØ€ @. 0R€²•|iÏô- ’«S§n@ ¼lP/À»¥õbµXðŒºý]L×ÓfÕ wqÚžVc «­LD×L*³ŸdÉÝD0iÒD'¦jаp"îi‹Šºè³8‡0†‰ãÌ™³l–R ##î ·ò•ú§í”Ò*úùÐ~üñG4hóãF,m$ÐW›õߪ¡³¾çyzøù÷evÓs픣òìÇߊµÒ¯çTw?1ßžÕÂÂ6eâ|œ“\tïÞ݉ÔA.Ž¡óG)ƒ›¢uôêqöÉMÐ÷| îµc#)‡˜œmäÝ@Ä“´AÒÜù+]„Ã÷ijD&Œæ™Wol°Á.Š›ïÄ10 Øõ6áù™èÑÝJÍ“Kàfw)~À(M‹[®±ÄÁ¢‡ØŒo‰v±’9…–øü3­U$T:æKôíÕÍZuÑ3Î8Ã1L1{@yOÄäÿU²`v¯îÁÀ´nÓªLüï$¸ÿɰœ ÄÝ÷ @DÀxU–_í'}¸c-–ܬ~OŽë{º¼ÚÀ,Q'¯TŠÆ^éF‘å|VnˆZA˜éÄ „#¿ýädòLœ8É®¾$ Ü@ BÔUr–¬^ 4K«ÿ™ZeÕÄ1¾;L<˜€ •ºø‹qGÂì²:f?    £g×fºü´È¶Þ¤±·Àu´2ö&ˆBˆ'ÁtðˆÓ 2/@Vlƒ™Ux\ü€T÷mP¿ŽSq$çÁì ¾øá×b2´Èm±|ÜÁÍlÒôåFìÉÓ–»è‰0 ÉÀ |ÇÂì&¸ÐN8¼™uh«h|ÏÎwR€YÒùßtIk'Ø^žûìÜÄ®¾sŽv÷+2½"Ëï([zuÞ+óq:Äpüøñn•¾gøœ÷éí` žÔ[y‡ëûspÕÏ¿ÛCÏÏ·; é±— µÂB…]=¹¥cνz–B9ÆækyAì°U#ÅD/L¾¡Ò#ž¨cŒ Vö ÙðWá:®ž#FŒìT×Å`âJÂa=´e°öMÐ;ƒÙpþŸtÿ›ob%¨±´šNœ}†fHhŠ„0íÔ" ÖÃi§kªî^¤4¬u{Mv@Ü[õB§.ô½´psÓ­þ!þ¥L€S0‡”ÂÄÜ©´ 3ôÚ3þ<Ó‘x x«ª§««ÚŸÚÂSXå-ƒª:úˆú«Ã$#N?ÙPL”+ø ‹æºB ÐuHÁä-·ðmÍ–!†€5èž™0t‰8\‰e½(ÉÔÛ O‡xÀËû¼XbpçÇ_3ó܆ ¶ß®­{~=óýRí°ÈºäÚW¶Ñ~‹åNXl7_ÒÆš6N¸ˆ8>#»€ßÿXî¼—ž@IDAT< ¢è„þn³Í6ŽB0@PQÀ¸@ ¨¦OŸîDêe+é¨J¡ëoË{á’›fÛwÒýo±A©‰±ê?Yj€æÍëØÙWͲ|¹Þ][·]1 î’É6¡&Ý©w$ˆ“U¾cB“ †~3VÂñâõ€ëaæ–¯•ÿ-÷Jð»7,°Ä+/Yb†"Zw\nÐR2ñÿfúðÔð=ðçí·ßŽëÁ·Ê T¥XÜ jYÞÖêOõ3úÆ`ðð €³pR$¥„× ÿL›€Ðn¡bH½ €géq²“ ¨~¦Hq'ºï7Ó:ÕPN”‹ÖZ¥[բީV'SxÅ®ûÉ€¿8³d[Ç©Âï¸&W/ÉA\§M›^±áêùð¯JÜJ#°iJƒ•¾RZW©ƒRZàcde #€X}MØ ˆÕ`¤B½DëØû5µ½wÒ6Á2Xl¨ß×ß3×&KüÏÕmœ›!aQq4ÐêGþ>q™ì8{¢d _Húöíë\ y¤(F€ò d6ñÁóïIŽ—j$ÖYÛ‡ì'ËÿÑ–¸ãA Ê +à–ÐsrÚ{&=Éÿ^µcÉWªå7jªóÏ?ßí sÃ#”'ç¿`v­îÑv–¯ˆÀx’€R€hx /s8Ô3û£¯—éXP`ÓSË$i?™é¢ÊÕ`3up‡¨NV÷u/ÈÄÀ÷Í#wÿÛá! à¹úõµp)‘ç‚.•-t¨_GÒ0€ÒÔ)ÐÕjtûŸ¯Æ]—«ÎÏJ/+Ññ¾JM•Òö虉&ˆxš <•1œK{@wÞ»g}ð… þé÷å6ðì–v¦¬ê ®t.yÏŠP~:j‰“´{SYÜÏpÖøXå7ñl¤ ‡æië_˜…01e®|Ÿõ©2®‹Cž€Âø ý€‰Àºcl Ø¨)¦ˆÐ?òâ|ý}±u3ƒÄý𻿨»76Â#_ÿg©S{ºwSëÕ#×I6–íÃóƒXÂc`˜ ˜{a÷GVú0)Qs›ë G&’1àõà‡Ö­,±çîfGf%çŸm‰Þëë–ð‰¥À„17×üuòÂçü®`¼øüó^b`ònŠÉÿ+fm«AíRÝë$cìæò@ñ«Œÿ0šVñšOš?ú PÖµeËð T©$ž(«æ¤–JžQ·?IÓõ´Ùµ…XO=Ý;mo«©@6#Í1S&»ž; €[á£Ð%•ñÈ•à@ž9ð×æÏ›¯À'S«iÔnó‘~}VáJå~`Ø9R F˺>J©©Ž2ÂÀó"ˆ6ˆ—óóóc c¸neÎûÈc`wÅéGäÿÔ« ¬Ÿ s|sGs cðÍKm¶fõÿ¦‚ ’ú`…‚ ¹Ä-Áný¯byÏÜaSúÅ< xßH XE£ƒ‡x&[Ú‡ë6ÑæH;É‘¸ôˆ‚°¯¼»ÐÎ>¾…uÖ¶É‹Š$¾Vä…‹VºÝ yL¼„äý0vÂrÛwçÆiaÀPoàþcƒÛ ØÏËpŸ8ç:ì  ØF`àʳ²l_V!ôÉ U¼ªv«Þ|óÍtñþy¡Ä-AûßÛi°;W÷€;k6ËkVJðË ¿g1‡øÃ¸ÎÉP ­‘o¾ùæNäæADiOXýþH"8Kûu‚ Qòí³V»º )¼ÀžWúuÜr6u¡Žq\²7ȹbä¥wv+I<ê8šúé¨Å6ð¶9öœêUÌD2Ð/oÀþx-Ð÷7Uyܵp}ÄF©F1Î> Žxû¼"On»ì·/[v!;'¸ü=ÿüóq1S*Ž+ôÍÛ^ãÚ©ºÇÖY»S2‡À§Nüñ—Ìß1ºÆu&´;Ò9Máe’pÒ¢y‹ Œ´ÇÉee3L-eŽW÷«<k À« ÄmäW ‚—€øVüãˆ`êÔ)aBˆè‰=€C¤:=°€I.(!°:¨Z€Ukb•ÚØü¤ô¢Ò ¥ •2zÀœ§þÅ_tR¢ÚEFµ¹ZÀ"˜z#мY·íð¾Ze“<ŒspßÓóí<í>xæqÍIPño´!×»®•£zåŸv>0’$üî{öìéìAˆËÌÄí0>ì;]†‚qöx5`¸ÕÆ íèš:/€z¥Áƒðx~°TË36@†|‚GÁ[Kª6WzmˆŒœ¦.×y#¦dJ`N¢žÀØ‘ˆŽx À¤Ä1Ì}Þ«' •Ù¤¼Cš‹ÉKþ¦zºlU|òÉî{){†òFÅäÿ•³`v¬îvé –”ªÄ8)@)ñ‡ðà€æyÍ˼Â8Ù—ËôÈ<®eÔP3í\¹rŒWªzò t›-ªçVñwñ @œ € •*ù–ý„C€XÌŠ  L Dë‰?G®“pä,\(ÄüÇDßdu‡êfÃ×Ð ™¼Þ>Š„}Êì´'N!ܳÐ3ã1€¾:›À*˜´‡ìÔPFÀÒâ»NÖö^xJ çQ°xñJÙ ÛÒe%Ž1(qv‹Žø"ÿtö¨s>ÿüs·1Ì ßU㊧ºæ;A^\¾/W‰# æ%—\â\cª1gÏŠÉÿ«gõÓ«èÚµ‹6¤ ‚¿@'þ/%þ:pp©@„E… âTiqx:“—V \PΤïéÊØ-]©êÉŸT=·I?aÊ'[xâç¾Lò1¹ŽÏ×uщ¯`Ô ¿›y>QÞC’ôªïÈw´&Aþ¡BÝFé]¥Œ€çóý÷ßÛÁlûï¿¿Ó›gT±’…„]ÿÆOZf_È oï\GæŒ/¼¹ÀîÔê¿‹VþŽÈSøá\{Uj5£—:¯‚äÛB@‰píµ×Ú^{íUæ:—\Îÿ†à?Þî¹ç{ôÑG3 Cìëb8aÒrõ¯™a@<ýÚ1–+¡¿TqN½l¦ ÚÃ7¶•—C9:ÀË ”¢€Õü>ûìã6ÊÁè1¾Õ©ó‡}Xx„l¤T.;×(€sÇêüñÇwbò5aÀ½ñùÇêƒõëK)·Åà¿â¬–Æ&<_Êm¢wíù­\dÁ§´Ê&oÝur£º]vŠ^u†Ë_–™tÂ=WÿôÓOÎuKû( óÑSLÄ?€ ÊaOõkÇ­ m*r“<šÊUp§ 0·¿Ài—Ït ­[.mí˜6SÂPÆG]X˜Ïèø +Œá"‹töÞ¯¾úÊéVQ ®¥2Hu#2£®—U¬Ü ¦÷ÝwŸ[1FÔ\ ëû+âˆBÿ—ûiŒ;T÷8aXˆñ*¶fu¯äŒË%¾oËÅdZ‰€R€¿¾ºG\[kp’ÆÂ¼¬2Ô&€Áì¦Ô¥Ê£ªb^PÀw¡L $Œ!HìÈjß—êÿA„”[(Îó ø¦ªó8T7V7,½×?WzN  cûôéï¼óŽ‹(˜ŸŸïªL§v²XÕã1ÐIºö\EÙ#~Àï/²_';Ã@¶ þû³ls…êÅ¿œð¦¿=„Õ+â±cÇ«˜ˆjÌÒèÑ£]E(‰9dã¶H”ÃÉSW8×Çÿü\l§Ó\1êÙ{Ãç¹>j7ü½•Saœ£ý0t|ãƒ…ÎØq;¹Hz»ˆä{Áˆà® #€„CÁtö¸ÞŠUVAA«WÖnòx’—\½Ü>úh'AŠiá*当ÿß’Õ_%U+tÍïê' À 1 T±0¥ªÇ±–öl™˜d–W¨©²!¬eÑK²õj°–¶c¶·ºí0iV'@ªû1y‚» F |;` ™ƒÐ}òF€ óE2œP3 À0…TSwËÞ¤µK“é4«:Œç±#*Ï6  >%2$Šàeg´´ï)v¡x÷Öõ¼G@¦÷‡aÉÏÏw†‚ 6$£€9ÂxQ @HY}#QˆƒžkדÝB=ûüß‹Íp¥zTsÛiÛ†ö"²ÉÐÑû7µ Ona¹’°÷vWžƒ¤£‰½*›‚é3Wº-—ãîd•‘‘°zbQ y”Ûa‡V•fhŒîãá˜eøÇ?þaï¾k~ò›nyŒR´1D–ûT‹›ë¯¾‘ªòµ¯ ±²Õ( w„ø3‡Ü—¢iâŒ5_°˜«*Àl£~CUW ñÿëÙêGmcøÐŽÏÖàV·ìK6 A§û/=€BR1Ç,*² ãÿXÝaT¥ÞPUV•²P—ïyŠÒËJX½bÐF)#Àr„Fdm`§½Í´ÚßC ¥G?üÌΕp×í˵ tý–‡æ:=:û¤¢c¨æ®p«s˜ ¬ë{õêåtëøÜ“¢€yòc5KH^$!qöH%Ø æå@¹ÆŒ×öÛoïÆ±‡¦_ôwNŽÕÄ’À^$ˆUq~LþcVʼn[MO ì¦š+C:ÄYŠ—uéóh• ÖU¯§*›áµjrÜmf+“ErÖ |©’µ&«ÜPKµ°O•[©BØTÕ ÐßžUÛ´©I-³Å:ñ¿;/µpF€'ˆqÑb?n‚oª:Ãt³¡ÕyÃJÜ îìÍ míÒ¤Cz˜={¶=ûì³Î]ûJSÀ»^[qû Ô¨aJs·Æ²~/¹Ú‘·Ýæ lð‹löÜNDîvH0Ø †Ý÷¢ ì˜;$o€‹!jdûqnŠÉF}\"/¤05#6ø¶‡çFާÉ`#È}yp[í5°i߯Šl=¼Ýæé3aû d{÷îí6O uMž3Ž<òHÒ8æ>w)CÔÿAùè¯SRµBÁÚùV_›I­«äΊ ß‹¥âXƒ`ÑIJi¹$|eÍä˜-€Z"¸_Ãú0›/ FEíyR×Tª¾%ADG¢VNÅS^vœ©ãFË)L[8X÷N–&üDÖT®ÆUQÊÎ×Þ‹,á¿TÂk­(uSÊØr˜tÍ5×8pŒçªÂÛûû­oª¶øÅÕî_2ÌûcÊ ç“Ïjû®'æ9é@ï¹vÚÿå9Õíˆ#Žp†‚l–D”@æ?¸’ÄM’Øü»ì²‹õïßF ¹¶ çŸçÄüûž0ÅæÎ_i=d<È‰Ä (ýûmü2¦‘,*±zÇÇ$߃~Á`ãSÈ6Ì10My×Çäÿ/«:Ÿ€ŸÖ E·Rð¥C–îwéêQ òàSÜláp×XÍÿy?Û]¨û¦J=³=ØLÛCU€Ò8e6ZY9Ý¿lœ$@„¨×ÿ»sýFW:î÷q™v;›å†©±¡Ùlp µÅWÿ£ÒãJÈÍ™7S""Óa(ˆëZ·nÝ*º ©¡5 ØÜxß»A‰¨‚£¾-¶b…>JFxûíÚÄŽ;ºìrÙäÚHYâTXa áŠ0G½}«üêS1”å:ö0 øÞX¦'ÎM‰ÅnÛ7v¾ÿ„ >óØæŽÐ³Câòxû£"ûþ×bcÏÓŽÉSP¡&ºw @¸¹Âo=|džÇõ!\6ç~˜§˜-š™Oç)eÍÈ*ý®%môW?HÕ ë¬³¶û.@gèmtd¢‘B°|E`­@@ØbÕ ø ýV¡6Jà«J5ª Ùàiǃ“h²ºùʼ xUøU—ø¾'Æ‚ÿƒŒžÇ JÏ(]©t¬RFs1ô1ÇcwÜq‡KýúõSÕ5 ‹¤÷‡À³êï¿eJÃ:òäˆ%¿äæÙ6{Þ {B¶èæ‡}±ØN½|† Òƒ+òýj±ú\ìÜÓÚ-Åáén±Fóaxk +ï¥êÕIÄt¨–eÕN@BàâR¬ ÁçG—bïóÌ‚òåǪ>ÇpÛUm« õ_ªBÝȪ5ÃÕEv§BF+ýڪ•júx£©l¸">r{h"cÈòuÆ¥â¨Ì°ŽvsÓJĶ–¿ý6¶šF]á6£õ‹ <V˜¢ŽÃDþ¤„Û`s¥Œ`̘1Îm¢ÊþUÙ"ê† µÞ=êÛA{4Q0ž{ì¥BGô·ÒÕþ¾Øn–×.ìBxïSóœ¨sÀáyÖP:øNÚÆ÷­ÙÛÿ,rAyü¦EÌWŒêHl9Lp W*‰×È#~‘øÔ^DðKDì#iÄ»7Ñ&AËí¡çç»È»oßPóº|Qˆ}rÿ1Ä=î¸ãÜX“óB¿1ú»;ôû§ŸÀ~ú¹YÅKkþW·nëXN½çèâÈfæÖ¥ˆPÀÎ8V]Ë m\•ž‚à æ·wUÚÏ îd•A5•u(ÿr³Þt•İFÀsÙº¹kq•8W÷ÎÕq±þ¿‚ó ?d)& † c=z õ/“Û²’{A‰B—+-PÊx_]t‘á)ðÒK/¹`BU¬d¡¦ëØYZU¿þpEãkäŒü–h+aÅñ¤?¸ß}þõ;P„·¹ÄþØR!Ì™«ÀCŠÎ‡®>ºvíj§všzê©Î¾!J@=æ¶&b‰Á ‘Ô¢ E^»ôô–öÂ=ííØý´3¢yˆ"þzœ¥3ß—¬Þã AƒœŠ$殸W]“ÿ¿¬JØÖdóa±@ ð1˜‘U?+û qB^ê”Í^Ôx[w¬©Ôf åvJk¯©ÁGµ›M €sÄP«¾º^ Içˆaù³üúËoQÝ\“× ¼3hMÞ Û†š¡xV©R/¥rª¥Q@xZ¼† æ˜ÂC§ZMGÕÏôz3éþ·’»âô6-s\ÈÝ_Æ»…î{z¾m¹Q;ïÄÎe‰ÀuwÏÕÜWsF g7€ô'ÿ*²—ß^`S€­‰ssë8)†‚ì€Û s1Š©d\¬tP… ÁE’zQÐZÁŽÖΧR­"ŽøÓF8†p^øz6Î1ÞÂÖ±EFÇ×*½‘ÿ¿ËÁ8\‡>Õý0zôìæp!« °b0 Ð~¥Ãà•yIôÏlD­a øë %•uÈfý®™7Xcî8©¹Ê(n3þz`©ªA—">×v˜›%ËåéÿK1d²Îüñ­vÉòX¶«ÝD­«8Q=ú?¥í•™w†]üôÓOÛÝÉ'ŸœÎ…,ã‹uS˜Þû¯k£X+í3ùß²÷ÖËZ[³¦Á§úÑçEòXbÇj³¡öÚ˜øZ¿/Vd¾OµUñËï,´#ΜfSgøUFÿþýíâ‹/¶]wÝ5#û¶Y¾õÖ[í‰'žˆÝ¦˜{C¼W‡€‡ë%3´›-xä‘GÒùüãEro¶î÷n§Flœª*@ŠIº¹Â%'yæÉøZWÜ«H¾¾º¿kð½âáû¬NÔf ï´‡R'¥j/yVàƒ@@Ø{@ØSIê¢ÿ×êŸ 8'ØÅÏ?Åú,Wµ{Qõ'(è_`ø¨~UB§™§”üûßÿ¶ûï¿ßùÑwïÞ=+6"É7†0v”ŽŸÛÁ{6µ]û5rÆ”Ãuðª;æÈx0'”Zߣÿ_r|þîör!ll¯ˆ ºàNÛ”óqaû$¬ŒA†©$é*ûB)ó;Î> y þ7x3É×|ž?5²ó÷»ï¾snŒ30ü;M黈üÿ].ÇëtòŸÕsÖsÝŽ–³ê\¥ÿ/sô«“ô)ˆ-‘p®²ìGQUà{ÁŽ«l˜¸¬þçWu Qõk»€~_Õù5u=a”ݲ2œ$38ÀA!IA0e™¶.ñ'@Sþ/aRkŒ?+§e#þKðapP\«)V^@Ÿ~þùç»zЛLj–+Ô«ìüë $ÍQ/àw…è=QÆ€¸ ØüëßK ×·?Zèô°±Ð’¥H¶WìN8á;óÌ3­  ÀÅXµTpÂOå×_ÝÙ°ë` ^ª±êõdžü;š6¯ÚVe®ÐÏ«¯¾Ú‹ÅÔ#°Êà˜üÿe•?Á ,”â^Š 5aü?ºàaN8÷¿Cx–ò)Rù°ÒŸùúéKf½8ꬷjðÏÀ|¬þf=Rè¤<-³4õ§IG?)Òiœ‰ÌPŽ¥Àµ`Ɔ²˜Á¾€o 0_3PuÑGÍô»²w]  •`^R’f=3`}ðÁÛ^{íe¨â í2k1¾îH؆xky _ÿg‰ré ­ö—9UÁýÏÚWÌÔ~¹vºBözX¦ûÞ>Ûnz`®ô¨ [6à9÷Üsu<ºþ8Â#@ü€‡~Ø©PdÉÄ>\ÇOýðµlžðÁΰ1¦ÍyÊ»L)ôÅÅ”þ_Và‚£9â^ú¢.-<ɸ|äS%x­ÉeüïÊà÷zõpðà¦5 5¶Ä¬ä¨¾Wù“”Bë¡J¶P‰âˆ²åèÅG CÜY@¦$Ô)]1Tžßð§Ö¤®v5GëJ<²?{QˆÁ§>QÂÐi-¥Œ`üøñNWÎ<¸ ÆÎeÔ`D!$Û(öþ.òð!…_{w¡ÛÉïEYäï­Øüm´¯À0Åxü–vÖEÛüsPèÌ+gÚ¿Ûq7³.sĬT/WÛSçççÛÆoìlùû½Ô“»áç-û tˆ#F‘•q•õÓXÓ¿‚Z€ßÙvmƒ9ƒi‰ë=JU5Wİ«tùLÕn[¥*Yˆ  ÌýϹúmK]5™=Q§yæRà˜pûdCà‰¶Yp¿îõüš¾_-1+9°Ñ*_%ëT©¸ŸTÙ:Ò™ ­ [œ;&µôà¹Üàby×s Wý€y÷#ŒÐ ·P"˜ÐÔÊ<lÖ_}\Ÿa÷~+Ó@ea› m½ICî„=/Õ‘Ëpîü@A¡cΛ.5E‰3,ì½n®ÝôàÛãØ)vÐ)Sí=b¶lÙÒ<ð@ûûßÿî ³:Šê?Œy#FŒ°ڻロ±Äz7õu_À_ ~eç/®›iâýÓØYòù¨vœàÉ`=Ïßmr,MîZè·¿NAAY¹ÐõÕ¹–ùcÊJI/™ÌJcqÔu‰ëPLÞÇÊ;Y©qL™¬dá:B¬ôl†%õ’$÷(7þcâ{ ÀX ö·ÎÊÐ2m„ ÈŽhÿæ€á|L y#¥zJi‰è×AŒæòóóÝÊ:mÅÕ,ÐA^êÙ/Ú“¯ºy6Ö¦<ì'ÀÞg\1ËÖë–ë‚ QöŠÛæh·Á"Ûe»F.¦À#/Ì·>ëåZçq*Ưl°õìÙÓm)Ì.‚ÌÃT#ÀxøáÃ6€º|3évÔ΀,š£PzSŒ‘·lÑ2íÆW™ôÓãðj”°™IߪZ&Vµ•ê©¿T·9L F`ƒç«z£òvX9©µ€1-åLáPË.•ø: YÔ5©ÃÁÕ@Gþ¿½3—¢8×p8›²Š D½¹æ&Hb *j7&rq!FM¼‚[ŒŠ&׫I¸£&*FŒÁ%`bD‰O1F QÁ-¸¢×Š€Ëá~_UWOÏœ™9=[Ï™s¾þéîªêêžwþóWuu-U¼$_ ° `Eà èhhöÒQYºt©9ꨣ̨Q£ÌÏ~ö3ûTÍ… Ê-,@¿ñõÍñj þ§˜5°Õì¹k³ù󃚫oZegüÑ }ì(†q–ÁÓÇma×@Ùm^Xø¦]~xïÝR¯wÙ?€-; ò2þ|»¾+¹îŸþûï¿o&Ožl+lzßi§ò~UÞw¥äšk®É;‘®Ë‚Z¥®ß‰ó-¿·Ëú>ë/QÀ3-?è/Cu›8# u®.C¦®«ÝÕçà[$fŸ±šÃÚ!>—à.¶„²™¶bR©€Ì>©<ñsh ž¶Âa€Øgàõ%Ë*6]€\‡áÊ<ñ])Š/’ï€>ÝÊ÷ ±Š°×^{-ìÀÞ÷ìÐÞ2ò.XêÌŽƒð>­¿ÆÄASîXmÎ:¹ùþw·°«õÑ7ž{åJ<õw7Ÿµ• {#n»k­‚.õË„¿>ö‘iÀjƒ¶înš› ïyذavõ@>YsD@®û§­ò;;Dò|¡ý þÒYNxòÉ'íÃY¢|[¶N‚.öÚÆ&ðS¤Lt$W­4ø3®Oþ|·ßvU@®˜^ðÃùj«W¯^±¿`®„l`%8ŽFÚJ;MDj¥@Æÿâ€Î¸¢âŸÂKÝò&míÔUVÃ{vùºJ-?íŽÜžOÈ×UÄkûUøŽ…^ò¯8á+ÐS Ë¡é?rÉ 7Ü` Ò«¯¾:Ÿ+m)á,è‡ìÜh~u~?säè^áÂÅËÖ›W¯GXÏpNýȬ^³Ñ쎅Kߨ`îž½-ëÌ´˜«Ðz°#(}ûö5£G6çœsŽÙgŸ}ìhkÏYn”• Þ9ï¼óìY’U$ˆÓs²£v„¹GÛI£èìwD þ’lâÇMYż †¾•÷ì¢\Úà;8?ëÒ—²dWéÍx\àJ_$š-VÐxiÒ WLJ1–Ìsy“)ÛM¯½y­ÿ6‘?pÛú 4§_!ëQ­µ eýäûã¡ìpt-4–p zv²;à€ÌôéÓ+2©[8s G D¥OõxHBë’ ýç¿×™ßüaµÙõ MvH¡}m0e;sû5Ìy?ìkn¿gY€Q^X°8ÐŒ7ή‘Àå‡ÙK˜žÃ Ëñô•ë™á3gÎ4sæÌÉ ŽÓ_ü< ý‚$îê»×»‚Þ:Hç£.’~–ÞÓú[̇mT2ýp©ÇÑ*<ñ 8ezá§•vF-Vø[ ‡Bc;`žW¬!ÅM#]¦aòkŒ®Zàj4Z†û8kÜè}V€ÄÿØÉ¤†dîõlèpèL(û§Äγä‘GÚ>=ô]ˆ'Ö‰%$„!ì+À×ç\±s´ 93lÖ×¶°u€áO=ÿ©y } 6¢cçÈö`á?a»ЛX³Í@Û:t¨ÕÌ<*qÜÒÒbï'OÞñKèâÁ÷²–ˆëùa÷ƒ‚?§÷ô>ÕyÒü_¦ƒÅÎÁýœZ{ªÕ Y͇~ʧ²²‹5&[9¶´XØ©UÞ(ó´Bã v‚ƺ¸à“ÓWAÿc¯Âw,Ç%9?Ř@ÿ- šXrÿý÷›#F˜³Î:Ë,X°À¾ßŒub‰Ø2Ù·ÂÔÂ=Ͳ·6˜/i´Ãÿ…a‚/¿ºÎ4c(!Mò´óÞ5O?É…¾·…† ‡¢âM–aÍÍÍføðáöµÀرcíÄBà…¹%àÃ+µ½í¶Ûòùçe9ªã·•º~É7qŸÀ §s‡ôŸô‹Ág†_¦ñ†…¿ÝGÊÀ`Ëã¿+ú ³;¸¢WÈ“yâ?jž{)&ŠÍzB¿ -Ûwáäýû÷/Ë0@¾›| «vƒ¦AÓ)²#·œéû¶ãÚgý\€Ã¯ÇŽU--|àLTø×vq¢W¬í‹½†ÛŸ }ú%({Åê(øôÓO›iÓ¦a¥¿&Ûq޶W‰‚³S ³©ÿ‘=̨}ݤA—Mzß<ðèÇæ„£zÛu8¥ðþ{onÎß÷€o ü¨Ý÷aö¬pM„=öØÃö¼g§GÚìÈ‘#Í^{íå“Ut»hÑ"sÈ!|#˜Sرê è 9S("‰HT6ç‚ý±"å–[mi+Ç­ìÈ5°måP@T8²ðvÄðT6oáÏ-T=zôˆs©¼i8лï¾[‰N€œRs?h¢3 E¿l-·øï1;_ƒ–½çd9jÌsÿõWwË©ÚiXÁEÊ\»’køUF²rÆ*¼Ê}ÑÏ#'8{×0诠+¡±dÍš5æì³Ï6t­ pX]¥¤;úpB!æÇ}§·Y¼l™xÕ ;€ë ükÉú°ð÷÷À´¾ðg…À+ãYYaeù˜cŽ1çž{®b˜«&!ü;úÅ/~ÑÞ¥f!URÄ}BCëtŠîÉßoýOý8p~švIãDe âH]œOSܶ4l9Ï~1û@cû‰œ9•Ñ*üúOA sJo4¥æ“:?å5i£ibÉr7Ô a•ú$þǞƤ¶ÞÁíŸ Ýzôch,Y¸p¡9öØc­²‡URöÝs3sýEýÍ«K6`•Á•huª3ß¾zš/ø£÷áâ¶Ì+¶œvÚieYƒ=z½\ûìôwë­·æŠfø»ÐK ±_Íð$IV‰—á+ëƒbFg zÜ¢ÛF uƒ! wq>]ÖoS@`ùËó4.χVÚgU/Y:¼ˆo²ôhYAÊa@Öxľ˜÷åò Û¦ ‹ÿà ®P•>ª„¿@Ñ; pæÐoA/„rXo÷Þ{¯™5k–ílwÜqÇ™]vÙ%çD<ȳhaA>|·fóû/mcZÞÛ`6kì†Â;¿Ÿ÷…?·ÎѦZx#¹f,ú&sœ¸víZ»*cŽhó‰#6ÔôO5(ìÿ”æYøßÃûfïKiŒ>Îf;òé:Ð×çPÔïASfªxsùÿÚ«xcE^šL£ ?€–Ô9ÐV©[~¾ðÞ’N3*öQ$°µàÈqB»¸aI™܇|ö…þÊw~ö'Ç6¯Ðî®»î:³ÿþû›+®¸Â,Y²&ëÔ¼ùf‹ÄûÙfëzÓ»w|wàoÅW²å[É0N·üì³ìÛ—S"æúœ±Š(”@â>ÁU&SŽÑZ? ¯­O¦{El ©Ýli‹ +V–ôv:ôhh‡(üyñÿ♺v„5ŽÕ~¨˜[ö޶­¡o<83ðü©<ì½9«Æ®Ýq·ëw±­D‡°LÿcqOµœ„ÑX±ÙïJhì÷~|ðNx̘1fêÔ©vÚ]œ_ÉW˜Ó©F…i3Ó§o4eù÷—-[fN=õÔ|s’ŽùçëIy$î¬}Ñî"5CçŸK=¶É#Þ–q%*ñ1d>Îý"tR yTäÔÎZ ¬— # ‡AÙ;» )ñO» qÚ3ÄT”»5ÍÆ£UjUR7©½r þz t4öKþ_|ÑNÄÃ>BÈžÉII{¾ÏÙv2wÿ®¼ØNÿˆ9¸›»“¹#]¥R¬ßDæÞ?Ú½Ðr‡‘ÑÂßöÎÙ2Š J—òùW? º;”-RN:sÀÃfŸ€m¡ÇC—úÀ|[?Ä„?|¡êÏnù€bí1’§ ³1ŒôGÎh½ÑU©Àß•¶•!ÀÀG:[6Æö8øàƒÍ™gži›À³MÄ+£ù'ýLÊcÆ4>ßp‰ØI9lòòË/Ï—žC(.‚Æ®\åËLqÕ#à|ý! ÍÙš{\r÷ýf¼KdÏÀ~¡¾;WzïË ÁN§¿î½ Ê[êÒ*ü-ØÙz ”³·åüQ¸˜ô\‘/ù¶‘°b¢e>6ÀûöìTªnu]é'jƒ®3ð=à,èAÐ Pöˆ%´Ío¼Ñ®6xå•W®>Xiñ…zàc³^Žq•”÷Þ{Ï\tËö¼ò{ÄÎË›B‘5A sJ¤ùGðX¸sßkzï¿`*mz|!áü{s ù\snù7=:z2´ê½üqy¥+–.·ƒÈèöÐs OAaF)Y¿~½Ø¤#É•Öçj/à­Õ†ÛÈå¹9송Y’NM`-¾û¬ìåÓBìYŸ8.éaÿ€)S¦´7².MüS¾¯ øcæê Wڕڞ͵®½öZ;:¢ml²{WC#AaœvŠ'P'ćïý6í§ üiÊ÷2)Î0J*®ø €/òàc üÿ ½¡'B߀քtÅ €ÿa–c‡…ö„„rì6›mVqö>.ÞRãa¶)‹FéÌ3Ì×J…Ù}§„é»ù\RÁÚëœè4ø¾ýVþý’ÿ…^0'žx¢í#ð—¿ü¥½÷ãȺ¼-ô¿[Þ ·Ù³g›«®bý(§ðé‹…ÿ¿s¦PD±¢n©Ø< >¯fJu‘…ºÛõöe}³÷ž ¤õxÑð؇¹eYÀ2!CÞÄñ…ÐÏAw€ÒöøÎ¿¦¤+W¢?Ô[8ø%ôdè–¨ñ½™å¦/hßwfqFœú[¢zÃv6ëâR)8®º*?Qô ú®J\2ö8Ê>õàÜ\º—ýžy晬 õ”|wY2 S¢-.¤<Ÿ¯¿þº]ì‡cÿóÈ㈛š'^Q¥HÜ'„¾Ï^™N­ßäºÂßURa¥}ÝÔÙ, ÐÅ~:×Bù„ßÊ‡Æ  ¯@kVªRºtpZ›ð¾g!{³Ù±µHû}a©î ÔZtC`Ü6Øíû4IM¬¹îfÞ`F´+L€Î†óp¡3 ± ;Nž<Ù|ó›ß4—\r‰Y¼x1N¯¬Tªàç]ó½ÿĉÍ[o±ŽžSV#f"ôƒœ)Q*Ä}×D¡'â…C îÂùGFz¿ê*6Œ¾•?|)ÆcùwÃäëÖ&S6_w鈵2 ã°J€ØÍÏî;è³BX°Ý=z4v§".^rá…šÃ?ÜÜrË-¶ Åù5%¬Ì\ýõ†«ýµ#ìCñ÷vÒ(º4‰ª ïsîŸÜ |£÷«|޲Å?·xdÃíÃUi…~Ôç‚ÈÝ<\¾Žy¶*Ù—çÐÜø!›£ÆPì>Gi)c²3b²S{;A<÷«4àR{úè(Ø?à\è(衱+hÏ=÷œ9þøãÍøñãŸ?÷Y´°ç5‡<ÆXìç9\ä (‡^I*G€}¦•îõhð¥~º‡ {ë?Ó|«ó³þ¼b}¶?eÀ‡ÜHÞi'SÆ‹©惫V­ZÁYØèˆJ߀Æê‹zX(‘Ò?j£Y vãaÃÔIìðݳ¤ã`aw,ô;P>ñÆ.ôfΜi—Í=ýôÓÍüùóãkÂ%ª#óæÍ³ïýïÍylŠ= {äDΜÑD‡VÒçqii+pŠÞEú‚™áÖWº@äA áAzwrñŸ¼ˬι¹óæ›o¶Ã/½ôRÃÎuQØñ°Ã3o¿Í‰s ûIp-àD ¦œwÓù#–$ùÖÏhaqŒôÅ,éýó~jß…Ó‰ë¯ýy|úÇŒ›( ZïÇwÿ4ÉïŸÔµTÈMúÔüVsmvoÅn£-¡Á×ež¡Dw#á a’„v^Kè:ºLñÖàÔßBG@95^ì§à7ß|Óœþù¶åüìhׄ­m\™ó¬XÑî×¹÷<©#Üw¹‡D_ 6Ðç±'\~„;)Ú6mü2{¿Ú&Ž•†˜ŠV`e?¾v딢 @îŸõ‘Õ«W¿Ä& R‡Ú&|[ ÓZyÁ”º£ ظD<²ÒÔÔäw“Úþ)© é:%`kÍ9Ðo@§Ac÷à“öI'dŽ>úhÃùJµs\»haáÿÀ˜N8Á¼ñ»<ä•W;šw\`ÞY(D}BsšÏ³E½õŠ©Â·OŸšQ˜»c~µT% Ð/Êôü[ ïGð2ç0¬3Š*ùÕkakV®\»Ö˜2ÐT!ŸÞàì6í²¶R@“Í.M͉V8Þ*ñ¿Ù¿¹Bc é°“Ò ÐC¡ìËœ•Ú+ ÞC=ÔL˜0ÁÎsÚÓT&%îñ5Û´iÓÌGgZcþGCµÒ_‰Ü žþÙÊv]ôªm_€ü¿èÝh}‰MA\}-Žád¦ ³·vìL¶­oF¸6~Ÿ5\Hccc˜M;·&p ]¢2Ø?à¯ÐC 'CYXÆ>ñðuÀÈ‘#m<‡ß=ÿüó=Ày Ø1qܸq†ï\Û‘ÄßN:EW†À­•ɶm®Môy#ôÑÑC»þ•]m}h¦Onž>¾ŸOÿwùËwÆm}güReüNa,—â}äÔ=zô4hPÁYÓØ\ @`œ0Po׌K‰·ÜTˆßKøÀþºÚÖ,Nˆst6ôûÐS ý í ûÜwß}Vi·Ûo¿½;v¬ùêW¿j† f P– )ßñ?øàƒvqŸ… ¶{_Hð>”Oþ\»CR‰±z¼[´®’>4P~‡cþ |)÷ùß‹÷Çq¶\c-«p.ûÖ°³i§´”ä'ð æ‚þ áÏC»577çOËž×kÖ®±-õ×Ê¡-œßŸ[öî·ÇØrß)âÃ}7ß}—?:Ùã+~] )l¶åë€û ½¡;C ªôó=èã?nî¼óNsÓM7™ X[æ)ü[ £Ž;J…¯–-[f_9œrÊ)fÒ¤I†Î6†p+2ü’êà1½©ø;Éí¶ÛÆôíÛ×l€ÍlÜݸS[s›©­¦a›0Ëýnœ–R‡…„¶Új+k£6 æŸü1‰ÖFè½8å’˜§Õl²‚œAÍ~ËÒoü| IŽ ÀŽtz…<‘³j—ôe •jk§ö#í®\HÛp&jLë“vZ¹&•;CåWuœÈbôDèï çA¿-HhÇl¢gE€ÊŠ+[†jFŒa† bnÏž=­ÓÝl³Íì‚Z¾9•OùÛ?cÆ Û¹ª€‹³†À¾ tÈÙÿ@ ÈLIK&p=røiɹ´“õyá¯î¤Îb æÓ¿1­ÝäÊÿ0]!-|Xã šðõËÁÄ0“N¼£ @¼÷U,tš…~‰'ž>ŒýÔã³÷öjmÖúm›@Dš’éÀ+Nñ·¤m§#ÀqÌìð$”9ràsТ„½ö9??•)|e@mhpÃV9•/0Ó)‹pÞQP.$énÆmüšQÔ–÷æÂWA¶whCxlÃð‘jöç^¹2Ž‚ÈÖäù rÞ ¼û¾þ2$ýgžä&Jãÿ”·¡)þnèÇl¶ôÖÞéLG§h«©Ö(­ÅÚóÓòpÁUFdÞ½>‘zÿ°—¶÷}_óøZ€-ûC/–mÚ3)—O¥²¹¶„ŸµŠPþ€Ð„K§Vú~º£…)(ÂÛ\ÊùMƺ§úVûþÕî·9%oó£OGáÿ ”óKp~.!ªÄÿ™iq?D-ñ1É: Ç+3•q¬8sE´ÑÈ5Ÿ‰ vm¢mp9CØÑåÒrf¨¼:<÷<úu(:;n„V[Öâx_c íNPí›í¢×§¯(ºY'³6>/pšÎ_"‡Ðm²èÇ¡õÃÜÚ„9¿œé£]º”Ïæ1;¤¢uw|ûã8ûô wl:¿¨PØoü! æxtdzF³>³+«h €³c÷éÓ‡aرûéÑ®Á'®ÌöBd»¸2Y+×L€Nü%èx(_åk XÝò‘®œÂJèÃPVH.‚ò•…¤cx·õó¤n-åS{¼6lK}VP'±¿ä’­Ðg+ôáôåðéÏ"l<’sì—‘DÚ–;Íå0”qË—/¿Û]ÑÌÙÔ¯_¿œ}hhì0+÷¬Õ¶O…çR|ÏÖöÏ(*Å 8KOÿE¡ë4'±"À‰uþhlÿ º;t4ô+Ðm •ù\(;—ý ª‚j@ÎÇ=Ž…ÒNÊ.ô™V"¾2p‡‘`Dºÿa €‰<ÒÒzšyƒ,üùäWºë0óä H÷?HózfºÎ~¬ @q¿ðk0 o£p Nß ½G{°mˆ ;BqR ôph°éFp =œGq‡Yµ=³gñ|º{IDATÝ:[v²r—o7¹tâ{r²êdè`èÐoAù„Þº94ânqT˜pÈéèo ƒªà„¾.ú6ôhc¹ïÛù¼¨[Jí»Š€?ÆÖôܸç>0±Õ•}P²UØ?…Oþ¡òžüŸDšãpÿKËýj!?UŠÿ•Øp èòþýûýÖ›o¾y·Þ½{‡ÃYËD˜Y´hÑŒKkhJBãŒf¤aê uäUƒV£¹—_KR;è©Ó¡MÐ~Ð=¡B?ÝÚÚ Úê-º.Øg +K ,08žôM¨O‹]Ix ÷Ë×F3¡ü­Ë&áj€Ì1—… œQVƒÂŸuh=àÌ–ŠÊJ€oM`Á¿f“eæøoyçwØáïÇPöé’¢ @i?;;,MÀØÑÙhNš8xðàÏ¢ÐïƒC%´Î°2£[ýéºO>Bºmh¨“µG9?\bí‡UåL[\Ä‘8mvq§ê¬.L€Oêìœ7#P¢àà–Ðí |}ÀJ[ø”¸ ú”Í«CYt³ðUÆAWίT߯h‚stÿCwj­¬Ïä¼+u,ôW¡eÏNõ½PØ»ÖÊ]L_~ þ1¯9kÃßÁSÿPL’Ò5Lö,eíø§n7÷“O>VYƒ ¸V€ˆAg¹p™+tÊc | “ˆ@9¬C&oZŽü”Gmà(>äÜ -åµPø­ÑIMøAˆß† Òvÿi[ _Å.úè£÷|â‰'.Æôí¡% ¾ø#Ìjù2Nc+ÖPVF»¼¨P>à“ѨxµÔ„ÊÀ@쯆Ú´ú÷°_ËŠ–y˜dâss5W»“ñ‘ÅÒQf¡Í¦ÕRåßÈàhèS¥f¤óE@D Bànìï ý#”-A%ICC}ë§Ÿn *)§¾6µ¹3ܽVe8µWϯ566BË+_/€W´ŸÁv ([ Ö@%e©­EòÓ®#ÀÊ ÛpùÌgŸ}ö½­ûm½'j£¥Ì9®ôhÑâ{ÓR mføk(ß×–’N—ˆ€ˆ@V!tgèmYcãþïñ_Ì—<ÝCº”Ûn»Í¼Ï~vç=–.]ÊÂÞËrì°¯‚ O$²U £Ò»¨|°dñ’¯õê¹ùuì¨âÅsºIGê6mºiO‡r¬t!Âô·B‡@Oƒ²©V"" •"ÀΞ㡻AÙPhŸ¶vž®|ÇyõI?¹úZí²Ë®]¶lù>sçÎeILåhVŽy)%óV¬X9{ðŽƒîÇ`•/"l [«b•Àpß­¸©[]÷ ¦ßy7—veÇ«¿A÷†²v.YˆG 7@òµDØ}‰ˆ€Tšû„ܽÚíM=ùà C–àx,ô±—_zyáÐ/é‰N|{s(õºõë۬ثW/3hûÏ<¹Óì8ö‘¿?6%#/Æ PÖ¡1®§$v¾ûðÖ ­cëG464ôF­·FÿzCcãÜúƆ»î¹ëž…§ðð?¡ûC9ìŠÂ'û· lÞ*ŽH`ÜÔ0è¶Ð&(û¡±Õ€¯ž…¦ÉGþe³©î[Dÿ©­\ö·uÓjôòx³¦¦Ó§Ïx"툀ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@§'ðÿ M™´PzIEND®B`‚ic05µARGBÌ2'–x¿ø€ÿþÒ„' ÷†ÿþ #Ý‚ÿûóúþÿá9‹ ìÿÿÔw4/tÐÿÿó-‰ ÓÿçX+ÄþÏb=€PßÿÔˆRÿÀ ‚û€ÿ þ®Z¿ÿPˆ¬½ ;ׄÿìž_ ¾£‡b« –ˆÿê®,±X„ ƒîLã‹ÿåyé|‚Vÿÿ‘ÿZ'ÿÿV‚è´ÛÿË »é“· NóŽÿ§Àƒiš ‘Ó×§Œÿýòã‘ ¢c€fr¢€ÿf‹ÿ¢pf€f‚ÿtô‘ÿf€ ‚ÿÈŒÿä‚ÿš€áÿôAf‚ÿÝ€‘ÿ:eƒÿ€ƒÿô‰ÿ£eƒÿ€û‚ÿˆÚ‡ÿõf‚ÿü€Á‚ÿf tô…ÿx€f‚ÿÁ€S‚ÿfžƒÿÚ €f‚ÿ_U×€ÿf/ÂÿMf€ÿágƒS€ÿ-ƒVÆöƒ‚-€ÿS…X<Ž=YÿÌ(W.– †whYD4'!‘3<>‡ƒƒ€€„ÿ€‹€€4J^m‚€€‰€€K__[a@‚†€ˆ_€ :Z_XM_YcL^ć¡£$J\_BJN9T]]XNk…€Ü¢…±º†?\?IQ_R:PG?Y_^KZc“ª˜ƒ‘ŸŸ'Q_X@GSN_^J„i~9‚_m1¥ñ÷ÜÎåÛ¼áèÿÁ‚2l_„U\-€ T¿ù÷ÐÝôÝûóS‚)ZU„KQ1‚oÑúíÏõÿ­ƒ*PK„GF6„‘äþüÞ„-EE„=:4†¦®R„)8=…"4+ÿic10ò‰PNG  IHDR+ƒ”iCCPICC Profile(‘}»KÃPÆ¿¦jU*":ˆ8¬ÒJ©‹£m…R¨Pj«&iú€6 IŠ Ž‚‹CÁÁÇâkpqÖµƒ« (Š Nþ¾)ñÜ&ÒªèËùñÝsÎ=÷¸MAU -~ ¨Z"âçRó¼ë m@z0*HºŒÇc øÊßãý–¯}lÖïû£+-ëàà‰'%U3ˆ—ˆ‡– •ñ:qŸFKï0ÎZ|ÊX´¸Z¯I&ÂÄ7ļ”ÒįÄ^)§ŽÍ÷¤‹iÒ¹)‹Æ9ÆbSo¶‰‹…²dïÉ~è–•ÙVOgD18xˆ(# ø(+¤èHÐ}ÈW Ö.©«Z>›3ø 9$óQEóò€|g~ÿô±¡•€‰7ÀYihâ6p¾ôß74Ï>ÐM^]¨‚&Ô%'.“žOÈæÐ{t.è™ñ€õ#wh}4Í—aÀµÔ*¦ùqhšµ#j~ªŠå= Çw@r ˆ]»{ÀH–Þ\üãöºG¶ÿÖØ>~ywÙPvä4@IDATxìœWyöçÞí»ZiÕe5K²dË2¶lË[¶U\è ‚Á¡…ÈÇnc›PZHH ô„$00Å`Jh‰Á˶š­.­¶·ïyF÷¬GWw«îÝ{÷ÿþôhú™sþ³wfÞ÷”‰" € @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€òdò–Y„ @ ² T©x ¥i¶T'Í’¤f©11_«ù&ÉÓi’ß¼ÏXßúuÌa)X¯f:r ‡4퓼î`n]{n~¯¦»$O­°]³ @c%0ÖøXÓg@€JGÀŽù‰Òéiž47';õvÖ-;ñvìë¥ºÆÆÆLMM544dªªª2uuuñruuu¦¾¾>#‹¼ÎÛ´.ž÷:ÛÀÀ@ÔßoŸþ1Óº°ämÝÝÝÞop·%éíí¼ß@___þt §§'’ºººâyO„ä@A—Ô)9PÐ&µJöK;¤‡¤-ÒýR·„A€¦<SþO€ BvìWJ«¥sš¯©üiº$?¾±núôéÙiÓ¦eššš²vìÃÔŽ½—=µ#/§> Ž}ðË=MÌÇÎzÞ:æ1ǽжÄñƒi%ý0ŸÜÏiJ+¹¯¶æ'ìï @$q ÀÛ;;;åõZV²ý„@[¸5[<*9P`= m•0@€@Å P±—–‚A€@Š ¬PÞΖ'-–B­½ûf9ìóæÍ«jiiÉJU3gÎÌΘ1#ÓÜÜœ•Ã×ÐÛ™Ïf³ÉZõØaN´ÒInób¼œtÄUóžqí»×õõöfä­G}ýýñ:ï¯ó6¯ûéoó1ɴº0Uk#|®¥@¼àã´ìyç] D*Ä‘Mš×:ýo‹×y[.µD(LåU^âc’ù Û°Á‚\p ^>|øp{{»ÓwWöH;%î‘~)ýJòv € P¶”í¥#〠b®Á¿H:WrMþ"ɵ÷n–ß´`Á‚šùóçÇŽ}ÎÉ{;÷®Íw½ö+è`ç;Ý®ùžžLæåÄfrëâõv‚ÃrìàË‘÷º¤£œŸæx¶J#”¡Ð¶Bë†ÛßÛ‚Å]Ô!ë. G¦(8Xài¶ªª_rРÏAç2Û|^Í ë"â€@[[Û€Ô¯A@оîJààÀöœÜ½àwÒ¥}@H5©¾®‘ïQŸú^Õ¾»é»kãU;O½o¡´F»._Œý‹™V¡üŒ'}ã€AðTxÙ‚l¶_ëû³ÕÕýZG|Þpîp=´·>p 𼃠¸e€Ç p«?H¿•î”~.Ñj@0@Hé¸ä€ÒMÀ5úHJ§In¿@ýë›—.]Zs 'TYsæÌÉΞ=;+ç?®ÅÏ9ÇÔ6»Æ^}¦»«+®µ—SÄÉ·sŸsìΧNuÄÉŽiršœû…i¡m…ÖMæþ“yî|¨Õ@ÜÁÝ4øa¿–û«kjz•Oí_Ê£Z8ÿ Ö 88àÖ­­­ñôСCýº®>Î-¶I÷IîFàÖ¿—0@€À„ 0áÈ9! ¤œÀ*åϵúgIž_,GpÖâÅ‹ë–-[V­©kõ«Ô„?®Íwm²Ãà†©kîíà{4|Ï»~\{ŸsðÃ~…¦£]§¼<·/”F%ï_ê²…Vžz<‚\€ ÏÝ ´lGßÌãAÞèz ÂX”Ѓ:0ð?Ò·¥;$Z @¥#@ tlI€ÒO`™²øDɵû§H‹4ø^ÓŠ+ªU³_­Zý¬}×ì»fØœ;ÏÛß³sßÕÑ‘éÒÔ¾¥¦ûqó|oÏù„GM ­ éÚVhû©O²IÎÇg¸m…ÒiÿP Èc¸Å@_Uuµƒ¡[AœY§íîkÀ­< ­÷ø;$)ðé?%¾J  €â±$%@H7ÊžýõÒéÒR9ö-§vZíI'T}â‰'Ƶúþ\ž-8úvÚ,׿k$ù¸V¿³«+vòíìr ­sš!­0¦å¾ÿpå(÷²&ÿº°FpÌõu``°Å€Z T«¥@ummvþSúñÁ¹ €qKÜç =®ÀéÒIß•h%  Œ€ñqã(@H7W×o6KgJ+4ðÞìÕ«W×rÊ)5Ë—/w Ü„ßþWpò´Ÿkh3]9`qí¾›ð{>×ÜÚ’û‡ã†Z7ÜþÃmK¦ö ÓBÛ ­cÿدòz‹N0ø÷Sè:Z·Èu#Ðße¯Z ôh]Ÿ÷ 'ý½ ~¶0ÑJÀÁ·ðß—¾(ñõAÀ @`tŒŽ{A€@º 4({O‘.—Öªö5ãotíþÉ'Ÿ\½páBÎ'ëH}ÅΖ”éloϸF_¿ÿø“yI§-9Ž Ó±ncÿ‰qÊ͹Ԭuÿ…¦…ÖUúqi/óDåo¸óóïi¸óŒuÛX÷/ø·ì.j 9àñâ(‡ƒiþ½åZøÐdWOiùQ¯Ä @ ü (ÿkH ¤€›ö¿LºHþ¢uëÖÕIµ§žzj•šùgùÐ_#™:ünÖoÊñ±£6Ô6¯n[Hw¸}Øv亨éxÌÒ×(ÌÛY ×,ÿ:¶…¦jåqÌuIî§Áå›jäûªªxêå±^‡±î?xþ#¾pÁó5ͱîò0ÖãÆºþy´< –=Š´+­xp@_WÉ]Â5ö—¶H·I'í–0@(SÊô‘m@)'°Yùûcéü†††y_|qýyçWãûkkÝòÿ1ç2Ôò«yì|Ù©ʱцøØáöi›iŸ¡ÎŸ\Ÿœi†éx·ÏñvÎÝÇ;×Ï{p>¹¾7·ÝëŽZŸ[¶Ógó¶P†xÅ$þ— 80”^öÔÁË­H<Õ(ùñÔåeINÃ|òoÊÅjÿ‰ÞòWhZhÝxó7˜–Ð¥—·ß®i·a[öh½ÿ@î“ ø{iŸ„A€@ PF‹¬BH1*åíÒ•Ò9Ó§Oo±Óî¹çÖ®Zµ*nÚï¼Û‘Шä×ô»/¿Gë·ÙÑÎFþTFÜ'yLr>¤?nŸá¶…t†Ûg¸mc=ÞŽ¸XÅc˜•»BÄ#ºkÞ¯ó²ç½/v4B` 9uÐ ,‡yï[èÚZ7ÖëöÓ‰Js¼çé?ò›ëÓñ tMupÉpþ¢€Ç ø„tP @ å¤ü‘=@)&àªü?’ž-1{öìf;ýçœsNGíw­¬ÍN¿þí­µ?^Î1‰& <69ïã -Z—¿ïDïãóÙ±·Z[[Ì><èÔç>ÔÈÇLø¯¤B@ ´ ð²ç ðÔ6ÜßI9o*ï¸Bpý’¿#ØÖåM{´ü;é?¤KC ´ ƒ É$@`2ésn@åIàIÊöË¥s,XÐ|É%—ÔkäþšeË–ÉçÏÆ¾~9¶q~;³^N:ÉùA¢–ßËÉíÉùümùËÅÞw4éÚÇŽ{pì=U7‡¨MЧrúC ÄùÇʃ@h)àÀ@r>,'ÿ’ó.]r99?YÛ†ËÃHWcÁÞñ[éÓÒçGJí€ 0±L,oÎ@ \ œ®Œ¿NÚ æýs6mÚÔpÁÔÚért9»Ùö\“u;ý¶‚ÎÆ0ÿPÇLg¨ôsëÇrÌhöMîc'ÿàÁƒÑâéAM:;ùvð±©C 9AhIà •ü›1/Z7ÙÛÆyµÃ9F>x¼ÇŽ&ݡҷ3o'?8úöï~×ì‡tã‚ñò„ C+pÀ üíšZ礽¾ØÛò²<®Eÿ²¥^É]Ü ùë_•Þ+ñ%B„X@`˜Èœ€@˜¥¼¾Azª´äÌ3Ϭ߰aCÝYgU]__?3Bó~÷é·Ó?TM¿<•¸Ø#9-Þi8§&lÍ>aßüéhŽuü={öDûöí‹ìä‡ßƒìa(&Hò[ ÷7;Þm.C8¶˜åI¦• tkÚêÓ%·åæý%{¥ÏHŸ”Ž|zB3 ”ž€Ò3æ €Ê€?Ûç&þçªYÿ´Í›7ǃùÍœ9sTNÒÙwaƒ“QŒi±ÓpÀÂNþÞ½{8üšzÞÁ “EÀA· HÊël…~…Ö…}‡Ú'6ÿÉûwЃâ´ûµþ[Ò$^ƒ  PbÀ$@ Å\ÛÿçÒÓ¦M›¶è²Ë.kP3ÿÚÅ‹gC­¾š¿Ç£÷»vÜë‚c¿ÖëÀ°<–éXö5»ñìŽñ„®Õ·ƒ¿77ݯÚýP>§A ÍB@ÀÁ€á.ƒÿîÃß~˜¦¨l/À]À¥÷HCµ8ú– @`ÔŒ;B(k+”û·I›Ô¬擟üä†óÏ?¿fÖ¬Yñ(þ®—ß9tð`¦[}ÞC yp(Ò6u`ÂŽþîÝ»£Gvý²þû$óS“@¿Zø“…úßx0ÁŸJ7K?“0@(E€H€RLà¹ÊÛ+ÕŒøôsÎ9§IŸï«;õÔS5ÞØ‘Ï“uuvf5Ø]¦C#ÝǵýÚ9mξóã¦üÛ·oýÝ»vŵûþì ”?\«EÀŸ ôbÒÜJàwÒßHn€A€Àq pð8€@J LS¾Þ,]©¾ýó4 _ÃE]T;þüøž¯Úý¸¦ßŸïëéîtø]–R9ÿcMÛµùÛ¶m¬Ýw¿ý7§…AKÀ­Üô¿ÐX»´þ Òû$ïƒA€À #0v‡ b«”·ë¤MK—.mv3ÿuëÖ¹oœåÎŽŽ¸¶¿=7 ŸW§::ܶü}G»<\šl0Ú±cG´]N¿kútE LUjàÑG†ú‚€» |SºAÚ1UQn@ã!@`<Ô8€@º¼\Ùy¹šù¯¸ä’KTã_ç‘üŸokkVuÜ·?ßY÷>ùë†Z˾#¥ázè¡èQ ÚçûÔÁÉc€Ž"àþ’ ôM‹ISc西~˜ÜÀ< &@ 0ÖBH;ÊàµÒSëêêæ]zé¥õrþëæÎß×»»»3‡ÈÚ±ë€~.øP|þúÑîëúã~ÕîïTM¿?ËÒr Qª{€Hï’¾2ŠtØ€À”%@`Ê^z ”)…Ê÷õÒçÍ›7ã OxBýyçWS__ßÏÛÔ/”/8ÚùSoÏ_7Ôòxöµ“ÿðÃG[¥]¸/"B¾˜Byûvø;4: ¿ 4¯¿Gz¿ô¥äæ!@àü%@(«•Í¥‹4Šãå—_^¿fÍšjÜŽõÁ#µýñ ~¡8ÇãÌ;¡Žëó÷ñ¨üî¿o‡ßŽ?Ÿå W‚) P öö%ÐZ ý­Z÷Qé lc )K€À”½ô(ç*ŸoWÿþuú„ß45ó¯U3ÿ¸¿îÌþ}û²ªõ?æ~.[pÔôкÑlnŸÝ»wÖòӬ߄1@`¢ ä' Ðè¡{”ŸOIþr€Ç À Li¦ôå§ð€@Š è>QwH¯—vK ²'@ ì/!€RJàLåë=ÒÚuëÖÕkTÿ:êŸu^ÕÇ¿úàÁƒ^/8ê^_h¾Ðº‘öu@á!õéß*§ïÞ½G¥ëc1@(L@-º hÍÛzXË“Þ-õåmc€@Y PV—‹ÌBe@`•òøAiÝÊ•+k=Àß‚ bÇß5þûöíËöåÚ‹sïr‡ýÃ4¹ÎóJ;ò`~Û¶m‹º»»½ ƒ 1p‹Y›‚G¾½zdÙÿï—>œ“—1@eG€@Ù]22 ¤”@ƒòu³ô¼yóæ5]zé¥õ'tR•õÃrü<˜íÖgö‚ åÄu½?Ý·uëÖx@?}9 $Ï€Ž“€ R2=yIy\€7Kwå­g€@ê Hý%"ƒ€@xƒòøúéÓ§ÏÜ´iSÃêÕ««3™LÔÙÑQ¥Zùª®ÎÎÁÚ{—e¬N~¡ýwïÞ×ö{`?êA€@ièÛ§`@þ§}ãõ—^-1>@iГ* PJ•$!)CÀ#û_£‘ýçés~õk×®­©®®Î¨ù}vÏîÝÕvümI>9¹m¤y7ëw¿~×ø·µµÅió L yüþb€Is«—Þ$1>@’ ó€@* Håe!S€@Ê œ¯ü¹ŸÿIgžyf­>éWרØÆO£ú×nmGùw’N}þrrÛpóÈÏŽÿ®]»¨í7D €À$ÈС`@~v—²tô•Iʧ… 0*F…‰ ÄféÿH›ÔÏ¿vãÆõ'œpBVMð3öïì,éÔ{]ry¤y7ëß¹sg´]ú8_áÎÀ€&ƒ@n|¼’qÕݾ+½FÚ'a€RG€@ê. ‚RH Jyº^ºZ5ý]tQýªU«â~þ¨9¤þ†û¤ŸË3’Ãö‰õSmÿŽ;¢žžüq§¼@)"à°oþøþzÀ'¤wJE…S”i²L]¦îµ§ä€Àè\¨Ý>Íf—Ÿ~úéµëÖ­«•e:ÚÚªöíß_Ý›sÒGãàûtCíwøðašùîz° ÔPÕ—ZäŠåeÔƒÄòµ€Ô]12©K€ÀÔ½ö”žÀ mvsÿË-ZT{ÁÔÍœ93ÛÛۛݷwoMG{{|ÿL:ôN.¹œœj›û÷oÓ ~ô. ”)\·ßÌ{Ep €Û%w 8œXÏ, I!@`R°sR@ åÞ®ü]]WW×xî¹çÖ®\¹²ÆŸõ;°o_]ëqðçr»ÿÞ={¢íÛ·G®ùÇ @ ¢êàÖ7Iî€A˜4& ='†RHà\åéÃjîÒš5kjÜä_Ÿõ‹:;:j4ºµjÿ³œ¬ÝOÎ{‡ärrÞ}ú}ä‘è‰þýƒ(™ P‘Ô- S­’Q^-FwJWK X‘WBA ý¤ÿ‘C@ ôtŠ¿•ž¤fþ5ªõ¯›={ö‘ÑýUëßžkîïl$úüå¡¶ÇߟñK|<@•K@¿Ú|Ńj2hn p‹ôñÁ5Ì@˜ &4§RKÀ51×UUU5¯]»¶vÅŠÕjÑèþu‡[[³I§~¨y—¬Ð6;û®ñ·ãïfÿ LMzt+p(¯ô¿ÓòK¥òÖ³@ d” - C)'0Kùû„tÁ’%KjÎ8ãŒZõùÏtuvÖØ¿¿&YSŸtî]¦ärr>l 5þà/»÷Á @`êP`@€üAýÉÀJ5õˆPb@`2˜ ꜘloVÞPSSÓà~þ‹/®¶£~hÿþ†¶Q6÷w’νçû4ìӞݻ£=àÿɾĜ€@: (0Ô'_¥ÿ*¹&W€@¥ P)W’r@£!°D;ý£tæÒ¥KkN>ùäšÚÚZòW§&ÿÕÁiO:öNt¤å^ îçfþ8f_A€’r­Ü% '±¾KóÞ—XÇ, ¢ PTœ$¤˜À[•·×6444z„ òW¥ûì¡껺ºï…ùξ<úÁ"åosS7ó?xð 5þƒ”˜ ÑPk€^=eäíÿßZ~±´;o=‹€Ž›ÀàKïq§D€ÒI`µ²å¾þ«N8ᄪ•+WªåMÔÑÖVßvøð¸jýÝR`ÿþý±B«t\A€@Ú 16€[ü_éKiÏ?ùƒÊ‹€òº^ä÷h÷kp¿Z5÷¯nii©R­}U[kkƒ›íÛòkõ‡[ö¶C‡ÅŽ¿ûûc€ bPk€þÝÝÝSe„ P  C-ÚYqôÙÝÙ®K¬c€À˜ 32€RJ AùòËÑæéÓ§W-Y²¤Z–QcWgç`_ÿ÷|G?Ù5ýnî¯Ã!L!@F@A8í× Ý Øï4ã@÷Ö°‚) ± 0Zì ¤•ÀeìïÔÌ®šüWÍ;×µþUí‡7©Öÿ¨û\¾£Ÿ¿ìAýÚÚÚ¢ŽŽŽcZ ¤µðä €*“@ÎóoS 9Àa•öÿH X™—RA ¤Žz1.é™H€@ñ Ô*ÉKOÐÈþYò_]__ŸééêjP­mÒ¹OÎ;…–ÝÜß}ýó·y € 0YèS0À­‚iUôMée£Ò*L! ;@)%°Jùúœ´BMþ3³fÍòà~vþ›5ÂÖy.äÈç¯ór¯Æp?#û›@i$ À€¼~% 7‘¿û4ÿ|‰. (ÌBC 04¶@é%ðeí5ù¯›9sfÖµþý}}õݪù—׌ãŸïô»X^g¹?#û§÷B“3@8š€‚ ¸@°vÍ\#ýSXÁ€ÀP E†õ€@ T)Snòÿd7ù÷ÿ²Œjü›ûzzªó3<”ãïýìôãøçc€Ê€‚½ HäÕ]þUz“D—€f!£ 8šK€@z œ«¬}RšßÐÐq­¿üêÞîîé®õOZ¾ãŸ\ö nòŸ\—<–y@€@9Г¯P—€‡•÷Hî€A8†€c°H!«•§·«¶¿¡®®.#sþ¦5ûy-äÐç¯sÿüuáx¦€ r$ @@‡ªÿÛyoÕü¥[똅  À fåÿÒnê_UåQFUÿ3åÉ诃_h @•@@€ü¯¸ÀG¥·WBù( P<ŠÇ’” âp“ÿOIóÉÖÈëŸÁ+A„Y@€€äºx\€ä?Óòs¤ ƒ Å5hp€ 2/R~¾$ :ÿºY5©þç?eŠì@€@:(8žÑ³r¦rS—È‘ƒé?”–%Ö1 LaT¤Má‹OÑ!Bnãï&‹O—”Z9+¹¬y € !¨K@·ZJlö§ý…×1@` ˆ;ÔNáòSt@ =f(+_‘6I!8Y­(À,-„åôä–œ@€RJ@M¿ã»%@g.‹5š>IòØ:n€AS”/ÕSôÂSl¤Œ€›(~Fšò%Ç¿Q7¨Æ°Ì€ ±`\€±ñboLƒMl§Ba)# J/T®þ]tþåø»¯?Î*/™‚ r! giFM<.Ààgs5ï ûÒB ƒ¦Ý0@“Fàc:s²¿¿0¢Éÿ¤]N @•J@ãt©E@k¢|#à*‰. (ÌB Ò 0@¥_aÊt˜¦lÝ*m–B ² ç?‹\A€@ùÐöZ¥ða\ð é^é> ƒ¦Sà"SD¤ŒÀjåçviUÈ—ÿFizˆ„õL!@(=g³RƒZ„ €|šäÀÀŠw&R‚ÒJ€÷í´^òÊ$àˆý™¿Áþýº Íóï €  @¤.û5éËΫ¾!½$·Ì¨PzïÆ Lé,—5Aš…ó?!ì9  @`€kõüõà€!ïUÒÿ›D aAÀ P©hP©W–rA ]þZÙq ³~ñÐ ˆ{Pº®¹ )F@Uÿíj О(öƒš²´;±ŽY@ Bðò]!’b@ ¥\‹ðié )Üojäüû3 @) Pà ;”-ø` ²G "༈0I 8ŠÀ,-ý§trX+Ç¿A7¦°Ì€ tP W­$rãO¾Pº+±ŽY@ Ì (ó Hö!RË”¯¯H Cþt³iVÀŸ @H!úØ—ÈÚaÍÿ±ôÃÄ:f!2&À e|ñÈ:RJ`òåšÿ¹!rþ=Ò¿?1„A€ Rz^g¤ägýì~¦t¯t_J³M¶ 1 0Xì ŒHà2íñÏRsØSŽ¿Gú¯ËL!@H/\ Q­:•KMâg¸|Tú­„AeL€@_<²”x¾òóQ©>—¯ŒÿÙz‘Ѓ @ \èÙí‘{Ý K³Øg¸\ê–@0”+ÿ¾1@ÇKà5Jàz)Ôôû3³¸Á/VއÀè ø =aÉÅÿÕ¯7¬KNü6Ç/üñ4‘N<«•}ùëFZÖ=ÀÁ¿B·ŒNêõAN* ãýµOsûy{°x}ü_XÃ(ß ôû÷À€½¹“øñéÆÜ2@ Ìð -³ Fv!B7(O¯• |µfZ¸¹¤ðJ‘¥Tž¸2Ïê74 7m¿lÇÒ²ç ËvÈÇì”§Àø3çÛk'«tï©Ê |?Š¥Þt$²  0zºÙÔÞ=¹#|úé ¹e&€@ðƒ 0^Ò/½¤FoÜ3ÂÂxå8TœcïÉ€þ Î|Ÿf\£fáÈOÎwÐÀËj] @Èjž`Áä\ΚrºQù³€îÌ_ûyyX` ”ÞÓËã:‘K¤€_œ?']–ÈX½VNK,3 Š'`¯^6èØk¾OëìÔ»¦l¢{Ÿ+È/ç 9/ÈËýv-o·ÚsË~¡÷>®Ýó4ùù/-š×'_ü7 33GÛj loÐ:Ú(y~†äýZ$ß[¼Þc‰xôqOݵÈûyÞŸõzïïéD˜ß•jõŸóáüe5ï€GK÷6 S†€îom ^ú쫚yYX` ¤Ÿ®ô_#r´ð ð—¥ BÆô&ܨ›‰_Ú1T~¯ÖÙÙ¶3]LszvÔýbÝ–Ó!Mí˜ï•öKæ-ïÒòi¢ :UêÌŸ rÁó³%ÒwMÈÒFÀο›ö=.dL7jþ ¦“Nà8}–Ü<ßMó]{oÿ'ÒÝã!`çß­¦ÖI§K'I $w3ð€†£5¿¯Õé?â¯ð7ZtìWj têFêûh°ïjæÊ°ÀHžéºäi#`çÿ[’›¿Æ¦›F‹_@Ã2SL$„³ß­y×춉½vk©vhú€dçþ—Ò]’›ñc˜hËtÂõ’ƒ«'KnI0_Ë€ªW >¨â¥Nô°I!P %A€I¹œ#àY12#ö€ÀT%àÁ¯ÜŸou Íþ ¦%'`]æ¦ü¡¿¾þј›î»FÿaÉŽþÏ¥ïH€ƒ@Ú ¸Áå’[œ"¹KA³4s÷FýfâuÏæ=o4ÔØ§( ´øª~YQ'@ hx0 % A ¢¸æÿ{’_DcÓÍç?À`ZvøõwÖ¯—ÈÍ·kq4µûvö=ß½’ý䦣9V»b( þ:ÁÒ¹’Çpk@8š÷8$OG³¿’Å 0>‚ŸWJo_j”‚‚RP%M”7÷Yý–äþª±éFA³ÿƒiÑÈÉwí¾?»×¥—F.o$ÓnñÀ{húkéÛÒξ `SŽ€ƒO•ÖKn©åÏ:x;’Uë7× –5úýe5A ¨t£N ¨?³è¤ëŠzƒÆM€ûþ¸Ñq *’€ÿ[¥óBét“Àù0˜¿&~×ðdþLßC’GÜ¿Sò—(y_0 àû÷ÒeÒ9Ò ÉŸ*”¯?¬ypÁzÉýà püt¯oKv¼}¯ô¾ãO™ ã%Àþx r<*‹ÀTœ¡HºAàüLÇLÀ¿þ†Ü¤ßöÙá÷KàpæV[¤_H·Iß•¨Ý ã$àO>[Ú$=NòFp—*¨ÆG@÷ýü ÀõJÉ­0@` pcŸDøœ)#ðIåÇÍIcÓÍOýLGM@/|q³~M=`ßHƒö9(ðéçÒפ;$ (¸T§ð×]F 8Ð$1~@é®IE§¬î!°;WÈ^Mÿ\ò¸ 0ItOÇ Dƒº1LSQ}Xf áäœ~Üçï@WËïû’~,}Iú¡„A“GÀçJ›¤3¤¹Òï†z.4èwîî|rP °ÑPÀŸZõýßæ`À+%}1@` y“Ÿ„¼pJ@`rüNûüpjÝšõ’W–™B Ÿ€€Ð—¿SÞþpƒ÷é½/Ú&ýRúOÉ/|^‡Aé$à€À‹¥'Jn!Ð$ e´Š ë!ðø./CŠ(=¥gÌ foSæÞ(Å}Bõ_£n iÎ0y›9§¿WS;ü~yÊÚ´áné韥­”*ø é™ÒÙÒÛ2rþgs8cªü¯®©Kò'û ™þ?H±ÿcÒn ƒ 0›uÐÕÒÒô!p0ÀŸžuKl P [Ï¢C¹"k6z¿ä±‰0@ „x÷/!\’†@ŠÔ*/vþW†<åœîHOýV%¹¶ÅN¿ü|sK;ý_—>*áô •À³•š?1ènÇ ÐÉ­ê%žMEEŸÞÄô\r+49cóóéuÒ½€A¥!À ¶4\Ii#ð eÈ/]±©šÅ­À*™€^¬ô/~¹rßþBfGÿvéÒƒ@ Ô\ÓÿÇÒ ¤Ó%¨ó-n —T€U8yýnu—´§H¿­ðbS<Lî«“†žC`Â|\gòHͱéGß"Ï¿:,3­,öø¥^©U³®MÉ7¿\ýLú;éÛùY† 0Œ~ƒägÔ"é˜÷R=¯ÜZ AŽÙ¦õXðsK­<(`xf98ín#É1´ˆAÅ ÀÍ´Ié%à«ë¤ø·®ÿ¦ëeªPmKzK@ÎFK _oN®éï,p€_ªî•¾ y0¿PÓ¢Y €@*œ¯\¼QºP*ÔEÀ­üIALÅå*n&rA€=‰TÿWó—J!(ØÄ, p<b§àxàX@ µ.SÎ>#Õ8‡®EѾÐK•7ceJ@µ&®íwßþÞEp퉻¼[ÚZ`;« ¤€ƒÔ¯’üYÁ“%=¾Ž¶\  Ž—Ø£¹TÀ’ÙɯÍ|Eezy”‹"@ U¸w¦êrÀ2¥ô©9—b:]ÎÈÍ3)s®)‘<’¿›ùç›bqmÿ'5ý´DíI>!–!r!°J}‹t¹ÔT ÓuŠxàÀc‚öeUÐ,ÿË7)Û*ƒ¬“E” es©È(FM A{Þ)-Α՛Ñ,~ì£æ—Úåðë߃ú¹ùÿ÷$×öß-a€*…€[¸KÛIK *«gœ»¸1¾M8å¶Jº6<^­Gz±äJ (|‚"@$ ¤Œ€¿ß~^È“^ˆfë‡Îo=)ÏiŸªñ]ÛŸßÌ߇¥‘\CBß~AÀ&–ÀM7½³®©©©ª½ýð¾¾lW6;0«¯¯?“ÍfÜå葪ªlö•¯¼ú¿ú«dßõ®›óÿ†'6³œ­¸{Û›¤³¥c~=ì¦IîÀs¯Œ¯¶žyîÂfçßvHÚ(Ñ•M0/nŽÇKã!.Qv® YR³ÿYšW +Gªqÿ~¿øhö(³u—t³äý1Lë®»¡¦®®¶9“8e` Ú¤†)'êä«¥†L&ãnGµÓ4u€ÊýyýÒîÁ½¾ŸÉd·÷÷÷ÿæ†npà ƒÀñp·6ü9ÁÙù éÁÇ×ò¡”Ѳozðùþž[4ï/ЭM0ÇCc!.W+;ï’b‡_?nFüO×õunô¶Ó£—;þ~Jškø ½]ú½„A`B|á ÿ”¹÷Þ-õ}}½çd³Ù'Éñ÷HívúíxS [ SZy¿ûtìCšþ¶ª*ói ~—Íö÷^sÍÛÃK~CYa (Öwx©¦ ó÷ÔÑÝâ<ÂÝÚ@IDAT.ï¼ùpR¾¬à€n {Ùü7Í¿6±Ì, 0Ü ÇC B§+O·IõΛ_xôã.4`’7c)$`O_J~”Ì¥›ÿß*¹Æwró(5O|âÓU;w>üôþç d.Öù–ᜮÅsë³ê2ð /<ýÁM›žð*ÂiHbŠx®ÊëV<0ÿ·FÏFF0’O1.e[Ü\@ÜÝl:ðE/`€ÀøäßÇ— GA“IÀµ?•ä2Q­ê–ÉÌç=œã?Ôˆþ*¥ÏJï—èß?z¬ìY$êß¿IµôOWr$Í+R²G%£n÷«UÀõ³g¯ø·×¼æE~ÁÇ p¼ÜBåZiäI#¤QózN&lS–7JJ 0ÆC 2ÉAÿ2ªÚð XÊ è…Æ¾§¼¿Ì$Íë>(}>¹yL[n¹yI__Ÿþ·JÓ¥|'ª˜Yñßü¶L&úxOOÏGÞñŽw&›üó<¤5õÌW‘p+¿Uœƒå³¢”ÛJ+5: t ¢kÞã/\Ò˜r¸éM¹KN+ŒÀÛT7yŒM?hîÿ?IáÔžŽ¬CŽÿA͇ެ¢-šù éÒÿ„•L§$7SöŸ‹ŸÓž†ßuXÓ°^»ÇÞùÎÏT­ÿû”Ú‹¤™’óRJs< Û¢l¶ºý’K6ÞwÇßë,å I{Êp€õëÒg¤¤R³¢_?¬N©G€µRÑK:V$º8uºVáÓ€¾_,—¾Z¤äISŠ7»)u¹)l…Ø ò¸†¸ÆåÒ¹YoéužÇÒG@/.öâ 5õ÷¦û¤wKîçMvâíŒØÉöóøDÉ5\žú×#é»I¼÷óÔc|ø÷n§Æµa]Òɶ]rm¦§þfºGݳÉùšúéc>¸8¸\×®^½úïŸ÷¼+í»8LIå1³4ûNÉ-â1sÛÑ5 #³º úË8¾GØ|Ot°œ–r¦A` Œ»B Eæ*/?’ì8Øêå!ØYÀRF@/+vü]Ët8/k~y¹[ºYúvÞ6+“€›#û7»LZ%yýó$ÿv=†‡ƒvâ[$ì ¸&ÜS·©‘ÜäÕ¾†ôŸ—·»VÌÇn•\[ÿKÉÛÎ/ÌH>ÞAƒcìÝï~_]wwÇYJòµÑyó¾“a.Óo¤›:::o½å–[hâ;W¡òÏé@À’G'iL× 2ïÈI*)™×ƒ³C7‰ÐuÎÓ ¥)ÉÙ€@YÍ Ê"³d$àOáçßýþqþѤgF/*…>çgçé:éŽôä–œ”€€£Ë¥•Ò&i­dGßRÌ.vä5)háùj)ƒCnçßæ@Íýóƒ-ÊÍ8¨àãWKHÒ­¼ü5ÉÁ€J»$¬¨³³ý©ÙlôfÍ®ñò$š.sú³¦¦Æ_hºeó©+—À>íuÒµÒÍR2У{÷^=Wàó‚&óuQÓ 2$õ¸ÿ$ùþŠA£$^0F¹;»A) ð^åáq!zºß?–"zyì“—oGËÎ~ÒÔÂMÒW’+™¯('¨4«¤’›Ó{ä|×üOt÷œ0à™ƒƒ'I¶ÍÒNéô3éÒÝ7Üpý´œóÿx-Çü"îòƒÒ}Ì/Ò¨þÛõÿ"}6p@˧iý ©Fííê¬þþ¾giÿ¿–0”Š€ÿfC àÍ?CŠ«®iÖ|‡þ`›$ZK ½÷Ìp&—¿Ý ݘ’ì‘ ¤ž÷³Ô_"2£lÐÒ¿HqðN?àzú¥K>ÕLø…Rï&G™®÷IŸ9j- •BÀMöWJOÈéTM½.­Av¦ôõ½L[ssóï_ùÊW,iii™©ÿÆr/ñ߸þ_ÊÁÿWMVzw÷ööµ½ç=ŸÝñ–·\ÝÍöUõ÷,×ú–l6ó”Üç—hßœÐìp6°%“É>éºë®¿g¸½Ø"X¨´tò³ö¨ß¯ž·Ó¤z^œ‹Hû8’Ò (9€» =EúÕq$É¡˜2¸M™KMA+€€›#ºIìÜ\YêÔ†¸¹ÊUöE75 —÷ñ·C”4×Pü­ô¡äJæ+‚€boqþ‹5ýéi±äõeajbmÚ´9ºà‚ó•ßLÔߟ·ºrúoÓÖ/«¦ÿ¿®¿þ†-Cï©öÕ7ßRuíµ×ôÝxã;OËdþLû>Grì‘Ì-^­ô??ÒŽl‡@‘ ¸+ŒgIGý¦õâÜ¢GŠ|n’%Ü=ÖIxînÓü9’Vc€Àp G‡mH÷ûߔ˒ûýÏæ<¹ÈÕ¨²v¹MíGfÿw0à“ÒÍ/#ƒX*fÆÍúíĺÆé<)å4[VSS|òªèyÏ{^T]]­&û¹¿æ²¯ýîÌf³_¨þÐõ׿-?`„CŽÚ|Ýu×Ô×ÕÕ;`rƒdŽ#Ù'tÎ?»á†¿ðo ƒÀDØ ¾KZ•w⬞¿n§8<6Y|×Òó×öpûÍ¿b²òÃy!P.ŽŠj–K¦É'¦ —ªÌC¹õÉóhLÎT/]Ò)éü{¤v¿€œ)Ý(áü B™û±?_ú°ôAÉ€²sþ•çhΜ9Ñ…®äŒ{qXS~o?¬@Á­µµµ/^°`ÁûÇãü;‘›nº¥³¿¿×¿‘/K;`${’ο|¤Ø¸Céz”yi¾_ç~ÝàjœÏed‡"à;“"03Û=˜£ïË 0 ø©>Ìv6A“O`‰²ð©ÉYѶIwÀ&€~ð—ßÏ_«ãAÕÞ¤é}“-NYZþ½&½Jz‘T'égXžÖÐÐw޹џøÄ¨·w4>¸F ¼ûw[wìØþþ;îøþû‹Qê[n¹é¤¾¾þ¯*­ÕÃ¥'çßÍ{_ q4À 0ÙÞª ø>pT÷;?—% œ¤«£gr²%Þ~eãl‰VC“t=8mú ”í LúÑ’C€ØŠM«pþ‹ÆuL ¹–Gµ=‡4õË…~›ão–?AÓ§J8ÿ‚PAææ½s¤k%wÁy¹ä`@Ù>;]›?cÆŒèì³Ï±Ù¿šúÇãÜsÏ=Ñ÷¾÷½yrþ_¢²¿]Z*—µ¶Þ©þ{¤DÔüßæk€A Þ­L8hõIi° Œmz(¸EXO29Õò àK£ÊîËnð‰©Æ€òB`,Âe,ǰ/ 0qnÔ©ûêÛ2q§æL€^êÜÜßý =Òp°=šùÒ¥Ò¯ÂJ¦EÀ×Ö8¾YZ^ %«ªªŠÖ¬YÍ;oØAÿ(ãíÞ½;ºãŽ;¢]»v¹ÕÙҟHˆl¼n\ö®wýe»Î±EÐ!£> ™ã: A 4üx‹´Yú©¤ÇÃS à Åû5\¶1--¼÷#ߟžTÚ3’:Ê—€~/ R§+_~ÙŽMî’þaE@op½z™Û«—94Ì/Ÿ‘ÖJŸ+™V7ï}šôNé…Ò¸]›*«¯oˆÎ:ë¬agØ‚C‡E?ýéO£­[·E}þÀåó—<È–›B?W Pj~L¦Ã¯uÀ£© èë>'´p‹/÷7‘ô ¬OÏŽ}úÅ´êÙM½y`ÆÐZÒþ?½[;A§ç4(+Êêr‘Ù)Fàc*oxxÕêÇZ3ÅÊ?iÅÕK[hî@™ïpžºÉòÅÒÿ‘’­´ˆU;£'Hvüÿ^òÿegœqz4}zsjø ÎMÿ»ºº¢‡z(úùÏQh"]»öÉ€çIK¤1™Nãß—?õ7œ)«jS‡#ĶÉ&ðmeà\éF)ù÷Š¡•Ëdg¿rί“»hùþdóWF>Ïñ pGá`©!p‹rrRÈ~¨ÓÃ<ÓÒ§Ñ)íÕY’þN-_%=Az@Â*€kùÝâæóÒŸIT”566FK—.k÷ݼ(s`ÿþýÑÏ~öó‘Z ¸i¾™½GrPÌã`Ì–FeýýÓ´ãH÷¶^õFh~×»Þ‚¡£J› 0 >¬s>Nò=¤'œ_¿´j p@Ó¡tag¦ÇEÀž¿Ô’HäYšßœXfü@ }<ÀÐU![z˜¹é?Vbz3ë×KÚ>M'Nå Àg¥s¤¯'Ö3[Y\Óƒô.iCšŠ–­©‰2rÈ«jkã©çmY5Ñ·…eUéÇËÃý×Ò2CŸÿ›éS~Cè¦ÿу>=ðÀ¨c]Ët^MÞ)y\Œ'JuÒÖÞÞçšýeÚáà;ÙP­ý¶½ímoKäF8„͘4:ó¤+¥­‰\ô:°,u胕€î¾9jìØ<ﮞb€@ŽÀ}ïàLšþO ôܢGpö‹[0¯þ•ôZé¾°’iÅpmõ%ÒÒI’›N˜ÙywM|ãܹQMSSÔ´haTUWÕ·´DµÓ§Gõ³gEuÍÓ£ÞÎŽ¨J}÷{;:"z޲êíÚ¥>úûöGÝZn}øáH壃rÚ«êjµOÛ1åhžÖ-Y²$nÞÌÆÜ ÷õokk‹~ùKÿùÙÎÔ§KJI·IwJÇØßþí{5jwFMtÜŠ`8kÕ>Û>ö±¿¯zÅ+^¥² ðCåÒÝ®—þDŠR=XÚ¤vöå¨ò.0¥0±¦gzøJÃã&ém¥8iB  pó)Ç«Fž+™À *œ[Ħ‡ØHÍcîLÇA@/½zs ¤þ`û5sôŰ‚iÅpu¹¿íÂõÒ©ä–QízU]]4cÅŠhÎé§GóæF-+WÆ˪Urî«ÐÀÓÜ2^ÞAƒœ~9÷Õ ôÈ)¯V~j4—ë룮Ôt¥/êïîŽÚwíŠz´}ϯukÿý¿ÿ}èíèŒÚy$:ùäUQ·öÎTÛmÛ¶-Ú³gÏp» ·Í5m8p¾ô}é Òï¥AkkëROƒÌeƒ+†žÑm0³çh@lI-¬Þ.ùK"+m’ô÷ÿÌÝ- N ;aÅ%`¦R‹n§r)¿DSW®<[f)M€À”¾ü>e–)?];6=¼hú`yšóö]“¬õW< ºCò5©Yr‘sDrH`©Îõ|é$×X—ÜêgÏŽN¸à‚¨å¤Ñܵk£Yú Ÿüj5Å·óîÀ€m Wc…ùó{žªu€kú½lgßÓ^O½>,«©¾ƒv'2ÕÕQãüùq+€¥7FmràÝœÿÀýˆöÞ¯F,;vDó56¹×%Fô?¦ì===Ñ=÷Ü3b à˜]ѬUvðpšHÿ$픢ššªKúúúçz~Û§¯Ü5Â>l†@š ìSæ^ =WºYš%Ù =] 0å ˜òHO(/¡ßZ^~paE& .×ú‡Zº«;ß,}-¬`Zqä)Gë$wëx¦TÒAåjÕÜ~ΙgD Î9'Z¸~}4ë”ÕQ¶VýùåÈÛawªOζÍM÷ÍMrûÄë¼lb}8v —–wíT«\˜uÚšhæ©«£ÌöíÑ‚_üBC«Xïy´UWW)N°#:xðPÔë Dql¾’ñK·ƒ-ë¥/oÚ´ùËuu KÚÛÛÔ`xŠ_É7â]exLl-nUægŒ¿0òIùø—½_Žj½¦é€˜N×Ýuo.I·HºBº½ˆ§ )”%ªeyÙÈtxµÊäš²ØüÐ óL‹CÀn”^ü‰¦dh{`Ÿ“ÜÜÍ5±Ê#à—lÿž^']-(y]I¬Aýùgzj´üIOŒN¼ürõퟟ'S•úå¤Ç£ïÛÁ/±ÅÇ]Tëïc×êÓ~Ãý‘÷ööEíííÑ£>ZŠÜ-U¢ ¥ÇýàßÖé§Ÿ6gÁ‚ñ˜ õHÐþ}×_ÝöRdˆ4!0 Üêì%’ÑJ‹%›¿>Ó™k À»ù&Çý¿xún;MÏ5§Šïû¥©ƒ‘ÃÝ û¼$´(ÙKPÚ Nþ "~ ~SÈVÓýÐ ËLŸ€^¬Ôøù˜OûmSÊn’ù‰—ãǜ֞£Œ}RºNZ.•ä¹W7cF´xãÆèâwÿe´á¯Þ­zÎsâüôm ËÎlàü9Q⵨Հê>×7&6%gýu€;vƃ&×qÞŽÍJuþ’>3xÑž={ã®uuuÊZáË20ù·"žÔI]wÝ-q†Þö¶ëh‰5jjì8îÖâ ÀHƒÏ9ª US¬Hô2ZV:Å’Ÿù¦4œŒ)}ù)|J|Dù¸2——¬:†þ)É^ùfÃ/QrüùO¶{vÛæ•þ4øâ¥y¬²¸¹ÿ3%7ùŸYÊ¢y ¿Ó®zIÜÏßüÙÙþÉpö Tù˜¥çüêWQ¿¾"0”¹uÂ×¾õí许»~éÌÎ~½0œ?^´fÍš~µè=á„¢iÓšªÕ !ën΋ô{ xõµ×^ÿãRåæúëß–m”õööË1È,w¬Dç_.éôý+uÞûœénµT謩ÉþaÆŒÖý{÷NÔ2¡hý$JU>Ò- ”Kè2ƒ¦t @k€A"ãŸÑ{@²ë_›R:[Ú7þ9åM€@y_?r_þ֨ߖâ·òœó_¸*¬üË:¡%p­¿kStÒdeŠ sw‹‚Ÿ&›Ð r²Rps÷5‡ô8)nf®iÑÍ£öŸxùÑÊg?;Z²aƒœ~5·—™6sÍÿ‚Ÿü$jÞºõHƒØBT¾íèÞ3kVô½Û¿m»õÖ +ËÂ… »æÎÛzÒI'eO;mMSCCC•8V+?ŸÕX×ÜpÃ_¸µNQíÆož•Éôéïd`­Š~®¿DçsólK [ñ ù‚zPPñ{É™YÝ·ûwœrÊš_yåsÓwÑ•I¬¬øoîýÒó¤¤ÓÏØEºŒŠöûwœkŠ}Só/.RÒ$²#@ ì.®0ßSyNË•©NoÍV¾I)ŽÞÆÛhOœÜ5ý_‘^/%ÇHìÂlX¥2¼UÚ$­(eyæÍ‹NzÚS£uþçQÖ£øËyî/ÞÀyEͺ겣YwßÍþŸÿº€êðˆ¾V°íp[ôðí·G~ýëÑþ{ï-j^†JL­ú«ªª÷77O;|É%מqÆ÷755}ö­oý꘱®_·nSöÏØxž.ÕF]°—Èá_¬@ƒDI‡ËÉÚ¡éý¨MéüZ»ýZéüëµ×^w‡Ä pœ.Òñ•æ'ÒɨV`¦þ ©H@ë¬~Ôz/Ø›;Î»ÇšûC Œô€«„2R¤•Àk”±w„ÌéÉ>[?H~“È8¦¹ü~ªçü ¹öð•ÒÏ×0Siü²ìš³gK›JY8²oÁyçF§¿âѼ³ÎŠêUcÞÝÚמ—ò¼Ç•¶œûwÝMÓ—¨(hÚ§O-öœw^ÔvÊ)Qç¶íÑ£újÀŽÝ=üíoGí»v<¬+»”æá™3gîhllºnûöm·ï9Þô¦·d[ZšNR:ÏT—ßwÝÔÚ5úÅ0w1Úª@Â72™ì‡®¿þú‹‘(iLi¡5€»z>6ýr§é=!ÙŸ=lb:JzGhÓË[úØþ[ò×0L9C¼ L9MÀµNª=:Ò7Y?Äf=Øë&:•t>=Ô»õp?”(“ƒß^!QëŸSA³vâÖJîçÿ©¤¿¡¦ ¢åOyJ´â©O‰æœ~zÔ§QõSorø«”ÏÙ¿ùM4cË–ø‹óì@]]´ó £N5²+ £®|0zô§?‹¶ÝqG´íûßz;»sÁTŠ¹Ò¿_Ÿì_¤wK÷Ic²}èCUú¤á,Å_-ýŪ©?yL ŒmgEH2ßÖ9>¡±¾ýõ7„¦ÆcK…½!ð§hÖÝf>¶*Ò÷D¢½3ðþž€2ÚÙ¼V¾ÇxØŽöxöƒ@¥ÈoöV)å¢H;¿Ð†‡º^³K븤Æñä/÷@?¨4zéxùϤ¯%Ö1[9üòëš°—I𬑊U£«¤Ž¶* X7{ÍšhÍ‹_-UŸÿLVÍýèþGïš¾¥¸f¿&ª–ã`˜ª ¾|åþx¿P¾Ë—GÍ‹E3W¯Žæžyf´õ;ßùÙO‡I¥h›t[Œ¿^ø'š>Kú ô)4áÕìðvèÐÁËÔê×#Ï–c^3üÞǽUc ¼P¸›tCW0 úíq§HS€Ÿ_vN?)¹k€ï{ñm43]?’ÝótžŠ4qs¨ägoVA7Tda)†!à› L,e:ݤøá­Wlæ§yl”¾÷@nòL‹ñWiê VyüÜzºäæ±®½)Y­¿kÁæÎÖþé«åø_5Ι£Óé®jþãœÊ%Õën¶§7š÷‹ŸGÓ~xø`Û%—D=ú¤aÒä5:ãU¯Œ–=á QÝ´iQ_·Fùï+¯/GÆÎª¤íü×ÖÏÅõ_ÃXûÂ…QWËÌ(Ût9=Àa•ºL_¾,ò§g,_Õ)PжcÇDv p°ôYÒéAi‡äÛÛ‡>ôÁêÎÎÎjÁ÷ÿ½L¸)`Ò¬ @í¥—nþåw¾óÝd·¤ Ï '¬¿SIì¤úon®T€wèÂAPM°ÑÈÝýìï §kþFs,û@ R¨”+I9Ê…€4®•ŠÖú¾|c¼rzáñH¾®õOö±Ý®e×ÿû“c÷ò àÜ󥿔Ü×_ýºKg3O>9Zù¬gFk_ýªh–ÄÓ÷ðÊÎñ?ŠŽò_§ÚûÆGº€Pp uéÒ¨·©1ò—òm@ÝÜ5 vúô¨eåI ,f,[¡UŸœÀàȉÊÛK¥eÒ$·ö‰»­_¿þš³´Xš,³sq¦í›7oºKA€ä½j²òÄyËŸ@«Šð)É÷¿µRü¡_j§æ«äØ–, ªô+ͪĭ=W¨M÷J¿¬´BR E€ÀPdXÒpÓÕNZOîF=°éÃ7Îrü=ÐߢIlZ7vóÈGVñ…ðïÅA³?“. (‰yDÿ…ë×G¾ãíщêë_7£EÑ&ÿ‰•¹É±oRM½ƒCšöqSÿ®Y3£Î¹ó¢Ì0å¶£? êѲre4CÁ€–U«¢Þööè°¿40qf'èÅRÕE­o»êª«ž¥¦÷M/RÜÂ(¼'év=f›¯–÷}÷»ßó†c>L%ÿ¥ÂþDºTjÊÜÏÆný‘ÖIãù[Í%35&9@5*mhp†æÿvj”žRBà±, Ò¸B§x•?{ôßt)÷*ýÉËý z¹i³åðËù¥¿’B@ ±™Ù2'0Gùÿ#éféùÒ|©4&ÇwÞºuѺ?Stê‹_ÍZ}ŠúùwNdviÊ•HµîPkÔ4Ò§üÄ¡µ¡>êlžU76ªáÃð?+w pÐ`ÚÂEQËòå ¬Œ¦-^uìÚuíߟ8{IgDÝxÊ)§Gé°yó†Ûðý ƒ@±<¬„>'­—æí×/¶CóÄ­rë™ Fn`^¶i’ã ÞiXÅ‘íŠ/(„@ |^yˆ_õàñ÷|}ÆF  ´ë"÷išlFëµ'Jwp8›Ë€ŸK«%w®•VHv¦Jbu--ÑIÏxFtÚK_-¾ø¢(«ð&ðSw%)ÓQ‰ÊAª«£¾{ï¦k €Ì0±²j}Ý`×C[£ÝQíìÙQ¶N¾õAow·€*q›®î¸ …» ´nÛõuºurií´ÓÖDçž{nÓìÙ³ûÆ>FÃ/å¤Eb7©(ïÍf«n½þúë¾öë_ÿö7·Ýöµ»Ö­;ï7Tð+7^¢`@Õ5œÂCBz²JÔ<ÊRy¿;Ø2ÊýÙ £%àÚkÜôÞéý£ó/Ÿw Á’­NѾa6C "”쥪"èPÀÕJÊŸþ‹MÎÿ~|ÆÐS9þ=rüÝ¿7˜Ûc{ ¤7HGRö`ZÎôÓˆkýÝRæli¼µ¹#2¨Ö¨öÓ5˜Ýš«^­xò“õi¿ªøó~Ñä?Qúª††h×÷¨PÙ]Ñù³gF•{¨š}9ÂÑCl‰¾ÿãŸE žöähé ŸU75铇(ÐãÔ˜{~ó›è¡Û¿=ôÍoFýcwÌ¥zvº W^ye´dÉâHÍÿ‡,[^ ¾Ü¯ò~)›Í~lÆŒÛ_ûÚ×…¦Ày»½xóÍïœ×ß?pŽÖ¾VrÒ³#™ }×\{í;âq FÚ™ísu̧¤y‰c«õÇéq†°aèEbObóK5ïÏ/b¨h!ZXÑ…¤pHO)q‘Æ3ôPæ·7ÌE‘ÓïÏô¸Él²É¿ç]+ü>É»`•EàrçÉר-JR{•‘“Ø ÚíÇ]}utÞÿ}s´à¼ó¢¬jÈãìä¸V”É¡ïztW´åc:x Z¬æùujâ?\ÀvìØí×'þª´oã‰Ë¢LõèoWæØ¯6;M`ú²eñ Š35b÷ÁCQÛN·°-žÉy.¾øâhµºlÔ+°áóŽ`ú*b¦[•£ŸÓô-óæÍûüßø¦}·ÝvÛ¨ƒ‰ЯíœsÎ}°¶¶ö€ð®Ñùâ1]F8¯Æ$¨þêw¾ód0s„CØ 1ðë3ÒRÓ]Úõ¾Q§uš`Cp Št+€O±«!P1üGA¥%ðJ%úèeô.‰cSÚ"L\êzañ(ÿtÆäKùÝZ¾Rztâr™&ˆÀ ç ’›û/*õ9—lÚ-×çý–^º9ªQíxÜDÝe+Ð2UÙè‘Û¾µ?ôpì´«9þ´þ¡[®;0Ð<½9j—ý[¶èØoDÍrÞ§Ÿvj4Ð3†Êk¥Ó£l™uêê¨iÑÂ8°ýGwF÷ùKÑ¡‡* í¥K—DgœqzìüÔôß­ººº:z{{ÿñ¼óÎýËg<ãYãŽF¼÷½ïéQþóï¼±^Ó¿‘’µ®…ʶt` ßA­â¼ÐX#Aó§ „[ȽUª5=H÷ë7]ïñ²×a›Z½wóïô2éÛaST"чõ+±ô” CàuÕ©ÞIµÿ¿»!¸ËñïՃأ‡…籫ôÔ?7zžäO a•CÀΓkPo‘®’FS“ªÝÆg3Ô7ý¤§?=:óu¯æŸufõԘט ¬@@<>€ºLSýu¹˜}ÚiQ]ËŒè  }]¡ÒmÌ)+¯ÕÑe—]>ª¦ÿ.×áÇþ÷ÿ·óŸÿùó·îsÿ´OÁ7ûCTãØq7Я:1·u¯`˨yü_ý&Ú÷£G}mmúe£iêÏ¿dñ¢øÇd‡?«6ÕŠ«v¼3Ú¹sW´}ûÎè9ç=د¿»[-$º¢kOjÔ×~¼æq¨SÍ(ЃÎ]{†º]ôFþðÀ¸’]¥Ï>þñçEúZÁpMÿ]NëÇ?þIæÎ;\wðàÁÍrþOÔI$G ÆÝªHûÚ¼yÓJ¥áf×ýOôÝ7Üp÷4Å 0¶è$Ÿ—|›;aŸîz]òp륜ߛÛ¤ZlÚsÜ¢ÇûÀJ%@€J½²”+-ÜŸ96=mg„y¦ÐC×ýý]»Ÿ¬Ü©å+¥ßKXåpìÉÒKO)u±ümú5/½*Z´~}4cÙ²xtÞoª˜ßö‡Žjô¥ƒŒœðÕèwÉ©wS5‡ö«–ïÞ}qÿ.}"Ѐ5õ÷öØq®©‰Ú·n‹zÛÔœ_…xœ„ã€]AéøS sæD-'­ˆo¸$º÷_¿íú•+,Ggîû¿NŸmll>näý¬ßþö·Ñ/~ñóhß¾Á÷ùËu&;í·Iß¾/ýA³‰Óÿˆ×Hݺ|››þÑþ]Í«_ý§î>€A`"ìÖI.‘ÜMÅ­èˆêÓóv¯¢U35?\ÐJ›§Ž9"8 bãŠsy‹ô ƒ@E P‘—•B¥„À‹”×tÚèû„ÃQÿë­ØýýýVîä`?ÕŒ[M„ïó†õLË—€_<KWI¯“fK%3×ú/Þ¸QŸ÷{º>íwq<}jÁ§šuÉ©¯™¡¸£z;Â;w>ýò—¿ŽZ·Ëñßõ(Ы&ÿvüƒ³lFvþƒeèzdW”9ýqÇPÂq^zsãÌ\uJÔ8ÆXmÿá¢{¿øÅ¨U‹‘̵ÿóçÏ‹4_Üe¡Ðþ¡ ‡µFßúÖ·ã@GÞ~Ó´ì ãzéëÒIß‘vI£6¡õÀ~`×DBÏdpþG•‹KÀ÷ÜI)5:é¾#ã4ëÆ\çe,&`6á½ãRÍ; T*€Ê»¦”(=ܼ96½ý ÷rv›RS9þîïïÁþ‚¹?î‡%÷ Ç*‡€ÿ§K¯•ΕJÖÆýÞÝ×ÿäç=7ZõœçDþ$k³íO5óøõ *ÂÖÆçòwª9ÿ=÷Þ7ï7÷£·…i¼üO»»ÔÌhŽ4-¦¹5AO{[T£&üsÏ<3j^²$šîºèÁ¯#ºÿß¿u°q^çÏŸµ¨UC|m‡È”jüà?ˆvïvEè¶H[^.]˜Ó75u 8šÚtžvåc¤û»ÿ§}øÃ®ýë_?uš  -OÀÝ~,ý»´Ô§×e«¼Ûny¹tMGé4 N¿™ø™õ! ƒ@Åøÿì}`չêZõÞ%Krï7,ÙØƒé=ô¡‡„N.¶z“û^îË»É} ©— cãJ±)ƒ{/²eÙVïÚÕû¾#²–wWm›äóÛ¿fvæÌ9gþ93çü] Ü#Õ7 ¸ý ÆS8 ®LD¢çÄÌ57Kõ,}Â_w8¦wû?fàhzJk¯iýižNFrèõ×Iþe—IlAPsMM³;&±ÿ“×Í€6…†H‚þ5W@Α)¦¿<#âw(D‡¹>™uå€k= ¶vÁBX|¼¤NœA@6b6L—ݯ¾&W®<«9 2Ç€¾ÿ Èjà xŸÄÒÒRÙ¼y³³"ÎŽ ÇAFŸ œ| H­©[@ÐÄ0³Ùt…(Hpd,j4óïŠ<ú¸(p휤`<Ð!€ k”XÒs@ƒ(¬M ÅÄ  ‡œëƒb€Þ¿ ЫoËïxÐè&”®´CFÑsb‹ÅÍeýý¹x&“¸ûœ À¹q“i¸M.4ŸŽòö-“a̽èBÉ[°@škchóªLνÝx Ö†?iòBÀXÏö ³°0Ù6‡…ID^®×)ŒÀ´ÖŒ OHd È,š-»_>3>@xx˜Œ5JÅ0pu7†ÐgÆ ÒÔ3ËZ«LŽÒZe-ðUà6 SóO_jwÌ?¯³A QóÜsKÞ|ò)çR §µëƒš§ïó¿Þä˜ohïvâ°^áïspÿ h@v&?3è­¦À@¡€ ”'©ï#(PˆÎp©Jˆ±.o9©b‘QŽ£OÝÇø}°[æ¶(§!°)À9eð`1‚¯™EFøuçM5MýÉük)š[$(ÊŠþ£¥‘öMtƒ€V¼ÛÀò€øIã%,9Y¹tûÚÞDßè®@« 3´âˆ@»I£GËÑõëeçßÿGª€þÿdêÝY1ÐJ€ñŽ9Ú[ÁãùŸ \ü;ð8°žxâ1œRñûŬ®À¡ÄɧžzZNWÒÇ}MZÜm> ªx<øBÄ@Œßç$ð ŒÄ×V‰†Ð•óz MEîÙ¨[Ö7£)àu pBÉV0{„c29ç˜Li<|$ÁF·¿~U­†@úö?üðb`Ð+­4ÃÉO<®|ý#SS•™º¡ùõJ£ý­R|x!,-]šN”ICɱ¶·°;B¾­° ƒ€%Âsˆoù#m Ÿ3…1ùƒ$QÿC‘ÆÐ æäС.ƒÿñ1Ñ÷ûöí²cÇ·–Ýx¤‘(S¤{M¦)àÚT߬‹.º°cî2ü tµ ûo‹Š¦ï^³f}›dÅ]i}NSÀ7øͬÒ"€c@ë<~%|ûÒ«¦æ­ ¥D2zõ¿€ú½ ˜Ç£;â h OPQס)p&f8üTw~Ÿs»`%:ûユá/sĘ7Ì…bæ¤7½ºP²fdʰo,˜‡ÇÖžÚCJCg ´¶Ø$4>N’fÏ’zhÃëT¾ñªœA€>ÿ‘Y™’uÃuššk‚fÖÎ]W¿;âÄÅKÊ„‰† 'ó3X㽃± ¨~ï ÝÛßÙ¸fþYú3pETTttyy9]º‚à _ÍÓO/ÅçPƒ¦@@Q€æí\³¼äøæ¼fz-ÐzMˆËvðUᇅ RZ+ÒˆÙBþÔ )0`( æQê  pM1úÒ>‘?Ϲ-õ\L8Ü8]È(nv8¦wû/È} ø0©ý6ÎæÊÚOôe.™³fIÁå—Köœ9Ê$½æâþ`Lûr>½–L;´á 3§KüêþñORµõkeßÁ<ã¼¢!Ê2èRHÔða’:ÿIš9Ãû¦ÿÝ ˆrë@|€«UqO`ÐÑÿN×Ó „Â={öt:ÓçŸd†³€£€—lÛ¶Ý’žžáhGZ»ôµç?uqº×‡—,ù·0ܪ©{ä£ ¡à]À´µ25!â˜O›Í­5--öº †úâ‹íAO=õLS¯ÔT Ð:¯øGà< ¿á ØŒ¯ãx囎6pÃV¼Ñ|\³h€"…þ3P( åIêû ܆ލɧaR(}ói?°xèìo/:p)°Ô§Ñy‹4ó¿8ã­FT`8˜±¾öjríµ 3p2ªî.oõ¥_ÖKÆ|kA¾äß”ú™”®x_šO—‹Çm¾GŸ{ü ††=~ÊdI™7WBS’½kÊÑSbRã_Y)&n­\8úÿ>|VüüxhÕ5íä!`¨Åb†Ç‚<>bÖN8öfl¬­Ïæ‡6ýå/ onn*0™Z¯@?Ò@†B4…fŒ0û§°Ï÷±´µÕcŽãÿâ‹ûp|ù’%Köà÷ž'Ÿ|²e4h À”­„¹ÿ†íw€xáM“ÓxÓⱨQë;'7ì Òƒ›fŒÃ-àœ ¾ÉMsê…ØRß]€P`5úAígÏxlœ¯RY`€'M,¸¸ä‚‚ÀCo¹¨0ŽaWC?¥Ç÷•À[€¹@ï8¦ò+¸ôR|ÍÕ¿ï0ÿŒ¯¡ç  …ž½¶†F±76Hå×ßHÓÉ“b¯‡ûD°E"D1<3CBa)…rˆWç„™íy˺}·:()›?í’Ù´i“¬\±B›š=ÔøÙÕ0 á d*ÈËË•#F"-a¸Š=@D3+@†ü±gžyæwÇz¼ Æ}¾¬óñÏÇÅé=¬„ßaúÊl~¡Ä:X¼ÿôÓO;Zhõ°J]|€R€Â¥_P˜…8,f(8g‹Z/óìÿúœ¹y}£žZ0à±¾AS€v§Ô¾óO<×^0¬0U$aÜ>›2ü\ø>Åú5ÑûÉÀ§LäÕ Q©“&IÞÂ…2háEž”$͵šOÍûÔœC¯Çdò)dQ¿ÃÃÅF—Š;ÉðÿÙ¿¿-£‹~šÁm¯þð#Y€·ÁÉð‡ƒvcÇŽ•l¤]LÂXMNNVß?hð%þÜùä“O÷ÊíiéÒ%À¬_…{a°Á¡º'JѶá3½B€¿";ÁªWW3p(0 ·òP­gx[XÏDãëqÎ5†"Ã1~ÑV ˜tР)0(p®ñ'á™é{\ d¡kŸÕ{Q9¦s ìàöéKh}Mr¡¡ÿR€ZŽm q ”L ×€QßSÀü¾û.‰ÍÏW¾ÞŠ› $m´×îÞǃ; (-¿›ÛoE_ãÕ?i˱SháL`Ê7ÕÖɦ÷Þ“2”m… ¼¯ ::Jrrr$==£uĈ­II‰6›íu0Øßêižþ¹\;×=  ïåYI«ðZm@­oAðÚSO=¥Ý³ü°è5ˆD¿QwÞ!£ïºKEøgP:¨óÃæµÓ{ˆˆÁ”†ååb=~ܵ­á[$µH”‘!qƒ %uÒd ‚‰~MI‰ÏâG455™***‚KÐæöíÛ‡ Ke×€.%Z?ùÉó¡õõO¢ ñ< ¯4­ÌàÁ÷]BCC>Y¾|­·4h d~ÿdìc°á=kÂ' 8Ж7ÔþÀxF4ú=´ ß?B}DkÐF‹5þý‚t¼ Ǩl»qû¹ØÕÐÿ(Àõ™[?ÎzM&éÓ§ËÈ;î@„ÿk$,>^˜òMkýAu gQ úÀ ®¬‘Ú|g€ãvj¥!6VBÀø‡'&HÒØ1’2~ÆV£ÔB€ „Kή÷ð1˜ðÓ_:88Hfê8 Å‚€Å‹çÛlöoãøã¸4l]Ü$ÎxØ×QMæ3ÎûlýúµÀ;t¾ŽÇi À±iÇÜ߈*;2˜Ö8œ 7oVßÛ¹CÏ œ;RßiPàRô‘š;÷Ù €{T]À„ÈÕ+Mþ‰á7Ý ­ðSC?¢Àtôõ߀·3€Þ™#Àá„!Ú|áUWÊø”„‘#T*:_úkãÞ4ô ÀÀÖ"áÈZ+—Ɖ@ €*Dç·A¸ÄñÄ(|ÁV«D¤¤Hêĉ[X õ§N)ô‘ ‰ó]iÒÅ@ ‰iV| Ø ´ÿüç?·¶´4ÓÚæ.`Ð<Û ½r‚‚‚7®^½æ~kÐp¤À*ü ðŠóÇ5߸úv!€?Æ,ºàu0á訴Èù¥×[Ô h ø€ÞYÜù ãº M¤ÃØ/Ì„4ã9à“!#ýcÞ ‡äeàÍǰ«¡Q }åó{8 ô<€3Ã;wÞ<™ðýï«‘È=¯íëïyz ™ úÀ~ ©FxŒ#§€ã­Ô#dc\\[¶°(_t+ AzÃhéK›2Yب=^*Ͱ(@”}§Õyø ç ò €ÙÀ’1cÆ4Ü‹ýÛ€ô`”¥æcËsA,—ÍPa5kúúuëÖëÔ.ÉtΞøw¾HK?jÄévC+ÀP ´·æá˃ûCNTå]Äû]<Ô )Я) ^Þ~}ºóšC/PÃDè,ÍMÅ8A÷¤`€±qÀiÚéÕ1œ4fŒäΟ¯Ìý™Ú¯©ªJš8õè¡!@(`‚Áq“5–‡•™¿«n™ÁìÛPÒÔI Ä€’ ,¢sseØ 7HÆŒ²çÈwß•:XøÈ…ë.º܆‚ó0p´î—AÁ`k=Èb•F¶ulÂçùddÆ"€Á¨³ÇC±?Èmwá¢àà7Qø/ݽ@—;§(À@xtóû+0šw޵A9c,$ޝÀ=…âÞ WGΗ[yÏ4ú3¼ºØëÏ„Ñ}×èÎÇ54ï¤Ê…Òðö~qI}Ú.”Šß üÇônÿ 55ô3~ø0Ð+iÆP¯‚ИI›:UÆ?ô‚üKPh¨ØiIªAS {hE€ˆ²ó}—¬ p#üÿ `29ÑìÓìŸ ƒ•@ò¸±*F@K]½Ô•–ªÌʰ¹{ÝêK)S^^nÔìÙ³GÇÇLJ´´´PÙØ-SÏr;€ÿ „O²yiK‹ý •ï,^üü[ Ì_ùÄO¾tH÷´E´ò2~üx:t¨ÔSÐ@¡…«¸ÿê<¿»ŸY,æm™:u:>Ë݃§žúÒµK—.þ¶ÉhîûØÆuqu¨Åb*F-è‚PçøiZÎ.Ò’ÌØñÆöÆ­…U8Zç ”{ 4ëþø˜ŽƒÚÇMëæ4rqG›ÛïÊÝý«û5€ùoÂ*ÓQ=u7t ð@¿¾±s¯ó±¸ejûiòŸ ôšð×,yÜ8É¿t‘^Ž&Áع!“£AS 70KãéÓ¼}‡>ˆñÖ ;uZ¶œ8)I](ñ“&€!Á¿òÀîÁŒv”Bªƒe׫¯É+¤¡ì$XÍî/îÁÙ‰°8˜=û|IAf‚¤½tíï äv„5¹ å—Ý~û¥®Êwçøü\TK‹í7­­¦o)VÍÍExmW„……\õýï?†È‹4ÜRKåpžQŠ0Þ (k4â›­_Ãýq=š¼Ò7ÍêV4¼G¯-½×e]³¦@ÀRàzÆxV bwú³„ ÌX6Þ{±sИãzØ…î1VŸ]¶7»#YEsdÔwˆ5=MÈP1øšfþ½Iõ^7¸P;òÊϾê÷VJưB‰Š‰› _('`Fù 0ëµ;vJ®“`‰¥“NJŸyÈÞܬ„U–Ð0‰Í/@ÌŠ%»¸Hvüõor|óf´Ò&xæ•Ýÿ…L£F’¤Álì"-JJJdÿþýþóŸËö´¶Ú]K ºÙ…­[?«:tì;˜¢â·V˜ÄòêêrQN=ë&}Ïáb”°-¾¼tÀÊÀyvH¢ø{€@^Ö G oàÄNƒ¦€¦€ç(@Ép«Ã,ÁT€ýr²ã_¬u Ë&ì3u•£@Àá´Þ @ ä OW/Òäßkwá…2 ÓÐ뮕Xø5Û›Áø;ó¿öZtÅ‘f0ðU[¿–cï.—jøæçÊ“0Äp „†…Ë¡}ä$,ìµu;v´[­Ý·&³I(°¦¥IÚ´ó È—zX0s…ôÒ¢eìØ1Œ”ÈÈHAà?—·a%Myy¹lܸɴvíÚ\X Cá >ÍÊ%«W& [·n—yóæ…ÿ Ô3è0…½„@€GÜÒç4(ðö©õŸäú‡ñƒšÍm)0ñ³ÿnÂ7 ÃÞìw¡{¬)p&´àLzè_š}¥ÀT`¨›B0ûõ»wŒŒ»äÞ Åì‘t½Z5Jêm P€Úúú3µ5ÿ9@¯AÜàÁ`ú¯“Ñwß-Éðõÿ%-nÌš½Ö]ñ€£€Éb––ê9¹n½œúà#i†>5-Uâ½ß•U‰áçÔ¹š@IDATK_U]-eph>].‘¸ž‹× 'L;ÊRÀøLH@:Ò†"Ã@]é iAúÊžZÄ àà8¸Ç 2Ø­é?$ïï£>’¯¾úJÅ À¡Làl ßg˜å÷ø$°Ø#XµjUCqqñt\D&×;Tã]nÄé kÖ¬ý²G èÂç:Ö‚@ÎC[Hâ)MØ¡R¤ßúNÞñwEû¾Þh ô[ @(§AS@SÀƒ`^\B&~÷~a–«êÄüSÒ}  †À§µü¤É¿U)Îö‚¡ÁdôôI?øŒüö¢–¨ÿV.õ4h x„&i8Q&UÛwJ 4ùf** ïL ÓoF@nmÈ`óÌm¬š++åøû«” àÌ«º÷K¹° .!ŒHL”a7Ý$çÿò2øê«Åš‘+î;·Â ¡°°P1÷îÔþïÞ½[¾þú©Dÿ€]¤pïQàMÀB`àóÏ7qnÚÕ~‘Kž dD{¦3:У†tás™‹qóK†â k‹ÓýqvÀ bÜŸ§¶†!4ô{ èýþê0 |ŒþÐt>ƒýâdçruÅdþÑ8Í*`×ÿ ü^ÛOý·P€ ?]P(°a ¯µ²)©2âÖ[${î\‰ÎÌC¦«AÖ¼Ò!]逦ÓñU}óЀ~ÿuµLÏ×*0ä î× Wjö«kk娱ãR AAyyÊÕIÎE„Ký¡ÃÒxꔄ$ +˜ùÞ€ÒöCÀ`E]\&<ò=ÉÁøßùÊËrü“O¤–Œ!à ÈÔçååJ,˜öϰTè\ž‚:XlذA¹t>ßþ;Û€Ó€Ëk€K€]ÂøñSìK–,NBÁ®¦(j=³º¬PÐpNÿÀaÆ ú)V+t +‡ô)®¿¬‹ÐgÆ20Ìÿù“ï™M~O-è÷Pß@€Q€X2_j~Ãêª;=×qˆ ŽZcõŠŸòŸÀj| GÉø?ä"Ëkã-Ø%ù—-’<¤KËœ5K1<ÚÜ×à ˜Àl×@Ô2û0‘i.9V*UÕUJpéþjjj¥ZòÊÊ*eVOÍ?ËÉt“Å¥¡áX‰Ä ¦,zÝY0ç°?Ap H™2'[lЈ›CÚLíêå£7‚ñ¯¦¼A1údúé@PL¿q=·à2š¡q·`̺2»w,Þ}Ž{(Ìzæ"fê¤I²÷­·dï›oI5,šëÎdô ó…ÜõïMþ·"è¡»ô€Nú8Çø ˜ œ\¤5š£é2~¶ÁÓO?U»dÉ9¸…“è¯×¬‰Ü¶¬O$ Е~ ÒàT»  åíoHx{ÿak°«AS ÿR@ úï³Ó=< PÂMm,œ$,óæÏµœ@À¨­[¾ÂÏÀ'Ì?‹OX=Õ½qB¡8ömà%ÀÁNÎ{ì… ÎÜ92ò®»$ ÁÔèûOSgwŒŒÇ×ÛCl‡¾0AÿlÐô+KháKKË:~è,¦ßj§ÁHXäˆ8œêó®áN`‚ iýFÜz«²ŒÙõêkrxÍ©;~\ÅÅÂùôôt FZLwï ïcçÎ0ý? ÉÉv»›´þ™¤0€‚€5Àw€[gÀóÏ/͆Ф°k‰0™Ì[θXÿÐèh¡ò-àKÀ`«ƒ%@À °NâRI -°¥PMƒ¦À€ € ˆÇ¨o"(ðú@m¬53fLˆˆ@Ôç ²w×å×iœô÷Ö óOÓ6{Õß}Óí»¥@"Î.Þ œå¶¤N¦M*ƒ¯½F2¦M“H¤Ck‚ÖÕŸ³šÔUh tP€ vhr’GE«l—`hû©1ï Úʘ%QüÝ1ß]Õãî¼ /Ä IþPr.˜+ÛÿòW9†øQ8 í(º2ë'ó_ÌÇŽC Ã>ÅÝ‹F_çG k€·°¨ ¹Ùb±˜+‘3[ØÑJ6Mƒ¦€g(°Õ\|HË’€à 1^ -´0 DÐ00( ã9ê»ð/¡ù{»0uêä°Ä¤‰O”à9z´|²q£c¿ícBS“.:`¬þàæ.à»~ë”n¸+ Ð1ø$㋯5+S²‹Šdèõ7HìV‹x7ZÛã°<3d$Œ!‡` P,¹ ØpÞPã_UU£|ÿ]•éáñ4”¿ HAÀtà?o«à-‘æöÝŸ&&hö¬ASÀSØŒŠ8‡½dÌ$®Gèq^×=\à+ƒõ[-æ¾v UçƒÀÕÀ@ šýšxç4h h ôcqíïÒÐáCãÒ33"bcãóO-ËÐaÄÖþ'Ì?U¯jæßßÇuûØ¥}Ñ5ã: ×RÆhâ¨Q2å±ÇdüÃß•häNoili¡™×OHŸñ‚¬‘’T4["  Ç(ŒYº°ÄMš(Áñ œï}0âÐ*À"9—^*Ón¼ABÑwÄ€‡ˆpôèQwÅzsŽ‚Ã«,B`¿Ûºa=Á9í“Çò4¶4kÐè¯Ð€þúät¿ÿN`¡ÒÐà˜çÏ» þ©ÑQ1Ì?WÄ<äŽÞ…O¥ åkÀÚ‰¬†£&öÜ*_<Íñ4¡K €?Rui|«=Îü[࢒sá|É?~Ë(æÔfhýѰÏQÀ pcy¹JK#ä¨gz»k¶=×¥€¯‰fõA SÆ¥‹Ä,¥+ß—¦Ó§‘ ÄeP?{S³˜CC$2/WR^$Ö¼<ÿ³ðÝo ’PDö§À-¿³gMæŸQÿ$Ð`ʽô`"†pèÖ­[[ÍfÄ+@pD¶IëCXíÐît«Å“Ìÿ³Ï>“`6M³?¹¥¥©Ðd >sc*Ú¬a(P§DŽÑ--xûU­­f2‹k/^²± 6<ùä“Gð[Cÿ§ÀÜÂ…ÀÎB¦ì°ªôõmBë/KŸ^ ,“¦¦©~⇖ž{ÑQFËÏ€´ªÑ )Ð/)Ð 1z¿¼/ÝiMoSà§h Ø±‘+®¼4Çd²˜ÚddúE÷‰qðgÝ»gÚw¼Ö›ûN˜ 8éžÚ›ýÐuw‹\ôÎþHë jF¼¶¢¦ȵ×ÊØ”„ÁC°‡¤ÈÆ5¸SÜáÀ«¯Ë1ø„3¢½Aá,‘Ѓ±U":7:p*´ ûDhb¢[ackUB2ú´h…Ÿ?Ò(«ZV˜ƒÌ’8sºäÜ|£DÚf1àk ôÅÆ>ýBà}s¯A¼€>tU}Çñ&XAœR—¥Ì™S¼oõê5 ª†~N ôÿ 5ê*å$_=>mï]¿0^¼é{î½W®¾æ•i$qœÂÂCð¹6‡}ñÅ*N àø-n3è­¦@¢€ô§§¥û(¸¹Ø19-¸p~&"<[’“R°Æ3+¿3óÏߌÐËr¢´ÃõÍ«÷ä„ùçd{p§WÖ•÷†¹¸è»ÀG€S€^ó3 “¬¹Å2é?ì9ÅóšK;ÓN¢<@ ¸úü 9üöÛrdÙ2©„5P òÛ!¿=AP( Ÿ b㻊T{VXR13@Xz*üûÃÄÖØ$Aˆ°Oᕵ @Λ"é—_*Y7\+á4s§Ù?®õ˜Ðvô¡C fÛ• €ÏýtE…ìØ½[*`Ýàmh†À¤ÁÍŽ 5"ÓVVV+™âãã貆n·.}üñ'6ö¶/¿ùÍ/-ç7c˜õ‡aá@m)ͽó“ß1ö  ZC¥Ô𠚦M›ýÍúõkµÔ²D À¢ä,ã3ÒÕ¯³_„IIIò÷W^éˆÙálâ9Å&D—•2ïݳÖ* 8~)¬ç;rLÑ4ú´ =,ÝÕ€ ÌåßïÎØ±cÒ3Ó"ã‘® æÔÎ4ÿŽÂ€DL0ÇJJÔÌËwÔÙìŸþÿ\„iæßË„ïaõ±(?¸x;°Ã­û‡„Q#eôÝwɈ[n‘ÄáÃÕx¥™µïQ€Zê–Ú0ÿÿ”c«VCC “k0aßl“ hb¹ÚeÀ833ø‹+ÎÈL«÷(Ñ·šÀ$YY‰•±cFK"|ücÇ•´‹HÊs$~Êd‰ÌÉi×>ôùwvg­PYÑŽ‚ ÈM_8g˜av|4ÒªRÚa5 rÎ*õð1¦%PRrLJKÛÃÂÂö¤§§½¸|ù{'zÓÜ /¼QSSw'®}Hk3Oë˜3±ßàëA  fÁónèœ9sv­^½ºW}íKGôµ¥@j{ØY†®>‰mÍEe¿ý¯ÿ’ÉS(ÿà}jÓÒ“Ã>ÿôsx •ÃäHÇálà+ÀF M~CO}ûÍ ëŽj ôdÌþ Œ4êÈÈȈœ8yB| |þ#""ÛXÌqAç ym4Yû÷íSeŒº<¹?Ñ™ù?‰ú¹ÛçÉvt]}¢ÍýPèàÓ@¦ëòD¦¥Iî¼y2á‘ï©­¾¿60¡„^kSWÜFZ\ÿð#9üÏw¤öÐaø´+%—òaoBL€S[¶àø!eªnp€BZð¢¡ømm°O·€D÷ƒ¯.ÓZ@gefOºíȵ˜ÁøG!²0¬=\¹˜p3%E¢o¸Ab‡f¤ÜlFù|(’‚€ªªJ)+;ÙºmÛöº+VãØ.܃Ÿu›[ºtÉev»íYhýÂu4ß÷æ:3õÃõN’aiPR\\|n}vY@üCWBŸ¸Ì:ÿ|ùéÏ~¦¾ËŽ·Ïï°Õ…4žÍ2¨ Ϻâ½÷«ðng®gÿ4ŽaWƒ¦@`SÀ›æÀ¾sÝ;MžS€øã2H…--\!±±qj±n0ý,cì;.âc!XÜSª\âù”Oœ\1ÿŒ¾ë­ß)NEiûé{9°C¨äéž‘‘ŒEòqß}H†Þp½Xiž¯ OßO«ÁêêŸ#`þK×­WiéôÍc¯ß‚SŸ}.0WÖ!ΰ À –ÃÖ`òùµ#‚‰¦ß¡‡ÒŠ@{AM3{º¸¸ØP¶23S¬CKvQ‘D@ Ыº‰}`lL1Ø"(ˆœ„…ìÒôÙåM<÷Ü’0à×cŽû%ÊM¦þØõ*ð[:2Š(´ý9Þ÷¡ðêíœó•ûE`µZåm¸fQ9ã ¸vc<€ææF<¤ B#+‹3VÏ à»ü¡AS ?P@ úÃSÒ}  ü/t‚~‡põ5W儇˜’’’³ÏƒÏ­ÎŽñÒ³@‚fþ=HL/Uuê½øC Ùä >»žƒ ˜ûÖ2æî»%}Ú4áojO£äÀ„z®E]Sg ÐÜ¿dÕ*9òö;Bm¿ÒR;jôÿ§P¦j÷9ýåWbk¨G¤û`Už:>€#Ñœìàx&Óo‚°AÐæ«@…κŽçÞl”ªÜ\á´) dòøñ’5s&²„Js» ÀÇÙ9h¦Bû @~³ðá#@š?ÿk‚ÃçŸ.Zÿ±û(ZÀp Ô .(þrÕ*-ðÇð`›†àJÔ©Ì¥0à¼à¿~ÿ{™={¶Ë[0Öqñq Òbo6EGÇDnþd3c0;|76ôVS ) üttß…·¢#w;˜´E—.ÊŠŒ ·$'§ªÅš19°Ãƾ±å±Î@ 1Zž£ÄKç"=þ ²z0Gí‡aö Ç•é ¼A.¦/þ¸hhý;ÆŽyÈ,fÍ–QwÝ)#n¾Y¬Ð,j­¿GHÛ£JÈìWíÝ«LÿOmÚ$AÐ2u*^4¾å[¿–ª]»Õ÷„ߊ ¼ ‚É»cWõéóþ£@«ßy|˜£Ž ¿ñxŽNÇY¶:;GìpÍ¡€Î»ŒéÓ%eÜ8˜·(‹„ƾŠ€¾R‹ÏA› ¤|4šOúÛS Ðú›ßüï¤ü>‚ßÞ‚ß@‰› Ò|å•¿nøÉO~î¯~èv=C ÞR@+Jð=îpùWÈ’çžc.ÁˆãÄô™q1ql©(¯ Ú³g£y…eŸ™@ƒ¦@@S@ úñèÎ&¡4iìxWfÌšžš––Jæ?˜é»³ÏmW`˜ÿr‹hË’ž‘!ÀFÍl/­’ù?åp9÷éóÀá˜Þõ8Hf ¤ ‰‹éŽñ„}BL^ž^}•Lyâ I1BÌc>d;4ÿuÈf`ãótñ,©ýç¼’:q¢d">€ )›ëjU@Ç2dp<„ác233šÜ¤8tAÛO0þÙdjýICCós[^±Ù V?úècL›6ã‹gŸ}öã‹/^øAK‹ýC í娃¦3™@ ºúŽò|ºÍÖ¸ ©a_Cÿ§E/: èÐkøï?üAæ^pA—×ë:ƒù7~ÇÆÆK‚Š^¹b] `Æ(Ž×•ƽÕ4 h@ =ÝŸ@¡ÀÃèÈ5޹öº«s"Â#L)ÉäåÚÀ˜Œ­qÜÙÖÐúç: R Zž2ädî8aþi.GÍ¿fþ»C@ï”áB•Zÿ?Nò;Û—u .wáII’=w.´þß•‚Ë.“Ph…•¹¿ Ây-ú¨§)`AÎè²MŸÈÁ¼©Òþ1­_Ÿœ]Zjk…Õ{÷‰Ze;L̃Á4E¢ ýÜûLfV@A/žIä±cV]-´p |¶8Q+-Ûy®è¸†×£>f``Ȭٳ%iÌimishÆØð…»5§ ^d4h™®kœÿÜAûý°µú¿B\ÌGrs½sÿýîûàƒõÍo¼±S–/_¡4¨ø­ªZ±bE3øÊùó/>b2Y–Ûí-Ûq"ÈïkWÿ›’óÎÿÑl04³]]£Ï6JнO—9ÏrÔ1ð³gð½GbwÀXß9ÛÆ"@SKƒ):6&ò³ÍŸU;Ô7 û{»Žé]M€¡€Ì£Ð ŒE_^ÒÜQÁÜysÓ‚ÒÒ2ÈѺ1õtµè1®åÖXÐufú³Þü‚ɇ6÷›¯¿v¼ü¬}L|}þ)}^ä„£Á?à¢äFàÓÀÛ€±@®ë=ô%ÊΖ±÷Þ##nºI¢óòT*4_,þ=~3¬B¦ýk8~¾ÿïɱ+ø/Ò£ÒZ ü«¯¤Ì¥ÝfÇ1‹„DG©‚Ú- @öV¼«Aûö‹•<7W@íb ;%ITþ eÝáò9²^lA@@¦õÌ?ñÁ ^ škj¼* ºn#F ‡ÕZˆ ] «[RÇ9Ça®d¡¿!Pàýee§Þ~þùª_ýu÷RƒöZßEëªU+[Ý?È·So.Ne! q¦Ö°°¨—W­ZÕì®”>ׯ(p½ýx ë³^ ®½î:ùÏßþ¶c]†zÜ×zµÿÆo®Ûb¢b$4ŒAË-ûöí§yã³H ¦zB}4úL-è3 uŒô÷È€G † ;zô(kjJš„!ðKwÁ`úòŽÌ¾±Ïsœ@ø›ïºë.2t¨üùO2.;kë„ùg°™E@jW4ø‡t¹øpŒ7»@sð‚Ë/—ÑHí—…À`! GópÅ,`ið/ø|Žø±|íui®¬Tû¼Ñ#åR€ç]‡,"å6"Å ¥´>Ññ¼AòÕi‚š›ìIåW[¥ìµ7$#=Í-Ãa1™å4žå¾Ï¶¨Àá(Ï,.¡ý]§é?‰Ã†©ø¡° àoZÐRÀÓ™™!—\r‰„@ÐÕæßf³W@P°4))åÇ?üðÁM›6öJ#¿jÕÛå—_z¨¡¡&à&¸u-Mi»épXǬ_³fÍaOÓ@×çW ìGë;€Tx‡¡ 3_·Ü¦L*¯¾þºr¹ÄµÝ Ü!ß®ßRÓ“C?ÝüiCUUµ!£R€®€vKàÕ­éBš _ ššÿ¢À°;Øøe ¾èâ ShæEì.82ÿŽûÆõÆ1n‰\|ñÅ’mÎܹsíõ vLhH u&´3ÿ4õ7ªg«q@o}Jx´6øŸÀË€Ý$(Ü#À8ɘ5 ¾þ·ÊøP?j]j {T¹.ì Ð'¿=Ž¼óŽœøèc Ž‚%²—AÅÀ8¨Þ½[ªvîl‹okQÌcˆÑ>—È|Gõ]7Kí¾²méó ßý¬Ül±P(àèÞaÃsÛõÅ©GÐG¤™kþ ¥£-BS»Ö?ý¼©H8 î"Ab‡o~3„Œà)¸ÂGº« ‘«zƒp¯••U-»wïÞò§?ýéׯ¼òr)»éª|wŽ/[¶¼uöìÙ'0gNFùœ.® 7›[ß[½zí¶.ÊéÓý{ÐeZ0â¾!h‚DÈ­†&Vs+Þ_â $ë Ú~cÌ;ûe–ú†:ÉÉͱ®zu%˶×|‘ß5è­¦@ P@ á)è> îEGÎðû¿áÆk³ña7QûßèÌè ?ë2ö¹4i|*Êœ9sl‡‘ò‹€éÆ¥Åp:ê„Ì¿1³ÔbŸýý¨Á·àc|ø`Ðõê'û‘ å/Z$“¾ÿˆ¤M™"dú|ô«/Ý?'®¥FžÑÚ¯['^}M fº›ö¯Ï"É1Ñ&AkÂ"€nôwXö¹9]{ ¨÷Œ÷±·þ)'Þ_%A`8 ó‘6Öõ'¢¹@ØûÒ2©>yJš€ÖÁ…þá_̄ˆ9Ш®üdÍ)–Ä‘#•²­±Iš„°¯.BƒÑŸ)øþ n—ikÉ$­[·Öüá‡fUVVŽCÇÉü×é'mö Ö®][Y\\4Oì¢ðƒ¦Í°ø¸‹rútÿ¤À6t›¦õÅ@Pø½aü£" _"´S!ÀÕ×^+÷ÞwŠô×|îöãBb¢c ŒsuuMо½û(ð"pQ8¸ ÈþjÐð;´Àï@w (@¿ÿ¿‘© àó7jôˆÈôÔ í¥ß¿±¸cÜ7~ûÜFÃW÷þûï——_~¹é©§ž¢‰$-ÔìsËIƒRí 'cC{ÎÛ€€|Gªï¨Ézøp°C`„}BdZš ¿éf¸™³f ƒËÑä_CRï25îe›6Ê^Äï æßìFÛëí; šP k¢ŠíÛ¥©¼BY'X0†‚!0Y0lQo÷ç\«Ÿ‚–Òå+äÔÇ„ š›%; Íq_˜õ¥¡±AÊÊNʇeÏž½RŽgÕŒ÷œÙ,¨'¹hVÏÆ#& €Â€ìË„ûPhlL› €1è2ÐHGL‚±cÇI2\Ü¥ýã¼V!Ã+¯¼b0ÿŽ­ Á‹œs¹NI ¹Ú'óO(**ÎF3ó±®8ÿcF_Ößwß+ŸÖG¨aš•É@®™h9Éúß+€È³õ˯¾²:Ô<V1=Î ¿3óÇ2~Y‚‚%95!tëW[+**I›ý™ ü c_ƒ¦€_) ~%¿n<@(ð{ôƒ ÐÒ_réÂ䄸Äùý×sËE±å¾#Ç9QÜ@n{÷îµÃ¯ò°º ?¶i¶8¨¤ÚØÌ?5'7×5ø†üN2¯ïãÀŸù\B^aþÃ`.œ>cšLüÁdÄ­·¨ v˜öjÍ-(ÀÀ´¾ô„2÷·4K3˜ õÞ·kwýÑu ÈVïÙÜ­´¿taÚ@Æ'P_)-ðì£Á÷ÞÞÔ(Ÿo‘ê»” …$ŽŽ‰’ÄÄ©ó}÷ìÞ+;wí–íÛwɤt}—™) – Î ‚ÉââÙ8Õ6ŸaǘdÙ²wåøñã.Î;=œŠ£s€yÀ( çÃc@—P\\4'¹,Ðv‚õ¼ÓM7~øæ›oQ¸ aàSàmÜâx ×v[ÛF)އÓeeeÌL!°º §µJw 3sßß|¯££ène7765…ìÞµ‡‚_øiÀwÎ_8œÐ )àm toô{»º~MßS€cÿ `‚ÑôÈ‘Ãc'MždÍHÏ”ð0Ã2Ñ8{æÖ墋¬v`gXPP ×]wÜrË-å«V­"sOØ$³Ùy¡rÇV×uðÁÀ \`R8t#0è5Hž0^™úð‰ª”nµq^ëHWLFšî¾÷žÔ<(ÈŠ "ì;jLýÝÿöwß!éh¼ç cÇ ó²1j:»‘ÁÂ9ÃGß]Vm£ŒP¹k§ê“²R€–74.À¬øƒF}m“c³¡ä˜œÞ¸‰<·b¼ ¿WsGç6ì3<;KÒF=“Îzû›¶ K…S ð‰NGnôp¸'…‡I‚öa¾Q¹¹yÂ|çd~œ]Ú< ›ƒ‚Ž^@®¡ 5HK+ºPSzÌ™SücÌ=ëÄÙ^þîwÖBó³é2¼†›£€ã ƒ]Á7ø;x 0bûöí ñññS§NíR¨Ï÷Õ‘ágmÝý„X|/bãbB¾úrk#bcÐ"Àv¹ÆøhÐð´ÀT×mžC'øVs0ËU×\™šŸ ñq‰.9FyÇ­± sÜûË%@³Ëˆÿ¿úÕ¯êÿã?þƒæŽ2öWÏ\uñŒ_S`8\ d ¿Q@w&¦8Ý{ÇXÈž;W&?ö|þg¨Tm6˜ücðõ¾Òx%™2*U0›þú'?E ½O¤fß~ Cz´P Z2H}¥!Œ|†dø¸1Yb† Uæöthª¬l‹€ûröèkóݺ}$Ýh±P -u5üµ› œ°74"m`´#u ‡Ý¢¤óBxþ¤oåW[•àª7Ϲ¥ºF2¯¹F¬C ”%‰§Ÿ‡êúÙÂø—)&¨´*6,áž ,ZÂÃeĈ‘0ÿÏF\›xŠ‘ÿ÷ï? -½V‚R :˜Ä@”R`GÄÂçž{>ýX€c@wPƒ{ü髯¾Vòâ‹/º+§Ï < ¼†[úyø% .ZÞ{ï½êÉ“'GBâéþžîG"@SSâäXW¯Z[éðÅ£UºÁ¬wߺ>«)à h€wèªk l £{ é°\ÃuYÐdÎÊÈéX”;|¨Ï¸ÇÅœã> 9þæ¾#ÒÜìÖ[o•¯¿þÚ~ÓM7m¯Ÿ|¸³ý·Þø‡V4{5ðû@ c81{0.↠‘±÷ß'ƒ¯ºJbòò”ÆXGøwNn2÷dš÷¾ô’œþâ 1A{]?ã“›?•Æ“'ajŸ†€v||xÿI{çLK BàÃÍø‘ð¡Æ‚il¹à‚¹áv»|÷fzˆù÷­ùóçGY çöà–?nu¸uNšÝMȾT…XL1 ˆÁ5ô”éï\ž©kkkA#Ñúé§ŸSaÀì| äØÖ )àS h€OÉ­ Pêú`ÇâaæÌéIÆ ËÉΓ`˜nöœ1þF=†þþŽõŒ3Œ \Mý¸Ü(«·>§ø 5þÏiàv1€ó½†ˆ”d‚|Äc¾óÉ7O¥ùâ"[ƒs i²ÁwžŒÿîßý¾-=Ž‘f6˜0WíÝ+§>ýL2£[€% djI€[k…}¯ÙÇø1£%"5U1Xd¼  …ƒ_Ó‚^ô¯?Q K‹]mÙ  6[‚”•…JA a††nR Of€Åd`hDš?åzÑË•À´Î¹ñ‰7c>Ìû@” Í`Œ¶À|?‚ª´©S$,3Sâc¢e RºQþ«»jnn’Õ«WI^„Ô5Èot!°föìóÂb‘+=Ê`,óÞzäé§Ÿ~ž¿5h 8P€\àP¦ô{ÿý÷ë¡q°3CϺuõ›ßÖ0¸•šƒÌæc%ÇåXÉ1ã%á@äšT/HH >£€øŒÔº¡¡ÀïÐÓA˜ä‡.ºlaB "þSJëŽL½qÜñ˜±ï¸5öYžûÆïÑÐþ1èßE]TzðàAjý ÿþ\íé?¾¦Íþ¨6¾ÈÌ #€œ=L»•<~<´þ÷Ëðo}KEû'Ó§µ«]ï5å;~óD¯?ÒÁ$ÚTŰ@[zú«/åô–-`ª#%<5¥­…Š!ƒm*9©¨Â‰1AÞ’`n£r²7ž>­zkÜ›?º®²@Û\sè®4œ<…Ô• º†Äǵ}ϺâýÑñ@lÏ< ‚ž`XRÔ8$M'ÊÐKÌ nÆ%BŒw‘ºðBI]0_B ß ŸÇ)þ3&¿M‰p_I…;ˆé-Ínž;#ªóÍ×òå—_º´èÃ=𛜅ã.\`µZ#à[­¾Õ®`º^X½zõ§}h×å¥÷Þ{OÐ¥—. ž7oA|qñ\sqqQʬYSƒÏ?NÆÜ¹s`¥0'jÕªÕu.+Ð'üM÷Ðó€§N²íر£–nƒ:2ü½Ù Å»a—ôŒÔð o¨mll2$ª‘èÇHà›@ š>£€øŒÔº¡ Àèͼ;àŽoßš•dJOËè8æjÇ`æyÞØï¼5Îñ¸Œ |ýõ×Ë3ÏéÇV¯–¯¾k hBï™)0&ö渜’2¤^«Þ·_ÂñÎ…¶3¬m W»JÖñzì“Áb¡%µ€iŠ:D¢ò!øÌíñ›Bšà«¸,ë@»Ôü“ dl€Úƒ‡¤á4ÝèÊ w‹(¥ýòG×ú_›­Âgm…‹4Õ¥¥¦ÏãÌÑþÉló|h"bÐ@óž}Ãõ¸.ÖtæØCŸš` ÷8X1ØñÝrœç^ é ÷ª‡dr¼!`ú3M!3ÚmePB HxÖû}”}uÍšÕÛ<Õ—¥KŸŸ;÷‚ÜÙ³‹fY­‘WBÀð°Íf¿¬µÕ~Úÿ¶Ùt7,.Å ~9pLQQÑÔ9sæD e¡uÆŒi ëׯ7´¾žê’®§oX‰Ëñ¬ÄºsçÎFdŠDv&§ëg ?›v<ÞßQÖh©«ClìLëGn¨ä5íƒm)1 4h ø„N»OZÖh ø–4íþ°csÙ—fäæååæä÷(å_çnsD0~ÇóŒû-h|?úè#Û}÷ÝWÒ~Ž>`DÔ:–Õû>¡KÑÇÿ IÁfÜ{=gŽbü ¯¸\"á«NÆ_iýÛÇŒ÷Zîç5“>XÔו”ȶ_þ»Ò»Ôœ¢¬zÉDA[JK6ª v‘™ë ¼‚€  úÌ´´`ßuÜÈ™•¥„EìkCYY[AL—/îô¦ ¢ ¾ÝÕ`ù,( JSI†¶`éâIÀgÞ‚ÈúŒý–·k¤A€Â*‹Æéh†ëJüÄ ’ïDrñl”MâðWï@-xï4ß+Ôkðvë¼hNÛã<÷Í7ßÈœž÷ÔA NŸ>eb¬'JMMMÍMÍÍͰ0A#…V [¼[­sšÖß®Y³Æ˜s{Õ…_\^\\4Ì<Ç™žE „GQÑõøÞ\€íàvÌÆ6HwZ*ä'¶¡ý:lÇYÆÍ4wp“¨Á1 þ§@#ºððJ`Ð;ï¼S}á…Æfffž5ÈÉèþîìw¾†¿£¢¢¥¹¥ ò#SèλŒ5 Ûœ\4”DØÕ )à= œ5нה®YSÀo  k5ÌŸ˜F]}íU‰9Y¹êƒL­…#òãîê·qÎqÛyŸ¿‰˜P$Z³áÇ„o$U#DjW¨Žè?¾¢Íýǹ8ão¯A<ÒùeÍ)–‘·Ý¦¢Õ·Ð/¶}áµFPÅ*í¨íùãe÷ÿû‚ÑEtûîÈ”*æ l8|îs.¹DÒæÎQU€5yOKÙí~vä¸@_)¨ eÀ©/¶HÙæOä$¬*¶oWL¶%8¤£¸¿v(¬° V$À%qâDd7¬,Zt‹®ŸŠ&À¶†zi„9=£ë7@ Â@´´ƒÛ A¡‰‰ðÁ‡å¸‹`{]·âá›q;wJÜkìж; ßðÏþ³ìBü_‚¶¦§§×¤¤$U:<Ý£ÇÇfkYöôÓÏP»Û+xñŇÂD{(„ ßÃ<~>*!“ß—õ² ÿ‡PÍï W{é‰'žáo þ§ÀÍ耦”””௾ú*AÏè•ãZB¨žüfÙÎ×”?*;wl—_þâßK÷ï?ˆ¾ö`o^Ç/½£)àE h /WW0x=™iôÚ ómwÜœžœœ*ÉI)Æa—[¥]l?kìwÞò49â(øO¤Lùý>|ØðûEÿO{uzã ä ™ÇßN:_ÉâD_)ÔÒ§M“)O<  â{$‚ØáÑkæ¿û¤3Lí8µÎÛþý× ]Û»ÕÝ Ô» zSÐRU-'$°¾ÉÁx6áIÉ`X0m nNÅÀ½G $1ƒ‡¨ì¡11*‚ŠÀï Îû h ÀçR{è°Ô@ÓÛPzî ˆ`‚ C\[·ô8wùxH;ÆXIˆWY!¢†V.ÙYÊ­B¹¼À•% ¾s1p 0ÎØ[šeßÑ9Ž,¾0ç&äV--=¶}ûŽò½{÷TDFF” <ø{ï¼³ìXoú²xñâ¡°rY‚k9_ÌÆûÂüãrÁ‹kBàaóñšL€kÀ>X(æI ~¥À—h}0î%v¸´^}õÕápçè蔡Ðá–Гßή‰Œ°"Xfdåd[×­]¯SvPZïø’ZàKjë¶üAIh”ÒÝŽ¯ùÍ·Þ”•‘žaÎËÍo3îÔ+ƒ¹ïtø¬²F9ƒéw,à‚rùå—Óï¿æµ×^«l?GéîmÀ¶YÄñ½ï 0ÓÃ" r¤{"Ðk“‹ ÷ʰnZð1sѯ¡g “ÛRS#»õ¿)ÔÌ!Á=«€¥Û…qm¯Z«4 ]`ÙÇKÍÁƒSlú²3U›b¨…iEŸÉü)M;ÌÆc Äš›+áÐFÑŒœ÷Àôp*PËúø­cûÌÀP}à Ô>Üî®P¯²[áë(ôô}ºl´Qßõœ›UqåF 43Ã¥&âÄ ƒëß)§À¾Ã:  ìÕÓ}¥Ñ·îîshYc*** ÁÝjCŽ÷hh^¿F¹×i×¾ðÂó¹È0pnó8NoÌ$"×"hg|QÑìú3¦ïY¿þƒ¶Á€üBhõr`4¬Xa 1yòäwQG†ßø¾9cÝývvM4‚¿ÖÔU!½fBä–/¾t´a@ÀÇY¯MoQ@ ¼EY]o P€šÞW€Ì)¬`üıqS§NŽÈÍFà­ÎAÅŒB[ƒÉw8t† Àñ<÷‰4A¼âŠ+dãÆ¶{ï½×ÐBð°Ú±.½ï pU¼ ø,p,Ðkß:2“ƒâqÌwî’A B# SnhÄ´˜Tï!PËLsòS›?“]¿GÚ¿Þ0ÿŽmâ}42Z5`ZO|ø4×Õ™´HÓf¸ ù “hÄ` @+â„%&áVÌÒ†ÌW¿§ „ ¦©¼B]¬+9† Œ'Õ"˜fì h¨Û@!¨îG¯(ÀÀñ;vH0ÜŒ÷謊øŽ!S@ÄHÄØ1÷Š k1&ü08çÇ‚ù§F—ó-]½¶ÝJ$ž{ni>®YŒr÷»6 D¡>¥š˜R ‚‡kÖ¬ÓÒâ>µ—“ök€Wƒ—-[Æx1Žñ|g =Ûv,Ãß„ÎÇŒßü–GÀµ É,,'ËN™JJJŒ1ÊµÊ àK¼¨ASÀ+ðÚ¢Ø+½Õ•j ôŒL±7Þ¸„‘ƒo¹å¦ÔT¤üKLH2Ÿ±íÌÐ'ã·<ÏcŽˆ€AJ0{öìÈ¢Ì8ýþ¿ ü ¨Á»`¨øÏ9™Ó|Ó+ß9K(w &cïºSFß}·DI#h­¿"Cïþà]b ¹m¿úµÔ;Ö¦íî]Mg^E& ^F¸d”½UJ?úX1Ôˆ`¶02;Ë’ XŽ'ö1fð`‰@PCÆ5 ßxýñRÅ`Qhâ/0Ú®?~\ êS ¶ KJDA(Ñ)Þ‚¿ÕOÛ5ãÙ…# ghE…ŠSáô6ð¾PhWž›+‘p_I€õS4‚F"®A‚Ò"À@;HFŠš] ÞwÏb²—.]2LÙÏpîb ç_b ˜&ƒÜ w€¾lX·u0È…þøçó ¬Hêo¹å–èðp¶Á¼[5ö¹5 ó±Î¿ë˜Q,%%-)ìƒõUÁŠÅ¨$eˆ`•Q§Þj xšþ[9xúNt}šgR€ÿm+ìÜy×íÙ&šþ;ƒ¹ï|Î8îlk3®ï¡LDp¬ùóç—ì{ ¨1f*´aHí7îÁ$mêTäI@*:0kšÙé5•ö4,Y±Býã`Ê©Ìó,ï+? ÍHÇV¶i“œÞºU ÃJóv•¢Í³Íö¾¶vÁã>Q`¬¢òàsëPä—o:].`Ðx_Ê¡÷-õéJãÙÕ9Ї¤þØqi,¯”Ä0`p;õvX ÷©1}±Ï(Ð €(¸Í„ÂõD ÇœµÌ1j¶H]JŠÔC(ʱ›Ÿ/q˜ £²0NccF²\šÞÒÇÀaÇ9€Ò~º‚ÍnG åÌÿ< Kºˆ-úe= zYÑvbQÑì=ùùy%Ÿ¾?5ø‰$>×…ˆ-aÛ¶m›ñ" » ¾QÎÓo7î©kk«%33=ê“MŸ:º¬0sÕ—ÀƒFY½Õð$üòÁóä èº4œP€ê߀‘ƹ™³¦'Nœ41lРB¥7ã|çmOγ,1 Lá¢E‹ä׿þuÃK/½§IÛñ÷Ö¶]ý×KHE½ÔÞ,mßv}šŒºãrÍ5b…62é¸é@IDATV™kC¦¡ÀûÃ…Q=ÓþýâߥAǼÊж¿³l£¾´TJ×ö#HÕ˜®‚ò¸Òn ÓŠþÒ2¡->@¸DÊkv޲PñY^¥–SÖ(KÖÇÇ ¾ƒh¿ñ”áê``«o€ûB"b">€ý,¬{©›ë L°>¡ö?‚îx'œÆ%ËUæå‰ AOù=d–@e,”Ø‚Á-$\jŽ•¨sNëñîAv>H«°‚èèè}÷Þ{O|xxØ»ø= èâæpÆûÀux2„§¤$¯Z¹rÓÓiðÞGÓ—c +++r„ ƒqç–Ðùwoñ»)-¶&sEy…ùÈ‘£ð·QÀ¯øàŸúéH¢ÿx’ZàIj꺅?CGÆ‰Ž¶ßtóI™é™—`>c˰ÎöcÜvÞ7~/X°@öíÛ×zÍ5×i¯‹æd×}®ú0îe€o©"f´½÷óÿzøáIˆÎÍ•¼…Éø‡–thýÉ j¿g(Ìèôkßÿ÷ÿ‘Ò?lˑ»¬Åx™uàøúuÒ áƒ ¼‡ÜììW@ p7JàK‰°ø8‰†¦•ñ"2² ø]·Y Pñ ðÚÛÐV½³¿Jxf‘®µ(¡-Ðs c@Ch‰õ{ãŒrwŒL,:Bhà 8w‚)ªÇ³m€ ÇÔnE‹(f@ C@ÜØÂB‰€ ,ö›Ô@Ðç'׺Œ-,,¸nèС‹à˜‰ß½eþkq-ý¶k€ÔÖ’QcÜæ-í© SŠÍfߺzµvíü |†k¿ýöÛՈ雚šŠ¡mï`üqN'!HóÊz’SÃ>ÙôI-RP* 4ÀøUƒ€ËTcú¦€) $¦®* (p!zñ]`ÇÒ÷îïÜ••‘™iÊÍáw´û`0·¬Á8fÔÆ”ÙÙÙÿÿ’ÊÊJN ÿø±QFo=JJrÒÍã ×´þ!ˆlž2i¢L~ìQ)DpÇ,t[©ño× m }¡˜ 2µU;wÉößügcà ëKÕݺ¶½-2®v¤a;õùçR¶aƒbþÃ’’ˆ0¤M ÑÎèt«N"ƒE&*<- ô¿ÎU±˜A¡V d²M0Íþ×—Ðrhœ0ha ˜HZXÐÚ"î2¡ŒzëwÈ`¸ËITY๠Ÿ— h…0´ßÅf¸¥¨¹‘߯ö÷ŠV+|Α°–jäJTF†r ðG|€œœl)..‡f7¡¥‡–[¸72ü‡°ý'ð?¡µÁnoý«Åôk¼nÿ‰~k2Ù?ÇͯA9ʤ`‹#Ý2XA¦|¤|ñ¨<Ðà? T i uf³ x ·ÞzkT(…—xHŽÈ󎿹o€ãqwÇxÎ%5µ5pȰnÜø‰£+@>NkWƒ€zë1 `u AS`ÀP€¦ÿ†w4wîœäIS&†æF´U ÿÏfÞ1IÅ;{ÇcŽ×ð¸qÎØÇ¢gîܹòØcU¯\¹ÒP•¬ÇuÏuT¬wck0ó<è¸or<ÖyŸ¿†¦ÿ6l°=ðÀ4ý#”i>ÆEƒÏQ UÝ|8 èµïýª³‹‹eÔ·ïÂ+¯”,l•Æ•5´¾;&¸|ùìc=þßk×®…9MÏ`Íšõ­sæÌ©ÄUT tQ›5ŸþùËÑMÐ5ø—Êò]`P@ó;ï¼S{ûí·Ç`L…Ç©3ßÙ1ã–œ³Â  ¦¦J²³2£6|¼‘®äa‡ñ¥¶ôVS /ðÊ"º/Ò×j ô‚”޾dà /¹(eÂÄñ!ƒ †Áô¿Ms‰Õ8­¶Ž¿}w[ã/æ>‚ÂÈ”)SBù_|Qß^ù›Øþ¦}_oúN ¨‚iýŽz'O3ž'™OúøÿîƒJûÏ`e båj‹¾hðȸ’¡Nœ0N'NÝ›¥æë(Ë ´ãøþy¨ÙnWc†5ûqzË9ýùgÊ VE)A¿-d`Ð,1 "2Á#³³¤©Øè‡Ï¾*áE§ob· ÒÇ‚J°³¡´ –H«€úã¥H¯iUT߈ž}¼Ý~wy¾…•_m•Cû©Ý¾C G”à6:g7?x ²Éþ}û¥ |hF¬Þ §ïEû¸3Ü©"Ç‚® lSe¥Ôqœzøí ¥^.b]× Ðö·"»íoûŸeo½õö0{dÄze~ ÷FÿÄœ9E%èÆ…¨§«x5ñˆ-ðg\s²«¾êó>¡Àa´Bæ{(Üìû÷ï¤äšCûìxó·®Ê;žç¾52ZšêM“)t÷®qZ»ÓÛ>Q@ úD>}q€P€¦ÿÌ™ª@™þßü­„œìÜ^›þuqëÈxpŸÈE ɲeËZž}öÙíåb{Е¢¤½˜Þtƒ (3ø<ð*`4Ðk8z´Œ¸åfÿÐØAùÊ|•Z*ÇgïµÆuÅhE„pZ¤L;Oi®›** N1ßdjÕóÀûç`Û*>˜“² •¦3yîÉ´R@@A€SfÇ?U}±c ³oÈ/†l >@"ï°”CÐnÑ䚢ÍÅ8® ØTY¡„! -Ì|K>“#+ƒú‰ï‹Ö.éY˜Kñ<\˜ÍßÉ“S§àÓ_¿ÿ „‚©€ŠÛ¡Å“xÆX0N£Ñ"&7G†SÁVëà¾Òä.A7IƒÀjJ`ôÓÝeLçûÑG›Ö®]k>zôÈ$0ÿcQžkeDÝjó¹í1Ìœ9½ î‹p!c¸x”õìpUH÷9Ö ÅËÑÛ¶mk6lXÔ˜1cÌ "i|£™{ÇÞ¹:Î2ŽçŒzxœëKŽÕèÿÏÞwÆQ]kŸÕJZiW½÷b¹7Ü ¸WzMÀÄôž@€Ð- $„BêKx)„Zb`Ц¸Û¸W¹Iî–¬Þ¥ÿûÎìÈk[+Ë–V»¶æØG3;sgæÎ™;wN?1Q!«×¬©®(¯0CN¨x°BH$ ÚMKÐnZ'ð3øA½ Ø,Ü{ßÝ™YY¶Üì¼æ®µåÃo¶ñ\¶´Î“6L]ÀàÞ·»®®Žm/Røgü¿§OHQ’ ü>ð> Ok4G î{ÖÔ)2ôÁ%{òdEõÆä¢/íž—ã‰zs\µë„gëÁ iå‚å:yÜX^™4Že鑡Џèú h¦DËõ…ŸkÈ“Òc„¨±Ò^%¿ô™ô£ìt!{ºæˆ†u–q÷´¼×!¬Áÿù‚§ I +vîD>ˆ `^_½“~y~QŽïº¢#Røæ[R… 1Q‘’ššBËxsï9‡é.Ïí PÞmß±S**«ôÙÙá7bøÑ“æ#[^á3ÖüxÞ‘x÷é ß·/¼l (0¼±Z>ô¤[éúŸ %XkÀû`2C”ò•Y³Þ•ƒH~èæž™ìäÄCO€ÃÀSÒNMœ8¶ €`U˜¿Æa¢¹Ùݺå­gá)]ÃÛI­íí¦@ΰ ÈPDû¬Y³ÊfΜÏ0‘f%€yOÁÞÜf.[ÛçÙÆ‰ùº¢¢L23Ó#¾üâ„P€hk…™š³–§EKpZd³  PXü3Ùÿ.ºø‚ä‘£F„öîÙWBÜYÿÍ}æÒSø2×½-yŒ¹Ï\gá°à ìÐæÍ›)øþ¤û¿§OXú ðQ µíHî P‘0p€Œ~ê)éyõ7%îÑtC?!qUG\?]jÉ܆Å"óy„KêaÕVmAËà³à»Ý»·$Ž©Â5¤£†f@`PWñ–÷ùVucÇUJ6n”ð`CZ­›(Àú¼m½€9¾ºàDÅzÄôé­ô,‡"€~Ï€çÍü•» ¤J€r”ô¬p"ÜŠž –" ­OûôÛ©rk×NÙùê?4©d Þ·X(¸¨pÇÆ«À_ M5’8îÆ³Úº5_¶mËW¡¹®á<Áð"@¸Iâ„ñê!s*Ï㔞+œ+©ˆA‹xÌŸTœÊ¹H…爩?æ;Þu8×T Iå;ï¼#ûá!sp¢¦E%g‘Ü@“ùÑ5åÚóç/d>€Qh}°5 f#è¼ò¿øÅ‚¶ÙjÕIà `øÆ0*¼Ö¬YÓpÝu×1i£¾­ ö­í3ûÞRJVUWÚPQ±mÛ1¡#qÜ?€§–b^ÓZvm X €®ýüÏô»ÿ9n€1â tý¿ùÖ›â™ô/.&ÎÜ|̇ÿxaž<·yþöÜÎu"]³ VÞxãº_|ÑŒÑÛ€ã¾Ãc-8- 0IËÜ|H«6Ðg'}¯¿NúÞx£–ö#gGæRK<ãœ3ÖÖí| ëÿöªD@ø¢e‹VY ²zE_\·ÃoÄ?'Të5¬qCKÜ9!°ÖI}Y)žBðbžðwfOÀgE+WIñêÕ& 7â Ó#€ $EÆç2¬p¸iÇ@¸ŠÌÉÑœ ÌÀñ¨sŸŸÆ¤*VÀ`WÃ[‰ÒåÛw]ÁC£cÄ‘þ¡‡DÏÎkq-*\оDˆË† :GQè§+=-Uª`Ý/ܳW6nÜ ¡›¬[·A6mÞ*EPÚ”––© ı£Â ÆYx*RtGHžç©•|·]H&‰ó$ôï/±Ý»KÊ[²t`[a”‡P$ð>¼-ÿõð`X¼x‰,_¾Ü[3ng"„þ@ ñTPÓ%»hÆicÕ; < “Þ[èÐöʈ£×|þùÂÀÑ ž¤Ó]d÷¸ÏÉÀ¤;vÔ¦§§»Ê/Póž4hI ÷¶Ÿm[#q1‘!+—¯ª@¢ióEâ¸ë|¿¥ã¬mÚBKÐ*Ym‘SЩ‡€*?±ƒ÷ÝOFnn®-/·*(#kþðX¶´Ýs›¹Î¥¹Îà $5`ö§L™R€Ø@ÎÚUÀoË€œ:hõ'ýžNÒ«Ã'@ bÚ¹çJŸn>3¯CŒi¢o,þÇõž®°dX·½ûžlxõU)X¸@-YIK`LQ`XÝÖîãµ~šƒDË YÓF’ÈÜnJ·”)ch½ÔÀ_B+®KEãê.Z¬Bk”Á('IE1 „VÒ߉0$ t!?@,”R(Ǫ àÑ ïOo ~TP±RRŒ ·(Ëß.u%¥0e9Šžæ8= –Ök`?´à3}ú Ä}í)Ü'›·n•õH x¹9Ê`-¯¯«W·ùã¿“úÍlh”¤IãQ ãôŸÆ)•³ÌàÄs‚" qÐ9âĘ-ƒ7@ÂFZ§3\úCqÐ áÒZãûÞ$¨õ×ÿYR‹¹¤ @¯Ãá@¸ô«"/¸ì¶zðäÉ“.G ­ú´üG?úÑ‚VY;ýEŸðÕÀ`ä€*¿úê«£^b3•¦àßRçÌ}Þþ–Žq9#VS.Y9™ÇWÈCû¯;[:ÎÚfQàd°'£µ?)@!ñU`³ëÿ”i“ÆÖ»g?”ùiY†4>ôÇÞŽ¹íø%[™ÛÌõ$0 ýúõ“k¯½ö0\ÿ«Ýg¢‚õ¡vãÓÐþÇÀ[Ù@£\V:(˜E¢.ú€[n“!Ü/ɰ$«;1ÊÎZ,«PÚnÅ/‰z÷¥Ræùðºu²kΧ*„¥ .¸Ž×¡&cà9î:£gÔ5hI²Î}òèÑZ’±ã¬NE€† ´béóõ½Rh%2¶þÀ—_I „ †›Ø¡¸ùœšk!27Wâ‡Áûª.ø Uñ§"ÀÌ·Pw£ Þ»v#ùâV¸ˆ×I8B±X¹ƒãÁ‚Ž£i^ :Y±R…oÎGŠa}Ô¥a•4ãÞæ**—Òcà±ãÄ»Ú^e •ôÁ»äB8KRÀ*ex×4$¨# ðšk®ÖyÕ3gSÞ²îËüù ưÍsW[ÖÐh 0˜d²¶à ð›ßü>¸ªª’ /8açqðøÃ¼yóÖ·Ùú`Ø™‡óø½†ÇHÝM7Ýäâ8‚Qè˜z ümúooC%@UM D9¶m=&`4.H^øØ Ó ë‡E–)`oy³µÕ¢@@S€Öbjߢ¢"‚¿}÷·ss4(žß`<™“–ÖÍmÞ–< ÷ÉôŒ†À AýsÏ=gfZ‹&W³þžèBy7𠟣 Øñ@Æ¥«r/¼P†Ü{¯d#ÙãJ),RPì à<,>^¶¼ý¶ä¿÷^ó%iÕ¢+ë¾¥K¤páBµh% †bÂc<Ð Z¦€>?*t_O> ÏÙÌå†"€ô£"ÅŠ*(˜2?Àa¸S@aÒ=;B˜Bû†> ž²hYw`¼2ïBl¿¾‹•ªÌ8F±â‡q©ôÂuk‹HÕÞ}ð°Ø®Hz†3?Þ›ö ™ò,üÝó½Ù7ûcUPò÷ñßÈ“õ‘íí’vÅ¥ÂJõlÌqJ…)KÆÃºŸ….UÌcq|¨Á0”e¾*/Ì{ðì;ççP(Š‹‹ä½÷þëÕKÀó/ëpsÆ÷S‘ ,§ðÁï#ÀD–´íl Ñ×Ï¡XÒZ#kŸ_)° WL)((¨Cˆ‰kÔ¨Qv*ʨh2ù“õÐlg.½µ'ÿÉ8œ¨(„¬ZUY]Um204‚AÃ&³½km·(à–Àe¬íJÆü?lè»ïïfæu˳õÈëÕâGÞóFZbZÚÏvžmûÂ=–“;JÿíFÖWrîô¸Øæ$@ž×é¢ë‘¸o2I?’v>Kò‡skMéÞ(ë×÷ú뵬?²¼;h¡Â@’Ùèà V*ô‡VërX6 Ì—Ck×J\¯^Û³§ö³}õƒÙï3åZš€ !Ð…¿5I Û#€´÷ qm*¨Ð)ZµRJÖo€w@°*(¸UÅ`Š |Ú(XÇõ 9¹RÍÒnÌ`ÒK½+(Ö.’jä(ÛºMª"ÀÐ*.žþ Q{¯ÉgL…+1T!ôâ”ßÏ’„qc$yÊ$t§ãÇ ½Ø/J†F@ЪU ËÙ!d’ß5gŽ ˆ)Æ©ƒ.®d"Ìñy²suÅý*ô56!?@¶$Ž¡Â+=,˜(Pé%éÞìúPˆâõYÞîàâÅR‡gMf]gx@@æÍ²ʰx¦$Œ†1ˆ{€ >iÛ,úJÈkåA‘–6{ÔC@¥w«0ä‚,°3#]=,¬ü­°µ]˜kXÒ’Þ+•…ÒdzNì9CYÙˆÒ€Ù×Ï”øóÎÕ9¬£Üÿ½u—ï=€!§áPò6æ<‰†Åt0”W­]Ÿ‚=û-Z$ee­'ôvýV¶ó[Ç$½€}#""ÀB<½•öÜE×î50Cü €Ê“´mÓîŸüä'ÙöMš4ù x;|/(È~¾%÷â[r)𻨎p!÷ÃXŽÁï™xÄ}@—$,Œ‡"`ï¤I›æÌ™k)Z¦öJlž LܪH6é6l˜‰¢ù½îh`N ŽÙØØèÐåË–UÔÔԚυ|Kó:úšÖùÎ^ X €³÷ÙžmwFMúÏ€Ícöî{îÊèÙ«GP¼Þz¯¦–ÕsÉÉ’Èm\<÷›¿=—žë999ü)Ó¦M+@!gtj|gK´NÆ÷3ÖŸ–ÿž@™‚àƒf¯çÕß”~7Ý$écƨ`åÓÒ~¸™V\ÝSW¼ôKÙ‹dp´B·*@/€½_}¥dg‰çœ£‡3­S€ÂÓ˜>}$®Á°)”Ðb\_iMü©ÐüðH9aµèëÕ:6¨°‡#?,<ªäñóØ:Õ¼ïUÅ úCEKÆ X‡²oLÇýJO}»}öŠ{í •M°yà ¶¢b@¾#=<5Y­Ñ˜ô½oíh™¬bž™)5ÈUR¹c‡æ´Ð±Éæ-(4[?hƒ$’97ߨž-IwUà9‡BñÊJYèdY™¹¿û-Ýe”Æ»‘;à³Ï¶´»#¶ñ…HöŸ8qÂÀÈÈÈPÒ<ˆÀ`¶ýýûßÿþi{ÞtÓ5¶+¯üF,<#GOš4á)\ë\óv\¿æÈÁ:…ÅD ½¸ŽX5Is#=ôÆGgšŒã]ð (‡" a mÿá]¾Ä}^ ~ÿý÷Ëá ¡T,ù"\‘RV^ Ï–´ˆ¥K–y†ôÁõæúâºÖ9Ï> 4 Sgß­Ywt–Q௸&×Q:tHô߸ÜÕ³{qÀõß깓ë¦ÐÏuÌ6æ6Ï6žÊs;c{Úp×]wA¦WSÿ{œï#óœÖ²E 0¶ÿbàOçÉdøD2 0Åäy}o¼QÜv«D¦gÌ•Çsǵ;pm&S;Kþêÿý_©@YµSœƒåËQêj÷üyr5æhîâ§|cw€æÀ;ü´^Sh¡r€ÉI[2âÍMçu˸®Í±[_Q‰ü«Ô…݆LäTPÐfù@ äÎîU«×SÅ ¬îÁP¶…'§Hü°!‘›ƒ¤|{ü´Èã¾HçN>K(}èES[T¤yJ6mÒ%ˆ!ŒKéé¾u:1:您í(£Ý•uà P¥$cûIg  %—øØª—U0Ú0æ?ýÊ+$,…2¯€ý»Žj+{÷ ­Ç+VH¼LÀ½NHHîÑ£{¨ó7ß&4ùã®wýx檫®(üðÃÙ§4à|p"²9ãã“o„—Î@‚ûpït § Ï0„Ö atÄlãp—‹åtàt»~üøñ%TÀ;Á´<Guí¿Gpû|Vçr Á iÆŒá h)Àä/=ùQÏuî?Y›ð0§Ô5ÖÚÊKË‚0v«Üä§×]'#LÔU–ŸÎNò×âQHƒ·òW¿’}K–œ˜ü¯ÅƒZÞH»V¬z¸[Ç÷í£ ¯Znimm‘xIð¤D­à‚7óAP9À «!\ZºL*!L3~šBV¬©A(H&`ÀMO†ÛÐBÌp‹ä±cÄ»lk¾Æá«‡;ìa[•: =eÔr½»@ެ]'ux‡\ MŠžó`½tÏ0Ø…‘éi exC2œ&4&J%z¬˜‚2ª¬$O›*aðºPÅ€—SvÆæFÌ¿±7I8M˜[ŽZi·mË—íiñ% q°äço—Cð¦°ã}oD¨R8”|ô@ O¢Š3£ïa}ÖÃÿOÑ©ö'8Ø+´íQà8–ß^ÔÈl7PF`¾žlà…è[*ȶkÊ”içÎÃp ,Åb20iÓ¦M5ýû÷DÉè *(š©à3öD“'=~›Éƒšû={®3Á%ÇTBRBØŸYŠóPA ñ…~X`Q 5 ˜Ú¾ÖÚXû, ø“tO›dy…Ûï¼-}ú´)¡}z÷LJ3¨ErrõœH=Sakü>Úîè¶&IIA‰!ĽŽ1¢ °°°§£?×…À| 'R ›®Þ ìôYʘ8Az͘¡Vq–„ ×xHtýßšÒKž}V¯gºˆvØQO<.¹]¤–Ì€Pr´ó–üu¸=Ì!t]ß·à3Ù‡gT²i3²†#µæ µþ†„*„DDJò¸±’2a<z¨¢KàæÞXxü¶™· ¡®V*°ã·¤pöGú>Ú¡¼PÀûê/ÐlñP°B@T÷î’qÁù’ŒØtV`à> ÚF†Ñh>¼'š`×.¼/¡úœÝrÅE'>“*†àæA¿†› ýLFžHæ/ð¢0û÷‡?üæOŸ/aÀ€ga/T'H“L„Xäää¨Gø‘*|Û^¾à‚ ï'¬ÿ/Ð ]xè@~ª uëÖe#äC*àqF^Ó¶¦ ÿê¹ßägÍsmÜ´NÖ¬]Ûð§—ÿ²Ëãöé0 ¸ßc›µjQà P»gE@¦Àoѹ^f»wïæ¼ùÖ¢³2sÅ ëƒNˆMø&á³×%(8Aš“%—ævî3~sÍX7Ö¸nüc“——'¿þõ¯«ÓUêÞÿ/,ß6ÛZËf ÐÊÀDGd>î"ë’ï :7Wz~ó›Òÿ–[$.ñTøÛÚäy·A!°î éÜê?ýIã÷;BÈÈ»ôRé{à +kGœÏ³¿]m½ B4-Ô1¨ê‹â*¤’É‚‡=È=û;?ŸqɆ°\¯5¼G`1dX@´ƒî9. žæY‚sf(_ C‡HÜ s´L«P±ÂÐí·ñ§S»ÍgÉgJzY”À*\ ‹/Ü…ÃM]Ÿu ѳS©Óö‹5ϱ˜o©( C¥• =®º –ðXÕÏ- 42Jv~ò±äÏzW+´§oN"³2åܧŸÂ,è8 P` ‰ŠÔ$‘yÝ›³•S @g-sÁ@¥IõèK1ò0ã~·!4€.ìTP°$ [=Ç+KÒM)^·Nª÷í'úÊðýVø£oôO¥/æø °ù—·Àw% =ÊC†à]öŠÂ/GÊq–£t`<jP¦³3Ba9*XÆu׬YƒP„mòÕW‹˜çˆ½ÀCÞúóo\”w?ö?¤ÇYV·3&-~û“@æÌ††ú­sçÎߌßø xcHìêÕ««ÆŽmc(€É£š<¨Ésr鹂¾‰Æ>Sø÷ÜÎO^BñZS[#©ÎÏ~Y¢ó˜Ñt,8~PQ‹-SÀR´Lk«ÿ)@ÿÑW€0{pÍŒ«’ÇŒš“•'ApýožP©-Åd¨ªjO±ŽªE変ýîíÊ…òËïþLê1íè²E×ÿ;ï¼ó ´ótýgkÆÔmZ`P€Ïñ†šÝÿ,“>auâMˆYºe ¬ðåP´åÀ{áa›Ï–´c˜–ïØ‰Œ_«K;mŒug~ Îl è‡ʨ¨;ÄÏo!Ax÷ë#]bÇüš /«°è)†Î$¡ Ò$¥¥¥ìz °p ö]Àcê>óÌ£SR’.ÃqÏb_.Ð_­´mÀ¤I7mÞ¼mGYYçyQøë†ÛxÝuhw0háÂ…Õ×]w]$cök&eò¨äMMlh4r‡5·™¼+Û›|®9N<—Üç wIeU¥ÄÄD9×­]_æÑÇaXhzxì²V- x”T³ˆaQ À(ð4ú3ÊìSbbbèýÞŸš’.ÎC¨WL§{IÆR<¹Q `¦‡€Šñ8™©(P¥€©4?ÊS06ÚZy÷ÝwkÿøÇ?šæ&SyÁ쇵” ÁÍÀg€¬MG¦Å'@!"ïò+¤ÿ­·H·óÏWë'“¶©;ªˆ“Ýd(\´·¼ýoÉ÷=©ki{€VÞ4”3|ÏwÝã»=g³Žm:ž0D"–9îë¡QÑÚœy%êèB &‹‚£¿@ãì1Þ˶oײµè',Ʊӕ–w÷üÕÁã¯ËɨècÜ9%c™å-Ëà~ÏîSðÃ{Ìkë+«Õ¾HJ7oÑD¬Àà‚²‘.îEÏãékýn•øíðˆÚ¹SìsÞ@x·K{ _+ ,Y'J\¶Kð®ù1× 3öÓåk(p"/”ìVíÞ½=hÕªU×bý'@z øâѺˆˆ¨÷׬ùšý´ÀðÞÈ!z—””4 @ØèÑ£Cj1ï1q_#“ÐRØÇØ3\úI2ƒ5øRîgÎ’ÓØnýf{n3×+;ƼÓå´oÞ´ÕPKi¸"8€ÜòX`Qàx ø«9¾'Öo‹G)0«OÝ\¢Èc?œÑ½{[¦Ôp“âDxt’ä6þ6—æ>c²5¾OÜF@ËcþÅÁ´.ƒ3gÎ,@ÜQóNK7“ªtu S2 ø àå@f›õ‘ðo“„¥÷ÌoÉ »¿-ѹ9j™kŽCÅ… 0žèš]„„r_ÿ§X±¼ÝÝ‹FŠÁß½÷žk(<Ú}Fë'£ÃhUAµ…˜Þ}Ä‹°Qª¯BcÈÕ‚ FË_À¾P(a~–¸cÞL`š $2ëøážÛüÕÇc®Ë¾@ÀWXI£GK<”Uˆfµ‡Ñ†tõ‹GÂØ†Z0?À„”åo—0x€…§PþB¿xœQ°á™1î?j÷. ųõæÀvõÈ#T„¿ ÈÈÏq-™c€¹,ª±¿a~ü¶"ÖG=Æ`IcÈ.ä=š k2*ìØzã÷é]Ãà~7b¹·½çÛŽuZ)4R€ä²-€ Ñ–»yþüù<Ÿ¾Àb0ü³Ï>+¿ä’KbàYjcÕ Î9&?jò°üm ùW9.vžm9'™û¸$P™ÀP€Z Hw}ùåWGt‡ñ'‹À]ÆOë¯E£°Gia­^EWÌîŒ7&æŠ+/wÒúÏØ\sB¤øÎÿŸ†É’ZQüãÒØÁœH߆ÖÔc&P~e9‘:BC$11Iž}öÙ’•+W"pPá%ü]è^ïÊ &”yx/ñ†meÐôÔÀ·÷¼Ë.‘ÿ󈤣¼Xˆ–ö ìlÝ´&r\nxíuÙ1{6jÌ›ÃçÔîÝl„ÿ{~ã*uC7·[ËN æ*(Ä ˆ2w9(Åg w˜VÔ]Üïù `ˆBñê5R¾s,Jx?Ðï„Ðs$à¬×œgñŽÐ“Á‰ÌçiS¦ÀÛ¢òì’¸â«ðÏ6Tt2ðšTPð™óùVíÙ£^ÕPR¸ÒÓÅ£ ¶?Lгærš/Ï3r÷îVsð™Bœ’ÒÜ\©Gu0ÆXÄxˆÀ³Ï½ð‰E~’ü|©æ8õPãèæÀ@qù¨Q#§Ùíölü>UMd)ÆúR÷³úú†çàíø'àË ³ÒÒ6ý¡¼øÑ%< LÓÖxþùçòé§Ÿzw¹8ÙYήý¤sGÏÛÚ°aCÝ•W^é"Z%®)ܼۚ¯¼ªÁ¿š¼¬ ù–<Îhë¡À6¶3Ú"Ÿ…#LÔ‚©6ȱmë63Ž…“êhà_8“ŽRÀR¥…µøº¡“&»ôô’’œ*Q‘dÆ0Yªë”1ªpO¦ÛÈK®f³²¿ àqÜg$Q1=™ˆ§á©§žÚçnHm6ûÒ•.†WŸ^ŒúŒKO5 VïïJ¯«¯–($blDŒ&ó€ $¯Â¯Éæ7ß’#[Ú—‰‚Rª úÎwPZ+ÚÏM€³³s:Ç`ü1I]Ø™À ×pŒÇ$’c ¿†P † Rµw/~-Uû‘€}B)´œ;'\ !p#>»gO(&kÜ=³ò×W ñ"$˜¹ìdPhʰ& ,Û¾CŠ¿^­4@~»©Xéü®u2%ÎüËñ5AÙ@(”:ˆíkñ¦èП2û P4ó·‚{ɱß§*cYãòXÔ#™›Ÿ èúë¯w¦¦¦†#y`Ë7tbÇq+(-(þ$88ä—O<ñäÀÞyóæÍ;·zÞ¼ùï¾»¦iîÜy%ØV‰åÖ)S&Ïÿ´§#AÒ€p/ò¤À^j!ÎYà½e—Û³ w|0¥¤{÷îÑ«g/;“öyò§G-ÿnÞVy\ƒå|%ÛèÅé‘äè>ã<ÜdÌ­ÜŸ²tñ²rxÐòEàó£KÓþ°À¢€IK`RÂZ˜LŽV÷f­óß—Þ¿{RBŠ~ŽŒ ИÍuSÈo`l•N†pÏuSÀçÍy®›í¸Ý‰â>ïºë®ýÅÅÅ”8€wMeV»„ánû¤Õ¿_yŸ°¿Lò×ýòË5á]Ú˜óô"gJ¹; Zd ×ÿíï²{îœv—é£Ë¯k®‘tÐ1Óø—f¾‰H<—ØþýsáBƒ&’+†"€Œ—£3zΰ2åÛwÊ‘õë!¼–è¤Àʲ|Ú7*G8?“KEŸìxwâ¡ìJ7Vß¡ò;TéÇû!¸ ]ï¬?ª€@ÃDpôN`¨éÊ|$NŠªôq÷¯³úd]çÔ)ÀÎÄA€! žxlgŽ€Rx£4°Äf Ï•ŽÓ´Ñ£$kÒõî*ƒçJgæ`n¢¡xO¦OŸ†ª4ηÞFËŸþà?x‚ý–O?Ó&×´9sæ6@°mÚ´©‹0¿!!Šä“A,¸-##ýKd¿7^à“Ñ5ö3àZ`hZ~õÕWÇ8àQVW_çê cþÂ’ïFz¢Žç_Ýfð³&Ok,ECêl03+3ré’¥HÓ ½±FoÖ®ÊÓ6ÂZ9JKp”Öšÿ)ðGt¦ÂÀA#n¾å¦H ÿÌ¢ªšRL’Ê?º—:IrÝD·v”­Œ–8POÝçv·ro#à ·ó÷Þ{¯æwÞ13·ÍÆQ6zÑåþR[L¡ÿ cþ© ð‰àâŠø~}e(Jûõ¼æj OH8ãâÝCQ5bû‡³eÛþÓî²22'L¾¨v ‚Æ´AZþ™tù¢{öPwû „ Ñ¿®´LŸ—?V¥Í€œX˶n“ä2¡ò‚¹B0FU¸ Äñ„>±¢Aò¸q O ºÞ× _=¹ $Pšzà|844,ׯCù*’GÖ¬Õp Âs È{Æ>ù¡_>¼å³êÔÚ#àf†˜´tw˜^mA6©†B¯*1Ñ(ýéåáxt ,(á+ôЪʨ€÷ŽÓ–ÎÝAÛ8þSà…4cÆ5ú.0‰ÜÉæì?¥ÁûÁÁöûî»ïÎÅÏ>ûóÓêÍœ9s*¦L»¬©)¨;NÐ Ø*¬12ÒñægŸ}àn{§EŽÓ=ˆy˜Uv(óJÁ{#x̘1Ž<ÇŒ)å[Á—^ôps®‡GÝûm¬`&±6ù]vŠë&p•ƬP»­¬´4¨  ÐtY¡×È9À×̶ÖÒ¢€¥°Æ@ P€ZÒÍÎàf{ö¹¥¥¥¦Ù¢"à ™È/ºçbòTpo×1g?7j¬S3J07Öõ/ÿ¨õVÿ¦ï|ç;…˜œÙ˜Jö¥«}ÄHÚË€ïf[ýàcÿi…[&ÚrßweÀ·K²/Û©àÀ¢Ïï´ÎÚÉal1ÞšLà†¿ÿCö|Nåzû qÐ é{ýu÷èδ0µ¯×]èh;;+ìÁ‡¿Ká?šy‚Nî%™Dþnž$±ÎiO…{®›h¶7ÇvN¤øç wÊúõë~úÓŸšqQ[±ÿ£Q—øK…ËxàóÀk€‰@ºŠùb{ôÐç ´_lêðhõ?ÓãˆÖ¿C®6ýó_rÂ@{!íÜѰþ_/΃ ÃL…ŒºK± E ¨ ú0£} ’…Q¸ŽˆÐ„všÝGùÃrmvöh~€ Ø /…#ÒXS ¯¼bfæœhKŽ=V^H>L’F”úJÄãï? ¹ Ìù¢5K¨¯nA8y}e•‘`#Ê1Y4,)É4¡(°À`˜N8î}ÿ)þâKéÕ¿?öÞãŸÂõ( è͆J@ޤÄV-íæÉ8N©üI;÷\É?N+„”ïÙkTné ÷êÒK/‘n˜_XžØÛ˜GU­/DsòÏþ+žÐÇ)@h2TÀŒð5ÀÓ‚ŸÿüïÅ[·®@2;…ÇÖ <ÙÛH,¸¥µF]t_>î{0kß¾}uyyy. ½\ >– 'TòµpõÇø¡Ÿ¿%Vñ)6y[üÒþæaägùÏä© âx‰ŠŽ Ú½« ñСCæó§q‡¡oñtm X €®ýü}q÷ç⤗gï~x¯ïÃò —Ä»€w{›%§ŸùazVf–ÍåŠâŒ×lV+1~›‚?ŽÑ ‘š 'DþnnÃã<Ñô†B|œz<ùä“tqãlËþìvÈÃM>üp8±þ>2È9Ӧɰ‡”¬©S$,&Öx¦|&g ¨…ý^ÿ÷×dçGõØÛqQ99(}x™dNœè×Ä*¬2ì¨ìl½/&côÆx¶ã–ϪCI/;<¢{÷Ve“ïQ0¨=R¬1ä*8úK‘‚ëR@ë5ó”C8bÝ{&˜ ŠF.ƒÈæ¹1Ð çt**R ºOo-ÅVP õ^¨o0ÆegÓ׳Ùáb‹¾Õ—WhõV ¨Ø¹S 9ñ"gèühã ­ýa<#ÆÅOæÈ¾ÙŸH0¨T”D%!¯§€e[B¡‚Xi)ÚºMêKJ%úœ‚ ,`¼繃c! Ê¿¬I“Ô+ ʪªC‡ÚýKD^‚«¯þ¦T !ekŠO™=û#):Z®^•“€ç¸¥Èxtò:§/¿ü¢Àm}s’K ŒøkOÒ®«î¦ëý·€Á+V¬¨ºä’K¢¯o(ȧÖ~åW)Îcþ0S‰Û@=·°cŽˆfº´­IXæ°Ã“¥ †ÌÌôð… ¿ð ËHC»ÀMf{kÙ5)`)ºæsïÈ»Š“Ý |ø$ðjàh`o`*R¼ —Ô<?Þ¨¡&6 ÿ3¾uMÒ´éSÑ‘±Ôa6Ojædh&FÁ1†”ZO qrO–ûõÎ\7ÿa¢äyéYðÉ'Ÿ0ñ_‘6ùË—Ýëgó‚n|—Ÿ^¤Õßgýƒø.ðº,ÉDšàkÍ[àLI…'J·S9a)NŸÈ§x$çÒŠü|Ù@ùÖ­Ò$i©©‰D˜Çƒ9—1€Æ€½ûöKIY¹4b\…ÆÇI$”ymU˜çæ\JenîôéâBâ>V ¨£ðŽí§“'O–ÔÔ”V¥ðF²|ù ùºeO4æò™ Ì’Ï¢" ØæNýå/.--…c¨8ž‡Ã¦fÃwâ5d»ßؼÅZñ¤0TÌ ®ªª‚±¾)xذa ÷j°ÂZðM+>9W]WÞá:ŽÜ|.Úàæoù›«Xr2Ÿ7„ ,lP°Íåܰ~¯Oà8 Ñ§ð à7€3ÜË‹°œœ¤òˆ/O1°Ý¡$8‡FÖ^æëªÕ¢@ô…ÿ3À›œ((HR˜?mˆŽŽyâû$DGÅâ£jðî‰N…yNnÆ|§B?× 46ž!•ûu"D—Ìu@—9hÕ›}ôѽ555ü–gùq<[ ˜îÀÇ€|v,óÇO .±¹çŸ/ï¼S2ÆŒÑøcÖØn~€>¹ªïOJA¹Yß×½úw)˜?¯ÝB« ô¼újI<Øpõý-èèÅ‚ª´S8]ý¿å¿ü¥ìž7O]a¬\û›/¡ðÞHFÖk ˆõpC5öٰ餻÷Ýe(D“sÂò …Wò„ Ë}c]½T#s¸† @÷¨÷ „R Ñô¨>pPêà`u ò oì çq Ü1 iêØ1bC?«p 5H¤ Î+~Q O¼.ç¶ZT„`†¢Õk@>›8!²d¤¥èœÑÄ1RÅVáÛïèëá ˜” É)IúýçF~û)üS°Bt9|¸Höã @ çB„wðÙŬa(z¢Sø£ŠRŒ‡Ä%{êTU¬VìÃ8E‹SQ°% l0¾ ô@râ{ J(LÅÛ¶åË矮¡ -64„öžØ7hòiÐLˆ§UØË¡"³fÍjœ4iâ…h0Îk#cG-ŸC°ì$íºòî/pó ·Œ`Þ)(y¢£¢¢môP—s¯Áο•ÁåôFÁˆ ¥€NyÇ( ¸—ûu birw6[ÄÇǯY½¦ª¢¢ÒLÐPJ yù ED®sùC* .Þ¼HÏ^òú<¶ÈçmÁLKp?n½zöOIMu„†„Ú 7þø'?ÌÈÉɵ…;\Í'3N€žH-§û7VT!@ƒ‹¹ ›tÇr=t‚Ä:µþo¼ñFå’%KLèïÐì3½ÎÙù‡Ç Àiý‡ß¯ùyÀZ­ØÑˆY<ç;ßA9»$™½ø@Î`ìÿ¶÷þ+ÛfÍÒäjí¹%ž‹!½®A‰§Nºl÷ð¸dû}K—ÉÒ矗/½$»æÌQÆþ(XU¢ŒV!ËË—Á²•‹’ý”‰¥Ò¯Fþm ÎÚcUЇ°…we#N·b– ¤G€2ïü*èC°(‡ëz¬¥ÌYP_U‰xöH­r ý Àw–ã“Õ ‡—(¦¨¼ªanXâMÏ"Ò¶³J^µ^ûcxY”lÞ"Á.§V<Ñê~|ÞM\/ØåRëÑâ%ªpæ8`½Ô”då*ñlŠáSˆ8ý;vÈŠ«dóæ­‚i©ª®A_*l7Iâ„qÈ•A9çô€ã4ã”ùRG"Þ­ªƒÈcQÛ¶„·Y¨0090¾@ëpKà6dà>VÈV¼Ãm”,‘AÀÀ ´Sê @ˆWxþùç\P¯Å„ÏZ÷Íñ`ðTÜïf˜Ýí¹0Žãv;¾÷à€%7/7âËÏ¿j“Ò‡};ø¤bà| ½~/R¡´ hy€gøÏq¦Qªk÷—ÖñÛY­‘ÁétÚÇO=f예Üì\;?¾ØÆì´˜ßÈ ŒÙñ …óhëƒ[É}ü­.Æßž|¨ ñ܉Séć6Ú¿Mw)öunt þî ’í™ùñr¯¾úêA÷½P“ù+÷úÙ¸‡›ºx#}¥ – d€YÚ¯ï ×Kj%3á–1ó9uè;ûd;dæKò·ËîùóåÈ–ÍíîAÂd‘ž~¾„€qeŒ¶/@<µLƒ¹­<°O6£rÝý÷/_®Ö_o×eüÕÁC²ã£OäÀª¯¥ÛEÉ9wß-Q(ƒUå€*ð~ZÐ2ȨQ …àŸEO ²ÛG£ÄãÁ%Käð²åêŽæð‹åš=æØÐ\p!.üp¶”l`R»Íë'‘¡çµÃ¹@a?2¯› |üQ9Œlïùÿ|CCè¥Âqë—rŒxT±‚ëW<(/F6úÍ’0l¸d]z±æ‡ çé~”‰×Û±þ´— =C•ôÙƒÆ~w<,1¦Ëà岂)¼·ÈSЪÎý&/Â¥"îZx0€33C-÷§Õ5œ›#µã”ßÂóžyF ¿øBÖýå/rhõj©ƒ§7ò(´üÇ —½¼ï W®\é­‰·íÙØA#ÎDàóK€ 8Ðh‰[:™ÁpÈ7? NB÷±ŸõÁË—//GiÀØsÎ9'˜|+yX.ušy^÷šò¾ê `¶ØÆmàÒ6ë„€p‡SÒÓÒlç_0-yö‡ï7¶¶ë/A¹@æð¢2€nO¯ßZp†PÀRœ!ÊO݉ë>ÌóvýîÝóœ—_uyì°¡CC“““sÚüQ5?ZÜíø¨¸n‚ñ‰Ä/8%5Ù™ŠÇx~˜Í¤}æ1\šqs• FÒ?œGOC¡„çÑWÕCõNþüç?£½qA‘çxγrpOÔ2? Lšš{§CLmÖ¤‰ZÆŽ¥ìø[ZÐû¬Ü ÇîvJû—-m÷m9a•J=Z ê8áßüjý"sf–­}Ë–ÉA$*ÛåýL¤v*@!° uÙ×ÿíoÈ}ð™æ+èsà ÷æJºµCÐ%ólAË P‚4ÝÂ’q `²@–º;Keñš5úübá/P¡/‡U´b÷n9²v­f·O1Bb¡¤bß1ÜãÜ F’X¸\~ô±ìD Þƒ*©p ƒÙwSéFšUíÝ'{>ýTŠAS–6̘>M½A0™мŸt0&naGŽ Ži Ò0?}zK”­ãÿ)üS pš0ÇѪ?øp>ŠLXGÁf³G"3ý¹G·x]«]iP±àäxM¨þÕ¯~uà7¿ùM“Q|«Áó³jØ·Êi¨¬+—øÁßæø1xgÚÆ #šîS…Gv„†É…^èœ2ejŒåkÀ—Öä"2X €@~:þëÝzžÒz|g|Ý3“ÆŽãHIFœ£Íˆ«3»ë@>3Æm(⸬X©V–‹j/$AðÏA²(µžîÉŒ/¼Q~ ô¦°C‹nܺ€1<KÓ~¸ù—B ª†Ûy{¡®¢RŠ`%^òÜs’ÿßÿj˜>ut{6³OŸMϽ½;îxzLpÒŠíßO"ss´tàaŒ©_~%¥ˆÇ'h̸®uþóÚÅëÖ©2€9àjŸ8r„Dvï®ó¶éfßù½káŠîñÏ>Ùðɾò I:ï\ÙùÎ;²wÞ͹@ öÜÌn gñÙ&æ[ Ð+U¶¿ñ¦Âû˜yÑ…’ˆ²Ÿ!¢ êæê}Ö®râFþ‘x·XBRiŠwœ…(c (ç¡ëÞhÂù8(y0ðÏÆT2ykߦíã”9dzϼV2'MвÛ?üP*à™P_}Ôƒšîÿá`ŸÉôTn9rD6¹ç–Ú´q)ù<†ŒÎu#y#ðX4$œTV@á¼Ã8Êú{ lÁþ€—îÚµ«fþüù5p°*…áÁ …ž½ñü1t`Lò¤æ˜àRÛpÁuc×Ée›ÇçÀ´CAf‡£ ‡Úžãœ rSàûbäÈ BèR¢ÓŸ2`à€h4ˆ®­¯“#EÅMë7¬¯YôÕ¢¢ýû¶¤NÇ Þü5ð¯@ ”Æ*@;guË/¸Wý+°Ðøbb…‘‘æ¸÷þ{ÒxèØs ŽŒˆF¸‘‚ÑR@bã%.6N\piƒ6“®ÿüPñ$z"|Ð(êoüÁO7bêÁ`”-A>ýøEƒ9ŠDí`0v,eBm¸9‘“–!ü³_æDg®ëävÜö:$á‚R¡ég?ûÙ|8©á¦v’“ÔAàÙœ|ï~8èú(h¦9OF?õ\Ã/Ô¬ÇêÖÊÑYʤƒ¹\ÿ·¿Ë®O?1Ü¢Ûq1yyÒÂJúر§nY%yÁ$P¸ bqª´0£Î{áÂ…²öÏ‘õ¯üM6þãuÄø/•Š}ûÔ ½Ý=öP<ßÄËVÀ²YðÙug¥‹kl¯^j5£Ë«ù®{ õˤ­ŒTÖDäæª[8½AB¢£P6ðŠT)DAÄ_À¾qLÑ# <»–4cé@†28âb9áè¯z¹.çÆ'ÒsÌcQWîÆÚ#Á&¾1üÎt6˜Ï’^Q5ˆA§7@é–-š„Ó09µV»•Ý·³ézœ멤\²TP™ÁTÀœÊ=²Œ +¯›¤]|1Ž÷Í;Èqʰ/z€% ‚p€J­º¢^+Ø—––.p ÿä='ϵmÛ6UTšÉYOåFOl ­‰ò|THîoUóÅŸ_€%ã¾ODŸ}ú霺“5´ö+àïL`<9*¦N ¯Žæ ÊäkÉïR)@Y]—8@÷év2laþÃOœû <÷\¨Lž:É^S 4ÕéÈÓ”Ï4þN†'11IbPÖîÔ*<yj戈ˆ°egçŸ{Þ¹‘ç7:699ÑU°»°ÚL[¯ãþÃ|ã—·w-0 xŸa¬£Vw|NŽ…_)<ãüð£¦ßsï=ÑyÝzC‹HpBKŸ ‰ÈXëb¬?xJôÊd53Zœ‚ Ä=Îøst;!è_]7öñ#†YT¨ˆ(=o5„–C1'¸æÌ¨Ðòsµ™œ3êD‰}ÕÈ»hÑ¢Ú?üÐô¦ËÛ+lu¸r¹ø$ðN`Ð *V:âaeavÿ·Ý†ºÇð Äó(Ë`ß°Ê­]sæÂmó¸Âïl×Ù©8Éœ8V ™ê®ê¨'='…¾W´N‘Ñ¥ÿ‘­Û$ 7ýë YõÛß"1á»R´~½á–……/L,K\ÉߥȧR E™Ù0dh¹ß–/ï¹CÏ ŠŠ QPEÀê†*æ03ó«ûzó<Ú¡W?éÉt¬AÀ¸ê²-[¥! U‘÷–Êp0ˆ!c=iON½Ç^Ù$$`‹ÈÎ’Ú’#*ª"4W¼³éŠëñºM êP²sEtßÞ¿Os§¨7ÞkZשßx?‚ßz{X¸”c¼V`þ9 _ÍŒ+/W÷<ÍàßÖùù”IÏ÷ãÔ…wžßƒèœnR`9æõ>ð¶éƒ!ÓÑÒ¹ë1Žwók<ˆ:˜Øy°/0ëõ×ÿ‘×§Oß«àÉ™fò\^®W[zï‰'žüÊË~kó‰ !ŠŠ—QxžM qpŸ>}Á˜(³óù+ÿÊù@yZejmz.ßOÇaÞæ’ÈLÏîÝò´$f8—zzW.\ø¹ìƒâÕG@žp°ÝÜÂ_OðSõ ƒ ¤îã'^] º{Μ¹%'î²¶´BÅØ÷ `Ô† ªÆåtº0MÏÞTºx ÷[ ž‹ÿ·÷}åÁ°JÚT„åvƒÀŸ“­‰$Ãaɧ'.›‘£æ™y~47~c]¯Ö¼¿Ñ^wsö‡BAþ/9)Y²3³À‹G@AÑ U˜ÃìAÁð*Huî¨È>}{Eï)Ü‹b7Çä  &®?ÞÅ G€,@<?w¡®ÿ60ӳІþì…g3Çb‡’³G84ŠÙYÙZZG3û»Ð ëî9K' NÇ ¦›£í<öñ8÷?MŒ¤'1Zòxî剹†YI'&L‹ ÕÜ_^Q®BÆñ¥q,çÅ&Íü‹«êÅ‹—ò4€×€³uíÌýC’\ d¬ÿ ½|øêK$´À`õá? >+ýèøäŠsÒPX:·üû?HÜôn»ãèP^eO›&=¿ñ ¯B“¾3¸4)Æ.Eí]´H6¾öYŠØûÍo½%{¾üRÊ ½žÃÔcy«*0ÜûÐ×=_|¡!!Ìs@Fâ¬Ké›B´ €H.¼o°éz_µÿµ›§åÒÜQ]¥"ŠNjš—aLV!•t¹§µÏ¹½Ê±Žê«çyØ'*Pb „ÃÕ‚¥•èI¦ÉÓ@WÎe ƒlô:ëðŒY¡xí:ôŦÕ4¡„<~ûºÂ<Û‘äŽpÁ# !,³h@ù½fOå'Z¸-Ø Á;ûº™Ù«§‘<²0:Nñ¼º’ˆÐ•ˆÒiôÒ_ò^eqX¹r•ÃcÀ‡ÀòÌQ 5())©Cèd­ÝÔ„êµøN5€·òÔL¾ñä“ßÿ?öål>5&x¹ÐàUK%²Ãþ3V³ë?×ÍFŽŠïnÀ8u:Ã%·[7é Þ,¼±а¡mÌ#h®¼6¦Îålòâîßsʃ4/q¨­›·S™…w%-5•ÒùêHiyæ)(²¢£mÃG ‹Èëžµ~ÝÆ „îzjѨTºÈ„Dë€ø™–ÀÏÀÏ—‰ë¿ ä‹Ù \4=î駘œœ 5¡1!¤ÂâŸW¢2%œ>tRà!œÆ$qt»±µù/ÛÕâï^×sð87àwó/mフ®ýÐK£9(zDñ‘Ò2‚œ€LädJ¬(¯@&àƒ/¾øâ^”Ía ~1oúÖGð!ŒÅ¹ïþ|1b2°ÒÑŠØä¾7Ý$Cî¿Or¦NUË.ã¼Ïz¦c'Œ$Ýì7þãŸH¦·¤Ý¤MÒçºë$B-€&ðƒ ‹­æLÖwnü;?þD–ýüÄó¿"ùï W­RAA…,ô- ýª‡PUåÄîyódÊ ‘¡¥âCCDø[Ð*4?n ˆ€Ç™™.¡ _ ”+ŒWÁÑ«vÏOó@ÙSŽP˜r$¶£+{mI‰0–Ýü/  ¸¹ã’®÷ [`RC–c¤Œ»6“– q«§Ãwòyò;Å~ÐC¡å6Ë p1$ žv¤7°lcA(:‘^âÃÀ³T"tEßÚÌ]xÌCœO0œY’ñ+$a#vSaý?ánÐ/[}ÄAqa£rÊ£Ÿžm9Xp)r¼ÀåÚs—OÖq-< ì{öì BØA*+#,óÊ<— /a@òÿœ4iâ’yóæý°ù¤7gåI#?˜Ä„€C† ‰‚ >¼í Åds9@Îúߘ 8¨ ¢µ¿{”Ƙߌ1Îï,Û¸q\¹7Â=wašó›íµ-ö±=lÇmè Ïfî7¼l* ‰ P¤!ywŽG¤Ñ”¸øø Q£GD×ÕÖÚwíÚíéi˱Â{eɃ/ø‘v?^Ûº´)0—ÿ 1_Íp÷=w¥ÝpÓ .;2†6B^s„éÃ8|¾ü:õ¸'=H×ù`nç„ÁŸøsz6ólÃÄfÇ´wŸCÛ˜çãÒ¸'?v†`,OÆKUTÂåØã“iBÜÅúõë+p*Âÿ¶_šÓSuúŸd\‘IU^2)Ï1¹ð»C! IŠúÞp£ôþÖ·$ b”Y¦ðß<;´è_{]¶ÏþPc¡ÛsÛŒïvÑÅ’sþtÃõçG<fÆÏ€€¿æåÿ“u¯üU6½þO«/ƒ«ºÑ{( ÚÓ‡Î:Ö†dAAŒ)„rŽ÷GOU\tVÎôë`nc¾`0ttag»3= Bµ¬-Æ~Í€±Ëë×—•«7óTBéC¡:óg Dà8 ON’D”t¦¤%=‰L` O‡ÎeªASöʈJxW^±BjBC˜èÓz[ùÚødÈÂ’Å•“­ïQí¡Ãx¾µ*È4¹Øj ñÞhI¿òJuý×éV턾9ñü¥¥†—] ý`e¥ $;\°`ÊvÚ{fƒ57®Ýá{÷î³­Y³f/¼vfd¤"1ÜôcÁ÷¿ÿƒOHÐÂퟭ›6ãÆ¾ ´Ô=ÚŒ©ü.X]÷˜6•Ü–™-}úöÕÄ~:‡ -G®®³É-ãô¿UÎmŒSâ×¹‡tûŒýæ6ÝNÏ[þ3š©ëó¤B ‚ŒAR@T •¾}{;úôí½jÕ×eÌs Ý2ŽŽõ<à‡îmÖÂàc´ ëQ 7nùŸÀ(óÖïÿçŸÌ5jd0äfpb¢c$ ÉýÀ¹GŠN îƒÜs’ñ ?Ì·Û<'NÒ¼ª+ž£ÍÜ¥3ÉÑfÚDgc[óoü4'AîÑØ']áäfœì’="ù?Šl[‚˜ihüñ]P˜W|‡ý‘‡žaÐýey•ÉÀL_öÝ &> ò€;ïX«µ¶2˜Ó.;Ìw°gÑbYþË—dï—_´ëÖÉhRð?÷Ç?'âS«aé£pOKÿþ%KäкõZºÉóÎD `B†¨œuýÏEUˆä¡Ã$Ù†Y>‘‚˱)q&Þ ŸûÌp†X”nÝ"E_¯–} >“ÃË—kˆ†Šø¹Œæ÷Ó8({RPÝ"nÐ9šÝž‰÷ÜߺÙ×Á{¡Þ6{‘Ȳ|×.Ta(Öo­Èþ AÙÆ¢§OŸ&©'!Ô"AìHÐÅïª2â¯>ž ×Õ²–ønÕÂM¾±ÊÅË–k¥ V  ¢%¢GžÄ*¡P09«–F耿  ÏÜŽ~eÌ'¡mô6_’cÀÿø²¯CZ#ù©ÕàWsÞ®Ï>[ødk­}m¢À+hEïNy衇2† Û|+2ñîE¼èį†[s-Aj Á˜ÀB 1„ ™&I†E&7ñK={H$¬^:ñhKüÁäbLWè‚Çzóvs–”ú“;wH-´ýÌ”»oᆭ7Þx³tîܹEF uýÿ6Ö?uÿôËñ| xpœ/;K&ˆ™Ü~û.I€f9 ±dõ|f]Iøiݤ5nÙ /¢Vóëj…oÝãAKÆý§¡öwÁÂ…r±›,ÑWuð`{Në×cWí‚Æß…FÆÄ‰Z2¦GZ¨  ç‚ZT¡ü° ýà\k3X«ûÔþ> afïœ9Rº îÂxþXõî0÷S@·õè>}$óHÊøqÕ=O…Uz4a’vô`(øàC9ðÅ—RAÏX±4ï<Lzrb¢B&Zd¥ˆŒ .@ƒð ˆ3V*º»ØÜ|ÊcˆÏÏãÏž£!fâJóQRŠñ7`® …B*iÉR /.’&/s']Ã@‰ü2J¾Vø6@[(Bn pðuà×@ NƒpØ;<455Õñä“O¦ÆÄÆØ‚1J€&$ÞŽS\£âynÂÜW3˜tòËlOÙ` 17»WÍßÜe y7w­mÙÈcÿêYÍýÆ%t›'ŸnÊܭׯòÐÁòòë•Ê÷s(×7ÖÉ›o¼S²dÑ“7/6+·˜?¬eçQÀý8;ï‚Ö•üJú72ù]o(üÿê7¿ÌêÖ­›­¶Æ`ÒÒஜ”¤ûÍÛИ.FƱªÄb<ê˜ÊâÅKd#3’Çì¡¶©Öeö~Bâ1‘a—1Cž@~,ɯFŽ)#Àè ÙŒ1_3™{îrÏDX˜ŠžÃœt¸¬…+êŽ]ÛuâÛšìݳ¯iÖ¬Y¥ü±9ñ c‰–ÍÛãyý[g²…@Æú_ëë¾EçæJ÷«®”$©‹GÂ,Ö$ïªÌ%­ÿÛP^¥õ£fw»ƒ:¦ÐˆH-ÏGKø™JWfªwqn@êLýIƒ©ðÄÞ—ÆùË‘´‹tÖÁ'RÀŒ ¯‚{xñºµrð«Å²ùªFBë0½Mü ´L3A8ÊFE÷ë+ñÆJêøñjÉnļcï¨ û Ýxãìzå4‹_…* Ìί‚"?N~ý®Q¥$½=âáa‘yé%ªd E".öM•+7a—ô|ŽF3 üÁo™ðF vKZ¤.ú}üÓðZùP$WhøÍ±¼T‹Çùvã!œžÖÜ÷€401±m§\{Ô>‹‡ ä6ä±ÇCž½Ô JÃÒ¢Ÿ÷úœì•ÈmÈÍÕ‹—äÍÉ ›ëÊ(sœ+«l(ŒÕ£sÉ`€8xð*dÑϘàω#"• IPð³Ì7ÃNTêgçtÅ: ¿™£Vrýeòâ¼>-ÿK?‰U»àdŒïS“üçßï–ÍŸ÷Ç‹'0ànÏ Öºï)àŸ¯šïï˺BËø=6O÷ÜõÓç’5xð {ue-67¡fh–°V¨ Ç+t»{Ô0ÁÞ'Ÿ|,óç/МûX¦/Âd ÜÈccb‘-‰Œ0©ðNœ¯OO*Ê`i9xø„ô=²oÿþæóðdC•‹.¼PÒ3Òõ²Æ„fLvÍëœx½zcb@ ZíæqLf×ÌÿpeäÌäÄÁã•è  €É‚ÈBÔ™^¿q=4“õÜœÄU®B’j$õxÎ6nðÔ6š’¹­ÏöùÂd€e¥å²sç®Æßýîwû‘d)vþ¿º×e‘ˆŽÜ ¼ØßW¢%‘‚\ÿÛn•¼‹/ÖLíÜÖÕ™HVkÿúŠ&ä+C¦ó®LLÈ„…ÉÈ–Þí’‹Õ{!<ÎHDÆp=öxÿÚEœ‡ÂLJ ÕÀõ5{ÊdMÈJ œ/,h•  e½|ÇN)ƒ·ñìš´eH¿‰CÙˆnÝ$ž#©' ?À@¬pËÆ·#àÀ=æØgÆŽ~:Ê•…Rжjx]«fø‹¿@<ûT‡³ r‹Pà„p`§âÏÝÊ௧ÓÎëbìÁ{&óÓO$Æò:-žq-¾S{P± ^Y¬²ýý÷eÇGK1„»æù³Åƒ;ec®2ø&pp7ÐïøvÝÄÝH¨|ß}÷¥uë–kwE¸¸I2Ò3”7'/LÞÖä­9)¨Õ‹ëx÷± pŽU¬4!v§,\°PV}½ †°jÝÌÄÞÉð&HÀ·>áD‘®HÄ=ŠØmðÐÅqäé«jª¤¼¬\ŠŠR¸§9'Jká/ùðaÆËXhàÓƒpœòß¼.@³ ¸×Ùg* ¨``ŒsȯýýŸG/ZìYÇ’Âyß¹<‡¾§€{ùþBÖüJ¨uBn6 ]uÕå‰w~玈Šrd?†;wfÅ«yt^áDâ!¬OLX —èýë_ןÁà${ÊÍÉu' ä‹„``èîÏ ýØ ÇéÑø ¼0a`b ÃÒ€ŒÑLÜ×€'ŸuÐfÓKàÜ“ áÞVU]% # 7À”)SN<¯`N@žëØV¤äx-Tümù /½ôÒ”Ïa¼'œo—ò°ºüß¼ÃÝ7õ;¶gÌ&Þ㪫¤ÛÅ—Hò°a`ÆQ.Z lÇ^èL:ÆGYÅ7ÉRÄþï‚gKWZ‹UèGFô>×_/Ñ,=a‚ÛhÅeù´Fet§Õ’–ì¯ÿ÷‘ká_’xÎò½$Ê&J¬E†vsÞè ÏâtïQéȼ `®(¨Z¶L ! ”nÙ"´ZS±çO ÐJaŸÊž¨^½$a(òLš¨qíT8z–Äôg?¹6¿U´áúÊœΖƒ(kY¾c‡ÔA~€`»† sLgýÀ\¥ßNöÏ–ù2/½X0—³j•Šº[pQc.ʼ”Å‹ÄEk¾å™ð¾ïž4Iêéý[ä8-AÒµm³fÉxÁãfáÞµ±OÞ-ôs'Á­ ؾc» ú• ú•¶Šßž|äÕâÃðÊõäùtNÁ)Ì¥žS3³ÿî‚ݲrÕJ)…2€Û€jÊ“GE2!¡2ázÿèyÐ-ó|T,]¾DËvcþdû?üþ‡Ö¯ßè9Pé¡{>p?Ïao)•]€ÿ‡{Ì5ï3///ü‘ÇŽk¨k€+~Jý…KnV®Ç\€™/³‚±N!ýí·ß–7ß|íl2nÌX…LññÐ2ÉN0&ƒ°°pÔY²ˆ žó'2ã/gþrÿvOZA(3¢ç`r@Gˆºì3fÈîÒPG¨CÖÉl >l½ámà “ctM']ÇE8©pÝ\†ÓUŠ€ò2 w $ ÞÍgrpÒ¡vbðU=ü¸î•ÀßÇɱDÂJG“üõ¹n¦ ¸õV‰UŽ¥‘Ôb„gÕ•Ì>Ýk×ÿý²ó£ÙFÖú³ ÂàùáDâ;7Þ$ï¸]úßt“ôÆ"³0÷ñ]l€Àf|É|þË¡à#ÓºBk)²°ïFb;VHHD¬s$òhn(=‡¾éÍ|VLxTÖPðsf 1#Ü5)Rà®Ü³W-ÙŒ!÷ y]õ.‚7@EAê)ß–¯yFœi©J¯1)™ÚõTAW¾¤c<”‘¹9ø ejµ×3É%¾Qœ3øëTàw•×t÷ߢå+„å©Ä FXß- …&óÝ©ý³.vzà3Åÿ((™‚[SÈ£=*^S‡&éå8eÒÞTæNêÞ]Ççð:ð=ú}?½µ÷(J±ägz €û€F¢)¬X Œû¨†¹3f¤ 804))¯wxëxIKK7Aãu7Þy ñþÊårÈp'©‰lûPš“GëÍ·ÔHG¡"B;GŽ)™âÂx¡ðO~=sD0JõѸÆÊ!!,¹-XÛaÌ£qgW¾<11QBÑ>1!Qù{zäCÑðÕ—_©2 ßkÏo yp,¸ÎëÆÇÆkrp†èR 0dè9Î¥KVTÂû×í ¬¥­ic•2 |L|½,8Ë)pîïVó©e|ñ¥çÓ‘mßVUÉÄA’› >™w#cIW}c^)…&ù׿þµºq™ +|2¬„tépî€6šÚ@ý~q¶rÁ£¹Íý œ‘ûŒîíWå>£•‘T é¾ï‚–›“N9JãìÙ»Ék’‘$S‹Jü8¢æuþ4î ЉªªJõ.@r6Û+ÀÀÁ»€¡Ñ@NÄŸýY¸è“Àïs>y'™À‰Û†?ôË„a`,0 Ñp©üâ+ÙòÖ[råÖÎ&Á³q9%YÙÜ~»ô»ù&tÏ=:¢`ñæX€©ÿΜÀ¸–#÷Çò~a\B C¯_'»^DË0½˜”Qóà9y2gÓ3êˆ{Ѱ*0V¡È§àÊÊ”ˆœXÜ{ J¬Øp¥2…B¡¿@-êPDÐS¡’Š(|Ê `¿™š_"½øÑ>"4&ã‘åøš0VéÃ{a]yUt2aù.èû€þq.¯„âŒÕ!jñQ©B…P0}cÿ-8(€gê„B' P¦÷dK½n€ÐV÷ëF*lÉ»Q @ÄXˆ– ㌠y˜èaSÊZ†`Ÿ½&¾KÆ$m¢Æ¡ ÀóÀ!¤Œi1&LˆHKOÅ4i“g„dgç`ñÌøè Qœ¢´¹Ù½î~µ×¬Y-¿ýíïd{þvÉBnéӦˀ~$ÂÜ 7¯îPðÃøé¥ËŠzfÎ%ø§ÿ¡| ‚Hìö`• ‚QAƒÞ½uP*UWU3I¡¤Â3ÛŠ*µaÃÙìåò¡77t˜=å6^7 Çîß¿O½|à ;ôéÛ;rÁü…Gxˆè±ÌЫ¢„I-}"lø¨¯ÖiOÅa´0+ÜzûM©#G )/«Ô÷3%1q<Í †3ù¡Àò0ôýúW¿‚à½W†¦VÆqb wj9¿fFWhfÐuBqÿÆ:Aÿr»û·nláO>deˆ?¢RÁÁ:¨°º’“е&9ˆ¤LËP›Õ ± L–¼†&ôØÆ{s:]R|„sŠ~Wm¸çPx”#I öJ/à«ÀÎJ‡kÞ¼HE„A(¬t$$ ×ðG‘žWSb`4ÚŽ¼Æ™|.ºI³6ôú¿ý]vÏ›«LÓ}?²hq¥%¨÷·®•¾×]/Cx@º_~¹†|„ÃRÄ1@·lÍù`¾ïxÓ* ‚pï²'PQuè°ìC9¬Â… %Ê+z®¨g„X…“Ì!žçëjë†çF£hÕXe"1XŽVkº³s?LJ¿€)¿5EÅPª[=s0ʼnP¾-~´Zz%‹ Ñèw4¬j C£äa¤ ] ŸbÙ@¾S× æ÷—×§Õ·tãf9¼r…*Õ‚!$2™'‘íØÆ‚¥5x7CáàD2ÀÖ ϲ`W”@ÀgéMMPé~¶<Ça\ïÞ’‚°*ñðUHEªŸ ×ìÜ Ü ìÊ07ÿ80ˆÿ¯½öÚÄŒŒô p(ã:›£…ëf¡Ÿœ¡¾º'*>ûo$,~çßÿÖc'Mœ¤<¨Lpàœ†ÐOÏ\žó(4Ï8·ûÌz]wo3×i,¤×@-Æ• ¢!;Ð8W Û~”üfÆÿ|¯µ„8Ú@%…vÚ\ÏÏõpÌEìM MÈEg‹‹s}½jµg(#¯­°ƒ|>ùk)|BÖ€9émèÉfo’S“=ü@lmMÔÂRÄò"ÌúÏ\_r4ä»ê~_‘¤X~ùÒKš¸c¸ñšèn<¡°*8 E4’ûáMÆÇ…“ŠN,X7óº*ìs×õÏÉ<†ñúFs›^ÚJjc¢b0„k’À`r2Ó3 H4Ì.œÐtÂq߈NpXç9õTVQª¡ ••6L¶¡([È/"â_IMXÃËú¨ásyH%Ír‘°ÒQàD’(u÷¿ý6X{Ǩ¥€ bóŒÜQ:ÃÏCiûûʶÿü™”É›œaà~çÂñdÁ;§×5×Èà{¿+}fΔÜéÓ%*>`h]5]ûõÝïegß­¾‹`rŠQÏþóGkùòx‰)X•Ã…½ð³rÖØž½4L ‚Z]y¤Ÿî¡åNÖV*w(„%%Š vÆßSÀ®£Vuà˜Ä@¿çcŒ Õì‹*òó¥•`ha'ê<¥“ùÿgï<ë¸Ê|ÔeuYr‘%Û’{‰'Nœž8•$¤@H Ða©Ûxl_xûvY¶½–¥_ò¥ú‹6Z–²p^Ó3+'O«ÀhœxÊ[±«åýƒIǺÙñ‹îÕGÕúïJdöc~šâÞ+ß)Lµñ2§ªÑ·ŠY×ú¥ €sÎ 'À5š–S”›”¡=¶*‡]½±ÒéqMzuë­·Ö56NÍ7~œ–﫯k0)ºÇÓ@e½Ê0EšJ.*õjüÆ7¾áÀ…›´Ï_ûækø†ð/Ö÷ñÑïpµôWýðÏÐN‚s; Єߑ]û¢8fZ[Œ€É/°†;A‚¸1ÖZpÙ²e} ó_Ÿ26è°-„Ž„ìÁ1¡®5MoÌ[ýÊ«ýÍû›û­h -2]çw‡¿£Cf b¤aR³¤IÞíÿSŽ9þû«¿ùóú†††\¤ÿ,È) S]¡TrøØêk%j5rÞÕÕé¾òÕ¯¸ÖÖ6·Dqœ§56™JRl†€rH}ˆFP Ó¹5 ÉÍ¥`ù{¤È þpß'º×?Ô’`%À'¸¢…Bdp—´XÀfŸ´^a A%‰Ò– xÑ­GÚ¡L0+“öËÜ<1d~döG³TŽcº7¤‰êã³Ê¤ô!7KÎ'(ö:꟬:kBø{éeb=¥¸–àDÓ“ÿûï\ËúõÇlœqƒ°¶JU|‹ÌºE NX¤çs«_R2îÇàÉ1[zƒÞŠYbþ¤1EØ8ˆÖ!`òîÜ/uqÓat¦g‰wGÿ0{ºÅìÁ?@»¾ i˜2ÍAÝ>ëóª}¤hlµ«QÕ2™\àÒmµ™ðS|Ž´ÿSÊSV0õÔ&Tkq4÷Ý·¹Óeã=þ´ÓL5Ð6y?©íòänMß#Ì’5?û¹…QêÓ÷p2¤é7Ü`Q~ô£Rñ¿Å5^q¥«7Ï$<ŒäÎB¬i½d]ÒœçIóhÇ»ÿó+Ɯ͑f÷Š)¸Wk}ËC¿5øƒ€©9 .Ë÷­¶£4ò @À@Û¥¤¡Þ•O›æªçΔÌq’8"<¡fúV_¨Ò£ йYþ6l´½¦tr½10²‘`óª¹-•Ýu­ÌTŠÅl%Bs->Ì7ž+㉵ ÌŠþcbAtˆþ¶vÓÈÕ,Cœ±EŒ€Œ¿#:Äìeý~͵ȎºPÄýdó8\;zÒÞ%BoÃÆM®ÛT©]¥"2åË $¾U†'{Ç‚‘Òn–Hk<ÎúNO@Bú}©2›ÔÓÊWIPŸ'*}C>›sÓM7¯Ÿ\ŸG8=ð[„r-yœÍ{ø7Y+Z[!®¿ùÍo*Ìõ&'‚[|Öb3ËEEŸ\Øïó~KàÀÖ†®ÆŸSÈÿ?ørv[c  ‰^”úîS´ £t5_ß.Á0 ôM &À:1À¹¡Ô¼ ãÛç»×'Ù89?”InáÚ5ë·^ê£gjc3͵iLÚöçáSÂÀh“À€³ü¼¼œÁÁƒ¹ •Ò% 蛤ü߇÷™’_K½DùKÊ+ÃlHi‘kRLèÓ>þq7ó†·˜„”Í=BîŽ2Íú. eû÷¥î…µÜ÷ÒÉáo†}§|@Ò~™u@ÌåŠq|„J'ë,ãÒš}ü3ŸumB^Ž7ÁØèÖzßùÔ“nç“O";îÔS]?¾XïQ:æ @˜\ã¿rÖLù˜!gvm®S` ì>AßpŒýÏöf Ðf²u. û´Z´d#L3?5[…´ÑÆÊçJÂb¡7 ÛX´,H6¯Ç|;i¸É{TfÇ=(Ľuõ+òð¢1òå,_Œ˜ *­Ÿ4LÿhšÌ#¦åÅençÝw»ƒÐôË.zZS£œKÅzX†Ké}âÔ SÎÒˆÂó{Ÿ|¦‰ùT¦µ|,83ˆˆ ø/Í•¢Êª€ñ&©î ð€öã¹ÊøxUy§òë=]©|)½zî¼¹ÅRÿ7ĹFáù*¤@ 4rõ*í—ÿü·½ýÛßvkÖ¬qçŸ{¾[$8´fñ—€õn)<È?À‡¹È5~Ç·¬f=îmõ(f0#ÄÝU'øî‚»xð'4·¿Fwæk@ŒðqèB Æ{íšµÒj(³t{Îõh<ìÚ½Ó *Ü0õšš¦>pÿoZ ºkÐ!Òæ"å#@ʧ4+œ©Q bn @ÜÅü?ú“OTwwõšmN‰ÔøÇ#ýaV¶Báù&!\?ýùOÝl©îÀUÌÏSx?!yâJ›ƒ²I÷µ` è˜ ºf×hÝÎ"‡¸’Ü3h §<†@a‚Ð#„e¤DÝqDZ !þvk#ÄOÀtI¶|òÎé‡6iÀÂØÛÚå)Yû´q hånÚ´ ¯;Øæã‘l‹rªØÕ*ÿ±2]ʉÿÚ§¸Ùo‡<»Âìý»ýæ‰zŽRl¼TnÕ÷è¶<ø€©ìÆnfñ HÚœ[ßeš0xNªÄºìY÷«_»WòIŸ×Ú‰Í@IDATðõ³h ÈqǶmnB“Ž=Ë^£®ÿF.°Uò’i$ÖH¯1 #³ L,z=ü6àœéùÒÍ?€[Œ‡ˆmëÖþäÏ ¸V|m4½ü†‘éñ£?æ5Oûeõ)ó]ŬÒ\Ã+%±aÊÀö¾c´‘–[á{g'd,Äh[»ÖˆyZ“h ™csš…óš–9ɆFy/ú”÷=¶Ôµ¾°,X—úF&(LkMMà¬Õð¨ð»øêÐw´WLÐ’þãœ3•>§ŽDìæ\wÝuµÒôô_Œ|}“ëÂ0zÃןý{ ÒCÒ€[ºô1wúÂ3œz›]~¡ÞõÃ’ÈCõøÎâkûî|yaë—„¢ø¸n‚S è°9ä±~n÷u£e„s‚!HóùM”.ðò5k׸9sæŠØÇÍÝÚ@¬«§çkmkµzUÕøÂv…«W›o.Î5"Ó–½ŸQJí D €ÔÎg¶´ögÈ)~0ïyß»'œ²`~~kKà©xÂø:S¥gA“Iû…¼|ó[ÿejþ—_v…숰÷Çá_‘(­ïbè½1hÀŽ!ñO®ÃÙ ÎÕÀL—ýѸºçáuýÆT¡GþÑm¢×+'"8Ü)çm6¬w d÷SÚ·>èï°syÑ35·4[ŸÒÈ OÚþ`¤ÊñˆØñîƒÊ¥‘þlŸ¶‘HËBÈùþgŸuÝ»v¹<í™6#þ´¶¢”¡Їq@OšŸzÆœK¢8NÄ´t¨¶Jƒdßþf·ví·J¯¼òª¤¿ë¡©Ùœ9.&ØŠÊ„Ë/=,"À1Ÿ€ïTíã<–(+òcaf@ºÖ#müÄy2ጀW”wsÜ'ïM˜ŸQÎ[°`AåìÙ³Ç4MkÒëSĆê#Œ ¶íÜ«ÿë] ³v›·nqßûþ÷\ƒ¢»,¹x‰EÊB…@Ì’*y\:¸ ¿#\é }7úöB4Ýðr™Ô©O»¯?jƒþIåø¯]!¹¹imp'î¼Hãè·±•×Ù%8³^¸ù™Š"†ÎÆ>çhòîÚ„Ì“–qC}}Á}÷Þo÷f.NmJC”R3 5ó˜m­ü£TêõGüñZÙ“åtIj†¿~B½-Xß—>¾Ôix-ÇDíÕ5n­¾÷={öºEwè6ªŽÎ¥³%K–ÔLž<9¿F!ðx… Ä$”Ylj×+ü–„€Çܲµ¿â èôŽò±ù?"…xîðëžðw¹A›Ü‡gö/üž _æ\Uý1•k“‘/ï”±vL@fº=c@„y˜ ½‚S@sîÍsÑ7Œ Ѻ×ÑÙn:¶¶Úm“ÓÒíÛ¶{ ¢mÊ«¨¥ÔÍ@ÄHÝ\fKKÓ4ùÁ̘1½ä–w½£¬­UNõ´ÈªÊ«\…ì ¢Ågp`ÈœŠ|ï{ß5Âÿ,œkIb¹a/"Ó¤ûHøÃ,À!® `x‰¿*Œ…n¬+€„ÎxôÇLxMKHÿaPîX)_ãì•=R¢ì‚D¨ «©W똃þ…ç0.´6›„kÿ>qÒûúr7lØ€óTö§Œ*Z¢éMªøÊoQ:'ÚlPMzžˆÿyï}+•Mx$õ?¾ù,r»þλÜú;î=9¸FzR™¤”ØY6\|‘[òÅ/ºY7ÝdûaØì—³§ÙÇ%’*›š\ã›®”ªæÉb ›Õ¢B×*M‹¾ø%×%in²)OŒ»Sä¡éª«Lr鑨dÛ}#×÷DtaU¥Ì&ºªÙsŒÐ'§©H‰d-„Ç ‡NžXÆ?Œ€vE†èܲżÛC\C°Æ|†Çv¬î`® IQ.Í*9^,”ÙZ®$vØnKºkû!cÏtâ*³¿Ã”hyy…;°ü%MáAó @„”|í«6§~ãÌôßýñÝvoÝê(¬xð&ˆÿÝ"øñ¸ÞÓÓk× ŸÒ=ð«á‰µ “¹îš«‚w6¼À(~³þ!(«eP3ž+’ 7möâYãÈPÂ9àTå^åMÊ}ʯ—N8Vžò Î=÷ÜÊ)S'‹Xd¸kuEµn…ø¸­µC¸¹ø‡~È=/GžgŸ}Ž«ŸTo¼12ß!™ NÄw_!îh4¼–û>äÖ·d8¸¿b€ˆQ@”¸¼µ­ûÆ8°r Ð9RÙo‹•ñeÁÕãÏóµG `¬SïPÄ™Ír6;_Œå2™X´dø¸425»M `HtG±L{Ë ýýÒÀyJðæ~œFS5H*£ôúš7Ç?ÎåW^^ÅæÐ+¯¤2Ô&‡oæZ„Ï<÷¬ë•¤çŒ3N—ä?î›@÷róm8ºcí>ò`?ìTØ`þ0²ËöÀCà€$2jk(GöB2Õ"Ú£mÔŒ„—mR=óð¡pÆÈAa§8’“&‹[þŠ{ä÷¸÷Þöš ÆÀ¸†c€šÕÕ•9µµµñTרøËVéøþ@ìSŒsޝêk—.ª®v¥FµèÓŸ ¤ž¿ÿ¯]5*Á èãÁî‘Ðs¨ÿ·¬KŒ?Úd¢JY!5jÂ.ž"ÍŒ1bÎIsRàdIß¼¾¹ÙY'š ¦ûDå¶Ý{ŸÜ'Ò,€ÍÍœ^¶®Ze¦-¯¼âj/võbŠ¡no¾1†o£xöt±y•éB¡ˆª©o»Ñ•iÀ®‡‘gþçå˜oµ1а5ÎŒÔ6.kT{—+k¾ñ_nÏOº)×_çÆ*’ æ!y8ø~­µ‘&0¹kÀÃÙ£Õgß®Þ×<1…vãk%œ{–658Ù7ä™y¯Uoø}úem±‡Í¾ån‚ðÁ-¿{Øm{ì19Ê})%š[Ãûö]ö ”Ä ~p¯òë!4ò óçϯȑӬ2…ñÅCeY•¹§ehÉßf{ï=÷ºšÚZ7uÊTÃ[ñ¼ß/U{ðlÞß ßL, ïåèuˆbíÇ•ñ¸7Ä»áë*æ®?·öÀŸiCÿÄ~ãA~´†3¡ÀÑjž‚6plpóÁ½Ógº•«Vº{ï»×½ÿ½ïµOYÚ-Vt¯29%íÄ÷—öŸY³fˆ÷T˜+ÁœWAš¯Q °Žl“4 ©J¯ YRÕSÔN¦fàüøŽ,˜WØ'I!¶d,æ’byΰðÉÀ…~/]ºÔÔ/à"'€~C¢îa€Æ7¦£Á¥ \ìžA$PY9§À<õO´° ØÖž?4v«¬?ńݵ²¹,ÐY¹r¥…![-':úÇŸ”–u±tL©k•3@Å#Í‘R®8³…²·ƒSbjZ¾Î(ø¸Q.ï”QÖ]1Í Dä©þ°›rÙe®rú4C2ì¬gtcÍæRšGì÷=àv‹á•lBBV)§“0ff¾õ­æ»d¢ jã#<ŸûpïÊxí/•„5ÑÔ²vÔéKdB@å,Oš¼Œï’Šñv9.êã"ÙT1µÑ"!Œ2¤Ålë9Ù6£ú‡ÏLªAeûÆ%µ†$ÌÝŽ‡r;xÐTƒs¥}eIë*ÓÉ› A?ðÒË"\wº+Vºº%»‰Ê…‚—Ùý¼–55¹éø\8}¡Ûóø®YÒßÖWV›ˆíÌ'½Cþ‹©LB MªçãÏ?Ï5\}•¢ÌrÅrÀè™/™ßë·Gp¬} 9˜²HóæÛÑð«‘f¦LžöƒíC…RßO“ÆL+…ÿUKe»BßêØ9³Ý Ûº_aX3”©¢&¡ÊùSå“ð»JÏ`‹«®®®Hx¶o ¦õî…‡‚“Æ'~ÅCÕûÓˆ½ð‚ ƒujwŬ‰•­JñLÃ}Áyb :ó—L“Wõ(€ñ€øÏAU LFØ«ŒÇãiÐè‚ø1ëšõ\1G ï.SXÊþþ^ k¹Eþ ˆ\€–îDá?V4ìEMu­ë$jŠè•ÊÊ wéeKÆÞ߃ûÂa/Qþmø;:¤`hŸ‚†¢&²fþR#{Ê"ÍùÈÇ>TM¸âvÉ;qeHë~°`‡ÜVIå~ÿè#îÙ'WÉ“,’ñ˜S•c¡Â@ €J5ž˜¶£ý´ûÀêðG¥ìÄŽ°!íWPÀ ÊÚ-(´ë\Wg\@]²þ‚êÖ†ý¡b\œp"-r`S*nbcc£õï ~;2Vþ郣CÎLxÞÍ›¶ )œÎàÞ½{Q=+RþF\Ó¯u pú¤òÇ•±cKiÊÿ{ÞífÝ|“9ìÉF WJ8é}ãÜl·í5?û™k7:©¤ï²|eœ÷þ›÷®w¹:yãå ¼—šýäðÏ•þ(ƒ­õº_ß! „u oúu×a¬Ç„šÉL%L„Äè{A&{ê*ÙÈýMo~³­àO”Ò;HÉH'‹4÷3g¸*y¸GâØ%µÎ!!k1©µ¾íL'c‰ÆaaϮݮ]f&mbá Tasĸæû˶dZ­ã²)S\õüùŽh „åÃA`ï¾}FÄyb<£cç*Û;Õúj_³Îí}úYSÏc¦09¹Ÿ B3£Ï–¥/í>1Œ»7o9þQÂÐúœtÃu®lz“HåW;þ†Ž¬áßq•uÒ²éÚ³ÛµJƒ.C â“€MÊ•OæDT®éHµ/^\5yò¤\œß!«ô¡ÿx:ö4eƒ¤áyŸ»ýöÿvŠæ…ö€"nå™·}¤ñ1ˆ ˆÓ€³Ö?Ö±] ð_ØßCàfýq$‡¸¯¦iÌ’µÃ5+ôÚŽ¢êø>‚›aa9_ž}z†|ù#*Ž»1ðíÓ x xøž}»W3©"ä/}ìñx3„s¿¡|”R3‘@jæ1[ZA} c"KóçÏ-A:ÞÞ¶O8ÐAIÊ Ñ!Fj¸@m¡ë|Ù²¥?ÖˆTâY¨R½û5¥?,N;¶FpÿÌæ(ÎæßŒy†@ûõC8b'ÖžnÚ5»§3ýG)(‡¦‚s"äéÜ îÚýNø`CÔ% 4Aj×›6orËädíbÙ^Ó¨'ø;WxOe^ðs `œ#[¥Ð•ª9íC¢?qeÊ]«ü¿”Ç)§,Š :î´…nÑŸü‰;wŽMf¢ª})ÔIÚR$æï»ßíÕ÷žlªš>]Ú—º*9L£Ýn!í£I0Ò ‚+§Ž¦øˆe¨Ô&鑳 eÃE-_4!ÖÝq§Ûõüó®_ª€É$ˆâWÏxË[̦MŠ(efP fþÑ@ºá:î¼sÝVùÒhYµÚ‘ Ìö@>3C³^ÐFÀv½Sv¦½òбi“×S]ý•WZˆC ÙžÁ³( v0öºK–Èñâ\·[p~ßÓϸf1˺wï²{À®Œ§ðæÉW˜äÄ4ÝóôÓnʵ׺qç,–cÃ)Æ–E{Ròo§P^ÿ'^õ&×!­ \òMæ5š”©\pŠ«>ó 1æÒaL•Ê14Zˆù m¹õá‡]Ÿ˜niN(…Ĺ¯*Pù å“5Ícà %à˜â¢‰ ~næ®BÊãÕñãòi­»6Íõ) ÙHYðÙAµ!§^F,€ (ÛÁü“r¾=€v†G‡×ÜXhE­ }Ñ&ÉhN¬bps“è‡×7¡¦} KÙOÃØ=Þ‹åü·G’ý:1d_‘¹Ö iè^mÙýÇÚP#Eú®0À¬‡3¦5 PŸáËGÇÔÌÀ ØYR3ð¨•gàL] ¨fÌž;§„R,&RaA@ð² sgÐ@îV×®qu¡Jr¯}žâ‰”ó€ûBüEì ðZȰv¸§ßœ›jP= ˆÄ3!P0¤1y€ƒê? Õ#€œ%Ê}œ¬€ý Zg°Yâ²¥¥ +²s§k9ÐbÑ.ðe9Z{˜ybpˆ•aÚ cÆcà×sˆ ÚïõyÔ36¦?T†S’Ä<â€gѧ>å.YâÊåLnPˆ–9}‹½Ý”tõ†iÇÿ;Ÿz*iÄ…xÙ„_Dàx}0ðn!Üs´Æ@ò‘ˆ÷ȃxOó~W¬0QHb³5a+cdÍÏîºäD.Ù„Ç÷)ò~l&0bPF)³3Àw !@H;Bæ®jÎ\# ·Ýu·ë”#3¾oTÔÏ2;8õFߨQCT·½úªÂÜí’Ÿ€WÜxi¶Õ¿é W"ƘFŒ 8Kó ‘ùœú–ÜXEøØ%“¼ý/¼`ªøý2s°Ð¡Œ;Ó‰9Õ:Î×ûì’¦àê¯Ýí~RþÄ{Ú9‹¬3ÿ0ˆ²iN3=MÉöÇ>P¢h㯸\þ Ú,\$æ"¦r´÷®o˜ûb5Üt£½c §éÛÆA`Ý9çˆXaøÔ6ùÑékoKöÑGS¶ ýµò_)£º ‹:9‰’ ‡Æ/Y•Bk+“J¤•kÚµ¬32Ȫlé9,U™Ç_jåkÆÖ~éÑ‹r„ §„‰D6ŒV˜+UIö¹è¼À|yéDå¬mÝ£ Ù·z?¦ûÔQv3`1PJIÏX. `"üü(ߘµÍ=•e‚b1©†º†ÌÉøÆÝË+V¸EÒlfN®®y«¥%åæœ³åjÁÃêêêEèòHNâv“~ðÑñ°Îa9ìfô㤛Æ|\}õ›ª§MoÊk9 --ĪJÔûóuÊ¢³KŠ1ÛâTX®SNY b ñ%¦I,EJ­ÌÎuDÍßœ£Jô%¸&ΠڦáàÌ/vî„ý³îIAYªéLé@‹ü¿”(Ÿãʪ4Pêa@˜¼”¢ 0Q+6EÆpI9*óOå;ºÚí909PÀ!q(=[{£Ú†>Ž’Pû‡ðGõÊQÊ$t¹î¼óÜ‚}ÐÍ”³(B§ Ê|Ã6v?Y µúÆ­„Ý*žÃ û·ýÑßs™ÄtŒ'~¶ÐÕH/;cÔ“Û¥¥²å7¿Mh03ˆ(€Ië,+“¾ÕIÿW}ï{nóƒ¿1ídƉúñ¤óÏ—íÿû]žЬ}îdòd© üÌÇV½H’Ëò&ÙË©N캶m7ÜLƒå™Z0ƒ!Œ ªQ§ïV@‹â§CP•Š™Ê·ÀÓÌíX¯Øö%s€jItqh#˜øî={ö¬±8íÇj$]÷´3¯0õ`ì•T’1Ëø0k2- 4 £”Ð  ÙU¹PQð´nz¶í°ïWȉ(®0\d¸žüwÂû¨9÷Wwí5¦À÷ÎD¿0‰n3qñYÆ|Æ1`4@X¨³”yÀ'•{”O¦„Yèû°ÂàUÖ+Îý„ ã¥05äjÇŽ3\T/Û– æL—ö‹ÑÿËÿù¥á± høyAÚNAùáÊœA¼KàËv0`Í¡·!ÑÖ´Õg2Y‚¿V‚60ck}XêÒ½ Èï&‡Rp'(ëëãâ xÜ#xŒ‚­ò=qê‚SÃæ\œø À ¾ ÊËKÝæ›nÚ´Ù¿omü ÀãèÖvô'ñðÏÄ[ˆjfÓ FˆÊÑF>1C,±øºq¶lÛj!ÿJ$5ï‘mNQŽ˜"¢^ú*^¼±²k^ú )PîWù˜™@xÍÚ½÷}2°w“ :ÀÑixEaJzçU™ñµU…ø¥@•8<#„…1 €r9axm‘Dê´SO³6<À„IŒ!fÌI¯´Š¥ ñk¨¹9blÐäC½q†™jÿŸQÆ»kJêkE\žþ‡Ÿtµ".AülÜáûKI'oÀF@ø_ùÑÜ.!­ÉªË{ŸÅ®NRE¡D’wFˆ¥ãÕ  ¿.!Þƒâç‹àJV­>‘ñ¦L—RgÝ(Ïñ£58V»U ¡6íÚ7KëalBL—cµÝKlL{EpFáí0' !fˆ„–ƒxÑ`ˆgb½$^ËË= õ‰³À®íÛåuÿ9W¯Ð‘5r¾g+›•ßDï.e5Mš®1Õ(„hÅ ù\„wÏSO›i>ŒìÈxbž”XÛ¦ÛxÀí“sÏz9 Äñb…Ì¢Š´>!ÑlÊøódY‡h®äÈVšP~e3§»ÝüÖµÊ#×ñ/Æ/çùb¶ˆ1T{þ¹n⛯V1‚3ÅxÑ7@œÐΕ_¢9\ýƒZd Lç­êÕ¯ÿ«œ¼JYvf®%…«Î--“‹.-¥4mõ/ç ð\$ñdnØi®—Ë”³Ü±b´ —Ç<—pÞ‰¿µ˜£S ᨠš­: ƒÎtÆ’5Ç€!n„x×ðëöø±Ýúëñrcx¸øQøÚbû«KgJÁ_xتShžç~ùznÌta$ã6×3ò•¾úÕå§Íh*~øáßÓ¬OÌåþGtLn"@ró—mµËâ$¢>/¡HêYL¬LÎ À@„ëÚ^Ì&½7£ØúØú""Ÿ²¢˜ÎÂߟñ ü×!ú©kLÝ£\¾¸€aç!\¡„à„þ ¡W![ü½0 t>RÔP%€Ý!de­/]&œ@d·Ö ŠáA;À1íL¿i‡ëÁ8æ¿qÒÒÓÓ{¡\ùhé-ºñi嘿…£ÕuæFÝÌ›o–s³›]•ÂoÙ\djSÕ OÂB¼O!GûV¼lRè¶M›’~ˆq§žê¦Š€€ø6D=ñ¬>Fˆr"Ä?ÝAlWX¦±³ŠdaÒz†i¸ZL—V,ZhI ¢ÕÓIÒŒIDã"©Î£ÊÇž½[¾c¾IÂ`" .“‹ /œï¶Üu—BÜIò.8ÂHàZ¦“—LwnÙêze>Ó¾aƒ…·k¸æj95D8§Ä¸’üNƒ†RôWcÏ $ì—,q•ò}Q9{¶+ϸýò§Ñ-gZâHÖ2ž˜+ö,í³Ä‡ß p¯ÂDN¾^þÄ-•yH¼c²–épÆ?mj}ð bÆR®w]¦30¯ÚeÆÂ|÷îÝç *Ë]±meÓ§‰! gŒ…ÒèAO¥m|¾adŽ+Õ8pÈ î¸æ§?u­ZWæcÊ—Kýq¬š¼Yy¹ò÷Sß|ÚZ ¯¶0Wš¶9h£¢ËÜë 1µcìÌXÿW ~r³BŽaèÛ<¸j>ïÁ'š0º†€øA92 ðnðë]5ø«{÷õ¸°5¡¶h.ÞÖŸ1q%(§3»/â¼/ )¬^ü?žg„„‰î Æ^-ÓEœnÛ¾ÍIÂLèƒÿ…ÈYmµ…nRý¤á4ê\51F˜ßD. ŸÜDÚˆêdÏ ÆÀ¡Æ¡5)i»6¯­4y½ÇžTùY¤æàC÷P÷3Î6¦˜(ý‡`šñ÷°9Òâ7f@ì:ÄuÖ¦_×°»î†`hÝ‹óiIœPê÷KåÝÆ‘Ï-r±oe¹¨ûð â@û*ûýеnÎRT€IâèÕZô§ç*((È ¥ñíÆ¿Cçxû7§.q×>%vüœwÞâ¦Ë¹Y©Ì†‡K¸á7xE¾ÞúêýØíKAø"TQC¯•n¢Ä?¯„Px„Dã#‘w ²G]s†”UßnÖ$ éÐö¥+/u}2ÅI6Õžº@ˆæ5‰H²˜ìl¦§>ß$kb_ Åú¾ÇJ}×£‰p·Iß kµ.3è3§P¾l$Am[·Þu‹ñÝ"‡T.8ߎܵñ±–½"Óc©?hD`˜zÃõ®jþK3×—‰Ž£œØç0ÊòQ±ìžÂøáa/ѯÕekŠ# øñú_T¡´H•úû?Í#@Mê¯ ±á1¯Ì:µs»®k0Ä4àFà|$Ð ˜ÔWæµ °ÿ °=~Ãá앚m›¢~Dvªã‰Âa²çSÆmÔóÎ[+NŠK´IuÆeóãûÃ6®§3”ÿF&@Ò ÉIƒì&OûØÇ,´j´æÄçPÿI÷ñFn„uß•ßýŽkß¶-驨š5ÓM^¢ˆ rÄ“¨í¿Ä€Ö|T¦»µ &’ **mÝþ5'ÒR ëh!ñ\¯þôçnÏ2Ù.JÚšL‚A6^vÐS/¿bD„#™¶£ºé# Ëòe^V9{–+‘¤oü[éõ üÍAü?0ÏühŸ0ÿÒRé”óBÔëdÏîÚ†£2ìŸÙ’XSÌWÍ es?ÍBî}æ·ç‰'þx.´0NTÊ—ãOˆ×m÷ÝgÌ€†k®q.ºP¦3ÿ˜$Je=J£œ°6F9²ÃŠ¡…yܼw¿[VŽÛñøã‡‡•LÙÕÒ&å¿SÎv§p&L’vi.B&pÓ 3œœw̯ põ¶¶Vסœuåu&œB¸6¨(9CÈü•雚¿ÊKú?žƒå›V@PÊÚïe]Bh¦¸áì:)é^€ëoòb„~ì÷A׋€Ž¶‚Z‡þòñmám‹L°þÇŒ)±£œn›V2%|µÀ4"ÄÅu½èH¦æÑ4sÃŽ¢ÃñÌ@þñŽÊfý &R”s»!ÂÛ1ê`aÇ`qkÉé?Ü<tÂn°~{Dœ@ˆC脼ʾ?‡™(2߈cð+,oÒü<ÕSÝÁð:̲þÜ4¤/ -¨ëíÔÁT 89¡ í¢>ä¤Í¾ú7Qˆ=”€§ Ån«’¸¬Ü:¿Ë+=ÒNRU,N •¨0{âÎêèoÅ‹âqx“2ögܧñ„R¨é×]kžÜqú²ìæ„*š}àH#žù—•êÿʤ%ÇØìOPÈš1bÒ—C½÷H:¶’F„wí BóŠ•®HöÖÝŠn-‰çéܱӭýŸÿ1ëdÇU=k–›|饮LáÛ¥v¥“l´Y/0x‰P{æ"W.ÿ&ûã~ó¯ïp­ ÕÓF€i°e2©?ó 1àÙGkmëÖº©±O–m3NíØO, áÍ–R> ¨5Hü'^r‘«˜=Ó˜,ûž{VO›Ÿžÿš$Þ%Žé0uZ÷Ý”ë®sµ‹Ït¥æ'&ª—rg˼FãH|ÐüÁ4¡þ¢‹dÞ6Ö4qº›ætƒÚÿµòciî'Ùæ Â_>¹Ðª>*P^k$7¹þó‡€vOZ¥µˆÃ=„ihòæ*kž(iX³Îbß$üÁ «¯o¡æ.b^ ~Þ‰@pè`žáÚêPý÷=}`Ø­®ÅÈ{°]%¬Wjz†ÃRX&|ˆC·è—>HvÎA ˆ"‘9×-`ýèý#üçhx?cP.*VÌÃÃSÄ8|>’ú1’𾬫|˜ÈÅ aÍbÞãðd@Õ•…fÎ> “Ö‹p6€ø']ÏÃ< <线ÇqPåq<€3ðDyÓ Ðõ!@¹Õ7múéWY1 Ì<@Ì! ýÒ8èÛÔ;"yàb ' ÑõPñÁ‘‘žÛ·„ ¼ŽÂÀczñsyÊ¿Gy¸V€ofÔÇ¢ÊJsh¶ðŸ0{“‚ºvTð5g€MCv‰û¤†ºâ[ßRœâä…5²»EõŸv“•þ3~¥’Úq7í×| ‘ ˆ ß.{³ÿÕ3Ÿð¤5˜¯0¢/ýìçfšl´…Ù?óL× õÿA1)£tòΈ#NÛD ¨»ô‹u¿CªÂ[ï‘1€ÃÂrOÑ ÁJÆ?@Çæ-¦9Ô²jµ›(b¦þÊ+ܘñãňÖNÖ³dKb‘ßd1”ñ P-Û{´ö>ó¬9è;‘þxßäi&¬üÒ—\íYgºIW]íj2²lê31xš ð+[^êI<pÜZ}‡ç|æ3î¹û7sV›FF8tÿ\y…rl„Å‘Éôö!~Á1ñ±Åyæ·aëz ðgpaˆ`Ldñ˜ÎŒKà¼ÐáùÉBËáËô—wPjÿÂý‡Dô ÆâXœOÃ~DÂ_ýÛDªŒOf fžwÝßÕ§ÁIk#8·¡Qø)Ä úE8gaY,!0<˜sÐh‹ƒÒx–BˆaW£Ÿ Í@ÄHhÚ²¶RGüȰë÷„3À€ŠC¥°•‡øGâÞ“À¼ ‘gÀ°Ä{À`1s¦€ü:G ¦îO}T–behO­Xê¿iÓÚP9à vûˆÁ°΃2AÛ6òDÑ/ËŒŒ.ÁãÁ`’x¾Ã“ Å%sx¨y°’5ž½é)Ç Uu³¤UÿyÎé7¾Õͽ宲±Q„ÍááTâ†&8ö]¹Gÿâ/\$zɦ1ò#PwöÙú/Ä?ã!Ž=N¼Ýl"cìܹ#XϬé´ô8î“-ò¦t=)ÐJ¨‘s£˜.x•¤ÿ'ú§¦Ïâ»/©ŸäšÞv£'¢pëÝ÷¸ù C‡B z‰ü‰n¡ö@ÞëÖ;ï2 …É×Ê?À¸*‹…ÒŒK4,ê‰zž¨ß‘g&Hû&ØÙÓŸû\JÂŽÜ›Ãóå»”«üØQÊœèËfš‹v)x)¨áÍOGXj¾ðW$ä”G³Âê"ØÒÍ!©ö“ ¤‘Û/­[®Ò+úÂŒèÅä-Œ\9ã†èæmˆ!€>ó øá¯ö©c=è`ç8Ôî쀠È\S­X2s]~©­@&Ç]´‚RöKã€Þ ÒðP‡µ¤>4nÁX„˜Ã’Ì »ýLd"@"³–½uVÅmÛÖmý‹Ÿ‰U¾Þp‚¸Z¶Ò;wì2B¼O÷A ô`ð@xÈ N‰Š‚Bž9ÁE€eµãjÃ鈲øé±sq Ø8Ð"Žk——þsïUåë•—(^Q¿+ò nø¢?ù«‡md”R8l„ÖÑ{ß%/ÔÏüÓ?§¤qlω=z÷¥*ñ=÷··šÃ¼DÛäB½×S‰¶“t=­9ÿmyèwn‡<’÷Kƒ'ÙT{Úi†<æ‚Å,r’m5ªŸU3 5Ë·ËZ(¬®r5òP!Ÿ{ŸÛü?¿rmkÖê~àÕ´€õ™Lê‚­….I1{½ mí:W{öYnòµ×ºò¦&;ãO£Šóñ=±ÆÌXBØ0QNf+5 rηWÒw˜=ûöÜ`ÜOzç¼KüA ÈñâÚoÝîö<þ„kzÇÛåsá›ïŒ)ê0-3`L­ï „…TDˆW~òD¾iéKÎPþ€ò2åä7 5’âdRëPÀõ…8'šGK`¬F ëHy ЧKÀð`¹ýÔm Fê?ua.äIý_q$ù‡‘'é¿È=Šì×yžöW…%pC*çCu{âÞˆ~µa˜³˜´Ô!ü|` 0Ç £'ÂÇ5Êapܼ_0•„ðÑl¿‚?±þ¹£ºÒ‚ÞU¤7_ÉžF €dg0»ê/Îúõë{´ˆŠqºÑ/'p‡§±cǺ5¯®uãjjcœ9 ÞíG-F²gp=8g¡Ä¿¿ç¥úö[u9Â@€`ç²eò¡ÿ|™þÎ~×k~‚ò8,±²Ô3Ÿáy®‰ñ¡8šª’®Á¹!o÷kôl8´Ÿ#þÆe47T½ø Ú©U>eÄŠ£¼ˆTzáÇ?îå]"ՈƥÔÍߥõÍ=ä^üò—]o TÿAT±ýoºê*sØ—ºÁêkÓ÷[TUÂÛ+Á˜8  ?‰>Ÿ13Rí•ÿDw$ÚL¬^eS“ÙýW͘a`ìFtòºœV$¿¬7ø¨–7ñ¿ù­ÛvÏ="¾wIÚ€ecdxø¾Ée¯Š£ÀZs-/¯p5Îz…n-V$m@AÖ³dK‚¹B3a¼4®‘6À,…œëv/}Âí{þysÒ†sÓ’ NÆKc«H¡W;BÝ™Öóîí'd\Q§)óOQ[ëüÁ‡\ëÆ n§˜PiLªíyÊi÷<˜À3l¥ŽˆßƒÝÝÝÛÛÛ$,¯Ëñ¸çÑÚCJî‹­¼ÿ2((”Ä_5@!Éü—§¸Àeó$¡Ï“Í?ý¡AáÝèý+I¹uP„¾îa6 1>„­9ÎótN“ü6 Â_mn­ –ЫçÓÓðdø¸.r<"Cer@[=at Ò2üùYO±¦L;@eGAaÛ¹kwK™ŽJ¨ý£7Mšpþׯg´‰K¨µ¨Ò±f€¹Åk|…Âôí[þÒ±ŠŽê^YCƒ›|Ùe®¬¡Þ hNu‚h¯š>ÝÂ%%Òv¿Ô¤[7nt5óÀyNPÒ.] "bÕ÷~ h /›_ƒdF‚j5jÿS4ïCRUŒÒg¼í?Œ¼­o¿Ù;çl ¸[¶ìýЇ}f-û‹à¦“ïnûú Šr±×Â6\}žípZ© + `ƒM%ÓC±?ó[¢9«l,•̪yf÷cºrtÈÞ™Œ/’;ÍEÍbíâÅÆ ˆÍÝhêFeNš`ï#‡·5óæ»]rLé×y`ºÚü”ò+ïJCûÉ4CHÄh9ÐR(´3Ûc¥ÒÒ2W,F™ê˜OÏ„xm‡vG]…ø×?hið_3-`})jL„¡aÉ"æ!ðó ÅU™!™ H3:7ÜZ× @;1Ÿ2Dë±]üÐÏ“ýÜFÇgÁEú2¤Žàú¤ ‡'4xy|€óoÞ°1P98Tð0!ç¡ËÑY"31™µì®³GÛÌwïÞÛ·OvÂc¤*ŒíNÌž&n×M¬³ÅÚ'äÊLt4ŽŸê›m±Ô>¶°C¢ßj¡rÝv ;üˆ`×Í7åd¯äC Q/dB¼W…©ø«Œq#u´ö”bf\Sy€ 1€øSŸÝòŒŽó¿¡xŠ< 5izÔhí"Æ”‡ZZZ¼ž7:ú(O;jý׸";qñYnþûßç )nÊ_£ft;¡Ðû# ÿõ_ÝÌ›ovÏÿß7¢4‘¶phW+UxþO—]j±¤}R+N4!Ý#&8D³9Óóg:á¡}óV·îŽ;\÷Þ½Iw_-Ue˜.€Þ±YÒF œT3`¶ÿú–ó%.Ÿ>ÍÍþØG\Ý%KÌ,ÿB!!Èù™NÞ?@_³4:_v[¶º=KuS®¿Þë\ÔZµ7±¯XÎôGêOcÁ, GHuíYg)ãt™ÈÜBÙž¥»Ž-[ÌÇ ÷3™`öϸõVÛy—ïÈ䢾Ò?ìQ¥u3±.ÒÓ,R¾'ýOu\=`š ˜ƒiÿ¾¨ å±.©8²‘R¥ðÆ"iŠa íX9çV9ÆÀ'€À ²~Pë—=€Í5ø3½ TŠà‡p×?áð˜C@7ˆ@½!™  CÓœ%ÕõŒ€ýöÛ=`Â1–4Bx4¼œs²ÆC÷õFÍU;¶:Ö„?!9Mà ­ZõJ¼Ê?ó1lfRó'³?5cŽZ9ö ¼¬ÛÆ ØúµëÏXt: @À#°%Š-pÝÇ<`ò”ɲ¿o“ä??PŸ×Ì1©=†Å œ›ç¿°uÈØýØ5ðŸ@Êî‡v{d¸Ž¨u…!¤®ÓÇîäYÙð:×5ƒkaô HÂéH¼¦âä¤ù@³=Wƒ¤¸GMz09öîÝ+ÆôàAÅ]õ ÜÇÃH8M”dcæÛÞfR^#"ãf­F:~~u¬ÓÜ_õýï¹ wÝí^Tø©îãôJ_*Ûÿé7\oZ©òüظõ}ôôº ÅDO4!µë“ê}kGíe<©Ë\9Ŷ³eݺ¤%;8› °õò¹.¦KÆç(ê0±Ð6"_0ÉúØ3N—€™ o÷¤Ûò+ùX·Þ¼Æ#M4É|¦¿õ—«½’1öìÙãöÈžŸãÏ=×Âñ•N ¾VùÐ|Á((/3Oü3gYè@æ[ü^15ò%qL;<áýŠ9qÉ1$Ù;ÌšyJì‹j0ÆÔÑõ^­-ý.ýß•sâ2¸?P~B9ù@j$E •T|Tˆøíß·oß ÔÿEãæ‹°—†Ä˜‘MqªE —–”º½Ò6¬µ¨°È J@G˜nM¦ØŒªÜyÍÎ_¤ÿý¡?&¬1$ÿ:3ž¢&L“™áy_àߨê{|Ÿ6 7êè7‰ë±¤z†„ÇÃ*g4ƒ`!!ÑàE@§¢n$ü¼OóA*¸W8Ò«¯®‰gðN‡kXùèOb31›·l®õ wà‹/,ë>ûœÅe’Ö!iG• ŸfHù ! õõ¶Ð-N¨€GüBfÅfÀq-x-h? ø€ä;×rXìžÎ,”ç·ù„úcL¨yÕÔ—hÃê…ľ%®:¦ÀQe=à”a&­R¥Í™3gĸˆñÏÞ#ÀÛºmûÁ¶¶¶À€OЙ_öxÎË4M×\mžÌAt¢”Ù`£C•¨ “/½Ä¢¬¸ývÛÀ^k$HÿÇ-\èê/Rüù4¨þ[ÿúèòEÀ2Ñä%ä¨àgܯ„÷¼ø¢Ûò»ß¥ÄçBmm¡@žá#@¢_Å뫞…ZËù 9éŠËåá~¡ÛqÿnÛ}÷»î]»ŒˆgZzÍLÛ¨}ˆvø*`LÍË—kœW(_æ ÇÖhìÁ>9$¤:[ÒA™ú‘K&Õ™€ŠÓ]Õ)óe°Ôíîy{|פ3ñ>›Þùù™øIgßQÛ™™Öm¿´+WÿûnÿÊ•I3‰G9êËUî4åGFY>SÅ6¨£…û÷ïﮯ¯/߯#&N0âúh BXO™:ÙmذÁÌZ˵frûü\šÄß@à/1˜ù:‚ÿî Þ?/dåkÓ6Ò_ç:ŠòCºO¨nðk¡ã¦™k¸¤ `xº`©YÒ÷€Á vH‚¹áY  ú€âèànÈõ ŸBàSÌŒÚÚW*çÁñ ­4Ô¸LƸ›6éQx,­‹E')™P×#%mEdÇ lÔ0à‚ڻݾ}Gß[ßvC¥Ü6x¼wG0ˆðÄã›Í¼¤áZ¤¨É˨ jJSW Ϲn×ZÐvseoÄ}0ìèk`üf HÿQ²ûq×cõ¸F¦nxßêêÜ÷£SÝ—ã¿ÎvqGÝŽ;¬Í%—\, s¤åI˜ зX±î‘‡íÛ½{·:=w±NE*­`æ¾û67U¶ÿcdã”F›·FöªÂ¤Ç…Ю¿ð½+e·»Çìæ5 Å2#8óÓŸvåÒIÛ»c­hh&l~àc ç˜÷p8å’KLyÌ‚©¾©‰evŸÿÒ¸=r(–,“«T±À›®¹Æ5]}uæŸ%Õsµ—ú÷ ˆ|^«5Ò `é•¶×Á^©J2FòHhêqô=3¦\¿¤­¯¾êZV¬œgNÑ”`‰…Ÿ% s öÓ’ ¥4Í•NnC`‚™Y ÙÀ¾k)/̇©7Þè&]y…™z¤ ΦxÜQs£ŸL Ùß¶=üˆ[öµ¯I[­mô•“+ Õº]ùáäšIyíijq‘࡚šš’ê±có'ÖMD;Þ•ÉÖÿˆò¢Ô)_?+Å÷{…ä€LçÉÄrºñ‰2] e*ĸñµîáß=ÚûÂó/ćÌú¹Ê?_':On"@ró—µñr•ò8§EupáÂS+ërÚ„!îËÊÊ•A;`÷®Ý®EÒó1B°$ ·Í߀†u<ñ;×â>Œð¿g P׈t€ŠúðÀÂ_ç^‡Ô=0á:ÉöñåýùaíPXu¸gfÆ=Ü´i“9N¹Z^÷áb-µâÑTHãÖ-[‡V¬XÕ¿yóæVµE° ‡L¶áxù@IDATGkd„ëdc9÷]ïrU³fXÌãŠD—290ôZ‹µyB`Ž;íTw`Í«®góˆ£h”×ÿ9·Ýš4Q;bãþ"cÒ&¾wÙ2·ëégî«Z!¾¦\ziú~¼ñG!…âÜozðA÷êÏ~–¼í¿æ¢^±ÀçÝv›Þ‘â„G¢ÍÀH3~Øáj=מy–…¸CÊØ'Õ!!É0£ ȵÁÔBZ¯Ñ/[È |sôŠøi^¶ÜbÞRT=VZ 2iƒeÉÌ-4§erXÖØ¨ãdW,ÇmàÕ$yº?SÎÆ0ñqRG €“êuz°˜v,ñ¥¥V“sé¥KÆtw*8p eOŸ*…¤<)3€©²_Ü©p^,tŒ'È9ús[äºoÈ: ?<÷÷[ÅáSB·N¶Á¯®YãÖ®]ë Ì%ew-BÔðjJôᓵ©k¤Øy|Ÿ\§ú‹/£s|@ÌÓ>ýΓqcc£îŒœh£¥% _úäàæÍ[ºå°[¥Ù<°3šžë0ú„úøiû¨/[æ¼¢B¸£¯•ÌÈ T께~à n̸Z#ÀãÕÍqÖxößüµ¼Ks$DdÒ2(}H3{ds»ö¿Hª‹o}ë1]I5>Beˆ˜þ¶÷Ü¿ÁP¯d¥w„û›4Pk6YM‚†]z=΀öö¦E”)‘öÈxE #'c={÷IzÝ%-iÙLÑz¬:¡ ;ökÍw Gï– À6ÁC"-Yr1wKû÷ïµ¶ªÇV¹=»÷ }ûöïÅ{Þ£Â_:¬Bô#éˆIOaV6°B£ú€²¨Pç6oÚÒóæk¯ª&¤HW§<åkAH±sŒ»¸uÛVsÐQ¢M§ÞüÆõ¸Åï™Fð‡sTê_zé%·NÄ?j>ü&†)ª=ýh4K¢@Þ!@À5"x•&ÆJŠ”xÀÐáÞ°û¨FA€†[ä͸H„÷[o|ëmÒ®OíŒ:…Ô<ôÛ‡{Ä8èP}L©ÐžÀaK£òq§É—]ê¦_w+“9óf}Ü-DÒ=l„ ²ãO?ÝýÁ „©IZ#¨¢[|l}oiK"^P‘l^½Êm—Ým<âxú¬š9Ã5\tQ0^­•´'MÒÿÕ?ú‘Û${çdÕ:a˜5È„aÎ;ß)b À…´?CÔÁëcøÞ•!¸YKb$?÷‹/ß+5Óƒ=²s×Þ`e È3` *³ç¾]v¼ûŸÁÆ„š=N<ÑbüŒ1[ŒÆ\$ ‹òF1Ä(UhU®wíÜiZ‰šð>ªOYàf¾ïý®°R‘qÔf”Nþ€ÑfNiåÜmÛïsKÅDßtï}n@ßý J,xˆÇ»•Áë²%ªÌÎ:(éwqyyEA}ý$ù¾4­Ü£ üx劕&ܪ(¯)~÷€¦ ƒÁC~æ\6B? ÃÃs."— iªÞÜzÀn¾wß^·{ï·MLÔöñ§²1¼œ?þwxŒ!,ÇÃè:©KB9lÿ·ƒó W?_Ì~ùA°{þ»¤þcD÷ÞsÏ‹/.‹Wÿ¿Geòå£cjf b¤f³­VÞÊÓüÀä ¤ðÜóÎ)„(‡€Ú?9>–ã©§žrÚø‘¦5€Dc‡qý Ž´¸.þÝ’¼"ÛG~msôªJœ£¾Äu«§6(»G¶†%Rs"܉O¸Âvý9ýb<þ\ǮЌ†íÁù®©©É7uäQ³¿NãA÷äãOnذAæŽ{¼ZÑ«ªpžòq;Ç,ª¨4BfÂYgY-JY:Ú$1 @º5yÉ× Ü-¢¡ábù˜J 9Lóû3é—úxå‡?LÆæxÞ{ßãòµ®XéNhµ ÝYö•¯ºV4ÉöY«xä³ßñW3^dûŸî—÷zmŸï^"„õ<öÔSe°Hkj@*ìÌÙ6ç ÆFlgxL A}3†!Â-²ç= †c^A‘üÔº­Ý˜d=kx´o lfEÙÔ@# D!ƒ ÃØ#â@@'GÛ Ê1s?ù W9{¶™C$ ?Ž£ë¨hfÀ´]„×aBr@ZžÏþ뿙ÿŽmÛ’ÞÌ m'ÎˆÇ àAål2@+áåáÁy:å-<ý´|ðÙ‘a*giܸqn4iwîØi85Îó¨Ãz29»èz#ø=±‰Œ¡îS€7Cüëõh^©»gß÷ü Ï»Çål媕nÞㆠ­¿M[6ãˆÏ4y›eT âá íxáç4´­ƒ°Ó~Á="ôê¸] ÄrE ¹îúëŽÐZlmk5-^Tÿ¡þáï?¿óå°ŽSöxzx9:$; ÙÌÞú›446 qåŠUoºêÊê2-@$ïØÍc{$´(ö£.Ý[»v›$)6ĹyÿTýøn¢…ì¡Ü6}€5¦ôlü†óGæ·g ÈÊÊÀ @r/ϨfT …O›¤áýñ[eºe÷OÛþ0,&Y¸ ÑëQw·$2BÆî¾ëÞî;w¶‹!‚(‚ŽŸU–w)w8gD^+aû?MÒã ©N²!Fé$˜ˆ}o%ãÆ»Æ«ÞäÊ%í*¬(ÏÈû3‚@kmóº>}‹‰$B¤¡µP\S“0aÔýj¡çËlhù׿îv,]ª0†A¸žQ×VŸ S®¼ÒÍ”ú?vÁQŠf ©÷ â"©!×Ê, röL×ßÒfŽù>“=AžT_ T¶~5FÌú´ßaбq£IÚ «*MÀ ´Î*ìe¹ÒÎ)“SԲƩ®L¡K±Ýà~iù “?æ~ëdz²î’%nªL– ËEÀhߎÒI:ì›Ê˜Ìu ïB#lÕ·¿ívH›m@{Z*8â›äHYø™áˆ ´‰Š«8îqå©L ‘WAý­ÊUÂÁDôQ$€9÷Ë-Ë÷Í\ËD`…´Ð¢--+E¸:ÂϕǟUù0\šÆŒV¤þ8Ì~î¹çÜórâÛÒrÀè4 @艀úHä½³î­Âñe”ïj´þÁåÁï½y€ Ó¡åØdë¤C„=íl•€\ÝTáÈñ ó]ÆÀsâüï¹gŸ¸ÿ¾1ÅõiµN¾áDÇÔÍ@ÄHÝ\f[K›ÅÊ“ýÀ„`œ{îÙ…rÈ] ¾@Šãª9Ë–/ÓÏ7uzÙÆk¡›õp"œ‹#¿„cÒ"?~¼IøfŽþœ²‡Ïpúà|Â!$6h•˜”!Å÷e¿ý5ŽÊ}B(ú¥žDû0hÿF©þW ™:Z`Òÿ!·T¶ÿÖoè–9‚W3zQõ:(Ã×uBòT'„sú[nu¨`Í€Þ6ßOžR™BLQ[î—4mõ~p¸A¤tsÞõNW¬u“V[ZÍOÂuízæ·âÛßI‰S§ gŸíæÞz«+«—¹ŒÖp”¢HÉ ¬çÒú7þ‚ó\±ö¥^Ù࣊PZmCB~UcOjŒ‚1ÆÐ>°kûv·ïÙçÌÑÞ˜ Ú;“È66ž#[ã_À?€ÌÌY`S“…Nt7(¿ Ç Ã¨g!ìŽÿ¨/` Ùò|Ñ8F7z¼gUh€­¿óN÷â|Ù­ûå/]§Â`¦2]-‡½ÿøÿèî»ï>%ضTܯ”½#¹›IiµZµ¶XøíðàÜŽöÎü…§ŸšO”.‚”3Dþª çERŽ Þ2|=Ùu1~¹©<÷ÀÍ‘øoüé<„@3¸]¦±˜þ"CHˆé.D;x3ý€ãƒwƒïÃ0\=l“v-[¿ìê„ÎÓµCpwŸ㮽îÚ`ÌqÙ"‡Ü”+—ðMàÏüõgw*úA¯h1-€U+Ww‰P%é~ žÅ_*®c®ÂnFXFͧ^Òÿ'Ÿ|ÒM–D´U„9Τø…ŽvÀ.Èĉ x¢?þH]Oô?¢À¢g<0Æ Y ÑOØa Æþæ:^I{T8ß߼߀ÔÅRß>E±Äé3yÖ&n$6MһWKZ­'Fg©|½òlåãJ0PÅ®ž3[‰ãª~cÎ;Ò’í>š°'}±q¨NäxœÝãßñ&¼ü”ÿ&œßx™&äa† >¬¼ïKÀQÐ-fÃ6Ѥ·¼å-Ê0þÙÃÝÚÖbLˆ¢;î»çq>íÔÉùÑ1µ31R;ŸÙÖŽPÓ)€^S®%«E*îžlá‘ÂüáH…ô‰»ÿ¢ÂÌQ»O‹5{„YìE©G }¬¸¨ýÇTâ d8€kôO94¸O[/®ùúv®kB&zB5³viÀ8˜5k–ÔÅ®<‚³¨â±Ô?ЧªÓ/~öËž;wÉ`‡×cFõNñ{•')óx£Nå’j,øð‡$%ÕE„5/|áKr{_À´NûlÒ·ôÑ~Ô½C¾aHØ»ßqǦijŽïOŠc°âøª¥µ4  Bù,á´C"°s„G矶ðÔ|4m‹df§6pôøT&Õÿj1ß^~ée×&ý0 Ä(ñ!Ö{%±]ãŸ55äV­Z%-‚͆Ï{-·Çkí‚o³Æa=ÞŽiÒz2»‰‚†,«¼-vÿ‚¤ÝÂúTöüóÏw žÿ8v¾ÿÀ~cT :ÊÿþÛØ): ^úÿŸ*øÂ£ )™ˆ’iÌêF€ïT6]©ø T­.9í´ùhh±pÄǧú†zSZ)€1[N{öÈñO/’Ÿ Àù¿ŽOøs4¢=D€x&GÎ=´(¤j!?ÔjT¬ûD0‘¹†S‘ŽÎÇ8ßþö›]žÂ“$ Ë09öí—?_|~ÙÁgžy®kïÞ½„r&À{”˔і˜ |\ oìMŠO¼çˆ 9®©{ãÖú(¬ªrDXwɇFBIë£öÔÓ\Ýâ³Òæ· Wá ŸÿâÝ9ùLöû®,™‰4pñâôj-$4¡Q¥×å „{ßn¡ö– Ò(Ÿ>]¾Z]?{˜ö’æ@H¶÷8.Ü/³€g]§T}a :oj×básdÅ;ÒXãÌ´Df<¥ “]ÅôiæÓ [ð¬_Ï`ÆÞoÌ¢~$ ?²âÙß ƒàýÁØü›ß¸ÿó+nÕw¿kÎr“Õ;Úôá? ÂÿÏþìÏ„& áÐÃ?ì6É]‚i‡ê¡Mé9 -€b|è˜_PTX0eÊ”\ðq|s‰úÖå ÇKÌ'ÕM2Áa¶1¿e~òC)>„ºÔ4ì4ZçÜ8 ;û+V^/¿†W{¼Ýãî0ÈàÜñ„¿?g/S õ¯÷Äo˜$êvŠ¹Êø÷ëØ)a]ƒ€×ã› M…à‘ìØÕÝ)¾Ýhñƹï|ûûÏ=û\¼C¤ÝjòÖpô'-31Ò2­YÕh§FC^âGõì3ϵŸ¹èŒÊÉS&ç uGŠ?¦xŒ-x_†cSS“Ù­•Šâ¼yó,DN,xê¨Ü,ü£ÿž“è™=Àñ€O-qØ•bLõG˜ú€ÀQìTÈœþ½ó·óÀ*åÏ–fctlÛºÝýôÇ?o—ÓÂ6Õs2¾®j(—äãʈñh¦“Ѥ2!?óßÿ¾@š4š Q™7ü ˜@_¿Ûtÿýμ&'0#¬«š§¸ ‹é‹=®Ovt½©IlÿW~÷{n‹@ˆ¥dR¤°“/½Ô͹å–Àóy€š$ÓdT7šã›í/ì+ĹŸ M”"9ÐìÙ·_ÎeùÁz¢üØÖ¶„„½S!m÷>ý´Bm¶Jr>AZÄ —Y€b†ëŽï™ÓX‚žñæK:Y"ÿA˜”O›&±Àžó‹ï¾-3ŽJÓøœo¤¦ÙWò÷[Ö­sëýk÷Ü¿Áíá˜îô§ú§îƒü k‰˜O¸«W¯6›uí8Í*¯²×ö<Îêi)Ž„¿Ѻlíì?7þœ"ž—¼š-ݶu.„™wsÊ)óÝ.ù\ ì5þ¼pˆì ÌôŒ @£$Õ1š£þÁ4Àá6ξøy¢ßA‰ý9ÕÁÓ=áïqw¯—ˆè'd ëdþËð0 h¼"µJ8×!gÛÕrÈú.ù)BÀŸè ó]`Ù8™=mÞ´yèßþå 0k|È}F™È\QJÓ D €4Ml–5»\ã¹LYöAz|é“R›¯Ä£(Ä5þJô0>qŽz½|•È`™›6cº¼‘šI )<„;Å®û ð!ÓN< ˆŒÄÀÔ€r5BÊH@Tz…œ )ìõ`VÀ%. Îhˆb‹Âeì³â;·§s×®ÝíªïÂlV¥/%×)>æ¸ÒعsݤóÏsÚp«vTø88SÚñØcB)Ñ9¨š1ÃÍm]ª¼/ÇÆ!0@lç–5kݲ¯}ݵ%.‰59náB#þ«gβ‚à#JÑ œ˜€pEÂY=¾›(õTÚõKÓUçeS“Ìgzxì¿ÊŒ…¶Õ¯¸ýÏ=o¿‹„(³&1 °}ZcÌ–^ñM+WL´Ã’@‰µ¿@ŒÿMRåÇŸæÌ‘™¨©˜¤Ý Ê‚u·QQGÚc²Ëµxœ=þÜãìžè÷¸º?‚‡CÐcÜ+M€©zg˜å’ØÕ*ÍâN]ǿح·ÝjB¸ÿ£áì? §¬ÂpüG{ŸýÛ¿ÛÕÒÒ<©âÿä«DÇôÌ@ÄHϼfc«¿Ó nV6Ý*ÁCk×­¸òÊËK,?ûÅS0âÕŽÊØå/_þ’yÙŸ2yŠ9A§•àÃ@ÄÏðL<9 pî(¤ý81©¿ÆW$ÇH]bTÀ\8MŽÏ®¿áú#ÌxŽøD¸¿–Öfí ûùÏ~Ñ»vÍúvù ð»Ç÷(ËhÑ’ -Öèqò—ÖÕð‹R4£™¤ŒØýn{T €5kFSeÄ2e2¿i¸ø¢€XI%‚­OdÕÏO=e„шåÅ1Òêi”™Ì ­[ˆ…(E3 3À·ˆ€qŠâ2vá©æ—õu8¯cï2b;õ>ÙCµß1œ¶¬\e’öB٬ͬõ B’¨Øþ¦Ï¥,ž}ç¼'œú½ð¥ÿ°°~Í’¼§KÝßÏ6þŸþô§ÝßüÍßÄ4?ý=„¸Å¡žH¨“Þ©¼)ºé®ò„:Àì4_*õýÝ]Ý2è-˜=gv^_¿´r—À™½ô?~0àÏ‹eFGî­[·šçþ|Á„Bepd¤gñp \Û„g¨ÿÇãëÃvôãquðrŸãqv40Ɖ_•Ì”pÎ8Ûå0¼WtD¥„‚·Þú.W+aXq|îè"Ê@§+*.3¢Úýû¿ÿGË‹/,‹W/„Yóveqb£”ΈéœÝìj3œiÜ lï}÷®Ý}6n8xÙå—šëQlü‰Z\$8~Åê;ÿ’6®–D[¢’À£†oÑ€J<á¯[–DñÅ3â @FvùV¾T€À`B% „^yï/”ƒ”ëä=üB©næå*\Ò1þÁÌ@õŸ1ýø‡?ë}ñ…ŰlcH`#ÿK.£Ot’>&sŽ#.»&À·£8ú è;Á³ò†»î²JG/xì;0Ÿš®¾ê°ÍþØ5FqWëuý=îV}ÿû®+ôâ;ŠšG-R§õ1÷ÖÛä8l|D u–¢'d´Ï@è aŸxÑ…®¼±Ñõµ´ºi â÷FH3Ú:Zd™^<óAþkz´?î}ò)×)"­¨¦Ö˜æ¤ "!›öÅ"hÎL‹"›Æ–Ù7xRô†o†~}ëHû_úßÐñ×›f©?ƒvég?ûY÷á8¦õ9Ò„>ªh98°K ¡°Z9×K ™´TÁé•Fw&­K×ß¼ÿ@®¢I->Žþâ yÊ…È8þ[´è Ü­“¹ypf&`¡0Ý8úú„ýCЇƅ'úý¼sŸFÂ×yñ¸{«|v!ů“/W8z»¤þ¢Æïn“俺eZ?Zi5éB¹V…ýÃda¼œ‚>øÀoû~üßÄ;A¢Ø?*?«¥4Ï@ÄHógYóØØ)/öãÚ¾mG¯8ˆC—^vÉæ,j$îpø²eåeîôÓ‘¿zõ«æ´¯X\¼rq=GÑ38ú4œàÉðã.©3.0)À4¶4Æ%®¨ļ]¡ ¥"v¦:÷éØÓÛíšå]”1ýò—¿ê{ö™gÛã9Œ¿T±¯ÅUá´\ùÊØÐèSQUµ›uÓÛŽ yÔ­Eß3 ä$yÝÿüʵ‹ƒŸxÒ·w“ËÓ¦Ÿ*"ƒ²’yî ²ý|饤 V(¬ÓônpS.Y¢¶¼õMâOÕŒf 30$M1Bñ•OŸæ&J«uö^1ˆÖ1(Wêé€M …Ž Å!ÒbÊ#¹¾W§c~¢6__3€G¾éV©†¿ô­o¹å_ùªkÙ°!í‰ôxÉ’%îsŸûœ»Eþ` X• :_xá…Dý@ã<¥üûcõqï=®¾ÏRž,œy&ÀúuÜôÓŠ*++rð¨ Õˆ¼!½h'åZøk´tW­Z-×V“Ìc€F8x0 shØzÂß=¾ÎÑãëž àu_ç·iˆá@ûckåGE¸ ÿ©§æn¾ù&ÓŽE£}€F.íâôïÙ§Ÿø§Ïÿë6Ü¡?àæ_8ô3:Kç D €tÎnv¶ '"÷T?¼-[¶*zÏÞÜ .8ß 16÷ýBÔÑŽX°xÝLI½ŸB5XH{< L<@€ø<¨p}Ÿ$…Bfê'Õ“6ëåXèÚ뮵0"ÉøñÛìH¹«§Óµ¶‹3)Dîî»îíûý#¶´··{É?E§ü‡œŒnÒµChF(0Ò%°ú‹.v%â„FêÍ#ÍPtm¤@zorΓh*•TëÑ&HIÒ*”&ËZ1&ÖKí’¸éÉ$Ô”ë/ºHÒÿ[]A©„0D)šlžs]»… œpÁyèÚDtPê­0l«ÑµŒ'1 µ![ÿ˜‘«æÎq¥Ú#£ÍÀ¨fO8Ä?0þy9ùÛ&Oû˜¼¤3Ñ'þ>ö±¹þç–0éô#ðË£õNù‹_ü"fz´rG¹¾K×q”{ÙpùA âFå2á¼0^}e¢oÍ*.-/µg.–“nÃÅ ø¨¤?†£GCw‰˜*hÑnÛ¶MÚíæ©¿°P¦B‚e]²Ëß½g·µÅ;ðø:GæÖgšǧ/«Ç=ñÏ`ü€µ«¼¼Â]«Ä¢!¬^8¬Ø81i8вÏÚ­Wã^ZöÒàgþöï†K>°…|o¬nt’ö‚|¦½›¨ƒ,›Ïjùq·iã&÷ƒü@^ÿ78ù¼2µýriï%ÀðkáÛ1œ[íy\|DÒHeâñuÓ0Pÿ‹…è²Ë/;ª&![󯯱ù߸aãÁÏ~æï‡KþñÅÿ6ó™û¼ñÌõõ”=3p—†bªG~HÍÍúŸxüéîsÏ]\VU]ƒ9@WO—⌆êDžë¨#jEO<þ„¸üpøìÛŒñœDN]2¿!à'N¬sñ—îž¶Ð| ÄXˆ1–gÜ tp1[ĬèÖx›šä[ßüvÇÊ•+[¥rOq¬Õ˜à²Æ{õÃäˆnòÊ ùq< NúX:ur$ezPÇS9*ûÆœ­÷MÿŸ½ï¬¢Øþ>7=”¡$ôÐ;(½HybÅ^ðéó{–§Ïòºô©<»¢‚ ÄÞ)J‘Þ!ô„¡“Bê÷ûÍÍÄårSnÙÔ9p²{wgfgÏÎÎÎés±;½¦A0‚(5ªÒo)Í¥×-¡"^­`,·¼7]-òya× &C‡J›ë¯‡Zï­CòEZt1=`¤œ­?x0ÒÜ5vºÀ€ÖŒPÒñ²`‰yIiŒx85Û¶5ÌùR¥Ó[jtajŸ’pPöÏ›/k&M’CX¿Ùä7KMÿ„ ädèÓ§Š ï)¨m~ÿý÷U°;Oë¢<5XÓ€ ü\VÒö-À+€AXOçàž3Ö¯Û ·×0˜í;¸œÍ·(ä.j"õÞ¸0uîÜ °R‘úï„Z[§¦"¦ æ3¦Ïæ:ÝöŸL¿•ñ×ët½åZæÿt# I$ܤî¼ówº ëúܸ&?s>ÿPîQ€³èçÅÿ÷Ÿ§pm«îޱ°HW¡›0`#ŒÀFâ–ƒ¦¿Eë;Õ sùìïgÍ9Q£zx—K:å ¨wä QHpˆšx_ZÀ‰„“‚žLxÎ zB  @O"ÜZ½Œö)!ää¥zÃô÷?uæ„Jc¸rÅoÙo¾>õ‚œ¦ÕÒF[½h=f9­vsð·ð×ÅùÍ<ÍM‡SÑ™1»§Š)S‰)@MÌ9ääÝ7gޤðJ«¡¨Gÿäc®”j0¦ ÊkÀ{Æ`PǶn“Í#>ðº)]±^×®Òö¦›¤fóæp)ìÕÓ5ÌÖP lR€Œ±½ƒIi1=šr sÂw¯$âð:øÖÄ\{ Üú‰–?øø–M¢™^•>Àˆ) E>½o¿¬†éý˜ÒŸ…©¸Ýб_ÆŽ+o¿ý¶\…0 >ç-p97sÁjÎ  èL ï&m^\܃*üèn*!™dÆغe[vtt½°¨úQ®wƒ`¥Ç4šÉ.¨}çf¦®§é"ÀdÚëÑUkT+ê6¬ëu×5»uÝÞ¨Q#•¢›ëþþœª¬t#ØòxJêiXã¦"xw0Üj!•ãœóoLžâúH@1ÿÞûAZ®kv=£€xF¯ŠXznŠÄÝ€JÀ›„ä1uïž½90ï©R=¢šÊó©Íý9ñ_ 2¦%ào=¡°¾=¡pòp7¡X'NN ü×·o_]½À-³œ¯ÿY¤¡¿ÓŸ>ûû9Ç!5=‡~X9ð¹hä@뱂Úm‚£4óh‚Y§cG‰hÒÔ7FÌ£«šÂå•ê½ÀÜ;s–J½äí}pqÙ¦Duï†f>0ÙxóYcýk“åðš5>k©1m6r¤45Ê0ÿÞ>\S¯ÌQ ¦ÿ|wëÀ=­^ŸÞèŸC2ðý¡5€Š@ š«™®ï‚¿h0þFŒj`°JBƒëÇJ’‹AˆOD˰­Ó¦Ë–wß“Ã~HéZØ-ðÝ BgÓ>÷Üsrë­·*3û\'.X°@bcc½i†æÀãÞT.á:ñ¸5áƒA\Ë„>có¦-édÒ¼eó \(å¸ÄÕ 9µ–༃ ùûü‡ŒÕ¤iÙµs'Öí¹ÂÔ‹®ëu¶§Ës˵º^¯sËgª×ê5jÔP±N! 3J€ó¸6§É&¦ Î@Þ“ž~îøìY?ÐÌß L÷ǵ9…J¿?µR¸¸¹d™¡ÀsèIð?@DêrÂêÕkϬ¾u™ñ7\WïºñãªrÒH…=sx8œCGOz²àD¢‘­è}=¹èòV€>–wÙߥú@Þ–<'º 0¨H&"•/_¶<ëË/¾9_§tôϪ ¡Iÿ;À—òªg³…ø‘¨^œÂÖ2iH•¶it¢º÷¤8ñIkmØìWH qÏ>“%©‡’|º?2AUÂÁÀ˜r/|¼=T¡+Á % ÄLä÷õê"pSøzò]ÈÉ´¾–¾¶lê ”.耨¹‚…p‡‡ÿ"õ‡–}Ÿ~.Ç×­•ôä£*k@4óþð]‡ö®̨#Z·2Ìéƒ2}uƄɂP*nÉRÙ3k¦Äÿø“íýe$zjüG@8ES2Šþ¦ƒöÁ‚€Á­øº¼À,t”&S\‹æž;w.}ÑÂÅG÷íÙ[ý®»ï¬Ñ°a#Äß:/ˆQÂôØ Šøös ®×ÝzÍÍß\£s«×èüM° tyãsÐeTÁ¼?<–?•r(W ®HžóôS“!¼pÕNpás30.¯ºÙ”Œ ˆ^F/ùúESù·€í¬}üâó¯’ý¼$äÞûô’.A”ú‘ ÏÌÊ@|€à|Ó~òßœ(8™8YX' × Åu2r^ÜêYm0+A:✇ÝbwìÌýî›Y§‘ÿ4ý!³oN.×YcŸ“î&`L1Ê^T䨖-’~ê¤3à&g†Q€AÄÈH0ŠêÁƒ+ÖñÓÈ"^U2RhMç9QÉ8}Fb?ÿBÒ*ÈW¨“Fþ¯‰@žJ0ákƒ¦¾¡@Y£¾QJë<ýð»>ý”$-Z,ñß|+§ ¥Ì€{ßqfˆñp¾¨×¯¯D"/ݲÓÍ7Æ_´­í`M,•táÚƒÿ[§¿/YpQ±ª!kÌÕW_-7Þx£Œ„Õ—×Tå{,æµ(.™H‡ÅìP1Šq->ø°Ës»gϾ“Ÿxúì AkºjdXNn¶„†„IÕ*Õ”–žå4VÂïš}½NçÚÚº^·Ò׺^g"1UªäëÍ£ópM óO€ãá4Ü£žÿß‹'ýu9­/\aܤ€R¤€”"ñËà¥ЧQÀoæ¯^^$㿟I€T7øÎ?Þ÷Þ.!L/‚P"H õd‚º… XNKõö +WùõÓ- üƒ€AP6nÚšóýw³NÅÇ'¤a²q•*r¢§Éÿ£@¨D=rPs€Wy\NÂÄêЯˤåÕ^U÷æ’¦N9¦@8‚â\öÌÓ²qÊT•ŽÉÛ[ÉL; mÏY¥q´ ÜŠÕÖÁø oûêCøÿoULK±êPˆ }ÿùŸ ‹C K¼v&óaCˆÖ1`¢û_&ñßÍ”s~TäTÏ€™,l´øñ(L¨ÁZž=¤ZLŒaþ}!f¬Ë1¦6hþ õߊ€yG7lð‹5WAäâ޾à?ü°Ü}÷ÝŠ9,¨¬¯Ç«# ,£É{ü}s^¸*6‘¾ö¡êïÆ5‡ßöÏ»>ã¤/X°ðÈš5««ÞxÓµº÷ì˜ ‹ØPXTQ‚€‚çÍÔóÙ‘–\{kšòÜ…kpgJ@½>ç–q¬Àa'aî„àŽ!8åysLŸöîôÃXŸ»ºÝrAðð kf¿ô(`¥Gû²|åIèÜtàSÀ¡À Hb³Þzóí¤0„#Ö«S·"Ö¾@ó¯Ër2Ñ“ éɇ ' +ò™üììLåÛŸ…-ë¦C˱+vgÎêUëÎýò˯'!%Óï:±°ù À¿9iú[Q™¾Ju¼i$©¢¢ºu•,Ò|ŽÊîMLrCšôVÃê²IÏJëëÆ!óK’¼a£Çý?¹{7Ò•UGtrwÂö› DàÍ3qñ@|/çüª´¡Œü_¥^]Ÿ… …÷¼œÅü¥à"ML9è»ébñ)ÀçK-Ühúßêö[U À½Ÿ~&‡—þ"g% n5x(m³^„ µ/¹ä" ¹âwÔ”¬ˆàº*$¢†ߺEö"¨ì |µ*+ŒN\«Q üàƒÊÍ7ß,íÛ·/¬¸_ÎéUëE×5e1§…hYÎPØm¤âäí@*ä*õ;˜ëœ'N¥LòvZÍOk†=2²O¿^Apd,Ÿ0âCCÂÝZðùiäœ@ºjTòþèrÜRûÏøzMŸ ý[6Œ1‘‘.³gÍIûêËoŽºaüÙ­kÒ²Á@¡€”‘Q»q}úpð_Àf!!!˜øHR/y&åÜŒó>;zN zr@y5É wp‚ÑŠfþõoniÚOüøÜqr¶m‹M_½jõi8ÿÞP^{y›dl_~ráa¯Q€@%-qõ¨¡3qûåà/¿HûfÍœYËý{Ô)\y(€÷& ¹tG̘!ûçΕõ¯¼*g“9¬‹H±s&.N+ÈãØdJb?ÿ\NíÙë³Æ>>ŸÑ=zHñÌÆ{\™€f·JË‹9Ž–̨@÷ÆV`8žË†À¬¢‚”¡ÖŽŒ#V^•‰T÷^ñ<)Ô;‹¸ÌÐél*{>þLŽ¯ß ç“¨øÊ-ÀƒgÎÀ‘H¥VsD8\†øÛ€¡ç@DXOK:,qÇï¿v}üoBvšükÒîk’Éäúк¾ôàš¡([̓òe±è‡èÔBàóÀ>@õÑÀú‚€iŸ|üé¹™ßÍ }åv nÔ¸2¤CŒ`tÓuZ¸®ÁÑŽÍüs®il=ÆãVí?ËBЀØ[òÉGŸ¤Aë_ãϵû÷À'€åU£hTÿ@E|ªþ½§ExÙ—BÊ{‘<ˆÈž½ñ;„Œ}Ë–- ‘~LKgyÌúAà$á:¡ð·Yž¿¹Ý¶uÍ›r—-[_Œ[ˆC™i@1þú’ H¿+N²¿)©È£>Mj##¡0(‰w å5×H£AƒdûŒ0ŽÞ+Sž‰¼àAÐÈxx‹G2©GÖ®“ø.ŸGì _¡v§NƒÀÁJXѤ5µ² ¶ÅHÛçᣚ ¦“±»TÎø¤•+Õ3IEÚªªÈˆ“•-‘íÚ*]Æ} ¯nê𜇿¤P` |S€Œ=0 9·³°8®…ï@Ïç'ÉAaÛÿÕ7rnbçOœP©ûh-PpœÁº' ¾ÿ5;u4VeE¬’œ§@‘™‡DvÓ›S$añb„ÆÞ‰©ä(ÿùϤ 2ÏpÝVR€µ§Ò>{y=jÑ+óy÷q °ði`+   (KÿìÓ/‘+ ***üòÃj¶jÓ*¸aƒúXëªÀÙüFéõ6×çD‚föÝcy `\}ÿ \ƒs&$¡Œ]°~À¸¿ HwböÛ@¤€Ç N¼Ó%)€ !Í׺ï¾ûäwÞi‡‰8B»víŒÊT´Ê§tÖÊüsBÑ“ ·üM`]VæŸÇØV@ÕÇzà ¥¡vÁ4üg ì-=‡s0M„@C,ÚÈœù”žÍóË›å•|G°àÅ‚¿ëÃI‹1cdýäɈàüc¡wD­Íÿ«Õ¯/Ô,¸€Üöár£|…ªXRó_§sç Íüscô÷ŒÔ刔´j5„(k%yã9½?N=?æ‡Ï€É75üdüƒ«VKD=¥¦‹DúÉ“Ò ‚’ ¯…¼òò¹kóp;Á×ÑXê8¿wéÇOHEG^¡˜x Λ/©p»É"ÁHáxé¥]ª9’\3 fû ‘A€kr½^×Ì¿uÍÎÆôq®Í­Ú}¡:ȦM›©·CŸ¡”wÉ@NP›€oé²f[6)Pð—§lö×ôª„(€ ‚ÎA4›ª\®nݺõLõëנ染NœHˆœT4¸N&ùTj ZuäÇ5~›ÞP±òÖ±2ó ¡Yú´«ì™9S6¼6ù"†“å“»÷¨´{YŰ £ÁÛ?üP¨¡ô8ÆÃ4T¾D¦ŽŠj¾‚©6}ù"ÃÇ^¤Ö:ÆM3ò¾Ük¢ÇÏÄÇKâ’%J`ØhÐ@%¨Ó¹“dAŒ‰Ô—˘º¥M|÷(£6Ÿñ£¢åÒ'þ%É+“}_|)'‘}ãŽóa@R=éûÏãæRÚ²t®O!AZ,üY6½õ–š¿¹¾² ¸&£¯ÿwÜ!×_½]—)v»t`j9/ïæZr1[ì«—ù‚?¡‡D*ìh0Øè* À!§nAksWúòûW˜Åâ‚Iw(ºÀô Rr Üî‚[pïxàò×_ÿ ”a ü.*Ã4]+9 `à$Òèûï¿¿ü±Ç›óžÆ0¿rÀç+?'X]„º‡œ0ÜjÔ½µ2þVílll&Ú§Æ¿+ðW`"°´€“'Ñn@çMyØ“³˜if]«Mk¥qU ù<úxØ”)^‰)ÀÁ§´ìˆ)Ñ⪫T\€£0½Ó@†¾VË–aZë¬Ï]´Åø †0oÓÔ·°˜\è³¹~L3,m*òd¥Ý‹ÍH× Ä3H^·^J\û‹JûO¦Ýß@Í#w'ý¶J 8wi¬× 2E>WwÈ´ç pîR“O­D˰«º°Â9§|Z‹ðYSû_‚5X†ÔéÑ]r(2P©( Î×>žÞ¿OùÛóíwröâ3Û8Ï2®Ó½÷Þ+Ï>û¬bî\4¥ò ŽàžŸþy¡ À  úËÀ,/ê–§*T\Ñ=€Ê+ÞÓÒ}®ééÊ[kr®åó׳\£ôZ[½Nç–Š?º€hp=Ï2\ÃÃEÀÀ ÞXÃ׃UÀ\gubbb¼®k¶eX±0à÷D™ü×-Z<ùä“ÿoÅŠ7áåªS§Ž£qãÆØuFé/ˆVœ8pK`y (0ÐÀsî&}¾Œmù±˜¼XÏ›¾Ñ `ÏÌï¤fëVÒáöÛUN^cÖë %+wõñ½Âû“ñžÿü‡ ¸þÕWä ÒŒ‘aÈE:ž"cMðEÔècÐ8îúúkÉòƒIqd»vÒdØ0• »iÿanK+‰¤Õ«dÕ³ÿSÛJâÝå3L^¿^¹{PÈS¿wo¤U"‘ˆÀq@ÆÐ@9§¾„óÇŽÓALþHøù÷–8¤oKúy‘¤@“vþøq©Û³'|ÿ) 7Pé(€¹:¸ZU9±s—$`LÄ~ñ…œÙ·Ï62p]FmîÝwß-&LK‘u¢,ÁAGÝ™¡³ÌìD.–Ê¥Êq¸QfÇ"b€ÛñœC°N¿HñËo Ç€u½ÎJÕÈ <_V«VMºuë¸oß¾XÔ:vìØ|Ä {eûöíÿAÛÆ%ÀJÈ2²oeäA”f7ðBÓä? Ø’ß:Ô‘éþ ñpgòï:è¾s!ãO`þÖûÜò·.Ãrú¼*TöþPr1øð SÉx L¶íýR»m;©(Îdâ  xC¾SxiT|€HX• yóM–Êêg'ɾ9?H»[nQÚ¢ÂÚfÞxÌ- \øÃ‹¬% ‘›¼Aß>°$¨ JÒtÉ„pd+ÞÛøŸ~’tõ,i ð0é·ßàÚ±[Ž#öC£þý‘b 0ƒ…%!Œ(é{®t×Ã7»ô#ÉKš¶wÿQê {>ùL2•£.„*íŸwZÏJGΊrÃôõgPW݈¹úðêÕ¶ß7•Úï˜ü» øf{Џýб.-¢T§#p†q*3Äáæ©Ôbï@µ–È£×áîÖ빑äÕr¿a$ß°wï^9~üø£­Zµ¸víÚ‘p8í¾–9ZZ¸HTZ1×- àŧyPKhü¯øûßÿþ|xš€ùhÒ¤I`a&ÿV7NzBÑ ¾uË}N$dú‰Üç1WرcG6Ú¡¤p’ë¹Rü}× ¤u„Wp>Ú™i©ÒÚ<þ*RSëÕUL¥ÊF¾C5›7—V׎UŒap8¢Í#åœ;sqš“2åܾæÊ–·¦ú…däÿ¦——:HÿǶ™ç^ ܼÛåâÙ@8Çhý§öï—ˆ°åÝw…ýK(8…”3ÓÃi¸„HXݺ*ý ”æ“ñÓµù®ùMÈ‚ùÆ_ƒ!ƒ%ת7‹q^ÄGAŸzjš±™t9✞™vA„ß—­ï¾'Ç`ÍN¨‹¹¤_¿~ò /ȵ×^{Qª7;¯íIÛ|ðü‚lzéI]”¥IüoÀÊ®…þÖßA`Ðóù>Ž7\›ë}®Ñ™ö¿]A¯ã]·,«1n¬‡•6ϬágŸ}vçðá×!˜xiºõºÞJ¥ÿm,*éÀKÉI Ø“ë„ Ü„—>822Ò|¯à 7ù/Šlz")ª\98¿}œüÐ++ÞcÜüsÑéž{$B†~¡òú!-TãaCU$q»ò>â ¸fÒ$•šî¢2^8³?Nö}?G²RÒ¤>´•5ÍžL)™Ör%ƒÅœì\€Ÿ@žö%?,Ç·bá]†¯Ó0ÿeàAÆ h5n².t‰0d·ìcê§ÃÈT!øŽ3)p·7‚<• *>˜!"sо9sáÿ'Ù7÷IJÏÝ©á$&&Fž{î9é‹ ³ðß.³DF0êü˜S^t’\šþ»ù0zÑZ©BŸ ×é¬häqŽòî@—sݺ–À:·K—.ñññ¹ˆÀ¸‹{ôèñäêÕ«_ÄuÍÄæJ°Røm¥@ôÒ¾$^\šü7vzâ‰'þ/hgøï8ðÂ:(`”¢~Á‹ê/ËUp `p€·÷I­ìøxÖBª¯–W_¥&^.ð  øBõêq`®ñ‚ÜK˜&0AǶ¼ý¶¤1¸œŸ€Ì~ÂâÅÊg½éðaÒæËÑ=zJU‘bÄr%Œ@ßÊ:¨`¢$.[.«žyÌÿÖ2ÙešþÇýø£r è1]Aö@IDATsñW^)AФÄ•:—I¢–µNå-ºÍ·¡¬={úÃdÂŽmÞ,ûç΃æ†íq>¨½ÿþû•Æ¿kײc‚ŒèR¸ºy äqJ#“”—Ý-¹jÚ—ãϺÖ/Œù÷´wt `ÐA¸•8p ±þ ¡À\o,®ËôŒJ‘ù¦ ¥Øsé¤^<šü·IHHþïÿû¤V‰A Á“‘<9hó~ë~aÇxÎPF]xkL#Cq|? éç):¶e‹ÒÔÖlÑÜ™ò©â O¼¢•©ä `lÁŒ/þ¤ûçÏ—u/¾d‹¶˜Œþñí;f¦¦(„p˜–†æå³W‚‰2Ì †T¯&hkó”©J˜áÊÛÚÝ’V­R)ëvé,Uë×÷K@G[;m70pRó2]²(´¥ÛÇ! qŸñ\˜5ÈN¸ì²Ë䡇’G}Tí¿<À*Ìut8 6/` ê|¬ì1H:å€À|ù|™ùçïÂ@›ùg˶ØnÍš5©\ @ûð Í^~ùå;‡ºhË–-þÓHÖisÎ-Œ€[²T¼ƒ`æùÒ×v˜;wîMÀ[ð2ÓÏ~`Êä?ËE#MÑ ú˜ëqk™ ¸O"|l|  ô ˜ÂgÏ·ßHõ&¥É!ÊÒ«†L%C¢(À90ñ×_eÛ{Óüâ÷_Ø%™Ï~ÓÛïÈá5kàr¸ô‘Ú:Hœ1½&§©sa”ä¹¼…Îé½ûd™ÿKòê>]+ëìYh çJö¹³Ò‹ùðÈHÉ• ††e”˜søŽ2µç™dëôérpÉRIÁ¾@_ÿ±cÇ ”>‚mw³³oEµ ¿q9ã}êUúœŸ*ê•ù¼ø“šO`›zŸ.;v €¢1VÇQ;wî\!Àã .|}0.þ|ÅlËŠI¨ò\ / 6ùï1mÚ´û7oÞÜZÿùÐZÍü»cìõ ìJƒ‚Ž»–+Îoma€²eÕ.žÔ§@Z z Ô–®|ò)åsÜ9Ô³™;‹w†~¥îløãSCÜ~ža¡*µÝ¯—pר‘õjp\ÖCÈ5X¢ü²‚ª@g~H=èîšÞs8ýœl~çe‚k·öÍ›>V‡‘Â÷"ûC Ä^èõÏÊ9d+p¢°FÌ9CC£@HÕ*’†¬ ³¾—=³öq%cÓÙ #GŽ”¿üå/ÒY×´nö^Ù÷ÖÉø#­œ ¥œ·1@²·•M½âS@óVºϖ˜Í¡E‹¸¡Àí8n¯õîÝ{ÊÝ!‚(I @IR»„¯…—ŠZš¬·NKK»lòäÉÁŒ*ŠL?^@GUø’ñ§¿?A¿¬z«Zþð¸FËa¿ì2ÐKÞuø¥Aÿ7B+†ä}ø°Ðk8 _ìí|(Õ5”11’Km¤‹µ…כІ¤Ç´ML!W«M9ºqƒAŽùýsæ ƒÊÙ jÅ/XàŒ€L ¨îÝ¥ ‚M1H b¶ó4ðvö£ ¶a‹¨¬"²4csdÙ(˜`Z/úïÁBH,¨S^g»kŸAð¤UHePŠtõâLC OøË„ÕNòæ-²mÚtžoëœC‚¶lÙRÆ!`èŸþô'‰Á£<}ÈçÍ›çK׿GeN\¿ð4`ÝZ›ÖǭǸÏãt ` qƃ[€ ]à(Ö}øá‡#o»í¶8×:æ·}È÷±ï¦åÒ ^4>Û(`/øÙÜüî»ï>F¿&ýÑä?‹QjÝùBZ·Ö}}Nkç Ú²œ¯€>æœ:uŠÁ~’Á.«p#]i à=€f)0™N9€Ài=T†€\,æ  ø•gd:ƒaíS³EK` 5ÞªÖ–S»÷ø!uí;¯} &œŒ®Ÿ…T˜r…Ã5¤zuå¼Tâ€AæœÅ>­åUIó>¿´ëíæÿfVÚÚKÌWH㹬r‡h:|¸J½K/•³GƒþéN³}ôÇÈ8uZêõè.LÍh¬‰|¡¤©k(à? (ßmà®/¿”¯¿¡\²ì òHËÎnݺÉóÏ?/wÞy§ÀÍÓ7TÂ-Íž=[>ýôS9‡ïˆÀ  ›¼¨[«<€ï^†éëï-Ðe  ÿÿâœÓe¨€¤ 2¶Œ=V{ñâÅ ´cãÆ{ž|òIß>ˆÞÞ\%«Gɘ F¼Lḥ¦ÀÞsæÌ¹gíÚµ=ÁðÃ7\(àâWGú×üÍ}ÖßÖ}}ÞºÕBoÈȺ±±±¹HBî—QAÙonË2ÔDçÞÞôÙé¶éˆË¥Ó]ô¢¶ÐßZ²LHÓ·¢¡øpÓ÷” b,nRÄËÎ/¿–]Ÿ®â’èIý^=…L0ãD¶m«Ü`˜¡€ de±P sžŠ”z;>þDùàúó’5[¶Â½õ’Æpí¡Õï‰Öt¿h?@¾ã¼>çáÝß~§"û3Åß¹£G}êJ½n]¥çã“:::ã=àÚ  J‡*»ÞwfÙ?o®ìþæ[[]t¨Y…u§€y’Q£FIÓ¦\J•_ÈÀ¼ùÖ[oÉßþö7I÷ÎBëîþ`Bù¥‚_{N“K¡mnܸ±×2ÿ hÔÁõo×­õ¼ë>àâ‘ Wbx‚w‘–üï”u>@õ½<ÿ1åùé¹é;•5p¸CffæÈéÓ§ÿ/T;šûÓìŸÌ?«h† Pîk,ì·ë9]G·å¦+E¢TwÅŠYqqqôA àv £¶–u`¨^ú–µ6öµ³Ìí~ü¸2dnï*ØCÍÑäùJYS?ŸyÌ Çßeš£‡Áü.Zã†HßÇñÇ ~vCjb"‚®•ô£ðWO?§,ª ç9]#Ànà{E}o·¼÷ž0˜ž?  ¬#ÞAß§ž’f£GJÍfÍTP>šèS¸ÁœÞ ÒÇk3…Äú={BPÐ_=ŒÓg$#%ÅiáE§ø ù\"Ò7MŽÍüáMC)À9&¿Ô„ƒ*PçJ0ä‡W­¶õ}¤Vu„ ò¯ýKn¼ñFF]÷ñ.J¿:™Ã·‘º ,o;ó *~ <ïm¬#MÞÀx ãûã-dàz\kûyÜu_ÿ¦À€< 3Àz% %%¥Û”)Sƽð s¿úê+Zq°‰F`aKºY,ê'NœX×í‹À7‚ù¿B€Zx±T ¿°°0·Œ¾+cïú[3øšá/è¼§÷{Ñð‘ÛëݨþT”Ök°ýÑÓvJ©<ûL'êÝÀî@ºx \¨Ó'›ùÇÓOžPZ2gaæ3׺Ҏzݺ©h(p18®ø‚†Š&ùM†‘º;Ë©={•0àâþ;Bóד»w#%æfaJ;2Éj¼cÌ+Þ»¬‚ƒäÔ®ÝûÉ'ˆÈ¾ 2ÕbïÿüGÚÞpƒD4m¢ÊÄŒ>ä `Hs+°\0L!éT»cG¸ñ:>iwn !XüóY€•ÒfßPÀf àÝflZü0êÊÿ›({gÍ–ó§ìåahîÿç?ÿYž‚ð)Þl¾É’kþ\³î¹çe•êÅU)Ùý¸è råE#¬Ê^ÜOXïÆ x”‚4Ã÷4ãîÊì»þÖåôVŸw÷›ÇØÄPŠJ”„KÀíÈ\±aÙ²eqÆ%ÀÓ§T¼òFP<:•éR`Êiòß8tþüùAZQ°L©‘’ÔÂyW¦Þõ·k]×ß,_\`Y˜ûç®[·.®¬ø °7pOqÛ(Cå˜Ã”_÷¡À0_ûESèãX8 ËHA¨0iÔ,’A°ÓgÐ×~›úå—|™š㈘i>f4Æ\”ݼÙVsUR,35MŽnÚŒñŽXŒ€E­B`£5çþÐ$7Q¥-_!; ðƒ\¿Wo¹ô¾?K›ñ׋¾ýÔô+paô ø‹gÀ¾TE€Ä&˜V;RŽ •¢7ï<ëЪ¡ù•Wú%¶@=6‡  \(À8+çOœ-ï¼+[‘võØ–-ÈðcŸò™JË‘nuêÔ©ÂHÿtñ¬Hð²³€ù“óç½¢á~ÐâàŽŠD?ÜËÇh£;„-ŠŸ‹,ÒB‚ÿ¾P0]Øu\xÍØë­õ¼uŸçõoëֺϠÐû¡p¾áÛo¿­ža„ö›vãðœ”󇊼2ùÇmŒBŠ¿ôUYeà9Ô@»TƒÆHM<$aÑÁôþrxÓSÇP RPïkpu,!ø;¸t©l˜2Ev~þ…íVTÔô?ûì³òðÃKs¤XõÅœ»,>§¤¤$üoõêÕÞtÁ¤™ïöy`º7 Tð:Ÿãþè0üøñãÉÉɹQQQðH+žK€fØ5ï·®Ç ú­ë­ XÃ]YY.ƒ‡ @{CÈ5zÑ¢E3_{í5 2à/ €¿(YÂí€éÖ&ÿ½`ÎsëŒ3îñú~QzFé°•Éç¾FÍÀëó®[}^3øÖßz_×ÑeŠº}L2Êäy])-`p–+€”FV`”ÙfÀ6ÀÝc$oܨò{gÁ: “b8â|e6üÕGÓNÅ£bäÇ5L!z=É40”)¸^°˜ãȺõjñL?ùPŒwÆÃ€dÂgF–ÚÿÌ´³rpÉb‰Å_€föý'M’(˜ß*³_Å/À½V©SG¢»w“ä „s€7ÀÌ úöQ1¼©oê  NÆðàw8-é°lšú2м"'vï´à»-7Ýt“¼‚k G0ÕêȦRa ,  Ð’£ÞF¥:û5à2 ….¦×¬ŒA,®PÊeƒo¤Ò°(°2êÖý‚šÁ·n *kmÙ,´2üFÔG}t÷˜1c6ÿöÛoåÑZ¸(²–Êy#(²ûvQ¼ !h çp˜HÝÉØh¼¸ÁdüµÉ¿fйÕXó®™x]ǵœëq}ÞZ¯ ;b]FùÇ„®MþW¡l`\AuÊáqú›1@'`SöŸþ„§à/}bûI?uJù†#­O(%ð‘‘ñg_M[ˆ`D‘.D1àÍ`^Ù¾·;àÏzÊÖ›ÌÆxgz¾cðϧï,Óä…!f< Ñó…qgß×¾ø¢œƒ0ÒG:Üv›tœp§ Üéo-;2®ßóÃЀe"cƒ§@7f!¨F+0)  üDÌJÒEoï÷³eÝË/IüüŸà2eŸ²™ jýŸyæyà¤>ÞëŠ g1wÍ;WÀðy{‹ûQñ `¼· T’zü˜Ov„;nÄ+¶K€fà­[+óîî¸õ<÷õo×}ÖÕÇèÀæÄPÀ®]»®ïرcØöíÛ[Ó¸ø:NÀW –p}0ÔÑuŽþüóÏG”ÿZJ¦zéÖèʬëß<_Ô¾fð­[]GoõuÜ‘&ÿ+W®ÌÞ¿¿6ùånòwEÆXllô›%ÚRÑÁiLfF çúƒ¾Úd¼ñf› ŠC~ŒiîÞ⪫$¤F„ݰÑö1Gø£7Éé½{å\br³sTŽ{ƒ‘õ=ôŸqâ~øi÷¾õ‰!¦eDóÑ£¤Û#8ƒý±/|ýzñS¦½é'O©xž6O@pÕ*ÒjÜX5_xZß”70¸˜t#âD|ìgŸÂßÿí¿‰õ”À¹€ð׿þUžxâ :th…3÷w¥¬DUê?ô梣ÿ#’"(Àû¦fÃèÀ”|E¹¸cð­Çô>ǯfè­Çôqë9}̺Õût  ‚/'Nœè‡ô#öîÝû-„犸?sº @!Ä)K§ÀhÓä¿úÔ/é ~øáÈ“ Þß5S›ük†\o­Ì;éßîö­L½Þ×åõo]Ïú›Ç\}¤ÉæéÓ§©~b ¼ÑÀ\ËU°ßÇp?T×56ú—3@ƒÌž 3é4øÈQ3H†„•9¢¿Ìq†V p ÓÔ=ª{w˜ sú4e`-cÇ>ã…)|JB‚œ;|DCC¤ZÆÅàù6|ô×¼ø’zo|Y¬72ÚÿÛ¥f‹NÆÚÏÌ¿¦!µö´x —øŸ¨]ô<VÊÁDiö‡?¨"º]³50ðœdüCanîØqIZµJV=ý´z/9Ú ×\süãÿ‡zH4h`ç¥ÊLÛPl)ó®1½¦h^d @ŧÀF ¼ÕŠr °2îš±wÝjæ]oÝÕÑç¸-h_×£K-(€ÅBƒÉ“'ÿñÞ{ï]¹`Áûý‹OÇrUÒÊÁãƒM“2•CÖ¯_ï¼yó®ÅË—’1æÑ$^Z™x–±2ïîö­åÝ·¶ÁóVàošü¯Zµ*Fyj°pTp $d'–mÍ€~2ôÉ>ºi“œ;q\²a2Šta0&“_¿“Ü4H ð#ù#~‚M ‰jpY?9/ô7·8ߤâÇ·o—3 */.05TÔ|^·ÐñŽºt ½´,ðT¯Ý-·Hã!ƒ•ÄÛvŠ[ "Æü8½wŸJïWÜzº…ƒM‡ S.¾=t{fk(Pé(À9DZÙˆÝ)+'N”í}¬¾¿…Î;>ªmÛ¶r÷ÝwË«¯¾*LóÇLN•Nž<)ÿAJÕ¸¸8µžõâžI¨?xQ·²W¡ëu r `–|{êÖ­‹OÑ…º,ͬ»2ýšY×Ç­åô¾u«÷]Ëó¸>§÷¹¥KD쇃º©{÷îç7mÚ´Ö ÊmÀ TŽYÅ‚”µ¢x«¡O .7é0ƒïKWhýèëO“¾\ †® =ËÆØëóz«Ëº¶£kš1] |ý³ašCΟø ðF çê+T*Ç@'c >Z›/œ=qÀ@­àI,JNÆÆÊyäS§/2†h*”_2ž³C[(€±U ‘ú™nަêǶnõÊWÝ“¾1>À™¸xãøŽXePZ1ZÀ䇯´ÿpEJX¼D-*\XPDgZ½VeG‰¨!9x÷(±ë#yýG¤LÑ3 ½ö¿Ljµn­Ü<«mJ Tr `Ž£e]Ò•2pè–wßE¶’UÂ¥vœ®]»*Æÿºë®SAþ¸Æ«,ðõ×_Ëwß}'0óöö–¿CÅÉÞV6õØé@Iù ¸8€ À |òh†Ýu˱Êcz«ÏëßÖ­7ûºƒ_R (®"Cßÿý>ˆð=„•×È&Þì€7T+:`¾iò_—êš’’rí|ðHZZZTíÚµU ?šük £^j&]ou9ëo½_Ø–ç¬!²=Mþùå—LLÜ4 `p‘+ï++PÍ•ÂH -8l2ÿô˦™4…4Õ¦ €@À6²›†A~#œªåÕW!}_˜ÊZa§fŒD§Ùm ,N"XàÅ‹ásL"Û¶AÄ{̉9 ½ØfÏØ>ãhðb½~fŒÐúºqÝ£§Sû_‹rÌ­4=N‡V,nþ|ÏûŽú¤Ië±cKÄbÁóš†e“Aááðy P‚Í,›ß~ÛvK§fÍšÉßÿþw…ÐjŠuW6©äß^1âÿÛ óòåËÕZÓ‹Ö©~ ¸ h´Á^ÐR…Áºg¯ßQ•.`¸uœ1͈Ó2Å•á×ç bþõq×­»z<æŠì#ëÒ%€– “A3¸Üöè£.úá‡Ë@1(`Å RISÍçB‡¯6l¸gæÌ™·b°Ã’µ™ÿ|“öK3ômÝ1õÖcÖ}݆fôùÛz^3ý™|¥™–Ù½{w.RsఠΥMþw³•¶ãþ»ÚM‹´Ã‡å0ÒçÐošJIË9Y¤!µ»O¦ý N~ q‹Ð”ÕïÓ[š¼B1¬Ì\a70CÀùã'$é·ß$~Á „À+¦³\0h Œ±2–>ú('K}Ø£-ÛkØ¿¿´½ùFåOŸcCà?·â})ìHüõW¯âTƒ…D£ýaùa‚….n¯g Tr PxN 1ŒÿoO>¥¾©ê·‰6°è”±ÒMBZÑñãÇK|³+#̇“þÿIˆoä%ì@=ÿÛée}SíB ÅOºtÇz¿]°–  ’ß®+õ–û…ý¶–ã¾þ­÷Ýmu{îÎénÒb†ÖÐäP¾øÛ/»ì²d¸l‚5€w|Ýx%ØþnÓQ n¶<Ü"jˆž¥pÀœ9sî‡9};úƒÉË&ÿ¼Ͱ¶Õå\·¬£¹Û×çô–‚2ýdòéÛÏß4ù_»vmvbb"¥­4ùø8ëȧ?JÃ×›mZÄÿø#̆×KÓá—+àz]/UfÒL)h,l#}¥mXÍd.1?TGžê/¼mùu²A÷è`'è¹+%þ€0ò}Óç¡1×@Áש]»$¢ISdÐØ§{´eæƒèžÝqoMœ)y¯%˜£ÉT­íuìÆK`BG€Y •Ä#3×(ßà|Bw¡X0¢‡ ‰¶SpNíi£FT€¿ÛV”‚€Ê XC*Íÿ–-[¼%ן´º\êm¦ž[ pm?øpâV|Ïa©سgÏ@jàɤóÑhmA›õ–ç¬å¬ûÖzÖrÖººŒ>FÁ÷ƒ¡|hˆÀÀááátG<€©#GކsD™T]Ïl/¦€±¸˜&¥v¶.ÞLöèwß}÷_ð½i i° xÁ­¤fzðs뺯Y·®Ú|­Ñ×e¬¿uY}Lÿ&ÃŒ )àqå?Ïä?ý¾8µÔˆWv/̨´{€´ Z”nð„m2CÇð1=µk·ÊUN–%¼vp«jüm£ºiXS€‚€æWQû"}%sÛÛ ‘íÚÊÀ—^RBLŒ¿_ ‹ZÆÐ×[¨Z¿\ößÿ µ€Š!()®C€ã[·É¡+¼¢aDLŒ4èÛG¹A\@o‰aê T4 à=c¬T0¡{fÎRæþG7"(ºu±áž¯BZÕÿb^¡öŸ>Í• ì’wRÑß þ\]™éh㽯DÛs€t ¨rðàÁ¬É—´+€Þ’9×|n]÷õ1}ÜUË_Ðq^K—%Ã}}Œ Zá6Ýþ7Þ¸A4çêÄ뀪ñ üÇX”‡‹LA í¾º#Èßø¹s率¯Mp½zõò£ü³›ðzën_ÌûÃ󺌮SÐyײº<}ÍüSÛO!­`• ̼ׄöiòO?wó’Y |ñ~}¤ˆ›“éÕÀa@[áäî]B<×€¦Ã‡Kt¯ž*('ê,ƒÙzS¦ñ2OúÞB{MK¦ÎÛ6mºl}ÿ}[Õ0ìöð_•Ë _XäÓ‡ ôÁ_~QŒ´·± Zb¡„€«™)sZÚοˆ;އW¯&é^Å¢ÕO8LŠíÔdÚxû¦iCû(€w9LcèPÀ¶ñÍ7%iåJ¸ÚPfoŒ5JˆHa–ÏÀØwµ²ß2Ö¼ò#¬áJêKg7£òç¾4`êI®][ç Uà€E‹etìØ1¸}ûöêƒKfœëJÍwè-[ÕûÖ­Þçy+ð¸õœþÍ­føõ¾.§SÖºukãgÀZ¡ÅÔ©S×ßzë­DÚô¯QÆÄ…°ûFàB’þ‰ÌqM} ýÛ¶mëåŸ)þ( ³rîëßz¿¨-ïɵŽ>VÐq2údøÓÁ$"À†2ýçvݺuÙþñE"~ülË@±)@›hZlþ  ì ´è'} šX2c ’hªÞ¤±Ê5N&Á€¡€ß)@f‚€0Ä-éþøcÒ׿úšŠÆïÏk5‚~‹1WÊ9"µ2èdþÏŸ:¥,`¼eþ™^³~ï^NË´‡‰ÔŸ]/²-,yäðÚuB!‡7ïi@h¨dbÞæ30î?E’Û¨$à܃5Îé¸8Yûâ ¯CzQZÛ4÷†´œðM–ưÒL‹}W,û-Ó¢yÜ…>µÿoi]iÀ^ p±x9ðQ r @êFå /Kž…‚W(ˆ×på_XOs׆nÇõœ®ÇlMš4¡€ÖU7oÞüÑèÑ£ Þ£xçì5Etש2|ÌJñá`@2Å_K0ÚƒaþôXjjj4lèôªgìüPèAoÝê}ä¾Uå¼?ºœëÖZFïk­?5þò)'iæg]±bâi¥r U˜ÜüA×3[(ÀÕ2`,œP Ð6ÈÄó܇-SŠ51Böë'õ.½DÂ0æ;Àh m#}¥mXÍ9`±]³E òúdI\¶ ‹î—T:?_ ÃÿÝ{L˜òà2ýŒæÍT™ÞB ô9¤Zuü¯¤-f˜Â0ýø1ÉÏëGEE1“†®Aüi`ÿþýÚ5kf¯¤OßL9Ø@)<$ `ŠÇèïß ¹+¯úòË/ÿ„h–°Ô¬£˜š¯6Èõ Á®“açow Ëéóú7˺;ƶÈì“ñ‡ŸbþiàbòO_ö¡@còOBúÇP}6Vk£€£á@Û Qv·Ï˜!GV¯–˜?ün½¤NÇNjúj0žlëi¸ÂSÀ:C50@¢zt—Ý_}-ßxC2RR½¾ÿÖãÆJT÷nNí `oš÷*á€å¸G»\ÔnßN2KÁ]†92+IÈ=î-„cA––tXª -¨¿,¨=%0óÛ †uBvæX@XˆÔƒ4£&ýsq^Y_°¾/V oïÉÔ3ð˜ø¦1+N„j§öì‘0ýë_{ n=ÞÏ=Åéý’xàûàÁƒ‹S¥Ò”¡RiáÂ…²©\}jÿéZiR¿ù@D/«òÃÔ8‹.?ýôSF×®]ƒÛ´iãÐüq¢†Âx]‡eõ¾.¯·döõyWÆ_ÿÖuYŽVÔì"Àdû;ï¼sÇ=÷Üs=® UC•ü”ðÀà$óìÉç=H[1¹,¸‚Q`i¾bÀzP[»©Ï[·Ü/YW—Õíè²ú}ýiî ¿BîÓ ¾þ9šq’ÅêMfÿЀ)°ÍÅé°x pÐV8ß;æFopÙeÒdèPD:G|€–˜Ï1ag—ÃcëÍšÆË¨™ •ö·Þ* ú]&[Þ{OöΜéYÿ°`Š»Kÿòeæ î"æ’&óŒÜo>xväîÞ¶¡]`œá†Àåש}ûT¦…3ȼTµŠœØ !C’²$ ‡5Qh­šÕ­›²(ªwé¥*-$/Z4d@@`ÀP $)@ç ÷Ï›x$Ó$%!Á7Á`7À|éƒ ’ûï¿_þ!»‹)°B˜Ù³g«8SŸ-ö‘å(¹h&–b“̯iR9ð)à#H¿—Ÿ%@+'ù.h¾Fó!VþC÷ÆzŽÇôo}^³·òGÖãÜ×H…*´þ(YÕªU«˜s {i'ŸFýJíÿjÖÑeó>$5»€}Þÿý‡ô¤ Sü1‡%%Uz0[2»¤sŸ ¶Þ×[}\oyœ`ýíºoÕú#r¦bþÉøç™ügá¾äg ØCÒ¡‡U¦ †ÇÛmjç$Q› &B; *™+F=÷—Öж0 —; (†œ’|`f1ÒãoKc,–·NŸ®âTç†8'v¾÷Ojœ*ß]¶ç Xø§N’ ,¼j°éCÆÕÛÞ\—uÈ´dO—‹ùtm2à˜×Ijà‹ X@"~c¤8 '!„8 Æ?öãOTLfuPÚS)¤¥‚b²(ØË…‡ap;AÜìŒL‚'¡5$V‘mÚH6­Ð>ÔDj[Ü.™r†ÞP€ïïÑ dÆîÁ¥KmBQ‘s÷ÝwË}÷ݧғyÓçŠ^J%øo#³-xˆøª"Óoó¾ SÓOxíÌ~›P YÂrú÷ïLwòü^ëŒÖëi~„[‚uk=§÷­eTüaÛVp-Ëß´B`ªÀÐÐÐô#±ÖþÑ»wïÁHc>º{÷î§­õ+Ó>µÑJ€„Õp™Ö`¬G¼øâ‹O%''· óÏ4J©ʬÑÚ%`ϹÜú¼>§·Zçºåyc ?júÉøŸ†tœÚ2ÿò'¿þúkÎñÂ}K€ì§@&.¤«Ãârrj¬ ´ È蜈Ý!Ç·m“L¸PÕV«–„ ªªb~òÆ m0 W> `L‘q¤¦»:>ÎdVðx>ï ºWEêvî,þ÷?¥Õ+¤˜ƒñûñ'żVÎÝ9ŽûVc¯•º:B#(—…†»:~9ºð½£P.nî<9?~o€±=Ãì8 tõ$¾&ÙtCP´ýsçªx »=þ§Î Š˜8_`¹Æ›³ky[-0Ì:{NY P㟴H7m’CËVÀZ`žqm «YC}Ïèâׂ7·hê ¸¥×8¡PªœÇø;°ðgÙ<õ-åëï·n«øåàpdÚa¿»îºKèÒéÊœøå" ‘¯¾úJÞƒå×ß,‚æ€ã*I*Â-$à&¦GÁ•¸Î¾}û²ƒƒƒÀß(i À-ß 2åî¶ÖcÜwEM(w|÷ Ö-÷‰´ µ5„ð:"ðd X²lÙ²ÃîÚªèÇŒ€ÍOƒŽBúû·E¤ÓÛñôv¤ª¡”¸nݺ4KÉgêõ å–ƒ›[‚u_Óey^ï´uW†Ì?£ú“ñ'ÒÉ?©U&àzñ-©Wèku%éC€¶M#™3=yý:‰Aª"f ¨Õ²¥Ò¢–t4ÛnÒ4\f(@&›HÿÜ:;J,š#Û¶Cp®T¶Z¡¸µÙÝ}ÄécŽy ¤k‘¼ß¥­®R¯nç ?LÍ!™àÜÌÃ^£ð6¼9KËD[•ã[·ÉQ0ÎÞ™þº`¤8}ç7‹3Ò›÷¼iÊT9ßÜsGúÅT:þ¾ÄÓqû%Q¿›&mn¸A"š4‘ XÖŒÊnÀPÀ' `¬s<1àí)Dø_ó̳rð×_ P¤£}p)„lW_}µJí§¡ÙwµòÝ22I ̯•¢É‡;9„º BÍ ÊÊìà³àGþ²é§¡ì ìÕ«W y"­Ý¥ $ÿBÐ|ŒúáòG—Ñ<‘ÞºËoC—·žg\¦ ï…$9¡–.]ºýû7ܱ_E{•ê#dÖ‘áç} >2ÿu€¦OŸþÌMFÒß?OóŸÿèoݲ+ÖÁmÝ×åX†ûz«ë­:áò‡šö£ÖÿRdQKæŸû‚i“F©øžKuó³ä)@+€ý@æ¹] ì ´ެƒ/׿-*6@,Ö©@ê"‚OAÕlíµi¼¼R@3úUa ƒÀuÕ7„y}¥½O;ĵÞïÀxÌbAæ´pæZ@ø£gž£¥¨ç@šÂ 2§% œ„‰lÂÒ%BS{o•š­Z*¦¾¨6xMšüïøö[¥é·+2:5°ÄŸÏbi=þziyÕUR›)€P_3ÐÜ€¡€§Ðk¤sÇOÈVh—üü³œÚ»×Óf<*OEN=ä°FB>t¡BÇ@Á ’ ãUð¿‚KëÌ÷(µX©¶bQ¦lú'ºAÅÕôøøøjà3ráÄ ãäAÀ)—WA@aüŒ>§ßsëmò˜Íÿè­¶€Öõ¹åu›6mꀅ‚1 BvìØ1 B€Ž8÷'´Uiâ”ìÊF?¡J°Å@"m£€Ýþýï¿°sçÎË`z€Ô*ØŸ6áÀu‡šDÖÍ}^"Aï»û­ÏéÁÏ-ýi­ÿ‰'ÓÏß4ùóŸ}6¼ØÈÉÕ@Ù WÄä‚h ¤”µ°&Ð6 óÃdL¨Ü0îhšŠÉ›Àó üI•ëó\ÍfͤN—ÎjŒ3L8n)C&¿¦ÜtÙ®Om`hÍHÙýõ×…+ð\HõiyÍ5Åb¢ lăŒ¬Ÿlâ¯Ë`‰ã›üµù¨‘*Íìñ±pß ÐšûNîÚ%±0ó_=ér¾þ%œS#É‘5kU¼Æa A†žR€cœ–A‰Ðöoû`†Ä~ò©¤ccp-F×ÍgžyFþ‚@¤dþÉT(œ?C(e˜ìñ!°)®Àu'Ç…_Íœ-e 0ÿîÀÑp'ŽDƳl¸€áVÜ:ÝܹðÝ*Œ?Ò÷dåô1Í ñ·Þ×¼ÞjžˆeøÓ%ï®JÑNHÕyõ›o¾ù%\T¼—¼³árfƲáAa qSƒ¾×ƒ>8&öÍè¹`0ÿwËðs0»¢îšu »j–ÑÛÝVvJÞ˜Úš~èPšúüÃ+gÓ¦M™0Í!7÷p0h ìQ€–±À­ÀD q½‹r†ŠÅj!mÞ¬bPSK¿m è»í‰oqq®eÊTr `$³Jw“êÕ$fĤN§Nr¦„çaBÞþŽ;”éøy.îY¶ Ozú±c²ïûïÐÒse£×7ì×OB`¶X ]D<9MøÔž½²ñõ×ÀÐ7·DšÙ•ðÎM'”ÿ=„x'wï–Å<(ñ0ÍWB7eíVBûQ~ÍsÏC`½ÞVá4ƒ™M˜0Až~úi?~¼Ð À@Ñ8×¢?üPèÿïp øÁŠ ”q ðMF/ILLÌßကƒ¼ yhá• €ûVÆßº¯y#}¯üM~‡[w ù$Íÿ°LAü¯Ïþ@á€utÝY³fÝÓ®]»e ²­Bƒøùñb‘ùo€ÁÓïÑGƺ.™ÿÆ;àorÁ׃Úݖݲnë¾È,£º>æº¥Ï ûÑÔŸŒ?‘æÿŒò@YIIIœPÉH>üÐ@Ù§®Ò=à0Øè~6Ä 5*I¿ý&©‰•¿.͆hŒZVüË×1m ñËA.yF°¯ íZ§{îF„ù0éx׍zb}ÂøLÿuÂOO–Q0ñhÊ×ËFÀb†ýONÅ']g¬Öú¸ë–ÝÖ¼·šÿÑÇôoͱ¼Þ×ç´P€¿õ>…  ðL¡à‹n‚µv<âÐڤ‚‰àÇG‹EJÔªU«½üòË“ÁðWe”¤ŸpDÂtµEóæÒ>®Hĵ»ò¿‡TLˆdÔ z rß:Èù› Ïs«ÑyæÂ¿V“NºÔþÓäŸ×BÀ »”«KjQë_á¥]RÇ¿¿nºé¦K`N´ÿwÞ)É”"œPù!dÜáÀQÀŽ@[Q½n@ÚÀˇ«õ.¹Dªa\c6UÑÃm½¸i¼òPeB*´{4oË-*þ„G1(0G2°`tÏžÈ.§Úóä¯uB¯æ#¯€UÂ9¯¬Šs=23´¦9²v­Ä~öiqªZ¦í7*ͨŠ!àÂüóZ´âI\¶\6¾9–=4**}`l€ãȰå½w­["¨5¼øÈ¹`”~MJ‹>3[HìÇK<¢üS(m'PK#—à[G €)S¦Èe—]¦üÿ)`tqS>ÖòÓO?I¬os ×VÔüs½S‵6]zyýÎ@®õ¹€¦†›’eÀeÀï±fçºÌÀÅ`ÐFÒîg("›Ïœ93£OŸ>ÁpŸqÐB™Á3i’¯ãhhÞÆºuå‡ôo–±‚µ»þæûLžŒ×£•¥G“RÁ¸øì…"Mû4(n[!­áDkÛiÿbµ@Eº»¼ 0N‘`®{Âìÿc0ÿÐŽ:8º#€ZLӦЙç` ¤¿šöÁ–R¨ h»ö"`ÍÞ}{•¯>%Rp¢+èÍãZŠÅ-‘ƒ™/5ýôõ×&ÿtؼys|q¨êáó3p ÐsÛXTªl0f̘V¡Uÿš›í¸Ï¯ŠÈïúpR3Ïg÷Åäæä°Ú¼ ØØèøÁá‡ð8+÷Ï€´`°É!@ ˜-  ú8å?¨‚à]ÍF’†X 1èý‰É4×ÿÑØ´äÜîøö2çºëòÒ×yÖÝ]¼ø‚4èÓdzŠ”ÁBäЊ•²eÚ4¤-[èAÍ‹‹ÃubàË/Kãþý |4ñ§õĉ;eù¿þ…´|eƒù×ýÓÛªÈÝï¿OI›ë¯—Ô¤$ca¤ SÉ·tÅI?qR#. ™ÿ„ETÛ µñMëˆo\8….œT¬pÅmd±6l˜`G_beÎlooÊ_ë¤Õ+¯¼"Ï?ÿ<#Âûr£òs@º@˜Zûr` ™óZÀ@wƒÌr½ä<ûì³= èÿ[Hh&Pqj«±vÀêK¹áaá9ˆnŸ-òYø“ŸDã«ßç`­HA )0?o¶jÕ*‚€ (L£K ­¥Sƒ|5?TäŽ7â1ŽÃ˜?È‹EcÝ %¬æÃŽõ>3-:âµÉ/pI[òË’lrŽ=úx¨»/ì~ÅøåʼTŒ»*…»ÀãdÔnܸq_a 5Â`õ¤Ô„W:æR¥•öª¥‹+Q›Éþ­Ó¾÷ûÙ>l2l(Ò$>ŠtŠm/òÿ†›Á‘ dûÈÞYœ*Ê6 ~}²4B¹¦ÊLÆÆÈ†Rƒ±?6½õ6\zæI:Üí+S ~çÎæÊjæz=®Û¸>£€`(²“ÄÄÄ(!fP\ËWÆßp5UñhàÄ¡.µï½]€U€Þ•_g€t£äúk °@ â窫Çì¢ËG Ü“‘¿ÿ`ë\scÝž™•)™™’W¦ðð*¹uêÖ9ÛºeëXãSâÁŸ†qr¤À‹TÎ7ã¶ß†#%zÀ€‚ þ Lï• €éú\…Ї‚PÀÊqß ä‹š?"_BkÄ—©a…àlW3ÿ´.äûš•éäÁ¸¥5öÒ_–ÊŒgdoß¾=‚«× P¥›t…'gZ¡n©äotlxÇw¼ 3û.ôù>lXÀøƒX\,rˆràÑ'Ó*Ñ Ä1TÅÀC(ukוS§OIúùô|!€uPóõà¶î“ù§‰?µþ ¸f_1ÿHÃ!K–,É€ €o'$®¨f³®÷?þšG;tl?îa<;˜o(“/÷…/>ŠïCîíÛ·í˜tñ)%µæá]àõÀúÀ ¯@áD4p p$08H¿’Æ@[ }1Ó3oz¶ŠæI.™c `+éMãÅ @84 ŽªèúÅ(~Q¦"<{ì¨ÔÀ""š>Ži×…ÇE•Šq€ß~¼,šÿ¬´³Å¨Up‘0¼s œØbôhg A‹N  ÛõÕ× =‰£Pðí=C·€Æƒš€£ö’¹ì¶Žõß3®w˜¥bý+¯"MåO>¥Ç,êfiL†¿‚"˜áúÌèµ|šÁ”U¬%h•i1™ŒÊŒ=5cÆ ùòË/Ý PŠA®Y9ER³O,®eŠ«ˆAQ·Àöè³Ñ x7ðïÀN@ œÜ#v4\~Űýúö Âó óm1¥êKç`lr|fcŒP ”––êH:t(мºâㆅ…FרQ³×ĉk÷!~•5œÙ>!®B*òf À»‡daê}ã{¨uÐ]3ü®ß\×ßš¨š?â¶6¾‰]  £@ Ú"/Æo¯e˲ŠËÅ»Žç ó Zlß± Ôžp™> ‹B£ f†òãÄK1uêÔÑË—/¿&bŽaC‡^ÜÆš¹W—Èûé§?´ÈÍÉx˜@¸ÏX«f-9vü˜2åg}ë@׃›Çõ>Mþ©é'ÓÑ£iöO“ÿmÛ¶å®]»6›U>ý¾…—F ñªC§v?BdóPLt>¨‰#ï9æ,x'¤SǶG¶m‹]›W„ïí߯ñ± ø£9\7`$¾W¼Ýl…›¯Z-øðóÃHÓæP,¦Ø¡òÀpØJÓx©R€q*ÃÇþ,„£žþfÄñ¦Ð°…†I6Òõ)Àœà1àÝ‚/1 {kÓÔ·$懾-p:Üy§T…9¥«ÿ?;`6½wæ,g°4_/Võ™’X»C{•’ß;•ƒ\+……ª¨þ;>ùD¶@óŸŠ”Åv™Ž.]ºÈ¥pÛŒŽŽVLBAÌ¿µdTXnãÆŠÑhIA!´Ž•æÌ™#ÀÚA±½%…ž\õÖÛv «„“Œôo ×Hó€ ÆÞ4öŽŽm;^רa£|ë]µ†çœŸ×£\0ŒÄ(>8¨ˆã–kr0ŽÛcwDAÐ%j5¨ß ø… `"f2sÆO˜bwÄÜÞã$Ú÷øæ3Ÿzÿt€@+”÷xÔÆõ¸æ‰x².ÿ`JÅ«:Žc,oeþɃùÌrÔstZSó7ù°6­Û¬ß°>Ó‡£o?£‰D¶]À||ŠT¤aÔßþö·éøxÔ€/XàÝü£šü9à0êÔ8Wè‰Cmó¢UÀAÇß„ªUªJò±d5pù›×:¸¹Ïò4Wa€?úWQóÏ}ZüòË/YqqqÙ¨š |ø0ÐL: ‚+ÜpØËÛu踚ûá8§Þ .ðG#«ç•Gw×6\CˆÐV/ã8™púµu-S¿i]ÐHn… ZØêÀTb'àsÍÔ¹ø2W0ý#)ÅxÕïúaÀP D(@áîôã'  ZåÕ5‘þðo«Tý}úJD³d*8¯üÓÕZ‹Âb€ l‡²LÏ·ùÝ÷S®˜õbÔ-¬H0,ͯ¼ÚÿQr8|0ò‹A«r~ÓÛÞŸ!§öÏ. ™„) DYñ÷˜½¡ õ{÷vÆà7÷Æ`†já†ç¢–ûõár¦j)SÀÉø‡)!Uâ²eòÛÄ'a¹ó«Ovv­)|ƒiî dùZµ†+æE¹«Ø”æpªì@ËSFý§ œ'Ì^À?É”fulß~vî=·»¦2ý§ù?{jþA®¦9ñûBW^®ÇɸjtºöÂ* 55¾åMÖ¯_Û½fÍZgàë !@2„´Ð¬ì@žä+ “CÁÇ0Kb*ðýãš›ko Ù8Ï«¹õÖõÕ¿“£34ÿ|@|><άÚ@›JÀo÷±å³ËG uÀ‡)¨Y+`ã¦èŒ@™WÑL…J¾ øF_|±LX2èßMˆ¾ÌÈ’Ùô c»\”p†p³8QçQÃŒ. êDÖ‘£ÇªÁËzpsËI†&ÿLéGæ_kýi°bÅŠL´`«I@h³UÀ8l ¸R`Üøq‹³ssñ8¥œìÑrLÁâ’“8}¼HoÀ¡¢Æ†£™ÿÒV4An~ŒÚÚ'jkeœ©[ ¢w½®]%"&ZhO±XRï:aÀP $(À`€ïýáµ’w=—zzíÄ_—ÉüÛo—ö·Ý&­¯¿NªÃ² sn~{®ó½þÍo0Ä/–ØO?•ø UZCOûàZžL³qùWï–K ¶ø‘œÚ³ÇåŒo?y]ZEÔíÒY¢‘.±Zƒ†Hg®„Ý™¸&3/äÀ§r÷7ß(« o„2ýèfh™2ª[7µ˜ãuÙvd»¶*E#SR@C¡€rJ¼|®Ä“»vÉÚ^Té)Ï!Ž‘@S_ú“içÚ@FÀSàú W¯^‚ fžV­åçÎ+ ,(÷F% ÍÄ`º˜[Ÿ¦ãjêÆŠžÿøƒ¿;™·ï,€ƒ,Á“y`ÙUë¬Ñ«¼?cúc ÔïýàƒÃ7#åTÆ(ðp)ðGð3 ‘62™6BhIÁà|Œ À œÆüÞjZç{óÈHaA'æ D¹,”ãyZ¤BtãüNóËb›yÍù”†`y`RRR}¸µ0nÁ}ùõÊñŽøþðÂgÏž}?úõèÑ#€Á`rð!PƒO #= pËcú¸¾¶e :e8w,ºn´²ÐžUøqrú¥)¦ŸÌ?…4ù‡ š5Êÿr¿˜Áz.¤ÀÍ7ßÜ6#ó<|zÄLiýèúR“}6¹(¦ W>/¯!—Îb*ÐŒ­Œ¶ýãêøNà·À×€M„Úi@IDATô}³Ž ·wòÆMÒi›]q…Ô–¥\¤-­  ”È3^³+Fª4–ÔÀ{ '‘ÎjãoÈþùó¥Íøë…i÷¨©vNNí>5ýdJ©'SÃëߺU¥ßÛ:}ºd K‹¿€7›)Í›AsʬT¿¯¿ó‹/”åB–v[øý´×{‘0Ëo>j˜òîÒ o~˜$4%éÎ L~ó{ÕáöÛTÐÁøŸÊé={圇Ü(8¼zµ"ÂITRÊÖéïË.ø_öì3r郪¹„)#ÕÂô6P¾(]Ö2íÿa.2Tì°õøÍX?þ¸ ™,ƒµ‘Ì™ O€Š˜-Z¨lŒb^Ùaýúõ*í,PË+)ª£ã;(ØQL!Cþsí®6ŒÝ&’ûüç<•7ÿ³á Áå$]víÙÝÿþ¿üyÁ°Á—÷C o2F©¦+àš§5~€5øõŒ]‹æà®]»:ø^"¥ºÊ¶áê^£i­­à‚ƒE½ZÇ“F<®¬ò¾ н²2ÿ,à³äÿ|ÈÛ§•Àu×^çX´h‘€›qþA ‡ÁüVËÌŽ—ûø(`Æ1yòäÿƒ™xÒÿDÃ,°¹H™8Hé‹ÂÅ ö;á1í ·\0é}9qê„Ò@³,Ï!…ŠêOÆ)Åü3Ê?´þÙ0»Ò&ÿÿÅ­Ý ,÷ƒ´€GƒãC€ôߢ†›ÚvšºÉU޽aìÓ99Y_8ÁM›4•˜˜fÐþ‡:éžçäôëúÝ,ˆÏU=›¼-®S(dddÉÎØu -T:'Ûá²\á¼LÖ2ÈŽ}šQûHj2BAJsÈ´N 0®  ØI5×bÖjÝJ™¨3ž/ 1xfØ?{Žìøè#ÌÙrjï>´yNƒC”Æ›sÇ}ÒÊßdǧŸÉº—^B°ÌåÈs¿¦]kbÀü“ÉÎA$j.t4P#ÎhékŸAÎÀ$÷‡.äá–×kˆƒ½þùi:|¸Tª§˜omy@¡ï[3ÿì™»¨îÝ‘%¤Xrß® fS(. ½lÜ[ ¸8`WެY#Û¦MSsÉŸIì'ŸJ­6­¥·ñz¼6Ÿ·Z|÷¦\ÉS“\XÙ1µß¦)S‘¡âC•ÃÎδnÝZà¶)?ü° ôGsaúíS{ÏXJt¥äæÂ¿(àš€céÁ¨äç1/ª^E=Ïõé4¼›_@èH¦­Cöm[K›6m5Ø‘A©YæšëFÜcDÄP.pÈÆw€B*‘²!€™œûØægÆ/Ð&tË–-÷¢ý£ˆ4¿¦˜t‚æD¹’¶Ç–Œrc Óa¹æE™ò `}8ÍŽ„„åÀà{é€Çô9*cÇCý½ù~êu;ßSÅYy0>S¾çhB—u·¥uPbRb”¬œèºAk¹càÃãà \¸pam˜¨TG®ØúŽå‘°UÀ­Fç‘ÿ樨óÕ#äì¹³jRá„JûcŠ?¤¦F ]¹re}М ®wBaòôe¿8HBSB[$âÄ;ÀOÜ€Éÿ|Gnî¾Ð­ZµV“ 'dýhòžÚïUqâ¢c¿Ÿ-p/1á@çÊÀ‰žèÃ_×ׇûm¤ÃR…)ÈAÓÒòÚk$~½5±ðb°@Å8`²6`(`Ì~éAŒŠ-H»Ç°Þ5Ï«Ÿ$ŒÂω„>ëre"ªÿé}ûœ>†¸¶Ðdø0iyõUJ Æ4iùß\,04D$óïl(´ƒëC»›oR÷¨´*®ï,'R‚…yâºt{è!•.tõ3ÏÈIâ$C«‡ðu;u–}ð+¶Zðþf‡ç:X¾ü’Ôù磀‡ >+Mœ3K•*>¶1Â?Tž=’ì!UA÷Fí|ß¾}å‘G‘AƒåãZ¦Þ\ÃÑ%`3â×0m×VZÀ2î€Ú2þÌ #»+WYŽ-†{ÓÏ?ÿ¬S¥}Ïõ`ýÔϼ¬’æ'$È R 7õèùHæ_­‘ZísÉ’wÎužqòÎòª ¢Ãÿ >€V0çM¬I{ýÅ×·@¯QÐ|?vÛm·uÅ Eü€@d¦pI…°*n9P"žì¡]°`yŠ@·ëÞÚ.ˇ‡a pxèï¿ÿ>cÈ!!tÕ¡[\®•Ë~‚ÐU€Â ](àq+⇳<Ïq/ï·:XÄŸ~}û9>þäcÆ]#/ò\ÅËüi#ðí¾þúë}ÑDf@pÓ7%ŸñgÛy/;?®È"ôÖ¿õ6$(D xšø3¸nw@bccs‘~&u9–WéïN×­[J<†Ô>rðàÁÕñ‘‹‰‰¥i_~J[IL‚¹«V­:ÿöÛo;ðò?‰:M€“€Ç]?ö¦ÝuëÔ•Ö0›åsɆÔV?&]POÖ®ÇõùâlOº˜â§N —éŽë}$ã¿x%pÂ[ç†S{÷*Ïú}zK‹1c¤.¢.G ý´µ&}0`(àw i¯Þ¤±ô{æi•¡Â©½÷à‰¦ê×åt ³èßîuàzFëD"§a‘°d©Pðæ+Е ÷OHÛñãÕ‡L¹Px8A2@ ¡!\FÌx_~ûï%îÇŸŠ½KX´X¹T$,Zäöv[áãK»"ÖýÒwâD©Z?ZRâânyX(À˜¡P†š rvýµr‹¡»Œ]@“ašOš4IFŒ¡ÌˆÝ]‹^¦ñëÓ§4¿mä7įYºt©bf¹Öà2Ë* “Aëf ˆ‰‰q×d¥:FÅÔ?ü èVš7…±u\2n¥G'Ò1ÿó¿ý›…¬"‹a¹uÊ©0+´›Û·mw¬Y½F¢êE1ž?Mÿ1p cÅÍu¢ú‡…=å!vÖq¢/Â2 òwò~Jî­ã®¿¶Ç×_~KëL+<Œ`x"ÎXCÄ©@êú ¼:°AÀûƒ±—‹ßPd€!ŽÀú¸;bPÌ5jÔëkÖ¬™ `Ðo̬¬—-3ûÛÑ“æÀÀtš7o^­Cˆç à™:ø¾Ò"@C$²N)P,‘ÞuºP(MFI1þ@4ÿ‡?Œ,Y²$ÿøÕ¤jg4/HEQ¸‘ø¨öýë_ÿZ‘@«×ªU+tÙœ)A8 ù‘†%€ú¨3péF3?˜FU‡_ÙhàÌq7Œ=ú×f™K¡!rNdü)§ÉcþQWÓ] ò~;cPPÀr¿—)ŠØ»wïa–†ßWäEU(½ó½pé_{òî#ü‚Ó’¤°0w œö ȌܹSùõfŸÏPÌ?]Bñ5ïùvSÛPÀ 8׆©xC¤ô£ÿñ9ø¥—‡ùã%÷ý~ÿ·«xJ³naÈiIÃ(ùûçÎCð<ß½Á½òŠ4üà£_+ìÇÂ>^õ@­ÆºoøþÈ9Z( BѰ¥*o©®› >üÑΓdÒÂ$°$ôœB<¦B?)[ Ûdðy~þ¥«õNòý¢w,Bîj Lýi›üOÌ• õâçž×nL%¹"ù]yå•Îr•)®ú×U2èÔü¥‘hþ>€ º¤¸íŸ³íåÛœ&ÖU‡éÆApx y€áã5f\,¦ø ­ˆ·GSPZ=fÖ•Î0Ž úˆ¼FsÁ5—KH8Kmw±þÅjLÑŽ[¯È íP ,p t'´eW툲4PûI01pÐ@§Å,Ÿ4>N‹ê¬ «ålÛ¶íwêÔaíСÃ[Ðæ`ðãüƒîáÜódÁ5he´h«Ô6ËT¾2Ê3iÒ¤oKƒa¬V¯/Ð-¹U½¡P¹>ÖñÂo ¿=CÚ{‹/.=þøãµð/¡ˆ0.Ü æBjœ:2ä\hÄûËºŽžGëÙ£§OÖÚŸê±(ÈðËIúd«ÓŸ­øÌUTTX§¬ÖØ|  ßã­Kâ#œ5´P8ZHUÕÐñ’ó•û“¦iýËÙgŸÝïè£n/ &«þ6è1p!ùd€M,‘‚jðk)O-ÍQÓBЯo…€˜Ý¿wàBž~@öŸÊÂâ#D²O­™IoÁ*/%Qá׆¶Étáx!ƒïþœÂÒ—^r+d˻ߩdÇ{¢ u¨>³r›ï«´9­˜bæY­Û}B}µ§ÔÑax?Ô6d³ï¿/çÉS}‰.ǹýÏ>ÛõÓvc0þ¶•`xÐ 2d޹û;)¥hߌ¸îZ×ZZWæÄ0Dø¦ŸkÍ;ñÔßa¿Jëß¹ðdÞ Ab»Þ½ÝF™Ò!5 vbþÅD­–7ý9>èfýãÞœÙÐ lÅwº¶Šde¾2‹Ì¸–`´`üñBž ]Σ)³".‡sø¤ÊÙkAÃø_.uýÓõ]ã` æÈɦM³%è òë+²¯ž‰`a½´p¿"Á’K¹W$ø³v/yUG¬£ "„B#œ…¨¡C‡¸Žp­Z·R!«J:õÙÄÚÒËuëÞ­“„ ;¡e¡‡˜~ßë‹y>BüS^Ρ¡Ë¥2_2~üø£UÖio¼ñÆÙÊnŽeZ¸?ÿ«¢ß/œ,í‹~=öؽ»ñ» ½ƒ ¶×¹mÁNX(œ¸dx2_Eðfuà1¤™]øŠÙK»4¬£“a$œ±j˜oh¨0Zs˜$O#œ—0Å¿ §CK}G>žŒ¡|Y1M‰ù§÷»eâĉ=e¯×^ª<òåRb¶N0ÿ¼{" “/ȹÕa{è p›•m`;]v­5öIö00¥‚oìÒ |<ׯž& T»’¹­±Ó<¡ fÙG„Þž$}šÀÆmc0¬m{õt^}ÌŽ"µÀÖzá3ϺÍÚ-&]`e|߃t}O<1çŒ6Œy·ÃsóµBŸ+À¹è~§žêþçܦñž«çíùÒV İ,zöY7óæ[Üú… e:ÂÚEî&U<ü£€š~. 6Ú$—ÏÍǼŸ~úi7eÊ[¤Êvùpìw”çŠéÇy__Vûa†i>eûጳB¨½Ž¢'EDšÐa ®<ôP·Jÿ ྐྵsÝÇÒØ$ú|»èèto™È\Å?òÈ£îm×:zŒx½u¶æâe$”!pªæ Ó¿>_œ]Ò(f³Ro!Ó…29¬Pú§d"{®Ò¾ëÓè!Æ`áívø«¯¾ºKu“–(Ðj™úŠYˆÕ=çýKëþËÿùàjÇ€e@SYYYªØê÷&Z-ƒü»HÌ]å_9ó¶DjXŸI¢¶çƒ1—®ßaý1Cà €8­eú˪cT kÙòÍÏý¹*aÁŸ'FýÿäÝ¿‡lë:h°?_jûð"aç< t<C?ñR ƒqHa9' ( ¬U6ŒxWmゎo]]µi— ÅUŸ$ü¸Zë%ªåBêÿµÄä}0:kW o­¥¤Ø`ÑÑ 8]x²pŒ0§ƒáË>uoÿú&·ô¥—MÐUÚöîe¥M Zß½ÅÈ´`FéøÝFŽtÇþæ&9Ñ{Âl–ab ØÛ~Èe—ºî0ÓÊÍÛm…QÙqr·uÍj·K³´Aù ¹ìrë_&dËeÿbV½Wˆy›ñ‹3öYPÛ;WŽï†\q¹}_Ó â¹EÈ^ ¨>q>ù™TrgÝ{¯[ôô3±­)³÷„j9A°§Å'ÍAcvúöíkÌN”v¨vcñ"k5°LÛé±íß»ïfŸ„éÇ&œÔý±Éq[õGèßÐ}7¼Ðm'ÜW4æ ¢Cn‰âB Óq˜ýÄp¯ L ÂŒù[o¾åÐ_¦¨íãõ_ƒ?büâ4,´lºí™û0Q>&O™Ø²ÀÖJêò]Eo?ôÒK/¡ ýÃ9A"~Œp¡Ìºéh‹ˆ6º«x>AávnG~€p; ‘|7þ Bá.ÁJ‰›b ÷·(ÈàÛ©aíãºb³-ÙÙì‘JHI«²V1©“ò¥áí¡Ä“5Ä <ÞðÂ«Ž²ÐxÛŸøñ$ÙêßtÁt—‡Ý’NjѩԼíF·ÓaDšé;²Õk‚Ô¶Ä“—1üT’ÒÚÞ áÎ>' ×¹ŒE"S70° MmÿZéäc!Ú"‰Í)à$på;ï¸ÊSNqýÏ8ÃuÖjOkÙݱb™ëU¦œ¾X1óü©Æ!Î'œ{®<Õi Íy“ß*B¯A´N4á£×QcÝpÙàCÌl—ªm½ r£Å€ 3¨÷†Ä z=Îõ8\_ê#ÇÀØÚxçƒdöµ@Êüá=´¯ûœï:Š¡°-£ãæØ{sP]bë¿nÞ<ÛÒ•í·®ÉýîX¨ù³â0Â`©Ic€“àt™¥½÷¦ÿæ¨þ‹‰4æ2ý\ªîì%ÿMGë^-OîcXµfËF„²a¼*yãžQ&v.íÑ[ZW‡ˆÑ~YÇ׿?Z8vð’c?7JÚe@]4¦rµñ•ѽѼÂמî%,|NCß@`Æöy¨‹”¶Ñ¢ân™ <(M€‹•ÍÎB„·É· ÿ t Îâuèyh}â,Þ§ÝUí7¬HðÈ­…³mPµ·ªº( ªê"­3M<‹¤zb[Âй**+Œ‘ô°F ›…û'R%“.ùžO\ˆî±]qI€(Àã8I6o’Ê^×þýûw€I9ñ°ËDî¡ïÍÑ×§«ï€½?@Çm©Ùq >DtHpíïµ “ø‘—$RåmÛ™BTþëZèóB„g OâG —0w >²àÉ'Í,`ÿsÎ1›hûòÎÚÝA“r+¤¹+U1ç&TžÉG°„ üÁ_ûš«<õ4÷ÉÝwiú·ÜV©×›'ù,¿3Ïk§ULö®~ÕU®¥V8Ù/YŸ¨`ÛVkòªŸ ¹â2¶Õf©L²«÷^Þ¯™VùJšezà ýˆk¯1ÿø{(BvjfsÌ´ÖΚíÞ–ÆÌ§¯½îväØ <«ü˜[ž/“0TœQ¹Æùá^;0;oXÌ¥®`Õõ9§®+YRq%@ú–98÷®1¯…§ÁòQ“Ò—MÇ¢ý§iGˆ_Ê×ÅËríIà hÙ«xï½÷]ee…k¯öZ'|4¬§}éoœûc÷'ˆÄ/¦+TN9È.‘Ý|»Ã?œ…Ë»´M຅EB†Étà0ƃù£êŒyA6õçQ'±¤ú NBÏ›{´ýÚå¾]YC3 ž‘ ñѨü_¸±ù"ùÆÆ±Cûž;@ñؽ* ÑŠþo&L˜°¯ìö:±}öú0ÿlááÁŠk?àùðèÑwÌpxU…ªšã„õyI¨Ó0SϹÿóyÙµ¯uã…®ó¸mkAkðnÖ'ðu°^'· _ž/‚ÚÚËÅøß)ûÿÇ/v/%`üaú ¯®þ‡X«­f?ùd–;|Ôá±€Z~ýë£M@“!ZË¢±K$8k;räÈ=òYpŸ´˜YÀY˜Íç5p^ëµ»Èv(wA0oÇù RŒÂ}œ?'¹çǪñbáfœÃ;ÈÄ—«¥ÜWÈPdøõ®¹æš…oÉS9[olüb£1–šcLyÇ»oÐèj<.ÜÀ‘‘p5lÛÏŸàq_•ùÏGuTw1ÿ€ØÃüÃð¬Üc@8ðG»~…ùxâLÀ×¾FÓ˜F)ÈI`Z'ÁpT…W¨ºªëÙ>Õ¶mR +lÀ–j?áü^cÒþL8Eˆ àáBá9ƒõóç»7~ò9níœwžÛ÷ÀÆH”iç‡]…­‰‘³:+fœB hü0A#ƒÆny>Ìu=ä`·V B¨5ÚlŽU¶a…ý3"vø0ïŒÕ„”ä¡üšK³©¥œI•wh/5ÿ£ qnÉ–x0©þþJiIm¿õÛÜ*­H¥ Û7nÐ;·r¦›Gª÷QO˜.l\–]šŠ]C^|‘ 4Ì¿Cª+¦¯Q˜jжç?ôìüŸv‹äp2—ÀÜ]¡¾qùå—»µEþp²F¿b‘€¸°æ`.ËRÌ;VÏ?ÿ¼{á…Üê4¢ÞÿßZñ¦1°7´­¾¥!êþù%ø˜Z(5þGdëÿ“™3ÝÊ`·€pqI‰=$†õpÓm„ÃL>!>úð#ÓV騩cBÚ6–Ê3ð³%± 4~é#Ñ9ˆ7´e´êÙL™4ÚJ »„wK‹ù$=& [³4 “û[ºÀ'Ym©Î¬Þ‚£¯CކAYÂç¾x0øüG!ŽL°(š¦Ð®‹€ ¿˜¶ÕØ¢,4n/ݲY§AáÒ¸â\aŠˆ5R]‡Á˜Â£otšà¬]+ºkøž:G·ó.Ùëõ:th'I˘ØÃÌ?L?Û¦¤£Æ®3_'Ô?À')+åñ±k‚mýß×(1:’+U(Bq‰À¾-“V-°eKÁ x³Û„ãjyź‚ßPäÛ Â3…G s ˧MsŸ±mài§I]ûT×yð ×oÐú°Eÿ9­ú½#ó ¿›m½ÔòÙ2rlõ‡Mšä6~ºÜÌO–OŸîvh…h­v†Ù¶ösÇÊ3ãS+©¶6ÃÕíC\KÙŒÂð¢•%Ô÷3F¤ÍŸ­tmÄ$m±š h¹Og·Eù˜êd:™¤xåÆ6¿}Ÿ¾nÅt†ìÀ×^+g¡½më¿¢ ƒ:Uû¥ÝÄ-xò)÷þÿhêÿäšÔ­'j' 9-sbRÌÖœmçèO0ÿ2!4Ûÿ¤2*&ÊJ ¬•”‡$üy[þxRÎb<—@îKƒ» }ú¸V´'ÆÔ|dú)Œ¿Æe:¿³f»]ãùórz8+Á¸ÚYíã„G*…8Œì§ 7 7lØèfÉdfÔèÚµx<ÀnžŽ…Ä~Ñ»áøúÎÑnεàÖLÌõ¯/¾øâ=ê_§ÕwžÆï_M@…´¹UôŸÕap¬Æ‹(<^ŸA½Ãwy~ ŸÛQדÆyZI«(HºªjO¨µS€frªa‰¬1©QÖð8¡Gû°XDµFg÷( ­×¶‡h,/í…7WVV– £h%!çñÉ©$Ì?BLº¤ƒúNÍ—(+ ÛRñ„Ø÷€Ù>‹=6|ND<¾Z„%­ógkÓŒ®ó%ëŽDDú¨ðUá9ÂñÂ1ÂîœLÔ\9&ZöòËn€lDûsŒëÐ?‡Š5qE& gU¿×eŒí3À–rØÞ—·­dõ?ãt·Cq-´'~V¡·h¥Lû9Yx¹ì?wÊDõi€q*[~+˜ošµjé6,Zly§ú{nûºõ1¦Y«^ ͤ±*Cßá²v?ì0×ï¤Í”¡ØïÃ5“¹ڦÔôL„/4\Þ½éÿôÞ3!W 9¥œ”­ýN• W‹,Fø]~`È0è%áêÿEhØxä‘GÜËš_Ùg>Yøª´<¯ã¿¿¾[y>3þ¼4¨p£„»s5nߤ1é.ù9Ø¥±0JžÓú& á˜Ç kƒ“»ÿb`¶ìïZ·‰i¾Ö¸/Æ>¸Ìž§ðôm{“ ` úØG}D?*ã¿S[qœ6mÚÏ´ÂýÍ$³É§d=вªƒv÷¨oiaAÝÅÃ}¼Þ@Q±y˜/ì?²ÂòÇÂ|}sìʆrGACQùçÛ¥†±C gËÍ[6Wc:ih¾ÑĘÉ@  pÄ[ ü¹?Ìy›Ö(tô't¼VRÆS=ôÐvRßkM¹÷—©Ÿ¼aþÙª$[¡€IÆ®Ý1u2„ ¨Æ~ð,Á ]Û!.œ ®ø\5a€‡øwõ‘ãÖÂÞÀ¿M 0¯½âÒ8®Ñ=N^ <^8Rˆ™\Î`‹$öïýþ÷né‹/º.¼ÐÁ ´ëÛÇT¯qVß÷ËYÁŠ7¹`•Ü; äåÐ €‘F@@Ü&ÙˆrÜ©p˜¨¤¼ù§[KšO¶­ß í‚Nî‹Í¬7¥ÉZuÝל»m—yCÂ0µ,“J=ùj©¤–fÉ Zî½Æ•KðWmNª4ÅDñP»Å\å39¾œóðCnÁä'äáŸ!=7À·buò9w=W;pø-ÌØU'Xu³ï^<ÈMIй&ªö´gÛ?˜Æú`°L9•o†—ÙFNïà²(æëŠ¿ÆlÆ»Ï%ØxjÉ÷Ђvü"„Ã4± 7Iø/Áye¨€ =Dóðb‡ð‡€£Çžp|ò a8“6ºK´Nøœgà;'æóeF)Ç€m$Ø.Úübmq‡Öýi>²±në,­ 8«Sƾ‹ƒsÇ1|¾gO è6^ß~bïT»çÇ|ý©žòÐV%õj/ R¯³Dw p›7m¶8 .ÞÀ¥&ðrìIë„P4Lr…&8BÿÿU+ÿ­+**:à¸É=6H“ý>²³ú ^0Óltv€2•¥!oªäoŸÇ3ôÁw‰ŸØgJXŒd˹-ÐI˜IaþBÅÍDÀ¿ílüP8Exžpœp¸0&™ÑI.àóY³Ü´üÀÔ´Ù1Ûæ6=´U”œ=‚ç¢Æ‹yZ ‚†R£·çЍÛgÈ`gÌ{Ÿ¢¬y 3›iè­òðy°Eûgo\²4R×¼¥ÿé§»nbjëÅÕÿšõSÈWVÞÒ„W Ÿzʽ÷‡?ÊÓÿ¬úoË0[ú±â¤¶ÞÄ©‚üÀÞÖŽ¨ýC;dsÁ Ã"ïU·ÿõ¯uR¯ó+¥ùôý‘#݉¢óºãØO´˜1þ0±u>0“HOû‰X&ç›ÚÉëÚfø¾ TPï?_x‰°—0@ 5È'ƒ›KK«o¿>jËjd#ûX Ûºm‹ùðŒg„)DóðBÌhÄÐ:œ™÷ëׯ#škÖ¬ù‘v  Ãg¶L åËBÒ}âd¦oksoˆóa^(`×´ñZñúáœ?ß^umñüpªp9|ßaþSdçn§QàYÓKЬÑX|þ42dp$اõ‰â×±H§eâä)Pz¦¬òþrÀ€m¥jÔE‚SÝ8p ½@.˜2æ[@4ìÚ“ê… Ï7ð}›oR ¢×Õ"“¿(ðmÃ/Êœ—MxE™½%½•VÏ“¿«EÛ].µò8DVÏãáùp¢1áà\ù¹W*þO,Zä^“ ¨AB °z×ÅÕy*áþ¯Â„Û„˜ #H$ðÌ9¾¤¨ÿ83ªû²þä7dÈ·N¾ ÔÏJ¤ ÐY î.9Úü­ÊˆÆf¡ìÚÁv) içfÖÑ *Óx/EÇë9`Üüu4^~0böÞÁý…z( 2ÿr»4Im¡¡° €1óžë÷/ò XNkXAƒ£qùkî7:‹S Ìs0Õ…¿í.ûÞ{Í?À K&º>rÞÖVΈšËn ì°wÎ Q̸X9¬ƸÝRgl¦6.|þñ'nÇ©›¤û<Ì"6¯Zåæ?úxºYT»o°˜Èö1ÁP-Añ"a Ðv°÷‡Xžuß}n¡ý­Ð4—ž©¿á†\ee¥9öcîs-B|ì•÷Å©k¤øxŠÇÛÿ¯ýk·Lð¢P¦6sV¯—}ÿ¡²)o%­ —Ïæ*/4Ý.9jÌyTjþ7kûJ<úG)Né.¸„x2¾:úâi^®ûXùx ¸ÞÜù/³ŒçZ*ŸUB°D€úèÏxFuœ„ô¯Cä˜ö•W^./“yn;iÚTÌž=ûWÊâŸêÈ&Ÿ¢Ú3žØ8ÆX|k;¥ Çùs«Kø® píϹͮ"aÒh¸ 2‡5\d¡r¥r¾‰Nº) š|ƒmŒï ÄÀÇdŸŒJ0ÏÔâ5ÄGçÍñb•ùHÙ‰ÇêӒΆÇLlp@•š4õ vÑxLlàÄÞLÐ\’^>?{¶òæ¯ð""ÿú ê¼¥¾ôyÿ]•ï9(ã åy³pŠÿhÉÆ»Î³8m›ñ‹Ýme4HÌBW ¥ZËk:vÈ»X± ¯¡XX±°Ùî<ð·üµ×ÒzƒZ £ >ÙB1œ#ιÿ~ù.HoׂðKî#ÏÖ8aÄCC”=üìB>7Gze/¿â<ñ„›ó€gQr÷V0ó'N4ïþ¬ì³"ŠÊ˜k¡´Ž`>ƒX<(Bnkup1~îW¿ú•›:uª["{ø0@UJµŸTýÊ„sÚ$ÊGæŸù\ã´÷V•óM1þ¬ø?,æ©ìߣ=Nøá aÜøVç™Z— }ï‚oxï½Ì@8oÏœï’AŒ1¥zO¿†Ó&:÷éÅù0ÿ y 4ú 9ú¬¬¬l³råÊ-¢ÓÇk«ÇS•f²O—ÇÇv¼ƒñÐö1§€fçZ…·p…y ^Wj&v//9· Õ?ñŒQÒö®ÙpHT`Pdჩ!}¡‰jÏ›bÛÓõD¾48Ÿàܱ«Xó ƒ$D…%O>)Ç²Í  º¨Ð‡æ×q? .ß‘±\ªEh˜àaú9gå?<‘[G Ê>O÷•T½ä”<š3ø |ÞãÝÂíSÅÒ$XLP‡ð½>*zôæÑð½>KåÎ…ÀWÇ:_^"D`?aMIŒ³+ßy×­VŒ?Å Àáf¦ÔF‹Ûf«–‹ù4F À§ l_¸vÎ×EÄ Z3¹ÔÍyÞ’§Ø ™< 3‚¡“®Œõa1й\¹Î¤œys/´‰Æ:08ª\öÊ«îÝßüÆ´1r]F™º£¥uÖYg-€#²(0Ï"¼‡n¨¨¨¨F3DÓ¯3¯­jºW_}ÕÝ'í;ï¼³F†¬ö÷–pþ§ÊÃ@9Ø4ÕjÏü׸#OÔ†6Š&|S‚ÿ?Éy!þÖEM”´RxºbçXa®€}‘b ,[ºÌ­Z¹Êí+ç«JKc‚.YCËÖEsÖçóKt„‚6-عŽˆvßUw™üXN8ßQÚO£éóìºM›VmŒf„Æ÷XªóÝBÀ‡qÔ…]{_lÆ{…¥§ní±Òþ÷øÝ/bß,×Âý) 2ÿvè™oDR½¯ÉßJJÅh O-)Æe5MkP„ÇnŠÝ»Šçá_¹ìˆK|@)¯ÿm5€ì‹WNíÍ)5§VLœ÷„Wä}Ùéédä¾—oS›Š­Ô{€ð³l é?qásðŸÜGþuA}v]÷æi\Ÿ*þq^^$d>DØ]˜3 ÷±§õ§"~8ÿ<×ïä“]ûÊJóÎ b¶¶gËÙ 3.Ö@¸4>•iÅ´ëA¹6={¸MŸ.Ç&u¾UÎø>¹ó.7ú»ÿ« ŒIe‘t"úØ'÷Üc{ËÛ™ô5ö:ú(×{ìXSc/2ÿ5ë'bαô]›IevÕÌ™îÝ›o±-þréáŸç³};aïºîKò͵v2bœy; ì„ÍÈ2]<ÏB ,]ºÔ=÷Üsî¯rð÷Ö[o™Wøp¶mÄ@®ÕþäÔïÛW$‰‰yò‡ª‡ çÓ ç,ú¨l뤑ðüÂ…î~y¹¿G«þQ€BÕÿ:á5Â~šl±³ èÕ*ÄØzrñ¢%®ó>ãB.Ïœï–?—ºèÉ0ÝëÏý±¾"ûgDÓáà3ùBæA‰îºà`ÅŠ?W:gòZ·Ô¸¼˜Á‡–ç]}8cŸÑÿ 7zމΠ1ø¼ ×fÁ5\™Âƒí/¿ÈçŠH¶lE@²5UG:5¢ tb¤Ø¨ë´(ma ¼šW QÖ0É+àûí”ÆFaa ¥ M€qIÑy×JŸVÿÛj‹‘t1gö<7ò°Fç{æZ¶6 Ï’aøœë($Šç›×ßè³ÉdBŽ»÷Õ–€[$ˆø¶ÊóŒîÉ×ÕïòÖÌU"Ñx_Oó›™JÀ ø0´z¤ îñ×þHýpnðlìö&XÇO¡CQ…/¨Îº†‰ŒUç­Ú¶•w˜w˜Æx'ƒqP‡ãÚWðÜ8“O#įc—vM>äT¯DÒ§|þf¿’ ¢½¤üÝaö;ÉF ©?=J¼.‚wËÆÁwÎp^„™€ì§€æ€>ÇØylä;Ô1 ÆÄÔµüymǨ#£ÚÒX8Ž`Rà«gšNÞbp¡ðpa…0§°|út÷™ˆäýÄDí/梣¶7j)ß´›¢€œV}1ó,Ôc Þð?úëí¦âN–0‡ßu§;ðË_6X¶ü°ò¿vÎ\÷Á_þâÖˆÀÌÐÔAX‡®èø/Amª-˜údí:÷á_ÿj+ÿ›´ïw.ç}ÒtIm‡ž™ ?Ó3:Ì™Ÿ³R«•[ÔÖá‡3Ô!5@ýNלö€œ;þéO²-«ÃùB ½vVE…;SL?þD8ÙŠ¿¥ƒ~ÍGÐ⎖›-ÿÿšÿÒj˜/×ÎHyaüG ' /Í“÷`9ý.¡_RgKÀÊÊ ×µÛ¾¦²®([ĪM@|:àùß÷jËæ!¢¥KdÐuÚ´i»ÔŽnTúëj»§‘ÛÇ»%Ê^š´„æ- ý=€ý˜‡€×⨮öä¯ €¢ ‘?v^<^ i—$Û+`8é¨[·N“Ô†h01FSE 1—„[‹µ³XâÙE­ ZZìæ&J¬‚Vw—ÛøµÁ©£dËצ²²²œ÷1b„½?‚€ð`¯“ ÌÑëD¯­›èuø „7+«.3 ?Ï3ÿþHz>•}®Ð7óáä[4QÀÐúÞ;‡ñT:óäáD!¾z¢q’3`ɹ?â–½ô²xá®ïñÇ»v"ZÈ”…Õ†¢qΪ¾˜q†5€ ¯ú=ÇŒI[@>øóŸÅTïqÎ9Ûµ£MŸH«Ý3Š+“&Øz9˜úøî»Ü¬ü#÷Ôí£‡\z©•­¸úŸ¸:©$Îìq·`òä´µBç^3”¹B|ôèÑ®—ìÆÔ5_“Zz;ÈÞØ¶ž“ê±;öØcM‹Ð"‹?)×ÂûÝqÇî mé¸<жâ›à ûþ µÚ¡kz`n¡>®È*æ?å§æø˜:•{‡Êù¾<ú¿¨í õþûnYG’G ¿!QçÓ¤Ç4v[~¥ @ø^žSãÙT­,‚L‚ü3‚脇íÛòM6“°˜©vIõ†¤gž¼YøŒð áñÂaBü9ƒ-Z™z÷w¿w‹ŸÁüt—y@­l¡f]ô³j/fœA ‘#ÁçàK/qëæÏ³¶›ã¾cÓf7ç¾{Õη»~'œà:JÛÚ½ÞÉ®¶{‚«™˜Â5R9~õ;ßqŸÏšÁÛUݺ¯V—+'Œw%bpÓy¿ªœšÞY‰æ=¶6]¥½Üñmò¾V~wÆÔWsö²žiè§Udû¡™ŒÐÜAé¥rìä}Ü-^¼ØÉœÐ/ák7™b!¹€ñüñÇÝ=r°‰ƒ¿(tQ»8X¦—ÊÌbœ¾S_<úÓ§…»½%?®%ÌÚ&áæ ™ýáãÝóÒbIÄø÷RiÇÿ]˜¯z$úG ÏÞ&Vj7€U+W»=»}гp¯í¥cwUý&CŸV¥ŽÑÛáëè9;v¡Å˶#GŽì>yòäJócá1Ñ´yp]Öºe•À×W5š> û©GÆÒÂçžÿò×Ñc °2Þ7ã"W¡6-oÙr‰ŽxˆŒ1öôðD£)á â'±€pX‚0GvR¯÷¹õQT> ¾©òtÖQ Qy‡ööÌÝ‚+§)f^¬ºj@Dí±¯Ô¨·}ãîÍŸþ4æÑ¿®{êˆ[òâ·âÍ·\¯±G¹.#†¹.C†º£Gc‰YÌ.=‹±Í€21p_h ÂÍ«W¹å¯½îæ‰!Y£»lBßãŽÓóGǶýÓ3÷z€¸U% ܸ|™{÷¦›ÝòiÓÜR‘Î% é7F¦&&L0û}œúááðªýé<ßß‹Ó-Ìاþyu7nœí,dÄ}:7±{ g^{í5SóÇ«ÿÂ… í ÔÖP­ð­•þ󵚋Ê„(„`Œò(—„0o«Ô–ž“-úŸ?ùĽ%Í Áê§C„¨~['XH0V…eßcT%ôìÕØWhÙD&±”±ßdhÒpúðy2}Z-ù`w€N ,X+ÚúËÊç>áªp~xÞ—g#8¤>Âèé}¿ÒÇ5¼Oc|—¿'Æ„Yùy>-,@’Nó)ñ…E@¾à/ù˵hpGi\€|Ãc+£±¿æèÏI'°†F`$Ωi´òˆëÇô|Ò…û®Š_.‡=½¾áìÇ?xûe ×@ýD0V8² &Q¨6(¨nFBé$FJ…îR˜w MxºÍûH[Ð'«ôϳ7`é‚2½ ¼D8A8J˜Ss?VWgýã^ó¢=äòË\1YmD`±½j”ɪG«œE(Ö@NküýN;Õ-™2Å-N œÊÃwˆ_øÔ“Ú&ð% ½:ÚØÚK1Û´JÛYÛ…m^þ©ùÈø\Ú[¥Îº^ŒÛf[=¿\ ÍÐ+®p˜„§ÖTÞ¥I¥Õ\‡iu=GšóyÄ­Íw.æa œ£Nš4ɱJˆ½?žüe+ì–,YbÞýY!]2ŒFme…Ž`.G°€0õö3f¸ã$BÓpoêúõ×_wwÝu—{饗jØ÷C `n¢42.FÍß Êr¨ ’Ñ÷0",F-Ò·~J+þwKûã¥;…´Ðƒø_-­¿×’WÅ…4òEËé?TÄR­þ÷`rßOždRÔf÷ï_+L„Ï}|mGÒZÇT‚ðy4=DjS@iIÕê÷D﫱ÒÍ,4aúgG“D¯ý³£áMàM»|‡TÀï«fÎtSÿu¦«Šü\dÌ LW‰V¯Šþò½Éäoùâã•„˜¬Þáѵþ2†»·‹©ѼS«¬8{c›¾æ2»Ú…£7Ç»5Ú˜¥1l‡Yy±›‚?ÌqFÕS}Upx€/ßÈÐïE‡¬;à¿àµ¢ñþÚØ0ÏŸWf©céƒûxG™7©C9°à¡(ÈÒ'T#Ú¡Ip*jjH4¬¸x2ÎÇÇ OãoÐ7Nk‰ALM1ÄXwô÷5âqœž=R^B[KõOZzÍÌN3¯úA,Ä Ýà†èu4«ÛP Õõ-0ÀŽ@€ @ -¿®W<â%ØÑ4òê}’yÿFL3LÏþ7! !ùÆ—Å/xò)·ôåWÜ mXyê©r–ÖϵSfíS„qŠ5T hìD{ ¦¾¥<1㈯¬EsW¸ÚYeâ…jWÜ:1W;·m‘`›­žíزխݶWO7üK_R\`竱õýýÔ&Ûhuðí›~ã–¼ðBREɧDÔÉÐ+.7sL»²mZOïZWY,¶Ð á©~Ï}ð!3Ë`dž\Ÿ+/»ì2óÈ©ảŒm>Þ?ß«þ£:Ü]í Ça¬Ø®Õ]¿b‰ ÀßK^È÷=i@°màÁœ‘Á¿C¾püTþ;ØŽ:ŒBoµƒ±2?ûòСn„˜´NÒèÃÄ0š8Ÿ®UîõÒ䘮1íNcS%XøŽ³Ÿ.~K82ÑÄÎÙ×!Àï…/6lT»^+À£i}?óG%‰aé@´ßÖ—¾èoê×’5·+—v²4ß­ïÞÇwéÀö̪‡(ò\ø'è|‹ã*’Š1fvSUé È©ÉrE€}ÒŒà ·Ãx"åöÌËh¿ ®}ŽA»ª*i,¸ªÑR«GÚØðï*@‰Ô‚º1ˆ`‹Çê@¨Œu–{R|êÌ0ˆäP§;´:øƒ Úá窱0†\+ƒouÞÑ_“w2°}{“¢¯›/¦'Ñrq-ªÇý?aW.`´ÞÿË­n‘ì­‡\v¹ëuÔX×ZD0öÊEÿùe çÙŒQ0·Øs/|âI×¼m·I2a»´:DC훕}âPÇo¦ñ×{åï3îh7âºkm$³)‡ü4.b#Þ¡²ÒtÃõ®Ã~•nþã“Ýfà…Ý;̶#„Þ™ÚšEŸÏžãæMŸæfÞò[·Aºs ôÇoªöÒö3¦¿>-7k¿jo,ˆp¿÷€6À§ÚºÍ; D­?•UÈè{’7í“VÅ19xûí·MHFbx®Þ›Ï×БØõÿýï7¯þ8¢Ð±¼Ü}S&¨ù(L9ZB@> šÕ~¡³6©Œ“åÉÿ>Ù÷?ŠŸ!€ë+¼Xˆ‡_Ïø3–U§ÎÐDfì_…w 7ÑnZ¯<Ö®]§«ê`|Cõ jWµÅGÃé{ѰjE.ðíÅ.ô5Ý¥‘²HI¾#¯ížtúÂ<úW=šuéÒ¥µÌ{Ð'œZÛs ¼#&Òö΢ãGùÀ  ”¡€¸8â' |­s(HæÃ×k×®ÝË©ð‹€ì}Ã-Lt¬±¨•ìQgõý5Ôøx$iâÇ ÁÅh±?m R?¡ÕõưúS}@° DÀ$^Ô6Ø„Ã9÷uãϹöç‰ò÷é‰ãœïàöá Ä°Šá']ø™\'¿òOãn2˜ÿpyå[Àaù:^°êÏê\B–OuŒ7îÏÞzËõ?ãtÙ.Ÿ¯m÷11"ÜŠþòéKåWYZÈŸJÿ³Î2UýT·—DÓdÕ»3]ßãŽG!‘•sM€¡—_î:ÊYØB9wZõö;9_MΤ†+N9Ùœlâa¯²ý×·ÃôaëÚµîý?þI»9¼èÖËIZ.•>„ú×^{­ë­ýâ™/ë[õ¯«<0ùø€ãàFŒa ®¼‰‹Á™o‚æ×úhˆºžáµýx‚…©S§šáÈ#4!ʺ²i”8ê€ÿo¼ÑÊœhá8­ôM*Ø#åd¶§Ì€  #Õ—ó‚1§DZK¤¡ñÞñoÒ™!Ûö€Žo¨À_$1}ú6†CW‚aÚÕ‡)iZŽö ‚<²%§~v{æ™gèáÈ-¦¦UˆìÜ$‹„ÀÔ’z‚ñ˜@äb¡Fdu㟈ùçúTìöx½{-2ú&[É»)@¾ô…V·ŒÀ›h8¿Ø+;m(P9±`ШüÑZ,µýÆØþPãSBþ<ÀdИ+±g¨ }å ¤£ìÿKÐJ@%(T6_ƬÃ^}™2`2yî¼\³ `YiÌû°Ï§z½ÇFæª0ßè9ä]lLêKW ñr%œwíÝpDÞ•,T –¹?"â}ª<ñbWqÊ)®­ëæ"äˆÛÕ™CÕSê4ÀN lçwÝu×™€sVýª§~®…±6lXxÃlõ2 À›=L0±ï÷~„Òy¦¿—r/•–Ä£ª7y-7ÿÐÈX©UðýèGî9™‹¡¥1zÊllŒ„&שžŽ‘ 9+éÐ!IÐ"úŽìØ 63K[7>(ÿÊwÁ Æ”6*$®äQó£½;Ä·)vï€Côš§ï^“™ûï¿ß]sÍ5IU€ïs>qôÚ‡sô4q8,™sL~1ç‘Rí—-[6P÷ |.™ûs¦m»¶íâ&öΰR0óaÂ÷‹Noáp^AÏü“Mà¿ds8ËB>/ ²÷õ¾ Á$£`L½o—4>k*ˆ£Lœè"’·s¥ó:Ê g  n*—^™*_Þ‡òô~M˜6­€äAv©‰<+góe·IòÝßþÎ-|æYsfÖCÞ«[uíêš©™€P›Îæs‹y^ 0Ná@²¶TKU€Piž´N:h…¿ÖUBµ7ÔÈ1,»ÇèÑ&X)m€5~è¶&°=nŒš(§šdÓm«ÿi2£QîtŸY*Šo¸N¶¶³î½×}r÷ßÍÛºù%sŽýØÖo„ æÓZ&îÔ8™ ¤A/ïÜ®¢¢"ìÄ8žÚ³Ó¦MsªÍáeœggË?ÛâHF*ì ^ˆ>ÁÃ;åxðÁÝÏþóó*Y L®—ªõ9••n¸úf „Ì ùÜö!œ@i«¼+ ŒûÅøß!&q)~±BïÇ© “ÌfÕ$ìüóqeAÅj4ø±žü0XN4“‹.ºÈú’ѵÔs -œdžôML0S/°të ÂÆ´n#_844Ï ÄÏubÚØÁ»ùøúŽ0þÆüšÜŒ‡›‚¬ þPdïn@JŽ3bXÀ?‡‘8þ4 {æßޤ!>€XlU@h•=. ðièÈ*ë@lÿµ%H & 8Ú &ê-F*õSÔ“Îw ã^-Ðç~>çákŸ&Ñ1Ñ Z¢tÛƒÝÅò^ìt½°"ÝœQ =UžÑ!Bzè!SkcûtW¼’-Ç:Ù@¾ú_ÿm_r‰ÛG«c-E(Cø§ªîì3‹é «`ËåÙ˜ú•b’ƒü[~±l™›?ù wð?ß`ã\mc&éM EÂKÌSFˆéø\>V¾ó®[­•Óe¯¾j‚ÆÊºòðÏõÇÒfÚŠpgz+Ç>ŽàÈÂ3ÅḦvîë˜ÝæMžì>úëín­˜×\sd¥¾9vþØÌ³‚îgò\ÆP„«~'€ºò’-±;í´ÓŒ©@Ã.¦"kþ(‹lwÝ[2Å"o'ª_ÕµpQWyÓ{ꩧܯýk0Ï„¡Týk„˜ýS$ðûºTý»‰¾2†ZeÏWÆ Íh(ÚŒÚì{ªãˆéŸ,Ç”s=-zÉ:?[8I8BèF-]!V˜@ Sÿ_A…,V}Òv©ŒÃÑôá{Ó1°è§¿Ëižà°4ð0DÁàG>M[·k2€wàSd%!y ï_ ™÷útžŸ`\x¹L¾^nUd¯^?§±HEd϶íÛJZ–·¬ò Æä`œ©' ðGNi˜üGGøqÓÂðçŸy–ÔèöaÐG È;ï±I Tí¡¨øi]qñDõœøê“qm&"ž&U?È…Ÿ>÷÷†ÕÌ”‡÷)N“èÜï>(® „…†ÑFúÀ(áeÂPK¾\´ì[!zGkåó0yòÉ'Ýã?îæŠA‡`Ì5,{ù·|Út7àÜs«œíûöÓn­Œ¨J•áËuY‹ù7| `R1þ7ï±G¥ÒÿAÊ`«¿ýÏ9ÛuÐv”;E ×Þ'&4¾÷{¤;@íréK/»ÅÚƒ¼™´Ðpèw(ÓµwDÇê<Ú ´ßýå]ªÜ &?é05H0Qzå•®•Ô mß{˜¡& åb1ݘóÀnÞ#hç‡ÔL?R­˜} gžy¦ë£oÇÊ^xþL5¿pzh`î“ÒWTT˜IÌ:Û¢&ϼž‰ê¾gôñcÀNh%ÔG$[æúÒáàu9ó¼é¦›Ü”)Sj$DZßHi_|UBà±Ú-¦¯„~¦â¯wÎwUìû·Kƒè kn—¶ ý×Eú;½…¬öÃüF!Ÿ‹hÙëúB=ø/Â…B4ïºë.w®è„Dý€þøcôÜ"kù¡„ï«%Y`úÔ€lÑD<Á¾/¼ðªñÿ&¼ªFâܔ㷄÷ðU¨5|±^¡Ö¥0ã±"L?iÃ÷qî5L ¨ß@ XåÍýKåú E@jXhW×®]×xõó-›·8ƸÓ/iŽAcóa46ni‚tÖPƒ8ÒÐñ™°5A7†Û~*Ö!’è—K Œ² L4Åß!tR×dëã¬B÷¤sê5XÑ`þÙÀ?ƒ£N<Œ¤pý× »Ÿµ&"¶G¼ÚÖ—¾Ÿv tÓ_¶O7œR±òÏ$‘I[>ûì³N£±†ä=ú¦û˜zïƒéšuÏ=n‰öy:i’ms†Ýw³–å±I)hËõfTLÐäj`—ˆéVÚ9¢Û¡‡¦%€Yý{ßs£ÿë¿\{ <ƒ__Eñ\nÌ`ê{ªO I°eõk—Ÿü±í&°ZŽ ÐRØ&aY÷Q£Ì” \{‘.{æ÷~ÿ‡Œ˜ÊØóˆ1®¼Ð7iæ_O i"m\ºÄ-}ùe÷ÖÏ~&' êûDÇÃøqÄæåºµ{˜ÿLÁÓ*ø]”ò*;s¶œ‹™£±3fØ*#öƬ˜SNÏ̧SNÞï ƒ2ÓE¿0N>õݳðË_þÒTýñA„éNžªqûþó¤ygö³ð ê+_ºñ¯ôEMLn|”¼$†ÿùn€ñߘ€ö¦ô—ØSÇ¢ª¿*!IP‹p§ oRﯼòŠ9¶D{ѧeýu:GOsoªùáÿëcÍò ]Ž[7S›£løÔŸ’_B¹ž_Ý,€7Z¥ž'ã=Í `‚KCº -÷´àzΛ4k /‘ï æa5¶] Ž"LÂÌ.!€1õ·=·¤ACõ·q$€ª½´J4Q7ÆwûªŠP&I_7&ÎŠŠ ÓHVÈ ~“cªÙøË a¼ ·÷@Þá²úsôÏ«&-Ô=vïNn婉køêhì#¾ƒp–{bºÙgòB ”¶C; ï²ZƒiËõ×_ïŽ9擺£’ÊöRÙ Žë*ïf=ûÍŸüD«¦“ݰ«¿äºâ§¢mϦŠÏv–h'ôÓϘ‹fBŽëÅ ,zæ9®›RkÖÉDà s˜b͵ýÓñÉÜ[(i`¦pö¸JL[†~.ŒÛe³žK@%Æâĉf—Ïê"ó²|#ÆVü ÈQpFÌ:+zG}´ùð‚4°éç©2ð” ­ä à0DÉYãOúÓjZd¾ ·QÙ/ÕÜs‘„k£¤ÙÒJ}F“O.Š“õYá¸G¸:¸ý;ßù»o9™à!™èGž^N57xÆ“`ÛÍîÒtYª<ÐþVªye˜¾æœô?cì1¿"$“ñR ³t¤M„º)¾ú¯¹Í4‚Œ$ Ç5–wøi F² T[ÍWÐàþ™Ó˜?™Ò¸âÚ'¾!rZ\pnmˇ‘5á‚Æiç dÒ ÈµÚ ¿ ®Áí1(JÔÙ›3‘±õåiL°:Œ€03ˆR€]J‘X@ÙÁT!Ù2“­’R-Ó^šž×_È$“öø%‰µÙ²Bå¿­o¬Ü ÄCõþçÜóR}þûßÿîfKʼnÚ]6¿*ÀS¾þ5Wqò)nðå—¹NÒPhÞ¦µµã¢Y@6kº0òâ›wÃÀ–}ïÿùÏ)ï±MÎ-ßý¿›vå‡üË¿ØÎ;b¶ŒÉU€Íc2ƒ T{Ã>*|ØŽ€ Ø¡².|êI·ð‰'“Ë»ŽTûvªíNÐ$ÿiâ½0Ÿ˜sß}nì{q¼˜K€ùí)Oò7Üpƒ™ïaŸÏ<™íñ æß›dã}Èïíš‚É!‚¼åã(¹–wJÓøVVV¦,<¨ïÌ ìb€S¿—¥Å±dÉ»…9Å×o?1(GhÞùÉᇻ>0púöùÎü«Òç—hÌxHN]°À½¸|y*‘dzɻFÇ“„û) gS§¸‚›÷âõ¡s…ðF!m ÓD„K—k.ˆ‚ogþH|ø<Ñ5ažîá<À'õùòéÓ§—hL9Yù4´@òâ@ߤ•}[ý‡  ñ °V@D€ûýØ®C´¤^ÃyACÚtA¿u ¯Nô) F€=šhLÅ:½84@ß ìœkýyˆ‡At`éuÉd'ôciEÏñir|ñTÊ»DŸÛFsÌ`µûR­0ys®hš‚¼ÖÕ\«Ïhb|úÚk2û™"Gu;$tÌ%Èlψ’ÆFee¥ 8“Ó’-s¯¶v¨þgJ$z&YVÙ•zËF´¾ÅÞ“/©8-NTŽpsýo¾ùfs"ŽãJ¢¿4XnO“4~Vý{$ŒóóŒäã 'bþgȾÿI 4îó‰c¿úÎaÀ£ÿ  ÂK…º«Ô¤¦ªE/j©_oßPüCÂù0¶Bh±ÐžOÿÚE-?Ñ4\û°LÛ!}…Ì(¥U¹J ¾ÑÐÌ\ \ËûD‚ireìääßËÞ­Š…Š½+J˜0œÎŸ‡Ã½Ý¿×ðÏCûHð™¿.ôcQ¥/¨°)êtHšk„¾ÑùÞìeÐ=ïã»)và×fN<M^>§>J’kÀX=ã_„HôZˬÁž]QQ‘‘jŸòÊX¹1A„ ªíUö1(+­š’H¾‡[¤‰ÚWkõ¢ùpòMŠ&ÉÔRÚiXîA»ðª´sБ¬(!¨K`ãÛ fô½IRG>þøãÝßþö7÷’öKgÂ˵ÆêÁüå/¶5Û0©p÷‘YB«}:;œ¯Ùød»Ì¤¾Š÷6r h€btê.'•‡ý¿oºW¾óŸî ¡R…òMÃÖ€ÍZ¶2§“¦ÎO;s” “ÍK[Ü UÙ™øcV¼Öšx±k'ò¦´úo~ TO—.s³´êÿþŸþäv‹^Ȥîëk¬ŠáçäŒ3Î0ÕalX^FçÀúò©+ÞçÎj Ç\>°áÇÿ[! À,`õêÕF“Ôæ­L¨Á¨dÊððn¬ÄÊé™i†áà/º}l+•s¸VùÏ•Ðâ›ê·Z•ˆa pËF²]Ç|G³ï×x³M圩yïni½=&?8ó˜¥`è}¼ðjá¡BTR(ÙÄÔ”ER¬VúÎþ4¸ï¹çžso¾ù¦;ùdÈòø>XÛµOtLÕ”&Q•••FÉì§­¬-l(@7=«¤Uyí+³g±ÔÎi¤ÔYBdõ_»ˆy4mËÀ¡J.E@PÅCP§Ÿ~úb¼¼Ö°l§¹0räà<Óo7h±Döû …Ä0À¸m¸\~Y8TØ•ž PFowÄjB6'0ò²:°'eöC>a€™ˆ@åá2G¯í©Jã!tjAÉ®–l Ôd}>ÅcVkš Ã®éæŠÔüp©`jïÚ:™ÿpþ´}ö‘Æ·vxL¾wÜq‡­D±[@²í#œo*ç0|Ó~ð³åvõÕnßtåíÚÆlº!.Õî‹ÐtkÀÆ511lÙç˜qîã;ïJëe·­[ïÞûãÝ yXqÝur.x°¼ö·‰ù™öR:ã0>*ÖÊIÛÛ7ýÆ­C–)ì3|˜ë¯-áŒùo*.æ}õÓåbßÿó_ܪwß5“ŒL몮ûÑÔck=Ñ&&ìD}5YAv]ùFã1©bå?—Ìø¹¬:â@Z‰î½÷Þ3G˜h±BÍžëaÎÑ@‹«>Mð3£u𢜵Þxã&xˆ¦é¨g¥•þI„ŒStÆ×B}ÿp™¢÷åÃu‰||lÑ·|jáB÷ ÌžÓÊÿŠˆf R?áyÂÓ„ã„Q¨¢¢¢1Åëtj€ú”³:Æb„µcÆŒ±2F.Â÷':Gsàífßö`Žë,+ •šÿ™>L¹Êh­ø‹q{裉‰DiŒ0hMÑqZMr Ô>ŸŠÿ=ÒžxGçQþ,ç²”‹m?Ìoa§.Óc#ÜÊ÷à“!_¦‚·l¶ÕH^PÓX†à÷u„@FMŒóG„Ù€^d‚Àû=ÚÀÔöé B¼•çu?ãš! €€ ®r!Äð%mÐcQÅêVƒ’3ä-6m–ÐK ŽV+ñÖ†ßÀß=*²C‡žEMUp­n§ÓuÇ.•½.Ze鯋á·ò„~¼¤/”³S“:ë0òdÒÒqbpÈ×™s>.Hd‡Ú~RYY­Ë¦¼¶ü (ܷȆ.r7=ðtá˜t,Í#ÇiOñD‚­Tó¥ÑÆV¬XaÛa~å+_1Âûv9Z{Mνä‚ð—“íÂfÞr‹­¼bÐkì‘®¥RüX›­kü gT-Њÿ ­ŒfX)Çñ;àL·l¬Á&Ó÷1¡‰èøD˜ñË_¹eò —€§|˜ÿ+¯¼Ò<ý36EÖl>Ÿ1”E˜nŽù¨÷(Ó¨ÊÊJÛ‚Ð p˜†D]íÀ˜àÁ;k˜~ü °,@¼§GŽæÁù6L”æCWõM*N~<äã+þz×eêó¿•ùÓz×òŸ…N 8\8Q8NØOÐ'cµd—ÅŸ¨·õŒç„˜„7ëœ#³+Ì_0m ƒo£„…ÏÃiÂçž>‡¥{îm¢­ŒÀÝ:ÐÈAs2$ÈЀH_(ü­ðFaºÐ…gÑÿy_”ª¥ÒX€¥!]4õÿ€ñg 5AB(™{ª£7( ²÷-w©Am¶Aê 3_²GC¥§d‚Q“FGÃŒ3û#\"Œ[q£ã¡6»¾ðl·]úcá‡jEãùÐGü±›5k–¡‹¬Ñï'ü…ðçÂO„_N¦]x¦i\Ã[éyöΈxÜ7\â=_•@ýÞÁÐ "Ĥ|©”.ÓÙý8ÛhxqRE‰7>a4@ûWÚØiÐ`ƒ4Ö@ƒ4vKè^Vï@•¿6 ç= ìãœÞ½{Û$U›jmùpëPþ"ËG ºòO%.ÞÕ¹&þú&ÿèëØ@ ܵ39ŽræšÙ ko9­Ð‹bþÆ1-@àuðÁ»C9$«Ì¿/ŒŸ@qƒ€ÃäõyäÈ‘¦:ŠšÞB©i‡$àþ¶¬?}õU·\+²/8ß ºì2×NΨJ%·þ¥‰­M¤fü£GËY^sr²­Ûf­•ZpC s·‘‡ºÎ?/Æü7ÄC³ü ¾}m•ÔÏ—ÊIÜÛ¿¾)çÂ7´š.•¦*îlk ÝÑhVÛ`ªñ¨ŸêÜšåj¯3;<ÀDÀ\͸½ð–|ª<,S˜‡zÈ”0½ÑAßö"½ï…Zí+!os½¿A`çïÇÿDÏiÔ0Æ !)oJ`øZ-~Q€¥Z ŠÂ 8Fx±ðazÞtc2®•焵‰Yéû—K[j„¶— ƒo»þŽãœðh\¶Û¯}ËçM?ÄóØc5åb™ ½À"É|-`ˆn†E,œ"DÑþåáa}бS‡N¥þ¹qÞŠ»Dö``‹±A.>½@ÇjŒ?‚€óÏÂ‘Ì‚š”“¯¢ ¾¦•B¼ÔfÀ8±bܽŠFç™~²ö€øyì$ž&. \Rek ©ö‹Ðö.¡´û»˜J 2±*ˆ8°òTËB¦Œ ÀwæQ T[éļ/ÛúòB¤øsL¥ÀÉj$ªßTžSi7ŒÜñ6úmçeò`ÇÉ&±\~#ß¶Ø’Š•¹óÎ;ÏsÌ1îî»ï6[RÌÐÈ%°:üÉÝw‹Ÿ}Î ûÒ—\ÅøSÌ,æD[*mEA@.ë¿!óÞ-5sücF»v}û¸n¿ÃÍ{ìq­â¯lÈbdü¬Žpƒ.žèZkÎÚ¥öK;-`ÅDð‚núì¶oÐʪæ \ã }VØ`þÑÓÞöøhÁW ^Ô‹ÃÀw˜Þñ2­öãØ¯¿T‹ ¨Ï4džóÏ鹿`Žˆ¡ºCº ÙiAùêÙ-´×.Ùço¤Ñ` ãžl ‹h$Œ†[P¬…óbâ ›Ž[4Ñ—âðu@ò Oú\Û³ü¡c¢ðdÃBÙ4èi¢òQΤ3ôÓá½€t~ óGÂ’dÛ#’ödò.°4´Ø†L/z9nÊÏÅN¡Dq6ÿ¥RßÖpzÃ9» ‘€½)Φ–J53,§’mÊi>ý´[*áÃ`Ù  ­¥~gþ”SÑ, åêÌ¿4î|ÓvbÒ†]5Éõ:ò÷±„M‹žN´hÒø¯ÐÿŒÓ]å„ ®Z´ š‰ùÝ!ÞgRWy³vàP¿Ê5àLJUœ~á슱ÌÏó0 žêµGµ©ç{F3@Æœdç¯DïÁ|J<·¿vˆ€@Ïwðe¦œìÀ6~·j—‹…òÅ’¨.¾¬ÕÇ3**ÜÍýûå9ãï¿(ŸË¬ìv­ø?¸`›.ͯA΢ƯŽö¡qj€ÕºÉÂÛ…«„añ?„½k¼ðl!+ Ý…× ?zÀïGh!ÐÇéàx@’'žFI2y½É< ÎÑ÷Ežì‘‡0~!è€^B€ÏÑQð=S„‹„£„ZãÍ3ïØûóÞÉ/ðù0Ïkù²óð ‚–Aè' ÓŠ€POC5 Ž´žFe&!ôPkþšÆÉ_쿪Áo5dñþž@ ƒ^×I64~5À¾aû{ÂÇÚâìyá„:OI’w—”™IžciYM€~°ãèϾ„â R  vlÊqæ\ȾEæúö×N¢ý–°[^±—ê{C©þ×UPßÖØÍ&q&7¼NO™2Å­á–k!^ÜßÿóŸmû¶á×^ãúp‚Ãû:L£ ‚I³®÷(Æåw ˜V‡Æ,¶ƒìªù¡l˜ûjŽøèŽ¿¹5b†òJJJ]Ǹ幞­ÿÌ—A>¬¶2¨_ÀhÑG¶I¸ÿÞ~ï<>Ùm\ÂÚ]î€yÿló…wÔÚÆÛ[åÄÏjíŒ3h °bTOܦZZh Êp€<߇RͦAÓ3ÖÂø£qõúë¯;ŽE¡¯†ãU7ß)Å õ[MÅ,KuœÏÀ\¢ñZ ÷‰>xô¿þ|ÛÊOÛPU+:D"K¥8Ð9^w­ó"4l ¼¡Ç}WÈñó °Ã„0ÿ}…¬Ìb$øžðm¡ÿ²ôé+®¸B!UPN|8MôšþޝÊ9³3ŸgøèŸíæð£X¦q¥è Îj+œH}»ÕÆì´Õ꺶‚±-—JÐôñw¹ÍRnL¨œ0Þ!€ÚGDÝ6¶"Kr|m¬2cZA].’Ó¸…O=íæO~ÜíIrg˜tÊÌœÅJ;ÂKx„™‰V®£y3¶xÕ˜^´@4`PÝ÷Âñ轉®71-„Ö`¬Êw`Þgû¾_üâîqmØhÞîª:ø‘vh¥ÕþÁêÍ$Ø1P) -ÎTÿ½{î\÷°4æJ µ;Bó±Â¢p’5º"ã¯Jh€S|Tx¿MïAo^!„ùï$ôìKIˆ¢žn˜öÀüsŒB”÷×þMŸËkž ÒÿÂô¶Ot¤<>ëî¹ç7O^›ãŽDÃ7eù»åg¯¹Öõ?óL7ôÊ+\ûÊJW&FÇV; D6ËUÒ¤²ƒ±›Ëž¹³æŒ6bæºKr¾T¢gßwƒ«Ý—k¥µB®Ãþã›®•ˆØlmY˜«F?@嘭Oµ’ø{j‹Kží0Ê…dÂ¥ çCö+¨|‹°Àƒpâ$Îw¦@|ñMš8ÔühÙ}a:̱ÂSÒÍ–ïÍÞ¸ØþsN{ÈWðí‘UÊz²õ¡î{ÿý÷»É“'›ܨ³ª\¼Ë<ù"XòÂónÈWºýÏ>˘3Vûl¯L8ã’ù-´ÃÆvâZüj¬•,mòµ¼ÒÌ\þæš¡:a¬D4‹ž[øµã¥]Û ÝÄ{eØ| @à›–/ò¯ñŽ1Ïc‰ßÀj°a¦Ö€ä»pÖE®YºdéÚGhëáöøû“øg;J6b&KDiÔº+3/?.`6½Ÿù犻·õ³¯›$S³§™tbNøu踖` )L³ó«VÅ|ÙܱjIÔLŒ€KÝ–{ ÕxÓ9«­y4Òh¿`Œ\#FŒp›}öqÛ¨ÏÌWûš£ûÑwŸûüx·TJ)[»tv½w욎ý”¿ê¯»Ä5Ñô_³ ÿT/ˆû¯Ðü=CGq^¿ù÷®ê£ÚÀ¢þ¬³ÎòG–Øuçûp«Ïléé Ï›rPú½Íû唉±Fk˜ 0 @7ˆd¡åÁÎ?Jk „B8JSþ󟧭‡7ÿ$¢ÿDíúï/ âªÌŒˆ?f=€Övs$ v­vüï×7¯>¸4’@„8D¼ÿBáñÂ>´} ëù¨ðvárdÏ·ú¼ð(¡Z£ßÕX&3ÀÄaIÚS“€ô]Ö5¹ÀÖ½¹üÍÝýI_ã`/gml香–WœOèžÏniZüÐ4»…a­Çqk#êyþ¸?ŠþŽ: ñ-,LÓ@:ùÖ¬¿­›ÂԀ½Á¨àG1>Æ¥E2]ÌJó«W· ‚_îûßÿþªÿøÇ’t\Þ Õ8O J-Yz+d~¦cÄEñÝ^×­¼píÙ°aæº!s?Yx3s…,äŸ+^©îäÓZ°²ÚîV| œôMš ˜¸¶CSLØ: ®y ´L%Dü¿l`—œÝ$dÖ§ïÀäÅ$…(0ïö•¯|Å¡ ýÏi—öcÝm“`Ù•W â2íŽûϹ7ï¸ÓíuÅåþx€¿-Š~[¾[  ﶨ}GÄôe|è‰xô°³¿Ëgx%x;x¢4áìºöìåVJÑ-þ´vÑÕP×”­VìjzPû­E _ÁИýäSîíûï—ÈÿÍU-&ùAüîsŸóדî¸ãŽ~œb¬Š¨Vú¢ï0¹Õ¤ÿþþXÀœ9s<󯵌òåXã GØ]Gºˆ+T9FÕÖǘk!üÿô§?ùkü¸ï;†ÞZè±ÏnÿÉb¤hðË0˜ þkXÝøï¬þ±Te}]Œ—Ÿ¾ô’­÷ŸÂÈÕ›¹s„§‡» ŸNÆÚø­r @¼Cí]+„(Ÿ*ŒÍžB®]<]ˆ|8ñŒ5_ìèG8¾í‹Âðà¢í=Ä\]©ã¥á9´+JN?ÂÅa C®1(WèÙò33 cù¥™axì&—ÝÖ猭¤Í{ØŸÃîâ féaÂ@üßÿ²C‡å­µ/h½ òŸ²Y;óM{w¶Qm 7ÿ§FèÛœùñ˜tXLü¼•Ñ®åa—ÀÂ[{.dZø43Œ›æŸæF —™Ç—;øÄåä™aµÎý`O;«¹Üm€É庯O„gø^½ €C”>뜲ÕM755¹ýt·3;këë7 Ðßçéhv¯¾új¯ 3±¯ëÌ( w&Àj‡:ƒ;æË_q;}´ú¥Ë¼¨7 m`•ó®æ{5ÒN©µ7;¯oâû:vò ®lÖ7ËEüÓ6WC€1@Õ*P>Ó]´¨^$‚÷=]ƒùâ/~á¼=½ê%f|9r¤;òÈ#½Þú2PÌÜÇÄz…}‡v˜'’9€ø> øÃ$(&€¹È±vÝQ²‡´LUγ»VM@’ñ%Ã÷‹óë_ÿÚ¿Wœ_}³³u<á41A”rÂ.b\h°Ïã»Ö0Pº0ZÔ7þ&IÎ÷‘Fÿ"¦…d\_á•BvýwÆÀxÛ€êÖ­ %|÷ !D#|ÉÁy¢Ÿï´ƒ°»p®(çÑ{?Þ&´YÑÿ­¶ÞÒ+W®ðó;s|(®¯àY°µ7¡= ¥˜q(Oôu¼,o3ñ4;f.´p¡ìfϘ€m~x€ˆxÄÿý»¨ÓÙùÿ¬‚bÀ0íX “bî_1HYÿÖ6§1wñS} €Ôj)ßQ l¥&䮋—,ö nT `FH欄i˜‰£o¤²ó—Æ`â$,6l³§ÅÝ,lhÆa*õL€™•J×Òapd1déÓñs –§iL¡pøÃ¥]Ï¡Ò €íT_Ÿ+·Þ8Ãâš²õl’f¡Ž«y÷»u¯ûwÜáÞÑ¢ÒÕ¬ ”¤½£ë·v;ï<áç\7),(“õ½jæßH»½j ¿fßå×7ÏBhÏ:ÖˆEeC»?ËóÄ0ÿß?wóDì"½PM@„ŸÝtnö€Hg>aŽ*`n‚œÕGG€î¿ö:B|hÍ|‡4€t!GOÞЙtÆô«T8v€;þÏ<óŒ?ÖæÑIßlwésAÄÿ*1#ú!æOݱŽ0â?ŒPkvÄü‹TÖQS§º_H¢a‚êuI “l¤Â}Z'œI1èUzj@[ÔÀÇÊñþß Ÿ¾+ ¯Ù_x ð$!=ÂFX€¼JˆþÉÂÇ‚X}úöq½{÷cn‰_[3· ƒZ[[Ù·Êjù`Úº t+ÅNAŸfÚX €¨7¾©#ùw³¥d « ² Å)„—‚÷„ãX(týø7üVjh«4‰.WcíÁ"ðD´bzê©§<á>“ºé[í%.Šy2B×Ýþ)„s·fž%51KÌ¥ë¥Äñ.1j ü—EŒ–„ ¿'ÜO˜a£ÊÒ€6­÷”Ûã„w¤äÜMn´z4³ÍÐO ï¡-ëe-`KÂlxZh úoÿúû5 ®£öDkÂ|-;³6ˆhëoL 4±Û{„áb»ÓÜãtì™õ9zÀ¬›4û{ÐÇYÓQt€vþmÍäÓƒÂJÊø?öBÀÆŠÊÝ`ª¨†¿[N_¤{µiX^€Q"lc²ûF‡i‰=Kü'îYÿ bY\ßì>=²Iì±DOµÆá-½´ÀqX cqÒÌ\nÖ1s¥‘æçoÏÔ;š„£çuh1T.0è ™|Ã\l̺ —Œ¬)óP¥ò)áÎ妯µY,²QüW £¦Üü*²²ˆô„õRÓ§ïÐæÙ­C<øë_ÿº;ZâùèxñÅ=APŠK©ù~ñÜyî™ý¾{óö;ÜÞÒ°¾Ä–W°V‹•rÞ¹§~jÀë$Ðì;O>éÞ¸ív7]bæÕ’žsÎ9^' gý!Ø+Eü[Ù3Øõg×1ý~ýúy"}îܹQÈØÂFc×ï¡t&ÃRº‡´7­” ¤sï½÷ºÛo¿Ý5ˆÇìÍô.‡i·1ÿóÄÜèlsw=ìöS"ÚÐÞÿ¾÷ï4þÞ¬[¦J¯B³ÜB@\üL!呲Ͼ)nʯ7õ!„ÿ$a¼‹Ïw"ä#D>†ƒ;Y›ÊÿJÎëwxQæØnû¾êc[ˆ™›!#]jëÜ´õB쇵ç$ùtîa³§™–FhÎÀìf†î¹Ò Ý oÏivsÃd  ¸ž°ñßqu¢,umñ|Ú¶ûOØb ‘¬4ÕÅD©‹0 € &MœKiT‹ëäÚV–€7:”ö–`–ØWøØží)í3Ÿ€Å‹vèžf/T qzaø|~a¸4;qc&€…‹ÓŸ-œ™øCѹÒE „Bi„aK!žŒÆ_í•â€Âô>N l€øaTz]v¡ D„³ÏýÞœßE¬ ¿p¯q/¥m†ÙÐÎ!2@DŽÿó?ÿÓ=*­íHpÒH妿“Ïþ> ­.ºØßù>äÒKÜæMM~w¤¡ _­5üªRš:!%§¹`¥tcÌ|dŒ{áþÇ-Ñnv5†ÇrŽ9æ7bć>YM` B6Ì‹í£¦ ‹Vü`2– Äe½!ñW÷‚t&˜47®0öÚ±|é£Wɤßýîwž‰@ØpVÞ^’C#%YÀÿCÄè΂žzÓw¬  ~…ÏI¯ÄíÚí¿Q„ÿ;sã«üE¼Px™p7áºd‹Põ`ãUá(ៅS…1ô•ÃB(»‘ÌX"„ðÛ­[ ¤GºO ³:4ŸÜe O›M,`esF@Ú{"Ñ]]±Ê|¨’_ƒPáŠU£[D£GÆf ÏýI^¾âàÿ“IÎæ:ܬ*1¤1“§øñsìç¤ü„áÌnÁâgsÏg§&( …Oó' :¼_5g6ªãkKÍgU’NZ~±ÛpþŸW.^$"® uŸGè‘ùµôm¤$¾}ûúè궬^ˆ8W‹Ò>vÕãåîíM7ÝÔ/Ô SLŸIª¡…ÁB4Ž:ê(¿ÉnÛ=÷ÜãÐnç„[Dª Ã[Êkæ#¸=.¼ÀírÖYni‰WüôÛš÷ª`I­Ç5àçúæ‚iwÝíÞ¼í67wüø¬BÃj¼:JòØçj¿u"C˜ùÈ—§™Fišr %~ˆð›¢@ÊÑšcFès i2žp,€›WL?@8¿²`FÌ%¥O<ñ„/ E¦„cU0@RK'JBâóº}Ð#bk…*3M¢ª+ïQïað²êäÇb€>)é ÿqãœÛùBËÆ¢[•ÐÆÀîþ8áõÂG„Ó„1@øs$ãX!;ÿƺ³/ºö‹Ë³@ØLø” V­0ܶÝvö_Ùñƒµ¨'h­àYø¾—’F%Æ)K;4Ã"†îfÇ»™æžfZ˜Ð¤Nb Ÿ˜~,øÝ,? WŒ™\ëh½‚ÆXTáÏ©¹ˆ‰ÖsŒÔ®Óx?û™¦:€ÿ L_¬Ä/." â@øX#MÂÇÏa¡_lÃÅö¸#Åþ<“^1‡‹ŸÃ4B¿Ð†ÁŽ ÃùcÀ˜¦Ùãøñs³Ò*šëEL±ØJW èôÄÿðô, »Ò>ø`¯¥š]7[üŽÙ¾!(÷¤I“²¢»´C¤­eÍùZˆ Û±+¶†oe}[HœþùþÚÀ믿Þ/ÄÙ¬v}5K3ùK¿ù­›&å„{}år×ï¨#]Y”ÍEŽá{5ì(XjW%Fþ¾”­½ýàƒîõnôãµ"mú¸ãŽsÇJÌHú¬IŽY_lEò%GEâ€õWù1žÀlD™úBð£L6¾”œ¸" €E7’( $mÆ.ÆcôÀd¼îºëÜc=æ“& çlV]”ÿ:"q¦nl9N·™ì)Ý-JЭÑN^¥ ¬l¦•¶¨q]æƒz÷$au§-‹Sæ¸ÛW !(w"Ѐ¶­(¶ÑBDýÿ!4¢^V´9˜2,F þw"êO¼¶h]•zP@p”¯©V&Áʘ2gèËñ!~¶tJ1+•F˜ŽÙ1‹Á°¼axÜôrIÄñÃçrì‰@ƒPNåm`qð¾~ô¡'ê=ʪ×Fˆúä/³Nj'¡›ÃÆM¸40 òaçX'nÒш‡‰ŸÃœô‹Í‹p¤M€àßrË-Ý·¾õ-¯€Åùĉ½H/þÕ„…3g¹'•oŸƒt{_ùU·õ>{©“fÆ úb5P™Xã:oÒÍ­ÔÝû/¿â&èj¿y&TuןrÓW9äwÊ)§x1T£FüWæ½ÊK…1Bœ±…«ü'§I,±4Ýiso192~Á¨ä]a0 (küz;v¬×þ¤{´Êqšÿ3„[*¾‡DY©-2Ž5ø«ñT )V÷w]å÷é3˜(Iˆ“ò‡%>@§ Ïö =öªÖ3е£·d\Ñÿ‚ÐlY=°*d—ÿpá1B˜5,nX9"-`éÈZ }ðUáA}·ëã¯þ3'SbM_cÎ ×6‡šiqxw{íæ†™Ë= cv8ú±4p¦Œ€…gœ1+¿ù…¦Å1ÓüxÂg³³†1z(ª:¿Hl üOurhŸTË^„·Oqk?W5ö4NþNb;,â9‡²-OËô¹LÇìÖ°=“ é˜ñ[Û½¼¹$, â™ÝÌ8­8Lš5Ý(`‹{.5Oâ1¸0 þéÓäü?w1R×¥HÔ !ZLUä ÓZÀ ¥Í†ÈîyòÈëEÛçœ-ʨÊm+y3¨’'8»ý´Qkë–;r Ú±YL÷ïßßï&r®—÷eÁ].±N^ŒE,ú‡ê~ò“Ÿ¸Ñ£G»›o¾Ù_#ÆB½Úõøî³Ï¹wŸû¬ÛUŠÑ†JLº»®7bÇÏ÷Í”~gõÒ05·Ô¶Q8ÉJz¥Úñs?ú±›«kå>™>=o´Öz"bâ½K/½T¢º½=!\nÿlmYòŧL¬8.ÔãAOJ"Ç`ào¢ýùÒÉåǘÅÂøá‡öÒHùñ-ˆ°$Ö.?Jý†«Þ¶‘Î F~×?V»VÖbÆÎÖ»Ñÿß‹ð«q: Ðÿ! €íÓ4ܪZ¬ôf ¯Þ%/Œas9ì-ÏŒai:ð«$h¡Ò`T²R×Ó´üM"×hg¯Ãf›o毡Ȏ.jFž¸ç7Yü±ŸuOüxNˆâ¦I„Ãì–i…n¥Ú­,q¼|îiaC7xp30{.“p¡ŸÙq÷LcèhèÚ ß‚r”r ÀÊæÖÒÆ-JR‹+ZY¨SÿˆÖ¤â)vµ Žëåì? eîìæü¬µ÷´:à8Àngl)njjòb,Ôi»´ïRÁòd‡f 'œà™(·Ür‹{à¼dBµ••©ðî5Cx[ùíyÙen—3N÷×fß'èw¥¾_#ü†YÜ4±\mzêM7»éùŸ/[5>ˆ’ÍK.¹Äí¤]ì^ÒoôýÒúX5ó/5mÊŘ“&vtŽ<óÌ3þ–Äøa0&°QQ,ÐgÑ€‚Q˜ ñn?3yOI\ ¼NT= ßzk·‘òð fd]„¿Ê¼P¢þWIªâÿuiô_¿=ô2 /²“Ìù¶´M ÐÎŒhTöû|]æÚÕ¤hô?\8BÈ÷²xÕ:߯,òj9aPŒ Bmßo;Íõ´¨µ`Gès ­_Í´öl&îfÇ4 Û[Îâ†þ¡ÝÒÍ00~&L§»¥mf[1 €X$|½º´?ê×åëµ}¡µÓ÷“)Ä ;oœé)GÀ—<Å’×Q‘v.¢…ÏØ+ …Ò ýC»•·bP„MKƒ´ Ì?>@óË—á°¤]׿••Òçs¯ÕŸÖ0ÓKö)÷åXÈ¢t ¸ž$.&Kl´X€Ð0‰éˆñÂéní±Ú=‹wò€9üðý¢.Ž pN˜|« ˵“6îG?roH9á>_ûšÛþ°C3W’©ÊÖ€F ä­µÎù#=ò¾Ž²¼­ký¦\ûw·ºÊí–2yæ™î°Ãó¢ÿÌïɹТ箼ïUOú:ã†ÿdA¿§Ï# DŸG*‰cIH0¶°®È02§Nêwü‘*"ˆ)ë¹{ˆ)rŠû}VcôÎÚíJ]íø'Œ ’ĺWõòGÛïHº$jésÂó„û QæÖ€¶­ÚÝ#¿$&;ê1ì ‡aB˜3ØùNFôËÚ.°±r-„ø÷»…2YÿöÛ¡ß:»ÿr–{†qÆÍV¶¶¥Ï‚\ar¹»þ.”/þä²Ó5÷|f?ÎËâY̶b0> ìsa_/ Á¨ügœGCõ „%Éî@–ߘɌ}ÿ—td³™ÔºN)gûàÚÇ ‚†q-~èfÉ…n…ìÇÒ73W¼Ø?Œo~f’ƒföšfã†vã’bž{ '?â§åeþ±Y 1TOiüž%<#)WlªHŸ2— œ·eá ¬^ê›5×r±û„b¾Š ‹u&®Ñ2FúŒÈäW6õ#Eaßýîw=1Àµhö†Ûm}¨œô‹‰ó‘êä‘/}Éí Û ö¾ò ×KLtn”Ò?‹É§f=©݈ûƒÍÚ•õønÂ/éŠH«&ñÏ\‹¸?JþŽ?þxß™Ûù¨Öj˜¾Ë¸ƒ„BSS“Gâ2"A…òÂÁƒûsûŒQ³µË¦€~Ž&16 Ç$ž™¹“xÿçµã¤û5‰Qég]ætÄýk4êƒ:Q_î½ç÷Æs/K2bvŠFÿ~¼«ðráPa7aª_´1[É} û¿ _òÃNr@ÌŸÇ!+BÒ@†ÛÒ‘µÍ2ÀxX8)ȽOßmÝæ’ŽÁެ^‘øM›—m,ŠMÒÂ-vÏ÷láó™qíÙâÄùÆþ“÷ ŸÍ¦‘æfþÄo‹#Z‡ñéæÛ»¬/fƒPù/éˆi½F;É<¨¶Ž:4%ƒ‰'±ûçäÁ7úÐÇÎü ô‚ ž…“±u3}:IÇ77Ì|î™”+ókyåK0¹ˆ¡8~üœ+]ˆ"SÞGú6€æKL”B`Õ Ašöž%¸•Ë8Ay!D¯,àª<Äÿ!X륮iœ‹E¤?W[/T¶#Ç•!hjjò×n¡Ý5ˆÒM[J×üý‘¬€Ð¹_;ªwÞy§g8 ¹PmàÊÀwtMØîçç_xë&GC?@µk½ÎÒWWCwÕÞçH{ÒŸÿâæéNz”þU `°#qtÆg¸SO=ÕÑÂôµrûrµÊš–.Ä?’R0óÁ"ØÁ—usÂ8¾ˆõ£‹ÄÞ…¡hú‡Y3=D0ï+£WH˱º~°›¾#lËå˲vü(«Ê¼@ãÜxÝhðíöß-ý‹S¤IúªÔý(°ðÏ/'¡ ¨h °|F6í—ÂÛ…/ cÖ-}W!„ÿ¡Â­…¬ìX´03óÔ¶¿ä Áµ@ø¨0"|-yfm³mŸm}Ÿ•S 0kV¯ò};œãm K$³cš=L,v³g3ÃqÍÜÂø…ìÇLÂcIÛÜÍ-ŸÆ ó ãàN]€¥Œsaz¥Øu<’Ï7»”8õ¶!Pù¯4“$%J×a±Ž¾ñkâJ@o÷®ÉÍJ3Ì- jvˆ ¤˜œY˜3 ì –OìfÏÏòª„iùXžii†å Ù{˜†ù§¹e$¨T6X°e¦ì0ï™òÃ70€æ(…P/»Òö~eš1Ó½˜dNW ò™QLŒ( ¬QüǶÚÄh”u«!ªMIX«J"ÓžÙÑ£&Mšäô×öèÑÃû1!Z[/5Oâ1¦Öå—_xþõRÜ7~üx„!ý-5ýBá—Jüvì¿~ßM½õ6·ï?}Íõ9uM§X°Ó!°áÔ€¾wµCvù?ÓkÂoëf=2Æ5WY* £#Fø«ý¶‘özúc{¸@®Å`}qX¤¥èå ’ªøÕ¯~åžÓM ìúÇÐ_iŽ”NÞsO7mþôKvûQG¨µgÊ+‚k¦Ž8=¥£ ?{ñE÷Š$šSÆ–#Uö‹„L\ýjí=6ò¼ª÷ü¹ð á4a<l%·=…' ÷ÒâÑÖJ_º&`•†”ã}ÂÑBtØ»ôêÝKýµ¿\ÒÁÆU:®G­¿ËìfZJölfÖÂTÚ¤¼ägçiîŘ×ÂZYíÙÖ:ݺUÿ N˜keX_Ì ò_’kWK¬Ö3h¬¾«Çi ØLŠ`vÏð!3(WñhôÄaqb·X‡È¦•tÄuÒ:§… ó0·Ø´0æž/ÍØÏâšIÆ è,L9&éfê ³CLšv ”ôø¥Ü@ÚÈ-¥2öSÕ gGꨀ»Ëî?â¬áXNZmI}÷Ý׋ӣ< fÌ»ÖiÀX ­ÔèèÓ§¯$Œ Hµ¦® ôaPçßÿþ÷ÝSO=ånºé&¯üËÄ [ûùâÏ—8ò¨ .týu[›KÚsÞ6Vä‹Ûð«ÿè " X©68á׿v³Æ<ê>–hz5‘y$Œ®¸â ÏPc.©'¦.ó}×]wÕYb.;+íGüÿ¿ÿû¿ý®¿é* cï,EÆÿ®ãWûk|A±Ÿæðz"ü%A5W„ÿ/t¤á)VeÇ?‰ ÿU8RX}²B™4``1Nx­ð&a(&¯Gœ#ü¼Å v×™U áßžÄ?+[ˆ*Êác¬ð.a˧ö6h·ÕÖ°2ÒÁÖ ")²ŒM¶^¶µ´Åæ9tK³›[šºaOCË+4ÓÂ1&Y9 ›¦7KË6$ÚB€ÖZ|Úéä½>AƒP¯¹‹‡%‹ÅT³ Z,`3Îk;!ƒN—¯h&öB>aœBvÒ ÃÄϱ_ZCè––Fìfá1m07+“åaqÍÝžc¢‡AgU²0!]“°¸–—¥mfüJ6¸˜!såÊ:,ô"ùýK9Α¼³„äO2¿/¢¸(ª¢½×Óî?o…Ø>„ sîçÊ,”ùÑgmbÏÿöù}!ôÓ°£´o÷ïßß_‘ˆ„y´†€B0 úî¹ç¦,Ì{Vñçíûîs3u a /ð:ºJqYC?@+¼’æj?ýpÓî¾ÇM5ZÄÿ˜ª– é9vú¿$…”ˆûo©3íèÄ碪 ‰3.rˆ³ü”¿€‘÷‡?üÁqè„ ü1¥0bý»«¿],†Â¹bnª±L“iýý¼Œ¾-ãßb$]/)’?é8Ö{ÓVÇ“½‚^!+L#ƒ÷’;çóï-§íµš úi7 -l¢ðá= üÙíßwß}\ßíúú9uéÒŒž°8¬=Ûú½VFðÆë†¸[ÜØ=~¶p˜æ‡YÃx±=ŽúÇ~¬Ib·´ç0 ìÆÖ4Õf°":Kœ+(ˆ ^ƒÏ @å?ÊuçœÁóZ´µR]Ó+Y»tõndon¾aû'\²KÜÔ†Glo£ÓçtvË$-nèÆ3÷rLòap33Wø‡?›î Õî¤Ïdzg3} .c³ÁÖÜ ™Õ&„ åßFþÅ2i;CX¶â?Þ‡3è(¦b[ÏõK›„€†À±suãˆñÛ$Ï;— ¤A=AÀ˜æn"y€H0~ì†Åí½Øüxްsñõ¯=«ॗ^òî­‘4(¦ ‹´˜ò›ßroÜz«ô|Ýmµ×žÙ±£Üw*&ßF˜êÖ;þ´0¦ýÎ÷¼÷ã»’”Y™B°U²$—AÒE0¸Px {¨d·–Û}’Å/’?\ë—&KÙÝOúS/æ$R ÛkÍ‚ˆÿUÒ·²·¤2³¦B•ÈÓmÓg1t–hCäõ?vß•ƒÇ¥,rIŠbÂmT¨ž$ܽM ØÈÌjàCY~ |BøŠ0Þ>áË.ÂÏ÷²Ç õR`Ù6*÷ö±™¼;þ/ oNò}t§ú»wvûî³·[¶|™hƒenYúLX7ŒC̱ôy{fÌ,u|*5¼Ï¬ÌòÃrš[±¦½kÞÜl^më'HµVW#29µ!4•­l™›°ð†ø_´x‘'ä³ QOc6ú>lØžìO:ùç* Âh4’ø¥¸‘N7ü B»¹Å¦¥•滥=[fæ cþf2@Ú É 0€š?ÏØÃgÜÒ`ÕªÒDú7#ñÜ–Vu¸)&,[šq\ÎÏo­]¨z&þ© ÀÚ»õäèí€Ø˜9s¦C?"¹6Ùgb”÷Kû\?ø¢”\¡ ÿþ>/˜’ìz¶†Xç[€N?üá=á„1D…ÝzR^É‹‹‘øÀùç»§æ†|ñb×CJÛÇŠ«»Z ÕYóØÍžü·¿¹?â–éLz5þS¥¢,é/ô ¯«à£‡1@…€¿-º«Y®RÓ¦LŒ!0øP\˜,\!ü¯»î:÷›ßü&-ˆkÒ˜p™vûÓ­C5i Ê„KÔHµæ(pÝ믻Û4³piDø³CÛOx¹ðB!f†´’¥mRï“…· ÿWøž0VµŸvBòÖ ÕŪ¤Å1R½*äØÂËÂ_í:HRs‡fú¨"CôÇé°–¥¿Cð†k×4»­3Ì´´Â°æ›¶fÃæ²Çqãp<››™Ä1÷4ÓÒLó‹ÝkëÖ;ÕÄ <,ó0{XÌ r_‘VxùnšLáÆ³ö Z?–À-ê £Š¯éú¿ì5~õ´ÛŸLìKõ –^•Ëtmá|Du“ñ5¬CVìçIÛ2ôhØÛ¬žTN?r&>M•:Ì™ý„ç ·B˜@ôÇ’rj7€añ98Zø˜ÿXÿï¹çPwðÁ»Á{ ö›K—-m¡g#Ž—ë™þÍš–ñÊÖöaŸ·5¦Ù-­ÐÍìi&áÓÜc7K76-œ¹Çϱ»ùç3‰úÇÏŒÝ0Aú°|*i&$y¨pˆ¡•õ €Ê}ÆÛµèî0lØ0¿ˆ áÚ`^ u©§ð3É7làÞžÿ>lž²Á]$<ƒB‹4’ Tw²K‹“§Ey‘¦v:llš¿™as+d2 dȵÚGQ¦Ú-=Š×w) òMK×Ò_ÌBÌŸîÛšwæÜ?œi]_+FL˜$„†é€ˆ¦=UbbƒÉ@^7˜««¯N"Ž!7~V–r¾LNòøÂ¾àõÜ(¢CJs²gËI·˜8ˤÉûùŸü—{ýº¶pû‡{ÆŸm‚1§˜´aÚ ôM:‰ð^µ|…ûD;µ¯üù/îíûï÷WýU3wú;ûÜuϘÂxk\qÆØÏÎ9Ì3¤ ²ašáG¿lÏ±ÞÆÊÒ‡ P0Ê~?øÁ¼fs7³³æÝcĹPït˜˜Ž[‰  Ã­Lú¤>L1ˆçj|¹Fú"îœ>Ý=«ñ2¶ˆŽÿ§ð á¦Â´m °C¥á?J˜a}ËÀ@ÙaÌ@Uí ¤%â¿€ ñÿ±}¿~"ŒÂĈÅÅ;à•£Ü‡õcG«ðsf½œ™§mì±qÀžÃTp‹Ýãg oXo®¥Éº"L3tÇž - óËjþŒã¶jaªa ’P¸]5òi4 €ÊÔ:óËñ,0XlØî›‰ŽxâR#Œ³[ãö¦wÅGAÇÈW4;÷+¤Ó…i䳓¾ù‡öÐ-­ æofZ\óÃLó77 ,œœü˜[hbOC#dÌ´tc%€¸[za^ëØ•ÇªfÖŠƒ\‹Éâb×U¨B#õ6G aâ—ìPsöŸÅ-üú´W¤U 0Ø•dÁ$;WrY;nM=D:‹‘W^yŧÏî&Ç+`°ÃÙ&qëØYýÖ·¾åÆïn¸á÷ªD»a‚òŽÕ„^{Í ßQGº½¾ò×[ŠÝÖ¨LEõõj¬‘v¶8ëÏLÀØûÚ?þá¦éF‰ù“&eý«a¡ÍCð#¡‚¨<»üÅ´EÚ s8 ?Ú2·ÀàÈw±éTú¨;Æ ú, &ÅÀ8ñË_þÒKáÐ瀰í÷Ñ1‹ÁW®Ú{ow¸˜ª8‰TºˆÕKOï½Z}z±˜3?×ѦUª“8¨ûá©Â“…<7 mk€ò? ÿ!dÇ?Äü!öù>Ç !®ÁZÚí7¢s–ðáxáÂX« >Ì}ÎÙ~N]¾l¹?çoëLÖõ!ø&«ÿµß0œÙéó̱ ãé†ý;›iéa7$-ó3·´ç\nÇÊ›q<+gÎÒ¨„IºÔ‡I3†ùTÚ1ú*}šîݕΧ=Òk0*Së÷jÁÐs…4|'ô:è¬úèðë˜A ;…TàÇ”²[Až†a:¡Ýç› ¡{šÝ²ŽýÌÁ' º…vücÀͱ8½8l¡gKßêÓÒ´º·4,¬=ç2›Kа1ò)ÜLuùYáà\uZŒ;"å,¶apÁÜjkè`}$j㾸¥´åÖ–‘6 Bt@°ðîçÓµ»¢…ÖÚskòb!~ sîÿæèÇÈ‹|·˜TËúÈ•0CGåî¸ã¯ç€w(¶ï•›ÿ¬GƸ9cŸq»žu–|á®»·†~€rk³rñÐðßEDè¬ÇõWû½~ú鯺L!˜ZhögçŸóü¶x.å­è+À¼yó²ú¸aâ›>É\ÓV@^(á¤ÏìöÓ¿~ö³Ÿµè·ôµ­Ä¬8Ð wº˜}©/h€qk4¦úÙ» ãXUê1WŒœ§¤+å®3ÜõbŒÎÑñÊxÎ_ž-ü†°¿ëØж5ð¶²{Dø]aK™ 6Àtd,Á=d²`€ègÆ)ÖQä ‚1#`ÁȸIxCJú̟̕ŸùÌgÜ!‡ ×u~ÄO[¡¹zi:aߊþF ï3†ÙjfJѲaJõ«ÄÃÊ…iv+‡¹•b7Wxê£-$l#×ÞCæß„½‚纵6­ÿt4„ÃYfw€ÆÊB“Ý/;£_ €ÌP±nÇðÀ$Xp¾5HV?´‡næŽ àg„6vs³8¹L0ú±tl²ôÂ4Í›qXÝ·´LÀʃ»Ùô°ªIoZ:þ¡ÀOóJ=Þ0 ß–Ñ骂VI[²«…ø?wY· SEŸ>îÓ/}Š™7„¤‡N•´Óˆ$˜ÜØUGà)¶¢MZ»nM¾ŒO@¨€|Øá„£Nÿ°²”’õEcXœrÊ)þ{ÞvÛmî!×GAµ™:\øêßþæÏ–½ô·³Ê€¢¹,ÁYåoXJ}­ïaÙõçj¿…3g‰13ÖMøõ¯ÜÒ÷ç¯ýU¨úÇ>ÒdO[†P¦·v,1†>Š.¹½ƒq }0Í`åô—R^Ÿ¾Ï˜€„!R ×\s=z´gLŽÍkUçC%EÅ~ÿ.FÜ–jû*\ø/%ãö «÷ Ï¾¥[R¾öÌ3î~1ÒX-;©|'9wv@{•uÏw‚Þÿ7ÂG…o§ÔEo¹ ^,ÜUhlýe²×°âcFd¶‡ñ¼ðaáX!bÿip‘tÏ\yÅ•Zó£K¤Ù­X©¥‘Ÿ[Ö®Âu&iàmëË´4s¹Ùœoký0œÍ¹¸¥Ù­ ±Ÿ=›¿Åç™±,ÍÝâ„ù§ÙÃøÄ±±)ÌÃÒÏe¦… ó" £ƒB¿JÛS=•›]¹Ô54­ÿ|·² Þc=|§¡ñÛ›Å.‹aN/èüq£‡æd`ÀÝÛ1 €ý³A!N“ç°#†vŸÒO‹»Q _ HEy[úaº6ÀÅùÄÏaó‹Ó³gKÓ3]Tax+hÖ-Sé c>ñ¢µOùm¥0 ò§Tó¾ën½¬-.ë°3„Ö:•fc·í„Nð‹vìU«SˆúðC‡ÅLæn˜„1i‚´`„ñ*l§¯Ò~™Ü`@h@ O:ÕÑ•Êi&Ñ7t––]Φ¦&¿«Á.#ã åKëƒ(B…`¹ôÒKÝGáŒ7Îm¨Ú÷M »Dúžý·woÞy§ÛûŠ+\_)d21ôœß¿Ôm„O¯µ]vý‘¾øP"éÏÿ÷ÏÝ|=Y®›)ª å‡v˜;餓¼„ ýv¡/Ù|Кü™×™Ó9FÃy{$•Ø„iF_²vßš<â¸6G!†Jž­áÊÂ6Ò˜9D ‚ ´ã’úq?1TØÌQ˜8p­>ë;IDÉ‹ú߬1éI?ݬo÷W…òÛoß‘‰Æø~Â.´] ,TVo !üÿœ#[nZ8GÈ®bì@üË,=µÐŽ@ÚÎáA˜!0P܇~$ Ø!¬—Ÿ ëí̵H+AذÃÙ¿F?ùAØð=òõ—\ù‡¸ô%”^uÕU^AàM7Ýä^ו]0Êa0äÊ/Í}þÄ—ÝC—\êú{¬ÛóË_r[èŠ7SꮜwJË£áԀ굳vÅ—êˆÉ”üÃÍÐ1§¼¨¼•þ¸ÿ¤ˆ’~²é¦›z±YH¹À }ÓÖ[ ´úçîÙ‰G·×"µD9˜û+Õ¦iŸôõIÒ•ðüóÏ{¤üaÛÝL ÂãįrtTù@÷e†jÆ®š•—±vµÞ÷vI;ý›Î÷¿!%iýQ8Î_$ÜVØ€¶­Döo^+|Rï@L÷)D*•¬È k ('£;üOy—§…Å7ݬ‘f~¿8P»Õd’‰ÚƒÄÌ;p ¢$qCÏÀnó”Vf»Ð?ÒN-ß©òBô˜<ÊeÌð&úÈ!‡xíû¥ýý®»îòRRUh›GW…ívÞçÜîçç6qØÐPÙZï$qØå >qï>ûŒ{ý†›ü5•Í¡ejƒv§žzªgÐfHdÆ¢ùåŒ-¦Oƒt$æ*Á ¯0Ì8ÚÂq˜\v»ý…ù¸\@™·i°ÛOú£3(ý©¯DûGŠÙqšò<^Ľ¯WêÇ8Ö:0Ö‚bÊÌ3å^ïÿ³”yNÐø“ûÊñB¸Ì Â?­†ªçFkš!œ$ä|ÿËÂ4à\?çn'äKÂ0¨ ÿ@ôCôУ^þEø®0³m$K‘àuÚÐÕ×|—óëvúg˾gÝÑûÙC‘ùø`ôz©Š]Åá =“~%Ö¤C^ ã_˜¦•Áü[k²ÖgMTmˆ”†Ùý\ @X#˜ý¬¦¦&/¦k ž÷gaÏhÞÆB1 ? ŸfG€|ò(& CivÜB°0…Ì0= »18ÄéÇyYœÐ íaÚ 8ï€ <\C‹<Ãw”½Y‹ÄR \¨”0ç÷}Lï[*XŸc)|D8UX.,Ó<¦Îí¥VX5ø¦«ÌÌs¦-Û¼‡›Ah7·|¦ÍëÌñ–áC»=‡nØ Í?6Í?4-LèfvüÒÀ™†µ0Œ½æ_ª¦G:íx€¢pÊådáÝ<Ô#4$Êÿj?TÇìÌØtVÛ€CµhÉ"? ýmãÏ ™çÀ^L‘8Ìb@?ÙEBÐéKí\iá)‹¹[¹x.¹Â„îØmp‹Ó Ãá?§…ç„ß0F»?=?¸”Gò‘J%èK —½Žžã­Ú“TöC… „eÄ%×þ!®Û&õÈçV&Yâ?)½÷¢­XÃÉóV–.s=¦½åºÏ˜å–n³µûdÐ@×Ü£ºiÚ7} ;›ìÎÏÕywôpÞ9w;Ïó"‘é3¶ð=¦M›æœ¯æº#» ¿B}2JÖ?ZùŒâ›_yå•îÈ#ôg›_”è/Dãf5a¡v‚Ÿú—︷tÝ^º>pk)ÓÀ‘ùæEŒmÕ,[]¥­vB[é¬6ÿÖÝ÷j×ÿíþ?ëVéìyµ¢cB^x¡;úè£=‘m}‚<ãù„¶dqè30Ïè/´ë%fNø8N9e§¿°+È1˜g&©#€¹š2¦õòf‡èFÊîè<‡ÐMÒ»«ŸFDÿÑbÈí©c¾½ªÆãW¯¦ìzO}_Ï‹3JG3~&&Ǩ­0þB¬}Aø%á awaÚ®è½\ß7ZøaÚÕ?Ò0áŽòͧçûES¬\Ú8£Kyf ¡ÒF ?ÂÜh x f¾HÐÖ–®õ÷¬{0·xkðlqÒLŸ¸š:×8by?´[zæ–Ë´p¹â‡þÅØÉÇò²ðæf¦½‹=§™VüB;ÏŒííÌ H¿6ÔÄ_eG[€Ð(±Ã°ºtɺ~0ðcF¦ƒÎÿa&XL=2(7*YŒ[ž–FhÓÑ,;`d:³¥a~™À…iüˆ²&Oëaz¸…ÏåØ —¤eò‰!vãÙ·Bañã‡q¬þ©sÀè6Ì0ö u•ÎZ•–g)qê4l¸jCÇÏÞB>-¸+þ`iggaßÄø¡[(õSC¡Å®³£f(åõº|²Ðm6õM·ù«S\÷Y³]G-Ê»IºÇ›o¹ùíï>Ú{¨[¶eïµ 1%Ö:Y;†°€Ž22ˆsv7!lÒŠrò$}€#èÀ´cT@¹L0ÞÁʉ$Ê ï”æþ{ï½×‹j›îŸI~VŠYòÚ7¹Y:†°ûùç»gžé6Ö½ñ F@îÊFÿ&÷¡˜BéKnÑì9^Û|î­÷aœ@R„6‚ؽ-ÊrÍi9Úh>’,ÌŸ0ñQ1ÎTJziyàfý…£9ôô455yéŽ9Ñ7ï¾ûn÷’Äß±ÓBâi;ï®~|¾n8PGoz³ÈE*€‰*ž¬r¢½ÝY ˆÐ+‚ÿzI×IJ) ¶—ã7…Ç ¤h¸Uµ>Pêìöß ¼'%'jcÎ ûžBˆiëY»5SNí”A,2_®7dþ]ˆÞ‚„•†¥búîÈZ^Ê­[ʦ¬Z®}³ðMñÎW>“V6SãÄϽnΗñªVF3É'-?ÜB,—>±5w;* «òF= êÅÞ`”÷¥þÈâs±¶¨ á[ÃÆÎ"À3´ÀôîÔi×@d¬Û,&ã†7‹,“)À`႘¡¥E™ ÍÍÌb;E°8¡·Âg onásèÆ·´Í-@Ì-6ÓÒ²¼l`°tL NÞíuüÀí'1n$jU ”Kü”’G…e°;C(YÔò€…ðÉ'ŸìûPy)”«˜EŠ—ð"wèj›Ì~×õ|ée/þ¯ŽâV‹(ÙèÃÜÖOŒÕ±€·Ý¦Ógºùìë èïV¶Á±jƒNDœa¬Øµ0mŒ*½ÆÖAúô3$ l8Ât`<¤ï•“—õgvbÇ>ûÙϺáÇ{i€§Ÿ~ÚŸí®v[<ï=÷üýÔ½%ÆÃPµýtmaGá^?€oëÖņüÄØú±×ñ?ý©[8sVU«‚ú½öÚË]rÉ%þ ÚŠ1ŒÊÍØÚ(cíyF€wÁßæró Œ ÒB*‡>ƒ´ÎkRtáoçû-}fUû] ¢ÿÄþýݾ’èé’l$xâßÖº©¶apí”)î—t#Äb$k€¨ÜKx–ð !„[Ú®hoô\vú‘_~PZmàð!Pn9HF;óLÜð¡øP0DÉÛ*¥æAùŒ‰ãßø†ßõ½ñÆZÑ9Ú`ý»Ô´‹ ÿÁä)Ým§ûä÷# ÷!kw·U¾ :éû~(¢nê-·ºYc­ZuÐÎú‹þæ7¿é8vB[f!VÉïOZHÎÁ¼Šõ P2´Hƒ]~ttÐWb‰üëÝÎÔùþ3%Q8HvOGðR­Í¿Mâ[=©Ü³u äI1¬óýSA²x:BÑpkaÚ¶U¾Eøá›ÂxTë%7ÄüGQìÇ7b}­Œ«jŒ!!Ù¯ØïV™o —´AÙ8  •ÿ &ëwËš¹,{4Óüâpæš6Ñkó|¦˜toáBÓì夯 í¤—ÓòÁ,I7ŽkuÁú±š`Ç) äÁDñ[á „«9ï ôOò+uȈÀZ#N[” €ÿÒeZ´è¬T ù!‚ì,žºAæ/è¥Ǹ_¶à¦Ù´ƒ4[ë¿éYçÓ^çÝ¢üc?5âšiïͳþ–Ï¡{èÏ `WøY:¡@j<}J=Ð^l\î6z©|ŽnQn~§ÇK;âãqÛ*7ÍbâÙîþÚ–ìbÐVƒv—/­Nšø»kw¿—vÿ»½;×­Üb3Oàp𮓔ÞÏŽw½^|Éuûž¯¹nïÌq=Þ˜ææŒ”î\UÝ”Ûú „ D ÄâÎÓ§O÷»Mh„³>’ï}sù‘>È}èSD"Ñ#€3Ï0@Ë=ÖAÙ|_VÞwß}ŠV¹íöÛoÏmHë˹ÊZªûª•Í:×>ÆÍ7Î <ýt7ø‚ \w½×},€þ¡ï²TDìäk®qÓG?Tjµ¾©©ÉrÊ)nĈ¾ýÂ`B:¤`ý%ÖÀ•î0Êé'èÍ@Ù Œ+˜oisÄ1ZCœ§c;‡ËìÇuVÔ±æpOüWãe«‘&e.ÒfÇ÷t¾´”ûMÖûư•ØMþB&T¿XÙèëxX¨ß)›„쎿*Œa;9 ò}! úùš–Ž¬í ”„‘„$ Œ¿ aj´%p ÀjÖ ZÛ3.êßcÆžYSÚØ‚Àj?cIÌÌSÁ_lGçBË“0fM‹»ñœ~0?‹›ÄÂtÍÍÂÚ3¦¥‡/öÙÆÓj3Ç‹„s®Á(²²ê9Øùìt™f_^„7\c,^èHÞ:ËÀ`n¥TŒa¡mñéX¹:W.w‹KÞfǤ“³ˆ'l×ìÞ1ù Ó5»…³ΞÓâ™[œ—¥¾a-MÖ'áâï”ñI~“wà©ô#¥X'ßúzàÀ÷%BŽm–ÇwœßÝ£Ù@^VbåD¢¯*Þ:gýƒçBŒ€®ïÍw[¼2Ùuk†ë¨[VöÙÖ-Üeg·pçþþ*ÀÅ;ôsŸèyËgŸ÷áºhAZ`¡ˆÿ%;lçVèÛ¬Ÿ0Á(Üu×]½¸>âÈ7ñNd¹e‚Ði6ý08À®-PÎ7¶òSNÚÌ 'œà<ð@¯`ôèÑžáPÌØä PæÏŠ…‹üµv3zÈ ¾è"·ó§?íº¨.¹ò¢GƒJ™)×_´Nj·‹Dܽòç?»é£F»º­¡ÒÀwÞ{ï½ÝébºtÐA~3Mý•Î+Nù@‚Ç8Þµ³õÞ´5›Sâ¸á3íÅ~ô1¤€d òö^JÏ^½Ü?ï¹§¦>²9;XääïÕúmŸqTe~Kïx»t(ü«”.Kôï„Å[Ã]$Ùw’UÍ%*L«'òXá½Ó²å®vÑ×ÚÙcmb\íQOFè§1| g‘›€?* ç."ÙÍßbâ$Ç ¸o<ÿC×ë… ®yÓîþ@®\zìQb pÛ<þ”ÛlÊT·¼w/÷ÉÀÝJvùÚè„:9穹5€cv:}ÁúK¹Å3ý>\GCiˆ(D¬mŒ*5}ë§§Ú\Êù.–¶þÃ?ÜÝtÓMî¹çžóÕnG ¥äî¹ü@WÝÝíöüò—]ßCÉŒý¼L2v”ú^õžºï,‚±ÿùºÞî ‰ýOùûu/:„?móœsÎq#GŽôßÙÚ£}ÿŠgš#Aú yÃ\‡€‚R¤ýÐÒ”KZyp£ÍÃ\CÔ?fLÙÔÿõ½ã¥p_Iäte}À3©^ÀÆD™U?˜0Á=-)‡¹Ú ¡ŸŽþPˆ½Õ¯Ú™ÍZïÈþ„QÿG…1á/'?‘C±&Ü\kqzÀÒÉ<µß/åy·¹B$þGXyö£-¼Šáߣ_9Bl¯M„qÁ£/ýZw³…aÍ-Í´±põêÌ-á:×Â[^ö›ø‡`ÏfâG>a:fÍ0ئ…Ÿ=›inazùìaøØÎœO\ÛÅ¿`Êf‹Lû X7Ð`”ö©~Ë¢ÅD4>[\‡ÇÜXpfÑâEÙŽ`YAdú?ù[À·RÀ? +¥WÈ´A$GÇBL8mQMXÀL+køÚ-l.7«7àŠI/ Cº–6føN–¦­Y¬,–§=[z¡iß0tËg߀ç«¶ÌWùü×B´ dµPo©Œk4´w&ÅäÙ+þ›øŠë&‚°Ü7ÒØ6?íºÏœí漿û`ÿ}Üâí·s‹vjrKûnë6}kºë¨Eþ’~:2”0­Ž<óÆ O OÒÇ,L¥LÚ4mŸñ‹ú‡àBA  »¬Ö—¬ß”“/qa@¬³sjú`TB?ï@Ú;é¼ô·¿ým7N"ú0P¬VéóáñûóYÞ{i¢sÅnG©C/»Ìõ3k}•è 6ÙQßsÚù›·ßážûÑÜR}Õvü>úh¯„vÈ·lO°¾c&;’JWB«?Œ€pQÈí\‘ 3¶ Á‚}'1¿>%†ÛwEü÷:ÕDU—;þ‹$Ýð¶vÄ~,%†hõOƒrüŠð(a]ªÅN{©:q£ÝÍ"æÏùáJa\Ý·«ð!œüm„®aegÄ¿¬í¼ ȶêT!ï4^8GX °TÒ&þÏœÍüfìX"È ®3á£99> °&·5n˜ñ*¿B·Ðnác3 ƒÝüc÷BÏ–ZüЯ»•‹º`­aˆ…ÊT® GÈ‚®UWÐ`”ö¹†±ŒHdÑkvÜY4а1uŽÐ(üÀ ¢UgˆÂŽà#ù€¸áÀ@YlÓ-ÆÎ†Å a+q:ñ3yà¹ÂXyÒüñ˾·®dñÀB `«åÇs˳:ÅÒ ãagL2hùÊÕZ¿Ù[DZ4ßoVDØšRÖb¾&JÞö…€aº ̬a[#N+JVÀ’DM#éûë4fF’N–V.7ë,ˆ­,–v¾Î•æÇ€V ·ËÒ/Ƥ܅Â1@ÆÀ s M³[X{Æä2ï•Y`Y:~Ç%)Gœ—ÅϦÇJs+Æ4‚¤˜°u† „’zgÝ;^r"UŒ°¦SGíèk²RÆÀnÐAmËÿm"Ñö=·pí»—û`¿½=¿¥Wü71s à“cuÀ 7GGæŽáÅÿc¢‰€Îêo[=ýœÛú©g\'1æq¨GÒ®6X»‡H‡‰!Ž4וÅ"Ìå–Ǹó@ÊFLò¢Ð_™ÈK+?ç­Érذa^Ià#<âo%¨Ô;ä*Û21o&þþnúƒº!_¼Äõ—RËN]YV :²s^G„^¦ÔžèGÇÁbífÏ}üq÷Úõ׋Ñ16ñ­œÁ‘% å•Wz%|CÚ‚Ù•Ë©2)Q6ƒxÀq5%âþÖÍo½Ç`sÿ¬k8?3€½ðê‰A¬±ÚƒÌ$‰1N}÷ÿé¨Í”Å~„):X»ûƒ´kßÅ-–4À¢vt½žŸàz¼ù–ë6k¶ë6ç]Ý °,ÃTHò÷é)¯M§½ízNxÙmûÈã®û¬w|ž›¿6Õ‡ŸsüÑ^ ­Ýx’½­ïð}8_¿Ï>ûxýˆÔC´ÛØ‘íK%ç‰À*i¡î ’T0Omü*5y+?»þËú’®í1b„ãÚÀ¤” †f©}¹Ô2,³çé«®r¯ë(ÂÝU¿•$ºHÄÆ08Ä ðGJM´Ã³Û.SãƒW&¹)ª¿wØõÓ¦’ÀœÈñ/KÂκòŽÝôjÝhmùi?ˆùOÐy÷?þñ9•gž¥÷ºLŒ´bpI65s¶¿Œ9½µåmU|µ€«ü®3ðNÝ‚ð|ʱ¸À;  <^Ø€ê×€Ÿ’l8Ïÿ¼ð¿„ã… cØI' ÙµR‹ôRýK…eMâŠWi †H"¼)ü³p¢°Ö!T¨E(ÿÉz~mÉm~ ‡¬=kY>—Íæ_Ö™6'ÖÒã™fhÄqÃ0–O¶ÔgÒ Ëiñü°‹V^ Ï3ã²¶ô«a³)åKwc ­ ¢ !}½<{³`hÜt$öXäàf,ph¬ÙeÔŸš=#EjãÓ)ÆnÀ$¬ƒXç Ÿq‹Ý)ŠJÑniÆ&å ÝÈ‹ºÝâ0øX}Ú³ù…¦Ù-0,ù±ë·\‹n€ôl@³x˜–OÆ-“¿ÿ&IbVGÉcQÆ$PT}„¨o®¢;öØcý€M›«E`—?{ѱʬ†ë¥`tŸ9Ëõ|é·ÑG;ÂÁØâåWݲm¥ðo»¾º`'·D·|2h ÛjìsÞÿýáùÝš¸ïõJ³ó' Ý&óÞsÛÝ;Êõ?Aú>Q:¬v+6ß̇Ó·M«ˆ6Ïwb'íý½¤¥¢EˆñÓW¬ï”[0Ò‡Àxh ÕìhÊa®š.“Ró l¼ã·|ï{ßó»´7ß|³ß©…)˜é復\\xÒ~ÿå—ݘË/w}¤½~ÇcŽv›55¹m$¾±+ÍÚ-‚À^MÛ§µñ÷M{‹ŽúÖ¾NT–•:¦ñîsãÜäk¯qO}Ã-˱ۛ–N±n0h¸úóÈ#tC† ñí æx-1-ø‡!ÃV:Fs¤þßJú¤·$iü·%桺Ú"m@íò=µƒ¿ªÏÿTm™óþkgçÌÛ FþYáiBvüÐv5ÀŒÀÊæ—BvýÙÏluÈ’»û;Ïî–Ø™mÁ̪ˆ¹¨6Y)Ú vûÂÔ¨€¹PÝžIÞÏ‘*½7×öÆØðÏ¿á Ú¢‡yç?¦`õšŒâ;Ÿf’†OÇÒ Ü,?ÆëÁâ„ëÛÐ/ oaÓL —fZzø…qmÍmîf†aJµ³Ž¬Q ºØ¿ ¯â=k €â¾Ð^ Ö…ó«¶XÆ4°nn¾ qÈt“nLŸI§÷ãEfQmøE>‘äÇtÒ±ÎÛ³y(ŒÙYl£¸¨QYÒ00»™æŽºaO{¦îbÃÅé„ÏašÔÄ…Å%]ŸvRVÜí;Y~Þ+ñ÷n²7³H/¨sûî%DÛ`‚rnö¤“Nò¢ß˜uÁ,¡MÐ.er<`ÁàÝ´ãÿ†ë6ó×qáJ·‘vJ·}ø1‰úÏtïz°ûà ýÝJð^àŽýü±€¥b¬‘H8É 0°‹ˆ^ã_r[?1V×¾ê ‹wØÞ5÷ØÔõ˜ú¦ë¤]ìå^ÕFׯ 0ì7ãìÔ @™h}ËúQ¿Øg£RGˆ×! ’›U8^Ÿٚ1ÉâŽ$ ÷Üs»÷Þ{ýXW £³Ø÷‰Ã½ûì³ì½ûî®ÇŽ;¸>ººp½hÒïªùÂ{¥ÚB'™«ÚPD©Ÿÿv˜jÍ"ð–hüŸ5æQ7OÒs¥Pqyê‡['N>ùd÷i]£ÈÌ··ö×_{?Ó&ïPG;ÆH "ž3(ßö:&ñ•ÁƒÝÉ:ư»úˆ8Ok‰ÿö~bóW;°1îi)½Q:@nŸ>ÝÍa³ó–Âc„W [ÎØrl@Ek€–Õó»²ß"üµp†0½4Bî#…û » ‰kD¿¬5”‰ÑŸ•óû§…ÿ'D»Hi«.EhgÈÐWb­À:õ{b2¶åß@ÎpA¿ŽÕ3ׯi§Å/6 YXü8N臽Ó$ž=›ÝòÂ,…f±t0ÛŠP†¯ùEaƒ@M¬'ðD—MäÞ>[Ø3‹×Ðn œŽ®›pºI!!ôý‘ Ö°K­+c@TYG2ÓòÆŒ‘…ð\]ßS*1–ÓÒôï”’Gì?Û ¦ia¬^íÙÌ0¬åÉ;#ìß=aÌFœGŸ4³ 4TIþ±Ô:)5|6Ï À±Çnß!º6Ý_íº¤=°HfwþSŽw êj¿1O¸ÞÚ½ßøÃÜÆã^â¿yn3ðó>À}¸ç·lë­ù¤Ï«-úìR÷‘v§?ð {áçÿ㚎ý”˜]%!p ë®]ã®R·©$c ÆicÔ'Ç0qCb€{Ö[íRaò‚ÂtT#¾'üƒt>ÒïûÒâ>wü nŽ”Ø-ÓõuÕæM¾cŒ%ækcÕÌ·Ô´i/è °ãOñß‚úp¾Å~_”„É•:æ¡Á,“Erä,óP¿´­S>Ñw˜®~wÕóÏ»Q’öY´{‹²œ-Þcw7ã3§ú+7{ý Ç´X)"{±@` U‰õÆ3vè95Cú—¶>·¶¯•^x/9fÀ•„v,À´¥r‰GÚ•m/ÝÅŽŽ€ÇÜÝvÛmþ=üNŽuþÒ‹^R U b,Ð;‚˜ü·k¼¾üz©l«šWº®: ²¹Ž`À襣ë=únç̘m!ª"ü©Ý|$¥ìø/–4Åj)©üxÚ4·XL^Îò/šõŽŽHa7 RPòxÖYg¹sÏ=×3íhFIÖikœóç¨HÕÞO’„ÆÕûíç†êhŠ8Qïz#þ5ß±ãÿ®Æ£g%õ÷/:ê1]öå&Á¼´4x‚òd™yn@ÛÖÀMÊîNá}BˆäØEï%BpZL+ûJÛÿX·,Ûf+ݰ«vøŸöçû×h×é6[{(DìåYlÓæ5¬’.Î"tW®ìá:.[á¯ä‚¥Ûõ‘$À 󀿊0G‘:P ¸HgÌɳÚ`u@°cwˆsÎJC°›’=ÂY½•S&ÓÀ•L¼H<#(‘„ ÊéoV~âÂŒB!åþûïï‰>Îz3~¶jŸèì5°HÌYU`¦­¨u–´„;f³On@¡`7¤K%MB›Â)˜¤¯bõÊögHÂ(úÆ7¾áö”¨Âï QtÔCØ€¶«ÊŠ]ñÿ²ó¿®9’ £ -q¥°´­ E¨2¨ÕeÏø¿$û5ÂW…‹„ëøu'DkÕâO%cbÏ ïŒ[ ¥%6v®ÒXÊ׿3K·Ðs®pæšiiÅnaø4;áC´ò[:¡_)vò²4¨®“­6´‚ÐTí²U"ý†@áZ<N˜Fgf®hư[ (–.‘r:‚d,ˆ}®´Šq·NÀ"Ëò´A‚|°#Æ‚ˆ­užbÒÍ&.»åA½¤ù…n¤>cÁê×Ò³8Îâ`áïiïÍ3ñAeÈcÊ»3Hy/ÿmø>ü•,Pâ‘LŽë÷/D?Dw}[¨õ7¦­LÓÎéÌ™3=‹R:ˆ]ÏDRC±v¾Ç²mun_ÿ’íûºOvÙYçýu¯½ü­Êmwÿh·Ñ‡™[–Kb`#é è$"®Ïè1^oÀ쓎u=ޘ敢øÿ[lîoó0;’\AÈ‚Û>ú„ë:ï}·lËÞnöÉÇé Â&›€—0²U0­¨+ô@àñ9sb>èû]+ò7ýH6q G`(‘WO%&ŒšR³°ò3VÂ8=ÿüóÝ¡‡ên¹å÷Ì3Ïø¼H»]ÁÆ+Õ#Ê×7ñÿOf PÛü±€–ÎmêÂQŽý “f|˜ÎŒÑ­mÕxvð¸*òŽ;îH:CÝ£›[ðI†ãLüý ¾­ó«Å,ÚŦÚw̓ÿUjCo‰yvûý/GvPŽ\‡”ܧ„§ OŒüÕ¯zð »…cS²Cc€ð‹ÂÝ„ !ø!üão)§vXÐŸÇ >,\ŸÁБYèMý!e‰{øgÏÆùÄÌWW6~Úú–9Êæ2‹—öŒ[ˆ„ ŸÍnéÚs>Óò‹M‹çaÏax [J¾ÓâU[€¼Ê<ÀëÂC)¬é®Ð`ð©òöÙ4::"&€=l”Ö0ñcP°NKgÍj ÅSÆË¸”ÿKÙH|¬|VLa•"þ­”¤ ˜iîf–ênñ0óÅ5?L8°ö-xm` ê¾€åŸ}–= ÿŸ½÷°«¸îÿV«Þ{G»*4 ]H€ ˜fˆ ŽkŒ»ý‹ÿNqzì;¿üâØ±wã`cS ˜Þ‘é„P¡H¨! õÞV+íþ¿Ÿ¹ïìÎ^½-ïí{»OÒžÝófîô;íÎ9sæLl—cÎÕíL0Ô½HiX`B±C·äšö± ¹N8Á¾ô¥/…c"þ¥ ?ü°ÝsÏ=u’£Û§>z±]xîTûìW~b¯,^ãý\;çeêcÿªÛ†j# $™Zoôë%æÿÐ;ïØw/¶ÍYÚ`¬Â]-üœ;„e´M  uc‹ð[›„Û„ô1@øÏ²ãº°‹g)®2’^—P:÷ªŒ· al”öÈW Œ5®œ.ÓÚ VGøXcú·?Ç•ž@ú¹çáþ%Íôw ·<_7Ó~<§ãÄaòµ{ãøÙòq7/_>¦3é}ó3γv¾ažWžéþ½âu0ò¬¼Rˆv¦ QÖñ  ‡ÀÈv€)#5xóyá¾(%°˜MK@ü³£™ž4òÉ'§±ë ÿlþ¤áïìþétãç8¬»ãÆ»ÂuÀ|ã4Uý UÌO …ê œÂ¤M"!PbvHx­æg²³zÍ5ׄ»äÅè{ù•¬éXìþ#îEyÇìh#~^YY>6þ‘ó~§ˆ~€Â“&Z‰ç×”w±úéšÀs‚¾€µ—_b#¤ €î6©`¿ÎÕâÛ’8ˆ›úH@ÿ%oJ×ÀóAô¿lUÐ@ŸÝ9ídå!夙ce”]DñA)Saëûuœhìé:€0ç?Ž †ŠG¯·|²¦-@˜¨èàx’Hh'Ç5â¹ ¥yxù½²sÍ>ú¨Ýu×]iêÇ‹Zšæ±Žö¹öÚkí¢‹. R´U+NE«JÚ£+?üáƒt‚gôÅ.³|`¦ ÚßþôSWØß|ãV[µVºuþ'b,ÓÜðïbt>dH8¦ãñÚÝÔ〾‡/‰iùM)·|LóÖv&1h&°“„— ?.dG¹Ú¶  ’#|7•5;èý… ¯rÖÆÌAašA §vv× _¢Üï á±´íŽ8&ŸZÖ“þÍ£.{¦VXc:â—Ãúß¿Ÿ¤Ç÷ Äž†8o÷s7›îGØlîiãi7fz¼lác¿|ìäéß¿­±r´Ö½»ÿž5<¼’† €¦›çot1Aƒ=îÀ¾d1äa±³Kåwh{V¹ ~Ó˜‰ å`P/È3Ä?;š^®ÆâÛ=®#ì¦×ÏnÇtð°ñ³§å¢ÿ0þÞJ»_ÆÌ„­‹¢ˆ9K”€Ò­Æê­-ÝiË!Úc'ðHRüǸY¦³²Œú÷I7Ãø½òÊ+ašc(9kR?€ê¥~uàLî XöÉ?²*e¯øÕíI°÷¸Qº!@ÊEÜ÷Ò1ôôуœó?¤[vMŽ Y0ìɧ­Vš‡·œ1=¨S@×­{ñ?æ·¿³ê¾}¬|§”èéè×¶%0{(ÏiÓ¦…Ý`Dê9à J¯×|Ëäú8¦áúhñº¦ã0È+Wð¹„øû¸ñÆí‚ .Çæé®t˜ù¤›k9Ž”ðûHapüƒ6yK( ™ &„ñÁw † õêuÛÞï†DÏOúS{C·&8|ìý3íK7¾WŠuÞ‘hÌçê?žw¢}ç7Øßüó-öâ‚åV­~}‹æ‰×¤âÛgŸm³Ôç’¯¹§Ô&„¿€«üîÒ÷ý»ó_¨[ ö¤T\å7Cˆ¨ÿg„m;(ÃcógWœÿû²ÔŒ™±Â a•³‚£/A%ø EÖ’Ê tµðyáMÂD;‰, †ßþ•°ž“Þ0ÌQó”0·i3­=ùÆûw^oÏyø!HÔÂq˜ ‘-ø\Ç‹íJ?'1þf “Í­a¬¦Ÿˆ#¡Óiús.›5D6wwóï°Ó>M—,ß0ÈüKÂË¿ÅÙÁhº~û;1C§dñŠÙ8Á›„­“Ð@¦|0(H›I âßI!óÊ–VkÞ‡¸ÔiKÒ ‹óÆÄ}ñéÈH7¸gþ’y”ü „—‘™qkr$ÚªžÃK•ðD÷¬³S´¤MÛûuè§´»GßbܦÁû'&»ÁO?-=Ÿ:uj8æ@“Ž[÷¬¸u‚­¶FÇXúô »úµŠ‘ßIýâ~˜üõ_´DD|_Û;f”­»ìbÛ5¾20ðPú·eÆib2 §£ëv]‰³b¥nx-HTïèmýtt€0í¼+„4WA"A#e~þq§Îòâ€yCûÁ mÐ PQQ.ykÞo×H3|å+_±^x!0¹¦}4„Gƒ]$}PÈȸgìÐ&,˜Ð¥À HÐþ|Ÿ`4õÝl‹zY¯³ñ?øÁlÑ¢EuÙÍœq‚}õ¯>hƒz‹d–ž:ÐøÔ(µ‹Å(ûËÚÿñf[üÖšà½D÷¿/X`£´10‘›)8ŠÆ‡£X zeŒ£àqµúù󚫾)I„lý!ôÏþ¹Àa´M ÀrÜ,¼CøBÝÑq˜–~Ú‚ÿ,á%®Bßñ—µä€â­ðgB¤6 SÀ‚øM᯹íï/…G= ‘D…XÕÛê'üafæƒ`º=ñ aqÊ8+bóP·q¨H¾Î÷<ˆíöl&nŽÍçT˜äçßyìþ­ÇxyÒáb÷Øž-nG€Åü¨°ƒ@Mað•· :3Ø1Øãê™÷sâŸ0ØñcÀ^hˆ°[.q@Ìb‚¿oº¼žðo z|ÊêvL€øîæiy=†©ò™„’ñ´<(Õß©“OBWÊš‰ƒË¡šÜv;ăõ¥QPQQaW^ye¨TÚëHˆDÎþàK÷•¸ü±vŽ @P@äÀð€Èñ0M¾»ââßY„+»ûá̿ܪ)k`àËó¥ pI¸ `Ïqclù}(Ü0ÐUW¾õZ¹Z —e›Ïš˜‡tþ°“Òë&âwÀk‹ÂbØS1Ö¶Ÿ8%ˆßC™'£cñ|¾„0GLŸºf§˜ãI>¦½Þò)ó+ȼ@› ~3§B}‘Ýiü8Ö‘+x²Ø¢|çwžzê©öØcÙ}÷Ý8˜k±Ú=<Œ/Ž\p-#ºgøÎÄßê  \OCeee`°XÃßûD[¾ ýƒ›ž}öÙºlÏ?ãûúWDüì£íLñÉg§Î?Xt4çB¸}Xû‹ù•=øû×ô¾‡ìõµ-’Dû†¤f«Ÿ!1ÆVÃØ­Ò¼ áÿ®ÆËÄ@»]ßö%êãi,ˆÊ…W¥=;ž‹Z¬ ŒïÞ*\%L„þ¹Â?Žö²BË}fR¤"à›p·ðáÂlR rÞBÜ<*\!t82^Ú<Í„ÀÐOÖ|^ý»F’‰=XòÌ!‰æßHÒk\,ÿN%¡’_wórÒŒóIÛ=_ÜÝž6=N.eJ§G\¾Ë¬9ý¨™§[h³@ ]®B¦×!Ðxm~>óeà1é€Ù1ñâ†p<û‚ÈÏ6žUþ>.!Š®ÆvÈóÏ¡ñ˜>À=D<°©#Þ?vËf'®×«›žž×9Ï ¾ wÿØô´kÂîM’f§Nä¯Pü€¡ýdÍün’NÂH&—8Ýæì ]Ÿ%bàŠ+®;´Y¶ñÑ\=¶µ?} I™­ÚÑ£_ùXmªÄøøðŽìjCxr,€+êšÓP—¶úâ>]!x±c‘}£Ge~+ÿðýAÁßàg_´~KÞ°ñ?þ¹­»âR]ÿW¤:)Ïm'Ÿ$œjUC…äÐ Ð÷­e6`Á¢ S`ÿ°!¶ý¤)¶ãÄÉ¡ÏSb–Èá@IDATtÑ‘"qp`ð@ãêAÆC[uEMž<9æˆ`£Ð/¾ÉÃë6Ÿò°Ã pSóŒ×Àn4í›Ï8eNˆ‹$Øu×]®·¼ûî»íùçŸL ¤Žf`\À¼¡BûQÔgLø§ßŸ¶_ˆÝWTTé „ú¢Íë6·ÐÏô½_ÿú×öàƒ†r“þ©“ÇØ×þæCvÎiZ›íÖØ0díÞgÇ´?ûüÕ¶BJ½ Ydaþs’‚ p¥"0â ªo Ju¼@Lƹ’pùšŽqÞ? ìð_'ü#!;þ‡Ë/ɱŠRÈ …ßB$g#æGÉýlᬌ‰Ø<ÛåÙÂʹ]!ŒÚä¿ôv\ög¤úÉð¯Ÿâù-øy ØTUÅá­¹Ìü£ù ôxn×ín¦ÓÃ=F“v‹ÝÓi´ôÙÓL‡Çpÿ|LÞ¿Ø»ÿ”±@ øº>&ðÔH¶¤ ƒÐxsÌð3Œt8¨˜<Óyc7K–pN›@9mj‡ÜË]Ó-iyPéE<~Mþ^±Ç! „ŒÆÂÞór“°ú¯ƒP”Ìî¿×3(bðL‚²¸Í²H<†‚€ÝQîSw¢€º/e |Lî(Þ¯ò)/„'cîEÝó EhhÂÇÝǾ÷Ǻô•÷Á>½mýų‚9øùyáœ~µÜÀEõe*Åcî¸ÇúéÊ¿^ï¬ ;ùÝ6m‘‚Á>¶éœ3ƒ>¤ýï±öÝp= :¸ }0Dí×vٱ˺oÜd=•N·M›Ã[OŸn;¦œ`Uƒ†@]ÙŠlalÁ°<ýôÓëô°[Œ{>Î@‘&érŒý0˜+òI·%uÄ‘ ˜3£‡°/æJ›­³ýAì¿þÓãA²›: `;öØØ1ƒí+’Ø¥#>µ „/ÆûÕ=d_=ã »Ný«—Þ''ÐZÓ6õɧ%s‡Äü.]i`„BìBx¹pªàø´u@qk`’‡èÿ®p‰°ZÛ|êUá(í3\QMû”âŽ?½ä@ɽÂ焯³À¹-~UøHÿlN-YÙâ1n ‰Óº¿Ì·Í¿-ÁÄ-ôúBÿ–¾¨•TƒoŠçãéø3fŒøÇÏÙÂe “-Žç•6=Mw÷¸þ즻·Æä[Ä·£ØP Šy°ƒPì+`úC”VgßQòE){6ð…¾› Z8mÁÈV¦b»ñn¹€útœ8úÉ.I›5 ÄØÝíq:¤AÛxZ„é$mér¨›vå’¾ìãÒ‰œÖ”‹q Úˆ6to÷ó¾çƒH>D¸C芸õîn Ø3vL òkÙ=gºï!ÃíÀ€þÖg…ÿ-\v÷!ʪt@Êÿz¯XŽ”ïÝvøkË;KÑ`wÛ=l¨(Mùj7.¶ïn°]÷¬ÛÔôqVQQ˜&(ØC?>Ž[Ów¼ÎÙFLfz >aZ‘6ý Wð2QNì †™3gÉ$±®¿þz{î¹çlþüùሠ}"Ÿ#¹–-×ð”1 žvÚiA‰':Ïèk€IFù;çš~ÞÛƒ±c½0e2pÞ'âxùØ©k$2¾ûÝï6¨÷üòìï;'|ÔÉrOZ‹ýé:6ð³ÿø¤Ýðg?´ûŸL˜kÕ¾õÚk6BcýRé7>Ñ ÐX|x´Û¯Šµú¾=°zµÝªò>©ºÙ¯qC7=Hž'ˆúÿ¹Ì4«ŽqßÅ©ˆüe»„w _¦2d”ðÂiBͬÆVÌa©µ _(žs‚ƒû¿nf ¼Æ„÷[Jø+h€hEåNGŸÉ¦›¯Òi¨ûÞû4ÿº0éÈѳϿ~ [u…JJÊ[slkµ 5ؾ÷õìïÿã6»ý¾u{`•½&]"zäû–$qþPL€.Œã4àªVˆ!u¿¥?Vý¾*¦Q` ž/ü˜ð"á0!@oË’rðëø)L T2‹…?þFÈîzž(·3…³3³€•Ê^!P*mD¹aAø³ØKø°ðáJa ?àá_ ×ótuå“FÉÇI$ÉTL¾Bÿ¶»I¯É|’0õAëÝsxË$›$Ÿ8šƒ3 ëer3vó´ü{ëÏžž?7ezX7}ç™9ØÝI{ãði¿ô3aù~ (P¿ÃSìBç˜~ {…]A@G£óºIGÄžV¸§MïøøAÈCl…M1õ ¤ß—gê¢1ð›öOÇá™:Jƒ»³kçölab7꘰ @ºH„G~˜„ü3N¸ÌaÝý ¾¹B¡ƹæÛÞálÿøÇ¡“. ÄîÉ'ŸvùP”ñÅxb|”Ð7(?ãQdÄÐÙ1dÂwB½5å$}ÞÂoåÊ•á,u¬ Û<ây¢P Åݤý¿“ˆ˜S&ÙÚ+.±}#†‡gÎÿ÷{ýMë·èuëºyk8×Hu~`àÃì±a£u޳ת G ¶z’®ìcˆÿã_jÀ˜e13“{å+E<Ã@A㋺Ê6O´ô=ˆëÌ\vèiví!pab¡Äb±©6i./òà=|> =v·égØß÷¾÷Âò†æ›0oÞ¼pLbF}’y~Ä¿)Íåïþ¼'ùñM >éß~†‚Ÿw˜Ü~Ÿ2Qvò¼ÿwÆŒPG€º#Xˆöàý™`ÒæHÐ~ôŽ|r˜<7ÝtSö .i|ôº™öùÍIþå‘fƒ2¿ªÚŽ5Èþö‹×¨ Ú¯ï}.AŒÿŸ%õqH}ᣒþ ‹+õ]¾=j«’ÿruù•˜Ž÷‹ ô²úA=„°ü¬ð²´§žÿZf ÔáÔâ ‡yŠ5DáÙíÿµðp¶ŒÙ¹Ÿ.|Ÿð8!;þ즞NòÔþ¿”‡£ û„H$Ü$œ+ä=_Å-þ?–¯ÿ ‰ÜaÖäCzGÕÏIÜi‚?>³šÄŒ— >^ƒòË|®u ÿN55?ºŸ—ÇóÝÝ­)3¿©°î—ÎßcO7mòni·ô3a`b (À8ºPøx±Ëœkú €ì56ÞwŽèl @tÙƒÃÔoÈðAKxX,LŠÁ }tmÉHÈ–<{=Æa);ÏÙ€úb7*®Ç8\ìîi’G¶ôÈ„cž={&êæÚØ£ÅfÚöXˆD†o¼ñÆ&_"ƒ{à!°ÙI„À n{í Á ‘>bĈ@t@œ¯¡Îñ¨Ös! qWQQQ'yÀüâsF:ü]dzåûCÛ1ù„ ²¿»rlPÚWv :9ã¿`¡®\ˆúÝã+mç¤ ¶wÔÈ %0ô©gÂÍhúç¨À~1 Kh¶˜={vh ÈÁ@±û\ß…¸È´=mBº®¥‰ú&~…æ}|¹mféÓçØag~ãêL$È›# ¿0 ¶™Ó!ŽQ<È1æy0.Kz03x¦n0y?wêï LÜ ¬ò$,õ £ Û|I8Ü韌$È‹£ HÌøÂˆ0­mÆÒ´ € òb‡õ×R ¯°óÄЭk¹=}‚”þ}L 5íÑî­—&kišM…;~ÊqöËï~ÎF íg?þõ“¶{Ï~[ª÷ø²®< zþ”æH5¸R=ÍW™~©#.?nÏ0Zâ´GèááµBvü¾Œ¥=bC1èêw“ðyá„ÏÓ-²H'<_Sf¼ÐÃ@L—Z±ãO™™É`Mý^ˆ¸ÿa ê?„ߺƒ¬è‚ù@¾ñòÉ«Ýâ8 )5mM–a¾LÏ¥x?Ø^#™ðõÍßçX¢2ož—›i7Ü›BïßÕ–„%Nc.‡§—ïáÜ?Î?¶»6“pG˜Õð9a Ý!Jô¹7‹&:ƒÀÞX‡t7 ëáYÄ@T X乸u±òh*]êp³¥a©Ÿ4õí‹Lü=]¯O7ã¸Ä!\V-ÀÔ‚aò¬ü³.~p€Qƒð_nË5·”K74"»_øÂZL$s$€8œñ†È ,Úh; DâÑgœ†à¢ŸAµ d҅؃øƒà$_÷ó~ÒGgïq£m¿Îí5]U_*O¹cýt4 ¯nè,â}Ï?Û6{¦®ìa½W®²/Íý»îj2Ɔæ³Bi!™P,€0¨#Ž@Ø!¡SÐÇx¶¹£¥å°`HÁ˜a®aþ<^¢Ûì^†ðÐÊo[ÿðåÀ½äWYYˆ~ú"aøÑ?é#„u‚7ža&Ä !ÂñNôY}Lg {Þñ«x¹b·ØîþäC Œc˜Œcg–®5íácÂæmÂ@t¦¹ƒãòÅvêëûßÿ~(p÷«.9CJû®²²Þ=®½»ÄÔ1Û½?ˆVê#Ùf-øßßB>ê”ÚàÏ%ù³Wõ2Eïp›æ½‡4Ÿ¬³& Säp‰ð ÂÊ”çá_ÇT€ŽÇVÕl"¸³åý`–”`Ÿ$¼Xx†p˜™|›°Û†2Q>äxÞþp™0ËIf&Øg…hÈü©Ð…d-$ æ‚$Uº‰Te$X[2:Râ`Ϭ=Ã3a2þFqxwËfÖÏ­ÉÚØ×ºqXÒjâ0Ù›K£¥þ¤O9ëËžÄô|1óEÒm <ÀË3…”nUXr¯–w˜ç;ùâÌ;±wèl©–pnÒé±{çgÁæ ±lñ[ëáÒà–¼ÜŽ?{}y}x¸8L'çõÅÀ£ÎüÙMâa÷ø!ãÌé$y$!ŽÂ*p˜v¹@ƒ ÏÁ-±óài$)´ì÷XÓÀÎÜE]®AkY %¡œ»w‚›]Oˆœö—4a‡‚ †bÓH-°C !UˆrÂô ½&…aì¦rÅÌê"(+Ô ¹-À¡LD]ÝÐÁ¢  ZeÝ¡ãÛOž4fjËfCˆ£>]V­]^¥Ó*P:µ0ld–ïÖ-»÷ÚÞ1#­LDk1Þ.\3YQQŽÀ@Ázôy!ßwó:g™]h¤U8€~æ °XàóïPŽØô÷w“ðñw…þ„îÔD>þNìê›ã夾 ÈO9å”@ s, ×8’>L˜=H80aÈ1aŠÐæ^–PQ™¾ìü£?ÂaôðöyM=X›H ¾E‚ISÇÚÍßü´:yŒýÙ¿ÞrÙ¥vùÆË/Ûõ«DD¸>s„N^/¼ZàKZ¼R†,:~T¯ Þ"\"LËü Øo†p¦ð"¡f¾ FïáJ­˜ÝÅâ [ù/Ê|Lø{a€7ð¦ð/…O ³ðäÚz +õÀ7#¬.ÃZ2yeæ'G¾—úOšõF'Œö–U‘çjÅtdô\èÏžÚô8ép±{:NüL¸¦ N—pþÇñôpóùÜÝZj¯-Ž˜]YrÐþ«ï’«û¤£¹I1±ÇÔ¢û¹É"ÌýÏ"Òw}Sh€piàÝ7³•Áë+öútˆŸYÐRWø{OßëßÝ=¾›I^Y˜Ï”“¶‹&Ý0qóœyÒȇ˜/&àïUJ&»²ú§šw‘àÜr|À¾1ɲ»È˜iO ïÐ÷("Ô|` QØ¡q¡ÞÚrÒwa(°ëŒ¦xÄža]k†ð ã¸c«X@»°Ð‚ðä8 ;õ . ;ÅŒ=Ÿ£óÍŸö€ð$͈ëØA"€~àDv¾y´&žÏ}nÆßÒuwÌÖöÍæÊIÔÌ0ÄôÑ×@{À(CŒŸ²y˜æÒjÌßÓç€~áxŒnÆŽçC0 n½õV»ãŽ;ê’œ6µÂþõ/®Ó¸ª×÷Ås|] BZö馄.åö'œm«×m±ŸÝ67\¸1%õ! Q áÿAaa ÅEq.ÇŽÕ‰×)l¼…›…÷ — ÓÀ,z¦pŽpœp€ŠyOGÖ’ÊÂ>D‚ÖÓ»ÂýÂpbá!!¿Lùã1Ë"¬Ù´ošÉwAeмÄsqò,7þð® “Xyôð„m –Ï}é¸éçléÅab{6›{6·8Nl÷°q9™Ó÷Ãl ’v±|Wœ‘¿_+ì­%mEæEí`^3—ú"œŽKgäÃbpîîqÜôNOxªîLq1‚èr‡"?ðÎnw÷؇K»óìõä~(ÀŠ!ãîi7ž}¦÷4™w(ª#,y&ž˜LŸ¤ÓíiÔz¨¦x;„fÚN,À¯ºêª@°¶¶¼³fÍ ç¼9‘Ç._{}„‡€DD:âû bÏ…ÐÑ Bà †^YY$$8« EN÷Gˆù*)ú[?g¶íE»Ž®ø õÆx¢Óá|v‘ ðçà˜ã~ùÎÝ6æŽ{­òo·®;V+Ñ^ÖIÛa[§Ÿª¼»éÆ$¿“Î)8s(H[p¾%zˆ0¨§ôœSâ L}Ó,êC÷cˆçƒž.òžkÚG[xêšïcQ}ןÁÎ=Œ2ü[Û¤ÀŒáæÚ‰æ ´ýáæ›o¶»îº+0?bH?ûׯ~Ì.yrÑÇ­Màà!0°¯ýóŸ¿ßzt9`ÿñ“§ì`f¹0Z8]x©¿mäõ”Ñ1ÌÃ!úÙ_%Œ0þ´ÍYÂiB~š L©e{ — _Þ)|[˜à_pÂáë·„þJ²ŠÿA(jñ[–8߃ ˜/3ßù¼GlìðãGwK|rúåûäé»™-ÆüêÊ“%’û¥Í,AuŠãbw$‚ûyd÷ËÇô5‘ ó4 mº4^Ó½Pé=^à4[•\àðê›èƒÎ–m!žŽâD¿›Äq$,ܤbJ´ÕÞ)HpëÝÓ…I¤êϱŸÇu¿h«@h²õøj…0ùŽI˜geÈ2»=“P^:´ð;V‚øƒd [8¨¬¬ DÄâÝŒ!ˆ­öˆ ¦;ÿæì # Àñ…B•" à\5âçè N`<Àð±éÝUƒ­þÔ÷¼{2>½oã¦þÝI *®$^N ´j‡##îÌ*o½Óʤôˆ¥çÊ믵ç+ý:¾°e[Nɶ60:€˜>Ä'íc†{o3ÿùäE»>Á ½Éexóù±>ÿR_0Äè·®©™dqÜpŽÎ§Î ôÚÀõ0™‹ùgçæ!н[ûë/\cï9}¢HÜZŸH¸¥?}ö·¯í³¶|Ín»í—CLˆÐªTÐF5@CôÿT8W˜®‘%‚鲟'8”‰ã6ìÚ£˜ŽrúùýÖ–¦Äí+¯¼¤"N<ñÄ@P‘'D÷oÏ'þ滩 ÉŸ³ô±ìt(™¿ê´ÄB:úïºu›ÿñ-6hÞÿ;¤g`¬m8†½}ã…ÁÓu+’¥í,¾è7Ó§Oý†c‰ž>µ¦d^çìs“kï‡ø¤_Kc¿±ºôñÉ÷&úœ1ƒþ l…hÚš:GʽŒ½gžy¦Žøï/EŸûÔåöù´—Kÿϧß7ö’9¸×î»WwûÀµçÛÝ.ÐmƒÒ¸G”F ‡ŠÌ!h<§³Í}Ÿð6ááa °÷ ü¯ž*.d[œYrŸ0—oƒ‚· °KáÏ.ÿ“Â_ ³'T¯òÏBÎÃ,¶!NYŽzà[Ã"ÒçÀØ v_`fÖ—TëÌ|4™K1=¯tZ±ŸÛÓ&qÒnéçlaÒyÅÏqü8nÆÝÝŒã´ÔîßÜXùm:B<øü¿él·”ŠÙ!pxK„:¡CúÂÅíé Î(ÀÝí ±ç£‰×õ¸Ù”=Ì„uxØ1ḱX¤îœ'Ï>1ÄaAD3X›åëOȹê /Ï—2Í@»Ì™3§¨g¯`dù9ov÷èè ït{ç[×û«Ê¬G·Üˆbòf S4“óñáʵ•Ò„#"Iï×ù–ô!øùø<ýôÓaÇýœ0ðo²¿©œµåbˆXâvþ9€¤€¸)-+–ÆÈþýlÐó/ÛˆG·¢.KÊæú²e7|ضž~²¤Êuü@„N¶ÏrGAàAé è¼_;±*K1€º`§ž~3sæÌ A#€+ô AxÒž.jÎÑ$ò‚ðDôÍähqÞ¯uV¬4}|B¨Ã$dœÀáxº¼=èÃù‚·’BˆýÇðÏ_¹Þ>týluU‘J{$¡‘µsÆ1Šcs€tœ?ý;U×¾¸`y Â~«ì>)lá(,NáŽÒTiêuÂï !üߦat)cÐè¢LÎ÷#Ç!ÝN]E97Šƒ‘ñ3áëBîìËï¨ÛŠde)ŒœÚ‹ñ½4Er RNôú¾ñ-Âôy,ùì±¾ Ÿ¿à—$¸eâµ´hÌ+q>-‰—%ŸÍ=›[';iÔI˜£Èž‡ÉÕä;›P$ J : ›ã ô΋éBw‹åøû3vG >xyŸÆ.~ÔY\ÔI¶ðžap÷\¸¤ƒI½#Øå¬=?òÓƒÿ»œ1‰Ÿ ød”Kœ#5,( ÛB<ŸVÎü"Ò¦N`co Ì}¹ŸÍ[Ô×.=w«>•[œ[ôÉ@¿ÞIü à[ Q ×¢±ÛI½#bÝ”~òDGÀ¾Ãm“”ó¡ ó¾ýТò¨^!ØÑò?àåvÒ?ü›uß¾EQ÷ÛŽ&ÛÚ+Þ#Ý„¤ÊH ?\qJ§|ï>yÿ£¶sÊxÛ.I†õÎ1í8h¡ì0g@Dô½ßp4À™ŠñœOžN´Bìs&†mC»TVV†¶"ÿH¾ Ì¿ŒÎìÃ([±bEÐÙ@½ùëst®u†ô L‡®bFÍË”âŽ?S)«DÎ÷#kõ¶ð¿„«„Ì÷Éë—„þJ²–ÔTK®h…+óW-t‚˜}ñ:7É&«Q~øMþ‚_Žë/±ç}^uÓýý9.KlO‡#½8M¾[qxìÆã6fp3¶ÇnîŽ[>HÙýg]TL(€"@xs1ËžKÚ €†µ5ŽG:= Àžî¬îç„¿‡#¬»a÷¸Å<ÐÖ €P)9þxýÍíÔ »ÿÞ@ü3¦ΖxýŸ}òr]JÑMšÞ²‘‚²}LˆmýÛuWŸcw>8Ϫ´Õ* "ëŸ2c53œ¢¼þIdÞÓ”/½æBáBvý{ âÉ%é·æ¢ŸÃb›„h³xZøº0 àÀ™—¿rŠäH€–}„7i¢Œu ÌNɼţ]`ÐþŒ›cižh®¡¯ôáqãÆfÀòåËs†ï£×“Ïí¤Å±$8¸êÑa@¿^ö½ÿ¤M>n¨ÄþKFšÒ‹Woê]Ï:m‚7j°-]±>¸³} @³P4S¯ÊQø W7vŽÜ¯ŽBøÃ â«Üp%"‡ÚŸòmþ^ø3!+CÜRŸã{Â[„œñ?’ «¿àõ‡TÞ!®Ù$È„5©ÿùZÓ3ËQ|±ä¾qåÌkšNÇ¿ý¡ ”£‘|ru÷ü3=?üÝNYâ¹ÜýÜôpn>›ÝÝ0 ÓžEd œT2ÐÁhØè_ àÍŸ³™NìãGG÷gìŽø‘V1ì ²øgBj ðAÍ{Åàu†?ÕëÃMw÷øìþp¸.ÎÃÝ<Œ›ßÃúd‰?E•TbqÃË.3XõÃdž ä>—´K-,»w¥ˆÿ³ûÍ}àH NLÿw8[9Tw²»Êmßþ2‰›MªÜ«öæ(@­UU—Ù³óûÚ«o$;æ?ºc„ýí'WÙðÁ ñ˜-½ÆÜœˆ¡Œˆ=Ÿ}öÙAYÜ«¯¾v=!~œˆo,–¸3æc7`w›ú¨Á 3ÐGàŸ ö#B»(ê;îö»E”k}Ù©¿í3ÎÞüÂ'lçdP}vB´º…€ÖÿÑ¿}Ðzè—oí8ñ{çýWYµÊ3pþi6â¡'¬ß›¯[ÿ…¯Zï·W+Ï¥¶é¼3mÓ¹çZ(O óÉ7;ôÌ/Ÿ`—iê wˆw柗òÉÃç.Òcf´ úØõk|ò;RãÔÍѪoúªc¤ПÁÏò¶ Øýw?v˜ýûß|ȦžT¡n&±ÿFú¸‡oWSe>| ýáûε¯ýç¡(°o~ ] VÚ™¯Sñ>'œ'\›¥¨Ãäv¾:™ñçËÝ6«ŸL†9¬jX~Àþ¥'?"d+ÿa`½GøWÂÍYü;œJ¤œgNóyÍM_x†µ¥Ê« ן¸¹g ÞGÓeòŒó‹£zzi¾;îÛÝ-6IçB@¶tÜ-γ¹2ÅqÛE<àSV!ª¸Õit0ê«â?3Ì’A@gs"4î°Øñœ¸uÓ’nzç-¦Ê"2ÎI¶¤ëŸ}ÑæïìeÉöÌ"™Å²×“‡Mâyš±;ötš>‰àçq|Ò áÃ\×¼8‘Hbf~½M86ñàÄ^A:¼ŠXاŸ~zДÏ.;“6„1ÌŠtÿ /¼¼¿“ Teýû Äÿ¾ýí……½íž'91šÀ”ñ{,Ö àNÄÀ”àVŽ0@Ο??ˆñ# à„z.éÆa™s ¢Øå~á…‚D ×PL—œôãqAÜšn]‘>òî‡ìø›oÒ€±Skfžeë.½È6Ÿ{FÐ⟠ñOšCŸzÎÌ_¤kÿ qº)­Km×ÄqV­› `»¯´A/ηá?a=6¾£ãOÙÞ£më4Ì ÓœrA%Új .˜‡‘1Ã.ôk¯½D÷9¢E›Q§>ä“¡÷=¾³H y#€þšn|ò8âøø¤¾‘˜AÏ =Æ1G)ø>ÀàšMË{ùÓWØÕï9MÛ¦iAð¬>/Õíý—Ÿiÿñý{mÏ>õ9=&¼JØ2¹%<€Ö|Bøká/„ÙX—}äþ áYBÉ~¥yþ ¿âr(`µÁìŠòÁw…¿Î"³’åý–Êù‡BNpÒáH†,¯w$¿Nö²'GâŸ9ª!&ËK'üYjºÔú72vím!PD‚J% €ú¦@š¬ÐéèŒÙÀ ~üÜÎ Ån¤Ã",Äî_œ¾ÛÛ‚À{8ø€¤~xG7ݽ)“4üì?vO×MÜH/®WÜÒàuëîu;òϤ˟.¨Ó\xv$„ìµµ§Ÿ6%%€é~®‹öz†àâHÀàÁƒ¨0„WZÜ~Á›½¥',!v»u«±‰cY†i7æùþ1P}NùîZÐç õí]¿û]u Ì6mëb£‡±”k9П¨„èäÚ8˜ˆ ³³É.1òþóí¿x4 ±v¶wÇ–TAÛ¾0´<£Å~ÿ&\&Lde‰àDÙ/~0ãF<ÿRAÌ _”§„O /Ìòn|P6 ÿYøs!ϼޑGÃ;4Û|'’ïj—0ù\†é|K×™çpOšM¾aÍ#ù±Nõ¼YÆa‚½®œ‰O<c÷6=,^#ÇÒ--m§FªªÍœá£€‚FÇbÕv·-Û˵ø.³ÁýXå¨*{r^?ÿÚ}VÉPø·G7,]]n8uJìX´¬§=õRÿ /`óö.öÝ_²¿ÿÔ*:ˆe^n@ÿ¢™3PÚwÞyç"bÅqH @ÑŸ[H0 8a €T€+ dg¾º__[ú¹Œ³ûÊPšþwçLü×j—¼ç;ël¸®ì"mîܲ½oøˆ ø¯«Dß+ñ+"¥€ï\{¹m=í«îßϪE íœ2Á:ï³@ñcâ¿VR phú-yCJWÚÖéÓmߨ‘!L.Gr­;Äõ!Æ]?z¨7vE§½ZÓÿI›6Eº`Ó¦Mᨠés,`È!!íÖ¶y®ï\Šá|n¾ùf[¿>QšG9?ñÁÙö¹‰?HãâH"þ)¼Æ»8‹váÙ“mÒø‘¶ðÍwÂYu¤®$Ì1ð„ÿWø;!Äqz¦£>N^.œ%tâ¹!‹P%léqœù§¹ÂÇ…¯«…)à|¢þŸÎ&bh²e@SõÀz©SæîÃ1|V“:ÀŸž¹Sºç7]]L#s$˜þ^¤Ÿ —‰ç4¤ã¤ŸÓá›zö¼ãöÆÒ‹ýsµóîG¸Ut¥ð°´7t0ê[`l½µ¡NJÇ‹Á Ü|QOì1zǯ˜z¸îª­wKƒ¿¯»Ça°³–Þýǽ©vÚ?N3ÎÇÝ}²Ä"†bú€úužÁ_îé6ö ™YÇ Ðß€à‚°âÌ5„ļWVÚ‚7{©øµvê¤=öôü>¶äí^¶kOç°«ÞôvË}CÃëØãg¯ wÃd`ù³ÇMÒñx¸Ô+qb¨Ÿã 8™DÜOë¦a§ÿ‘Ór&9’­Ÿ˜æç—Í~,騫ÓlQ‚n”bŽï»ëe5µ{tޏÆÞÝTfo­ê#ii!ïqÈ>~õzÛ+Ñõ2ÝPk}z R»÷–Ùÿþn¨­z·‡üjmÔÐvÁÛ쌩õÒ­ymôuˆq®ò£¬ì>£Âž÷H÷ý\ò%móísçÎ ¢ç €A‡”üsfd‰?R£Ýúþ _·ÁϽ$éê¤ÆÖ\q™mšy–­ï%ÍÿóæÛйÏ+ŒvóW¯CàEë¼k¯-_a5ÆjW?"æ2sæ˜;ï ÒÝ6³—ÖÉÆHQaItªª éÂ$(6°ã¢`öìÙ¶Râè @’Âù B>_ =‰OÃX@?À† ‚BBŽ…Ðgýû’oGb<êâ[ßúV¨oØoÌÄ»ö\ûì_jå¤þm;›§G0èÌ՗Ͱ[îxÚÞ~2Ñì?…G3Âøiáÿ²#Îî ´ó8á !Ä?r±Äq¢ZÖ’ßñg+ÿ%áÂÕ‡—”×€ð¿Gø·B^¿x @%^BPÊ|›‚Us8èßr7Ãì–,.YŸ*Ëð“É:¸%ëÖFß Àל¾ÞÆ-^¸ÝË’6‰‡››iÿø9C>-âžN:NÚßÃåb"ÉXL€NãÝ‹“‹˜vNIwHÔWW²ÍWÿ|˜Í;‹f·;a„éîØI„Îí ¾Ã-C±EcÅôÝ”¿nÖéÝÿlñë³t™õ{c™­}ߥAÙ Ç+¶É"€6©¬¬ ÇIÐ €”gùñcÂ?_ð¸0†aŠÂôY³fM8#È¥H?×y)ß2µW<ŽEÜ{fO€ºíÛ«»ýݯ±QºFÏv@Gá°sM?s²M9atà9½R“ŽðWKöÿ·…¤=õŒ¸üháG„S3v¾¤hIÈYJXNtò~7 an$¬Y =>,ü¡ª8Ö ”›±`mÁúÏ2G×c²Äd™0Ó«c{®…`ã àíù¤Óðï„›iÿôs:ô3á[šVœ¶§ãf¶5»ûåjòþÅ–€Ñ_d^äô[œ| ¾ªZT¾Hf‡=mÒÙÓH¿GºƒÕÁ.ïêvê#ýLý¸?gjÝîuÇ3àÏž¾§ãÏM™ž†›ÉT™‰Aú¡Œ2R1;ÿü©P‰-z¿¦òs¿c‰à‹¿û‘bîÝ_cËVK¹Ý@­ ϦG÷Nö¾‹vÙÈÁ›ôÜÙ–¯éŽ£üopÿj»÷©6o1—NÕbÿ³ÏØ^wk@±ÞÛÇý}]t‘!²ÿüóÏ‘h¤ØÉ÷>žk9ˆGÚÎ@?'’ˆ¡#AÄî3}ºù<:iw_„ýÜGU F[oíîï³QwÝo«¯¿ÚöVŒ ÄúAI¬»übÛ1õðòk¶éÜãW°ˆá¼¿Ä'»lÝaþçç6ðÕWEüﲚ®ým«˜VVnƒu FŒ€œŽ$Ø`tçZ -ïó‹˜0~_=78p_ýé<à8„:aóW|Òx饗“†ë‘Bð´›o“|KÐþñ~ùË_ÚOïLS&s¯& …ö3Ñ'¬ŒémêÞ-1ó‰Ó’tK1LKÛ¢ÔÊþꃶ` {K ôí]fñéþöžóh'¼Ÿ½¶xÍ£Wð6Ø/ÓÝõÕe6°ßA»pÆv;_:6níb(Êß³¿¬àÞ©2” @IDATkqô\}õÕAàÅ_ úP€ï{¹r1ƒìú3Ap:#`èСÆ<ÁËxm´PØrê{ó3Ÿ°q¿ü_û[¬×º½6ê¾½:·¿Ô6Ì>ÏÞ½rŽU h]·m·=cFÙÞQ#±òÝâ®ëýªûô–dÀÓ6òÁÅHxBYI,¾{_[{™ô!|ìvÒW¿.·ýŠw¼–KšW¹¾¡„v£ïÒŒ‡·ufÆŒA‚F¢û,¨+ê¬5@›ÐþÌ‘0`Œ=:HÄÒ]õs\kr+¸HƒqæŸÝ¯þRùíü˜M?uœDv!³J£ø¹—B ¯“'Œ²Åؘ¿xUˆÿý~2÷”J&³„1Ò _®¦A2v†ðJá!j™‘Ó 9•p°òyá­Â…ÂmÂ,€ºÎöV˜Vq%øQïÔb뮘c=Öo”Øÿ ¹ëh‚Únßè¡”¡˜ÃA%èPX¹re¸6p›nýx*i‚u$¾,eÖ‡fȨÁ6çü“ê‹äükáõøAÀ¬úª1¤ÖÓ0B' ?"T<'á’0>¹Ô‡lÞ–•8j>Ú‚¾}$§>Ü×Î8¥›}õ[[ìƒWö±Kf%»ý¼KõÁrÛw ›íÑN#„æ+û„~9 o•yòn;õÝ pÛww¶Þ6¶ì(×G(a8P¦cì· ·ó¤KàêÙ[‚RÁ¸ŽöU•Ù?ýภ)pý¥›lô°Üv4½?û3Úé¹:î…^Êã8àç÷ã|sµCX’ 鸎&çÐAçcËØh0>2»&FÀéXúÙÏÚ»ºÉàøŸüDJŸ³žvZw)ÍëûöJu÷ƒ¶ü†ÙÎÉLJë¹npô÷KÁßÖ} 'hEàfk®z¯­øøõV®y¢÷Ò•v¨[géØj»&ot}`'1J‚  »~ˆr®›D7×ú¡ÕŸ#Œ•ÖŒŸ™_`,Àôñë‘ ˆ™ ÞGrmóöÈÿM7Ý$(K1‰¾òÙ«tÝßÅLÞí]¼âå¿÷€ýÅg®´oþø!IŽ$ŒÁ_)7”àu)^®K™ðg„¿rÀ= Ð)bߨ!Êý üiM±XK(73;Ä? ™'„0ZÀ¬@à÷„P_Gñ®I¾‰|›ÃZ33g;«NÕ@ÀÐû“5fÝs&l}JÍÛØ¸jtí`6ðï@lú7ÛËû‘Fú9[º­q#ÿ–y:qžq¹Zb÷÷9 TSM»O‹ €¤gž”¹ÿz'oŒø÷@/¦@[ðAÜ\mù †øÇîuÑ\¼æüã´°û$L[$~õ)Ô⦵Ú2ÕÍLÆø:c ÎÔÙª\áXbªír­ãB„Ÿ~b7»ûÇ#m¿´Éwï–|HI·k×Z{öeö¥ ÿù¸v²Þ=kíÂ3wÛôIëõ\n›·w·Gž`ìäw)¯µ}ªìÒó´?¤~·|m{aa[´¬§8a$Œá‘çú+X'[±¶»ý÷­#í¯?±ÚúôÊþã¥íôi€~ÎY}® „PöÙgƒ:ÄÖè mÚf}úõ×_é;;pàÀìú4¶B\™»++mÁ?}ͽð¢Møá¥Øo•õzg‡vþ·Ø>‰ÿï3ÂÊöì·Š[ï¶Úýï¶â’§Öª†³ƒ:ÐóÝ ¶oøpl ëŽÍVÛ¹§í®n :2õ2m䇛:1æÙ‰—‰½Ð@]Ñ&Ìçãèj@;ö´ 7 ÞŽ_kÆ ßŸß8À1”8º~€d®KÊRèw,Vz”yáÂ…ö1‹ù‘‹¬3G)ªs#žNé™»Xf1†…¶Ú n[íË×Wؿݲ4÷Eý.NO¥ùóŽŠõ ðf!ZíÒ„1oX)MfÁü×É 4y×Ó,øÒè·˜ €R yWo¸ù¢8¶ÇþØã0þ‡ÇC˜8|bU† aÒÍÜïžñ¬Ÿˆ€ø¹B ×kßð1ñOIæ/:`¯.A˜Õ¡Öþô†~vþi}lÏîî¶|Å:[´´Ü^x­oпOµ]÷žÍ6y|²ü5¬Ú–®ìa›wtµ§ç÷µ Çíƒ!éG›¶vµ—Q$˜é¦×^´)\/è9åcÒŸ½Ÿ²|ýõׇkQ¸sçκký¼ßç“D+Xv²¹‰‚FÀ0íÒÃ|Ȫ@å ãUG'6ŸsŽm;õóÛ»lüÏn’øþPÛ|öéÖeÛNýÛûĸCÅâ³£ãºç½ó=º*pIPØ{Å*Û8ólþä³ò׈‡Ø¡=­º¯ôìI“™·cpûx×â F;ɽ—­±òªÝ¶{Üx;ˆÎæÂ˜˜×aÂLŸ>½Ž€~.½‘oÖþ-¡MQ:ˆ$Ç5***l„ ᨆ§Ýšv÷4Šmr³Jÿ¸‰ÂáÚKϰO}øBëÞSGŽÑÿÌŠ½sw½“öÍêæ‹:-_µY[ÍlæÉ}í»w”é8QM >+¤—fbzõ´›IYÞÞ'ü…‘ÿ4ô”ÃéÂË„…Bdâ‘u*•÷PQvûÕÛ™~Þíe!ì˜VI2x7ðD: a g²m˜GI<1'û79™!~U4~2ÈÚ3X}1¼s«"—¨ÍlT¥çzN›¹T’¿qZ“ŽÇ' 0½–Oû†¼=|c&a8¶™f|^!¡ ŽPܳ… €B6\+ÒÒŠ¸!ªwÚ¸sâFçÇŠy€E;‹÷b¥þ޼‹¿&ÓßÓŸ ƒÄ?e¢^â8±øq½yZž†‡å9ôp,<°+{¹cf&cðó‰˜vÉ´_!´ð'Ÿ8-Lºä‚ÅíSr…˳@ ß„øglv²!ƒÊìâózÚ‡ß×?¤VUÕ˺÷h7ݳeõ!R¿zph÷Ÿ>y—7b¿?vŸm~­‹íÜ]žô³Ûì¡gØN]-¨Þg“+÷ÚiSv«g<[axgáœxâ‰dwxÁ‚aZ?¢íÇwœUTT„c®o¤Á\“G(ë«éÖÝV_û¶íÄS¬Ç†M߯¶éöWº2P’a_°V׎·³fJÜ… ÕU½V/•î€wmÀ‚%Öu Ê´«u  Ö6ŸqJBÀó²Y€›è¾q³õ[øº |i|èÛ3v„˜3lë´éá:ÂN™òeI¢ NÞèàè;õ €XgAA»µFQ s"@:|Gü6˜•••%¯€r#Åðï|ÇÞxãº:ÿÒ'.³Ï~lŽõ,ukû“>]çyDZÔNe’l9$éÎjõ÷=Ëõ^"ú«Øc–úEĈ>çÔV9¢§-Z±;\£pX ¼3­À–ö¯…¬P—Ó0HS„þ³„ìö;ƒ7-9 Lhô‡9ûé1á­B±f|E [‹N|»†í€†5¾˜ ŽÎ'Ÿ÷™ß¤/ag®®Çð@dÂå\™ÅzÖ׺äƒ?ãÔ—ÉËV7^3®©8qMÙ=ÿ8_/G/[¸8Ž¿Ÿ›îdz¯=âô mo#üÒv‡ €¤ ’UšƒNÊbÍÑ;/f1ï—$?¤ÚH|¥®¦x/Àß³Î#cil÷?.~&-ÞÇÓÆž÷Ã:\Cª"'ÏJ§îrÂpæNìÎYM´ì·Ô²(Gl¨lmpľL¦àr]_;a\û×ÿÞf³Ïînüúi€sñ»öõ³…K¥»Bá§OÞg+×u¶­ÚíÿÙ]ÃÂŽÿ%çl³õR”ëxÀ¾*)»ëzÐÞ\ÙÓ^_®ëƒ Åvÿ Aü‡ŒR?Œ/˜3\pA¸ªî™gž gùavíš”-%§ÇX?»¶a—%xYõd–Ò‡D˜ïœ:ÙvO/‘þ­v¨g™u®Bì¿«í˜8Õ–üå‚r¿®[¶Ù–3§Ù¨{•$Àbë-=‰„@¹n Ð-º:myIÔëO€©RÓ½‹•ïÜmýÞ^)…ƒ ¬ÿ’7mÐK¯*mÌI¡cÿůK‘àJëzí>å3R’Ú«Œ}NµÐòÀç0bÇgÇmVÌÿøµ†™æã¹‡… Š!ýXúHß!ž#Ý­½ÌU:‚ÆŽ—åÒqÆ)ãìï¾ð>0P6G4ñ¯¢“ê½F}”Éb«Èçªwƒ¸¿Õˆ4æ[Žðæ=÷ïUnŸºê8û·òšè'„Ä¿€-í¹B¤nf„)÷Ù …ã„hTixðI%4 31;þ06h`ë^-”/ äð´ðÎ|8Êã% ²£ü%y½êêú¬ÔØa½)"=þã»þ4î1\çæ: RÈäŠÒÊ5M›­MÃËæfœ¶Û=“ÍLÿ¦Øçÿ)cÜ@6L¥í €¤ ú²%¼³²XyŠy€ôÑm €¿yþŒé ìpGeÁËs–pi÷ óãéÄnÙI›±O®Ê¬.(~‰Ý4»‡‰”²'“2ùå )dÉ5#!¼GBYs)ã¹§÷°û~Ööí8dú±L¬‡¯WëÜ?ãW‹Þsè:ÀívË]›í·²¥«zìÖ•~ÓÉzuÑÙ‡%´»÷’V­]púv9”=µâ}—¹îøUW]ˆNô i€Öœ”𶇡€|84ÓWVV†k ¹1&AÑø*SXîK¬éÖÕöaóþë;6LZß?7Ï6\p¡íœ2Á:ïÛ/¿áAÄ×ø øÊBû›{‚Þê”Ûv?Î:iªûô úºl߈ý‘÷=šýû«4¶Ù{ìªÍÕnŠÉ’¿‡˜mÛI“í`îÒ"7í¼–)-˜eUЦÀÛƒ$4аråÊpœFúðk͘ò¹“ù Žpm$úÐÙÄßžàÐŽ?7ß|³Í›7¯®hÂÿܽnjÔ^²tC‘ÀN ðÕ×÷®”ˆŸö•÷®Òî?ï£I¦¤'Ý1 šW.>c0¦—½ùΞ p·Â\+l=Û.ÙáÏ|!½XeVø¿B¨Úl[Ú“å~šðrá!'ŸI£”‰Þº¤Œë„ìöÏÍ<Ëh ¼ªÈ¿wboM Û7.]㘀jÍ¿aéß>™aÊsƒ 5‚_pνzô ÀZhgê9ös;&ß%7c»‡ñ -v3dØÌaÓ@Ù¾qqºØ½,îÞ˜I¸¶`´‘Ààt}µÇs ©õîŨ|ïȾ+¦åŸ8q‚vš6JD´8 *ÌnzñžiÀ…®Ïéxø¹»›>mº¿›±¿O avÅ#Ãt „€ò¥x5œ’÷2<óãD©“à¡…PÃÝäÇ´–ˆ,D5ÑöˆC„N›6-H¼"]ÒЯ~çÔÓ7p‰ô Ðmø‘„¦áÈëŠ ¸þâ‹lÓÌ™V£Û þ9.êÕÃvIR ºëµrµDøŸ’û>Û~ÒT+߻ߪûõ±®;wÙÀy¯JÀýR.¸FWêhAm²þ®éÒ˪{°ÕW_a£xܺ‹ îth¯­½ü ÛaÚ`H?öØc6w.¤WÝ»–Ûÿø)³ÔéqéJÿøN¹‡*U“Au ñ¿g•vúE>ïY¡-‘˜ýj“@ø7õ U56i\o›yê€À èÃÂ…Bíb%ä  2ì âðé¯Y¹M^"ò~«UšÔoI `äƒÛÄïßl;'޵-3¦Ûú gÙAÉnyTœ‚[ýœ(ú˜X³f!ïŠÉæI¾àc“yf 2ò@?@EEE8 ‡É7Ÿ|âÝyçöàƒ6ˆÚ¥K¹}ïæGì‰ç–ØY§O´3O?ÁFŽ"šYíº[„t©1Vù}}+ ú9Æ‚"¿ÝËŸsï ¤Áq§O†^•þÙ ðéѽþâQvëcëm×Þƒ ‡/ d—)‡hä×_F,;=%Äól™g ÏvòFȽ-x»$`þR&f]L˜¼[ôo Õ£ Ï+±_2Á£0­ÌÂê(|³Ô+ÁÄeÞ‚){xÄÌüy”:÷&Ç*òA§¸¾áåùzúiÇ´_üìaÜŒýZj'n ž¦{ð÷p±¿Ûã÷r77ݯ¿®.6´‘§§Úò_u´{Ñ Z€dÅ^Ð$OŒÉ‚Å9â´Åv|vìÚaŸþÌvñœ í_ÿw[úÖ²bdÕ M¤±É¢—AËàÇt‘UÂÖí˜{ ¤áñÜ=~®?N&<_¢0gŽÝÿNâI×vÎÌ¢r˃ÁžÊ{¬@<‰·Ç;ÓŽìž"êÌ®"„»œž={vÐT_èrõïÛÙ®»¢·mØ´Ã^_vÀ¾ñ½í6~líú×Úªu]íŠY£íÛ·Ë^k£ŸûìáçG„ëk$j>rh•}I ¼deoþî¹_ßM ‚d‰Z¦-ñÇ^`Ó&í¶¼gSS å§¾øAX^xá…Aýé§Ÿ„'"ûNÄ·&OÒa ,×¹}ˆÙŠŠ ã:JðÐG¸l0FêÝá¹ÖŠÈ*ßµÛ½2_žÒô+mð;'o{ö°Aó^±¡sŸñ¿A~’®Q¿â#`ÛOœ$ý§I¿@÷ @ð„ïüDóK­øðûÃñ‚Naì×Xé ñÀc’<¨²óŸ×\Ð%ÜVP5tH`^¢Â»¸~ê fÀÊ•+ ýÔÒa´U6†iKKâc”zgŒ¼òÊ+¡½¹¦}èð0ñüÙÒôs Ç·î¹çž³[n¹å°h»$òÏcóí‘g۽η)FÙ‰“ÆØ¬óO´³¦NˆãöÏ_æAIÔÔ“:A~@Šý±—,wúsYž{$ Æ¦ïm3&÷³Ç^Þ^—ó÷ŸÖk# έþ!;äÖoBø/¦a˜¦ ß#MPvþ¨~2ˆ[çfœZô#Y¯Î7ª<¿tdŸ×Ý?~¦ïÇîÙI3ßq’N“´pK¯áÓáš{$FýÈQ#íøã'É¢BIÀWmwè`$MÐ& €Z¨²Ð+&À•î9nŒ}û;ß´|ïGv÷]¿+HGKÒt¢±¿ïzáæ‹NÂÇÏnwÓÓ‹Ÿ±qÎMÂ$“[Kȇ¹6L¼ò'ÎOuÒ"À=¸%ÉçwàbÄÊż–ÿö¾°®âX{Ô{w¯’;¸awŠÁn›PB/!y éÉKyyyHHxü„$”PB¯Æ0ÜÁ÷‚{ï¶\Ô{ý¿oÏéèêÞ«[eÙÖH{÷œígÏÙÙÙ™Ùæôù]Ï›7¯Î 2ˆ¬)úÌÝîË ^NãtÁ„i“AÈbüä‹y²co…qÖr¸VÇÅÈÈ!dÔðY³ñ´¬Ù#•ü¾j忉'DÀç+Òe'Ž $„‡×JrBµ¤§Tʾ#±²n[¢”#ýMHÛ6ÍZH˜„Aúá˜!1HFíƒL›6ÍœUÿ•Ã>ñÓx[M5…‹jJ±I•Š·óˆB2(@C„ö]·åa}ÓaÉבj,vÊÚv¢Ìn…ãÿöí—ªÄ8cí?¬ŠÈÑ øKÄû#Áª‰–>ÿxY«A¤!®¨GˆÿOÓ’: àó¬¹ÂcÃ`¨­:¾#ˆÿARœÕ½¾9D$:•ðä}ýLßM×&ÊÄËâå•é²û@¥—ÖÔ˜eô°8¹¨?UaøG`a§KæÁ} ¥kû"Y³ û5–ÈZûŒr™8:qÅ8I R6ïNO—¥ËŽ}q²û`lHÚ~údÈÑeeeIff¦Ñá§ô+zZ@ †Ž;Ï|'Nœ0jdPìqº[bo—^ÓÀ‘ëÆKD1$ ÞyW"‹ AØc·¢ûǯšhì´]¾BR¶íñŸ qþÏap£¾~¢\Ðvæ (îÖÈîûo—ª¤xûÿ°6è¨t˜¿Ì•ˆÏ¾d”œ=FʱF®#¡~‹Ýø20‘j ݾ )BGÆÌ AƒÌý¡C‡ŒDÕ*ˆ‘ÒÐwɱÃzTå gÏž!·À±úâ‹/š:½í¿üÂRYòõ6™rçÿÊsÿû™2 öš“ŒpÌÆ€_Á6‹è/;ŠI ów§¿©ÀÇwÿµ]ä_³ʉ\2·Dþ7 .Ð]‰WQYÿ‹àHÌÛÄs¸ñpcá”ðÛÃýðê|^·$`Ûcáð– E>þa8;pÍEÆäwÜ!cÆŒ‘?ýéOöh®)T@á‰\2Ÿgy ±sÿ©+«êm`q¯ñŒo‘þ îÙ#º^õ¥w=™rQççrô^}{†i¸^Ó×4껊ó¥öçÓúœók¸½.W×ÉÉIò=H3<ÐÁµJ¨6Oµœ+uUÃBäŠÞƒÒ¬V€5¥3]‰è'?û‘|…Å+¹…¡4ovœÛqË­7™óÏ¿?ã´{À,ƒ¨)Ðô\¨òZ¬Ì§÷ô ®âL„ã‡ÈËpbáì,AÇ0«N\Ñ*™£lÃÐD&·÷?¬÷|û;hîg&G–ºÿÜu•L $EªI<Ñ@Å£T€Æ;çóõ>%)\~öTÉÉ«‘ôÔp)ƒ¯Ø ‡/\^"+7VàØ?~«"Þ .r²¬Ù’ˆ 6Ììø¹¨@F "*Ò§$ÄÕÈŠÉr*7 ’I2z°çk»|MOÕ 2P†*ýúõ3FÉ8áØtç™ma,‹bí4tÇhî>“ #:V]µ›âþ{øž?Qº}8K ³ºÁHT‰À<ȾòrìÚ„*ÀWÒö«U’¼cN È–¯¼kˆu‹\ª”“c.ñ S¡Fæº|<†€!P"¥ºË©Qä o/ƒ˜.æTŽ´ùz¤møÆIÞ þH3’Y8u *¤*dÊplQZ‚Öû)ÁBý}ª‘ÂwE承 ã–ï„ JiÑ@i€nÝ aa“6`š@e¿ð >ÿö:Ì“'žýD2»¶“Á² ÐÍ1Oì0:ûÀáñ!±Ï~êöãI©)IÉÎ$9CU5Ò½[¼L½¤½¼ðÉ!S [R›Ã¼¬’oM{è ®—½Ç2(à Ãpý48æ%«‹³™–ƒËĶl)p®d¾£Ró,L»'ßúÖ·ä®»î2L€'Ÿ|ÒH>!©¿ƒŒ‹àÈkh…¦{Àù•4ã,MÁµ.ñ¦å¬e%×”•òÇáìašÞ·G¶F¦Ýî”+|­aöµ©†±>½¦¯×öpßÚä:µ–Í6èücO©ñZ/ï™ÖîwëÞUþó׿Àš!¥.+77cc-iʺÀ _pC‰vŒšA  E ZÿWAîø3XÜÐPÖýÝïÝ/cÆŽ6 N_\€‡ ¸ëI„Dç¼h¼þ†k±¨<*3g|põ¨®6 ö´Àw•OÃÔׯyºgœyh(}¦Qg·Àkˆ8“ÈBиôKàãéü¶÷7ÞíÛ·û“½.ÏWkvÊo}Sþùçû¥÷…ÝAÅ‚<µ+u)ý¹ÀºËõû¤1?ýÜñ¯Áî;ÔCêˆ}CüûS¾yØÕ•5rפNòÊœÃ`"Ö1öEö–À•äa¸?ÃAI6Ã9³à“v!% úõ‡ãJ„#GW¢ê#¨Å»‡Ö²ÈÚ·îS¸R8;ðû&í‘G‘©S§‰â˜>úÈ¥ {^/®Ù­3àBƒ¼hÀY–ä¼é§ÌQ¾4$¾ÙóG€µ÷·.”²#œïÒW‹ÏÛׯÌÛ`î´¢êÊÔ²Õg4¯ï5Ü‘½Q ÷Æ×²í¾^Ûók˜Ý¯[¿;ÚØµ[ùíï~Õè”§PÚOÓ6’з_ÃØ±}§‡Ê'7Õ…ª.—å¶2¬yÑeçxåøqrãMÓ°‰a‰ö…có ¨ØsDY¿Úÿøþ²g÷Ù¸Sið@3KäN¼3Øãã¼¹g~]ÀzLtÀ¸¤ê€˜ÿF€6pi9^˜k+uçýïùt  Wýï}×y’zÑK–,1^SÛHFE͹û¼víZc8»Ý” (z°aÕ†2ÙsËm,@Á¸ïædˆÔGÈ’UTñªañÚ¬Hi“ZÝ€1Ç£óƒ8 ÒauÄÿ©¼(Y É/Y+m``Ä€Â`7Û”Ç2%'¸pæ¢y×®]F"€büT `òÞù¾(†Kâ–RT #€Lîx“IÀwÕ?p ¢^ØQ4Ìûƒ“9`X ì¹÷.CÀûÅCHÂõ&2`ç¶Ïs¯‚)°SÜy£wí,]>šâ„ 2)"þ'¤Ï?_Ž‹–A=€'73´©³:¶ N Å»«Dþ®†>J€]ƒÒΑ?ÙR `C\±¯Ø/}ûö5„9dPZÀ¾cïOø>Ù߬‹R|<ÁÒ TGàøá{sµÀôT™Ï>û¬P÷?0ï‹oä–ï?%Oƒ 0v(Ô¡oN ð«p~L³Íñ£%ÿ⽞Œ¯8~‡Aæ°Æs¦_Õùš {ÿžIÒ«s‚l;`1 ß@?‚ó´ßEâ3ù{poÁ…s*Åèw±§GÅ(¼n‰Àvq”ñùWÂýŽ,:îþ;Eüo¼ñFùñ\§ÎÄ4<ùäí·ß6Laç<>ÜïGÚypë}Ès¾' ‚l½ZI±?€™ø§×\{:‚êZnâêÀLl%FJ0knûüi¿f<ïíaÎ÷®ÊÐ0}­OëÒ5„†³\sö;vìà’øg:‹@&}è€ôçÀÿþŸÿ’Çÿü„lݲ-t•Y¶V‰ÞΜ¡ïŒ=¯«Š3]–––jôïYN4ÄPÍ ¢ç¡TàΡ¼¼ ǢƄX?lÃ/þógò½ïüÀ &[”W—΃՞‰H‰å“¨`:½f<–¼·_3sÍëì3"{™F€e™eƒ…,).Eõ\ôdl-~ÍHñ©…³ý’ÐvÛÛr®^»ê÷P?+ß)Ï'‘Âo†ˆÙPF‰)O‹/6G£;ÖØÆQxÚŽÑÃbeÉ{å÷ÿwZ†ÂŽs²Eh´Í°Ú A™<®´M‰2ê Ü}åwÃ×ìøO•k¾X–·xUª¬Þ’$ŘâÉ$Àc˼åéæ´€~Y¡‘âÄJG »™™™ædêqs,kŸòþù¬t”Îàó“@iªPä]ñ†ö):¨îÒÕwâ+Ó’a` $@ÌIŠTGÇ@?NbNÁ\ª!ÉÐfÕ:IÛ´D;™®‘U’ŽK¾’ Áo1jAìW%ÄJaf,§pªm”vëâ¿Z–¯¾+…½»IÎÅC%;æl¡ö; òdH=YÂ]zJÁ°ïøýà/Øß%Ç%h¼‘ïŸ68hopßë'Ÿ|b˜Gþ¶ÉU¾ÍÛÉ3ÿž+á˜À„,UJ-Fº«´Ã€à÷ ®¯Æþ1ìãN%‰~’‘Ž @‰ÿÆ4_ÞgZzŒüÇ ]ågÿ´œûPûûpw»iÅl„ÿŽT©ÅÞj˜°n/ƒ»®*àxz„´< ´ä2ŒŽÿ,ø_85‘ß&¿ËaÆÉc=f|2ÊìÀorÙ²e2{6{Êo "Z÷¡ß%œŸ=#ðs¨Oˆ?¹6á)R”"¥³ÖšxH\ÛÃyï NmÔEŽkÊ@¤Ug}7³L-×îk8}Í£¾Æ™µ³#¿=Æ7j‹›¦WÐ:xo×x-Ûî“ñýÓŸÿ¨ÑÎ?óp}BhÖ“‚y÷÷`üà?~»F  F¡­ €Pô¬e¦ûÖë¤þèugbsÂâÇM–P«°”pä°Ý}ïòâóä©ìƒ^Kæ×Ť†©¯qê3\¯}çSû6òâãípU¬™:!žŒ\ãáŠpùé½Ý 1GfƱ㧥¢¼È<™•8 €†g.l‹ïc©‰U;Å%’}:JÞ™ÛV&ŒÌ“K†ä[tM v‘ŸýÄ>1b„Ùæn.øãA™*îÆ²‹âQª€ãš;Ϲ¹¹æ}ÀSš²`/¬6ê›6ƒ0'K…«’½÷Þ†Ž«„ZÀf 8\J»t’ ÿïY‰ÉÉG<ßI©Ô†Ó0 %­Á½Ð*ØLÙü»ŸJy»4)†è}Ub¼Ñù"ÁqeÆ~@ò®½’¶q+ÔV‚pHjo“Â^Ø‘nPû$þÙ?”`¡˜=õìÙ|W|ÃöwÉwLÕ>߉JðQùÞÜÁŒ3dþüùî¢ý¯£çY+äNøçc÷Éý»[ênKD©¯Ïüj»x÷%‡,1ÿ²Ž\Ž4nË8C°pݘvòØë{äd~Q,Q÷©ðIHS¾â¯p”Iw5˃=eˆþAð;Ã(“GÖ¡…™Ò2»Qlã«póàöÃ9³|¸Ž"#÷Á4zþHâhæµ×^«_¸LÕd ù+Ô88ÜdÊÖöwÔ^K ¸æÜhfl¢G3yã¾µÖ41ŽU&מVƒ‰K=áSW¥µÜÔrä·—a¿vÎï.Îîj-kw.ÓÓ=ó©s•NËÕ4êßsß]Ò±SGWYŒd#Bm°´ÔÚd‰â8Ø$úõýJ~ÿ_ùü¾\>DãÀ¾ƒš7„8÷|_ƒÖý.è+—]~Iƒòb¡“ÊÉPªp熋¶rÔã ¦Ý8EfáhÀlˆÃú:`5/﹘$áµ3hzõ¯éè3¯Þ3Žå¨´ïíàœ–qLo˜VU„)÷ÆhJÊ#á câ ¦™üq¸Vö^n|m'Ç?„; ÜÁáNŽŸþÖB"‰ßEÛ·mÛf˜<‚mâĉFçÚßróEGÕ/±ïš–,ë6—Ë—«JeåúR™×#J2Òåð±(˜ 7OΓÊòÓ†³}ðX’|öEºùf“pL`ŸÌ¹uòI),Ž”9Q2wyš8'ë¶âÌp¨ÄD[ë+~îõ5:·Æ÷{ÃT ¹âŠ+ #`õêÕF’B¿õ}¯íÅXgÙ|$6©ªA§Tcj¤àTQ8¾èÂ)Ç®_ Œ>g ”CS'K5ðuöK;¶—®~&I{öc¿Tªc“aô¯¿¨_yÛ ÉzëØ (Àn~o9z݉Ê/–I¢ßá°-fjda) VKÊæ] ®€G Í@Õ€æâ1ç$ÊyŒŸ2h,LµÛào{ìï“«V­ª#”Ð`ÝtÇÚ*!3›iß}÷][hð/.ß,ÿm†üý‘{¤C:¦kÚbhðáóß–!ü‹ö€:ÎÏ爿c‘JC~Áxd æî]âå¾kºÈïì5%’&ÑOVâßภ½ŽãÞ1¸!±Üep\Ô1„ê AwÕ…žù ÊI±ýàHmSêa7œ+øþ÷¿/÷ß¿±Y¢êŽ®Ò‘IÆ#c©X7'€2Î׬Öu<=×)f I2ß±œ4kIܘ?G㘀~c×`"æ¼`_3³L½·Ç)ÎÖ<êk½×ü®Â½i¯Ö­åØ}çüšVë¢? ÒucÆŽrNZw_îØÔ ¦ôf]á¶‹RÐN”ØÖ5çðáÃäêk&ËgŸÎµ¥ Úeû •ägA­ žád¸ó®ÛÍB×^lta!|RÖS§L…8çqéѳ‡½ú×ǽíö[å©¿ý³Ax 7Šl<•ÃÁn_p2­"{¸s˜æS_ëà½"1÷® ºµ.´þo"(€k;.F9¾ë¥;_Àþnšã™¹ûI+å$Ú¹ Mb#P±g2H\²LînS€»Ý$tIXbcÃäÆÉ‰²övﯔ‡Ÿ:ýp))ŹôÕµ²G>úÓ$IŠ9)ûׄË~ø„Á}ŠdòØ\c$0>¶BÚgT&»ÆÉÖ½ñr ò?æ@Ûtû2?xO bè$¯»î:c`ݺuF„_wù&8Á_‘!Ê÷@é JGP- C‡&Žß€+ }€ü0\øê«Òõ£Áh'µQÐçÇx,ÎìŠú#ÒéÓùU@MgU›Ž.-•’Î=$wè`)ìÓC¢Jð@ä–/ƃÅõv]%Zà êç Üå?tT¢ò¨BW)ǯc HÔa¡Áºl5Xœ„áÛd>žX*о J‰r2(=AÚ» Ê(Ó¶ÇíٳǨÐ(!Áäûfø›o¾¨5­ªIŸøù¯Ì“¯)ý/ÈÂëÀ"YT`Ó1ÿùð­¯à|ÎõÒSO=eŒ·’å-ìܹSfΜicÞæq‘ŽMZG&@+øÞNØÑ÷Ζf- ‰$ÝõçÄÌå¦YW²xCŽ^©[¯šï~€r-0å; BˆsYz¯ëSõ™™×Œ§ãµ: så[•z÷«ù™Ú~mÏÍpWÜ—y¤U˜®Òy;wqÉP`|°  g5ƒE8í[Så×Þ V5ZN’^œ)ßÿ•ô™jqðëm¼ú  ŽÉWOrù‘ªèJ‰CÇ$€* C™,×ÎÜ^ë<ŸÀU¿‡úùIrñGbÇ£‘ð¤? DŸJ€úÓÍK†wQ©ÇÌî &Õ4ÞŸ²íy:wˆ”gÿÔN6m/—{*aq?\²ºDI‡¶.'òR¡ãs|¢i8E oËœýù"!'Kâ_ª´Å©„¥«S¥¤,Ü„¿0££üã·»¥´<\âbBó]’3Î6Qb‚çlS‚‚Fé”ñÇï#o„D+Ç7‰Xê·“9C–ïžÄ.ë¡«3h1„1¾kÑá0ØW ôõßHçOg"y¼œ¸t$¤úà‹ª‚ïE»1 &iŽ ¬ÀN˜Ãš³–fBezªD–SŠ Œœî[$UɉY`cš¢Oª /˜¸÷ $ãØ |H”@TŸ*¡T †ýMìžäÀ]û}ûö™þãØ „i§ï’e°.êT“ÉÀ]X2i¦OŸnêÑþjŸ§=îÛ»cµÜe‰ùWñ¥Öûφ~O…!žFÖèþi†àœ”ºŠ÷Àë–‡Ùí·æ:Ü´P íÂÑ G¡üá¸ãïJ133ÓXô衇ŒL$ó(%¶|ùrƒË½Îä:áBs÷¿üëÐLBþµ%¤¹”ˆ6ó æ$NK$öyÑàϱÆÔu°¯Rd4° ÖKßzïì3†éµ§{{™\³:K\Õɸ«®™ä±>+wàGë1]0"K\H°Ü¦\/ÓßQgŒ0u¡ ˆžYheXóRÐÞÂe—_ê²,Ú T8Žt™(HÔ­ª¨6ª4úç.…_:€íƒÚ]Ù®yôÞW_óÛ‘ˆ^³,Æk\˜âõ×ħúÿVQj=Uõ+qÓ¿ç XqÓ=Û8Ebb¢ >\¸8¤H2™DN_|±‘PPœä\~0îÙµ@f‰ ä{!±N‚ˆýÈø`;™Ÿã„ßäܹseéÒ¥F= ÏàK…°MQ¿]j÷ª7æó÷¥ –šRiù0¨B l&h]à®› G ‘yD ÑÏ·SÇQô&Ü&¸8g0`€<úè£F ‹ß²?À“KÞyç@Õ,·¡nš_ØáOZó˜8oœ‹¹ø˜Æç å½uk®ú6¬©ûYVךµ- wWáfβ¥s¾·E¡½Ë´Ç»»vΧë¦wŽÓ0†÷pa¤Ÿ»²¿üb¹Ù¸»xØÅî’-œFu³Ö^hJJ²Œ½d´,Z¸Äèu| šŸóËù”J t‚K:W‹%Aês•&˜aC† ••°\=ÿÜÁèÑr1Ï…b(]¡¼¶ß³^û½»k{û˜ÆŠl wëUêH߈goÒhïLdŠáSyö²Ý]S’à|‚@»`õE©¯Ÿ••eÛ·o7úãªæo=ü6éHx’ÈY¹r¥a0Œ=ÚÔGÂ*Tà ° @!ÞÕjäÞ›ºâ8¶t#v}üD¾|½!Rv Øu­$ÆUC<¸D>ÿ:]NçqÇœ­ “þ_o"“ V¶î‰—›’åž²%«shÔH„ÓQWÿšk®ŠÝrñMr‹„@¾›tÄK5§‘@î:“ бcGÃôaý®€'Ÿ0ÇùTœá›?àìÄ;|Œ{ö)dÄKt^Ž,“jˆÓ·%b³OJE¤=~D z0y#KŽøP™” «6H—YŸIòÎ-©‘γ³%i×>¨t•’n]ê˜&Cˆ~ØçÜ¥çÂ…’2ü^9VÈÌ¢A4öU öØt26lØpFˆÖõ­åëÉ”q!úßX-„iÎjÀxÞ}¬Tf.©Чfì p=á(wb.\´`àôËíŽ(RÒ‹á¸óïÌ´àÚ#33S~ýë_Ë­·Þêrál^íU,Z´ÈëU׉ˆ(æ:œë­¡ÞôÀÙð™zóM¦!î­† @8¤ÐÌRëBãc.æŸuc]›_D:¯_›¬ T€yÕ9ç³—ëêÚ9ŸÞ«o/Ïžßî͵æUß9†Ó÷døù8ç,[ú¥Ü~Û­)œÛàºYëœfÜ—›Tésçözsßʰ˜ÔÞôU“iúƒ n zôÈj*IPâ³PÏÜysdÊ´ qãªP.²”ß@IDATûõë ÑgÚßõ8pu{“KÓÓ'¡¥÷Dž$4LËb¸e¦yõÞî3ŽyP°L‹ÿ¸2á‹ ¡(ˆ‡j–ÛbP²…ª5¯½`צ>ñçZT ]°û‚‹F‹£N2Õx|‰¾Õ)÷§N}Frõ)†NKÒ}¦-о«Êv—§c»H¹ç¦$yòÅ<wV%3çÉÈ‹b¤]FOY¶ö”ÌýÂ"t’q,à¨ÁyRT!«7'âÈA.³Ã¤K‡2¹¸Œ FÊnØØ{(Nr "eÓÎDÃà8`ÊP'gŽÓ~ýú ß ™”Ì`¸«1ìkô]ò]¹@iªP „ÆÁ8žU'Þ^6%ªA\œvØb 1O0bý&©Jä¼[•DIÝ´M ô3ñÎ?±§r@üã”õ°$)Ïh‚Xè@Ý©ßl“~}^’!–nM#…r ’*'ÇŒ–ÜApRÔ|Ä+Îmðå^û"%%Åœ¥Lµ2iöïßoúß·¿öøN)íAƒg *a?#6ðÑ¡_ÑŠP}Øgâ±û_ ¦Æê²L…1¸h Gâß1»iT‹ó©¤D`[¿‚{îœ3á ¹é¦›äž{î1’D®vܘÆ JmRË‘Ÿ —h…z ¥ª¼X^žÙ;þÖR{H¿B™6þ”P5€ðõ¦$9t,V*«ÂdýöxINH‘XØ(*‰”Qƒ „G ØOÜ©'3‘F{õêel)P ‹ :öW ßÝ>§Q ++Ëè “ðU`žmjà;ºÆbN–ðRŽÝD D¿ðr¥«ÏÒ×nÄ>¤/jʱ£ßQ*2Ò%„0U ÒÖn’^¯¼&ÉP ¶ªø)êÙ_¶þö`¤Â¶Èm‡£þæòøÝ²¿‰÷i(>'»ví2Œ-ö'ß—/°bÅ c_À—<¡H{ÄqqA…$DOœKRXn8xª\殨§=/BfÁñMµäÙ†K|.™÷Ã-…[÷ œ…•pá2¦ˆ#(ê?xðà€vüµLú<%æÓO?5*\öp¯iís¡ëàO4µ'd¹9ïpMN•;â{‡3¨?¶ ÇùÒ×µ&¯,PËp.Gïí>¯ÙFú®á|¯áÁð]ÕÇríuvéÚÙÌOžê[½jŒ¿r‚§$AãZ‚ǺJÑõ» ŸlÜ@E¦ @ФÏýmM+Àš_ýí¿ù:áwp OÅÞš¸è&gýàCžÚìªî¶«´¦yt‘®ã¦‚9h^»¯L{¯-$Œ%œX’8p1uû‰I~|o*˜Æé\…Ð>ÀÅзæ®0 ,Äîk öø­é÷FÚ ^õ!CdâĉÆ@«öøF)€'ÿ»­ è] ¯¾_ U8ή 0¬Úµ “ïL•±ÃRåËUQ²ó@„TU‡á;“Û¯= £¶µúŒÄ?áTn´|°€{‡ÖFéç+Ò䪱9rÅÈ<|÷Áú´£””dvõ¨ÃO‰îÚ“ e| ßß…Ú8zô¨QÕ`ÙT  Ø;qëñ4ŽÃx~<ðbM,Iª\¸d‰=^Opi¯Ð¢ÜácYTâ¿ÌèòçŒbˆÿjØré0‰tùxޤlÝŽ,v—CS®“£×M°ì ðÌb"•3ìªp ÐP ž@IªUèqGìWO@ÜJ‹Nñ·§ô¡ŽÛu¤Dx`%ú×sÓCÝ”à–_U#ßì/’/6ÔkÈ_¸Z8³_’ûÇä2™D>Íd¾÷Ü 8gåJ¢Ü}÷Ý2uêTcÕI‚ó_}õ•¼÷Þ{–9Pcƒ·ì–úÉøX³s^3›Aµ˜W€s­µ$ǬõWàñw^pà:ÖAP\ì<ßé=}:{: £oµ»ž9Àtêìé?±ûæ#Ø}^Ûç{\VV–ûÂSZR fŒ27-Yí± "S’S rȵkèÓ·O0®9 ®«Ih+€«· Y®€ƒ .r yÝ\Àw 'y·hn p‡\! sΣíVd¦È…¸ÒŠLð º Fk±£JTlÞ:#ÄeÝx÷«uy—úìOE&M¨ oÄ{KËjä¹7óådNµ<òó Òj^EÂé233 AHi-]VQr¯ ³%ä·GÇoŒc‰V¦¿ùæ¹ôÒK}wcÞV„×—÷Ý’,ߺ:Q~U")IáR\Z+]#]!ÁÍêO—¢¬õé WäâÀJàÒ´VGÍ^¢ÒEaæØÀôĨ½¨8¨Ì_‘ð6•raOWB¹^7ÓcB.È騢AñsŠŒ“yB~Q×öz,ÈM$óÒQê€Ä,%(õA&ëdëw°ì¿å÷¿’nÓß“ÌwÞ…žÿQËFÞ±âZ𯉎„eÿ(¦J !%Už‘b¢ÓÖl”~O½(Q${@-`·ÿè5åÀ-7HŽ Š€aK~·tdи¿W¾Ž 2´¸èó¤Ú²víÚCü³_“â"äÈ  ÕŒ2ÎÀîÿqìþ½%WòЬo—l¥Qp-ñ É>K„[·n!Ü~8;píA[$ü|ðAcPÕÓwfÏëË5Õ¿x쥂€ýÈKÑßt!¨ðÏêXXãO‰Çã:°¦†LR\×òëJnqYéq„[ýáßÚ‘«Z‹ðg~«Þ†"öZ®èg çµ+h*ÞUž¦ÂØ-—>×Pzϼ¼öd œib¡gÏA“b™M;þò«/Ý&ëÒ¥³Û8?"Î8ý}ÆàG§;‹d†çªã–þS)KtÀÅXsµøóŒ‹Ï¼ EÛ8Ø 4U¾»t®¾–Ã{åÀZ÷¨n‰üã¢Ë ‡â-0¯=Ü’`z{9Zž'_9±žÒœKqõßpðŸŠDìç_Zz¯Q‘a2â¢XŸˆ{‹233 ¡CŸúè$ÖI(òý²MÂ’À1E¢söìÙFÔj”@†‘5–Ÿ ÂÚd.¯ÂKïæËÖ]å†QÒ¾M¤|RÙÙåf×ï‚•m$¯ÐBç ±UrçuÙÒ7³ ªaòÑ¢ ¨$C€' $K¿¬b¿û·a«ÜßQj‚ß íP2C2$ÜÙ‡ìÏ@¾)eêð]1CŸbîÜUhÓ¦yßÊp°·’ö*!¥°û{ÿc“¤ýâåˆv &ÄwR™œ$é«ÖCÿÿ8â„EXˆtþx. þÍñ@†GIiÇ.rðÆëäðìÕ‚à¡z@Köû›”B#qF†4ì7Ž »}.àxÜ&m`´$Øz H¢øKjU€mÎÛ†çZ¶Ö’di—Á¥ÃqµP?Ãáæ Gˆ.”¨Ìø"ܸúãÆ4GùѰÕ´Bd*.[¶L>ùä“@«ø,´Öüu=Ð|‹Üº*ÏÌñ$טæÕ¬u9fIýã×òŒoý0Ø÷ Ôm)³áξýɵlúzí¯  w—Vã½ñµ.{YÆüök½OÏHóXtöñl£ÿï1Q#{ãˆã9s?3íuµ>iÛ¶M0k<ãô÷o@0{Óϲt^ó3»-[Ý(µ…áR?$ú\l5P—dS m[ mrÜ®ÊRÄ@Ÿuê=Ó!)¥÷Lã®mÎõ1¿ 3ˆȕȒˆ×„M™¬—ñaâ~m ë`*ß²sXǹ ÏMõ˼eÅØ©·ÞAFZ„\?>¡A–ÕË¥s‡éÔÞ;tEbœGùñ yU àN-Eó9Ü}W *usÃï”ïžßí¼þúëæÔZÃïƒÉ#²ÝT)G³«å/çÕÑ©¿}0;Þ FµÇùv(W>]jíþCÍ]n½ú” èeì….ë—U*«·$„Á.@µQ- L¨ýDÉ'ë<ƱGF-€"ü”Ì Qèû ÑÊwA)â;ž@‘wˆ¤Î1™#Œ¯âÅÝ»ÉÞ»a©ß±¸2ðõ÷# ‹¥*.R"K $oà…Ò~Á2éñúû“s ¹#¤´C;ÙöóHެã7õ5<66Nƒ\úU8½'sQsB§ŽÐGV_¹ZóÆ'U…;x´§ŸäÝŠÚÏÂÏ·lÔYqH\¨R'“†˜š¸¨#$âÜkOÀ9oA®úÞæ³§c^:ö‰úöxO×îÒ×!2ͬ+zÜ£* 圀¸ ÑßpçßJ£Y½õÞ—·‰ÏtvM0‡Æî©Â{²&¸oßÐp÷ût^µü×'åÈñj™2)QþøËt¡”€7@qgîΓ@qîBSöì»Þ”eOÃoW¿_Tº»M"—$@ƒü~;´‹ª¼û½2£dò¥Ö$Ä\2ž}ç¾mœŽJ{u+•‹úÒž•5·Ð&À HâŸãpR 9 ûtž¥VÊÊ#¤[ÇÐì`“ IF òqãÆ‰ —$8É`¼îèk»|ñùmÒ¿’¹@i2{ÈüÉÊÊ2D-ßñGðï-Æ`]$ËAG䀸™–!)Û÷H·>Â?ų+åÄ¥WÊ‘k¯’ãÆ@ è¬ þmgvû|/$ØöíÛgd¦pg•殮ANA%ŽÊ+“°{TL ô³¢#d×îY±9j>Ö÷Ù4îLn£{°5TEXÇÿpªP¨øA2czÚ´ir×]wIZšç]=¦pœ/X°@¾þúë@Š#_ãc¸¥Òš·QœÉO·QcBÀ9…GK»&ö9†êÿØŽs/ ãä`]ΙºÖ2Õ7 ðÃ{u\#»Í£¾=«0{¼ýÚ9-ïÝ14--ê{>cy)‡hóñš2Á]Õã*Øß0k‘æoî äke¡µˆÂB5¤ÞïØ©# ò4‹,~Ø®¸Kõ©¿âÙÜ.ì€ãH© žUOµ%èìOíSê&S‡c 2(ÀCªÐUÂ×mÙXxlÿùÒç¹2H»`Ü©ˆ”ý·ß$'®#åÚ˜PÛ"Dð£µ:ºApK¹á|AK‰’¹sç»-¥mÎí þÿü5§åò‘8á¢ÜËþw.¤¥ÜÃø_a~…¬Üš/³-fR Ú6޲ ~NM~=11/ë}n6ÜA8» w`@ªjܸqrï½÷Ê”)S§¦@?~ˆ/xì%V€“ÈKþÆêÊhÍ꺚óÓuÝ‚f åW6lQñ/‡ÕiZJÒ`÷ÏG³«ä­ eÂ%ñ2t€w¢Y 0;Âܦø> ñ“pÔoNëðÅ×o›>í¼ôÒKÂóÓ¯¿þzC|R¶«v=Q-»öY¤B||¸üÇ'FC¤Ø"tÛÉ›•Ýcù™KÛôJ™0*ONçE)S¢Ñ§µ˯Ic¬£wˆ“5°°qg¢ èS"dÕ3_\ÕHÇ´×@Õ‰ÌÌLó.¨ºÄp¥dÊøÛgÌÇ÷I|ÂãÉ\ }žÀ÷NB†ÌÆ7 †¢¬LYÿøÒÌÚnÓ?€€!²ÿ®›$ D?lð|Õqq0˜‡¢ Ã3µT “äÅ_4ßkKm#ÛEI!žDÞ’›é]Ûpåêu§e-ôÿ ÄlƒàºÁ5Ç—Â$k‹„ÿ.8RÂïÑ2v&ü$ßýîwå7¿ùÁ¡°èÏ:šîÀQÒêÃ?l*iSñ³`1ÜYÎEjê1ÏHüyÓ§œ?¬¯ùgþxiÿc¸IäÏ;±8,uZë]VÈê,ßùÚžNÓ«oÚí(ÇžÎ~m ÷ñGËWß¹MZã³{ÞÝçi5œ·;*ÔÍo Ä`WlÖºn¬œKÐÊâÛüfã7nKëݧ—ÑãBëÐáC2gΡá°`w½>ûŒŒm‘#/öX<Ù[6oõ˜&‘ü®öNß®ÒÚã¹£G°­Ãxo!cˆsZ±h ‡ø´UASïÀŸ¾(Âîÿ±8r Gî¹1"îÕòâ;òåê2I€¨ofçH9p´ ÿZ¹rL½Ñ˜§«å“ÅЋ/4ºñc/Ž“¿ÿ¡ ò€¹ãÐ úСC AHâ“¢ûdp Ô>«W†É¦M›Œ^õ˜1c䪫®2;Ð^4Ï«$}{DËúϺÊcOçJzj8ˆ|‹9ÂO³¤<^f. è¥$Âð߈EFÌѪCäst¤%WÈ·¯:)½»[œøöm`£ä@¬äFË—ë’¥GçR‰‰íwαK‚Ÿ"Ä”Šâ‰ [·n5Ä:%8.IÈû |t”¼âäNûd2ð“@ãê4ß;à ¨rœ5Ñ+ª¬†äk[ä'ñÀg~&ýzHþ€þR ‹Œµdj¸b:4h€û“ß[É÷Å4ˆ!QõÖ[o™Ýÿ-ôfä)R]5:ªÂ„öó y,ZsJv²˜  ¨m<œwÌÿ¦qÊc·qŸëÜpËáÁÌ·O$ 3‘êL¿üå/q÷…&ìLþpsƒÇþQm(؆¼sàvPFkV÷=à‚«ê>ñÙÃùÉØÀp1ëOúÇ ½¶|kLùó¼³ ¬S u £o_Ã2Þ˜ö²1Ð{{^ûµ¦óÕ×rÝåc|S›4T/›6nj6À¦M¥k7÷ €C‡Ž¸{¤³2Üÿ•ÕYù¸¡môÑ£Ç`ú$Ž®hÛ¨"Nª£F”9ŸÍ• ,v¹à"B.W°€ƒŠœñâ’bcá¹ÏöŽí;›ÃqÕ6ÖL‚ÐÛò\¥cÁ 5 ÍK>2”ЫW/³£É§se€Äzm$÷H?¼!þMÂ00bqlà<éþþû]xRöÝy§$Hp-;ó–)·É¦ÞŠ€äA4ŸâÌn&¸3ã¢É‚\'øøãåóÏ?wÙÂBöH’v8© Ì® /û¯…=ƒiNt¸:R"«¶H>ŒrÎê 7ÎÕî»É„²PÉîÛÇ7>ޤt=IÀO­ÖØ…xüñÇåæ›o6LR$9ã@IžÅ‹ã[‡ùâŒ?йÛûçtî>%žŒc¥¦šJ¥xd®-±«d D3ŽauΑޯ±µ¦(Íïn ªáô]9æ×4M•¥ñMùöòìuºÊ§i÷ì&r\C r‘lúf“pݤ›*îsõÁÖm[eÒÕÜ´kç.·q~D8Þª9ƒ”¥—xAjq /fÑÂÅn[xñð¡F Ö/ã°Cô‡?ü!¨ÇNŸ>G7YRW_;¹Ifñ¢%nÛÚŠ(X—"WõÚã4úL¯š(ZŽklƒ”‰¢MQ59¨DÐ@ÖVÍêµ¾Ùò=™S#_¯+3}>ò¢Xyé½|ùh>Ž_ƒ¡¯QCbä²qrü—õFÄ_­dµw>.‚ô€µ 8þ’XùëCm¨xý"‘Ï–™™)ãÆ3âúÜ©§¨8™î8éÞ–ÏIŒŽ(¥h¸Š ëÕ«W›ò½-§©tæÛF"2Svì­—§Ó®ŽýK —[¯K”¾}2%>uì¢Jþ†ô+‚@•œÌ’—fv0ºÿÛöÆË©\‹ÉuôÌô#3‰sq¤D@¿~ýŒÔ™1nEö}¨GdðEî(Ò’8Õ\ZÿÕŽõ¡&=uF‹Œ­ Zg½ù¦\ü“ŸHÚ‘ âÃyúA¼gõ,­’ ƒðŠ*éúÑ'ÒëßoJçOæI¤ª¡ÎR€t˧úËË/¿l"Z_KöÇôO…*P=#°%·ÕmÛ88â#åó•'eû‹ÙÉÝÿap´ØáïØAV—ÀU&zdýq§ÿI¸ßÁ½‡ÃE-f}À Aƒä±Ç363~ö³ŸµâŸm£:Õû`¨Ù× ÷– ýB¸>ækMî}4‡‹÷­ aJ~‹\GrqYgЬ01ŠÖàÏϹÄj¾ÒŠ\»ZüœK×ÄÎãÃU¸†iÎy4<ŸíÔz\ù‚z^ŽÇ*FŒMÕì:ºÆcâ#—/ÿ꡺=9Û¶n°––•½•ä÷±pÁb·%RÜô¦[n4AJj²ÉÃ?0€mÆŒ0ü·Ê œ¾ýúÈàÁÔ&t$n–.õ îj {¦ˆ‹é9°…îòÛÓÛÓØŸÊNd«À+Cºœ2é3ÜŒ ‚ö1ŸoDzÿ‚ Ÿ,(1b¼I‰²fS™Ì_V*¹8ö¯wV”üå7mådN5ª #+LÚ¤EHrb¸lÞQ.üG®ää[»×^/ßývŠt‚¼@öHxŽ?Þ¸ºâŠ+„ª+>¿2HÈÒðà3Ï<#O?ý´1dhÙ|nð P*zäEqò³ï¤@¢úÄ"äªËI^ˆlÛ qz`|÷ÃÕÊ´_¦?…wP+ÛöÅË30xÇ’âk$9Áÿu\qI„TóÈM?€ãžŒ2IyŒ#Õ'²²²Ì»`qdÒg||dR€ÆÄÈ ôë%#€iüŒ•*ˆ¢œ¸b¬›2(@õœvíÚ™1Éï‹bêHBð[&° îDÓP wµ¸ÍcêHð .+wLK’±Ãâ$5ÙâóR‚bÖç\‡ÉÔ«;ÊEý!NzJÆ>%E¥‘£•h¿{J6lXïÄŸ6=7½“Q/HMÂÎu‡rŠ08‘Ä)§£ŠFBB‚™€9Nù.ˆ3}ÌÏ:(þG½â“'OšûŒŒ ƒë|Á u‰÷VU-e8²áÄ壥´S{ /Ã7 ÛQã¾*ëÐ]ŽO¼Ô;{XôÅË–œ‰w<†OHÊŽý’pø¨$ì?(%];IU¢{ËÅuírqÁï›ÏÏyDU ô;u‘üŒõê/7Mè(ý/„­üò³”ÆÀ»”„HY³5Ož}ÿ€œÈ«0Føh­g\0X1Ä2$üÙCý÷6ÜN8»µ ª!‘Áöì³ÏÊŸþô'£’˜èçw„¢C$&¨¦B¦)qe@Ñÿ·àŽPFkÖ¦{à$Ñt²³?O•éÛ·ŒmÇ`>9‰óR5ÔŪ¡P]MGÖq«V˜E|ûúäÄÑy -âãâ1v3G »«+ l‡+°§á5Ó±|^«s•¯©0ªìq^æ\Bà<â\—–¡á8rwÒU5Ø¥Ÿ™™)˰YÉù‰*{Á>û+¯¾,õ÷¸qúòK¯Ê!H- ry>ø¶™OÕ‰§¿7ø¨Íç.w>fìÀƒç1}Ø æÙ¶4 HÑצˆ½{÷½âuëÖIDIIü“¹pßwîñxŒ[Äÿ>,[û :h™Ï~ím9ÌC§ˆAËÐ{-‡íc4¯=Œ×õMÜÿQ·ßÀ:–ðZ …Ac÷“+#œhÙhX‹ó Ç׫”çF"êdª@Œnßc-GÉ”á»mß&R~z_ týcLUKVrï †±ÆÆÃj}1¸|Ce`H¬U”Nô„ ûÙ¬ûÏÎÄ),<&GO[¸¬‚È ûì9²;ü(Ö¿n:ßž+öÛ°IAýþqãÆ™1¬Å%sxrò ¸rŸ·9€2Z³¶ö@ƒàÜ`l`àauiP°ú¼!Jæ=ié–ÅõÁ^–ýšqö4Z/ýúµ²UÓÑÙÓ8—Åò|-ù\•§a[¶l•ÃØHëâÁò~bb‚\{ýÕ2sÆG’••%}úôõµ9nÓ³?ÞxóuLÕråø+ܦËÉÉÅ‘„çžàP+Àí+÷?bNXºä ¹|Ü¥n ™0ñJcm|á‚E° j8z4ró¯ýK^ýuáÙ´ÀË(ÅUI “ûÍÅ/ÓrgŒÇ ÅtìÔQ¾ýí›ëÄdÝVŒˆf|ˆÅ]@“©§â›ŒãàW¢ßî7™ 4/Ó*iäs-lâ(Í=ëÏ0 òL«€\3›x\(Âd¹Þ€ÖéMÚs!ÍÎ;¨4p0`ÏJCˆZeÕJ§ö‘ò‡Ÿ¥ËÀ~ñÏø5ß”™ï„Òü-§Ža0l`Œ|çÖd¡O8[%³ NP†]AÐ-ÆX ôœ‡Íû÷”q$ô333…ÌîBó j2¸%áÈ´VM‘sJ”pÜ/DZs<_›·y3LóxëÛŸ±MZ¤±ðôkù²i{¹<þ\Ždu†Fªì?'WŒ(”ßÜÌ–ð€¬ÿ¼(Ä?—È€^Å0.#~Ö­·Ív™ŽÖêÙß<Æ‘ï‚Ì©$Ø)ºO<Èûà»æ¸&#€L28`Þ%ÈðI"€ò¢Ož–Hd™vµÄà:æÄ)ìÚw–ˆ2W¤YãG7†£"¥Ì⌕k!ö_€D8Õ$2]öß6M*S“€ÎÐãŽÓ4—à]ÅÀéHüSªŠ}ÊïróæÍP[j˜dˆißxWjpREA ¨}Z´ô€”ù/™œÖP õeù•2÷«RìxŽž(n(œw_Cãº9´Ô¢ÿ<\¯€#»Öb/àÂü†/¹ä£ãϵESGk¾3éóTþ£”d€ð.òÇA+„¶råC[×-ó…±%Åõ%7˜hWʬ9­õ&oxÏ;‚ÿëFÇʲX§ƒhw~x{ù¼¶;_׸Îe{{¯mPßU>mãÞ†jÛ¯ûŸ®’Õ…Q¥¹ ¿P^}íU¹ëλ }Téçç±÷Þ{WŽg—ûî¿Çã¦Îôwß÷kÀϦ5[¶V@ˆºú…½$#F\ŒÝy÷b½dô» ¯|4óc¤:‘ãöX`Ö˜£È¸ãÊ£É8hIБP Ø^Ll´d´I7aXPŒŸ0^.¹t¬WÄÂ)§zëwü~j¸þ&ÌϼêÛâ*ŒñÎá¼wF„Wa]qG8 H¹¦Çoa÷ßHÐ$­Ô$UêsÕeoââ|3H"‹GW>øàƒMôŒwÑÔõ‡¨ßuþ¿}}’1ú§¹Wm,“øXØaЕ]ZýuˆPƒÈIK —G~‘!=ºr¿KäÃyE þ‹aLËçZX½¢®• pjÀï~”&…w¿üÓ)>8Fn»;Š^%rH”sš–ê96©JÃ~¨U“påøÞ¿¿üýï7â¸×]wPí†qþŽ7-_ý›¯M2L’¿½œ>­4#ÄD§¥¤ËØáéJɃØ"Ë C{ƒì?=†ÏIÃp·ß~»a:³¯õ[¥Ý:2¦ù^È8ñGR›vGÃxÅà^ÉСîâ³zSwÐÒðµ%EÉœÏÊîÃ%ø†,Ã|ýÜ Î’wò¾6È}‘þ\øoÃÍ£l»óh£šÇ}÷Ýg$ŒF|…jšø}}ôÑGæÛ  ÂµÈKÞ¥Z!ô=€Az~ñ#qŸ!þÍŠƒaæ—ø3÷ ã€÷ä¿£\«N碴|õíñÎa¦ÍŽ61Î9Þž×›k-C}Σ¬ÃÕºEëRÉâerûßö(À6\zÙX¬]*¸þ´©ÓdÔ¨Ñ.Ë÷¦½< øÍ·Þ@ÒZyàûŠ;;üáON¦õúpeG öl '’°ûöx^Ûããx_‡ÌL$Ê#žµð.| gü$òk`” ´ñ1s!„Œ"?“ѧƒØ}Êqv'æÂž¶&¸ƒD‚ P¸æÊ¹Vþÿß ¹2bP¬\>ºžQVV^+ù…5’“ÇwT¯*пo´Ü15Qzv‹’ ù›w–Ëþšñ-ëví)©²ÿ Û yø¯§Á,hS') m^»¹‹a_ D^~¯@Þ{¦ƒ¤#Ÿ7@‘iêÍ’ðìÓ§Plš;¤$ I8 ZO زe‹Ðá„ ŒQ.W“©?õÝ6%I&]/¯à¤€ý‡«„G(&Äã˜Ò!q2jñN{¡q8î~ó¹¼­·²*L>ý¸È @0&GåJ—öÈïO+=ç!.££&w6)²Oquâ]Úó h_z.Éu¬J°2¿HÜrÑлwos\$™ì¯ÁÑ >þŽÂy @DI©tš»PŒb¤”e¤Aàjœ$çގꬆäA˜µÀ°Kà+Øß=û™N’¿úÕ¯ ãeÓ¦M¦Ø_dŒQb€L2µ|ê'-ÜÉg÷]3º­H 8 r̃ùm·øÛ©øæ»Eûߘ}XJÊ­wÑ5ó–b⣒ð§ìÓJ¸/á–Á€³+“ðû仺çž{äÇ?þ±‘`¢ÊÑÙdê-X°@¾øâ‹@šM~ù#d´Bóô€·Ÿsó´&„µpÝjÖŸX§q-©§è½}­ÈôM¦±ã^ÞdÕx-Ç~¯×ôíך–¾†ëµÞ«oOëëµ¶ÙSYÎqœ3þú—'Ÿz¢ÉµÆWŽ“Nvþpæ,Y½fµL# l"x 99§eé²¥²råJ|Ñ ¹úšÉfŽò”ÿé<ë×qéžÊl)q¯X[Ê“´Àv|½b¥|ôá,™vã­ãd=ºtGžyüx¶œüðÃ@ÛNÝ%pæÄÃ@ kÍïU>zUÍ™ODœGÇ…%=ó£÷6¦@]:M6åØâõÞšïs³©Êª³nÝëÈ£éy«õiû=ÃxïìÛÃlÍðê’y]»pç´›7o‘9ŸÎ•k®»Ú9ªÑ}ß~}åÇ?}P>Ÿ¿Pž{îYÃÜ4pT›M:gkFÎ?;vîíÛ·Ãm3¦wÜùméÕ»—&që±l¹|µœJUç&´2Bü^ÿõì FWŸ:ÿÞ¹[tÁ†™ÐûŸñþÌ`PyDJð+Q£aö‚5Ì2a˜"²:.©C›ÿ@Áb®(y8$°®5”=AÈt¾‚ktçk)gWz[Ï=÷œ\~ùåAÑÁÒ§·ÿ ûz}™!â­xª¾Ô‚¸O“K†ÃØ%æÁRH¬Û\V'ö_X\“"%.6L(бm¸¬X'Ó?-’¯Ö–âÈÀCä²¼…ËKeã¶ Xéå±È/¿ û0–çp‡™¢ádP'}ëÖ­†X'ÁL¢S¿iÊfæ§ž.O xõÕW uà 7†ëvžèü©‡Ä?ÁNük9Tm Ø;¥6lÚ#E…¹`–ÐÂ1ˆ.ÚѰ ÿekR19âĈþ§$Y»œUÕk#ÑÙ0Ÿ­¿/‰¸ËÌ>ç1Ž:u2Œ‹ììlö}ÖE©ö ëã‘iºØòûAÜd /.‘n3gK4T¸W\æïñ —Á lD™I@W Í>‰£çJçÙs$&7GÂKËa<°­ä,yýûH˜ÌåmÒ$¢*nmVžõÛç.³~‡ü^)!C`ü7Þh1”Ì íŒéÓ§ËÚµkZ™\|wì˦¤ò +åÿÞÙ+Q`‡èŸ*— H…±Ê(0Â#e@V’ôí–€“`4Š+1ø¶)- FùžIHŒ”w?8 § ,õhK_8œi –ÌJãÆq´P&‡ìÐ…p_Âq9êÌFá·O¦ÝC=$×_}I $?뀋õ¹sçÊŽmXè®Õð_ó~gz¤5ÛÓYαִVœÖ/¯™ ëÒ¸ŸûX†;`œv(Ë«¯Óu-Ë•¯a¬K¯ÕwWs…?ûÌó8A­¯ôìÕ£É*©8uÚ 2'¬_·Ò’›ÍQœ‹RSÓ0Df3öÜHáæ) þ¾{ŸtíÖµÉò™à(¤±ÿúOy•ölMÔÊñ›ãàzê¯ÿÀÎ]œŒ;:ĵ¹.þ3pÖ^xþß®#ýõa0ʨ\0jYæ®9L牠2eë¶ŠâE`MS>(üZýã–?jG >^¡Lì.ûhÏùõ}þùçåñÇ™)êúóD€ìSUæû©“eܨ¸ºîŽÂº~ì(-@•¼’oDúñT7:Dªõ~xvxaQ-fóS^Q ¸'Åô½Û’%³ w¬ê…“P¦¡ÀÌÌL#MÕêÃ>÷t´ B5 îðMž<Ù Á0ØÔÓÓØè‰‚^P—È‘ŽmŠe`¯<ÐÛêÍûñâ 0f¬q•Õ¹L.î_ˆ1kä«SeÝÖ$) 0 .ìY,£t”—VÙÈ'!±ÏörWš;öû÷ï7 d¢p§>÷AüCÇz¨@IÖ‘••ebÜ'!«8­Q}  è8D\Ò6n–v_~ÜQÆØßÁ[®—r¨±~r²\"òd€ü’²u; ’ö‰‹“¨âÝ’ˆ~H_Û]—£W7LæóøììC~ëd€(ñï©ö ‰S:~·4ê6cÆ £2À±CÑt2¨rBF™)\´‘q`‡Ó`(|üE¶ÐÑ6@ÇŒI„eýd¯7¸o²LÕNº§FIxtôJã¥mçä­-®‚à{~¦4˜H4`¡-6t>§H(¼õéáº:.Äõÿ-6Y]°¹ [Žo–>uûçÂm„SÂß>w’ÑB !îúÛU4ü¬¾ûE‹é§€¢ÿä—ØO? °ÈÖì^ôGØyf݉‰Î2þW/qj–‡&œ(†HÆ;p5w˜±®em¡\âaWi5Œ¾³Ó< §„–=ÞÇp_ÁŸ<Îuïÿö7ÿ-{êÿ5i@órn!]EÇg:v츑BÓxs¤36<ÙbÓ´v?çtŽüö׿÷[bÍ^VK¾ne4ÃÛá‡ýèÃɃ?ú¾Ü0åºf¨Ñª‚ƒòõ×Þ Èè_0«G/D:ö¤ó=ëf¦×<Úû}ò2ðƒôÄ—)!¿)ÁÔÍ¢Î4Uó ¦J¯KÏr½ßQ¤7¥ži(Ú;qâDcT*-¦q¾…ït–½™Ýù0¹qrC{Û þ¿~+¬¾ƒ@úöõ‰Ò£[´üýå<Ùµ¯R~ðû“2l ­A¤D~1dkÉ$ ¼÷I¡ìÀу<‚0#-\î¿FÅ‚Üý¤ø3EçõØ@ž@¢;¢‚¯Tàžõ•W^i¤1¸Œò=µL–½‡p¬ üõé'‘Q¥ÏÅñ»c¼lÜA;ä\wùiH ÔÊѓѲfK’_‘&·^uRúf6$ðÙeæ‚6Òq¤Œ–¢ÌÞRÜ DzU¥¤¯[û»$ó­lä«=Üm8bu¦tÏ?Ÿ" Ê‘éaÇÝžsÖÇrÁ¦ê,ïž?¾Y¸Q‚† .âht‘ª¬ŒÚw G¾3ö¹]Z ¢ªFd[ߥƒVlÉ“Í<(mS£¥$R ‘-—HÃ÷”l˜ ÐÃoß&FbRð]b’"|/d È6°h”¿aS®lØm}$ìÀu†SñÖLʉjò ÿmpvý~Üš¾áqÁ>ú¨av‘éu®ÀªU«ŒÕ~À.ä·7€2Z³ú×ü¼Ï°ÖŸÚ%#€ø×0¬E(oÍxUüéÜ1®¾»x+ÜÂOºæu•VË¡owšVãïÃ5¾9ý|ÌwýþyâÉǽ¶m¦íã&I—.Ó0|Îéÿóû‡ÍzÁŸügSžÀW¥gÓÓžÁ¶rÀҘĆõåg¿øqÈÏÞåNÊy„¦ =µ"è/²°—áŠØv.WÓ0\¯ëgßš0 \ƒ‰ø€]`ƒ|qI+­Üýa ´,!,šY.hÒŠ¾…‡}ËsޤæÎ'EMyT% žPl–ÉïNAÐÐ>ë*.¡Þz¤1ƒÅüÍ×&÷ϼ–'4ò§0zHŒth‹sÔ kå½ÙERRj½¸ŸßŸ Kò|ñÁ~£dp'Ž ¥Ñ’5uÓù­q’ (:ÍÝl2bh{€w¼ý"ʼiO'Á¨ Â1rïÍÃåÔ‰}B1ûÂŽƒ5eø€"éÕÍ"iÒ’«dÂÈ\YՀؘ#°}_¼œÈ‰–W?î ãwňüêÇÊ•©²hUªôìZ&ß¿å¨Ä!¯?À>âûà{ 3€L€Ã‡›]{ꢫd…?e3À$ö©gÈwA‰UC ±ªÌ_ë¨Åwû/í–}%©›) â7>VÞ|½T%&8Þ„U*%jñœÝ§ƒÞ1M¹rð[·È!'Yܽ³ÄÀ‘±ÛwI¯—ß‘DŒÝ.³æKîÀrjÌÅÆ@ 7mã·Ké Ú» ±èr<ð€1rùÎ;ïµJP´“ :âuö1O{ÐÓhà‘ JtƒQF•`:ø<'ó*ŒãutT¸¼=ÿ¨™ zuIa}’%ÖøÛ’10,C.í—‚gÃù0` '!Üœ4€{£>ÀyŽŸ¾õùãÂG gðòg‡ë –Rï¿/Yc”¥!&¢#æúÜ8¾ug6Rrr²ÜrË-æT†±cÇé $;g€Œþ£ ^Aþu–њݿðu5å_-- ñ¢qDæšh±îdP]¸•ιÉÌKpö5óš—©5­¦Qߴé<Æi8}âH: s%  åùêk™¾æsNÏÑ~þ“_ÊŸÿ£×âúÎeø{v×~÷›ßc­@칯FÏþ>z¸9Ö¼¹ó%9u]ì<íà‚óèûÿé1G £L-ƒ ?ŠkfffjO>ŸÕÙ±ç0ç{Mc÷y­À… u}ò±kTYY!))ÉX܇Cí"A""-]lTuë·ê#"5³ˆ3¹$bdÝÞEVáX®ó¸PãYÒÇi„;ÏöJ¨ßJ9yp@IDAT;s‰ùs4àˆÁ±’ ƒ‚ÃqšÀ]ßJ6Dþ7Û­¥óc¿Ê¶òü[ù²lU)N€ØmÏhùÃOÓŒ.q C_®.“ì“Õ²ÚFš£íõùsMâ’Òñ2©†]ûÎ} prê¦mÒù“ÏÍn?›÷)o߯x¼T¶í-Â7㑘’S¢$̃jH„Ça¯$Ë%”Å5½5y8?›{¼Ïì“åò‹g¶KA‰µ—? IÇÂQ‰‹°pŸÂý/ÜpÙpΪ?üáåé§Ÿ–»îºËœFÁwr®%B^|ñE#õÀ³-EÞçá(Ð Íß· J ¸œó@ß6YÁ¸¬¡ª) lpɪkª;-ßÜržp Sß9žx8877öb2J‰ó4úÌ«×ôY¯ï5ÎÆyKãœã57>™ßdºSb+Pà\ò& µ€ÌÌÀ.—›¼kR¤À®&îÙÑDZb#À¢ÉÌ„£YP£FrêôÇ.m2ïit\Ù2°xÎ)¹6ÑV‰ôWØ«ã‹m¬æ/ô jIoÓ…§l²®ËmþÒ¶6îƒÛ¸¹•m(ʰûm±AýŠeœ±Üºw.wvæHm`Ñò,[²2SŒP„{õú6Îv@—‚r›:;×ÿ0R€D¦ƒ:È1f Ôa"j̵dܤ1ÏD.P2¨à6¬ùu ìþg­^g}žyÑr¤Ó‰X"FÒçgbÛ²²¶#þiõ€Ò®U ¦—ˆÕ²LËZ³ÎJzu· ¹Ä–@e»[?r˜•=÷²®‰È.Ú$£Yîºîl Ð֥̄r(Ýzç6P€±°°ÐÝ”Iuv Á2|øp;v¬=öØcnM`pm;Ø®Îyoü»ñ“à™¸ ¡HdÀL€C}àÑèøÍ%á³µX*Ä'ÞZál t+Ðë‘ÎÁ¢</õ¶²1ÐQ¶†ì“ëÊ`X0&U"¼¸ÂbÔgP9zy’<¬×aý{)ÎVü—â'Š Í´âÞÙø˜qŽ$9¾óïÔÙæ‚šØ-:¯¾úªMžŒüCƒƒ ¹= È”¦CóÌ@êEëšç>êÔ+ðŹþsx&XeüÜR׸îc´Aò|¨)í¿ÝÛ_ á ߟï´åÓÓþÜ÷™Èðù 9&¶Ý6ëÏýËßÚŒé3íšk¯–„£l¹4Bà»ü¯þÛIÎI#tÕâšL3šqIæÏ_àltíÚÅŽ}œc 2Èí¶ÔeXˆžÎš5ÛÞ?ÁÞ÷¶ãÖ¥^²e’yÙyÁ!VÐÇ-ºãW©ØÉóÄ+®³¦Nêl°.ì–úkÕwZÿ”jlÌq96tP¦ýß]ëlм0ðm.Þæ¤&že?ùvo{îåvö§ üýîdÌ^{¯À>˜žç¤¦È( ¡ ¯B»ýáüVÊSÀmïcí•wÅ«ììÖŠ(ßÑÛ@ýG¾} 曀;Lv”!±€„° †JCƒ‡Q0ØÅ˜>}ºS=@-À«ËìÊ>@ 6[»½ŸÅÙ!×–žsš•ôèn‰nÿ¸Š­â澬ìiÒñϰ¼y mí¨CDÈgXë­•`]ÅYk´·´•zA¹e¯]o[ó%¡ Å…a€ÁÁ¶ËVZqïŽÉSÙWÏ,j¨ž4f`îÏ8ã ;æ˜cìÑGuöx7xo˜×(̯i0|à}CB‰õö ICdrNY˜¨Êy»Ô…)°¹¤šQðñ¼"û½Im¢K¶v“¤,ù÷îšm‡î×ÞF ioí²[YÛÌ yik®;ü[õm€1—A¢6•Ù#¯WK‹í¯~ Rÿ¨øœâzÅhà>y.ö³ŸÙI'äì‰07{z@ì·§I†ÇT‰ 3 ’dçéên@¬öŠÀ»Z)œDÓýoÆ£Ïc"(WüŠæ'^÷çþ›¶#°Bñ6]"òãÛóuý9u|š#ß'Žäûkþi®ÎIÚjŒ@»Ï=û‚áŽÍÒSÇœ¢ïPfJºâ{ðúkoÚ?ø—û¤¤Ñݬ‘†c:»Ù¶äá"ròøcO¸ÈNÑ} Y,´þ…ý¥ú=÷ã‡èš?¡-˜·@.ræ8‘­¥y™=0‹¦wôœ4!±l´Œ+ ò|y%”áþ¹BR€³'¤íjAú 1Û¦,÷•jà§*>DzØk ¬yóÌþæ7¿qºïM5úµ±?þ¼³ n²‡ŸÙ$qò˜#þéæ˜,‰‡#ùpz™½õ^‰ósOÎ÷¯/˜o™ýþoñŸ-š¦°OûæÕÒ–„À'Ÿ•Ù¿ž’ˆðÇå6á£1Rg\ $±A\Õ!NA¿…#¤Ég-àœcwkcÆŒq;Þˆ¢'CغꧯÜ-ÞóË®6í“2¹S,sêH^à†1Ðû5c^Gÿ’n:@›ŒJ©”ÚÒ•Ù¶iKk{ïã|›þY;Û"ÿVbÊ´¯¨2ˆÎùVùI—zÀŸþÝËþçúE²óáÎø¤èµ€è8Œ˜H@¸3WÉ0füZ‚d° íí@ 6Ì1È'ÖDìn܈MþÃïm°üg­Ýh«:T»óþ«–ˆØÖFc,“KK=Äìö/¼â|z»v÷Õß>ÿ|T’¥¶ê˜QVÒ»§uy÷xÿCêX¸UD~/'5µz­|4Ãú=ò_Ë^·RÌ+7ÇÖÊ]ডƒ­|ôÑ6à€ýM{â5µ12!ø¯¿þz;å”Sìp -ì[ MSëëØ1ë虓Ôíß¿¿ó2€t×°ŸAÛ0ã^ýu·ö¨ðIöÝ{¿ƒßFÄý=Ï.qêGËëÀ>ÝsÔV g9ׯHb ¿¨dK‚ GLùŸÛÛÓÖù¦lŠR3a3Ðß9_HA\yå•vã7ºñùo ŠíѦ%nÿ<,làÍ¢9åÿy ¬Ÿ®–šðÜßÔ´ÖÒ[ñ;ÿàžßt‰CÀa¢ÛÝï»ç¹MoW°–kQbÝÃÄ6ü¹?úvÏ}~K>œdž;õgœušsÿç%¿ê;î5kÖJ½à5ÇXX³:)C£õíºÅ•O3ZØ’ Ž2mêÇ.¶°¡9 å‡?ÖwŒÔóu9È<²L`–ˆôxG_¾n´_ߦš‹0ɰ/’”a—,Ü•‰±u…]¦+§1¤CÝgÄÝÍ«®ºªî•RPDÂýòssíÍ %"äPÆ»Ž=,Ç:w qûÝhë7†ˆüeíïÝ#Ãþõt‘ôþC±ó£mk7^]`ƒ eüKaÈ>mlü¤2y (³¿?Vd§/]»¼Ôî¾±#î2»|q­Èn$Dgâó_ß©â}‚€¾ûï¿ß¥Ãý;¢Qþ}«o»Ñò Í2b4”È&ÃËo‡o=ºeØ·®Ê–.ûZ[¡ìÔÙùöú{íñë-§m¥Z${b´±÷¦åU½…çž°ÆÿSåY`ÁÒl;gôZ¹úö™LšwF;Û^MÃ3˜;ì°VɬsM?ìúÃ`@Ý€ÝtšÀ{®×6¨Ì‡¼Ó²W®’Û¿NN”?Ê`w?Êt‰êk÷`?[ð0[;âëñƳÚÑ_dýyÔÞ÷/ú],SjgmŠp ˜!FB[ÇPÀÈ`ÏÆZϱoZî"h&Ðl•[k½ŸÿÜJ?ìc±"Ù`èÝÏlÿ}ãÓšFÚ8yýE¬ÿL»àX…‡€¤RìÜ×6g;‰ÿް¦¬*´É{ˆýwÜasæÌqR0X+ÄÑñEOYêó¼lÕ|°-€í"îF3´ÛÛCó¬»TŽÚÁFÈë@¥Öv’ì Ë h"ŵ‘\÷râ‰'Ú×¾ö5§Âspo ¼g|?ˆI†¿©>ü•êÉN²ÁtõÍ@j?˜ BÓU+x¤þôÃQ¿á_U^u…¶W"K<§´ûþЮk›cû|®ƒ7'†°lu¿ÑsÏ<àHômù2‰mÕõ<ÙúuéFÀÃ=âT÷Ýoˆ67†ÙÐý÷sƱȴçþVêû¹tÉR1yg‰®šnŸÌü¤Æ9«Kÿ{Z™4 ¤þÒ_>ÙŠ(Rxž8”º\wÀÇ]ðTüµ°‚‹ÂÑ$ÎÊŽ¿rÕï6í<:ZBîQ п3GŸ»ê':.ʦC8ìš~ë[ßr„%»WѵmŠ9êÔ¡µ]xzî]=ýÊf›4­Ô!ì¸üÚùJC¤†"¾ú¶±SmWEüÓÀ>ÊëÖ)ëá&•€ 1¶9ã™ÂHX²bwì@s„ØÀ>€ßN¶}¿ã?cÆ GØ`à„Np’½©^§2É5êßÆÖ¬Óœ+=dPGììŒâ è»Ø½‹¸l-[½º•ÚÑor·øêĶnDYa¯2;ò Mîý}q|-[%—ò ðãë[OÙhŒà!rvŸaÌ *¦ דgž‰À ˆÏ>ûÌJB/´;ØPY1Dþ‹µƒÏ„D‰&«•vÿ >šjÝßzÛ6 j+O8ʦÜ~«m|`  ùÓ½–µNó(>X»¥ Tñxžãb[=ê('1ÿégrøºµ[²\ùÙê§·m‘øÿ6Ní,ï1ÙË?3ûËßGåMA¾™ÅUR¹¦‡v˜Ÿyæg¤0jüœÖwDvóþ¡ ÀZÿùÏ®²Ÿu}hHn°^ĉ':ýtò0¼‰Í ¤ ’¨À… žûyÚñ'>üê2Ë“Âò­;"èÔCò{7Ýt“}öÙ; ¯”ÙÂ;ï¼ãl?°®I„iª+7V­k‘DcéªIÍ@ ¾ŽIõßd•%x*ÚÑퟆ kü<Ìq' ?þš?&\vu};4G9ËrîÛ‰–ñi¾e¾Œ/çÏÝ…Ý䇱Ïúd¶‹~Èà;Àt/5],IÈ-›·Ô.iç+îÅÇ4`/^ü†Þ:/_C‰‡hÝÚÒÑqEËDó£iʸàŽñ4 7~ðä‹Ä)¬w&î@xÊP¬j#Úp:]ç`ÇŒÝfŒy¡ïÜÜ¡\z¸¿øã:§Àª_/À]:e*Óf–‹YaÖGúýGެÖfÌ÷_¾L.s6ÙšõÛdÝ7ÜÌ(-‹ÙÜ…2€'+ø˜ÌkØq‡o_·¡÷Œ¾2"ú¨`ÙbcÖ¬YŽ3ŸÈÑnH¯<ßãÆ“[Ðin·ñCqŒT…<ÍÕ‘‡dÛôÙe¶|U…}ëÖÕvéÙy"Œ:Úºõíd ÆKÌrs*mô¡¡û¿ŸgÛ´OÛ‰1âŒçŒ^-‚8fã?jo«×†R0[ÊÊ{_vúõ(s†S5æh;^$ÑBvša@äy½qÖŸ‹Ö«kÚÃLÖ¢±gŒBbäŒæªàà—Î ¿®Gy¤Û¡k®™á;èDr%–;qJ©|ÐöËtQßÊ ÄÀ_…„Dñê±ÛÛØà±è%ñõSkgÇŠÀï*¦Ášõ•öÇl´?=¸Ñžzy‹—;Á×'È þ8Y¶WÙ~½BB5™ûETœAÞ/Žì4BXêòLî¬êÃ!G‚ˆBãNˆc* 0U> ÛIQL“e‰¼0WïJÝ⣙!aËZ<´ÂN84Ô½{üeáÓ.Lv:;`³–»ÀͲðÄ+]d7 CèŽDÿI…à“¹ídG ÏV¬É´A}K£`g÷ÜÐkÀÖ[ Þ•Ä&¶¼(x2jѵd=¼´Œ bAÛÕ=Ä$=ÐyâTYî—¨þòÕÎè_Eû\+îÛËŠícm$ºÞíõñ–+HF/=û çJ°•à]÷×Þ²<1 b­slñEgÚò£·Œ‚ÖW:ÿÝGdA¦T<^ySæõµV[$pÅE}Êèl¦À³Š4ÀGá˜'óçÏwÏu2Œn…5a÷qX˜Ø Md¬½—¦ñ^zKZµì\qÅÎpáÈ‘#í¬³Îr̾CTkåâ¢à 0…ÈyMÁÏþ˜XØD]Üÿºwëî¾Û|+¸­MÓŽ?÷Gò¢ãpcTÛ\–¡\}Ã"1¢a`ã]'ê<?¯sÉF(˜f¤u~¬`€A $Z„ÄcmmzÀT"ÄÒ&\[ ñê  o›-Ë̘/ÇøŸºŒöçÎéºVŽ1-ùm%ørŸµkeY>ÍØavØ5…H‚ µÊ½CÁF̈?^"F³äί½>"Û¹l-†âzÿ}i‹>v œiÇÈ„+ÆÁ×Ï‘…ï5ë*íÖ;ÖÚ³¯É˜tÜ3Ûð1ÆY`Ÿ¯+âÑ÷ÔyÉ v¡ÑMfw1tÔ’!:ý¸x¶éÆ;ÐìpÃx`­@.êòìû¶j;¢FqÕùÖCîÞVï¡ÙüÅ¡Á»žÝ3ìoê!£²Ûð^ÌÞšÔNey¿u̾|Á ¹^Ûf/Žï$C9bÒ„^rÚ2ïÛÔÎ6¹Ìp ˜ƒû•è^â‹VÛ`’È9bN`°&0K æ€50 I'3_Ѻ00‘à¡H_ ; þ¦5¾67Xþ§ ¬uE±µ]¹BF‹¬ãS­Ó¤i6àG,Î\5³ÕÖ4Ò^vž÷ë-†A©õýï ’ Ø`ÛÚdÙçGjeŠCz÷ÑÚHå@÷fýç_}Ãlé" òÚ[ìë×'u¿;»—ú^ùEožo ­U«V9b=YFïŒÄÑ'Mšävûy ÔyG¢ï`4J \>Â@Zà‹_ü¢~øáÎàçÕW_í û}ãßpcNvœõ¯–XU¤Æpý—D@¬èfÅwþÂ$ÑIºj½fàJ•Þ+À¡~ýúZÞTñ/ëúúnxº¢²Â¥å‰x¬?gfkKûo×a€ÃÑ·\÷mø£'ôý5Ž~¤ý£y¾½úi/ͨיּò?oP­UJ3Ì~ª¹LsOÑ‚´äf¢ ˜ê;^_¯¦#y‰‘ö}^m}!Š2°ì—Üp–vo’N¢òÜ"ëG½£ÝE¿ÛXïª/WE?i€Ÿ‰íÌ?ÖçA˜aø³íK5ÝDy/ÿ úaÁžÝéÕ"î¹&wèrïÕÚž[dûg:éÊ®ÝPiÿ»Ùy6nØNíÿÞÔÉ.:#׉º£ðé¼­ŽIp¨kŸrô-ÔsD ˆ¡c FÄD„g”ðhh¼D˜gS¦LqïÌv<“ÝMeLÜ?.Ø7Kž¶Ú”™¡Xôy§¶³sO‘G‚6¹öǶÉ@ ˆK`§³Ö† Þâˆûçßê$÷‚|šsô:;ãØuv¦"†ç.n'ÄÅ$•‘iû*¶,16‰h“ 1‚G” !ò˜#ˆs'ˆuž÷T=ãô…ÿúyóæ9D tÖbgŒ€ í×:ɲÇ)3Ä T@ë,ÛÒ·¿Í¼ù›’ èí X´.-·üOæÊøß\Õézøå«e<³cõ4ΞãlX‘8\9í,8í$³ÎÂë‹$ FÚ‡Sed \ol“`G;Õ5NŠoúó¼0´`”±VÀñdïïïð †çÄ16é—±a¬¡:0zôhçñƒ±¦ ÿêUyøá‡íÁt°§:·Þ©{TãqÅPTªÞÕÓa¾¨64B»-®IÃ0!Qã ¿"¬$ÆõBFð›ï׉ÑÍK¼æËS¸¶nÝú*øøAbðmD¤‰ž!àëø1ù|_Ç_¯ï1ͨò?oP­UJ3ÌnÑ\Æ÷S4«{h3Q@Co %²£ˆZ4MûQ€M'öÈ‘clÚh•’ínß!ß©dk뱕DVéG} ‡d…ÌYéÞ* êèØû‰žãJë¢éPó Ìœ9Ó‰ƒaè D¸¥vða ÌáÎþT1&\f÷ÿg“=ñâ{Ibý ‘˜]— ›3«ÝùÀ˜Ûl¿™výeùvÆ í¬·˜ýûdj·Ú$Pj+Wo“ ÁmvÌaÒÉã )ˆÔV(¯' 8 <±ZND”½Y>ÚþYN¦ ˆWÞ-TX3ë” –)8jd¶&mmÙÊJûÑ E¬öçn”E‰tÿÍzvmmß¾ºRR8[ì?¯t¶Å˳„DvèEvÑ)k¬C^¥'³nÅH˜•÷$ é•™6nrÃ[Àì…9ÖKF±/ÐÁ#I z^-B† ŒÖ"ÆLt-CÀ4*ˆM$¸îǽ¿ÄRk¸ö°ƒeÙ_ÆëÖl°¶ËÖZöÊ‹lkn¾-?u´-ºô\Û0üg8PµŠöyò,P`>“`Ózë¸t¥\ý ævhoÖ½«™¬%Û¯î°`šž‰ ky¨Ù×®u@3ƵÜjÁ/o³à¡ÿXð׿™-–ØçÒe¨~§Óè˜#1EÄñ‘–A|Ÿg$9:¯ é—÷÷ïxë@ÄÕ3xGê’y6êÚÇîT;'ìþÃ|L",RÝŸ)¦uÿ“˜ÄF¨ºW1úöë#µÓP Üýï® Ž#U <'FqØhšù¯:ßž?‚ê×׋Ìé—€ù…o”‰Fß.y|;¢×üx8rÍ_{«ÿ/m£Ê†J[Z ÎóÇjÿoK7BÁ4Àì'š×ŒF˜Û=®ÉT0˜´¢GŸŽNy>ߣõ:$Øù U``@YØoGTˆû‹·WM–)åþ%aDûpÔðãl¤5ÌL˜…þ+"Íè²c0º~µVj¢ ƒ åL~ë?–ûÏE”×mw :´²aûfÚ€~™Î^À³¯ËŸ} ]ë\»èÌ<§À0!lóÚµ¶·Þ/‘Ü~³óNÍuÌ…Ûþ²Þ¾y«×üÖv ÚJ6@<°ë !XXXèæ~v%ý¼úcCú¢.Dk†ÇôªÙy†ÐˆJÅ®%êçžÒÎÿ –lµïüb›3^À[nìhÇÙÃ>žÓΞyÍÄLA´Þì›W,Ó|WcD3çå8ã€Ü# Ü––J$¿8ÃÙøð“<­‰¤:º–¹ú ™‹]ÕQb>¿ô‘y‚‰ê ×’] ÆÀšÃ\`-ü€ ÂW¢¦é²ò޶rôq¶näA¶¹[yâh[vòh[|éyVÖ¥“ó~’óù2Ë]¸ÄÉ=• qÍ)*³¼©XP¦ T¹G²¿=lvß?-ø÷ãLxWĿ濵<4|çëy˜ÅÚì¿¶à¥'%"#ɘ-’ìØ¼Æ‚©Zð‘ïÕk%%ÐÙ‚^=ô»šÎ”^g:Þ@°/\¸0%Œ,ÖfÄ?L˜e¬³g¤‚Q–Ò‰háñ­Fïÿ±ÇssšÄp¡ºè”&ÑFºjêgÀ>©o¶åµLî+é)$Ãñ¯Ý¯à‰`6„6Áá‰éð¢®û„;†ð“_êáÄ©tïáàþ[ãqaªùtâÑ5©Æãƒÿžø²>¿!Giõš9 `X³…4ÀìGšýä±ôf[¦ëØ3؉L&x å´MGÛ® 0‘ͯ² #€Z´‚† Ò.Âp0U?.O=‰è–—˺{Ä@mãñcK3üLÔ~„@Å·3k‚.l*DËkï­~Wúõnc_8?ß Ú·–ø+êY"ü³ìÆ/u°Q‡Öýö‡µ²D¿ÍI\tFž Ù§Ívl޲͞ƒæÁmìÂÓrmåšJûõ_ÖÙ¦ÍÒosàXI´“u|$’  Þ>»ÑìxB¸C0òNìê¹ÝÙhƒ>°fŽ!4O˜©ØM¥oxvx Ø\s ˜}dÚw¯ëàu?ÿc‘-—JøÉy'm²!ýÂu?æ»í혜÷ïYbGŽ(²Cܤ]ÿmbâd ù赌z,BÜùúô5S{džAœØ„À‘ùÃ1» É21kI›¼GèKÃ`@-€5ñåvw7+•…ÿ¢!ÀÒ^Ý]‘V’ŒBM Ëø÷mŸþmíæ-Ö¼Imåÿn±¶…ûXìõ·M¦Ü¢–K¿b©’z1fÄc}lÔ‘f_¼Ü=öÍï[ðÁº&Ñný-vÐfÃÅàÛ(•€•óŘaÁ:IFt¢Tr¶^SàVóÔSOuï Ï1j‰úû  ïíÀ|C-û¬3p k•»ž±cÇÚ<à4».]k q§ìvE‰ž¤C ›k4žÂ6¦FßcðáöØp¢ÿÒ³×·tM*5 Âá²ú. « /ÇîÄ¡ ¨„F32ÚX×.]Ý÷I´è÷žv\[ñNüwÊç'žó á;–*&@šPÓêî4OQû;-ÑÈÓ 3jŽSç «‘¬9›÷ €drpqLL×”­“8ˆoB@züíÛçK烅 €êú0­n[ýºFß­ €ê2‰=UŸ§Õs±³v1!ŠÐ‡mi.¯ úÕÖN>&ÇŽ=¢­\Ì…Â@›‹·ÙôYå6gA…UȸÏO¾ÑѲ2ÝSu»?*±‡Ÿ.rbÿGIįù×&›4­LÏ¡ž?•_Éž£Ø>ç¾=ÛXÇɃ\O>þX"gNù°C¬Ã}OQC;¼WìxònAtÂP«ØsÕDEШ¨F .qޤ*=(ÛyQ¸K*/Û¢y3y^hm÷ÝÖÛ½«ì‚ ¼ú^Gç.ú] ¶Ú×/]fû,±¾ÝËœáÀO¥P"Éu›ÚØ1oÔÜG±¨ÈR˜ôˆD¡g€òÌC´3næ2Ùà×›ØàFiMŒÔ= tGk2­2§­ušü±õxý YÿÿÜ%-çêËÌF ·à{ßWeÙ®ÔIß½|² žZÛ<³/]iÁÅçZìÞ-xæ9³âÕ2ñ5Ôb?þ¡wÝ&wG˜vŠ“dŒÐd; Vª¾O Caa¡³Êì >ÃZ¹oAãâà]À íÂôa-Èã=I‡Úgi½¿ÿýïöì³ÏÖ^¨nW¾§b“A¢Ó¡eÍÀÕNÿ–5¤Æ—À`H`Çzýÿˆ €ÿnø#t¿ûZù£/¨£Ã8øÑ5ó0Q€!À÷…vþHšoOb¨ézÕ 7à<ͨ÷¤I|Î~YïZ)¬!8@ Eè° Á;’ÀÇWÏ/ãÛU€¨¡-vŸgÏží (®%˜7TÊÊcöë»×;£‹´ù³ït²ýç¸{CÌ‘9¾ýr§kt{áÉ«mŸÞ¡˜?k±~S†½;¥½v^ë׳Ô÷/qª´ÅuÖukÈI}ðóíÏ`GÉ ž}ÖÂñÉôNÀ)-"ýñNjBøB WÝc»RrØsÆgÖjÝ k%&04Øw°i Ë‚ƒ‡Y ýý`œ6W?nvE‘ÅÎ?ÇìjíþwïföÔs¼ù’”JÀW¾jÁµ_p»üu{HÒ«Ô¯Ž³ xƒ%’$8çt‰{ˆÐŒ9>|¸3ÄñÉsÌz¤B¢…÷¶x?p ““÷‚w$YFY3NY£výè£ÚC=äÄ™“èèaÕ½_q]m¤«6Þ |IM÷k¼æ[NËN o˜ NÉ‘X±­O”ûP¹c7@yq|„­*¤°ÐF]âQ€èŒøoÇÃæÃÖIûë>]Û¸¸^×@i#€u­ªrÅJýºê¬i€Ùš÷üf˜ûÝ®ËT2¸yO¤pÜYôe2¾ŽŸ<ò<c\\ܪ Còâ-Âߢ†ÿ:]CñR²Fæ¾?ßGMÇui7€5MK­yC/¿ü²³ 0jÔ¨e°¶AC ¾-1þ ‡Öã$B¦R Ñõr{ðÉ"›ða™³°ŸÄØøµŽöë¿®wbí¢Ý:·vî1Ø£[+›¿HÏ—˜òER 8æð'_[¿õÉçùf×ûH@Âð„'m%¾3õiŸº500á qELÅw†<4\~Nž$Æ[YIi̾smõˆ¬»je³Åˆa †ô/µóN”‘;ÂŒ¹~鎶h¹¤ä`p¹ .qt…õ3ìýéyöÑì<›¿4ÛÙ èÝ­\Äx}f îeA¬˜Bv†`ΰ6¬…·ààQݛܡ$÷L¼OHÖ ÞΚ#Yã‘Ì*)ØÖFðn¿ƒ†›4^,‹@+¡¾x¡Å6—˜½)¢Ñ³Ûþ`6öuñÚåßOâýßû¶ÇŽâ!’±¿Í>¥Ödeä³óϬîŠI•.¬½óžŸÉp ¾¯ú¢c,Tj¾ ™c=Ö0±ŽtK*Y¬?ÒØÏX(»¯Š÷Ã5¸üÀf÷„ ÉÜŒUØMŠŸ*î¸Í™LË麩š½ŠÐ5Ôî?0™oU”èf’«ˆîúwÌmåúÿªu7u¨ª02Úd8¾ÁØ…‰~OªÚ¬ªöí;š¦¼?'lHKÔ{7«Æoë]+…Ò Ù6Ö|vJáœî±My@²6˜ O”øc2“†(&v‘mÝЀI 7€`»Dþ!*\ïîhKÜU/àǶ«q¥Ý6lÅ Z &<ð@G´ìjžÖKjj¡«¾¥d›ÍšWn3?-w„ÿX‰©?)×€ÓÄà›9ò@ìh÷z›ýõ_mó>¤1»ë»ˆ¨Í·£mkƒ ³ì©`,pÕÚ Â^Eо9±Ø¼…}Ú$=`ˆtÏ=zØ AƒQ‚Z„ Hødæš6èèUs„ȈJ…X50bÿ,;W†£öÞ—êÄmb¬òÄ øé2†Ø©•#´‹‹Kì³E™öÔÚVèØ¡Â¹ ,ȯ°?kgO½ÞÙI,ø¼­-Xšc3çµ³‰Óò¬}n…<h‡º†°ðs¹~[•i];Jw£Á#UÌ‹g°SÃü¡;îw‰ÐôvUXK"†¡0J‡Á@Ô`˜Ë|`ìu„ç/]½Ö3Y/Ýõ²uÚÜ—.ëÉÇYðÝo›]~aø 3zOƒýÍÞŸlÁÒ¹â`-´Ø– k­wO1æXðSI3¾7Q…7[¬›¿º; ËWг“»³rwãŒ3ÎpÌÈéÓ§»¹â9ö߆†vÊ7‡9‡)ÍŽ7Ò0¥yxf÷Öðúë¯Û<à¤/’˜ÄOnQ\šDéª?ש ‰íùØî$òsÞ&üÓ„ÈæÝ'úïÁv3REýGˆÿ8ÎÁÁΪ©¬…ᘹ= Ú&ý|þHž'úËøò“ ^ ͨó,JÌÎî¬séF(˜<ÆÙƒjâ&¿ þö `•ì¼z@ª$¢„¶OGŒ×Ÿû±s 3Ž“(ÙÚ&D;®e„L_Ã€Ò ˆY|·W«$öíϧ׉»b…×½',Ö­jƬm²·Ìñ­·Þ²O?ýÔ†êÜÚ%ÛfcÕçqcgúb¹Ä€Vë1ø¥‹ÛÛ5æKW=Óž}u‹=!©Ä×óóZÛ½¿ìªç¶zDý·È^{'ܰB´½w÷ Ô?Óµ·v}¥-—ÂbI?*'%zê<¿ìF‚  Àû !‚j€þ=ðçõ=‚€@`¢ÿÌ4ï!ýB¥"d¶ie]e”qÊŒ2Û\³¿j^Q`ìø|wr+{ìñ:ïÕm«6j¡¼ dI% “-Y!Ƙ#öÝl_½d…8h‹õïU*/Y¶j}¦³ pÐà-"«GŠ'‰ÓÚ‹¡)ÉV6s~Žp®«ËÔ7ż0>ˆ?EÖ„]#Ü¢²ÄµdwŸmÀäAxÈ®3}õïßß‹Dž¾ªé.r×wÎ9œ}šÅ0»è³Ë.6»ù&g@Zl•p”©²ì¯´õí ]?/“mƒÙ³,öü+f½ßìa¹ |ó 5CO;¼_»Á‚QGˆûUû³ûûC<ú¸TÄPk+q(ª†× žá‘#GÚÑGí( .tóH~2yæ= ø÷IÿÀ$Ø› ¯{î¹ÇžyæG %qï?PÝwÆ•K¢ãtÕzÍÀ—UZÀbÏÀò¾’ÈlÖ³ëºd—=Üýßñ;ñÌå\$í2â?:qçñ_rÁPÚäóý6a€o,ª_µ};h?¢Ä¿ïßçùc´|CÒi@½g Fæ_ê]+…"èO [ݽšÒ6‡ Ú½†Ü<£M5€»)Ú1ÜZôZme(În‹“Õj€®—€ @büÏýôòOŸ¬ÆmVzNm]ûÄÀ^Ƙ£©þ©â‰ŠI3Ô†a” WZìLöìÙ³EK û?|h––mÇÉ[bû£[D˜Þü›5¶Zîÿbr)yËŽ)ÀýŠuýº­rºê|Å¿ry{ûæ5ííºKÛ»ÿw&•Èz}Ì©œxT[YÀOŽø{ yöÙyDü{È!NgÑ}O®ì콊¶USšº $³H@xrC¿µ!'5µU[ÞÀþmìš‹òíðáÙ6¸0$&Ám–.Ûj?ùÝz+’+ÆNbÌ\uQ's|?©Ü^~·ƒk®Bžõ?``±ÖªÒ:k7¿´´•}º(GëÖÚ†‰)×®Ò•-+oeŸˆàkRÎc2èXi—ž¶ÆzH ¹fn@yÞ!Ι#¼À¼äZ²óÅzÐ*6¨Ú@tboÆCx¨òˆé‡´`Äì7ÄÁM—¯JÁ´™|ù[fÓ?±˜Ö7øúu®\lü;f«WÊVÀf V-¶`“h2‡sJ<¦{_³ÓÏ´àèÃkìÖV®2û×c’2ø³ ã$50ÅbdAa¡TR÷ü×Üù޹Ìö`–Í™3ÇyÔðߎK×=‡µ`Y_Þ¾S|g¼Z@*$@ê>šæ+ùä“O:ÃH©$^RÝß+®O¢tÕ¦™ëÕM¯¦éªy{ž÷ctG#€ÕÄ?ï¼'º9ºÀÁ¥Å C?ñTŽºRÀ…­êȦSFëP6aˆï‡Z>]Õgììý®k—‡T½kºNª÷ÿ§È–Ir"#£•l,´±K$¡‘•os–Ðb™lÐUJ"£•Mž™gŸÌ˱³Ž[kDzI.a|@ßV¶•G: ëäI`Ò íâèÉn±áC°Ñ“ºà‘.¤`¦"šß«W/çÚyãºß9N¦WÏHÀhãüc3fŒy晎9Pßvcbt ˵ßl³3-võ’q¯h>j±l1 >œ¦Ýÿñf“?Tó‚¥24Œ9aÇ®˜\ô¿/ò¸Ô¸·¬óa¹<Ü‚UÃ(‰ç1l¤þ¿|°Ÿ{î9ƒhåý€9Ìó˻ŚÂƒ€|ìŸà eðàÁŽñ™Lûõ¿Ë¦­±`Á;v¬3˜DÏpénWDd6Zþ 4ücÒòïm»†øbƒ¾é}|…ùd„i—ˆÿ¸käsîëÄÓa NÂàÐX‡»†SJÛ„Ä]{Ú$D~ 5å¹Â‘òþ<™£ï'™6ö²º¡µâf¼éÖÍØwKéLåЖ2˜–<U8©Pà>£ˆO4íç  $žSŽ<8ìva,$ î3%~ÚJFÝ~?ðSH¥£qä2©!® —6Ñ@Mcòcà ˊåB`÷ž°L·z·âûŠl)¬X»|¯.Ö5 B>nÜ8G ‚{‚²®õ›³ÜŠÕ6YüVù?ûv ”h¿K–WØµÆæ´mm?ÿNGë%ñ¶f~V&Ã|bŽpʱíœZÀ61¨V¬®´ÙsËåF°ÌyèÞ%y^-ï.Maa¡ÛíDd£e<û;{ÖÝ€ëðãw#CÇÒ:R9£@© lýôŠ;sÏfõ7®.p6æ-Újwüýzsö¾p®\0.­°Uë2œÀfµ“ €LÛ¸ãlÛlÔAE2XéÔ>ž“kï|$¸¡Ð¯g™#O¹mCéßoªŽŽA"šÏNâœÀ°Æ°€.ú{ï½çÞ/`x}BÐEöqß(1ýùÚé׳¼VžÜ_.ÿ4WÃ0;`?3©ïˆP¼ÊbÃGŠ=xµúcwìfÁ"© üÝb¿û“k$×Éb?—E‰©T—o⿺s1æÄ$;餓œ¤ jJÞ–B²ïë lã{…Ç$q!î©áÿø‡3ü‡ R¦ó¿C=ª$JWm’¸^½ôl’žš¹$z÷é%Õ¿©@¤ómëöÇ)Ø¥ŽÀG+N‡—¸¯8‚ê°V¥Á9ùÆÂTçÈ7˜D›>úé O‚Ï÷càܧk”Lð 4à˜V¨÷¤}¤ÿ©w­VH3äìHóyJ çtmª±Uf>2‰‰éÚ&–çM¨Àµ—EV g¦,µµ’ÚÑÒ®Q×L¶Æa¬¤¤:à !߯«WK§ÎÀÞǸOÓÁv÷$ŠТRãBñí·ßv»d¸êbwtwɲ«/ʳ.2àwê±9bù'Ëì¿\c‹>‡¸6;ùè»æâjQìR‰ýÿ¿?­·%Ë·:—€£jggÔNª1{à?›ì÷ßhÿÐñíJíå·Jœ;ÂA…²Nß)9Í3 !ÑÁ$Ì<ˆN¬ÉƒvöÜïjM¨ ‘ƒ±;; µ³Í{EÒ0!’ Y2Êxáé¹Ö¿w1^̾uM(U±aS¥›Xbå¶ñ€!ÙvÃU=ì‚19V/ƒ‹³¶‰øÏKG) èSj'JoÚœa½ÔÕ©t)Ø*7‚›lÿOk0ßžA‚Î~×®]ƒÂЫix¦J2sÆÜÃŒ €ˆ{é¬b°NA"§1!³ìî›Eü/]b1¬`Nšb6¡ÜþÑ‚–Ý?1CórÍ~þ .:'´|é &U»öë<ô€eÝû›ýð[f×]eAWÿzFbE’¸xPm½ iïÿ­ýÞµÒ’šA½7¹í"­5~©ìz衎`G|µòï†?Öw$Ôãý §M ²ö{bxÿý÷Û?Œ¾&Vªî7?W T¥«6É |U½ôh’žš¹ÞÝÐ €Œ§B\‹;íŒêýæçÛG$øï«{Šy’}T"|°õþ»òü8lB?0œ @†«Àöh ßOûsÊù4cóÁçùó†Ó €zÏÜ»ªñ|½k¥°BrØd ÒŒMY|±ûßmºö ÈT…]!R8ùcMýVÙâ ²š/Qgg¦-ŒWA€@]_ñtZ)¥|]€v”@?;Û^È@Üá^æEA€-Sä»ÕWj‚ÉL*àÊ ‚qÞ¼yŽXÄÛDâ.©©rkù±?P†£ÄÿËoÛ=ÿÆ€\`ùr'øÛŸt±ù­Ü ³ß˜Pl÷=*Cjšµ}¤𣯡Øí÷®·??´I†èð)ϳ³òŠ˜ 2$Xb ZÙ@•G„=™1Aщ!F.x @œ1ó¾íìùßUß´ÏÚÁØA[´x®'ï“i§q»°%ŽÏ¼²ÅÖoÜ&·x1.ã=ºeéØÞ®87[Æ™¶ÚG3Bdì’1+­KA…»Ï Ó:Èê®ÔÏcvÐ-vÒ¥kÉ£Ý4¹†Ðg=Ð`M 1úáÎ<&;_Ì=íàrüøñÎcaaá®%34®`„Dú :ÊmàÛr¸Ì‚‰ï(JìÿÉg,˜ñ‰ €¬þ版¿GB_¸<´!Ÿ:7‹¿“à¦ZðÞ8Zqla±[bÁ _¶ .ö»_ÿOÿŸwß'u‚,˜:Ë‚çtœÚ^†ò6 ‰jšE‰÷£dôèÑŽQ†8;Œ2Ï”ièûÁw†6PË€Á°'€wß}·=ýôÓÎEe÷x‹ê¾ªã9vØkHp9 ÁíÜÆ™~ÇÝ/ßHþðO¹HB¸SÂýø¢:‚¹rÀ  ŒŠ!Û©Sg?ðøß)îÓþHž‡?rͧ¹žlGª0í Î3‰Jí›u.Ý›ökÚ7‚&µÍ`?JA;{|ž '@ùtâ‘ õy~r}óÒW9@IDATìšÁhŸß¸)ñ`y€*PtG×5É ÞV€“¨Ðnmœ°Jì—ZѰ—3˜ lgLP†§¸=+Z <ŒìŽñãYKÅ®qCÆÒÐ:••1ñm®DÒùœcàœ“«w07j§úæß¬µu¶YAûVvéYùvÌaYöÜk[ìöû´;ªÐ³k†}÷º»ä¬<;ö°[µ¶Òæ/ÙjÅò4€ª@¢-W©?"‰‘N:ŒŠ•+Wº|ÞÞ¯Äw®>ÝÐ>‘6YWŒÞqΚÒo²×Û‡ì¬VV ƒ€“§—É }Mþ–’J++ÙÓ/—J¢ƒŒ/J»M¥8¤µŽò.PØ}Oö˜w+ܯ؎9x£¤,RcøÏ«>Gvž™2=zôpóáFÄÐY›dÖ‚qÀH Âd{÷]6 Ä€ÚgŸ3˜cŒô]|±È0Ña“çÊPB ÊKͲ´{}äÑüDþ•—…ȪkU?Ÿ/7»ë>³_ü΂e !doâô‹,¸÷n NȠݵñÊf7þHÌ„ÙÂRaФäuV_J¯žkÁ3ek½‡b²œé[oÒ#ª'Ÿ|²{n™;$ÎxŽ õYÿ>!Æ{íµ×îv°­®“þüóÏÛ?ÿùOƒi’D˜¬º?U\ŸDéªM?0º7}·Mß#}P¨ï9Oqâ¸Í;O$„G¥9uY! ¼æ»l]®ú´é#Gæ# €Î’à[ –û¶U¤*$æyBŸüèµhºªri@½'î.Õ½ùBšîfþ¬ù–`÷é€' îÄÉ#O>í5]¯m¦°:êlÈ `LØ©¨íL¾=G(苲†6.?¶šú/ß»T¸'a.ÀÖ?Pœ£ÈVVåŠUrI€7ß|Óí†b˜kw ìÎ9®¬ÖgÚôOËíwÚýo›>mâ1Ù/n–ëÀbfCeÙn(0ô×ïzp£­”7òÕÖ¾-ƒ}{¶‘¨»,íËÚýûÓÊœá»B‘;Â]…rÑj=¿ÙËØ`†¤ vx¯Ñg0`€á#F „'ˆagïÂÎÚõ×hdûèUcs¤Ri C^+Ç,™1»ÜfÌ)·÷§”Ù3šë‰–ÚÔYeòÐcœÞ^í: êl>%ëÿs3¬C^…1l£¼Ÿ¬Ú;`áGÞ´G!#$F’Hh§`$;FˆWÚÂ>ÀäÉ“«;½[$«Æœ&FÀ¹ˆ­ÈÒÿéfçŸeÁ¿# —"ΣRK$±ýç¿[p»ˆý-²Ë+‚þ–ŸHEàÇôïSƒm¢ÀÇ·% °PL‹ÄŒˆ]p®˜ —Zl´ ›õ/YdÁœeer¾i;^JGy;fc]dÎ÷Ýw_;æ˜cœd Ï2sè¥3ê²&¬/å.¼ðBg‡£±ÆÚœíòœÞu×]öÊ+¯TÁŽBršb„ØHºZ“ÏÀ ê1i#ÁM>êtè˜ç}zË `¨º¬ýwxeüê`;4~Hç‡<¨}"?ñüxF|4!ñ/ JµjílÆs¢ñÂî›ê¿!}Œ^¯)íó’9¢Ã#-PçYü¡J†;>u®’Ú‚i@8Ÿ·ê°s 9µó¾[¶–J ? C5!NÑ|Ý}]ð8ÀfIˆ/€Mvƒ¸ €°=ÕP„8X/ºv:U¯BÈœï×]á~Ö¯Û°·1ViþZÃT€œ¡§ Çÿð®78 ¢çÙgŸµI“&ÙᇾÛËÂÂÿ/ȯ"þÁæÌ/³ŸÞ±ÎP£î,»_º¸½ Û7Ó&\fÿ|ƒ€úü øtþV{ï£RëÓ+ÃúôhãÔúo‘j«b.ìjbŸ»Ù~y÷:û›T ò¤†0l¿¬Vᙇ¸d÷y¿ýösÊat±kO™ LCua ê}¯32ÃN ×’ ¸f<áHYÙלÍY°Uš¤Š·éÝŽ‰ÁÑÚŽÙÖ1U`Òà ðágÊÓeô¨VvÊÑÚØÎÜêÄ£ãH枣íÔ'íçF»KØÅ`§U "°-ó#k÷ØÀu 0o5Ö ©®2>uø¡"Õ€ƒ‡…úùâ?¦õµo}߂Ǟ’œ¤îoöµ/Ypów-ÀN€sæ9£€öò3Êi+öa[‹ýY¿|•dŠŽ´à€¡ë×WÞ>³`¥ð¤µ3g)ã½| Ír„a…} –Â|FºÅ3PmÏ kJ€ÁvÙe’–Hâ]r µÐvþñv€Ñ$Âãª{§bIm¤«6Ï ìe Œ† TIyÏaœûȹ÷C¨Ž*èY—]3÷¹GF`£ŒZ‡ à6Ìa/Yݾk͵í— _&1í §à'ͨ÷$ŠsÞ¼!Íçÿ’WJmÞµlôÞ½€TÚ`ÐuE„¢Ìß,yˆATy€ffvÊ„˜’†àwýÄÓÔ9ÿ m @)SÛØœÀ26Å÷šP€ (V«ˆ¡¦w½=­Bu ¸—›0a‚#L@žSAøÔµïT–ÛR²ÍîþçF›2³\÷ ‚\„ÿ÷¿R gLRÒw®Óî~…$2í¤£rlÞâ­¶xY…=õò§ÿ?I…˜åîyE·}øÐóèÁß+‹—mñk6^Æ‹$E0rX¶tÝÕáNÄ D®‡ æPˆ¤xxçj{/vÒlÕ%Úg a, €^:ÈÈ Œ€(1UU©ž‰}%!qÉY¹Ö¯W;SÆOÄб¯À:%;_¬%ëÚÍ;ï¼ãÖ¿K—œZÇÄ{ú³_ýÖìáXPªç¬³Ô~ós .9{C~šS{]6~­²å2ˆØÿ¾köÕke@Ì‚˜ÁàfïL´`º$%KK,Ö·ŸljS“À¬y‘š0`Hóøã·nݺ9É–ºØÏ€ÁvÕUW9ɦ&j“uõÉ'ŸØ=÷ÜãJItZªº×(.Q¬¦h’h0]µIg@×&í±™:÷C2¿}ž`¶HxÁíJᑞø÷* /Ä_ãD>žléïÒœ†ø©;¸Ÿ qû#:vr0 ÿ]¢í°}*„ß-Ž>ŸñøtôH~ªBZ Þ3ùóz×Hq…ä·\R< fj®Bý¦™!Í4ù¤D‚‚`ŽfìùéºÜòß4 lcÿHqx*§KÒwÜq‡MŸ>ÝÎ>ûlçg>•í7E[¹Ú¾á‹l­ ü½õ~±,ÙçéC®Íõ"€xFõøàƒ*⸦÷6ZWiˆ!¶Jåã ƒ²C9Ä©!°»‘lÀNÂ)òÌV‹øGšâÝÉ¥Î5ãW¯ì W€177 tÜsaa¡ÛiÃKÂÊU°Cç˜ ´ÑÍý'K|Ó–e> èQÅ` HbD |rÆâ7bÄ'b¥u@êxXI›õ Ü‹g¬½úê«nO—ˆ?ðBØeX®Ýù·eðÊ«„}OG’VÐŘ]¦˜V®6{J‹Öé±—H?6~ø½ÄRáù~ƒu”*›Á:nÕçºMuY³ÖbsÊ Áf±ÅìÕócív\ó°¡Æù=úè£íˆ#ްçž{Î^{í5§®á{òχG´Qg‚™³§†ÇÃÝ»m¢­<0Õ59ÿS€+L€°eß_Mýl—WËX¶+³gÔõ£þ¢n»@ñkŠCScx> >gÏžm0ðÓ}Î9ç8±hõ±Û„ÞÝ3ìž_uµ¹ ·ÚÀþmܸىî"ëþDÕ.-×®t¦<ØÕæÙoþºÁÆŽ ™§Îq»Ö®p-?‹—ÉÞ{%¶||ÍðÁŽé¹/ì‹-€Z*Õ’Í;aŠôÏ\`09ìôùÝÚÞËZšÜ!""xâĉÎM–Ñ÷ß·¶µŠ£ïÐJÝ2ÀÓ¦~Rf¨G¬ÛPi_¿e•ýâ{dh1¾ëo†{òFøò;ô²Ù‹7ڢϊm̱ÚáÙºÎI!€¤8Ö9ú@}`‰>M>D!*Kìð3·^ߟ{…ð'¯¶9%• 6öìÙөƼð N’é ˜¾/ßw}ŽÔ¥¤=yäg(ðüóÏw ‡ÛáQ¹ùÍ^|E°žÓö=-vÀ( xЂîµl®áÿ¼Ê[®Å‚2 ¾'p‡%1°CõÁDå+æZ°L›Âqâ?öÜX ~û[ f/”ù€2‹u•§‚ö,øÖ ²M U&dÀ<9ï¼óœ}€'žxÂÙUà™öuc}Î:ë,ŸµÇßxã èI",T]TÍ$"’»é ÔŒ¨í¦7S—a‡¤Hô{øËѧ]•á!žàÄ}#BBß]­*Ã5pT„·:&p=Þ®?ºl×NxsB”IàËú£¿ÆyªB*ÛJÕ˜Zp; gͪ1–fJ³àê=¿YG°tîURe[1ÚYôeüôPÖpª½È•~dбƒéTFÃ>T3^ß·C@þVXΗ¾¿èqㆶ +×{OX£[ýsnÄm²âgŠRþµ^Š) ¨z 0cÆ ·k V'qå” 5 u”µúhÈÐÎüÛï—8¢´µļÜVòfÑZ»‰1;õ¸;÷”\›5w«ó(пÜV¿Ñf\[o‰PRºÍÑT•"eïÇ7t±¹cEh,BäÕ 3"¿¼^"âõt|ñ¼Aà]ôïT¤Z“¾}Oì [ M~ªì0îU‹ÇeQgv ì"\wi{ÝÛŽó–ìÃé¥2ÐXd}²ÍV¬•kÁî=lÄ]D¬8Qnˆn$ Ùµ'@ÜCès ‚šë1˶»YëŒ8 ösŒž_võÙŧºÌ#m#­À:`×¥ÃýE™n@ øa,¨i e@ÛÀÿ2Þÿ|Ôì7±?Áßœ\³ûî´àÒ÷ïÑ­Ö‡*ö§{-x[„}Lj%£FZìWÿgAMÜ©qãÍþp’ŒÑÄYìy ØWó˜}çÇLxC¼]Ó8‚u-X¾ÐbO=föÞ4 † oäCÖû¨m R+Gmâ˜1cܵ&N“uþýïo/¿üò64ê9ˆU~‚bê(“z ]<éø†Zèœt+»AÀ÷>}{[nÜßAÿ¾{É.§:Z[?y¸} Ÿô0ÇÇ^8(ó ׆õd •sÈ7ÂôíG§‹1øÀu_&šö×SugS m°N3 GûWu*Ùˆ…¶ÇB±£Þô5_Ób -|Bjžg4• €(Ðb<5!Æ”X¨² ó|¬D @B°´’@ hhý_ åÓŽ“¨òGµ½Mõm¸r*SS1þüóe5]ÚSóÖèÆî®ÇÍ-PÙqŠYŠH„ÛÝJ¤"@xbÁ|Μ9ΘO¿~ýR"’ŠñÕ·öù­lÝÆJ›=·Ü¦h‡úÓyåöü[ìá§‹Üîÿƒ³ì»_î`=ºÊ}]fÍÏ$}~,ë÷‘àN<¯m2<Õ ¹éwÓm—ú~ÀQ¹æ4âG˜ÿ¸t}Æ·WwÖÿ¦EöùRlÞí5a­î´> &F²Á¶@q³bOÅŽŠ) ìx¢€Q4ˆv(ÝÞÝBNv+;|x[ízÇìã9[E´WØŠU•2l¹MvôLK"àðáÙÚÑß‘€Þë½ÿÞdïM)µò­1;éØ\yh-ã[­{—ÖvÙ9¼Û‡Yó¶Ú}ª3v\‰ì”Ø oÛ>}åy@îAJx_j ~Ëôì@ƒt úËï ‡çjª¿«<ˆNú`‚†mCx²»žl€‰rÔ!mmP\ £¶ö„oÉb¦³»€«ÆÏWT8FÉ‚¥•n𬯵ñóäaã' ºû¡vï#›ä’°Ô6mÃry…-ƒæÅ7‹íƒ©e¶ßÀL碶1Ô%Ÿ]˜têêXõg]¸–ÌZÐ?÷C@UÖ¦»Þ3\­Š#dväáœ~ªGŠ(O@J]ÅèÆcO=gÁ‡Å™ÕZ‘~Á9ÑaúIyxèQíꋨl%Uk.·à¬1"ô¥®Á„‹é`C÷u}ÛÏ$pÃu2=ÖUF%ä5@;ïÁ*©ÈmVpîµ?È;öšÒœþýûÛñÇïÜb,pO 0àï¼óN{ûí·Ý{ŸÄ=^¡ºó“¨Ÿ®Ú2f@§–1”Æ…“è×ÇÚI½'T7UÙtñ*rŒ $À]*$ò!ôã1ä pâþ)MÁx‰àLqàpG$À€áK ýèÑDòýyôèëDó’I§õš½¥*]_|º^Ô¥pšÎÒh´…;›vý8©”ðsAMÌK¼æÇè˜glÆ €à .YÀ Nü»6”‡$Ä?!­qÀ©Ý@Ç9UEê&Ž!¬Qý»I;ÐKñu½÷wÕóv™\B§+"“ÖO&@|”JA€ÓŽ šiÓ¦U1`xqìtÑ$M †~”ÜÔyB;ƒ!0¨0Óúj·úš‹òŽz×N;×ðÿ}i³-“î^nkûíÍìÿXïv®/ñ?BÞ|¯ËÖ¬­´›~±Ê>šQ.¤%|6lÚfódŸàâ3ÃwÈ—¯éÈ;!ÈÎ<:é p–é{žä˜ôÉ;Ìú"‚¾páB§›Î{  NÆéjx=òpغu`Ý:·vꃵ&Î(3æé€!YvÜ5KUÐs€TÅ/îÜ`‹?UþÚfÓV†[_ âéaæœrç­ ·<$X$ì>³………Ž)î,ˆ#s™l ˜­S§NuÆa¸!åÀs —°;gP¹þÒ‹?·àÅ—5Iò¼²U¹ÇÊf@×.ÕÛ¿Àb×}Ë‚y‹9JePðh³+/–X?ÂDñ@_… 8Ô˜bD2&h „ÏJj@ /˜+ƒÃÍúzš'0ï»,ªÏLýõ¯µ'Ÿ|Ò1éêS/¡ì½:¿G1D Ó§»Õ |K£M9³¿%Îð¶¯\•æê{ÄN>ß&à>GŸvxªžj®Çÿu+<æaä7̯sZ¦â¤C ‚—píWUѼhš«œ'æ%ToÐ)x8ÒzIJ5¨ïݰÒ,ùþæ÷Î1Êæ]Óõ®ò‰M×ÝîÙScH0Qb;šö×¢GÒÑ «b ƒªó*!^­ è½Q¨{ý‡yWqçáŽe}l ‚¾t L¼½&h;­Þ ?9Úöw—(JŽ·qv0¬†ØøÌ™3q‚^*;ÔUâÊêxw¨Œ:8ÛíøŸ!fÀí@c(pgñtvÿ?qŠÛ¿[o,¡C`‹åµkeg”kûÉ&FœõòÚ»%öç‡6Øä˪ˆÚ‡Ðý?è,Uƒº‹¼C†ž¸ 1A21tï$e¨ ÅzbÿƒnÚ…Ma[×± О?&×ÊÊ·Ù™'¶Óœ²»^smÆÓ¶•˜Ù†ç˜:WžŸg·ÿOg€”¡=Ùh˜+©‚Uk·9ºùD¹LE`-`x5 Â<1ÓÄëItä×›ö`=ØÝf-ê´ÎLX7ûŸ-”¨þb|2Zlþɸn² [gíúK‡ÿNÙxï-ÿzî;J¢çú«,¸øÜí¥ d/"öá4©|bA•‰ï†ÙDü}M0^Ì…Ö[-vÙÈÞB:¤~>üðCƒó5‰°Iu¥7b’h#]µåÌÀ^Åèç$ÄÐ÷Èþa\È×? Gò+áþãô?Âüxvx‘š!æ úJ @ •Ö‚’|RˆJ¸ŒøýüѧÃq„×\ÿ¤õšPðáÿÖ«F#Þ9VÙ¶Ð&y+¾ÔBÇÖb†d;•þ梈cpùë5åùkìþb0 ‚PZ¥ kÑ´ë"PÔ‰öJÉ *i0³>66m¶%‹÷*ÀzMÓŸÜd5üçSU}J1_‰›pò•He€9ƒk9|ÌsDjÑèè3–Êþ«­ú¸ì{^¢û/¾¹ÅÖÈ¥`¿^vËìÝKeÀ®Ü©\pZ®¤ 2D¸ÆÜŽóo[ëì ´–ñA JºÞpSQ{ñy º%æqstàqéãeÅŠnǘk¼Ãɬ„+ðヨ`£¬/ºÖMÔ14ËzÉ£CmÆ£cA&ΩrIxÄÁm»AÖb˜äŠpC‘’º8ç”vNÕ#Z7™4s…î9¶1°ÀÜ£ÀœÁHf-ëAþb( LÄbw‚íCbþÍñR’4ÀÜ…LüPæ>yxÕlÎ<5CDýÛ7˜]r¾Q ®|:Gn/“ÉÑå}@Ûz÷ƒ›~bž @¸c’J¸à, ÜÕÒ×0¿ûÝïlìØ±Î«Eªû*¸}ÙŸ¤»ý À©ÔÝþVv~|〯9ò8Â÷-ÊØ^ÀùÀ$ Z$º“øu®pîCOSÂð4iã6¼ò*¾xO&íÏ}:ñèë¥âµ‡´@fói•z³N%±PÝ·yq- i)#¦Ã®f Y„Ñ·ï’?ç°¤}ý5Êú¼šêQÎç;¸Y<ÿ>øk%ÙgqQ=F`5d„å·¾4^K€»—…TëX‰úµârÅ«û(6J@_yÁ‚6}út7nœ]z饵»3k”4M£k×o³WÇÛ’eyÖÓü½ëñØF–¥eÛÜnþ¡ÃB]A¬ß?þB‘v+åj°“ÚFL½´´RzÿvÕðf’ …ì:Ÿyæ™Îêù+¯¼bì"¡áßÕd` Ä+íàŠÕˆZ\ü«ƒ5vÀ.^ê(ä€@œ¸êZíuâÞ*ùm‡g—YÏn©ÿ$# Œ#\,B°±c ³«õÉÚñ{þùçmÒ¤InÝ9ä×6ÏBm!¸ø<³!ƒ,ö?7[Luƒ «U” ‘ñ,+•ÂÐ`³ÑÇ›ý@ª¹²ÐÖ7¬þ¿£M”Y³UCÌ‚g[¬@[ToŒY•k£:R Î<5¬“þMé <÷Üs®¢›œDøDuÅõI‡=hâ/étG»¸¾G>RÔç|µ»Œù š åJu>YÑ€±êíÜR:Ò×ýÄðù¾l´MÒþzb~ú¼Éf@\ëæi €p xínUÜëW}Ao€¾TOà'é#J(DÓ¾Y•€WN²Ãÿ2yÖ’ºÿí™ ,¸¿Fš€@LWÅ·¯– ·lÞb‹-Žfíéi°¼;Sp“L7ÒH°U8H1W±Qbx„XDCuXgggtO >¹ÑÞ˜Pb›¥hqèAYvÓu?4ûýßÖ;ñòŽlkûζ—ÞÚb·+o¥¼ ]pÓuíµyZî Ûadð²³óœN{*æ…w ây†8/,,tFŒÖ¯géC¤¦÷¹®}S—nOÞvâœ>!J[Z®ýŸ-/Økxc‚Vx“7ËMc;© pU8mVyüXæ˜8.lh`¾Ø­‚A‚G`8y˜GÔ’ ´ƒÌT5Xtßi»Öµ–*@pÞÒÓ?Êbè®8=¤ï/‰ð;o·àÒ‹ÚYð‹ß„ª2¶ÀQÈ6hÇ¿g³Úí_¹È‚MR%È/° W'‹©­ë¤6pË÷å °ûÎoÍcÝ~v^:}U3€QÎÛn»Íþó¢Î œ˜«T&@:ì93ðmÝJ‡=çvj¿˜Ñý¤^„Ô“'¶yˆžÈŽ ¸»?‡hê‡ÿð@Òó‚!—æ9p/”2‚M¼s|S;H€¶Q»J”pÍÅá™ïßçùñù#ù© MKÔyF¯UÉò:—n¤‚©ßnh¤6A³‚M­«²&óÛ@*Š4FYm7]] ŠÈ1Y@°aÓ•è*­]­ÚZß>Ï{YHõ # p³"Ò7Âîmˆb£Ov¢‘ ˜‘6 Þ\@ò¹Oa»«q¬–m…÷§”Ú~µÖ^—§…•k*›ð -Ζæ·u†ì#the]:eØÐm4ïsŒÇdŸÏ [J@èy Ȱk.Ì·>¸[l•ÚZ#oûôÍ´}¤FÅÝzÄôY$&ÐçF”“àçÒ4ðé ÄBQÁá]Cdo´]×upç÷êÛÈ»‡cЬ“¡¿£“h·êQaCæ¿J `¥LfŸrR¨&P]¢:åðå‘f÷T—J§j™;î¸Ã1Oy¯’H}=šDýtÕ–;ßÕÐdåsÏ0: ôwêUà¢|Çÿ÷ß3‡» Ô„ø%ó¡”;çÅÉzÂT"Xr¨'8(j7›ªTh¿®^CblŒ•I¬ó¬¢÷÷Ë:—nÄ‚i@õä^ dßêÓt*q< ±¼$Üþ?Ìõ˜]^´S¥KJKlÁü… ¹{ôic2˜8°ÉùŠ¡@+6ª¢>„ VêñðÑG¹4¾ì…ÞÝÂûfº]aˆLI?Ûóol¶Ys·  ïäì“ÛÙ W¶·÷ͲM›·Ù7nYmø¡ï®ä¯é !aßA.Û‹Å€à‘‡dÛñ‡·uD쉯O’ËÀly Ø0ä“›!Þ)ÜÆ1Âú÷ïï,ú#†Nà®é«kÔ…À„)´Í9ÞÓ>Àm÷¬·žØìuÆ aß© •ó€ûÀKÎ̳k/nožÞή87ß ûÈ£ Nú¸Ô~qçzÁ0ÀÀ.8­ýTžF™c£GåÈ=c†½õ~©Ô¶ÙI!7‘Hn¤" åD%ª0˜3˜d ¸\O&øõÀFÔ)SœaNìÀ”©#<ÌüÔ‚«-X¿Ñbx`)¯° wO‹M—Kå'³`ÜfI©üW®6ˬY•ˆe«šž™…šòw(¸÷d µƒÛ?$l’«T÷BÅf×MâÒUkŸúí®½ë¦½Â·¤! €Ð0m”ð¯&º5&Á’(À!ª€!Џ¦Ý1–Qºÿ¾´EÄl;§—žŠ[à݆èd÷tì4 @¨íÝ«k¿Þ>nÇçD–ñ€äýq=•áÏÿÚhxY¨&%©OäØWÅxÁîBmaáç[í±çŠl­\8¢ú>d@»õÛ¡F_ç­ÓaÃ2íu{\´¬Ò1qü5ލ$k«b¤5}÷Ý×Þyç7oîHOx8í·>i¿ãÄH  N>ùdç:pWn ƒc4»éûÆe pž/<)Ëÿ[ìG?· K„þÒ ›Žr{Â1Žø¯^‡ø(y9C"ŸXf»sµ¸C£‰ î¹ç0Lxà'Í‘ä]~_õõé°gÎÀ^ó–¸o”€G"Á×SEàëjø\¾«F}_!LÐ’ôÿrôƒ'€°°‘~¢ýºêñŸh²|9Œ–M§›|þ?{ß WUý}¶÷ͦQÒ{%¡%z‘*M@ADEÿÀ"E@E”.R¥·¡$!!¤÷ ¤oï»ßïwÞ»3ofgfg§ìNy7¹sï»ï¶wï¾óÎ9÷”o;}Ä Æ 2H’Óà’d®]2Íxyp> ‘LYnN“:ëš¼Q¨‚†ZŠàT™L(ú“—jázVêé…„·üb8²Žß™²_g¨ƒ5µÕ«Ö8‹R=O„íŽNzHª¬G\€8‘§ Ãã¨N&u–yRÉSJ®K¦À¿ß,PýÇåË”ý d÷ÞÙrÞ©%jEžÏ±r]£\÷—íú÷Nq~ZžïQ–%/¿ì’ÿ½^-÷>^Ñüˆn[®Ú‡Â_ýÂ¥ ²xE#$šå¤#‹´ û{aFµžbÓ`4ïêÀ…îãøÞQ2ƒR=Ì[ïeäý“ŒÚàÉ6%HtR" 8-ø¯Ý?ȰàÏÀ5))Ê€eüVøËJWø‡FTƒÓÿbÍùœ÷¿êƒûƒ¨uöõà³å²u{ NäÁÔ—FA®§Æ¬¹urË=;!m¥î=7"È@é þí?^÷ÁÀXÞ‹6p?¸¯tÑIÉJfÐm$÷Cav°ÆŽ†Ç€éa>Äý·Áít+Êq Òʵ€Aº>x_¯ÛÀÁƒ, Ó—4›KM1Ÿ¨ŽOû¿] :)XöôÓOËã?®ê5Q<ÞhûË(Ú»M®Ä“OŒ.‚u¥À!ƒTªÌ×¾RèpEï±æuþz£)óA ¡ðCüUU{ºu+S5ª-’fãX ÎÔäõFœ~\ €°öÔ|!ìÚq¬è2¼‹»ÙéÞK7ç¿dPd³3lø,ÿk37–ð‰´­á.&¯È¤!ü‰p²Œ‰þHÚ€Õ¤ôÀzúD”æµ ù†è.¯ZE‰õ´ ä®ü­Ÿ–_1Ê„ó½¤tÎ"Ä~ˆÅ_\Å8ð"O(i(ºË‰æÇ6Ù‰ÿýq’ß»§ÌÿjúVùfK‹ägÈ÷@ÈŸxDtÕkäÊ›·Á tÌq M7u –4ʧÐe§-€5åÉ—èb¯U Ó'ÒÖ@¶Jüü·[äÑç*Tš`ŒÙE(ŠN‰€Ñ£G«[?ë¡bßúG8aûÚ¼y³ª ±oê1S声°0Â^­f„+»aO=¦†ódŒR‚vhŒ—ªêç9ºVf°ææVHdìã^ ^1uÿBùñYm¥gÂÛÛ°Ù°³¯þFÆ Õ ¶Â.ÀëïVË‹oÕ¨­†¯—7Ⱦcó<÷ÍXI¹ÎD.É ¡4Ucèi¶x/$¡æ@Üc€R†!Rí Dü?A2¦%­ßTà0»ð¾jc'Àuàm’1õ`Hx™#\¯6æ ê8ï;óþm÷R4O©œ›o¾Y½xðŠ"œ‰¶¢hï6Mü „^ÊÔ„aC† VU)â£MŒó¾. a82Έ AVû¦"¨DOg­Óš°— ¾ƒþ6ÌØ¬ÎÀk“š{¦LoÄøÇe„½ ´¥5?ìÚq¬èÅ ã8Hu}æê‡$Ñìã<Õx3ÜüóæÑÌ}^`Fd¨Q"À¼b0HÄgÂ_´±ÖïéÏÙ¿½Õ¬« ÓÔkÏ O'W­L+@5–¼+ô–xœº qâ,DXùR—qE0ø÷Db‡„ E¡¿ûî;5jT§’ÃóÅ%¬ÙÐ(·ã”Ÿ Ž'Ò7]Ñ„\†ÜùÐ.Y³¡IŠ 3•ˆ¥¸9‰×»šeÅšF0êÁ€M5¸œ4>_.€a:†?ܽ]ÖáÄ»±)vZ帩E²^(QàØ ÜpO 'Mš$T•€Š {|ç0 ÜþL=¶%IãƒDX¸Ç$lIˆÒ^,N¸BuâGp×W‰€ÏÔ+áϵ_¸hy½ÔÀÈOï ŠèÖýr±¾7üº§î™/Sº |6>ú¢NEý;°@Ž:¤Pûç}ö7{ïµ€AТRý¯RëN“ï£JÀú Æ>UƧH'×kƵŠf/8¶'Íý¥Ô a9÷žöÈdhc€‹–¿/øÞÎ8çt¡j@ëñÇBçÿÇ"×])cFzÜêsÚH°Ï3³gT‡÷YÏDg}sÏ¿,…¯ï½÷^yñÅUr&ŠÇ|m½Û49VàjL³(9¦Ý, ¬ÌR~› ³šyÞúO¯9€¹õß*×_«˜å¼© ³ ©ƒ†*+`ü™n¥Ýtœ`lDZ©^ÄùÇe„½Àç£fBØ?i‹©…ý )Yñ7xªèeSri ]ÙIr±ôO-­O­®±Tˆ<`feRÔ-ØŸ&øµóìÇôͼV Ìä}Ö}æÛ ¡¨FÀÊ«Ø2]ÅòoÃéMˆ”x‘Œqˆq…a$I$.‚r2ø§y ¿ Ì%¡Æýè*q=zXŽ=¥P¶Ájý­ÿØ)Í-°:? G·wX¡x¡žò/€Û9Ë0N¸{åÈå•IßݳåÃÏkå?ðP£Fë§‘—à)àkåcª$‚’x—¼ö^ô‚ׂ= ™Nà»ÇSŽÉ“'ë)=÷¡¶¶V›ÁñyÃéÐQ‡ûG“j„dðЉNŠ£GÓ·fŸ1yr>Ô/¶Á¥ßÒU ÊTY¹ÞàYaô°\]‡§_­”‹ Ò™[ ùrá™mOÿ—­n„QÇjUÁ åH¸{¤†Q» êÁÁ0ØXRd© Xn3À˜94×£þaæIÊu¡€¥ZOë)Â_WW¦ ÷ƒcpçΫ{AzŒà>ÜêB칇d ê/ýúJ†Ó蟷yVüM…Ú«×Þý°IŽJ .Zþ§4T¦IåDDW÷?ŠEL’¦0Ô!щT%Ƀ6 600Û"øw|™61Žr%ícZ$¾f¬'ï)½nÝñçX+BN`àŸQ SÖUH’?ï4¹Ó¿õ^vm.®Ès×>ZD£_‚Vm1°ˆºJ½FÁ ¢g=gž«iÊ+KBÀ#PS­°³¤ÌgôC„ÒjacÿV¡}ÏFmxlé%þÍ<íµ•@â  €•öUZ$¤¼þ’OJI„ˆs?Eì81®Ò%ü;£ÎògŸ}¦þÓ ×1ãÑyNÄÌaÙò¾|E¤º¦E¾˜_'[À(+Í€Àbœ@gë)þ¾có…¢ç<½¦ÊÀ‘0hwÞ)–jçô;wj¹‘®‡›Á­;Zd;¤VCäý™W«õþı9²rm“<‚>¯“ù&7"WÇ0¯d{ÏÉ÷˜kM£qt±Db'öæ”ÃÿÝl¯?ç}öMâ“êdû$h”ц18ñâï»ËŒjáz1Kö´¥ hÜÙ„Mß6‘4;c•Îø Z^Y-°9*ÝJ2e_HÐ=£X¿¹IÞU£ª\çÃ*Pƃ½X\饔mÐ5ìþûï/o¾ù¦®EbÃ&ÔCL†ô>@±s2Ýè-€¶!ø7²ópöÉ›³}繯ï½÷žJdD± ëÑ6˜ÇQ<‚Û´+à Ä:Ð0)«Ú¸¦Á)=Ï`ÐI…ñJú+rj|ÇMdM™¦Ö…zàzÀvË_Åg‰Ó:¢gL;cæâLMÞ¿n,¯;cŒXη úJ( (WÀ÷/`7\í[ä^™ ¼x$BnzÿÔÌÅ™a'!P­^29%ÎGDUÛ~ò û¡!¨5†Õ‹ƒWZÏ?”Ž·|9ÕÒÓ&PÿO ö´¤*·#Ò)õv~ Ò¸ž>pïikÙ²eª°sçN= å©q²CÑÀä}òUdÁâFOŸ ãóÖË’•–šEËOÇ©ó1Pà‰ôþ¾C¾ÝÂø ¹úgeêæ®Ïî92~dž»AÌŸVìë @ƒƒ”. ³€ìõ¿ì.ƒú; ´E°`4LG¢“ðˆÌŠñ3ùp¾Ëíšm ß(ÖnìpŸ¹ß½zõ Mx†1½3 ‘|ÿfýyrÿŒ÷5îÕ1öËÖÓ}®Ý¬¹µrçƒ;a;€ü.p¹ Ipþé%pñØö³ýâ[UÊ(¨ÆþP½àtHr죌¡‹ð•Œê¢R-†Œ’M›6©ž8‰ôhö‚ã²=%¨š±`ÁU0¹O>ýc<‹êœ´YhgY¨| úí1Ý7cêÏÜKð”ïÁ 7Ü ³gÏÖw Šé^„¶ £hï6M®¸ÓmË¥L®gk¶*0Ò×¥¬WÀK¬ã㼓D;»ÅÿÛÑ\˜[zí)‘VüX6 ¢ ”Œ fÀŸ÷¿ötã a?¿•TãrCÐXŠ;½ÛÉ7Úb<n%æsU‚Í)a¦cTxêÓÙ!c9‘u@Kc€À™€Ó"û-„Ò‚¥üµ®ñkç‘©ôD2 ×ZÑþ!^¾,í·9× òdNð«C$óCDÂ5Ú°6™xC(òÔxÆŒÊpš0–È“0 ˜ã~%Ò¿O6ý"è·B¤¼F4E‰ùß]ÖCÕ|ªBÞý´FÿDèð¶kzúœZÓðÝ(è„/ûÝ{e«Xú6X©Çk¤ çÔ¡˜ˆ{’€‹n¡èáÐCU=qZöç~0&ø‡†D' X¦#l¡ÊUXÖ»wïöæ[Ïì|nzà\A= ¼¢YÖÓ,Ÿ|Q [ 5òØóUòíV‹ø§jEú÷ƒWÿ@#ÏCòbñ Jˆœ~\±œ0­H6ú×5×ËV7À¥`³lÇÞÐ.C4ëE˜Û¿5Èk2e©ò´>ÌA ǹÇôÌAÉŽGµJ hp.ªé7P™¹, Ô&T™…ÑëÍ*Ô>t‹„¸ûÐCÉ“O>©^Q¢˜Ðh{MíݦɷdØ/fòM¾#3VÀ/€ßžÀ½òž!þur´˜‰•·rz—?Ö'ÒÂ`FIhÓ¡&˜q×Ìû—›û±N €Ë¹²Ïá.%W"D÷åOˆGˆé$hèìFÄ(QÓ˜Î)a:3 €xK˜6H¼Iåj&P7›Q½ °Ø¶™AÝA“Ç ¦ÚȾf‘Í–s,odË ÿÈX¶”Ïixœ¨ ³ ÕÈlDüq6bOÄAˆq ü»ãGïÓO?•>úHÝ80®cÆ«sZ§ŠSê¥+åËEuÄYä'g—Âf@¾º´ûóý;d;ŒÚ1üíw½d¯=k‘Q`Þ×õzŠ]^ÙªbÿÙÙеÁIÉ‚c+R†B´ÏÁ÷’.ê8à5ÌKû$^‰àÑ-¤aÐú=O¡©«°;ôõ·nk’%«eË6¸ „:ƪuMj|‘Re¥Yò§ßô”}ÇÁ žß»¾¡Uí¼ùa-˜ ¢ê§áôŸFÛìå3°%ð·wÉ=î’·?ª•7¡b@££°ï=H´é#D׋ë2lØ0U‹1ïa5×1Ú@ÆO×V®\©ê„Á4LH&@6aü-øÄŽÈö‚ã[£·M=ÿò@mM™ic®<åßûïÿ{µÃàüÖF0íSÐæ»Ú¹M’w~‹©G'æ•$ÏÎïψ‘Ã=ðÍÛšÒ`„Fö .x­D>€±¢°ü±òZî)ãžé…kðÀ@ â»Á$X‡c:S½ˆó+ÖSUusX5;¡’:Ñ #&þäVÀžâñžag2 ÁíŸzF Œ²~Qqà¦/!OÄPÑ;¦ˆŠ(¢3oÿVϼcM3È ¹Õ¹ š'uZŽHï#ÒtõPÄ^ˆq ü{àÉ$mPg–ê#FŒˆ‰þxÜ&¤c¾´HüáEª{~Ù…ÝàQ#Cþx÷ø·o–!‡ÀnÀÏÏ n$oN²Ÿz¹R™Da~…>ކñ»R¨P”}œdƒ~â$ê®.ªÑ´NO½}ªd0ä>:e@IDAT˼ã‘ô϶$lIl~ûí·Êè¡Ú‰[º ¤|´ª4 دOެ‡Å’âL%þ÷càè©…òË•ÉÄqùmˆŽû1¼1¼ø6 Tn¶Œ8òôÿ¨C‹t]óúŒÚg¸{ȺTɨ†ûÀØkX‡1ŸŸQ¥Òã ÆAµH׋'ó={öT}JPz‚‘L€hö‚s2ûAiZ¥§'ŽWXXüão/°Ž`ûTe¹‰>7pN¿þmºðúÏþ³¼ñƦz„S¹íŒ°­Û,yW ­#GðaUPâ›ÊÔ¢ù +€…úŸ?énm¾B#Àþ«¬¬Ð”LVÃðH@9þV ñoŠü¯My¬S—ÖŠþ4¬ZTÉe´]hnPp̶mý´)!€"G¡`E“b,§ôje@ ÈrȶƢ¶ö£€ÔB"uÓl¤Lïê2 Íq—.Yæ,Jõ<·$ÑCÒ>¬s“f"îB‹WE}~˜I|.]ºTÞ~ûm#§Z‰”d txÄÁJüµ¤AþxÏNÿzrÏï{‡<1&±9ãü“­2eÿBù˜û@Œ¶¦ì_ úê÷º!äé(ûfä~ÓU!O§£ #q æ %°¥+?‚ÁEºi<¶öÚ3°”Åö]-8ý¯„Jj´*ƒ…‰ôßzïùÕ`,ˆz{ Ëdza¸qïQyªî±ùÛfØkh‚‚eDDû,\/ÚÄ šÆ¸qãÔx×öb¡À½äšS"ƒ*8dÊÃÈw-š½öü‘ñÎ?ð0X¹³n ?Ô@eÎ6 ’§—“;î¸CV¯&5â@iÊï!ÖF܃Û0YW€ €´9D5z¤‡à%þIäûGn§Eü+µOðBXÂÿ jÌ=Ö³yŠÌâDzu/¶a«Á+Ì7Î4cÊñ;3¸ €vW›8ôÚ­Õ‰¢ÇZ:q²4ÔÁgt'•Tà €Î`àeRçBù;JX €*åC€HUç¨"…&o_+peçZîÇa€óZ²˜ö<Ò& N&€Ùª.lAœø."ui(гõÈÇ<44ÀåˆZ0çwô„’†Ò’5PL}÷^YòþìZËÝiÁEà-oP±ô%P# äÀ5—v—aÐû§…{26~Û(ù×.™ —u+áoâûŸÕª; äÑF@ ðtãçÂ8!m ´«h€ uê£3ð½†8$ÑI–ö¨“N©FžÄÐP`´{` ºwË HÈ;ûóýjyùÙQÞ"ýûf«îÿÛò·èEà^0[ªAŠa;ä/¿íµŽ2™wûŒ¥ÛAøÓœ[o¹p„úíäÂ]d,׋búTC쓌¾±`š°2ˆ|’PSSãQ 0ÈqÈçÜïP§~°:ÁÊ;4øWþío+Ÿ|ò‰îQ£]¶ïEÑÞmš¼+p=¦ˆ'ï3ùè1£ô›Âo‹':ÅÿM¹ñÚ¤ý½¿6€1kA&üêË ñÔÒ’RµyåTà¸Î`®M꼯¼Ëhwei°úövkub—Ðv±«PtnÛb·$ €H’ÿkè±OûŒ €uúoõÏ=ä5 ¼jм^1uD¶w^ûÿ¤€ÖÈþè¿ItÍ“¨Íˆ³i bĸž“PüøãeÖ¬Y*=C±èd c†çÊ%çâ„^hì/P òÄK•2.éêÁz9õØ"9éÈ")…X» |¯zwÏ”­°@÷‚o§þúF¸Á£>zEe‹ì wN—xU-òæû5ò§ûvÉ_ª€ôA6 æêɉy•Mÿ&%aH}tz à>!CF¡Ñ0È`{Úàþ’É@1wº©£€xÚ xþÍjùbeøð䣰ÎGÃ-£w9‡Šê¹èª-R‡½(+Í3¿W"߇šÕh? /7C½¼é€*Ôå¾@±_?Ñ>׋¢«T‹ážð4‹Œî…Ù“F2ÜÛ+V¨ô ódÊP"Ài(+`ßÁþ€ü+‡[Ï´c}mcRs#qÓgŸ}V|ðA}W¢˜år´ý!¢/UE‡nÓ¤Z2‹-%Õc„7Ù1cG{`ác‹šk¦üX)ÉÏ,»æõÚºkßÄ=ƒ¢Ú8k%T Ú³ ciMtÅqí |5}„J]@¨ÕÑ{_â÷ávkub—Ðv±W¢hzÛb·Ä0˜vVp-gÞŒOgTj @„«'NîEê%âYhácHíLjÝóÖåX¦Æ^¼h‰™F:¤dÜœäÚ‚ùÓ’ÎÄwít8Òîˆq  $ÁCßò¯¾ú*ÜG.W}uŠ«'[àiq0âŸÏ2ga¼}òµp]WRœ!WÁMàà~Éö>)qºÃ;"žJåðÉr$tài•~É*X§c€6œFé(UðÔ«Uò¬âÓEÞºÍòˆ°;ûõŽà›#H5 Ÿ$ÒéVް#Ð{íÛ:øÛ’°%±Iãƒd0òšÒ$@ãžx±Rf|P£"ýã!ÆOݺÿó÷>V.ŸBÒ‚¡®¾* ò·ï’…K¤oC… öË+›e#lfȉG†ú2üûäšëÅSyÚ 4 ¿#dÊp?cb±\Ú c˜ûc!%Bý!ñž¹ï@¨½kàøãöZ9më_˜˜×ååårÝuש$ÿ¦£ç¡íŠ(Ú»M“{~‡é§ÀlW»*€J’{~˜A´þkjÿØ]zqÖªJ0P¯Ä–pU̪'Mz'fÊç„ . ðV\‹â´`— m©a'w±míØ”8Ç`Þ?rŠ”a±l€P\¨É|E(‰¿yòvÚ´u,Ϻg]ûæ ‚jžŠuÒŒ@â9ÙfûšÙHo!Òh ÕÚÊO£0V£4¸hÑ"yñÅ•Pœ4i’)±£+û¡/û9_ÕÉÓ¯TÁ¯}«L;°@N9º ëM£€»Ú%ϽQ-ü·ºç¢õòó2Uχ¸òÖµ² ^† ÎMK—›§ÿïÍ®ƒŠ„A†&äË¡°ËpÎÉ%*U1bp[F‚VÄ¥¢5ØÈõ }~OöÞ{ouégöìU´ûAbŸÒ .T¦± À4hßÖG@¿öÁÊ›‡'®î´ MÛ@÷ýËôúž{î‘çŸ^Õ[¢˜âëhûû(Ú»M“ÈH Ú‚ðŠ* >¸i(eXŒd•!à• ° Å[Ù3pQü*)%̨BŽ [G‚ÂK¿Ž] ¿i{y*Šˆ{&LH‹—4‚Õþ Ú$ßñ\Ú‘&ä8ÑíL 3¿P@È# *âðÀÖ†·ò TmdMûDžÀ•yýÇ”ÑOü_ËPî 4H Ÿ&!$ü·ŠŠá[?G|œ#µÿá»Ñ(Œe #€§žT xíµ×Tl|Ìò’;P¿|õú&¸–³kŠðÓ-ÿ·­EnºstÖ«•ø¤;êóS䟧ú<õÿv–¯iÔú$þ©À°vc£ð${ÛŽˆ®g€©P,tui ÓC9DßsêÐ?0ï±Â„;&ÑIøÈ“T´q§d‰]2b(æÿÙü:¡§…1Ãr`(nÿúµU¹}ìP¨—¨W è›%?=·›$ÀÞ¨rñå¢zYfÀÁóU} o·ŽfîdîÜóH¹JgôëœëEûƒV|/¸nÜX0Ø?÷“߇¯¿þZè9€ JD$Ñ* À¿Ìï ˜¥K蔪tûG‹Q†Ñžº®nH߸ž´á28¡Te$Úh26À0,–{´à‹BÀ2ØÌi 3ß2öЙ°›Fq ó»3ÇN‚±ˆ?ó½H¨/i+~Ú$?FÁƒ‡jbF TÝxÜ „œØÁ£èUX‡H¥…wÙļã5gfR/þÆv£#Àù\iÆà1âœÏŸ"y~SÉà‘퇈_ î…Ø1®„ Ä·ÞzKfÏž­þì»êÝŠÕƒr1¿^Ö‚¿Yx½bMN©3e'þŸ©ÐaxMŸ;P¾lu£,X\/_CÌŸo$‰Ð‹Ï)S#x÷ >î_„ŽzfF«ì3&_®¸¸{Ô:ê$GŽ)ûJeP5Àˆor’`N>Œ2Ø'‘!"Fô A·„MÑêçŸ }ÿñ£rն‰GZ^OœýVÕPj¢V%2¸¦·^ÓKN‚h?xàú €´#@€U8ü BéÕ=8:@)Œ‡ž®û ¹A£/Ãõ mAІƒS£‡Ÿç:s½h;û1dÈe lݺU;1û`Òð{öÖdÿDLIä22P±]ûÞnçÚ{øöîîµÓK§OŸ®îKÉ$‰"ü mŸŒ¢½Û45V€„Nìuˆpmøñg˜ïˆ“!`åñÀW•î)¯<ésáW3V¹yTCü;…äµ}a:5Å9u!˜§ Y£ nÿâwÁdhȵ˜ËÅ 4Ÿ„˜JW3‚-‚a¨ e‘­€,þ[Ä>HE"5EODÌìè-·ê˜º™¬Û€À>M?O©È0ÛǤ•Õˆo#®C$k?®’@D ˆtÓåÖ+¯¼¢Ì,ŠEw†!9<[ÌõöO†+º¦æVQ§×Àë~Ñ]îá¸vc“ô(Ë’__X&—À-à‘p1¸È¥+를Š^P9fj1ÄÚ-By ìPr€è ¸<ç{Å2i¼%‹É“ '€§ÐÔG§uî‹Â…a[ž†ÉCF#½Ð>@,·}sTJ‚`Ì?Њÿ£ÿ«” Ðë>([~tz)ÜGyqò"û›ûu½Ð¶BÄú)öO7ŒÂ†ošä—ËCÏTBô´ÒÙrí/z@j Ï`ð@´SÆõâšôîÝ[íPu‚ÜXH˜ý  íPmŒedPBƒˆ|ÄÁ¹vïíÊyÏ[šP¹™3gÊ]wÝ¥Œª(&¶ m)âJ.žÒ{ÒŠ0rÔÝm~3<Ä¿­@I‹è'aüÌᇉþ赕å¯Þ×Þ좩6KØÅPR\¢ Mª’°[vzâ2B.ù¸ûHÈ]p3:¾.˜p' ÉÍâ«즓&ÝYÃÐ%RðŸ§çÙ8œòÚBè™Qˆª×|Ök’fÕçs™håX'X 醔[‘ ð/Ä÷/@ü ¢E‘"@B‘Ðûï¿_^xá¹ôÒKåÊ+¯T"2ãųOŸWâ”þ‚3Jeõº&uýG‚“†èöƒÑîV¢s Œ×ý캭ꢎ§Ó?:Ý+Þÿ,ÿo„ú‚ü =q>þðølOŸ?üðCyóÍ7õôž0‘¿çd0RåcΜ9ꮎbÖ'N”qãÆyˆÛXïG]]«äYó®¬n•,¿/}9<-44´èš77gÀC€—9àœËÒUõ°#°S,±Ü(N„ÛÀŸA•€6LhhDÿ`”VT5ë^›òHRâ””  ÇQ£F©š ÷„ŒC¤Gw¹ ”X·n㜅ŸÏÿÑx’µñ3Äwéøžæ¯ ÙØ"ä$vÞ}÷]y饗Ԉ ¡d …ù™*nι“H¤˜ÿ®Šù'Ï<9¦ú,X¨¿÷± %KJ²äl¸©;ÆÊAPþßï·©;Á n~ÎIÅÒ¿O[]w­£Ÿ¨¡@žäP=ƒûa…ŽCâ•p„ªF€F“Š‹‹•à°Û Í²²2d $+¨ã_@3$2F Íõxp †w>©ƒí…2 [Î<¾DU.œ¾7ƒ÷ÿ·}4H>˜ ªdÚ0T×´ª-‚g^­”;àY€ïZ«ÌÝzF‡Zp½¸6T =z´JRP"€ûaöÁ¤Î9‡›7Ìz X¶l™º‰$sÀØÙ¾ a…pë…ÕY|*=òÈ#òŸÿüGÿ.£aÚ^E{·ij­@ÚHäädˈ‘ÃõÁÿßb•c€$Ý ‘oòD¨HÏ£ØõVª7ì?€b®%UU0‚‹{”äññD’àwð™©Ú¬ÀÉ(qîl› ]QÝWº+fÜyc¡uÞp‰?§DcPœ“»Ú°ôØ ÔDä?û?Ù¦ Q­+KÌ_ËyÏŽ~¢ÿ† àÜ¥ËW(Às–¥pžÀ+ÜJ>3M¥oB¤Z™ƒû"Æ5Y H:™´@"ˆ"ɆCÄ|Døçƒ˜¤ñ9ü{V­¤¯z€Cÿí/{%hlnö¼z!1ùýãŠäØ©ñ9ý÷_SŠ…s½Ç¯úè$Úh'ëFJx²‰Lî-uÜÉ` €ýÓ5^a!mPÆ&ôQ¬ñÊùæ»&ÙB Œ-.[Ý !öÿ¯'+઱Q;RS`ÀHilßÙ,ïΪ‘kÿ´]6oiÖùþâ‡er!$:úÙ zøûÃ;ËÁhmhCËaóá™×ª¥¦¶EöçÙËHžÊ¬í 6pà@•¤Ø±ƒê”Vˆt/L{î-jS"`íÚµºÏF-ÀH ˜º>)8Thï~¨¶t×\sº%åßd¸g!® ½Û$5WàF[ƒRD23d Dùφ]…¡­uo„¤ÆÍ÷ìTWŽÕ`} îŸ » %òË•yÄûi¼ñÔyòåJ©…‘ƬL‘â"Œ5î°ñP †ÎJ ¤mŒÖm ׋öh€jd–x­¬¬Ô} b‹ý ä ½pO¸´Õ²_Ì ÚnU ²¶µº¼ä¶Ûn“×_]¥"œ þ Dú·vƒ»fnD&À‹an§NÊøaÇê9‰¯[€> ~D¥ûAñ{#ïñ?Kì/zaa«üþð®ñh.@7+ÐÏrþ#Ю.sÁw`1nM~;ýîð’ˆk¢IxU@£ùâI7âa 5ežkÞ·*Yõm¢_ëÙŒ€ €U«VKC}ÚØ<â·']æe§+—rÄùˆdpMÆ!æ Æ5ÐPà_|!O?ý´JápÀq/ž’+ïW -XÍWfâÅ2ÒOÿ¶Âð_Yi–Œ”+ýaèîàIù2fxpßôÚ(Ž?$©“Ncq$ÖiÈÏ:͉Žð¤Tái5—ì—''”à 4ÇŒ6´ †ÔÅ1S egy‹PÒ"/7Cªk[UªbŸ1yrý¯zÀH`.ÔnëäßOUÈÿÞ¨‚­ šÅòçk{Á(c‘ç$¿¶Þù¤Fþö¯r¬…žž{J‰\z~™\~Q7µ%°|m<@@Ú`Uƒ°oz ˆöYØžëÅ= C†Œ®dœ˜’`7•‚¤ìŸn|צL™¾j†ý ñ|p‚ôŸHÅóçÏ—?üáÊxŠb^I–S-Ë™Qtä6M©˜Ž§±€CJ=VÛ‡É/È—¡C‡è óMh_À&ó‰=8¢–òZ ™7µiu•õ­$€0/<°à·Ì >+p®Þó)I —z#.ÇíØ™œ=VÂßMT J‰+*²º J̈*’f€©—Ð'ÒfÿV/#ÀÒûÏ ÁX½zÔSNŸpSú© @ä‰L2(PV½ŠBœÌyp¡ ¦Ëh0Z~pr±œrt±œyB‰ì†µ¥}€Uß¿ö¶mòé—õc¨[ÊeðÖp,ý• .Ö—_×É_AüïØÕ¬jd.üþÊžj›!//Œš<œ(·ª=ºp¤WÚˆeàzÑ>À°aÃÔp#2ÜŠŸF³<Á#Cæð׃>8–SN¸¾®ºê*U-¢.q á×¢hï6M͸`§Ð3ÂmÍà!ƒ= a§a‘‘@»É{PùøoåxÅ g™wt‰£âŬç2¼ë“$9êÿ'$¡à2Bÿ†Û–|Oèziq×0˜&Rð¨¨@‹ÀùbÞ"òùE8µ)ùž-EÿO˜V¤Ä?ç?†äþ£€t=÷ñuph•ÁžÖìßú°Fy¶Bëö…whÝ*lÒ E>yúL$ØiÝ_½©ˆÝ¶m›2¨“Îþ¹·<ùŽ6tï–…uÎ…aÆþÙ0 E (òìëU êwÊJxl ±¿)Ê ¿î¡FcnÛÑ,ÏA:à½OëTì˜ ·\ÝKJ þï µuÍòò;DV3¤ßY2 ÃDàZ–¶·ÎÎþåÙ‰uz à^P*€kÅÈ`Æ Ô6Pë“ C5ƒóÎ;/&ëhœD(£]‘{ï½Wœ¶"˜× ´9‘RQnpWÀ¹7âÂ.ÎÒÌÓÞÔ ÁmâÞ&ò}ôÿ ïa”À…°È~ÚŸe¬ã XE%ÿ‘*÷É6±p'ë.š<™Ö®@›$‡õú6¥ R¶” Çiü}ÇþÝ®c´Dà4(€uˆæšb¤¸P7€¾«¼ÇÏSÿhu¦<}k™÷'3ÓåŸyW#ms” ·€g?F<‘Dú Æ=̘1C&L˜ —\r‰Ü|óÍRZw³qy&¾¾$¼éŽŽåøbö‡¿ù)û‡6Œ·dE½<øL¹lÜÜ$›`\p2¼|ïÈ"X¶ï˜Vå­Q¼\x'(‡X¨Dn°‡íß¿¿\vÙe2wî\yíµ×”!CÆ x’‘žn3ÖÔÔ¨q6žl¯ZµJ&Mš¤Ò±Dø(¦ÿâ Xúrlê Øaè&ß?¾Ì_ØÆýÙÀ+J؋ާm9ø‡9 ©"a•n:Gq¡µ”4˜û›`׌ŽAÑ®5‘ð}öÙG=PM†4¸n„Û†°oo Ö£JÁ´iÓÂýo¯Ó¼_[[+wÝu—Ú9ˆrz×¢½W÷"ÊÎÜæî $ã dÒŠ žhPIE*Í…Z`Ñ&ôHš†ø'nj¢¦ÄWÕ UÜ0÷ì*n’ø+@Fi—zk¾Àmó¾å¡ë§ü]ƒT%⃎v©R/½oÿ¼G€ «9€5!Ô üCTso¥Ç P`âˆ/#^†xbh ¢ ã¥/ï§žzJ¦OŸ.—^zi´]vz{sêNõy¯õ“GŸ«A–×tÁA/EÌy’¼sW‹¦ôU¿~s£,\Z/S'È)P(-Þžùݶfœh×È_Ø Ãƒ­zRMÂô®‡wÉÏ,UQùP‹1qâDeÀ¼õÖ[òþûïë ´å)u¤Ä(¥ ¨öAÕ€%K–¨‹Â±cÇFÚ­§×n$'nÇÉ?™-ÙMN?¾Œ¶óæ£Ì€ëÀå8)ðd}ªgø®ç¦o¼‡Â§@Ńa.TÞBûÿ¼P½‚–‚ ìM–ôÆþ^ñ“î*%àßWG®É4¡4Å÷¹>Ü zÏà©™Ãíï“‘0pà@9ðÀ;2lÒÕ½ï¾û„úÿQŠþÏÀƒÿ/éÞ°»1^6Ì^â±þ{pKS`U±}æMdNïY¬<`m­¬+S“C$.nà,çæÏ üÛ“KÀL[ö}N²‹§t1ÆOÎcµ/Eÿ‰˜&¢ OÞxjF þ…°à ž(Ãùvª×Ì›{Vž×Îèñ„˜åþÀ~ÃúðÍŠ£³ô 7¥Ï£Fü¤dÒOÙ{ˆ î81îÿ´êýâ‹/Â0ÑP¡Îz²† p!7vD®¾·Áž'Ö}áQว+A9ç«z5p·èfœ2S÷œ:è|̓…knÛ®Fïèb™õš›3ÔÁ0f~\++àÖŽzíTU¨ÎSzž°R„?Z}t3 [žòòr=µ¥ßz2HìF#íAKþùz:_„zžüSr‚0/P¨^ÿ-÷î”ò Š´f€h/“‘CÛfœ5§NÅÿwU´ªc+'[~|Õx hŽËÐØ”¡®É0xóýj¡*ÇÞ£òÔH¡U#²_®í >\÷„ýÈD!S†‘ëéòóó嬳Β½öÚËÿVÊ\¯[·N®¾új¡Íœ‘u’&Ôy;ѵô•21é1ï1A;쉻þúyÜÿy ‚3íÉÛ’H<ð×÷Ž) z¾MV¡æyiÑùš³Ÿ˜¸'²ø©®®Ñö‰j€*üî¹Fí­³’87ÔçfW_¸ €öw`ª$¯ÉíöŸ/ìÆ @¢1h4‹ºG5µ0˜‘ /Šä9‰yPEü˜ÚŒ-Ó´(¤éÁo¿kaZ—u"ƒúçÊÐRg:ïßmo¸z¦ì?¡}CvÔÓß{uøÜ¾}»íDøBží> *îPßÈõ¶é¦nÍš5Ú?½xíh k¾^=àiN²U&BZ\³±IfÂú?ÿí±[¶\yq7œâû2EÖC ãõ÷ªå£Ïk1gQï ß;²XÕ:h¨ñóõªV1q\¾\ðýRU¨oh…ÊG $1Z`› [=tôYüë›õêÑ£‡ÚkèÛ·¯2è6Ðìë0po˜§c=¶ “׿ïd¾þÝï~'ï½÷ž×„>í>ć;ØÎ­ž^+0=]·[Y7ØÙËW_Zý‰\k9°M ñ”ˆ£þò>¯¬~ýÏ€â¬Fš‰ >¥7®Xª„é4¢øqm´Y¼J”ÜÒ¦4 \@û›1U~×~µÔ¯‘È #@/^7€œ6ðÔT*˰Wþå¼6ÑCð‡ö°iÓf©(O+H7¥þ_yLŸŸrž˜-F¤Zå­Ç ZrÑÈÄ3,]ºTxàeRщÈT$Ú;°DdŽ ÝòÁýr@ÐbÂ1218Vì³åpgw*¬ãyH!ˆÓLùð³:ø´‡Eû¯êà‘ Oúõ Ï® OŠ’3%3†âÖdP’Øô—" >»¶wØ–{ÈSm2Èø\½zµöK"7’¾ ó3%Gí( °tñ÷að¨h7Øi8vªEØ›d¦<ýJ…<ÿFÐU`¿=³U¢`ÿ½-æÝ8…]2RÎ;­DƒŠÆá°³@„øc0 ¨~±`Iwx‘Çf€é;Ò”ðÜH¬?^%h€RBާAJRœþù1ñ¸é\ãÝî“O>‘?þñ*ÅX›Ð–§ÿôGæw‚­Àô`7R­¼ Ìõ¾}ûxà‰ñoþ<ؤ¾Eì“æWº_°DDì@œY~«è ‚’bË Ë0‹”°é,ÌìÑ„&æ2Úß*4ºî±‰Î¨v¨±3Y£¦,fÊöµ•šk;u0‚¹ܼù[)ßE·ðinJ›'íƒRö˜ÜàOß@$U41î9 O"ÿ=ô¤4––ꡈyžnÓ†@{'áÜÀºd(že7¢núß©€u|"p"{Î…€WÔ¾ª†ÿ-#‚¡ ’P§=ž@Sl“bèd0úÓpçkê±oÂS $AK&õ/{õ‚k>¸ŠŠe(€¤¡´â_UÝ"«×5BŸß:AŸñaµüñÞ²u;ÛVœîª4E0Tœ6œûÒØÔ*ËV5È}OXRTèNŽžR(}À¸Î= T'X™á´0räHµA EhÏ=÷܈Ô(‚•håT¢$Ÿ7Šð9Ú^E{·iú¬ÀôtyÔž={Èž}ö°ˆ{(‹Øw0XfK(0Œ0’üZQ˸bloVŽEZm¼•ni E%"U ŒWpU|V–*  o9ð—Öç9Ü ¬Àÿ!þÀ] kâAÄG³¶ ¶Yà”@—lG^.4£¿ž"­‹;^Èl—àËáÆSèfܽ” ZÀ‡ˆ§"žŽÈ“µ‘ˆqŸþ¹rÈ!rÎ9çÈí·ß®z„q4Áà«ìñ„{ã·Í°rß "·Ö:íþ–ßpêßgÈiÇZï©ËþÿA$´Ç0sæL™7ožZöç~¾4ÐÞá]ßñt›Œ€ Èᇮ§Þ‘ökÚ•eÊM—÷sN*êýççfª ¿Iãódô°\¸þË,¸å8íÿÛ¿vɬyu° u¬“tQÏ Éæ‡½€£-„šEp ¶µöÉJ ‡åÑ'<¦ŸDl»dÉyôÑGUÒ$Âùqƒ¶ Þa{·™»)½V+¾‰·…/ ƒ•ò×zóæž¦v±V³nh{ß/áO¸Ç±t<ßJq½ w¼pëÅu²]ß9¿vTñLøà2ÂߢóPu{øÕS¯f² KBιz® `müÓKüg(°ö½ž /à ´›. Ъ¸e¬€ù‹£»À‹Güâ!ˆq§ô{î¹Gîºë.%Lã>h ðÍ–f™ña•üé°Ûá¡ [•íÑ=Kzu‡:x(‘; Þx’½[Ïl=±~ìù ™¿ØW'sàÊŸ–ÉÑðPZ’!¯¿_#wÃ^ÀÖíMrï#å²÷È|?2·Ý'¤­’Oåú5·?éö%¯¬Øx¥6æwý€a9‹<Ö¾Ÿˆ„v"Ω‹þ—wѸÖe„¿d;P•n¼Ú—S ¿O·fŒWÀ²m;U Šc¬o€« £ÐÑQ0Àf¸¿mGsK܈x ƒ®*Ÿ!¥YŠ’ CŒ{øè£ÔúE]¤={öŒû˜9Àßþ½"ÿ Jmâ¿g÷L9:íÇ^(}w‡+@œÞ“¸wz€Š¾|:¯V~Ö2TG«ö—þ°›üèôRÏÔÏ8¾DV¬n”ÿ¾\©§á‹–5„Å0 ÿÁ~ tÛøî»ïªk¿òòrµZ‘S2h`Æ *°jÕ*e8L™2Åc,ÕÌ#’Ôÿ†ÉJÛû÷N±T#,ÈzÀ„™:9_öƒ”@O0ZöèÝí00Ø~ø°Ù:Ÿj¦Ž½­>÷ÒõâÍ7ß”×_Ýãé ‚u ­’¥ˆ·GÐÖm’¾+¹øR®a¬ÁeÄu4yØÑdy­ySÎkÈë`àªÖÖ:ë9štY6R†u—M8~ÿ*~]Ƕg ;nèÀ <غ)WÕ(¦‰-´s~æ>a­-ž«–ÛØ”{ªx2ÚJ«úÿ´åþú×H¹ë´ú¸wñî•cü#ˆøD2;%<øàƒj%FS%ÌÿÊÌè­“®±^úÑCs丣?zžüççYÞœÏüÍÖ&yufµTT¶èI÷ä}òåâ³Ûw–˜{†Š¼SÿÝJP‚à«%^ƒwæž3¥uúŸÿüçrÚi§É°aÃÔ?=Oñi(0š@F%T1 €ž þñÈgŸ‘Ç›@ä§ø/¿Scÿì·U ò3ÀXÉ’©Â`ž‡ø÷ÇuïáÔ1³ÔÞÜK·”/·Þz«‰E øÆŸé¾Ô î „»í‹>…ÛSÔóÅ ^ @hýÇð;àˆjúßJ½÷¼ë»Z×ÞûÌ9ë$JÞw†i{Es¸ï$ËÓ»}ÇvІpnD v`ѱޒ¬¶qÈ4‘Å=nÁ‘-(ÈWñY"¥†+iòŠ(²œÿìû,Ó<Ü\yËàöŠ÷eö¼o]Ò`…¿áYCS1i´ô¨4>úâ+ˆ<’w¸M1ô·ß~[h,pРAj¸ã&e ÎÕ¿OŽPÔ|%Ü×mÙNÉfpTÀ X¿©I6÷=O¦{”ù.+ Ú%+ä·Êp‰J üêÂ2Iÿð$V®å·?ðse ^¶£¼þºCž~µudXº/. Ì{'|éׯŸì½÷Þ kjkkõŸ)ƒ/©Eaÿµ2è-€Ìz#(++“XH{46¹@&ŽË—¯—7èú’wAÝýíªhÁfKaáhèisÝœ!TýP÷œ}¤KþŸÿü§êþ74P˜(¢À„:¬×DÔÚm”Î+@ Ù«ÒeúîÕGá'µwøp´€ùºôšñ£`Á7‹aÀ<‰x“:×Ïà¤55µÚ/]¼òûÜ·o_eì:ëvež.h‰‡ÓîL‡ñì$Ëóûb<É2ë®ç…¾¬k§Ð5£“ð'™ˆ йÖÖÖ¨¯jêÖ iR®óÄ<õS½dê•è·ˆ}'ÀŸ° ',ßlþ¦k6£kF½ÃÒr½:è‰äyDúãЏbÜuÒɘ={¶Lš4I}ÌÇ}ÐÀ÷œ¡ïÙræ %ÐíÏ•ù‹êe›·4©Oû ÌwÀÀ½³Ôë³Ý=î’¥+U5`ÿ ùêî÷œa1˜ïϪ• ßÐ’¿Èu‡@‹I@ãd,\UC/òÈsRQÕª®òrýôçM¿<±§«:z |¢—º ¤Ç8dÚ„“²/Âp"šô°mÛ6U=غu«ì¹çž1±ŠßoÏlùÁÉ%Ò»g–|¾ Ï F ¼%¬ÞШ ˜zHGPb";ËÞÇÄm<ØQbíƒO{tˆ„_rÉ%Âý DLmè{ƒ¶Žè•d£o±{å®@»+@&õåíÖJ‘ {íµ܈–ê»fˆ~“’! y¤|=QE,â_…ìµ0ï«I_Å=“¿å=ºv%s }M”à2t'Ç/Œ %Gpß§¯Ñä‡o–ü-]ÀbPÀbpÅ <½ÑymVŸûÖ©?Ël&€2<׸)*Ê+dÓ¦Íæ2Òâ!;M=4‚g\…6O"nB‹Ø)ÌHžód‘„ÝÊñKÖ@ã~œQ ñôL™óU½æë @&À'sê¥[I¦ £’·ÿk'ˆnA=¸i¸¢§‡°7ÏÞŒòàMàˆ¾×ÁÍݾcód NÁwïe}Zi3€Änÿ>Ùz¾ÒÍ-,h”|Œ?i\žé*`ÊÓï#ì%€',<Á'Ó„|¤0‘íÙ½Ð!­Æód‰Hm4¶ÌœÆBäÿ‚ï—ÂÓB Ô¤Œ€Õ`€Pàóùõ2†»•XÏÐBq °fSìv–¸ùöV€.=ßzë-ý[i¯nûxñ ÷ÝbwB­Àî¸Iw¶iúõÛKJJнĽû–4€‡à$þ5“~Kkäe pÁ ñï¿x„×”£TAI±%@8í2üWªK¯y8–îÿÌ*y©Sâ¦í­õ;,yÌöjº÷;uTˆÊ§2€Ô¤œ`/á­þx²¼t½ÍkG=ÇmŸlffä¸OGÉs‘Ÿš@BŸH$¥ è âµ×^îíܹs£éÖÓ–F¯ûE™ñX_5¸H†ÉºM`‚4·JÍÉXáúÁu¿Kç­6yÌns'½ ¸gO<ñD46#°²ñ¶ôZ9÷ic¸E1ì+á»âA‘7اú(°`~­ÿzÍ2ßrÿŽÖŽ 'Þê­áéÀ§È½H˜x&afæD\@˜ åWíQ¿k÷² W€À2(Àļ|ïy´TV@ìÏŽ§qÔw”2›I“áé§XÒk]ºêi¿ÁÀW"Œø,btÔ :'PüW¿ú•¢ïQΜ úT ¸ñBDKÉ™xZ%¦Àã?.7ß|³üð‡?L(ä$Ò瞌“úƒ&æË{ŸÖÈܯëÕŠ=­Úçdƒ9 ²D­zÿ þ÷o+Ò¿`q½ÌžW/Ûáa€úðTØný /¿ ¦Â#åÊlÈÉ#3/CþþÈ.ùÅùerÒQÁUki`È!ª·?oÞÜfî ˜ gÒ±i† ¬jW^w-öi¿å €:Ý:¥´Ì¦Û¼É›” hðWæ ÙW±í€ÑHz±ÏXžü§©ÀUXÇ/b¹–ÕW[L¤³FNqNÀc¤•Èœ¼“먳ò¬  œ7óDµ„õœÈ'¯M[màùaFƒ0³ +ý¼[+áþ&Ñ ÌÃ\OD< ñzÄ ˆÎ¿|\Æ>Íá@IDATð$ú裖ïÿû*@ŸöÉŠ¡ pýe=äüSKååwª¤îû*kZÔ…ß0ØèÕ=0ý3¸ºc$ó  „û!ûÈø‘m…hvìj‘EËÕ:>×èÄ#ŠàJ°P n0çë:ymf|<§Núõ­’Ë/ íõ±¬¬Lí2Œ5JfÏž-K—.õØ j”‡Ý ¶£4íÐ$-ÎÓöÀĉuŸé• 3ƒ?aÎØþD>¯M?ú]ˆû[Î,;Vgúôéê±c­|j“Qø_Ä…>¥î…»‘­@pQ¥ÈúKèV^)Pïé¿N¸¤¢“ögä•?>ÉvþeæZá¶öeÕa¹‰:žûÓU+P‹i85)ƒËˆnÛ–¢ùFDž°¹!V€âýŽÑuæ=Ó# E=_lCWÃpT6wˆqÏ=÷œ¼úê«rùå—ËÕW_щqÜ'æöÊ–Ë.(ÓÓüœ–þÝP¤ÿ£ÏkÔ€ ËÙ¯†ÿ ¡ä¬eå{”e‚ø·8Œ’'gC`Ÿ1£`Ô°\ù vV®m’ŸªPO‡9Ð^èß¿¿0Rwÿ«¯¾’%K–è©= x)íõå¼O˜ÇH›+Û·o—÷ß_ǘ:uªL™2¥Sì?¢ÝÌËŸ°7婞~ðÁjü/ŠçlBÛeˆwEчÛÔ]ç ´œœµ“<ï4è}›`“üŠ?ú¡›†"Þ¤¦@x«éÂÔ18®¹vÓ.Y›ºdÔ ‰QÏéÓÍyéò¨J‰tnA¦gæmR‹ð÷%ÿ­ç2ØÜ\yh/÷7H…Ô+N«{êmŸPûšÈþ>ˆÿDäé_ÜEo½õVµZÿÈ#¨˜`Üãíÿúã/ja<°Ï*Òw9¶†l«&Àº¬Ó«‡%EÐ }ˆÃ–ÀÈ!¹ò½#-Á¯åÜÂðØ1cä´ÓN““N:IH¤S}‹:ý$࣠T9`¬¯¯ |á…„ºè ,ˆ¦Û·MW⟠uýõ×ë^vxѼ h´Š§WÔauƒ»±Xô’òâžN¼È£õßF7‰L:#®àÓ,3åÎÔä¹AÎ:±Ø°Xõ‘¨óŠÕóè‡ö–þ Í\”‹xâtÄшüÃÇ ¿0kÖ,eœ{î¹rÝu×ÉèÑ£õT#UDiÐï3œþ3 ”#“'äKŸÝ}?µ$dï{¢\ž}­Zvìj’zž%؈.7ln’p)X[KW’‘£ƒP;8ýøV *á¡ † …îݻ˴iÓÔP m4,^¼XV®\©Ä{AÕ2=§OÚ+㾑@õ‚òòr™3gެ^½ZíuÔQ±Uûà_¦ š1l»u ÓÀ¤Î2ÓA8}™º]ÒãÿøÇh§ñ :¸±c"%ÑŽê¶OõH+Á+ê<ýÇF)œr”›2¤G5)ÿ(LÞ¤,38+óì¶Î:æV8i¤íÂé;Íêsþ«df_¬$ÙŸ¦ëæ¿C…8¾ë¦Ðy#'"áœÞ†³ ¬¨È#3v+;k_Ù½ø^ùwmÜdù—§ðuZ}ÜSxýíY¼„øÿÿ±7bÜÃO<¡¢ãW\q…üò—¿L8ï"]˜uõ­ è[p²Oº*C Nï{ú_Sýw>®–¿?¼Ë3Ľ³T àëe òÍ–&ùvk“M¸ZTî½³åG§—JOØ ¨rðô+•² ön¾²'TÞi=Úx øòË/ÕP ­É3ÄÂ>@SS“lÙ²EÞ~ûmÛÀC=4*—„:9üèj8ˆzS*õ'ø # T›D¾wË-·ˆÙ¯çYv¯!¾a{·™»ÁV ­pâ€mña/.ª¤ç‡½?ÒôaR³¸¼6ŒqÂ-íÊÜt´sÅ-kæ·’«ã[’kºgØ|qàºnièx·i\ËÂØB×MÊ»‰êîG¨‹J]ãLøÐ2Ö® ° Ðr¦DÍ=ßnÿ€_gàÇé ÐäyBfêsy½xQZ9 “ëÕ¤üãu'ÝÞ £M¹|Zï†8 ±­ÉzÆ2PýÃ? ä õðáÃcB(ÆrŽáöE¸’“!‡X¨"ý8Ÿz@¡L° ú9ûùë¿ÊeýæfxÙï|¹ÿÖÝT×ÿ´cŠe#TÖmj¬™vPÐèßÏÏë&ÇV¨eÎ~˜'Óaùš¹òæí²pY=¤šáy Eö›/ù?G„c½{÷Viºó+))QWr´ðÏ{Ñ07 œ¤zU艀FKKKcÆäáÚ NŸõx­õC´a_¡ú 6Vg—Ó¨ã%—\¢no#›œ)~´®@Üan3w‚­Ài¸±o°›©TN89jôH•|2®þœîI¼û”óÚSf‘òzM…À¼3eÞà›LÕ ê+¾K#¯ÑÀi,†?dúæ3Mñ@ËÿG¦Â3º €Øí"ÿ(Cˆ˜’a·ÝvSQO2)ø0@¼çå{é@9_“gJlÏy­D>ËÀ@Æ`}ƒÜšç_¶t¹p›²NáÙhIÞ ©»•x´—ßCŒØ‘¤S;äjD(Öüâ‹/ª^óàÁƒ…§Ô|×’5 †!¿“Ž*’!rñ¾O±é»f¹íŸ;”0åÏ7ì&¬_X)=ʲ䠉ù²^Ö¬·˜7]ÞS l þ¯Røo…¬ÙÐ(=á’pêrëÕ=Aü“a¨…·Œ®ýúôé£ëMW~´°sçN©¬¬TXéXÉ‘(À>é`Ó¦M²Ç{(3À;‹øåøüf ¸Îk3j 2s/ÑÒŸþô§²paTû¶á™îC¤€Üˆõ œ‰ÓB–°søˆaŠÿ9 “×´µE̵!ö©ÿâ&€)W\Õ¾0 €¢Â"e 0 áFúËÌ?EÓKð\_¦Â³ù¡&©ðH]ú ä uŠA­.}ÊÜâ¡z'èPyÇf´úÈSyÚiÆáj“÷ökr‰Ä5sŠcêå¬Äq·ë„X;ñBDÚ7áÛàyMK 4Àa‡&_|±•ã ÞḠ‡N!!Ú&t/Í”A{Yvë• ¢ß÷3L"~@ëþf0 À ` ðݶfy "ÿ·ß¿S¯hPâöŠ‹Êä7—v—Ì,22E`>`ëŽÙ±³YV¯·Œê‹Ä?ÝøÑ[À÷¾÷=õØ@þêêj­îDDµVÆvFL–}}þùçrÇw(³§¢¢"X³˜•{`½£Gg×Èyí¨–pYºÓ|é%jêDø‡4‘ 7¸+HÁß”.bMíϤùZš4È'ÔŸ!`®¹9>ß>ö“,ÀŠ“OÍ@Ï)¥Ê£@ORåѺä9øŠÒ¥Î ]2zœ¥‘9¦‰(@TÀ ±LÛD=ùÇ ?ï…ð—X¹r•45¦ Ïgöý©DÚ{w.q_¯0¿):<±SÜ<ÍŸ?_{ì1E€† "ÆHÆOª@Ó?PMiáÒY¶ºQEõË+[U ;Œþ1”C‡ÿÝYµ²|uƒ´‚c†ûâÕõû¿åÞÊ ÁÑÃrå'g•ÊÙ'•HQ!ù‰ªÜöÏíò¯'+` JÞŸ]+ï¡ß!r¤wÏÀŸþnݺ %0ã™§jÕ¶mÛÔm O¼" „·„%œ¦‘@"ä÷¤oß¾1=É ´æÁæÍº©¬Ÿx—ódíÌ3ÏŒV¼væIÝÕÎõÕïÅqûO¤8“‘HŠ×\(-5d蘿!Ü™úœþãºÕH0ßb©p^>~€kƒ³²n}]½Ö/r¨D*¡Åþbˆ‡§ À)X7âÁ)c)ñh]ö_`ä‹K»lq8ñUjAÀƒP`Ýò'ò¹,Þ2gÞÖíÁ`¿cÀBdͯ^µ:}LÓM²¤k0Ñ'’e²î;ÈSÒ+ÛbWñ¯Sz5 €X"j±˜øÖ­[jÀpN ðä8&<µˆü R†Aà @Ö¬^‹±)Y™ažò±´xR÷!­ÍÖ?8 ‘L€=IÇÎmß¾]EÆçÎ+Ô{¤ ž›wã'](Ãi?]®Ý؈ؤ"üsÖëIýüÅõ þ)L/ãóä䣊Õ6rÁ’=ùÿèsËÍà±S åêKºË„ÑyJü÷Tƒ€¿¾i»l±Ò° 2†»•À@j^¦ì(o¡Áf …F!Ð’ÙbìPo¿°°PO É  4€!æµ UÆ}3m‰0Òð ½lÞ¼YöÜsO5Hª}¸÷Hà"òM™IÃí¯«ê}ûí·röÙgKm-Í E–¡åuˆßD܃ÛÐ]öWà"TØ~µä¯Ax8pÐû´ßœìûûÎë‹Ym&åj&€IYæÄUëjët¬¢"¯ GY·«CŠlÆúçaš2ÁeÄg+iH‹â²Œ)•@ÀCîh­zðUàâ;(óZfóæžÇ }Òß– ÏëÖ®1Óù$ÉÏFÌóá$™«;Íø­ÀZtM=8£»#Æ• €þeÍš5z Ê÷}èС*¢NȼӬ“L €ÓŽ-–’¢LeÔA”¿'úÍ-XJˆŠî ¢þüSKÀÈ祼ùAµüáï;@à7AÒ©UN8¢H®ü)<' òJlú®In…jÀªu JüéŸ-¿ýe­wÜaEj`Þ×õ²«¢EV¬i”C÷/ÒâÐ<é¢Û@2ŒX¥„¹dDºþlÇý#ÂKFÀÆ…LöËñØw,A¾3²Oû3‹îãÞÇå—_.Ÿ|òI4ãlEcJn¹Ò[Ѭ¢Û6œø)*õ §b²×)..–þú~ÙD¾G¼ßKô{ zËýf-œÄ¿)3©Q ã¡¡¡A™á.À¬NÜÓÿ߯}”NÀeÄoÁŸE׿BL¿¨†@÷Q‰  ®žn}9eêŸ7eÑ~­\ À¦×`ýúõe­I¤åˆç\¾EçÔwƒ»\yˆ"R&|"a]\D¨;þôÓOëûœÌö°VxzÆ %Ò»G–êòSŸÿÈC ä’sËàÊ/OÕ~¶BþùŸr¡ºöûñ™¥råÅ=Ôê¿ég'Nö_~»Jž~Õ2Ü× ÆïšÞ^¬OP^^†ì=*OB…€R•Õ­rÄÁ*‰`ú•ÒU Õ0( ÀoO¤©÷IcѨxʽ¥ÚÇŠ+dÁ‚ê‘€”öH×@£‰—^zi4Oõ¹ˆ¿A¤€Üˆç \‚ÎûÆs€D黤´ÞSöR¦€Œ8ño£`îY)ŸÅªë{mžÑÀF¦Ê¬¥€a°‚øÄããΠZÀµ×^+ÿýïåú믗cŽ9FEÔ£1T‡ywY QÆ Å8 oÁ›)¤8úvk“<ÿf•Üûh9Ä?3¤{·L¹ò'Ýå¸Ã á6Ð÷³Bu‚çß´ˆÿ2ÿg¯DÆÈóy&j/åc,‚³UkeÒ8è„Hè6L¥¨ŽA—tsæÌ‘o¾ùFן§öàd8Ýi2¨ðÈ#èÉ7½Œ5*œ.R®ÎUW]í3mBÿA$âwâ½9ñ Qú÷œ¾{ÐBñœM±§Ì.qÂGg^›À1M»wVsCç­·ï Î®sGrñ]ïïÐ=EGîŠï0Ó;‘F3bGñBZOCΗD¿I=7 ”6`Ú@koO.@·ž{YYiõ ¥ÍÇݳÁn&ÜX‚ŠßG<q:â>ˆ<ºõ¥RQË@ô¬³Î’ã?^(*=iÒ$Õ!OVƉÿÓ¿ñ¯;dÞ¢z%þÇÈ‘œR"§]Üf aÔoÎÂ:U%È‘?¤®œZ[;´44¸r]£ÂD¶éßÇ‚_ ¹Um€c.‡jÕÊJ2Õ[@^nÛ-ä)Ô„ TTŸÄ9uø?ûì3)//ŠÆrý#ùVV›¶d,[¶LU?öÛo?ÝcJ¤K s‹n1£M£áªÇ£èÃmê®@GV mp§tq<ø£!ÓQ`G;eb`"S“g{çµ)Œ·úÖÕ±äÇÌ;A¦«iümˆUg‰ÖOZQ/]´øǸ‹JÏ#ŒNZt ø zP Ø‚)à©fçLs½´¹·’§¶3“¬„†ó:wáE+M«¾Žçf¤ú ¡R4î7¯¿þº¼ýöÛrÑEÉ%—\¢6H¤&kØÏÿ€Èÿ‡_ÔA¼>CFÉ‘?_×Kúíx)Á/P‚ä·Pbþ(ìQÖV·ÿ³ùuÓ$ &ÜÜ+Ò"·ß¿C^˜Q-•UÔUµVmÚA²‡!%C!´)½0RgäÈ‘2{öl¡ Gïd$¶£ûÀv¦mcc£|üñÇ*m0mÚ4aLæ½ g-jjjäšk(XUXÖ º„Üè”  :eèÎ$ÛVM"¸TiÃM^™¬•Ç%-\ÔÔ¶ˆ{ó¼g` ˳YÓ´á=7Äux¨qw\GèâÎÓæeíâuž€ñi0%D¨ €)øBkz^qH9gg^¯YÆŒdë…ß÷yýŸÝ|ü¤êeÚp÷Su;ñ¹Èøü/ⵈg îŽWøGBñ¾ûî“^xA®¸â 9ãŒ3TTþš“-P%àñ[¶5K_ <õ˜"%Öƒ=LJð °e; ·JQA¦œsRI›ªÛw5ÃÛ@½¬ÙШ÷&ŒÎ…5ÿ !³¡ªú÷ Iü“™ÀôÝYµ2ûË:uSxñ9¥Òwà¯?Oæ{ö쩌€1cƨèþÊ•+Õ_~~ø*þ“6°iee¥zƒ ^ü 'œ ” HUìm·Ý¦Fý×£×;Qw&â;hãVuW Ú$¢í9ÁÚgeSÀÁAzQE«Ü\kj×ëþì¯r4yÏå}7Ädh;…t[J—Ð9ÛK<%V"ºl»8¬¹CôkƒX]fàé­• €Ö9áÂúowäÏÉm;qïG í½,qáE njiú¾ñÄë@ì†׿#¦ãééSO=%W_}µž÷èÑ#*Cu˜s§†eY2yŸ|W}½Ê²1÷à߬ªi‘ÜœLill‘#)nêh6nßû´VKöè%£†æI/døÑ饲«²Yj`pìÈ<Ø7[~®B=Шà’Ur×½…í‚Ú_4hÐX,í|õÕWÊà~P€÷#EX}޽aÃyôÑGÕ`àÔ©SƒM'iËéíâÖ[ovþ‹ÐÁ}Ñvâ¶wW ƒ+@t°£D¯îË|FÐ_þ šOÊ2›øgêŸw^kg |ùížì> #ÀªëþÆxÎA)/9­ˆñrºÝQ:²ÿKæ¥p®„}ÂI›ÍÂùPšÔwÎ@õkß»ž+»šçÚ‘ñý8n¤f6m>}]öT 1òYˆ'!^¸7b!b[uÆ*P/ýœsΑSN9EíPg„¨ÇxS¬ŠS?¹8ß³wûŸh"‰tQZ &@ÜnþÎÒñwNkÉŠyefôü›©18W(âoÂÐ9r÷ôÝä›-M²çnÖ˜44xÙ[å“9u²|u£Ú8qZûjϧ-øÓKUfÍš%»ví’ÒÒRë?3v¸©AxiˆÒãÆ ·iRÕ£á?ZÓŽ"lDÛ—þÿöÎP²¢Ì÷uÃäf†4¤AÁ‘ <Ap ðŠ Šòd×·¸†]Ï]Ew ›|Qׄû\w} ¨ º(AT‚ E@‰’†4ÌàÀÒ&ÜyÿSݧûö¹÷v¸~_Ÿª:Uuêüzî×_å:Ê +ÆC`ë k<¥¶ažþÜ*Ù‡™§ô)Oôg5ß 5úÓÍNé¥Ë7kã×Ô• ËÿN_7•1QW×§Ýê4N_P¾ï3oGekªÖQ$ZSÙ õÿãÂ5ƒÀÖ´mÍgæÚV—ÌçÏ|ä?¿•e«”J¢ „¶Fà‡Jð*É?K“4Ý]|ñÅáÕ¯~u8ýôÓã:roT×mnÁîƒaöLwtö…eo /)^lÔfÿïü'5ÿÙøÚÏßkr8öð¥†~b±~ýPEœ;JöY­ÚX÷ìf¸>¬]§ Fé<ëÂÓôÝsê©§Æ Ÿyæ™8•ßE¤ý(‹‹Él`zIÇá‡\~·¹_þò—á?¨kŒÀ_üM’³» ïÓzf _»­–¼™Ù¨/¨–˜Û“ù×W«¡œÅeÙSQY[xy¥gvÄ?‡Ž«äïTcÏZì ×3¬môm^©º¼VÒqg¥úìg¾xŠg;9 æM“|†t¿†Ã¦Ä5§Ù€ddúZíïÓ¨™Óg÷úC)¬ø¾¾þì^L“Ýs:ÅŲV­\–ýч=ô„óüáÏõÄ›ò’Í"àäuw†zz¾Ä‹Ä›ú[äUoP÷£ý(þ {ãºéÓ§ÇiézvÇ;Oå_½vs¸Eôå«6…¥ ïøÿÃÃWµ™à׬ÑÙÑ.Ò>ðÄ×ÌŒ› ¦w¾ÏþǪ0uJØs~¶1 g\råj,FïºÓ@xí3S–Q]­+=#`Þ¼yÁËæÏŸV­Z ô½±ÛhÃ×®{ì±G8ùä“»ný¿ßï„N=öب؎èÅ{ÿG¸O4šIàC*|ëÓ„šYƒ•½óÎ;…9sçh¿”ÍQb#^›§lÞìT³ëf…£?ÆË¯ÍQcºx?kÜ;œ¹ÔQ °£dÂÊÍ<ú|V›´8­·lëZŸ¶“{üñÇuŒí¦àk‡º•ª÷‚­û¸ªÝ3ÓuÆE§y™VÑ7Kº~“‰"²¢+ÆÖïO µ4r_ê…­œúït6:‹.©Þ¨qs½›eOÊ8ïÓ-',fï:#´â冚ÚHþ8bº˜€Ï%¯ä<É?J^*™#iêF<òHøð‡?GYO;í´ðò—¿<6N}~}§»W½tz¸éögÃõ·¬Õ~k‚wü÷²»¤õÞñæÙá„£f¨¡Ÿb²·¾üªÕáÊÿZåEûO ì7%\wÓÚð‡{ÝøÏôèɯÛ&K<ŽO7ôÝø÷Ô}7à½<㪫® Ë—/Ç6ºcyk¿¾ï =›£¾¯jŒÿñÿg¨TÇ!ü”Ò^#qçA gl„òìÏÌ8,™ˆöHJ±Ñã,¦ø¥¤¸xË·åI©´ lÖG¦©õ™n䤼ÅòF㯶G“§ÒxÝç÷À{V¼bÏü±V¼u{þCÕx§düVU‹ß#Íðµ\q@ŸFè§jЍ{N­è’¸¾É?ìZš 0Ò,€Âl€ªO=ùTXºdi;áhf]<½ô3Í|e÷%zãïJIv’XzF@e UtK—. ^xaxøá‡ãŒ&¯MwãÒº¡S7è;üÐéa…Fþ=¨þõ*eÖH½…ù» †×=3¼ÿsbÜÆM›5#`³ÒÚ;@3þø¸NX=OXºlSøýφå+ÝyÐ7 t§ÁŸ0k‹hŠöíHÝN X°`AœàïÀK<µ¤ýf‰ 7Ï^¸½Y‚¯ƒtTð xXe¼Wòç’ŸH<ºY×¹hÊ¿Uwÿý÷ï ðö·¿=\tÑEá¾ûî‹S-·š±CXGºqîQýÌõ…ßÝúlXõ¤Û™Ûvv8ì ©aý†Íá‚?g¤{ÕW=Xlü»ìZ§)¦«.ÇËÜpØa‡…w¿ûÝñèF7þW®\ó¡íegÇsLuÖ®¿ÿýï¯÷=¼|æBÉCõD~ÔI@Z 7œ´I˜$¾u²­óRDŠË±$;ÔW»ìb¿ùºfÞ,œ‚ŽK÷ì•+–Óþ¬Võyšjû㎪qƒ+K@ƒŽ³8­ÔŒ#]w3?ÙL *ÉÒ¥àÉ”e-Hy–Z·*ò×NÀ €‘¸¸Ve¼QâÙžÚ¼J²Å?YݯÛ]sÍ5q9Àßÿý߇_üâqÇúd¬Õ]xpô˧‡W¾tZ¬É-w® Ÿùêʸaàu±¬Ñ~kçï æ|xZ³FãFÓðßZG€ýÏyÎsbCÿ}ï{_8òÈ#ãé.«W¯ŽþN^š1CŸJá%(u8 øïä»u”AV4Š@Ï´)¼ö©ðsdM™iË\gê’©´úw$†u³¤ó<Η剾¬äüž¸úêÉŸ–ÒÓŽ%íõõ?_Õ¹Aò’öªVV›jåÕvu”Ñê¿löN=¥åÃkò8sÉ_J–Ť;¥èÜS1 ¬úf÷…{¦w¿û¾ºŽ~£ï¨ö?’¼[â){Ö“s%Mußÿþ÷ÃÏ~ö³8#ओN . sç6ý±M}'>iRx“Öü?ýÌP<5ಫքoÐæ€Þ°?Ü|Çz5ýû¬}ao-Ðþ{ÚœoäjÔø)G2†kåsžY³fEÖ>nöE/zQðù—½ìe#×±ñÞÈËuºÛ•ÿ|Éê:Ë!;A gl„²íg1Ù‰ÉW'¨#ÙÏYʬŒ’ß“Lkÿ O©œôœ‰¼¶sÝr.&{´ägÉ©]žM@»|åzøˆÀJlèâÆB Y–1OÒ [) Ó¸5ÅÉX¥’ì©•´Ç6ì™÷ÿ ˆšX>âì É÷$-ñøž’é’¦9oÌæý.½ôÒpê©§†£>:®W÷YÌêùäðÖ·¾5ì³Ï>Á't²{Õ¡ÓtLà´pûÝφí¶Юû!l¯ëÔÉÿs÷ÏG4z;XêþÿøaíZ/ß·{@9½A¦;Âp€@‹ Øö³™Xa*Æ€>òÈì’œv˜òËÿ1CÖy•ÖÚ7­ˆf¬Â¸qXª\ $u)Üq=¹Í3ÑÐÞ_нªÞ¶1û8¬ wå†ó„W¥fŠ ×ûD%*ÅZlü3–ÒËSò—d1éNùZJÐkÇ6¾EPF‰c%à?Ðó$—IÞ%9Q²·d¶¤inãÆáÜsÏ —]vYøó?ÿóp '„¼àqÊzÓÚ‚‚÷_8eØSl“6²Ïw˜ý;ì‰Ýqà 7„o|ãõ¼¨G³~#aã¿z(’·zÆFH§¢ˆ’dPrDÁÿÉŽÎô¡g äÉã5˘ٯÉ?¬¸ …‡áM<[ðÕ)Àµ’@OLÕ©|åŽ ¹×ÊCLžziƒŽ{…VØ„’Ø3b…l){ºV¿‰§§ŽÔ¹P¶ Â=óãÞßU/½ÂJ½ì’S$îøƒ¤é›¢­X±"|éK_ ïz×»ÂYgnºé¦àë»ÁmÒ†€v4þûmzÉØßþ­µ¨ËÝ¡ÜK–ÕU ™!Ðx=a#Øæë/Pi–CòeÿWP.v8Aêˆþ”!’w ØÃY1•ù+Š&PIÀ6ÿJ&!:*p´uà#ªÝn’ [`Ó®ŠÇõ*6ÂKºRž’¤¯¶”&óT¤OtUµôØ2€‘H‰&à†¿O °\ ¹GâÑÒ¦º{î¹'|ðƒŒ »üàáÞ{ï­wmwSë;šÂkÇgFnå“GÓ¹GÆ ú·²„Î þùq I5Zy¯–\RGd…@³4Vq4«–u–;|_+©$E»Sqþ?W€éZz¼³ÄåìY)ÕådÎQ´wnçwö~S±'ôØý$ÿ01ÒÐ9ß•kêµ,;H.tWE *Ù¤>Ó½¨a£bJ jëJ*Ë“•Pð½¹BwšÁÁ¦î?–^¤®=ñãÞ ©C]~©Ü)ù¨ärÉIÓ÷xÇ;Þ>úÑÆ —.µºîg•XP‹/îÆ~ߨZ㿺¬‘Ê­xH›%›Ï6a’TTö%se_)F -ê8Gèv–Eq1œG”od‰²»N™€gú¬Þ;GNÂD€=‰Îº¾QÕõž¿,luÕ·Þ€nuªzD­EµkJ\Ce]*©68Ëï)[gÉÔpôTù«ï¥4Ù5ë Ö­8@ ]xäÿ;’ŸIþBrœd‰ƒ¦9ïpÞyç…Ÿþô§ámo{[8þøãþûîæÎmêc›ö>£-x, ôj]ìg$=–rF[·vIçã$—,©«/Ê=Jþ÷üëvy'ê^$0|€(؈Œ†dfMÚŸû"¢ds¦kÊ¥I‰óNåðÆÅMc:ÇåJ2]cá|¬‚ÿ.¹£'À €Ñ³j·”6ž/±aûL»U®Õõ)N‰JвRý¯QMj›'­¾/!‹èÂcªFxWfŒ†è¶%à#Ò>+ùß’oIn‘x_•¦ºÇ{,|æ3Ÿ §žzj8û쳃7~óQ¥ÝèÕhoT9íÈØÇGúßCÎÆ­GÿqhW=a#m>Û‰ÉV,)yŒ.E½Vas–2–gdi³±+ F”;j=©üÌžõ]©7Ÿ)¡ñ?ÆÌ#°6LþcÕÉgaÛ¸}‹¤©:V`JLl'—«Ý¨Sj_ªY͒µ¢.¦HtÕ½‚·˜²+Ï©®xAè|·ëN“#y«ä`Éž’¦êËÛn»-î pÄG„·¼å-á°Ã {ï½wל’éOQ,8ÇÕå/$‰ÞZySç/ÞMy)o»]7lØ>ò‘èxE¯8~w—²úØ¿Eã/‚œ€@#x@´… …Ù>L’E;”ûŠÊLQ)oLQúÈsëbŸ{Râ ¢ ëHûò²ÒÕ±=ê|DúáoŒ¦?ã¨YÆOÀ;`{1ú$M™>44,­tQQJámíêQ?–>R¯©"b\®t«ñðwÉÇÑ[UFi=ØðˆÚ‹€z»ä“’K%‹%Mw¿øÅ/»ßýîðÉO~2üð‡? <òHÓŸÙŠ¸a^«q^¥"‡U¥æý¼,—W¼_«üa¶q„—ƒxsÈ:œÏ)¹¨Ž2È 4ˆÀp›ÏbÙH,‡ q¹R+7ܳT1…>âm_c9û5ɪSGo¹œ½TÅ´°}àéþ'KÐø¯ã{sƒ×]<æ’’ƒ$ ›åáu¬îùÜn»íTlû¸U«V…gŸ}6N±uGÀ”É“ÕOªÿä÷¶PmDÆpôë—þþr¸_aÇ+.^ûtU\_ŒWºÒ5Wڔߖ,Yž~Ê›3÷„ûhO¼%/Ùͼ?Àï%ÿ%ñ¹}îŸ#™&išóþ·Þzk¸æškºuë¢.3gN˜6­©mÚû Îôk1¦ì÷½¢+6îŸòV%+e©Î_ºÑÿ6rÊ)aÙ²ºNì»N¯úÿ$>þv&pz;W®Qu›=gvØe—ÕhÊ%¤Ò5‰ÝdÄÁ+§ó}ÿ—÷ä—¬š¶YÓòoXŸíû9uêÔ8·Ûn»5êuê.ÇïáMN=ÛiåʦµÉ½Ôù’×IÐ…ukMžþØ€úQÄø |PY§JþÄÇbÔíÒè»õ<–^¬¨DcdŒ(Ý.zj¾ƒ’§µ¯)¶X’zXÖÇRY0!@ ™¼Êç%'9KâÖ=ºÐTçÓ>ûÙφ÷¿ÿýáœsÎ 7ÝtSìhêC[Tx­ÆzfÜŽ\êûÅp­òF.©½î¸“ç›ßüf¸åo;1ngkúç’ŸŽ»2B %PÓæ«6ópÑÖ¬ð«FN’é;ùò@¼äY÷@–0‹wzûÚË¥¶Aº6¸vnø¿Gâ¥Î_npÙ=]-—îÿú?¦W´ì 9[r´d’dÌÎÜV>^ËèðvrÝ/;«MõJOz ÕH{”©Ó•3Ë—‡*#+RÅ aŠñø!Ž àšÅûxjá¡’çIŠJEÁƺßÿþ÷Áòš×¼&üéŸþixÉK^.\g&5öI­--©â¢jŠ÷µxϵKᔦµ5nüÓÖk´îºë® û˜zër¿Rî‹%­]{WW•É î&08)o:ÙFL_9|•K—¤à²Ø\ßÒÊ›BeeèH°™=›gmËK±mÐÀ z³Þ3$o`™U @@F—{×ûùÄ»÷IþVâ£Gmä¦Þ=wÔ<E…M´³š4WšÙæ)£}Ř;{…‚7)ñXt•"wÜðõ`Y|BEÀûøˆµ“$'H^"±Žlª»ì²ËⲀ׿þõá¸ãŽ‹Ο?¿©ÏlEá©1o•™üé¹)\­N‹á”&å餫Gý¿ô¥//¨Ã= ¼þ7éå*8@ M hõtÑFÌëUåP9& 8eWŧÛÑ[Øg—°œ®/oÅNâT^ÓšÏʶò3Ó§©P¾3fŸ;:=ïí’;Çœ› c"Ð^øcª:‰ë ðEåõ"ÿ6v½›æV·(ö:{;n´›+)¦¨LU»¨ES@A{õQ­4KÊ8½PÌ—¾" ÞbŠví )Ö? 0*žnx¶ä½’¯H®’ÔÕŠSþ­ºgžy&œ{î¹áø@8óÌ3ÕW^Yoãq«ÏlU‚-5ä}oK÷[UÇF>gÉ’%á‚ .—\rI½ÅþBü°ÞBÈè™=Å’Íg“°(æ\®É^‰*Ò9œK¼c[µ˜Â‰Žib f±ÍŽL6tõ5µ Òuõðïî™’É’—Jhü B³3šM¸ýËÿ¾ªh±{§Äçe/”L—T¸ôÇíkuCº"á²+Ƭ‹´ì‹:3uœÆšÕ¬»k^ïÚ×›%r©Ó!ýäÙ¹@Oà!½Â§$WJN”¼BrdФinñâÅáóŸÿ|øå/Þüæ7‡W½êUá€S¦4õ±M{ŸÑìNÀE—ÂÖAàŽwÔénT~û÷Hå­"°ÕA¤VU¤ÙϱÍW¥®j>²:M²=³xfRVÀáâ ÿæ8£ÕÖm–ÒKeÙ?Ñ®Ø6C]–+í·$ÿ$ñt\‹ ÐÐbàmþ¸¯«~–äþJž·I^(™î>íÒ{ ´åG®$µ~ª¼@T©¥Ú•gY¥úv ¥k)ˈ–Œˆ†èt¿Ó ¸1v”äõ’WJö•4Õyc@ïðêW¿:¼á o/ùËãþM}èžûÕUè´ÆÿO~ò“ðío;<øàƒÕ¯2–ð%ö¦žþƒÚŒÀÀ@qò´mÅ\ ÞdJmÍòk(a1­y8ùwÐg8”ígUÎëYSÙ@W1n"ý©MÚ[¨Ë“º÷cÉi/KÆM :&~<úkª£ÅS»îÔ1VÏ•2LìíR+X+DëÏø™y a/m­¶…o1_1ºXZm8‚"üè6þwï™×KN+y™ÄË¨šæ¼žÒ Êk¯½6œxâ‰áØcûì¼óÎM{æD\Ýøo3ÛvÔHÖ¬YN?ýôp÷Ýw:Ï ÿKñ?’¬á>ÑhWÖ•íÕ:m©ò¬Ï­˜Dùíb'@ô+Þ·’ØSôÇ*§MâèfÃz@«XV^m\EºMàzUµ ¼žÿ’k$_•\-Áµ:ÚèËhãªxj×Súã^¯?òÁ´@ÛÕ×4Ó“qúTiÅÕr%Eê|véš…*#†Ý+%jÛ Ë5l˜o ö ‚@»ðè…§,Ú y“äHÉ!’Ù’¦¹'žx"œuÖYáꫯ'tRœ pØa‡…9sæ4í™­,Ø þêN€V>¿ÏZ½zuøÄ'>gm¨£¼ž"m0{ôß›Qâ Ðil#Œ`quÚ«Œ\ßlЧ`ÙƒÉS¼få”ìÍ”´ÔäÏÇü­%±fÓWc¹q@ÅyN@;:· ü~šàêûwòÍwšãÚ˜müå´YÕiDê¹k×®.Ï­n§u©iJTfHæÓ¦r€ÖHQ¬\³ÃÐú¾]íkŠÍT—QóLØXZ×}¸G^'ð€ü‹äj‰÷8\r d\Ç«*ߨܢE‹Â§?ýéðÓŸþ4øÄ€#Ž8"8iRS;ªºÕ›¨SGýýÞO?ýtüN¾öµ¯…:ÿ.Î#ÿ:‘@ÁXêÄê®Î%›Ïo;†7®°SÞ˜?køgÞ¼@ÏHÎr)&ÎxÁ–MYZuuãß§¬[·Îöµ7Ìý¹„Æ«¾€:žC@ðz,ë-zß—é|[w¨# }7¦²–̧O´@úî*rI½æj6iÛ”¸t¿==´•_=¡Þ&pƒ^ÿfÉ«%^ð'’ý%Mu7Þxcð1s^àc?üð°Ï>û4õ™>2ßüæ7±cfåÊ•#'Ý/1ñî÷Œ.9© Ðv<[´ëOÔUö¡ƒÃD•6¦ÃþÎÊ þ˜'KñNMX_ZNý* x)jÂÛvùÕû—ø7×èè€/©Mªø Õãêp#°ßëgÏnêÌ×1½vY!fŠ5oÿKa&µY.®Z!GÕ°Ò¤k9yôï•׃Ueê¾`¦é»ï½x#Œ—€wF½Tâ)ÛÇHÜp„¤©ûx¤ù²Ë. ×_}8þøããf¯xÅ+Â.»ì¢GãZEÀ›5žþùá·¿ým½ôºs$¿©· òC` ø¬håÖÕ®hóÙ6Ü’}hÃlÎR†”[ׂ×ÍšUÚ0=¡”¯F™DÜm»¼màïßm\  ¾¤6©¢G'Öé¼jï05õúµIÝòQkÇlªTV/+ռ봠8}o˜BÎ2”?‹é‹þrŠ’¯‡6\Qzi<€@‘€‡Ï—XOÞ$9JòrÉ6’¦9:ó›ß ¿þõ¯ãiGyd8ôÐCìY³šöL άZµ*œsÎ9áâ‹/n’óTˆ§Î>݈Â(DÀSÀ»^ù ögM§JÓP!G¥ð%”mÎl*&,¤^}¤»}qª€ì×4šåEó¶PöDzÝð»¹m z¬“øä\  ¾¤6ªâƒyÚI=}S]']Ûb@R¬Ö™³ -o—kºUãšMÉÊô¶o§r²k e+CY\±78‹éÚχ»öÍx14†Àý*æL‰Gr“)9XÒÔi±÷Ýw_ø—ù—ð«_ý*îðÊW¾2tÐAa` ©Õkõ¦óoοÿû¿‡K.¹$x“Æ:Ý"åÿ†ÄÿvpèdKTùÝ;ùFS÷Á’˜¥¯e/)Úª1©>²ÿc9Y”?óHûòÆ~jÿ§ç”ìÝd¸LËb¼þßGÿùª¶O-yH²©eàAu  .|=—ù—zãýÔÓ·íÔ©Sû¼ùQ»lXZëÐÔkší}OÕú2)Òünþeº»tÍBEÅœbÒµ‡ö¸-½3W@`‹¼?€÷MñŒ€×HܰPÒTçõè7ß|sÜ ð¨£Ž G}tØwß}›úÌ^+Ü#^>‘á+_ùJXºti½¯o£ù‹’[%ÎõÒ$ÿD¸S8t¢+ÑìçÇ€’‰Xòè±öexMbj}Äk!mÊ•îd=^ àÿì®¶ìJöîðâ[£¶@|ž®® g/ý²¥àau`x .|=—Ù#§è4€mtÕ€wþœ;wî„CxòÉ'ã¤'ž|"ŽûOš<9ÿ÷*+Ïxµ?“þþþaþþ~ßëñªûýNëk!¾_÷S\*Ã/oÿwüaÂ9´ 6TïhÁsxº€t÷J<%r™Ä‹%wÌ”4Íy€{ï½7x}ú£>|DÝŽ;îȲ€÷zÿ}èCᮻDï©r‰äó’ºw¬·2ä‡@ì¨2^×€rÚºˆ}÷Û' ©q¾y(ÚžLÚÃŽ­(oE½²šÑnIÇ·õm‡ú?]7H¯û:eò”xÝi§œrBݲeËâ ºªz­ÃþVÂ2¦ ýVFÿpfŒž)3#öAMýß~ýúõÛZyêO»Ì()My²%V¥Ò¢Q£–¿¾Ê‘ÿ,¾"I1Pô—‹ˆJ>Ía` _Šp(Euëõòn}1Þ M$ð˜Ê>Gâeox”¤©?þx8÷Üsà 7Ü;<#ÀKf̘¡GãÆCÀ#ÿžú߀MÿÜ9äÑÒOKO]È6$piÖ©¡U*/ù,‡U^£:Ê•°}š%(¥‹7¯˜4U5_àKL_. v‚âU Nÿ÷UmÏdzPR÷”¨ y™}(=úÅ×ñÚ¿RÞ…Uš«†ßSO=¶ß~û:ŠkBVkK÷žÚ%¿¯ÕZÔQIÙ:­\e’Z¡Ê¸,—ø ªÀ{ t­ó‹?ÙµoÇ‹A ùîÖ#,×I<+ÀG¾LÒTwÏ=÷‹O ð‚^pÈ!‡4õ™ÝX¸;Tþæoþ&²lÀû-Rßxê?ÝBÀ3ºÚ [òY0 Þa ÒÌ€ÌÈÌ;bÀ¹*;œ9›öï[îPš¼ðd³¦«ÓN„³ío—OÿwÀm\ —J'K/ËIDAT ƒ¾¬6©ê·Uÿ©ÖkÀ+í¶Û®i=’£QrNãQøÌ%l…)š÷ž¦ØÄ°v¹)URÎ¥Ô%å›bª¯ƒ“ƒ{B»Øyú2¨Ÿ€ÿý½Q♯•<_ÒTçýn¹å–8z}Ì1ÇÄŽ€½÷Þ»©Ïì–Â}ÊÂÇ?þñpÛm·5╼kàe’óQe@ Íx'ø¸Qt›Õ«!Õñ €’ý˜LF•\ðfŠˆò£ctºçkQˆ÷dƒæ6m: 0»‘ì\…*ìÞrù­ðùÙ^z«åÀ¾ÚðµœÛŠgóŒÆ  q,{¥¤õ¢whêÿLÿ¹‹§“z3À‰>v*ëpÃ=ë7M;§fê2jÔL¯Žô-eIrå[N”¢Ë1µ}“'Õ¾Ñ=±uÏ«ð&˜pîP»Bò{ÉM’£%¯–Ì“4ÍùÌæK/½4üîw¿‹³Ž8âˆà¥óæ5õ±M{ŸV|ùå—ÇÆÿµ×^Û¨ÇýP}S’ ¡5ªTÊ@{X¢jìÕUi|-' ·õJv¢=¥ÀÖž 4¥,eþ¬€ì@§Ž€¬ <+ x•:"¶ö¨ß÷æÞkÆ¿'j xí¿;´9ŤÁœ›]›6›pw–ï­?”š­†¿ÁìÙ³'ìMÝi·Rç2[UNž,m¥©Ö¿eY¼ù_¶iŸãÒF~É_Üð/nöç¼ùF€Å ËéûKïüðCK®-…»Ðó]½“G­p€@ãxí¤‡•ÿ ñúI[ó%M휷÷ûßÿ>ÜyçañâÅq4iþüùaR ãVuéIçcn}¬âi§n½õÖ8ÚÕשŒ3%¿n@Yv$ðbUê€v¬X#ê4kÖÌ0÷ù¥ ü†4î†xå†~Þ°°A`J¯C!æ)m˜6Tít¿Ô [ÕküOWÛÙ¶='MšwÈNÛÇ{,ÖgÅŠ›Ôà=L>-ñò6\hª‘ÑA¨êØüXÉÿY ﹚þ¿­³ÚXÒÑ€c+¥©­£â´Ò´ í«ý–èŠ7me[p¡Š@J¤Èšñ¡ çM¸B '`ã)࣑Öð§Tx÷ÝwǼ7€÷xík_^úÒ—V¥êÍ gJxÿ;üËážê3$ ›JЈŠQLàßTÞ) .³mŠ›ä¦ÜÕ6kǦ<™ ™öGƒRɳå8‡û¼~ÕNÓYãñ12²½;Aζ¾Bõ’Wµ<‹i…ijšpF€€ûÂÚ¨ºîø $é$À¹}ê »ì²KT/S¢q!€hÒ“™†õ«nøg•N ’.¼Šn¥»…Ø o­ia :;à×wã4€ñ)žàFâ«$o”<_Ò4çuœnü{6€ô’€ãŽ;.,X° iÏlç‚}²ÍÏþóðÉO~2î™Ð ºnT9_–üHÒõÇÅ4ˆÅt&w`v­«½Ü3YˆéšÙŒqf@ÅèŽ%&ÓGöÍ«þvñD«Ì›…ó«ÚvlLÒÔ•+=ã?øxY×j•Äm\  ¿´6©òçT—/_þÄÌ™3çú¬i÷ N›6mBªg¤Æ~ÔªêPØ*Iôl©v%ëdY°*r„ü“´ `;oZ…ƒZCÀK¬~&qG€÷ðl€$;Hšæ¼—ËO~ò“¸4À>-à5¯yMÜäµim³‚=Íö›ßüf8ãŒ3ƒ>بÚÙböò©Ihü7Š*å´3Õª\Wž7ê ŸíÊ–aò¥kñ^LZñQN•Ò9Foø=ºdXq/€ØÏPêhïV”Úš€GÿÓúŠâMOK¾Ðš§ó”F`€Fíò<¢1O½ µntŽþ}6l˜Í}âʲ³¤3kïàõÿ^÷Ÿí 0ÞõÿÙ^Ùþ.#¹å/+–{&TW:Z]ЕoÆKA } ؈öæJ^àcãìö”4õwÛ^óîå>úhœê¹Ûn»I¯NŽëà'ÊøŒoßÄ›o¾9|ìc ŸûÜç‚ük€³%¯_¤ð)ÉW$Ë%8ôWê%»r#ÀyóvÔÑ×ÛIªAG÷óµþy¸´'€ï•ÒT¦-ï­ÿwØ + ‹‡E†k´]Ó“µ€÷j™ˆã·½ößv¾NÛ¬A¿GU»ïK¼™-® tõ°e~Ve÷ü½1Ípå'j/€’Qš4hì1ê3gšÔj¬ž>Uq·"g÷EñÅ[.#=×GÃt±û`¿¯v'p*x¿ä‰7{ƒäIS—ÜsÏ=Á»àëÈ×pì±Ç†ƒ:(ì¼óÎaÿý÷›¨6µ-*Ü›È^}õÕáôÓOîh óÐE’3%)ÃA W|H/zt7¾lÅ1€É"Ì Ã¢}˜n gàTYcßibžÒµä)ä¥ýà njŒm{ïúï-ùõè¿;¨?ßÔ‡RxS tu«¥©ä(Üâ ö à]—¯”Ü!ù­äHÉ%ÛJšæÜX¶ûãÿÅçw^X¸pa\öuà†SN9%ûœç<'l³Í6M«K£ ö.ÿßúÖ·ÂOúÓàe v?Pyžö¿¤ÁåR:…ÀCªhS;('DÙÖË ÄÊËð~­JVäÉšüñÓñéžþÈJŸ±˜8²U«ÀæÆy™­wý÷, ò-ÓÓü;Äès±7½t:šŽ¸ëàYŸ•|RÓ‚Öë$€É>`ÆŒ-O=¢©çÔ*3£Ïõi®XK¡¸~«ö·S.©öý᱃ƒå£a†ßíè˜/utí©<º“€–ÿ)¹Qò_’7IŽ“´dÄ-uxŸ»ßýîwáì³Ï‡zh<=àE/zQ8á„âѰ:*¶m– x³Ú+¯¼2¸ñïú6ÁyÔóÉ% ]OЄºR$šIàk*ÜçÃw•Þl*Y•%Où•mŸ–DÑ¥$ѓۚöçáÌ~õÀ¶‘uš”2+´åé¬å ÔéÛ´iSÐ2ßø¼U«VyF¨§þÿ«„Ñÿ:ÙNtö– ý’<¿é<õj­ š>eÊ”ÙÞ,ÊJÃSC[áÜ;900•”Ÿ7Y¤xF€þϯö÷‡~ÇUm˜6ô5Û 0¿:ìwxÚUlÔWoüWÚô/ÛÐ:±Ôø/txÓ¿ÒF€1OžNUNýÑ~ºÌŽí—M½1Ú±ÞPvvËNgqã?íþ/ÿRUÑGB[Çá:œÀð®¬!ª?a¬.Ò¡OèD€96ø¦OŸÞ²N€øÖÖœú©É.úLçæH¢bÍýµ.µîgq.+WÌ#Øtéh˜ZåvpœÀq€@{X¯êy´9mx”ü&ÙCÒrç}ì/^¾þõ¯Ç%^7;oÞ¼pÜqÇEãÕÇ ÎŸ??Ò;ì°CSêèÑþGy$\qÅá»ßýn¸ï¾ûµ»ÿHõõÒ zºdzéÅÝ¢ÚÖ+ÙUžÚôN”$Ù”…gÊ3f³X³Ù¬N‘ŠO#ÿéÚL¶>òϧГmïiÿÞÛ„M¡› ½…eÓÐBØ]þ(B]¦ž×išÐLuƒî9Ô¾-Y FâKºÕÚ2õ;GÍ™«Ï¤E‡}U7Šy†¥1©;—¸ƒ:ƒ€§d^%¹GâFèñ’“$³$æÒúzý.„»îº+6ú}ÔÞ;|Ä Oð,.Ÿ.0{öìXWÿvØðt¼Ý’Ž/¼I1Þ³ d¤†;î¸#nîçõýÞÀо×Dç‘ÿ[%ÿ˜_›ø(І@G8Eµõ Ñ®q¥åžU&ãØ_0_u±/†ô¡úO3òøìFö”ZºpìÏßrŽ4õß©¤W7jÀãòº“Ó³›p]@€€.øÛè>¬º$Co@£ÿ{xŸ§ì£›íÊ 1S¡Vœ™/² šzOÓµ\¿rOk9në¾ê^á­çhûO¨†žî…ƒ:‹€ÿn/–xY€gñx“Àc%máÖ®]ëáiø»¯~õ«qï7Ô9ä8kÀ§Éø·ÃÇNùèAÏ,ØsÏ=ƒ;Ü9pÿýžðâîÔþñ~nðÛ:³ö>8¬ùo!tÕ¬ƒVKftDmGQÉò&€ÅÄÑÀTDvM¡bŠè÷¢(Ó¦t/Æ«ñŸÇû.!óØnn»Æ'4ìÃzÔžI%»D?&ññޏ.!@@—|‘mòëUwK¾§S–kdg{ŸjƒMG¶¬ŠV‘Ùà®, O.éÑB\ɻś¥T5=£:¦fζôé8@ s x&ÀÃ7L/•¼Mr°¤íœw˜vãÝnÑ¢EqÖ˜üÞ/À÷Ò¦²ióA_m˜¦ûôBnØ|[r†Äœq€Àpç(ÊvaW8ÏHJ®“1+ÂÄBÒÀSáÏ8ò/C6ÞÎ?É ÿò€—cï|<ªõ«;_uò‹{S×IÞ+ÉzoÿHJœýðLÙÝnÓë}WŠãI¬Í×EeÒÌ×N 1S–zR•§¡ù²«î¦âTÊyc–.rîÈùx½¯^%`ÃÍß‘œ&ù˜d±¤­]ÚGÀ;£>^ÖË ,Û¥û1ÐÚ…åc°Þ'¡ñßZö<­³üµª›m ÒYõ®YÛhëÕ´³Èš·ò’|¯(é1>â½”À¡’?¥lþÕƒv>ÉˬZÿÿ¬løUzê…’ß6ÿé<¡•èh%íÞyÖ'õªwË`[*âõ‘qZ¦{›ëŠ ³Êï[™fölÅzdc¾ròZS¯ÒiåTí;½£kOå!jÞÀé7’¯JþJòuÉ nìP7üÿUâ °e_Úòíθ›N‘ª¬m•蛵¢jŒ2eÉô=å«­Ï,¹o”mјL1iÀËj¤sÇ«fïÆ"ÕÑ:¤ŽOý@òÏ|eµ:Úã{è¶Z¸Ñÿ’ZGô°z7{&€¦Å5EiýR£®†g…˜”cÒ¾å°S”C©Ÿ®¾›\LUNš¢GuíèŠ?'ï–å)­8@ ûüQ¯t¥Äçs¿Sr™7z^Jáu°çK–>)!ÐÓ> ·ïøYý[žþ?’éXik:U.ºdy²F~løûŸIŒL ÿ,œ¥óÍÌ5Ê~NåmtïÓ²lÙ2ÏlzBòVIÈËžÌg·èŠK·|]öë}¼ætõ£>ºØÊÅÓ5—.]§mí]“R͵TV®!}IÊ2^ ñ¥´5=)WÍ›[èŠ-5¼™è^CzµE’‹$–xm§w±ÇLÀ¿gß•ü/‰§Ãâ ±8klÉÛ/õÀ`¹ ¢v[0mÖ]ÑŸÇ**Æú#JæIqñêYtió¿¢m\.|>O÷—OKÉ;QIž!f}ÇfÐãÃÚö¹èhû¯¨£+è]>-åòìÃ?¼ÔK¼Ë³gXáXµ¬o]ž•©Ë²F­*)¿]Œ­TÐÅ;có7‡[ζIíÞÞ´Mm¨ ÐLž¾î†ÿ·%^§ûO’{%”<#Áef÷-ñ.‰;Jl 3&8Œ‘€ÿ†:z¹QÙx5lÌ NyC~¸šÝˆŸ)Mjø§²Ý­‡-¨¶ŸÇö´ó7ý“­þ¨–ø·á‹Öý'ö]x¥  ¿Ô6{¥óTŸÿ+…²Fç1/s'€§¥N€FÕ5uXofŠ5•œO£~#%ùš+ᘵ²ÐšytE`šä…’H<­×÷:Ýù=¼üáã’+$¬}LàOTž;Ù*¶?¤Å%¯¢=^ üµ™\§B’RËq²UKyJ=•9]öHå— Ý‚Ç£ýž…ë¹ùúÿÇd›?­,îøýزr«‹ÐÐE_f¼ÊUÇ5êqüŸ=ôÐ#»ï¾ûn®³gl¿ýöaÆŒñÙV`žE¢ý­?‡ýûIÃ]=J´º´É“&WGuJøU”Q®Nù¶¨'ZOÀûƒX|,”×òî ±ýà%GKH”Ì“ I:ɸwgÇÕ’³%¿‘Ü/ÁAÍ!àýEÞ!ñß[G¹É“ë³ñl›–BŽ(E¦‘ÿt­>ÙJá|Щ»Õ³o½æßv³g,^¼x©:Üùy‘ħ5àz„=òE·Ñkž®º<)åsª6¹Á‚{H õ{ÒìÙ³Ãܹs+FÕGSo÷bN›6MzT3lw&¥šë×LÁ&-›®£)yli&Ož4¶ í‘Ú€ý¸=ªB- !ðx^O‹ç%ž °³äÉ1wì!i玀õªŸë•äbÉ# Ð|çèÇJNjþ£÷„Ê€²-YöùY•¡ÚO¯J£`Œ)\c¾<Òt­4ÙlWà§à‰'ž«V­ŠEkCÃÍ÷ßÿC²ÅÝz¶äSñ=C€€žùªÛêE=¥t…χï¹çžv“S~Ê“O>Ö¬Y¶Ûn»Ø M½~iÊ”)q*“5h_¿Çþ­.-•.Å”§XUÞÏByïkLœrÔJ7#Ñ™4e ³< 6bÁ;2Ùa‰ÒÔ)E÷¨¡^Jâ ÷¹ÚëÛa‡ÂÓO?¶ÝvÛ‘Ë×Ïð¨ÿ3ÏxÕES§NõÚÿ•+V¬X¥àJÉiw†âz@GüÑõà÷Ò+¯ì‘Oý7)©Ã$Ok_€]fΜ9Í3,îØf›m¢âª†âµL^Ãä×ßp½.™Õ?П÷›V§ëªL—Tò°§Lm¦;ìqõD¸ñÿÉ“õB^@[ ”åÒ<ÍݺþL⎀¹’}$ÞDpäM’»$/•8Ÿ-[Ÿ@ö°Î²½;zuM.…½•µ—8½g",ϯa¼Lr¿ÄÏIu’L07BŸ+y@20ÁuÙêã§LžR9õ~ÌÚ$ÏP¸Ø[*Fž’]š"ó«¦ì‡M7ùíÍ»îºkßí·ßÒ ØêН[·.xpÌ6´g ÈVÞð‡?üa±fÞºÄ[$)1\  G¿ø6zmwMž"±ø!í àÆþàÞ{ォFóÝsi%æiKî½ôfV„RbV„aß}÷ wÜqÇ3«ŸY½rÆŒéeÊ´©iò—Ôk®Ic¢:>\vy>W© )unS*¨¹Ì{K’QÞܧQ: Jžzjñ °ÿ”X1Bâ©ÀnÄ qoêB‰í½Í”¤Nëú$îÄt~ë3Ï<øÄK ¼G×øg$à ö"`]ðBÉmÿý·­í”ûê¨e/K#¬Ê2û2ž0ƒþЉSúT'ÀÚMkî½÷Þþ… N»óÎ;ãæÙÙò€¡¸ÖörzžÐto“¦û/•-m}èþ¿"ùº×ãèèñmôú^y¹äê½<æ¶Ûn{Hý>5ðw‘›¢©L}í÷†žÖ¤%a¯½ö RlkÔê)d+vœ·Ã¶?¶bV­#2µšYŠé³Ñï®éaín`ztìe’ýî”@`’jvVëq»G%n\"±âÑwx½ª÷ÞGÀ£…iôß×ZÎú¸X~Ñ_+=q€ÀĸS}Ä›r¶­µuo*&ORJiO.ñ’.eøR*%’ò›6mãSO>u÷M7Ý4[ËcwÛÿý§hÿàý³ì¼dÖ›i{ Ìëü58ö¨.ÖŸÖ‘ÿ%ù„QAÀuȺ¾¨ž!àÙ^“ä5£ïSCÿè[o½u‰ß^½˜};ï¼ó,-˜ªãW¯^½ùòË/_‘÷jZ¡½sÑ}Ü=þ®ëž~úý€Hqfÿ—MÀJ]êb£K½¥N“Œ.¥é:yÒ”‘nµC¼§È>_ò`;T†:@ØwVÚÙxµsãßλÔèO×,¶òsœš¼²B€@Kø4¢—H®“´åàä”6Þè•L”ÕQyØ6©g8˜Äûg×=û"EÍ–üß믿þ‘ûî»oºNÒÒVÛöiä£öX÷Ýw?¡FÒ‹õ¿Fò9ɽJÚò¬T;<½JÀÓ9? ùˆäO%¯Ô”ÿý—,Y²YâižÉ%åöOŠˆÇRÍ»Ýñ7 ýèY­Ú’+7úGJUÞe¤Õñ“&ZW·cïµ™í.ɺ‰«+N€ L,oÒù\‰«m7¢2/oÃo‘âð4©™_;ÛTtµë®»½U#ÿ^&a÷zÉÚÌïÅ’l¡ŒŽ6~½ßʯ$çJÒ‘­òâ P&@@™¾ö#àÑž³rqí<3`¾d'‰ï¹g3É«E¥·Þúã<ð˜Ç_v…zK“Tmº¢œa«Nù Y·”|òäIµòÔÔvrw©2û´S…¨  @¨A`±âæJî—ØÖk7iò¤Í›‡6g3LÇS«š¶dedœŠWÝrãÚ´éÿ Æÿ· |P~ŽÍ“!ñÒ(/¡òŒYw¤òâ P›@íhb!Ж<3àz‰×†^)©hü+ÝÍ7ß|åvÛnÿ—S§Má*õš§Û¥²ŒÚyuL‹{Ü ÐÎUþ ÿvø6¨ @£!`ÛngÉ¿&q‹Ò õ÷õoˆ›ó {àÈbjÐËR5²äRÚt5kfØ}÷?ðÐC1<Œq£ÿ|‰ʼ„Â'kÑøÜÖ Ð°uF¤è@š ðõ¶ßñeÓ§ÏÈ4³>GVÑ£}Á-—ÐúRI޶´&¦ó‚ë»·E·;±òVeÈeºìç=oÁÐÂ…Ïßé׿þµgºâ Ðí¸aYS^”B{›À ^°ßž~æ™ç{@ÿÀ@è— Deëkô;®¿p/¥S\)OÑŸçÏÉ®½à{?˜žûýƒµO ‰ûWÄÓÀÞÒÂgò(@€ Ð*“õ +$¯jÕóç< ësí?é¼éÙÍahòš5kÃ&I½QÇSoÚ´Qþ¡xáŽËÄÇV'ÿ&ÅgéSž<ÓêÞôéÓÂsŸ»çý¿ýí{åÏ妨J7VÓžKÁh)Ûn»cŸmçÎú;í 0¼ËµFMF•¨”¯/ öoxM) ä¢n–×ÏøˆÄÇ4þ›E™r!@˜hëUÃ%S$_—ÔÜJñt«U˜PŽnÓàПzÀ”)ê‹hÀªmMñ÷¼…{o~Å+=•ÆšKÓ ÐÐtÄ< ]ÜtÓ퟿ëw÷o3gæ½ñߪm/ÀPßÎ?ÿ‡WÊó&,>­à‘B\£¼.Û;ûûï”ûq € ôwü¥Ä³.ÿNò¨d´›’ŽÚ­PÊ=%~^t~ç Cßæï †3fÄÙ¤éÞè¯YU' j“¿ù᥇|Û^âÔ‹.úq;mz8ú×!eGh@ÿUG¾7•îq|ðK6lZÿó ë7Ìronõ€8å+Ë6iìÿ=\pÁ¿mç{t9[H³¥[^óö¤äVÉ?H®•à @€ÊþBÞ¿•¸ÑîÎñ¶qÖ(ï—%/©éÞüæ?5ú>¬›}>rzÍš5aíÚµaƒ§üoa À¦¡¡8ÕÇw;ì¸ÃòÍ›úŽ½è¢‹~[ó!DB ‰ÆûÇÑÄ*Q4ZG`¿ýöÛvÆ63~6´qèðªýW¼7@¶æ?ïÈÖÿç{ô†þÁþ5ƒƒ?¸øûŸ2†šÎVÚH–x}WvF¡<¹sC¥Ä›÷Ý+¹Cò-É3 @€Àè l«¤^¹¯Äv×<‰ã<ûyPâ=ìž•xƦí.ØÜ/Ùª;餓¦…M—„Í}¯TâÉÞTzýúõaÆ Z÷?¤cý$CÚ1@ñv“'O S§NÛ4ypð7k×®ÿ³K/½tq¼Á&€G¶'¿øÅó§Ìœò5ÿŸ?©¿oš:v7÷÷OÚ48اÆùæÇúû'ÿä²Ë.ûq{ÖžZA€ ´š@ì ám›û7¿TÏv'CÉõõ ­ ›©cà;_|ñm¥x @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€@øÿUí‘DöÃúIEND®B`‚ic11 ‰PNG  IHDR szzô”iCCPICC Profile(‘}»KÃPÆ¿¦jU*":ˆ8¬ÒJ©‹£m…R¨Pj«&iú€6 IŠ Ž‚‹CÁÁÇâkpqÖµƒ« (Š Nþ¾)ñÜ&ÒªèËùñÝsÎ=÷¸MAU -~ ¨Z"âçRó¼ë m@z0*HºŒÇc øÊßãý–¯}lÖïû£+-ëàà‰'%U3ˆ—ˆ‡– •ñ:qŸFKï0ÎZ|ÊX´¸Z¯I&ÂÄ7ļ”ÒįÄ^)§ŽÍ÷¤‹iÒ¹)‹Æ9ÆbSo¶‰‹…²dïÉ~è–•ÙVOgD18xˆ(# ø(+¤èHÐ}ÈW Ö.©«Z>›3ø 9$óQEóò€|g~ÿô±¡•€‰7ÀYihâ6p¾ôß74Ï>ÐM^]¨‚&Ô%'.“žOÈæÐ{t.è™ñ€õ#wh}4Í—aÀµÔ*¦ùqhšµ#j~ªŠå= Çw@r ˆ]»{ÀH–Þ\üãöºG¶ÿÖØ>~ywÙPvä4"IDATX íV{P”×ÿí²°ËcvYY…•—òÜE@F¡:M4&X¢ÑúmÚÚ?:Ó‰Ó6Q’ÉtÚN'dl“vˆb͈0V#¶ $ˆbWÂ+ Ë>XØE–]¶ç~ ilúgsfîwïwïyüî9çž{ÿwòø_˜˜˜+ %z½Þømtñþ¡cG.y89yÀb±l³Z3 ##Bc||‡Ãmm·Ùl5nàÔ pïIt?€µYY><¯ˆÏçÿLÓÑ!2¿q³„Òç} ‹òPŒ"<^õî¯7>0MsãÔ;¨Ÿùú:ýki-sQåß´@ ”ÔFç)n'…‡Ém©$KC ¨èð·Þz“y’GM"þ[ódÀDÆû8úO!à“’6J ¦'wþ‚Üyö‘’øÔßüúdPPP–¼»»Í8Aã®×^;R7k„Œ>GÊß¡%µ;.G=u iQ¤ €+‰ý*ÞAô4ö ݸñõK?ú•<.N€©)8m6xi4î¾Ï>;·A¥ª žÏ ˆ™!Ô}BzrHþyÒsŽÍϧEìÝ»·¢¦ºZj¶X6“À$µµYo¿ý¾2?o•§¦ÆÆ`‚lÕ*8Ìfø¸ÝþÇU£¬«³&""âê±c¯—=2äCýùººkºuëÖï~47×=@Ù‡eûyà}Ïž=…Äé¹}ûïVn+8(‹Ž†‡—®\(0‘†Ö[ÍɆ·\Î)nkƒ]ÛoX®ª>B“ƒäKwwwuCCÃ_ic³aäø)Ì È»¦¦ú¨4@úê½{šMµµµyÙ'J>ß¹3o´£N»®éi©Õ˜q80ÒÚ EJ lúa¿j‡ïÒ¥*•ùÉå±ã=÷Ÿ³éõîÖÖÖú˜˜˜kþçòóóEçÏŸ¿NV¹|X ¤¤¸ÀårŸ Ââ}âÜ9Ñú÷J‹jµdzb¶áan÷BÀÅ Èbc1>0€ ­Š´TZZ1ñ@ …Å'(ÓK–ˆ<½òú.^ìšžž6&«“{ðÒÒR¾ª­½r‡m}€¥Á¦¶¶¶‚‡«Æ¤¤Ì”cb®–,_+³ÜïEhF:¦¬VðøÑ®ý#"`¸ÕF€VA¡‰ÁAIº™rcK~~xIIÉñè•Qé7n4ùM9¹y³ÙÊxæTUU £¢¢‹†õÃŽËŸ_.l./ï^’²z‹_p°Ïk4†cÜŠi›Ö>-ƨ‰¤ðôõ…„\ï%sÆgœNx W"#ñtn.jjj®èø›ZœGɸ¤²²òï À\Ž ï´w$wh:^V©’Þ,}¯tÃéSååÖgo%îÛ·CÃø9b4^‡óá$gÔA!RæåqkÖÁA|Ï0Šgsr@Iˆ†ÒÒ™»}d®ÍS¿¸³ª¾¾þÕ5©©ï†…)¯†„†| x¤¾¾~®@Y †ŽÐ»žžž»Ý “KÔW]óNððÈà²ÂÂCFг7e?sý²§Ö‚%¦¡½Šäd¸()]Ø·4 IÀíÛÐ;†¤Þ^~FG‡x¨»K¬Ûºõçr¹\ªTF´Ø&lœ÷ç4}ÙM§æb1ÄäJJšYl’ƒñññh©o@³DQf—Ì+"™ ÎÉID^®E%^lW$Túú ¨«ãttÓ·-.r*ZN§swÕ'U»ãâÂç4|Ù% iw|Øí6¸g¨nÑÿƒ„„_éív¬¤˜Ê¨èè.~Š;´K`xuÜÅ3ÞHEHS\==ðoiá*WÉ·º?¡û÷Áwò!wu»)1/\¸Àî“?ÎèëïËMKKÃU¸á‘Ð}ÏìcóæÍéa”Ùg§°¦­ kTÑ©¡w€”®§ÄO§`ééÇswo3Éõ‡‡Û¬Zí–—€hú=™ÚßÐÐe`ï–ƒK*×ÿ¢·+,„v4LçÝd4aŒRÌu#B<¿ &Õ3¸«3 ÐlšÜMJp³®2Ç]ˆVèÀÒZ»};§Oc»V»‘Œ³).™è[is €B?±oÓ?àþý\¿Ñˆ Êh“Ɉ™G!Ðh4¶Õªptø *œ‡ Ð'SáŽÞŒH× Ô‰ù¸k €50*JʤS§PÛÙyštÁ Ì’Åb{Ȱ×Óæ&ܼyƒ[š;†ôDzN@µ êÑÒL~[^^^@¡ˆîìóBw+•V¸x ôëìˆi 3åB¡w;½Ù0Ñ©LI]ÌÌ,Œ[ÇQVVÆæY)¦Œû7qˆíTïÍ&3œ.çìÊý]»v©8ðË S£mSîrHå±° •ða ÈÀ ñ²P1ï‘à¬ñY˜¤“b6™(Áí³s l0@ ›` ô°„Àc.?ÙôdEEÅïsss•o¼~ø/Vs'ÂWÄAJUÐÇ£‹K*Õ†K—.uQEåô0¡ùÄçóH¯}>€?³õùØãã:§ÀÓËs¾üìxôøñãûU*•ºº²´.@<‰øxèYŽÞÞ^lÛ¶íebœÛâ¬ëùô¾bzéõÜO¿?¥ÆÅ­- õë×oËÊÊr¯IOeÙËÚ¢ï9Z{áÌ™3_ЮíÌõ#&ugdd¸™þÇ1-˜‹ŠŠôOÏHÛA“O-Xøö?ë’’^ bO´ïè;,ðÀ?ÏåOà/IEND®B`‚info bplist00ÔX$versionX$objectsY$archiverT$top† ¥U$nullÓ WNS.keysZNS.objectsV$class¡ €¡€€TnameTiconÒZ$classnameX$classes\NSDictionary¢XNSObject_NSKeyedArchiverÑTroot€#-27=CJR]dfhjlnsx}ˆ‘ž¡ª¼¿ÄÆklog-2.3.3/README0000644000015700001710000000177314542412415013225 0ustar jenkinsjenkinsKLog is an updated version of KLog The objective of KLog is to provide a free software that runs in Linux, macOS and Windows. KLog will provide hamradio contest and DX logging support. Check https://www.klog.xyz for news & updates. Check https://jaime.robles.es for the author homepage. Please join the mailing list at: - https://groups.io/g/klog You can also join the Telegram chat group: - https://t.me/klogchat The Telegram chat group in Spanish: - https://t.me/KLogES If you are a native in a language different than English or Spanish, please consider helping us translating KLog into your native language. Please contact me at jaimeNOMORESPAMrobles.es (change "NOMORESPAM" by @). Read the INSTALL.txt for installation purposes. Read the changelog (windows users, rename to changelog.txt) to see the changes from one version to another. Read README-DEVEL.txt if you want to help with KLog development. Please send all your suggestions & bug reports. I hope you enjoy KLog! 73 de Jaime, EA4K klog-2.3.3/INSTALL-macOS.txt0000644000015700001710000000014614542412415015205 0ustar jenkinsjenkinsInstalling KLog on a macOS system is easy. Just click and drop the icon into the Applications folder klog-2.3.3/flags/0000755000015700001710000000000014542412415013431 5ustar jenkinsjenkinsklog-2.3.3/flags/th.png0000644000015700001710000000070414542412415014553 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<VIDATxÚbüÏ€ÿPÙX@ŠÄ „a¢þœÏð@oàHš¦ËîœîRWZõ"{ Ë<äÖù"¾büÿd„„3þcŒŒŒŸ>} FG×9™:ïÞýüûhÇÿ¿ÿþýýóïñAì¿ÿýùýïÏ¿ÂBœe¥[ˆeÿî3¦†"}þó$ñûϿ߿ÿѯ_ÿÀä_8)/ÏÇÀ° €€~øq'È‘@×þùÿëÄÙÿ€z~@òD(,¨áÇß¿þüùý h/ØlˆñÈfƒI …¿¾ 7¯šŠª/;8þvÐŒ`6ˆñìIIîS§ÌˆñçÏŸÌÌÌÿþýÃ8”†ÒÛ·oˆå;;SI Äÿ2ü’ÿFJmÙ» €¿¢F$ž8†€ò–b™ͪIEND®B`‚klog-2.3.3/flags/yt.png0000644000015700001710000000112114542412415014566 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ãIDATxÚ$†A 0ÃTüÿo{‘Ö¹BRR|À:ïf¨ ×tûY\(’c@ ¢„Àw&÷/\$vY žÚ\ñ®¿/镽m-ƒÖ̪çÉœH@D\Ä1Èaapqùä02õüÿûï?3ˆüõë?P'###Ѐbªþÿÿã—/x¹¹Ïœyöáý¯ÿêÿØÛÊ:ìË&°Ãjýû÷?¼{4ZE]cÞÜ»/_þ``úÿçÇ3ñ[—/üþý‡ŸOOOÿÏŸ?Äñæ·¯_UUUÙ8ØüøäLè6:¬0s?PVS[çÿÆË—¯äHÔzíÚU##f&¦ÊŸS~gµýÿó»“™™ù¿Ã_fæ³ÇO22³@4Ä:ººÿÿþóççæ_ßX@ˆù×§_?~üøþóç¯ß–ÇÔI@˜™˜YXX~32r$þýæï¯ßÿØX˜9ØØÙ98þüþ ”* Æ·oßòññ-y÷îÝÿÿ€Öü»“‘èÂׯ_M†ÒÝ»wˆÈÿþüúóçßp Z tÐ`&¨C€ ÀWM$ÄÕB²IEND®B`‚klog-2.3.3/flags/aw.png0000644000015700001710000000101414542412415014542 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<žIDATxÚ,ÆÁ Á(‡}X²UÙ9— ˆŸaJs¥£ÅÞØ§9H üÍ—DQ¯by÷ãÏkIÏ£k7ÚGü``þ÷¨‹áï¿ÿÿ’ -ÿÿÿý?aæ1€báã`ªþýâ…çÒž™AÅ¿ÿþû÷ÿŸÿÿþÉ ò÷ß¿AŒâ<ì ÿþÓ§_¶Z‡üÿógŽ_îïß@*þÿTRú÷/ˆüB@ «ˆèê/,l³ƒŠ~%ÿþû¶ý„ñ÷߯¿PKÀ"ÿˆå×/ ‹ÿÿõä’ÿ!ný &Áö€a€}@,?Av1ü¨Šþûÿähd `çÍj Æß·…«þÿyÄt<ØýÁý ”ed‘se@±°NÚÚ¤õäÓOˆCÁfÿ[ò*v=ÐKòü«kìˆñûU‰"`0Mb†'(HÁ  Ã°=ÿ@60ü†éëKˆ‘!?ç ¸F$(:ÁŒ_°h†2À£\,hÒªóUôIEND®B`‚klog-2.3.3/flags/np.png0000644000015700001710000000067314542412415014562 0ustar jenkinsjenkins‰PNG  IHDR ­Y§gAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<MIDATxÚb4Ò<ùï-;/üp^“™  cÍcÿ?ýüýC‚Kh @±üû÷ïïß¿@Õ@å¿ þÏÀð/1áÿß?ÿ÷øòPàûïï¿~ÿüõç'Ða(œw#@¢Œ…шU’;–¥ÜáƒMßlÉï„A€ßÆ­•½Ñì¨GÙ\ŽMòËoßþ€Íþ4äç {þqrü13cøþƒ‘ƒíÿ~üûþçû $Ø€bùúãÐ9@å?ÁèË¿÷ï2‰Kþãæùsýã·oÀjúõçHÃ/€baøtöï?~@ôüûñãÿŽ]?ÄDÿÿþÃvå:Ð\ 3ÿêùýï7P@±@‚€z€€nøí:çù ÿÀšÿ‚ÜÏðãï÷_Àpù Ò@ @uBÂÂO3üüÅðë'ã¯_Œ?2þþ >qE^áß~ÿù÷èi€bd@a Žc8òÆ’:8¦.€ûEiSŽ^wÀIEND®B`‚klog-2.3.3/flags/lr.png0000644000015700001710000000072214542412415014555 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<dIDATxÚbd`ˆf@€ç–ƒ(†?`òBP6zóÖËß¿ÿÚ¼årkûŽÿþýý Dÿ€Áïß¿ýúõóçÏ?~|ÿþýõÍëÄÔáâ¤ÎÎÎbc­´cçÕçÕÅÿÿü¢@ò÷ïÿìßÿ€Œß¿Y$$/Lœ@ {öÜ´±QÚ¸éÒï?%Zzþ㌌Œf)ÙÔðçâ•'Ûw^ú÷ÏßgÅÙ ³A¦ÂÌþ 4þϿ߿X%eNÏZ@Œ¿ß¾f†˜´í?nÀÈÄôöÆ €b¹$,*Ó×öûÙ3y w]r1Ðl0h/˜ûç«´ÌÉ…«ˆñûë—¬`ð”úáÅkÄrIT\¾­þçÓ'`c –üúr4؈@ä_v9¹cË7ã×çOÙDÄÐü€aHˆŸ_½ @,ç$¥ÿ FçÔ¨Ef@€nÒg —§Â’IEND®B`‚klog-2.3.3/flags/td.png0000644000015700001710000000107214542412415014546 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ÌIDATxÚbuÞùáË/†ÿ˜þþ`º='KLàÕŸ?þýúÇôÿÏ3†® €² $ˆå͇_}EZ Ά߿EäkÙÙ¾±ýÿÏðÿÏÆÿÿx~qæ<û÷÷Ïÿ?¿þüy6>@ŠæØ`$lÁþk[-¬,¸3Úçq‡ZqA ÀâØÇjCSÉê @Ñà $9ï¿0B•¯±QNÊ:T? ö×Ê‘Íå-ÞxP8)À0ÛaÿÿïZMWÁC@¹û ì#o™&óÄìð+H­¾NIÆÿ?,R.ÚKuƒ?i2¬±É¥ºC;òõ#œiJþù ùÿëÐypþÝÒöûÐ< …@±0üøt Ð6 @ @ €fÿz诿~CŒø¶ €X~5‚ŒêÚrPÏ¿ÿ N(H0Xþþj †/€ QA6 žŸ?˜Y…™Ù~gbþýŸá#Û/9ˆ…P ÄÈ ¹˜áÕ7AñÈtpu¶”(¢nfbøó€áG&H‚˜ :"z’[°VIEND®B`‚klog-2.3.3/flags/mg.png0000644000015700001710000000070514542412415014544 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<WIDATxÚb|ÿþ= üû÷O@XÊÆˆ(' $ÿÿÿRØÚúÿõ†¿ÿüaþó‡é÷ïÿþü‡‘_6m ˆyPÕ@ÆÓ§ ÏŸƒT@Ð/ ùëÿ¯_@6£¬,ЀbAQ dMJƒH°Rêß ¿5 ÐÝÕ@øë¦Ùp @eÕ𠀌×ì¿¿ðüú÷¤çßï_ÿÀ$Pçß?¿Ùùÿc` ¸j°ù y!¿Ÿ}ø‹ù×ï¿@`òï/ >%Þß§~2ȸñ@òïŸ_?ƒ¤QTÿýýçߟ¿Ì^1ÂInŒêüõçPÃ_ bøÃ@PàzÄ9ÅÿýýôÐH †?áõç/üÿû¨á@1>~üøüùóHª·¨3<G)Ð<ú&ÿI€$°cÝ›¬xIEND®B`‚klog-2.3.3/flags/cc.png0000644000015700001710000000116114542412415014523 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚbdˆef€ƒ?þI†_0‚ä®?ˆ¨lsA—æÇ/oØZ.óþý÷ïÓß¿ÿþþùûçü÷Wó{¢Üûù8ξcÚT6 €@|d¾&¬aÕÿÔny5l½+Ç?¿þ}ú÷û÷¿?¿ÿý¾öçÏý·_μa’Ú@L "ÿ9~û)½7bÿúÿÿoVæ_Ÿ¾þ›júl¶Ñó_‡‰øõë×é7L@¶1ÿW «1Îÿò®Û RÛÿügÁþú˜7çåõþlÏm"ì2ôùú™á7ô^„"1ÎÿçÆèÀáîúþýûüûþü û}Ô û¤á%ý™ßúþú¾êÜ Õˆ ,ÿÿ~üõÿûüûõûïﯿש¿úñë÷½÷ I'ùŽùõûÏv«ÇÇ_ƒÂ €˜€Îúýïï¯À0ùýñçßï~'áø6ÑðÙ¯ÿ¿úý‘öûE€AÔ@,@ Àü ýý÷Ï—¿¿9~úö¨ô×/ ÔßßÖÂ_ö¾`ûÖ@,`þHòŠü†|ÞçU«UŽÅb ¢ÀÓu¾ï#Œ^¯‡|>ÏNÙl–ÿ+¨Õjlšæ°~<(—Ë,„ c ¾÷3Ê=σeY“MÛÛí6onmó^ZÁéŽßÝ'4uN$. 3¨ßUøúb ·'8?J³¢(¡{¥R 4„ …OI»Î=iê<ÝDæè}Ѥ0ÄŸ)Àe.‡õ•UÑ—©ûü€ý«Š L´dÇa hãíp"l$“,¥äéQ'…B]×…_¯-cy4E±Xä€@Ó4n6›»”ªª—J¥¸ßï™L†]×å°KÌâñ8lÛæ_&yX¹@¸tIEND®B`‚klog-2.3.3/flags/northernireland.png0000644000015700001710000000075214542412415017341 0ustar jenkinsjenkins‰PNG  IHDR ù€šn pHYs  šœtIMEß 5O‘‰IDAT(Ï}QM(a~çC3³†ÊžVùÝÙ™RrÑ&j~ÊÍÅϦ\”¿\6)ÊQ‘$E¹ñ}EZVþ&-²'­†ìÏìÎë°ÚvÏíí}ž÷yz^ ¢Ìl®Ð¬ÏŠ›ø’ÉÐÜ2+P©(sÚÀÄÛÎ!äHùêÕn^qd#ñnœ9Ú0nÇu´"ÌÏD™I +T¼ ™§¼ ¬@e’Bs«Ó"ÂçWô¶{ôˆ«¤|] ±;rÿ >_¶ôQ¡î8·ú®w<˜CÄ´»¾¹ž¶¢1+Ë"¢@l‚ciª¤§3ÍÉ€©‡OíMDà€#¤á…qŸI ™Ãëú¶¿ª¼%¿"hY'öæ—µ­¬RÉƇÖç=Ϋ¡¢ó¢ÞcêaóÝ8W»¨à¤|­Öï5ÃFŠ ˆhœ¨èd’BEùyÖ—ÙRhq…IJjõy~ƒˆœ68©oì!|YiÍÁªXQþëíñÚ=dêaL$Š=n 6™IJplÿEpd†ªÌæúcñF†ÙìÈIEND®B`‚klog-2.3.3/flags/mc.png0000644000015700001710000000057414542412415014544 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚbüÏ€ÿPÙX@šäØ„¨_ó·¹ÑupÉ’õ2âÒ’KF6h„U ôwgÖÀðÿÿ“§@¥ Õ¿CH(ú$ýÿõ Èf”•Ú@,`³ÿ£¨J̓(©þ ÑÀðû7P@±1#P5PÅŸ? ¿$³á€¦ ++ƒ¬ì–ÿøƒp1’Ó!$ƒ”Ô¿ƒˆñõë×BBBÿ€ q&&¦ëׯË¿ÿ |°ßqˆ,P1@4@85ÁŸ?j\0222  * @ /^¼øÿÀb„ b0€ ôP Àå­_{¥Ûâ­IEND®B`‚klog-2.3.3/flags/kz.png0000644000015700001710000000115014542412415014560 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<úIDATxÚbdÞÿÿ£Ë.†? ÿ>þQ ÿ€ä?†`d0I úÅ@Œ@ ïUûž1ÈíaþûŸá߆¿@õÿþ±üÿñóó–¿ÿþÑŸÿÿÿÿ?áØ€ba``xÆ »èw0Ó°qÿAr2ÿnüßÿöŸàÞÿ>_þ±ƒ4üû/ÎÎÈðë@11€Àÿÿ3ÿþcøùÿÿßÿÿþÿûmò—Í¿õöÿÖšÿÛöýßÿßÿ@Æõ ¦¿ ÿ$þß[þ/h0ãÿßLÿ~pÿ«õÿȆŸ| OŒÿïàþ÷¤á/Èf ˆ è? ¹¡ÿ'ÿúÿŸÿßK®oÕÿºð×ôÿŸ_ïÿ\û££û÷èo°%þ‚B €X€aòô¿ÜâÿQÿþýÿô[âÿ]ÝÿÖüKºýOñõ?¡ÿøœÿ/ÙõÏýØ@ ÄÄ@"ÿõ}üö?ïÇÜ÷ÿ*{þŸkó­ÂÿK¹ÿóßþ«fø tÒ¿? ¥Rÿn—ÿk†(0XïþS¹þO™çß+Ïÿ þ=™ù·êðF¨PüÐI@·üÎ`³ö2(rþ3üE‘ØñÿiÀØxÿŸ_dã_°q@ €bdXûµý_%Ó;x\ÊþƒÓ@Ã0001¿iZsqöØIEND®B`‚klog-2.3.3/flags/er.png0000644000015700001710000000121514542412415014544 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚb<ÌÉ0G‡aÃW9†_0ôŒÐ Äøž§ºî;3Ã3î?7ÅÿÝûûŒÿÏ_æ?þ‚ѿ߿ÿÉ¿~ÿû½iÖ&€bùÁÀÀÆðéå3%‰?Ê—ÿÚ±þ¹ýá÷Yù?{5~½cýõ›á÷¯?¿€è÷ß߲ܲ@Kˆd‹è?Ö€?ÿYÿÿø—›û·ÁË?Ú“þúüsEòÏIÙß'd?âûõ›ñ÷ïÿ¿1ÎÿþGüú¹ûü'üöütúúýÜû;îû9ÏüëüÎýÄ!ûç0ûö1ÎÿýüÛýWüÿþûýíüÿôûûü×üûýúýúõøJêúGËûâÚ «ÁdÃÿßX ýÚùï7[øÑŸŸýaüùƒ èá_¿Þ3s“0?/lù^ÇŽa[=@1Îÿüù·þ<úüäüúúþ úÒûóÚ2Î6Ñ5å ÷ÿ%ûÚdÿë¾ïûͦñ‹‘á÷§SL÷ÿj]T7;-jõ”Cê+㟠¿~±þùñB1ÎÿûùøÞïÙ+ÒK4ïûþüýýþþýøü ýþýýýþÿüˆq#ÃÇ5 1ÿy-~p0üFÌXôþÃ@ PÝÌ8PçÀIEND®B`‚klog-2.3.3/flags/ki.png0000644000015700001710000000122014542412415014535 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<"IDATxÚb¼ËÀð˜`Œ? PðLþ£?0q€bªé¬1ÿÿÿÿ÷ßÿþ2ýg‹àúÏðçûü÷Ì_ýÿûçߟ?ÿÿüÿû÷투íÿŸçOþÿûÿçïÿ?þüù>‰ H1=ûòûïï¿ÿÿýëßÏÌR²@«ˆ ¤üï†PÕ@ô÷ïo¦6Ö Ö¿ýûõ h6ü$ÿüº CsnÐ'²º3³ÿñ9‰7Ø–E«…Hý¨sP<ÄûT ØÓÇrÎá 1Îÿ׋ýðEMþôóõ” w„þ ÿøxýýûýùnò ñp` žÿ÷‡xÅîþ1Îÿ{¥qjD›¿øM9þí ÂûïújPýýý{˜òúR~¯úìòý”eQ[ˆ±wænUW Á»O¾í=õ>ÁWRSW>ù÷÷_z°Ôå;_¶}S# ä®Ý÷öéÍ]ÄÈ <ñÞ¤¹žEzˆÝ{ú}ßÉ·¿ÿK ”†Â”þüý—*sí>H[E’’]@?@1g®t°5ÓUã9}åPÚHƒ÷ß¿Ç/~²ÃÜÄî?ý~ðì{+¾ÿÿž}7­¦ 1ÎÿwET(»¥à5Mþþ͵Þúcq,øøú¥—ÌüS_2®ÀæÿáÞGW4ÌÜ  µ8§ûåIEND®B`‚klog-2.3.3/flags/gh.png0000644000015700001710000000075214542412415014541 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<|IDATxÚbüÏ€ÿPÙX@šäØ„¨_ó·¹ÑupÉ’õ2âÒ’KF6h„U ôwgÖÀðÿÿ“§@¥ Õ¿CH(ú$ýÿõ Èf”•Ú@,`³ÿ£¨J̓(©þ ÑÀðû7P@ âà†` >7ì‚:ŸBSx+÷Àì)%”׿è Ò=Z ‰ÒFL<qÒ_°è°¶ß×ýÚ´ñ÷Ï¿ÿÿJN‚¨†høô#@1}2þ?DâWDð/9é_²Ò?ã£ÜŸ0 ¿þÿj æ2†¬€ß÷?þúóïÏï¿¿~ýýýë߯ߎ¿ÿým´ùüõDe•ùÿœmd †? þ•}ô" Rñï7Œ Íjø D ¿ˆˆÿû#É- 6æïˆNŠ? ò/0¼þü‚ÿÿ5üc F†d  = Žþ ‰ü!pB0Øbrª(ŸIEND®B`‚klog-2.3.3/flags/sa.png0000644000015700001710000000104714542412415014544 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<¹IDATxÚbdðf@€ À茢HŒ “@†õÁ°°¬#æ(‘ü°,lgî®ê2EY¶iÆ)Ñ‘ Üõ¾iª~öñP÷íç·_~±²°ýþóëû¯ÿþýùåËÏ2B²@ÅÄtÆÿÿÿþùa¥h£,¬úùǧÓ÷ÏÈé³1±132½{ÔNÕþò³K ŽÏZÔ@ `üò?}ÿÀÁÊ)# ÍÉÌyïõ½Ÿ~~øþáí—7Ì Ì¿þ]Ò@L@ßÝ÷çïon…×_Þ|ùõåÚ‹klìמ_ã`æºûúîŽk;þ‚¼ €$ÍÑ  @íþ‹ˆa,âWBûÚ‡àroˆYZ¯B¹›…™€…­¢cÀ™üà   ÀÖýúý3É:‰‹…è%xXñ±ó¥²WdýüûÈj ˜ ü÷gò¾Éþ-ŠÉ§‚÷õ@¨ €X€qñûß > pEƒ¤Fü‘+Î.úONH¨h'P@12(£D$ÃOü À0z7†9N­IEND®B`‚klog-2.3.3/flags/ye.png0000644000015700001710000000063514542412415014560 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe</IDATxÚb|Ï€ÿ`$2Žþ€I€bJp¶VÉÿÿÿ1üýÇðïïÿ?þþùD€è7døóûßoûÅ’MÄ6ëÿ¿çOþþýD~3üþ V÷ûÿo0ùë׿߿€l&iY  Ä"ÐÛûßÞžáË ÿÿmø$A:ÿþòA °@AF¡o,ÄøõëWNNN°“þ3€!.ÀÈÈøèÑ#€bù÷ïD5Hnå@YFF b€i€ à5hÈÉÿˆe„>·ÏŸ?ÿýûȇ“pT äååíëë F 3òòòîß¿ÿ ~ýú…Dý’€ ”””Nœ8@ `ŠHHHü†HüC åþÑñ-@‘Œ V3a¢zDûIEND®B`‚klog-2.3.3/flags/mn.png0000644000015700001710000000075414542412415014557 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<~IDATxÚbüÏ€ÿ˜^20ˆÀx@ôí+ƒà?ˆˆ$U]Í`ÅðÿÔ?Æÿjÿñ|þÍø÷ïÿ?ÿüaføÍÁú'æÿïß@>ü²i@50üÿ/ù”áÍ_†wÿùû$Eÿýû÷ûöÿ_¿€FYY  ÄRîûŸAà/CÄ_ èï? `Ùÿ¿A”ýQ¿`€bbÆýTÿü¿þ‡éÏŸP³!Úþÿú×ÊD ²!ôï†ßÿƒÿùýa\LèÏ éòÃÆ?ÿUþügùÅðûÐZˆRˆj$ÁN °“þáàPêçO„« 6 ¥?þ00Hóß?ÿŸýf`jû樆?@ þþ: €@˜fþaø"ùŸè§¿RÒL\ ï#äIÆ?LŒ”@JÁ¨ €¿"Å" 3\f`@øòA‚€žNˆ©[YIEND®B`‚klog-2.3.3/flags/sm.png0000644000015700001710000000076614542412415014567 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ˆIDATxÚbüøó?Ã?ø÷ï„‚0ÿ!ƒ?`I€bªæã)úÿÿ?#˜áÙÌÿÿ3ýGÏÞ| ˆÉ`ÕÆ¿¿Á‘U322- LÕÿþ~¥‚áÿ?nd Ì ¡ÿ w·¼¸¶ìۋן~|r~Níª\d=ÿþ0#Cõß>oÆŸÿÿùD ¦âפîO»"æóõ÷͇òxîÿéñûïÿ?ÿKñ1-hý@L þþûÿ‚þþ¿tc ÷<_ö½ùÊzôÉl  ŒûÏðç@±ñßÿŒ@€Æɯ9{ñ»ü«ÿûçÇ2îêÏߘþþÿ‘ý Òð €@þüeþ2¤áË_5-áÿ­kíþúï¬øàîÿß¿¡®ý ôì/€baøŒ&n˜% 7Þ0(ÚFÍ»þæ¿ßÿÀpcÚó›ÄÈü¨hˆ!(.ò†ÀÁ `¶DO¡ÝÝa IEND®B`‚klog-2.3.3/flags/sr.png0000644000015700001710000000100114542412415014553 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<“IDATxÚbdèg`øÁÿ`èÃ/0ù‰ $YP(ÆF€0²p4ÇÒI\"û=ù  fk¯óçJ7Ü*1$””ÈŠO1¾ýù‘•û?0€ Ã0›,ÿÀ$#ãÃwˆ$×ÕÃðü9Ãß¿@Cü"¯ÿÿþþ¿šã?Ц߿ÿÿú d0JI}\² €X€f|óŠáùS :†ß@*š~ÿçþýÿÿïÿ²¿þgþk‘ @㈠ä×?A¢Ô°õש_ÿe~Áª!è;€iºäŒß¿@èç¯ÿn¿þýõÿÐOãûO¸†ß¿ì$^¾ÿü`×Íûó¿ó7LÿïÿÂöo ”°(ÐMÄòáëk^6¾`€Êï?¿@4,˜þ£æ?3#ó«Wˆ‘¡”!Õ;í÷?pHÃBä¿ÿþÅй î` ýý÷÷BÇy€bd(f`ø‹È_H‘ú åpHôó0ói hÂIEND®B`‚klog-2.3.3/flags/am.png0000644000015700001710000000076114542412415014540 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ƒIDATxÚbü­ªÊðáüû÷ïׯþ0üúÅð÷ï? 1À@€„1ÆQŸÎêWœ)'ÆåÒv¸eý“ªLš02ú OûÎÞW±001ÿõš$÷áT„~ÿ†jûý›á÷oF ‰? ÄtÏÿÿ &B5ˆ&ÿa2~ÿ: €XD¸f5ý1yñçÛ¿¿ÿÀ*ä_ 2HþþýWê7÷l†ŸÄòë× Wÿ‚¤AäouÿM«†p~ 8<þà q Ø9ÿÀ^€ñ?(¸ˆñûT›®ÿ_Ÿþÿÿçÿ? ðoùï÷?ã/Ã?—‰[æÅœ¥ÄòH@9j p=¿ÁªÁÜÀä¿ÿÿXˆåß'†ÿ¿þ20‹00í#ãF¨ F¦¿ŒÿÁá  ìÏ?ÿ>0ãÇ^†o ÿ~1€ ‚À0„1 Ü? Hq¹ æ‡Í¦ÎW¦IEND®B`‚klog-2.3.3/flags/nu.png0000644000015700001710000000107414542412415014563 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ÎIDATxÚb,.¾ÞÅ2£§àW݉˜"•Y?~ý˜t'ÇöIÞÎKØ9Ùþýý AÿÿÁ_€byÃ%u'µ·æÛígœbŒùæé7…Õ?_>À²Åz×?f±eÌìLLÿ€*þÿcøû—á÷³Ÿ1Îÿ¾!ï3%­ Æí×Ââÿ2ÇÎô2Éš Fùýÿüýüúûûúüüûúñú08Æ(€0SñÿÏt°ˆ ‚…Ú«·'$¥ö–é“HèMc†iìSm9,ðœ3lðŠ ðSšÎ¼›ü 7ìX‡0h|:eœÀpËkHP½|Õןßþþýóÿ?Ðþÿ‘@—Ëÿ‡÷5^›ôÜò'sqý¯¦ {¾ŠÅÜϼÈËÉ 1¬úЈñóíhNy V *:ÿþ€yÕLV¦O~ È1pÕGƒÙõ U ¿ÿ –¿ÿ€.cƒ ATCCh-$DA$È @@@ÑÁÌ ò30è€ýÏÌÈô'+ ØI@e`w€XÿˆhÜÏg?@F‚ ¹âh˜cþ‚¢ª Hå¦x¡|!œIEND®B`‚klog-2.3.3/flags/mt.png0000644000015700001710000000064414542412415014563 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<6IDATxÚbüøñ#ÿ LL Hàß›7<ÊÊÿ€ @,@ÀÊÂróæMmm-F¶ÿÿXXþ1þÌôû÷ÿ?þÃÈ/›6Ë¿?îÜ¿÷êÙ³?¿ëþ)gøÿ÷ïÿþøðÿ×ïÿ¿ýÿõ ¨šQVh@±0±°hhh~þò¡þý)©ûÒÖÀðû7P@±ü{ÀÔÌ ¤ ¡à÷o˜„ qÖÀUg€²jˆ†?€J¤ªÅ|˜$ÁN ìÆÿûW7Pá$ ÿÿ¡ÿ¨á/Ãß¿@5Ä‚¬qŒÌÌ 22 ¼¼@ƒAèï_š @ Þ¼yó€Ö‚¨W¯ø¶lA‹c0Mµ[ëy‘ÃvIEND®B`‚klog-2.3.3/flags/cw.png0000644000015700001710000000035314542412415014551 0ustar jenkinsjenkins‰PNG  IHDRðv—bKGDÿÿÿ ½§“ pHYsgŸÒRtIMEß6HN8ŸxIDAT(ÏcdЮÿ¿w^<ÚW¦¯:Ã@*`fshxõö+ÃíGox¹ÙÞ~øNºw½c`ddb8·*ƒAT˜‡a×±;DÀc<{õ‰!¿c;ãIr#ƒvý ‹¼ÄgJô30þ|!B‘ í¢R(2at'ÞüYb IEND®B`‚klog-2.3.3/flags/by.png0000644000015700001710000000100214542412415014542 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<”IDATxÚLÂA Àù©§{$m’´®¦‘YJÖšÜïa³&ƒNã À¤Ûƒ0t†g!fKƒ°q(Ó|qú³ªánÌ@2Ñ$ÈE½™O±0|üȰk×ÿü| ªj“Pô HþúÿëÍ(+û €Xøùÿù›‹P ”šQ Rý¢á÷o €bú÷ú5ÃÆ ÝÝ`¡?9 A?!Ø@ Ä *ÊôwRTèyPmpÍ@Ù?€6Ãë×ÿ×­û?i2Ì0òçO F'Ë?¯€ÿû¶ÍHŒÍøóû߯_ÿþûë÷ßß¿þåÁŒ¿¿þÿýQâÿs¬ €˜þmÙð¯¥ùÇŒ)Ÿ™}fþ $?AÑÏOL¿>2Ù,¿>³üþÊô— €Xþ‰‹2|ùÄTS"é'ùçß_°a ôçß ñ@è­¿@ð„~0ã×ç/¿IŠ?x|Ú´Ê”áýa@0ÀŒ ÿ Ào7u–[TbeIEND®B`‚klog-2.3.3/flags/ly.png0000644000015700001710000000064314542412415014566 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<5IDATxÚbd˜É€þ00ü“Ø¿$@åÜb`BW”çZ\ã}`f6“Ö{jW&ɱ"Û4™ÏE}ú †ÿ ÿŸýxö÷ß_ jˆ ˆ"ú$ÿþ2¤9¥6HÈà!æ óþýùTô¬ç/ýú÷ ¨è*€b9…á/Ä ÕPE Ư_06Hÿßß@¬lüoñ`JAF‚ iƒ•m  ¦¿ÿÿ@œW q²f§ÿýj †?ÿåà…Ø·ä°,PÐ9ÖðÿŠÓ‘Œÿ²¦@6( Ф(!Î!ò(@V*Ú ½ÿ` ÿˆ‘¡%"¡$„ñ‰ ‰r€(óù¸ÂIEND®B`‚klog-2.3.3/flags/shm.png0000644000015700001710000000053614542412415014732 0ustar jenkinsjenkins‰PNG  IHDRðv—bKGDÿÿÿ ½§“ pHYsgŸÒRtIMEß0ul¢uëIDAT(Ïcüÿÿÿÿ'1ÜNÏf»p‘TÀÄÀÀÀ #/Ç`»eÃí‚\†ŒŒ¤ðÿïW†ç<,ƒî2°îÜóû¯¬Ìb `üÿÿÿÿíM ¯¤u˜¿ó2øðeàswcxWÄÀ¼{AX~}ÚÏÀáÄ`åïËðâË/†+Í ‚ü ¼s§0tÚe030 r1ܼõôwPÁž¿×?«p0pá…ï¯2üþù„ùÄý| UÝ¿þÿb%> Þ|þÌ`™5‘áî9’bÓC_^“ŒÍƒIEND®B`‚klog-2.3.3/flags/az.png0000644000015700001710000000111514542412415014547 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ßIDATxÚbd˜xœáÇøÇÀðçÿ? @?@lù Ìøõ‡… €X¾ü©vU)þDÿÿþÿTð÷ß¿? Æ? û÷_ ùï÷¿ÿ¿ÿþß4ó@±0pq10³<ù gªþýïßß¿@¹¿¿ÿ3€ýûÿëï¿_@ ÿÉr³1°ñãaFF¥I“~½xùÿß_†¿@ÓþüÿóçýÿýÄ’¿Ù$$Íœ @, LL ÷Müû—á÷Ÿ¿?¾‹EE±JIÜ€U^öãáÃß®^ýÿ¨ÿ÷ÿß¿˜ˆ èëÄŸ¿ÿüaWTfUP|ÜÓÃedÈ.§À©«÷,$ÿ•00P#$~ýaüý÷ç•k?ïÞ—LK{¿fí»w¿ž8Åøó#Pê'H0ˆåÐå@žü ²÷Óÿgsfýÿõûßß?®^y"õïó¿?_ˆÅµ–!Íæï½Ïÿ*ÿûëïŸ_ýB ·þýù2ä ?ÿþªðÿ»ø €X>1üþýG’Mä÷_pЀ´ýùÍúlØý σúïߟÞ1#C)P(jÁÐ$Æã˜äa0®Üe#WIEND®B`‚klog-2.3.3/flags/to.png0000644000015700001710000000065214542412415014564 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<~üÏž=,?,`’“c”–ù½Hݯßÿÿú÷ëÍ,+ ´ €@þÿýË,/ÿãùó;vp ûVWTúï7PÝ/°†@ÄÀ@ 'ý>xÅÚšÕÓó×ößÛÚþ~þ 1¤¬HU3þþý‹ €X€Vü½rå×þýÿxxþ°3qqý»ž ¨l0ß?Œ¿ÿ0JJãï™xxþâLLLoïß “Á|gpˆ,ÐÓÄòïß?f0‡ øó €@àª`€‘‘‘¹ÿ!± @, ÿþýx÷îüB4À‘`ª¼OV£Y}IEND®B`‚klog-2.3.3/flags/bw.png0000644000015700001710000000067314542412415014555 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<MIDATxÚbT=ùÿÃøóï߯@’Hþÿ÷á˜óÌ€°0,ÆV@@»Ã$†UšË0JNü.ï%)s[«†™ðÒ‰z¿ä ÜÇyúX_±0•þgxõÈ›òĪøV$ƒUÙâìŒ@ €büøñ#///ÄI@+ $VÀÈÈxÿþ}€bª(++{ôèÑ ø ‚ð똀Q@R^^þàÁƒÄò럿@>\DE9˜ÊHÃß¿ Å¿~ÿ‚™R€l6Ü b€b|ûö-???~×Cd~¸uë@±ŸâiQgxò Èa!A HpýcãdX½G €X@±õŸIŒ ” à0eøýÂFË_ 0~þÿG-@12lÿÊð)Rÿ0@£öZƒ¥Ø gu}a^åeNIEND®B`‚klog-2.3.3/flags/gm.png0000644000015700001710000000075514542412415014551 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚb<ÎÀð‡þÁ¸`ì0D ‡âvÃ@?\Ä9»U‡p©{CABHJ*dÍ1¯ba`*þÿäëS Ò¿@±ÿ@ƒTÿÿÿ{ÁÕß@î¯?¿~1þÊÈòÈ2°0È)@“ÿþÌÅþ¨í×—_áJ¿#”~ÿúüë×ߟ<¿@àHÐaÄtß_†¿þÿùóõ·—ìŸ_ÿ~ýfùí¾ý—ã–_¿X~ýüû+JùH'PüH@1½øçß_ hûÙ׿—8ýþõîׯ§¿~?ûõë寵î¿Ï½©þõ÷ן¿€¦ È ÿþþùÅþëôÍ?•ïŒÿ5ýÚï?ÿ~eiþ~üí×–Ó¿ €Ü± €@@> Þ_ë{èÿÊÕýÍðÿw×¥_ó‚Uÿÿ 4h.P@49@:ù­¹ðkù)@‘_Â@q c€þ" ûˆkÀ0–ä–ü êäúýûÏo…Œ è@ _ˆ‘¡’á8vÁb™ÿŽi!€ézh]²3IEND®B`‚klog-2.3.3/flags/la.png0000644000015700001710000000106314542412415014533 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ÅIDATxÚbüË€þù• €Ç8¶a "[³³¥36¡Šô:ýÙóÌu$“œŒ¦±£{6àkÀ­zˆ¥€Ù?XÔìÓË÷ÿÿþûBýüûç÷ß¿þþÿû‡áï¿¿þÑŸßø%„ê61Îÿ“"p#çýùüþÿýýùúýYFÿÿÿŸ²çÝæøúüýûüþÝ‘ˆ‰áÏ¿ß~ýcüý—ñÇŸŒLŒåñ2ÚÊ\@T™(ÇÆÆôå×ÿŸAèH/@1ÕþýÏðïÈ ¿þàaâåbþ‚|ÌâÌ¿¾ÿº„€`ø@ þþý÷ëï¿ÿÿcxñö÷§¯ Þ|üýðÅÏ? ?ÿüÿ ‚ßÿˆè@ ÷~ÿÚ §÷ßÿTN{˜â' ·É«Ÿ½üð‡‰¨èu C@ @Œ¾ ö)õ™ïž¼þ  Õ¿~@Üð÷ïïLÿA‚`‰Âr¢jˆeÃAÖGÊ @û@ýh1ÿßÿþýþÿè0pðÐÑ@ÜùëÉÀ@ŒŸ1"õ"õ)î ¸Bz–f¸?IEND®B`‚klog-2.3.3/flags/ch.png0000644000015700001710000000055714542412415014540 0ustar jenkinsjenkins‰PNG  IHDR &ÎàqgAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚbüÏ€ÿPÙ@, ^u5øÿï###ˆñû7ÃŒþ0ÿùógöl€«`øÿÿÉS†¿-úÿdè:II ÄÖý$ý÷/T~ÿþÿë7Ãïß@ÄðhYeå¿ÿþÁŸ¿@ƒÿþýëׯŸ@ýž €À¶02þ¨0q/@mùñ,†È*¾~ª  fªðõeøóçÿÖ­PIss See²RôÈå@×ÁÁ¯_@q)@T0ýþôHQ|ІŸ?€ºÀÚ€²Äø)øþ¡†&®©Ç§‰ÏÑIEND®B`‚klog-2.3.3/flags/cl.png0000644000015700001710000000070214542412415014534 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<TIDATxÚbdH?ÎðíÃ&†ÿ¸˜þ.°b``ø‡00 ×?ÕQŠñf N¿ûûû/'3#ÃFFFfff&&¦ÿHàË—/ÄÄð!ÅB„á?Cœ‰Ð£·?Ÿ~ø T ¦ƒ¬  ;–]x÷÷ÿÿ7?üþóÿÏ_†ÿ¸P@±0p|üÃÚ¸ïýŸÿ Ø9þüý…K5 ý;LŸ8™?þø÷÷?Ó¿¿ø8ÿÿþŸÙX¨&¦oÞã_ ®üüÿüÿý‹è¦ß¿Œÿ¿~ÿÿõ ÄF"™””ÞŸ:@,@¿0‚…þüAQ„ª$ûç0ð¤ùÈ`¸"Lm€þ2ü¹ €@˜~ÿa”ó—áH'#ØH DÿBP1@1~†.b@å¢I@€†h9?9½IEND®B`‚klog-2.3.3/flags/is.png0000644000015700001710000000102414542412415014547 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<¦IDATxÚbdПÉÏ¥ÜcfVúû—Yaï? ôLþýÃÀð‹D`PŽm€  €ú‰l#1¢QÚBaKw÷i^õâ«å¯äf–z ÁÆ,„CtŠºÔ®ç °ÑÿŸ¿ýñ÷ß? ëÏ£G@îã—_ÿùTñçÏß_ ¥:¥„9òÄ4ùß_ ê¿ÿƒÀŸß@¨èHØ`°ž¿@=ÿ@Œ@Ð% [þÿgøÏð&Ü{ê2}R¦©jÆL±›{Dˆ`·–¿bj°´X~èßß @ôëÏÿ¿ÿAŒþŸe¨fx÷áÓG†/Ÿ¾}cŒò¼qæ@mØ4h’}ݯ¯_¿ZUþ|ÿþ½~ñ–’Ÿ>}úðáûwïÞ¼yó÷oô—/ŸNž<@, ÿ˜Žwofü÷ï¿k ËŸß -œW~þùzš+n Ð`†/_þÿøñï×/Τ®?WÏCrò »m«~~üøÑ¬äçëׯ™ Ÿ>~ü˜Á+ÄìW¯^½|ùòùóç×ÿýݲe@±dÁÆ?[Øÿýù/ÑòíïϲiýãóöšÍðó'¢Ùá7îÞ ÆGîJJÊ-ùtÓÿÿÿÀ΀³!¥ÈÊ0eÀb‘^0Ñ#„ië¾ÿ/_2|øt1ýøñèú_¿þÃ@KøŸÜ Æ[·.ËË«}feåùõãÿ qÿQÁŸ?¿üb`xò÷ï?¡I ÄÂÝUþò?(?A"£?>30|£ß`.D À [¾ú0ý+IEND®B`‚klog-2.3.3/flags/pn.png0000644000015700001710000000122114542412415014550 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<#IDATxÚbLN<=Åâ\Æ 7™Šþ¬ðûQâÂpÁ…íNÄ5‡§Ç700|c`øÅÀðL‚1ÎÿQoç}h1÷Øàú% íÚ÷¾ß ëåóÕÞÚûûýþõüûÿúüüüü¨’”1ÎÿÅ0þC0æåÓÃÍÍýíÿïðéÖýÁ¸¶óùöíò÷ê/÷ÈÖõ ÖÉÉ1Îÿèý÷ùÿêíùûõþí íýþ÷#E· Ûõ<-¾&;Çü1Îÿå>¨+( þÌùò»H ìÜ¿>ÓúÞëèîäÔåðÖûíÙ8ÒÉË1Îÿ âÒåŠÇ(þïÙíÏýþæü)ÌŒÞ @üøøüï 5êåÒýöú1Îÿ§­È6FææÒÅûüü2ÑÐô÷üöú3ëòÿþ÷ êûüü ûüýöúˆ pÿþþþûŸéïoæ¿¿ýþÇÈðŸñïŸ?¿¿~g«ˆÙ÷ûÏï{Wþùû;Úÿ$ÐÔ ®¿ÿ¢_ò”ñûÏ¿§TžÜKt¹ðêºîŲ@ÅÄ´(!.ÂõçÏß?ÿýùýï÷_Ò?ÿƒÿÔwîŸSèðó1í>4ý@120¤#G$ŒAÿÀ$@€“Ó/Z:YIEND®B`‚klog-2.3.3/flags/tz.png0000644000015700001710000000120214542412415014567 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚbd˜ÈÀðƒ þ10ü‘@ô‡!Þ!უ3T @±0|a¨v­)þÿˆþþÿûçßß¿ÿþ’ÈŸ±ß",,üüç÷ïß›6m  âÿO¾>*ýûïïï¿ÿþþËÀü;Vã·)óïç~göþzûöPµ¯‡¬õ\€b:h2Pé ÙAªåD~¥*üáýö{Öì_»÷þúùó7Ó¯ôôßN¡â‡2Èü¿ @ÕþüþóéO°Öog®ß/ÿάÿýæÍ/ ÐQÿQÂÅ--zâµIr]"@±=tô¥ÿ¤«üáýò{Ñü_[·ÿþñèº_I1¿Ý#E~2°6ž*|ñÓŠáË€bЋ^j<ù~½þ§¨ñ÷‹—@s+ÉüÊ.aVÖàÙúضádÙ/F%¾ÿ ¿þ ƒC¦æoY¶_Ó¦þÙº¨ò÷Ÿ_¿b»E ¿ú+Yp$éø+ã_À@ºû߆?ˆå¢Ãß§š¿z ‰ßâ¿ò‹ÿ‰kI|f9ûRÌÓ_"¿ÿýÿB@—ƒ" €XôURSþppHJJþ¶³øëÁÍÆñ·ïBι·º\\ÿÙÿÿùÏð÷/ãßÿÀd: €a‘ÌÐØÈàÇÐqŽaí¼ë „€r c!Œÿ@qÏÃ`uä)ø¬û=IEND®B`‚klog-2.3.3/flags/va.png0000644000015700001710000000105114542412415014542 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<»IDATxÚb|}^”áß;† þüý÷á#—Ê=&¨àÏ¿ÄÂðï“ r?P5Ãÿ¿ ÿÿƒH†?ÿØùE8þ£‚/^È`øó¨ô?HÏŸÿÿýgä`úûç?ã?°²¿`’€– È! u0Õ @ªfúþýÏ—O×îßßð󫆚ŸP@1Æ6lößÿÿþüÿ÷„þ³¼zýåðÉE¬ùî]»šÿýÛÅ?þÿÿ`¥`ÕÿƒÑù÷»Œ4¯¯gã×'Oîžá7µÜÉÅï´ €Xþ}Ëð¦b<ÐÌÿÙ¿~Øôñå.%>iFÉÓÇŽIɲ1³ ÐE ÕÝýïÔ +—¥ˆ¼Å»»7ؙߚ˜»ÿþ÷÷å‹—Ä u°º?PÇ@<ÀÔð‹™Yè?Ón F&F&FV ˆåÈϘE®b2˜þ0üýÉÀÈÁÈÈÄÀÈ pN!!`ô€Äxw?ÿÀ eº ˆþ€I —Çàð?äh†h0S–F.7ÈÊÍIEND®B`‚klog-2.3.3/flags/bq.png0000644000015700001710000000064014542412415014541 0ustar jenkinsjenkins‰PNG  IHDRðv—bKGDÿÿÿ ½§“ pHYsgŸÒRtIMEßRzâƒ-IDAT(Ï̱KqÀñï•—g †ÐTÒ$”’CAýÒ D¶ ÑNA³MAÐ`«JAK$fVf(AFˆÁ¥à¥éý*±ëox¾ZÎ,Ú§^Z¢Q躡 Ñ?¡ Ÿ$ÙJæÞGºZÎ"º-‹$¯&²3¨•Ž‘^¯·6›‚@ð„Õõ$/¯Ö½K¶îRï[&u|ÎÀY–â´‡²gEQH§ÓdoŸ âWßbƒdšÂØl6ç(F׿ù9t½‰Ãé¯&P·NykèüFBMÓˆÅbôè’D幇µp‰ëÛ':i=ø²³sTgsû]üÅоDSw,òŠUþ넱 «Ÿ›}IEND®B`‚klog-2.3.3/flags/dk.png0000644000015700001710000000075714542412415014546 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚbüÈÀð € ¿ÿ½zõARò˜‹Œþ€Õ ÅQ] Vþˆ™xy¹KŠÿ}ýöÿÏŸÿ¿3€I ûßïß/7m °¶ÿÿžýÿó—jP鯿ÁÚ~ƒŒÿ÷ëPœ‘‡÷@±ä¦rØØÿýøäž`r˜ñìˆåÿ2 Š? @Œÿ‚‚æ?0€!nÀÄÄôþý{€bù÷ï###H=>ÕY /ˆ ¨¿R4m²hD íd@@.H¨ €@~üøñÀ€h0ÿbvîšB÷±IEND®B`‚klog-2.3.3/flags/pg.png0000644000015700001710000000112114542412415014540 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ãIDATxÚLÂA Àù ÿ?ÁI’6I¢œL#‘9ïþ.&ƒ Ó¨® Ç1 À°"X@0ÓeÝš6p÷Ë7gïŒ*|™b")š¡Kyü*ÂÍžbjxÇð¿ãÉS»¿Cÿþåúý¤ç÷ïÿÿÿ·þý_í÷þ_ÿ×þúø7£¬ì?€bjø÷hèß½¬¬mÌÌWªýi°ûýßå׎Ÿÿå~ýwüõÿ?H¨ €@þþýûçϟĘ%GÇÊ_¿æÿþýý÷¯ÿ~ýŸòëÿÖ_ÿýúæ×ÿ4 b€i`aaÉÌÌœ1}ú†µëÒÒÒV³²æýüuíì¯ÿ—~ýŸýûÿ‰_ÿ~ýßø è   8œ£@€‚ÍÛJ}µKŽà‡ƒú ŒààÌÌÝ󤈰·B˜5¨E)í—®iøöíÛúõëåþÿWSSûòå Ј¿÷üú•üû÷M —fýfø ·?  % ã÷ïß999wîÜ™1cP5 !üþòëWÙŸß‘þ2ýF@4üþýGRRòÁƒׯ_—‘‘ù Sþ€Á쿯üý›û÷/+@1ò @½åg4ÙIEND®B`‚klog-2.3.3/flags/nz.png0000644000015700001710000000117714542412415014574 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚb<\ظã“HëÜKõ¢Wؘ˜ª_J¤ÊÿórP \øŒáÃ0úÁÀð ŒX1Îÿ-k·©]üøÖÕ÷ö´ÍìÐÞòûûþüüþC é¼óó÷üûüÿ²Ÿ1Îÿ¢®Ô*ñíïðÿ÷øøûþ=÷ú±í1÷ûÿM ä$õêð÷˜åü1Îÿ° 0û$)#$ûþ0/ôÑùüÿúûý¨íÀð˜æ]äÿýýúˆé]#ß²ûœþæZôA–ESóß_«¯‰p2,~-Âõ@õÿ[Oö'@ 1Îÿ(óè ÄÒî÷÷ùÞìû½ÉåÓèýýÐéüM ã*ÿë·ïÍó þõ¶ÿ#ãØ»ˆeñ]–|f?| 'þðþùý÷7ÿŸ›¯_~ö÷×ïÿé´~ýþóû÷ Ûf—Vâ9 €˜€þ†Æ¯¿ÿ@ªÿýõëßÏß@×ÿƒ¨IýþÃs(û÷Ï? €bjøóçïï_I°"º_`Èþóg‚øEÁ_òþ<ø×¨ €€¾XRœ( Ô xN ¨á0þÎfµófrðŸøß¿ÿþ#C0ä¸üŽÚ_¨ß@'qø:¬ÍââIEND®B`‚klog-2.3.3/flags/ir.png0000644000015700001710000000100014542412415014540 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<’IDATxÚbd˜ÈÀðƒ þ10ü‘ÈèŒda †/ Õ®Õ Å@Àðïï¿¿þýýûÿÏŸôû÷ß?þƒÈßoš± €X€šŸ|}úïÿ_¸¢?ÿÿþúûûÏßß¿þýªûõHþ’å•c`b1Îÿ·Z·äõä áóá ßóß àõâ ÞòÞ ÛñÛ**ôVôˆñïß¿ŒŒŒ@'ýÿÿŸ ÿÿùÿð¡ÿÿþÿ·¶þÏÁö€Ê>}ú@LßBÅ ôŠeÿß¼þÏÆòÑ‚ÿÈìO€bBW 11ÿŸ>ýâÄÿÄDõÿÿ5s-;;ƒŠÊÿ3g~þúñâÿŸ?A¤žþ ·ôл¿?ÿüïFUE!5Cn†_?ÿ+ yšÉþþó×F[ØôÐL†5]“¶^gÚwçû^ Æå+TœŒõWyþü'##ÃÅ» —îÞþOg½£wxció‚µ7;›N0Ýñôùûú7zþ*ýmn¨ÌÔŠ0|ÿÌðý;î¾?ÛÍæf`’“׊+7>ýøù“áæÝ·ÿþýG¡¡ÿýüÐÄ€ÊÎ\{Ér¹e‚š7ÃÅ; ¿3üú%’?þqpøÿë׿߿ÿEþþeÑÞyæ lmÿ˜Y@Ìâ¿ÿþùûç÷Ÿ?'¯¾`Jk<Ú7ïBtúΫ×>0¼{û+%èôÿ_¿my†áÿ3g§CsvÈÈÍ‹LÙln×ÌôãÇqa¶¥3Ýå×ôœ;/Y0¨êßÏŸ@Ç0üÿoí°\dï>SÆ\é™Ê3üûëí¯ñ££ò’}lã7s!ž¿ÿÿ30jJ3jJ#«.¿æ°¦­èœ9™§ë³mYž¿~;Í-m½ªý¹¥ÿùþçïßÄ0ÕmÇ?üÿóÇýú›•÷2üû»zë!9ÁÊî®[•Ó ÄA åK~IEND®B`‚klog-2.3.3/flags/ie.png0000644000015700001710000000074114542412415014536 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<sIDATxÚbd˜ÈÀðƒþ10üaxšò”‰ ă€??DœTÿýcø÷ Œ8ˆ…á Cµk5TÅÿâ¢âŒŒ@ ÿ(øÿߟÿ1ÿÿÿ1þþþ’» €XX@âO¾>ýûï/|ùó…—•÷?|ÿüÿåíÿÿýÿý›QXè€bºh2Põ úûû?&øóëÿß_@Kþþj ùþþùÿçÏ?ÂPþïÿï_ÿÿHP1@±= 4û÷ßßþbÕ¶è¤?¿€ò Òðlö¯¿€z0,ørØIŒ`'HÃo ­Aªÿý (t=@'1ü¹è€; ¤ô7añð†Aˆ €X€±öûßInI7þüeE###0±0ˆ)äè$€bd(e`øŠcP|ÿ`Ø^²]ŠK Å@É7d¼Ãÿ“JÃr© ¯IEND®B`‚klog-2.3.3/flags/an.png0000644000015700001710000000075014542412415014537 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<zIDATxÚbüøñ#ø÷Aÿ„ DÏŸƒH$@,@ >>> ùÿÿˆžÿ… ÿüÿó‡áÏŸÿÂÂÿÁRðìÙ3€b*‚«2>øÿû7!FFÆ?þ ºj ùëÐøÿ¿€~!k;ø@1ÎÿyvvNââóüüþüûþöøýut.þþÿ}}Ëÿôôùúúüûûþ ÁÁ†ˆ ¨ hØþ@ÔÞnö÷Ï¿†úÓµ5§~ÿù__oôë×ß_¿þÐD†?tÒŸ¿ÿ÷ë÷_  ™™û|üT$ÿýý·mÇ“¼¼@³€zÀÆýe`ø@Œoß¾åç燺¬­¡>zæÂ¸€ž¾sç@±ü…<Š :ˆj¤P‚„ Ð!ÒW ¥…øY~ÿa`bfýÉÀÎ!!Àþ“á×?¶ßÿ‚£â0¼þüýÉÀ𠀌ç3¼ûÆð—çÛÊ…Šþä3(OL”< ý#6€qL-—º›AIEND®B`‚klog-2.3.3/flags/ml.png0000644000015700001710000000073214542412415014551 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<lIDATxÚbd˜ÈÀðƒþ10üax\À Åæý£3 ÿ¬A2p@, _ª]«Á*þýûÿO€ý/ýadüÃÌü‡Iþ÷ÿ˜?ÿÿþÿD~Ù´ €XX€Šÿ?ùúôï¿¿ ðï7óßÿÿCѯßÿoÿúÿëP5£¬,ЀbaYý¨úýý dþÿÿëÿÿ?` ¿þÿûÒÖÀðû7P@ÌÿËð÷ÐÊ „0› b€bzhöï¿¿ÿü…kø…Ðð¬¢(ÏÀ@ Áfÿú÷ ¨I˜D²ì$€iøýÿ÷¯¿ Õ¿ÿþú‡fÿßpã®þÃÀ@`'”þ† °jdÀþ5} n€bÆÚï$¹%AÞøó—‰è³ßŒ hÜoÖ? J@JÁè$€bd(e`ø–ýB§{x`Ñ DûþÅBã c4r2ø éZIEND®B`‚klog-2.3.3/flags/un.png0000644000015700001710000000050414542412415014560 0ustar jenkinsjenkins‰PNG  IHDR ™ fbKGDÿÿÿ ½§“ pHYsgŸÒRtIMEß;>®,ÑIDAT(Ï­’=nÂ@…¿µwm,cÄ_@DD²»(%9·ã¹ p‚qÿ b6©µ"¼f¤‘æÓ›7#zýwÃ?åpåB<)ˆ .ž+r!òZ³IâšÇd}ÄÄ!Ûƒæc‘1ûÖvNºIÈôKóÒ è$EÚÉæpæ5 íÊ!®û´+ å Ž'Ãj¯)¨Àò¹Ìð¥`˜îy,+оÃs3`¼Ì샤;š%ÅSÕc¾ÕühÃC$¤;{'ÆÀÛhõ·Ê¥ÞtâË`ànÏö *úA•_X—ùIEND®B`‚klog-2.3.3/flags/fam.png0000644000015700001710000000102414542412415014677 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<¦IDATxÚbd8üŸ˜¾üµ¶a`øÅÀðçï ?€äšÏïÿX@Bˆ¨¬Q™¨é?Ãÿ_LÜŒUeÿÿþcøû—ñ÷?æ?™þü5eÿÈÀöçß ú{ðK@Šå à‰Â üÿo •Ñ& ‡~÷‡§«rKÀÒ0&%Ò7Õi>O'í…²*®køÿÿï†ß@Ô QÇ Tó¨ˆþýÿõÿ?؆?þ0 ÿþ3yþÿ: ¬èÿ¿ÿãÚþýÿ Örè·_ ÔÀdþšôÃ? †Ûð¢¡ñÐ\€zd6P „˜ 6ü:IÐ4 CV4ÔI@Oý'È%¿ÿÿÚsÛoHø€œ ´H(xÿücÿë?Ã/F°ÓáNûû/Ènþõüc ¿ÿ3I°Céÿ7F)!~Fff†ß!D@Ά@Õ ÿ˜˜ˆ‘aãWpþciÿõ6TüP µ]Æ;ˆTòá@€a»eª/‚áËIEND®B`‚klog-2.3.3/flags/bg.png0000644000015700001710000000071614542412415014533 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<`IDATxÚbüúõ+ø÷ï„DfÀÁŸÿˆ(ÊÅÅ$ÿÿÿѦÿÿ‡SHàÅ‹ÄSô™ñ`ddZ@,w>Ý‘a’ùûÿ/B†áÿ? ƒ0D¬L,·¾Ý F†f†2—²GŸýù÷ˆ~ÿû Bÿú $ýúû ÈýõDÊóÊœt …c ƒ°þÿÉÖ5S ‚½dÞ²ÆIõU‡‰ìÓ%±sóàX R€af¥ÿ°:˜Û%„@Äa´fâ±!Ÿ|gÿ W±0a×üÍúöן¿þü’ —üùóÄøb€¸@ãÿü‘ùsê @±üÜÎÀ,ûçß= q S@®;JB~3üù˨ò·Ž €X€ÑÃôûƒ¤$P(Êð¤ä®? $ýý A@ÅÄŒçHˆ•‹&<Ðe†*kŒ:IEND®B`‚klog-2.3.3/flags/ve.png0000644000015700001710000000102014542412415014542 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<¢IDATxÚbüûša× &!†ÿ@àýƒ# ï˜ñ„ˆÅe æÏõœE×^ã ÒyÇÀð÷ÿÿ¿ ÿÿaføÃôÿ÷ÿÿþÃÈ/§6 Ó?† ¿âŸäþ *œÈÀð( Öó ý£ßŒŒ²@ˆeÃÅÙ !êÀä/˜©P¥’á7P@1ÎÿÁvv#ââùüüüûþûüÿžž ÿÿÿõõüJJÝûûþúúþûûÿÁÁ¾ˆ ä¥? >PHUïÙóÙÓóŽ«ëímÛ>mÞ¬T A@e@¿ ÿýËðçÏÿ_¿ÿ/˜R=mÚ«_¿þUôõ½üùóï®ÝÊV–7!&£3ƒuvVþÛûoÿ5þúó÷÷ß?ò÷Ÿ¿@SA$Ðÿüù+¢$Rz® €X¶1eþ£ýï÷=°!ÿÁ†Cp‘?¿î`ü«ÂÀ@,@k˜~ÿa”ÊEêd±ÿ0@H :Œ€Šˆñ+4f¡ˆ•‹&ôZt“×8¿IEND®B`‚klog-2.3.3/flags/balear.png0000644000015700001710000000061614542412415015370 0ustar jenkinsjenkins‰PNG  IHDR ù€šntEXtSoftwareAdobe ImageReadyqÉe<0IDATxÚT‘MKA †“UŠ¥­UŠÅƒ§ºP¨Ô›†¶T¼± xõäAUÛƒ+´ Kw233;íÂËKžL¤‡ÁÌÆ˜¢j­Å,TbUªÔ9uï °fÐÀÄÖ(f…Lj…½Wêæ'ý½æþYÞBHZYer©$3¦L ”+ó»Lï»t؂巯<Þe&j¬fµÙ`„ãÞncí 4ÏÙœåM¤C¥:{|ÃßÛNé ÿƒÍÏÆâ¥Ñúûp‚Ÿ;›¥vñuD©ëØÁc­þó4Âé°ÍÝfa³lÂÆ7±c¨êÉU‚çÛ[å8 ìaŽê6“WHÑ\ÝHŸÇø}GÇq`¤û½¬‹„mïÃÚ%—Sü´üý!ýuêOî½yù'Àx˜dŒkvßIEND®B`‚klog-2.3.3/flags/ga.png0000644000015700001710000000075114542412415014531 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<{IDATxÚbdhf@€ `$ý‚!0 ‡òRAô‚7DUFjo’É;Íš­v½9žÑ’É£}M}ú yÿÿ?ùú¨ôï¿¿¿ÿý† ô„~ýýõëß/ C–G–á@Ç †amÃÿ·ÊTvÉ)fTŽooZ<î|ê?N‰+€Xþ–002þªøÿ¨èφßÿÿÃÑ/0‚0~32þþdÂ@,`Ïþ‹þkû SôI5ˆÁÀøçß?€i*! íÿÿ ªC!ÿÿj Fûår Ÿ¿ý —¿ƒŒþ‚Ðï¿Ál Ô?i®9•«ˆ…á•Àçïì¾2ü†„âßÿ@0hƒØ` ø?N)€baø4÷Ÿ˜óŸ?L`SÿCÌþ‰ ÒÀx90–~#ƒìz†o¿~ýê‘ÿÿ Æ3<ÚÀAÌ`œ#h_¦p¯lIEND®B`‚klog-2.3.3/flags/be.png0000644000015700001710000000070114542412415014523 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<SIDATxÚbd@ß3ðü1þýcø'ÀðïÃ?q† @,@¹êêj° ààúËÀ÷—áãÿ?Ì ˜xÿùóÿ÷ïÿ@ä—M›ˆlîÿ'Ožþƒÿ~30üýÿÿ7ýýýÿö¯ÿ¿~U3ÊÊm °ÙÿJÿФÿ@Õ¿þÿÿÖð „~ý†h`øý¨ €@@ª!à÷„ÙØ4Hß?ÿþ¤áBÃ?°jˆ†?€6Äâ_¿¡j€‘0ÁN  ñ¿~ýYðëº ÿÃÔ€‚8 è[(€º®š¬áPÃ_KbÃIII°7þ22}öLeýàô¨‚€N F´˜¾}—á Ðwÿþ0q0ü{ÇðB$ÔÍÆÀp‡ À¯Zeïû‹†ôIEND®B`‚klog-2.3.3/flags/fi.png0000644000015700001710000000075114542412415014540 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<{IDATxÚb|úú30I»œ`øõ‡éê2.†?ÿþAÁ0ùáÓ€bab`á*ÿÿÿk™Æ¿ÿÿþþeÐPr!‚ÈàÚ_Äòl8DúÙ›Ÿ@Sÿþý÷`ddüõç@±üªø5ì÷_ ûߟ?ÿ$ÐdÕ ÿÿ1€5#ƒñÁö•§o~ þõûÿŸ¿@m@wýûõç?Pço Ј¿þþ“a_Õ° tlÃ@‚ýç ¼ø4®Î’å½*öNW7™T`S—£áÝ9¡¾baø÷d%ÈP°j°" êÚùï/þc`¨ãíûïådxÿ×qh*­­Wù‡ês 'ž>~þ@±0±ücfr€ Õ@V†@è5€:é<ÈÅYÁÆ€ázˆèè;Þ@"rVñQ†_À(´üÏÃŒé@üÛÿ>}ù`ëÇiœ¸êIEND®B`‚klog-2.3.3/flags/co.png0000644000015700001710000000074314542412415014544 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<uIDATxÚb|¿áß?(øbƒ¸Æ ÄÀ@,@ !ýj âÿ@î úûŸá/Pòÿ’ÿ ¿ÿÉ¿ÜÿÿßÛ² €XÀ&ÙOJþý²@z@*~ÃÈ_`ô›‘]h @±€Íþªúȼ`¥ÿÁ¿þýþó‹ €Xþµüe`øóŸñˆºl0ˆÖd0€50õ0#ƒàñÒ…‡/ýùûÿ÷ !ÿÁÄøõHþûaÿù«(Á~hÒI€baøÁðç…þÃÈ¿~C´õüÿ…d0ø¤áço†ï¿þüføý‡áýk1 \‰Œ¿~ €X®ÿ·»‘óûÞýÿ¿Mþý($\ >°³@‚ÿ°)+Ÿg8@,l Ì~0IŠ€ô D‚¤îø a ÿ÷÷ßÿ¿þÿýÁÃÀ@ŒwÀáÄÀð ¿ ô‰DC@`°€kÁ/|ùËIEND®B`‚klog-2.3.3/flags/england.png0000644000015700001710000000076014542412415015552 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<‚IDATxÚbüøñ#ø÷áß·/礥ÿ10ܾÍÀÇ÷ Püÿÿ?T'»zQÑ¿?„¤¤ØØþ#gÏž D\5Høß¿üûýûßß¿@áªÿüù@,hª!$Põÿ_¿JŒ;ø@±*DzúûþÜ5I%åÑ®ÿ&ÍÒêýýÿûýýûúÿüüþýþýüüý«—1Îÿÿÿ„ˆîêðóþýÿ ÿõ÷ìûgKøüÿûûýþúûüþõ÷ °›ž1ÎÿÊþ/òñþøÿð÷àõùóýöø…W¦íýýüëñ Œ¼jú1Îÿˆ\”ø´?côå°3ZÿÇ =÷ùÿúùýýþûúú íüúýú1ÎÿP¤|É8ÙáôÒðÚï½Äç¯ H)ÚÅþûùþþßÙ¹éŠû#ª¸êþþûüˆ%þwXáá§Ož~Ü÷Ëè-Æûo.]{ñó6#Ы¿}ýÉÇt{Á„o—8ÿiÿýë´ €˜€ø?0(þügúû›ñïïß¿ÿýÿÿŸñߟ_¿ÿþúý{Ç3×Kâ—þqÞ:êñç/(ˆˆh 0Ô€¡ñëP9Ä“ÿ®ÞxýûJ:Ðæ?^)Ëó# €€~üþûOB” ( >0úûJíþRýÈಊˆ‘¡’á ,"Á¢öŒûÆý&y G9IÙ«h_xIEND®B`‚klog-2.3.3/flags/wales.png0000644000015700001710000000121414542412415015250 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚb|þü9ø÷áßïŸ ÌÌ`ö¿ÿÿÿÉŸ³00ý€bJˆKˆÿÿÏðõö­ïv~¹ý˜?"DØÐ¨ôÙ¤.UMVA!i.Ii Ö{÷ïH#ã˽;þ¼~õîìYÞwߘ߼ª¾éÇðöÇû_Ûÿüþ¥uàÀƒÜDáô‚?¬ÄÔð÷ïŸ? Ò±â)Y_þþåup~¿}ãÏ7?Äy¸~ÿTX¶ôÃÑ#¯/_b: €@˜˜˜ÿ.Zrîž]ï~ýúrãÊ·óç˜ÿýb}ü⟓ £¤ÔÓ‚,CŸ|6Qq €1ÎÿÇê·ãôÞêùêëÎÉ íwuô¿À  ÿÿÏÎôwo$* ­éùèÕêÇ1Îÿ ƒŒFzêõâPŒíø þêùüþíøó ü'Öôûóboéÿ) "˜‰½1ÎÿúüþÿûüýûÏEÓúãýÐ%øšPö$æÿ®>öZƒû‡Rw™úûñýïþ1Îÿýúüþüûýú¬.òä ÷†[í²HÿâýÈôS¯üõùÆ1ýÖö÷üþüˆˆ¡$Ì%±xšð-ÙŸÔþ‹þûí¿è×ï=™ K^ÌxPç»Ã ù_ˆ‘!¥ ¿ÀèãŒûL20ÖÚhzéºIEND®B`‚klog-2.3.3/flags/ne.png0000644000015700001710000000103114542412415014534 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<«IDATxÚbüÉÀð‰‰þýc`ø¤@ä¿?`ôƒáß/02¾1üãa@¡Â0Û€Wñx¾â¶9Ö–a¢2,Ìæ®-ÒE#DÔudG6\!Uòë<ÄÂðá÷ÿÿïŸ2€ÔýŠ2üêù RôŒþþúÿç×ÿß¿EdJˆñëÍ“œ’Š @u@K€6ü‡ýïÿÿ¿ â32³>= €Xdt89Áªª@ðÿƒÿïüÿççy“ÿZ.ÿa€‘ñ’@±üùj.”ñòöÿS[ÿÿüýŸ™ý¿¦3² b€i€»‚â!ùÿº¶ÿÿü/®ö 0‚œö €X®¼»¢Ì¬üëï¯@ǃ åÕþÉ©Œù÷çßç`¯Uþcga?÷å@12ä3¤ù¥Ýûxï÷ßß@Ô D¿ÿ¿ÿÉß¿ÿýúóï÷Ÿ¿UT.6] `”ýfü#É' Týçßß?  ôçßù÷ÏŸÿ@Åáý¨ ÄÈPÊÀð»Pô‰ñÆ€(àc0ÑeA– IEND®B`‚klog-2.3.3/flags/bb.png0000644000015700001710000000111114542412415014514 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ÛIDATxÚbd`nd€ƒ¿ÿþžsß1üûÃð‹á§u>ˆÏð‡á P¶z’'ü÷ïÿ¿?LŒ2_ÿÿþË ø‡ñÿfæ?L,¿cªüÿüûýû/oš0 €XÀ&ÿòêÛß¿ÿÿþbüÿëÃÿ¿ÿÿüþÿÿ÷Æßÿþ¾ýèï¿¿ªe%¸6Øh ê?@3þþªîŸóëþ£ß÷þnŸòëÿÿŸ¿~ÿýõûϯ?~ÿùÔ@, wƒUÿùDŒÿÿÿúóû÷º½¿ÿþýýç÷/ ¥ Î_ˆ€Ù6ÄÚûÿßoC•_?‚¡ê/ ÷ׯ¿`K€Æýj  †?Æÿþ÷ëÏß_þmp°üŸ¿üô°…; „À6ü  ¹@Õ@ lïÿÌ¿x~1}Ì ¶¤ô/Ðx ¹@Jþü;ñ÷ÿß¿@~ÿÊ ù büúýŸ¤áϳÿ€4ü  `ü“áþ tåOV†ÿ¿ÿµþa`ùÍÀòGI†àAaÔð €’XÀ D o7/ü÷á߆¿þñ0ücaµd`øÁÀ𨨠Àf°g{5̽IEND®B`‚klog-2.3.3/flags/mv.png0000644000015700001710000000103614542412415014561 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<°IDATxÚb|ÍÀðŒ Îþ‡þ€Åp(Æ6À Ëйó'õ$P„dK|ƱK m· «¥’@b‚ôöËüˆ¬íÿß'O²ýÿÔðûÏÿ¿@¿€@ìß¿ÿÙ?±øÎ$+ ´ €X€výÿ÷ÿÿi-j?X¬??þÿPdQÐaÓYûyÝÏ?1ýeüþ«ÙïÇïß@ÅÄr1ÈþþûýïïïŸH3I¹sº 2 ˜±™Eþþ:è÷¿_¿Ú@ 'ýç÷_Sþþüû]•]è¬Þ×=¬ ¬`Á? ÿÿr$Ðt€Ùºõ÷ÿ?¿þþcd¸öûÆ<¡K.«Ÿÿÿüdüó‹ä+° öÃo°u@Ûþ2ýùwûçÍ¿þêpêø¸ïß¿_ÿþþÙT¶ € NúÃüýWqêyPà€Üúë߯À j…ÒÏ`»Y¾ý†8P1@±üÙð‡QR’ äÿÝõjÞH$ÿþû @ÅÄx‹bô110i½K0ç{’âIEND®B`‚klog-2.3.3/flags/kw.png0000644000015700001710000000074614542412415014567 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<xIDATxÚbd‚N†`ô†þÁ¿`ÌÀ¡1¤ Bö^F°—䀡ÙjûûEµÙ rbìc?‘òÅŠöÚW40|ùÿdÙÓ¿ÿ ÿŠþý÷÷7HP)ýúûë׿_@†,,Ð Òðïßÿ¿ŸÿþÙö7,?”O”¨áß?Uÿþƒè¿ÿÿAD¸Y¹Ù2ؤáï_ ­þüøc"d"%)õ`dd4á1 †?€vÿjùÇðï?nÀÀÈ´ €˜À6€,øtí|€á?ȉ²hü¯_¿þm:zôŸÐ…`÷É¿_€|ùïÏ—éÓâ¤?, ¿+¾ý–Ÿ6íP'ýþ $áeüùÍðç/³ŠÊ‡‹JŒ¦ˆHJüþýãÏ_¦?`E@ôç˜Fе F †Û b ïÀ‘ ‰_"€he)¦ø…;IEND®B`‚klog-2.3.3/flags/br.png0000644000015700001710000000112114542412415014535 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ãIDATxÚbdHf@€ `ä/0‚3 è@±•5F7þg`øÿÿüýÿ÷ï¿¿6ZßXþl9Ïôçß ÷ÏŸß¿ÿýùý÷÷ªÚUÒðŸáÿ³OÏÿBäþýYüõÿÎÿÿ;K¼õ^ÌüëÏï?ÿúûK†_h@5üÿT Tê©û5TêoUÕ¤ ÿ$~ÿù¯üãÅæ¶eO;È ÔóûÏo «ˆ èb½L_g~ Uþsázhd–ÄŒ’ŸY¡/²‹•¶”D¨ü:˜ôñÈU¿6Ð[Rü?æúþfúÿû?ÃïþÎÓÿOÙÈúçGsêAýÿÿÑÉôúÒ_¾2Жï˜Ò¶þùÏ’0<tÌÅ{ÿÛW³|xý_Ÿ÷DƒË’_.ÿfàg þüy÷‰)h)Ë–‡¿²bÚU?}ýòÿïÏÿ®ÿân[·áÁ/íI¬^³²r±2|d   þƒ‚ ˆ&ïgîâüºo‚ÃÿßÒÿÿþÏ~Ko2Ëï,@ÿù `HÃï?$x$AáðÈ^ý;Úú 3Ë¿©kÔåÁaýÜ¿ÿýÆ(@128"b9F1ý—òC/AýêûnIEND®B`‚klog-2.3.3/flags/vi.png0000644000015700001710000000115014542412415014552 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<úIDATxÚbüøñ#ø÷LÀ) @,@qÆ]ÌìÆŒL¬ÿßýÿó_Á¯ ±ò§üù²‚I†‘Eôßßß¿¿î}þ’ 1Îÿûþúôï‹ÿ÷ûþÕÖþþZÿ@úðˆúøéõúíýæî1Îÿüüþ YÿùâõùÚÿþÛ Ž‚> L÷÷:ðéìei£Åãïú  s 1Îÿˆˆàüüáå8þúøþüöîéëÓÄÖÆ0â×÷ÿÁööú 7 iÇÇììøˆ…‰áþ½oO^êjèÙ=úímQ}Ÿú“êFÁ¸˜×ûÙXÿ¼ú^q☙££àŸß߀ž &9Ž7o~ ²þgøï;-äç·WŒŒÿþ2üü÷‡ñ÷Wfv®GýÞ½ûÂÊÊðÿ?(”ˆñíÛ·üüüÿÿÿÿá‘Çòk\AFžOoíùtûƒ¨±¯ß·9o™OJIqܽ{ €X AÑÀ*²LKz/«­œÌš_ÿÓÞ¿7^AÁÂÔ”¨€‘‘BÒQ $99¬5ƒ€ÌÜë~þ|v劬ì_&&FFf  $fˆñùóçhqùhØZÄ ‚E€ Àèv‰&[IEND®B`‚klog-2.3.3/flags/zw.png0000644000015700001710000000107614542412415014603 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ÐIDATxÚb¼þðºf˜&ƒÃ†`ôÆþfüBb°1ã×Ï_Ù9Ùgno’Õûý÷ÿ¿ÿÿ‚Ñ úûˆ€‚`òߟ?ÿÜ@Œ_¿~åbeÿËôïîtW×ïÿ30üýÿÿ7úF¿e?}Ú@, ÿ™;¾®äq›¹¬:Ééß&Æ_ÿÿüù÷û÷ÿ?@Ư~ÿÿ "YÄ_ŸÈ@,Ÿ&U1ù+ð†Ÿø0ë§ŒÌú“wU¿ýûû7HÃï_è düæþò{@1¾=º—åîyž¨ãÿÿÿù¶/ŠÕÎÏÓÛû÷ÏŸ¿ÿþP D+**=z €XX´Lþ^:R}ˆŸÉÊ{U‚ÿdÑ`~ý“ÿÿ€Ù~sˆÿÞÃÀ@,ÿþñ¥ÖýþûEQîÌ_X€~ø÷ûÃïÿŒ¿þ1þþä2þþÏô‡í @<ÍÀÀøû×÷m;““'¾ÿÏ“À…Ão†ÿÿµ2ã÷ïßüþ9{{‘„6,È‘"ÿù÷çß_xœÃúoÕšóÄøðùCy)y†8†/°Hý‹ld6$îy ê]X”ÿìÂdIEND®B`‚klog-2.3.3/flags/gf.png0000644000015700001710000000104114542412415014527 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<³IDATxÚb,žz™þýù—çÇ÷÷ïߟ?É?þ022*¹þûÂðç'à€bª ´“’ÿÿýÿ÷¦$ïÿÿÿAÜÿ@î? ÉÚÒ÷ÿÏï¿~ýÿýûmE@40ügøüí÷ß¿ _¿~ý@6Ðx =|Ïžüûõóÿ¯Ÿ Â"@K89€0KøÿƒÝtÕ&Þ8´@œ±[zàÌM"-úƒ½¨bë´—žbùóçPéß¿@ôÈ*)ýqÈm@Õ@ãÿýúÍøë×/€A0Â0øÿ£qƒ;¥ÐÒ^ 7Æö‘Lh»3ªŒü¡Ü |ÄTtÉï¿@òPä?zDýúùèã_¿™À6Ë_@®ÿó¤ˆÿA]T aƒUýð›V ÄòãÇj =þI,è$ Òß¿ÿü†@±|zâÏ?.Nf ïÏ&Hø@â‘ ˜Å%†1ý÷d@±|ûö§mÁå?~}ûñçË_Òœ’@§þòÿÝòëÇz“çÕA¢ î­{f› uDIEND®B`‚klog-2.3.3/flags/dj.png0000644000015700001710000000107414542412415014536 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ÎIDATxÚb<|ýÿŒ= /Þ1p°100üûõ‡áß?†?~ýù÷çÏ¿€"ÿ~ý3~ýcca ÆÿÿÿùÁpõ1Ãã·ÿÀ¨áß¿ÿÿÿÿûá/ñ÷?ˆ fäÎü@,@< f*ÿù¸NÝføüã?HõßÿÀŠþü…ªäaš@ @K€¤†ƒïÿ£7î¾ü›úç/ýjûËÀðë@1ýº¨açÎÿ_¿ s3xþ·ÕøÏÉøŸá×&bþõŸŒ¾0Ȇ³gÿoßþÿÓ'†à`FÆÿ† ÿ¿qÞÙtáëŸÿþüý &Aè''ƒÀ€;ÉÈèÿ‹ÿííÁù·é湟g>—ýûÿï_ÿ~ýþ&ÿÿVbWbð:@,@'1õôê|ôóÑôWÓ|<”F¨þ"ü—éÐIÒÀÌÌ ô÷ÞO{§¼šòòÇË_Œ¿ÌêÆPÃß?ÿ¾f †ÿ>¬ù°öðÇCœL\2œ2@u #ÿÿ ³!ô°~1Ë´ÓŠ¯3|``†ÿ0ú&ÿ`‚ `’ƒ À|Ó^#i¯åÄIEND®B`‚klog-2.3.3/flags/tf.png0000644000015700001710000000101714542412415014547 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<¡IDATxÚbdà,gƒÿß:þýûb13 ‹•!‘áÃ/úÁÀÀ@,@¹Þ~ÿÿ@ ÿÿ322‚t2üýÃøçO¾˜ß¿?@ðÿÏß?¿™—L@ ÿþ¿xýjÏÿÿ üÿýˆü|ÿ÷÷Ÿ_¿Äßß¿þJKòíÀÂÛ€0èÿM›ª˜¸0Ýᘷ¡4le›s {ŸS+€X~ýû÷ÿßß¿ÿ@ªÁbÎðé010°¼?`ÎÁÆÀðá±ü`ø§ ä!@±0¼ûSݤTþïã¿ÿLœÒ¬¬?þüÿÿD~ùý?æÏÿß¿ÿÿ‘_6m †ÿ O^ÿþûïÿßLÿþ=b`øþÿÿo(úóûÿí_ÿýªf”•Ú@, ³ÿ3Uÿù B@ƒÿÿÿ&ƒÿ€ªC40üþ Ô@, þUÿûó‡¬áÂxEÐt€baøõ¨î÷Ÿÿ0 ¿‘ô€¿ Nbøóh@4üÿÿPÏ_$ `ÉIŒ`'HÃï¿ ¿þ€ôüþÃuš `ãn@±0üÒÿ€š®úý—I݆?@ þþú €€¡ô¨TR„ä¿ÌLLÒ ßþ÷›åƒÒR0: €¶20üKƒ\ø|o0 ÿ?àx’þ…Cã '­oEÏîEIEND®B`‚klog-2.3.3/flags/mz.png0000644000015700001710000000111014542412415014556 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ÚIDATxÚbìÕg(c`àa`øÁÀðáŒDF¿`$ @☆`q€"‚UĈš¤püð%ÍÖèÞlWéˆIˆÀ[ü ÁðéW±000(¼ù¿òé|Ë¿§ÿþ*ø÷(÷ûýýýë߯_²Ü²@¤áÿ¿ÿ|Œ³vþ ­/d•”ÿÿ€Jÿþýcaa¹.u €X¾10Üàú«èóçûÒ?’uÝ—~³ÌþýûÙï?@«~ÿúõ H™ ê·¬œì¦]›ˆ èI7ƺµb¼ñ\ÿ¿é|}ôåÍë/¯è}zõòÓK zûõ-Ð9Ä ›Õ[ÿvÄ~{·ƒƒãÝßYgþaøõ„~ƒŒ òdþý‡ ¨ €200Weý¿pŸûÏ¿†Ú¼þýc»äðÿÿ@ä_ ›™•óæ¥íò4Û?ÿ™3xþf`«àûüëÿ? ú #ÁŒÿ¿þÿedWQyv €X€±Ä$ú‡!Nò¿ìo†@r¿$(ª~30þ! ø_†Ÿÿ½a Ư¢ ÿzþ‰1üûÀð¯@ÿ~öPìƒL`c0ŸfI’@ºä3IEND®B`‚klog-2.3.3/flags/tg.png0000644000015700001710000000106214542412415014550 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ÄIDATxÚbüÏ€ÿ` æv† `èŒda |u5øÏÌÌøó' Ëÿÿó>ÿþùçÏ? úýçïŸßÿ~ÿ²ÿþÞ0s@5ppü—`05eX¸èÿóç ÿÖ ~dùûûÿ¿ßÿÿÉ_@ôïßo&vÙV/€b™ý냽=ƒžÞÿÜ êÿ¿óqþæd¢_œŒ?Áä/.ù[ˆ €X€î¹äîÝÿ\\ W¯ýÿðá?[åí_¿üþóïן¿@aüçùÝ·… €ÀNü¿|ùÿE‹þü †ãŸýþúû×ß_¿þþþ "ýþû[ñï†{ Ò2¨îÏo†ßþ³²ÙRÿñpLý 6¨è{)®ßGňñ÷QFù¬ÿ?ï3üÿòЗ~ý‡øäÝßA†Ù•Þì?@,7Þ0Hˆÿùýý70þýþ÷&ÿþ‚Ôýk“ÙÿžÿÀ@,ºRy!- ì?ÿþ‚ñL‚<Œplüý÷|/¬a F†b†O°ˆü…©¿À1ù&y qnC1óÛÄIEND®B`‚klog-2.3.3/flags/vg.png0000644000015700001710000000116614542412415014557 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚbÜŸ^»ã›VçâoÅœë8~Õ¾÷Šå¿à!¼òÃ/‰`1Îÿ‰À¯:ùÙØóòý ´ÐÕÓíûúýüûþûüþüûÿûüüûûþ²²”1Îÿ°ŽÛ Í»ðóýõö÷ú@õù½ß;ðùûüûúüüúûýüøÿ ú1Îÿ°:b' ñôøá!éÜíÖø öúúúÿ%PµôùþýþÿîðÂ]ú1Îÿä>^¨ã!Ýãý¥ù<,,ì÷üúúþûýù)!V?7ûýøûûÿúˆåשc+T=NÞd|ÎÃÃô÷×±7ÏËréó3üùñí×/ *E ýÿŒ¬?žøÒ1Îÿ¥áåõüü÷ËëÅéúúûÙØí¤Ãôøúúüÿýû½Ó«üÿÿÿúûûýüˆ ˆ, í@ê÷¯ß¿~ýýùó?üýûPC©£¸*/Û­[ëêÝdþÿ…,@±5üùó¨ŒþuÂTÿݺ͡#Àûïߟk×9ýjø@@ @»þIJrI Î?@Ú€š.’ÓçXÿ2ýýûëï_ †ÄÈÀÊÀðÈ‘ŠÇô À)­CÖnŠ«IEND®B`‚klog-2.3.3/flags/fr.png0000644000015700001710000000104114542412415014542 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<³IDATxÚb,žz™þýù—çÇ÷÷ïߟ?É?þ022*¹þûÂðç'à€bª ´“’ÿÿýÿ÷¦$ïÿÿÿAÜÿ@î? ÉÚÒ÷ÿÏï¿~ýÿýûmE@40ügøüí÷ß¿ _¿~ý@6Ðx =|Ïžüûõóÿ¯Ÿ Â"@K89€0KøÿƒÝtÕ&Þ8´@œ±[zàÌM"-úƒ½¨bë´—žbùóçPéß¿@ôÈ*)ýqÈm@Õ@ãÿýúÍøë×/€A0Â0øÿ£qƒ;¥ÐÒ^ 7Æö‘Lh»3ªŒü¡Ü |ÄTtÉï¿@òPä?zDýúùèã_¿™À6Ë_@®ÿó¤ˆÿA]T aƒUýð›V ÄòãÇj =þI,è$ Òß¿ÿü†@±|zâÏ?.Nf ïÏ&Hø@â‘ ˜Å%†1ý÷d@±|ûö§mÁå?~}ûñçË_Òœ’@§þòÿÝòëÇz“çÕA¢ î­{f› uDIEND®B`‚klog-2.3.3/flags/ae.png0000644000015700001710000000063014542412415014523 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<*IDATxÚbüÏ€ÿ˜kþ€ó Ìø…ÂÀ¡¼ÓÂP êÐÃV8©½÷)…妛/F4e{/Ñ’É"[úšòä@` ÿÿ?yÊð÷/=øüûïß¿¿ÿÕÈ_ýú÷ Èå‘Ú@,`³ÿCT•­t^ù`dd|¨ú €X€Neª;á÷Ÿÿ¸È“ÿþØI@fÖÀÈøçÏ€;é/Èøÿ¿á×À¶ €ÀNÿëÈU¿~áq: €@˜AÆÿfø kkë_¿~ýþýJ‚Yþüþó篊ŠÊÅ‹¤é÷IIž?eþü† s!$ü… =Äø§p$Ì@zÆiÙŸ>IEND®B`‚klog-2.3.3/flags/my.png0000644000015700001710000000107314542412415014565 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ÍIDATxÚbd`8)ÈyaÓ’¯¨¢Ï?õþÑI{‹á @Œ‚œ3ÞgªÞT]GýÛÏõ[ oßêhagþûŸáÿ¿ÿaà˳g1Îÿvn²PÆÉ5.Æ öþýJAçp½Vìbcùÿûüÿûúþûûÿúúܨ©ˆ…þ½xÉ£¦ÄÄÃñçÛwæÿÿÿþþÍ 0{óŸÿÿÁƃ Fff•ü€bäfžþêù¿ÿŸwLöJÛÏðÿÏ´6ç/IÍe+çdøùïϰñ¿ÿÿùÍ,#s}Àbd`8:e"·§Ãv ÁùU‘@'ü;aó*QNæ_`ãÁæ30møxï@1žd`Ë/ÿùàÃïßÿþ€Lš÷ï×oŽßŸ9ØÿºÁ$«¼üÕ={ˆñ÷󧌼|ÿÿþeøÏu,ÄÑ@ƒ!fƒI # Ë›»wˆåž¤´h~þŸ@&ýù2 â&pÈ€¸Á¿Ù/= @Œßïßg„ u 0ƒ,ûúæM€bùõâÙ'Oþ0@€Æøf3@ø ŒL Üg[áfTIEND®B`‚klog-2.3.3/flags/sz.png0000644000015700001710000000120314542412415014567 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚÆÁ Á(>lк,Ì~$Ë¡döµÏM¢²C_Œ,ίjÄý –,Ÿ2´ 0@„×OûóŸý×Oß¿wÿúõá÷oÖ¿ÿ¯]yÖÕöîÉ3ñÅ-˜˜¥¥fãÇN6§¦ŸŸƒâÿÿß ÀýôÔo`@ýýÅð+ °úû…_öÉäµÄâömuÞ/ݬÿÿ0ÿE3(.€  'ÿ1ƒb ±ÿ¿þ×þP FÃâo>ý€D$ýúõïÿŸ? ¿ÀèÅ<PKÀTÀÃ`$îaNÛ::yIEND®B`‚klog-2.3.3/flags/sv.png0000644000015700001710000000076514542412415014577 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<‡IDATxÚbdпÎð‹ þýcøõáÏ?ñëˆüý(ÁÀðB P®¿Z ¢ŒþýùËð÷ßÿ¿ÿþýýËðçÏÿ?ÿÿùó˜Qw €X€JþþcxñæÏ? ¢¿`é¿ Æï? u@ŒþýþýOR”h/@1î?ýUY–íׯÿÿ3üÿÿÿuÿr@4ØÙ˜|@Œÿþedd:é?HX×ÿw·ë¾þc—R©ø€Ê>}ú@,ßB„ Œ³×¿Ÿ¼ûè “ï_Lµ¹à \5Ü|Cu¶O¿mÿþûkªÍ‰bØ©ĸûøGU9ö¿@®ùìè? @šòÄ@šƒy÷ÑgÄÈÀ~ºªKöÑ‹_°0ù÷ë8”~Cæ/$”þü†õI¶í3O ØIQ Äß?ÿÀ¡þÿ7H0ì™ÿþ…†5(Ðÿb €˜2üe€G$ŒücÿCb€t¤XlMÿÁIEND®B`‚klog-2.3.3/flags/fm.png0000644000015700001710000000105014542412415014535 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ºIDATxÚ4ÆÑ ÅÐg4£™ÌZÒÔ >ô㤭Y¿¤L0"¼â5bªË÷T©þÏðÿÿÿÿÿÿýû_‡õÿ?†¿ÿþýÿÄs' ˆÙï¿þ*ýý÷ïÇï¿!Ò@ͽ›n202üù Tý¨M‡á×€baør Hé1¿ÿþcd`Xyì1Phåïß úHHP@±üùÇ”©þû_CšïßÿW~xòöPP‡¾?ДS·Þ‚µügøõ €€ îšm«! tÉŸ/nV 7ÀÁ÷Ÿç/ó†ÓÏ€Žàø2$´¤á߀b”L^‹‘ ôŒ@ìP6в@Ì`IE—tÜ|ÈrIEND®B`‚klog-2.3.3/flags/southbritish.png0000644000015700001710000000100214542412415016657 0ustar jenkinsjenkins‰PNG  IHDR ù€šn pHYs  šœtIMEâ8vW|¡IDAT(Ïc<ß1{‡|å”#[Ã$î^yPrƒ½Üˆ+Ó_[$Ø‹••™0Åm~éþüÒÑV~æÿR¼¬[\9#"­b×=ûôåLÍ?†ÿp Œ/ j>ÿúÏÃüïÇç ?~°kª}ýõ—_G¤ª€‘›ëÕûoŒ?_~üò_RZš›“iΟ?•”~10}Ã#̦,ÿöÇ¿wÿþøûŸáßÏ›×Nn?¸§oñÆû÷ŸAôÏÁþÑöÔ»üOåTÏ2 $_bûhmÇ"$ø›ùë›Óò?ç1¼:¦ûâà«·Ç X2Ý”.<þâ-£¦®Ì)a®ûë3›‚`Ž— 3Û×o9þž•f1áâç9öð·ŽÞ'1~>Æþþe`````fdüÿÿÿ?†ÿ ,,L Ÿn¶}~uãí µ_ÕW0ütÑVw15eadfb‡#R2óš?ºsž™_BÃÃÃãñ“ïÞ20001àoó¯¼róÐÓS/\x}c®¤º.ãÿÿÿñèùñæâãç÷Y”<> r‹Ö€ ÈϪï2IEND®B`‚klog-2.3.3/flags/mo.png0000644000015700001710000000111414542412415014547 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ÞIDATxÚbd˜ÈÀðƒ þ10ü‘¿` B²0 Æj×jâÿÿ€èïÿ¿þüed)üòóÏŸÿ¿ÿûóçˆüý÷÷¦™›ˆ¨‰áÿ“¯OJàßÿßÜ,ÿþÿ/Î8ùá×/~úùë×ÿ_@Õ²<²@;ˆ ˆ&ÿý÷÷Ï?ê$)¦¯¿q³Èüjøë߆ÿ? d~ýùD@=@WÐü¿ ÿü:ä÷ÿÿ?ÿúþçi×½²_¹ÿüû5éñ†¿¿~ÿi & o€fuù1â Z¶©)Zš ÿÿëå¥kV½ÿÁP.ÏÔðç/P)@1Îÿ>6"6îùîúþúÉïúk,j;;æõæ/0  ‚Õ¼ûÿûåÄ刨 È ‡_%ÇJ8Y8þùùýÏwF–w?Þ½þþh9Pöï? Ò´ â$ ùý÷PÅP)n)]AÝm¶}aí½5ÀÀý b€bÆ0Œ%¹%ªA¢~o|¸ñß¿@#üý$•”@á t †_ ÄÈPÊÀð ‘¿`‘ú)¦!E?@€¿A>Ñw‘A¹IEND®B`‚klog-2.3.3/flags/gw.png0000644000015700001710000000100414542412415014547 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<–IDATxÚbüÏ€ÿ¾d``bø÷‡áß?°˜"ÁŒ?ˆ$\] $þÿûÇøï·ÎßÿþüÿÿLþ2àä‹m›¬áÿÿ'Oþþ¢ÿ30ü«€£_`ô›‘Qh@±€Íþÿÿï_F êß¿þÿKÿAV !~5Щßÿþ-úóçÞïßÿÿùÏð I)ú ô@l˜ñçï›ß¿»þü™úûÏšû¿¿qüúûû÷ß@ôëÏ¿ßÿþýúûÄdÿSùŽ €@2ÿþÉÿó'ï÷/†ß–Üøýíׯ?¿ýûõûïï_aä¿ßJ|¿ßÏc  “Ø~ÿžöë0Ìþÿ™ô¬¨¤çTçŸþ‚½ @ Ì@¥@ï‚ü2ìØTˆj Î? Sþüû D _¤é÷IIž?¥¸s±þ† Ôðç/а?ÿ‚ˆ€q @Œ_Á GÂÖ <à¸ùŒ70‚0@©€Aˆ Àa¯qŽ%#¤aIEND®B`‚klog-2.3.3/flags/bj.png0000644000015700001710000000074614542412415014541 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<xIDATxÚbd˜ÈÀðƒ þ10üÑ«þýƈ…á Cµk5Hñÿ@ÄÌÈ Öú™‘ñ3ó&¦ßÿÿÿùÿJ~ù² €XX€ÒÿŸ|}ú÷ÿß¿ÿþ²2²þcøûÿÿG°"úF¿e– È®ÿ@¥þÿýóï7#ÃÿÿÑ”BH†ß@ 2ÿ/PõŸ?ÿüù÷‡‰áÿ¿¿HêP4 yŒm€a–¡‡ô ^ÜÓ€„"yðà…•—šf3up&ùÀ  “¾ÔÖÜz¤á/X鯿€–ücú²áý/°ºßÈ$£Ào`(HȨ¿¿€z~ÿý²è@ Õ @®†9@ô¨ô÷ï¿ä¿ÿÿÿA4@TC4üjúô/ÐÄŒµßÿþHrK‚½ñ—…‰ùߟ¿Œ²<@#ÀƒÐß¿t@12”20|Gð/02¾1¼ÜŠT4$k<@¸+âIEND®B`‚klog-2.3.3/flags/iq.png0000644000015700001710000000100314542412415014542 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<•IDATxÚbüÏ€ÿPÙX@šäØ„¨_ó·¹ÑupÉ’õ2âÒ’KF6h„U ôwgÖÀðÿÿ“§@¥ Õ¿CH(ú$ýÿõ Èf”•Ú€¢9¸ x[ Ö j§68%ÙïdT¹6d‚`8²˜Á$ãvãÏé"eö1Îÿýýýþþþùþü´á·üüýøüüöûúÁåÄÃæÅõøøí÷òîöñœÓžòôôõõõçççâ$†]vÜøpóËÏOb\ÒbB'^gabfgäøüóó¥·—î|ºýÿßÿH• ÑÄöÁO_YIZ-äeã13úÿŸAO(e$¢¿ìöòpÅP : € Å10À‹ d  ˜mw†Z–¸{DÜsñ@²Õëh¸7ÕZ1(–™eæ@,/^ÂÀ ÅÀð‹áÃ?0ùÂ1Îÿ'3s¸WøÜÜþôõ ‰¨Äþ úûüüý ùjEó}ª úûû²œp1ÎÿœÆÝ1ÐÉîñü÷÷öüÿßãöð÷ÿÿ6(ÅœÂûÚâ5 ø1Îÿ² (ü"$!!ü ,*õûûüöûÿúúüæ¤WY"ç ûûýý1Îÿò2: «äàãû¦ôúûü÷ùýúúÿÿrôÓôÂøz‡ûûÿ1Îÿ$î ÀÖðöøùÝïû¼ÌæÕóÿéçéýýøõûï»ç"VÝ'ÁÔ™êéãÚºˆeåñ'nþüùuê ßߌ¿ÿÿ¾~õɯ_<¿ÿýcúØøïßÿ@`ÑUѲ h@±00]ûÿן¿À†Ê¯ßýgøÍøï÷mŸXïN™yâ6P.Á@¦Ú_Êo@5ü+ý ô(Ð[ @P矿 «Ø­ôÿ‡è+~ýÍ0÷ã½ì@¨áP¤ïïßÿþ€À? ÷÷¿¿~ƒŒ8“áâ  ÿ~~büË %€bd`Ð…Å(2 ’à  ¯%ÎWŽØIEND®B`‚klog-2.3.3/flags/hm.png0000644000015700001710000000124114542412415014541 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<3IDATxÚb<^Þ|€C¥rÇ»ÞëXþýËÿçV*õÈÉDÎsÖ†¯þ‘g²Ëö¹›Þ10ü1ÎÿKMŸy<ûøÏÍÿø÷"¼ÝøÌÔæýüþ÷úû[M-Þãï·ÁÜ£Œ1ÎÿÍ …†ìêûòòþùù ùþö÷ú‰=ðüúøúF;!‰›Å «’ˆéŽ“¶>‡–æ_aQY.3³ß²Šweô~üùïç¨ÂÀÀpãþk êÊt an†oÄô!$‰AXxÃ?…ç<â/XÖ ™1ëè~äq¶S•ç-L²øþãw„—+ £«•"À1Îÿ,ë Àßøûöøßõ¸ÖñÛôþ÷­Æä%"«·Õéëôìï÷¨µÔÜÐÃ1ÎÿËÞ)-D.õðôÞû ÞúüúèëôÏèûýÿÿÆÍãéíôÿÿÿWK+ ®Ñ ÞѾˆ pþýþó/È^©6Åü×ï¿þþcø÷÷÷¯?ÿþýûÿ÷ÿÏŸzæûøéÛ¿¿Š¨áׯ?@ãþ›HËIò¸iüüõû×ï?`ô¬Ò|å©V?ÿýû÷?P@±5MâçÜy䮾šèÁ“d%ø~þÊþûóçÿ÷¿Š͵”Å~þú»fç5 §ˆ‘Á?€:‘Ðd®ªcÙíýM ÿ€¡ ` ø¤wøÄIEND®B`‚klog-2.3.3/flags/eg.png0000644000015700001710000000072114542412415014532 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<cIDATxÚb|ËÀð þ¡’pôI Çan±”lœ­Š%î#¢°e¯awÏÄ.;R¨ˆ!‹ 0áïî9O±€”2üÿûä)Péß¿@Q ùû7HÝ/ ã׿_¿€âL²²@«ˆ…ÍÔ”IS‹AT j}ú@LïBÅÀô¯—]~~ú÷÷ç¯g-ÿ‘ÐÓÿþšj0øóûÏÿ¿ùÿýÿ¢þ?ÐòĨ¯¯_XXøúõk Ûþ€ÁïßR_µMZÊä]$²âââmmmr}ZZÚ½{÷~ƒÁ/0€0@$˜4¨EEEåâÅ‹ V ‘’’’@) (È0[õbç_* ’@€þ×NcH¹ØÄIEND®B`‚klog-2.3.3/flags/cv.png0000644000015700001710000000102114542412415014541 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<£IDATxÚbdHüÏÿþ1ü’ ¿þücøõJу …rNCA”2Q‚là‘ò$ÍÎo&;«0m+èÆd4Ѐz>ä*}÷ûˆbô³O@` @r ¿`ê~ÑWšŸh@4üýR ´Ü\ê<§¿nÎY¿_öÜ5*ýýŽ€Ný@L@…`ƒ¬dÎFénzøA$zMóƒ÷bɆ«äý[õëõý@ŒÿþeddüòÀcF™ÿ¸#ÓLjå33Wu5£Ü{æPži÷þÿõûÿ¯_Œœ¬‰ü?g<ÿ³å-È¿3Éɽڵ €ÿþ ±è<ÆeÊÞ¼y@,¬ÿJÓ˜¼ûo'2ÑpuÕ®ÌË/T…îu¹uôXÝPÀ SfØ_À@Ì ÕfÆL\l /¿H¿û..Îó½ÓmÆ‹/²gžŸxjÉÇÁÀËÎÀÏÎÈÇ ô‡;¿#ƒýW¤ˆ2Q »ßÿÀ1A `‹B% ‹ð[IEND®B`‚klog-2.3.3/flags/gp.png0000644000015700001710000000075014542412415014547 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<zIDATxÚb”}Ëð þücøÅÀð÷˜ó†þ ±ÿ1àPŒQV8G®®þÓUÚ«‡B†´ÛcƪÁp"RÙ¤)‹–ªñ1ÇÙO1~½žKÁàÿÿÿK ŒÿØ##ã³›ˆñ??Ãÿ–&†Ï>ýùÏ4è7Øt úýÿ7ý ÂøÇð‡QBúÔ Äô‡á¿CÇ_aKþ‚¼ðÈ! §þÿý÷Hþþ÷¨(Â@L _-Xþ þgôcûÿb ý†2þý†°AˆåãÝï ’¿þßÿÎð÷çÿÿ ê î:Ìfø ÖÉÀ@,L_öüøÿä=Ãÿß çüþËt”rÿ1ÿüÿ÷ï7㟿À –7 *›p4ˆ€ÒŒŒïB—#ÃG†öŠß ïþ‡=4ŒþÀ¢â(þýd¬|¶ €¢Ç%JìþÅ:„ÁÄ`ù7YOéE½àIEND®B`‚klog-2.3.3/flags/au.png0000644000015700001710000000124114542412415014542 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<3IDATxÚb<^Þ|€C¥rÇ»ÞëXþýËÿçV*õÈÉDÎsÖ†¯þ‘g²Ëö¹›Þ10ü1ÎÿKMŸy<ûøÏÍÿø÷"¼ÝøÌÔæýüþ÷úû[M-Þãï·ÁÜ£Œ1ÎÿÍ …†ìêûòòþùù ùþö÷ú‰=ðüúøúF;!‰›Å «’ˆéŽ“¶>‡–æ_aQY.3³ß²Šweô~üùïç¨ÂÀÀpãþk êÊt an†oÄô!$‰AXxÃ?…ç<â/XÖ ™1ëè~äq¶S•ç-L²øþãw„—+ £«•"À1Îÿ,ë Àßøûöøßõ¸ÖñÛôþ÷­Æä%"«·Õéëôìï÷¨µÔÜÐÃ1ÎÿËÞ)-D.õðôÞû ÞúüúèëôÏèûýÿÿÆÍãéíôÿÿÿWK+ ®Ñ ÞѾˆ pþýþó/È^©6Åü×ï¿þþcø÷÷÷¯?ÿþýûÿ÷ÿÏŸzæûøéÛ¿¿Š¨áׯ?@ãþ›HËIò¸iüüõû×ï?`ô¬Ò|å©V?ÿýû÷?P@±5MâçÜy䮾šèÁ“d%ø~þÊþûóçÿ÷¿Š͵”Å~þú»fç5 §ˆ‘Á?€:‘Ðd®ªcÙíýM ÿ€¡ ` ø¤wøÄIEND®B`‚klog-2.3.3/flags/hr.png0000644000015700001710000000101414542412415014544 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<žIDATxÚbüÏ€ÿPÙX@±€$««ÄÿÿÓÿÿÿýýóÿï?¦ß¿˜~ÿþÿçÏùeåJ€k`øÿÿÉS†¿(ZÚóGþÿŸ;ÿÿ(ü›\‘øÿ÷¯ÿ¿~Åee6ØìÿpÕ¿ÿþíZ”ÝËñqÂÜ”É~ÿþ Rý ª¨ €€Êþþ ã߿ÿ}áÂ/GÇŸgÎü03ûôéÓ·oß¾~ýúåË ùüùs€‚j) ô/ˆêï'N|øø¢úóçÏ@OŸ> ˆê߀ú ”©65ªþ¦¥õþý{ˆj U@ÆãLj‘!üp{¼ÒÓ?ÿýÿçï¿ßÿ}~|cÙú: ‹}¼êÙ$5€"þýûó÷¿¬ ûЬÄÂðëÿ¤ªYL5*eÁ æþþóïÏ 0œqö €€€üáaªz@$ bƒÈ¿`Õÿ€$X@12¸îdøóáÇ U@Í òŒDÀì¿ðˆf08v%3%&IEND®B`‚klog-2.3.3/flags/lu.png0000644000015700001710000000074114542412415014561 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<sIDATxÚbüo®Ëðéüû÷á׆??€ä¿_¿þýúýïÃ¿ß ÿ €X>¼a¨lªþÿïãÿ þþ’ÿ2þýÇü÷/ÓŸßÿÿþ!0ãKS'@±0üøÅðû×ÿׯþýeøûïÿŸ? ÿ€U€ýþ"AŒßŒâ@ˆ…Á/ä¿’*ƒˆHõ°‘¬óP'ˆÁÀÏÿO^ €ß¾}+((rÒÿÿ `ˆ 022¾~ý €X Þ…ÁX##0Tˆ¡¿ù@€¡ñï@±”œà Óøÿá;ÐÙ À9ès cC¼ pAÎÿ;™ˆeþ™ÊÌO>ÿÿý—¨î÷_†Ðïàp‚0@ˆAŽ—áã.€:é“47ßÿ@i=ÿ~ÿc„0þüƒˆ0‚b¨ÿˆ‘±õëÿ/`™_`ô‡L‚ÙÿþAÙÿ $@€áÄyk° ß¿IEND®B`‚klog-2.3.3/flags/ru.png0000644000015700001710000000064414542412415014571 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<6IDATxÚbüúõ?üû÷BAXÿÐÀŸ Ä”æâ)úÿ¨“Ì€ð€læÿÿ™þ#/¾ Äd°jã?6ÀÈÈ´ €==ÿgdüÿ䌿ÿÿý dÉÿþ @$$ÄXXø €X¶oÿ§«ËøèHô7Ãï?ÿÿ¡_¿ÐIyyä¤?€|¸ˆ4DÝ/ ãTäÏ ¯þHÄR H\)† @Ô@,›˜5÷|ÿõìHÓŸ¿ÿüûõDþþ eüúóÈþó—ûôf†EÄâ ¼?·þý¾‡ÝphõŸ¿ŒUĈ=L¿ÿ0HJ倢 `g1‚Ø ŸH †ãW »*M  ?‰eØ8aIEND®B`‚klog-2.3.3/flags/xk.png0000644000015700001710000000066014542412415014563 0ustar jenkinsjenkins‰PNG  IHDR ù€šn pHYs  šœtIMEâ 8šÉ OIDAT(ÏuQ¿KBQþîõ=}‘Ï,LIÂÈÂApj¨%„("ZZ¥©-ú ª!£ 6ÿApj‚"pˆšZ2¨¬4 !ExïÝ{|=PÜs.÷|‡s¾ï2$³èÙÀœà@é\- Âô„Ö&ǼÝ}vóf˜âµÒ¸ÝÇÛIUøÁfb6ÈlÏxn™&cô«çé…xÔ—ZŒ@ÒïÐd€> ÌÅG®î? Ì0„ n1Íã ùݱqïE±ÚâBt€aÊR¹!BLmw%çVD©¶¤¨7¬ÇrÓYIéÈc ˆ…G?ö—s`Hfv  pi—º58¶„|õ—½-’ ùÓ¥ø-¤«›Ñ×@µ¦~ýcœÀ¡©Fñy \üc«í-Ÿ?I׎R‡—k•Ö`ÁÝɉÓqaõî=ÒÿmŽ­½O K…bâ/üØ9pÝ>î¬)IEND®B`‚klog-2.3.3/flags/se.png0000644000015700001710000000103614542412415014546 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<°IDATxÚbdpnd€¿uõ ÿ€ˆ¹¬”á×?†_¿~ýaøñ Áøý €X€êªs=ä¿ÿ•¿1üûûŸáon‰ßŸ¿ÿÿüýD¿ÿþ‘ÿ@ŒM¹“ˆlôÿ'ï¿ýý÷Ÿáç£ÿÿ3üÿ{ÿõçß@Eþýúó÷ýû¯¬07Ã/€bšüïPõŸŸ¬ÕÿÿýbaüñíÓ/°ž_`ôûP3й¿ˆñïAF¥2†_@³ÿ0üÿóÿßoú&ÿý#0ãÿoFvùO{ é 0 ÿAµ!Tƒ ÿþ•ÐI ÿAêþEBHH°#Ð爑A¿8«,àþ›À ØêÞ ¶ê—ùÚ’ßþ€üðƒé×`øüûó篲ßÙÖIÄÂðãχþþþófد_@Õ  ú ÿß ÿ0þûÃDì Oˆ)@¥’üÜÀa`“fÔ¿ß²B< °ºùß_ 9ÿþ¡ H FÉdxD¾³@‡Š¦Û2€Bã ýs$@€ܹyˆ'æIEND®B`‚klog-2.3.3/flags/sn.png0000644000015700001710000000102414542412415014554 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<¦IDATxÚbdhd@€ ¿˜˜@Œô‡áŸ&‡@ÄTVíY Rüÿ1Êýe`¢?Œßÿ0ÿûÃÄñûÌŸÿ¿ÿÿ"¿lÚ@,`“ÿ?ùúôïÿ¿ÿýeøÿ›ñïÿÿ¿ÿ³ÿ‘ÿ~ÿ¿ýëÿ¯_@ÕŒ²²@49€0s‰ÿ°°T¦7ZØï ¦:óp£šZ_XR„+€@þ2Uÿùó÷ÏŸ€¦~ùý{ý½ß?ÿþPú%ÀŒ¢è€iøóïïï¿¿ªè¤+ï~môûóïßR¼¿\ÅÁª!€ò ÄÂð‡á/X鯿€–m0ýe.ñûÛ¯_v@? l`; €@~ÿÿýëï/ žßýgø ôC¶&ÈÇø÷n<ÐÕ¤h0ÐI¿ÿý’@_‚= b0þPà OÁÍ@, ¿~ÿû#É- ö8X~32I qÀ þàô¤Œ€N F†d ì/z=ãð˜þÅðOÇ`þ,[‘¯‹›XIEND®B`‚klog-2.3.3/flags/jo.png0000644000015700001710000000073114542412415014550 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<kIDATxÚb˜Í@ Æÿ oª«w20\ýÿþýóL@Àïß¿a$Ø´i@±5‰0üzòtßß¿Ëÿþýøû7Pùo8ø‚@dÊÊÊHÃÿÿþþuúûWñ÷oïÿ ±ÿ±FFƇÓ? Ž¿ŒŒþÿû§ðûÏÿÛþ/Zôº €˜@QQùŸŸÿßÒòÿïßÿ?~ièëÇ¢œè€;éêÕÿ&ü?xá÷¯ÿÿYþûþÏJÇâ$€9 dðž= ß¿?äùõßË«j¹`' PóŸ?@=»UOð`ûýwý¯-+Ãéïï_ýþ÷çÏ?ûÏ¿¿ÊüJG[ŽHÃ{¶?kÂ%Ï)³Jƒÿßê@Àøøó÷ÿ `@ÿýÿ÷ï¿¿ ˆ±“¡þøù‡ùÁ³O’"\ÿþýg`ø@, ¿þüþó/ØUUZœ—…™™™ñûÏß ß¾ÿþýçoEª7ëço¿¶~ ÆÙ«Ï›éJ?}ù‰•…éÿ^nV # †ý'}òòÝW6¦?ÿI‹ñÎ_w €ÿþýËÈÈ”þùë/ÐÆÿ¨¨çÇÏ¿ÌÌ ¬¬,?| –yk.™êK ð²³±2>yñåë·_@ÖFÒþþû§$ÍÏÂÊxëþ{6V¦EëÏ1ÎÿuzŠLïòøgV.òóù‡œÈÿþÿ¯“PÿÿÿBb©ûúý ta4£±ÕÜâñ¾¢{ˆ‰áÏ? _>ýyìüSn.VN˜£þþý÷çß¿¯¿ž¼øÌÇAFÀP †ÿ?þüý›m$/Áóëï_ %!¦û ŒàúòßߥɦÂÜ_übb+@%²>43°10üb`øŒÝ—/W}")é G.°Ð!€$@€¼í ä¹:«hIEND®B`‚klog-2.3.3/flags/tj.png0000644000015700001710000000076014542412415014557 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<‚IDATxÚbÜÏ€ÿÀþ€„ gCÄ”V­®’ÿÿý"†¿ÿÿùûïïŸÿÀè÷ï`Èþ÷û÷áM›ˆlâÿ_Ožþÿû¨(ú¨HÉ_@Ưÿ¿~¹l²²@ˆÅìëWNNNˆ“þÿÿ$Ýi`âÑþÏÀü÷ã f…êÿŒœÿÁ€‘‘‘ýéS€b‚{¤ú?Ã,ÿÿýöÿÏf™¬¿&üGþü ¦ÿþATÁï‡ý̲yŒ‚.@©ÿÿþüg•b”«ø{¯ªèõÿˆñãÇ<<<ÿ!æÿéüû°óÿ·{ ìÒŒòµp㙘˜îß¿@,pãá FÙRöÿ HŽû €TÒjÒ÷ûÏïßÿúó ˆ€ì_Á$Hðן¿¿ÿüý«"®r±õ"@±0ü`øý÷$¿äo°(PÈ*ýóï„üó/ ðï/Ѐb`g`àg``g Õ´8Š´‹eIEND®B`‚klog-2.3.3/flags/lb.png0000644000015700001710000000100514542412415014530 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<—IDATxÚb¼Ï€ÿ`$„ñÆþcI€bJHtTÉÿÿþ1üû÷ÿï_úóçÿß? @òÏo û˜døóûÊÂMÒÀÀÂò÷ù3†@i ê?ÿaê@ä¯ßÿ~Ù¿€ &) %ÄÂöø1»”HÛ```|õõÕ¼Só~üüžhž,Å'´,óŸ‘‘-å<@11011™ŒŒ F¦ÿŒ ;ïî¹ôâò™çwÜÙùûÿ? 0Äøçß?€bú÷ïÌt ùÿJw]ßñîû»_¿n¾¼éÆ‹«ÿáèïÿ¤®Èšrd2Ðÿÿ1üþûû×ßßíû:þÀÕÿúë@±À5@¼1ÑoâÓÏÏÓV§µ¥š$˜Ê™ýý÷›‘â @Œ×¤«rþ>z P€üþýï×O`øüùõ“ñ8Ä~ƒƒëïy¥ÛO 0.þûÆ(  f&`°þùÍ ÇßL¿AÁÏ ePÌüýÿõЀb¼ˆ‘ÿ"Îe€‘@`SDæ„ÿ>|IEND®B`‚klog-2.3.3/flags/zm.png0000644000015700001710000000076414542412415014574 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<†IDATxÚbdndf€¿ÿþ2üc`øF@Æ/0ã  €X€ê&yN’ÿÿÿÿûÿï¿ÿÿ€¨È’>ú|ùðû߯_ÿpÿú£Ù· €X f¿úú ¤úß¿?ÿþüýûçÏÿ¿ êßï«,ÿqýè¼÷ˆõϯ jú賂hõÿÿÁF þó¤Dþýû÷÷¿ß¬¿þüþû'WR("Ár@±€”2€2òýýýçPÓïÞþk\8ýúõæßï…éêõGdÐ)Õÿ Ùóh6Ðñ¿ÿüúBÿ~í@±½dAÜV×öï÷/ ‡Ão ¿€¬äE¨K~Ô‚´ýûóÿ×/ ú @u@ ÒR¤¢BmiøÔ𗤞 €X€Jˆp‹À,ù÷:03 þ”úÿWE ÄÈŒ£ðx‹=Ë ÄÀ  Ž«ó | ͯwKݵìþIEND®B`‚klog-2.3.3/flags/bf.png0000644000015700001710000000076114542412415014532 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ƒIDATxÚbüÏ€ÿPÙX@šäØ„¨_ó·¹ÑupÉ’õ2âÒ’KF6h„U ôwgÖÀðÿÿ“§@¥ Õ¿CH(ú$ýÿõ Èf”•Ú@,`³ÿ£¨JCL©ûÒÖÀðû7P@±1#P5PÅŸ? ¿äïÿÿ~Ï‘ìí¿þÿüÓ Ò4 €XÎ10ÈrþýÅqåŸ@éö_¼Â@¹ßÏübÿýïׯ¬ {X¹þ\b` ÓZ†|÷?>ÿùõïן¿~u\ÿ5×ô÷ÿÿ¿‚Ïüþ•õ (òë7ˆTâû}ê @ ÈÜB.²c¦õ^Ñ=V΢BœzE¯ÒˆœRÜf¤ a,låë@, @ƒÔýé›úLÅÿÍjø D ¿ˆˆÿû#É- 6æïˆN ó€fÃá/üÿû¨á@12¤3õ@ÑTö$Æp<31S«hÚã‡B¾IEND®B`‚klog-2.3.3/flags/om.png0000644000015700001710000000073614542412415014560 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<pIDATxÚbÜÏ€ Þd`ø   PÂöÇoçÎqYZ>ohàççýÿ(öÿ?œBÏž= †¿?òØØü¼{÷×£GXÕA##ãŸ?ˆ (Í,&öaÛ66%¥¿ãR @'#Ð*ee?fÿùóÿ÷Ÿ¿~ÿÿý¨óß/ ã׿_¿€ìÿ`’]^þÀÁƒÄôÝÿ?Š€þýþÃðç7ï_ @«ÀêþCHãÏ ýÄ$þÿýV 4æÓoÁ ¿~3þúÅøJþ‡°ÿz €À@øõè¤_¿’J~ÿúûë÷_³  ³€l [•ùþœmg P(ýr7P'PBéürë¿¿þþeøÇ@þ°JJ‚ìùóW† ¬õ/PÅÁ {*ÿþýTþ—á@1®e’ ôL&†20ü³¾…þÁ¸i€¼ìyx9½IEND®B`‚klog-2.3.3/flags/pr.png0000644000015700001710000000105414542412415014560 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<¾IDATxÚbd`¸¹˜Á@‡áû†_ ÿÐ0b€1€ˆ‰ €XÔU¿a8¬Ãt‚•ñçïŸÿÿù÷ÿÏïŒ?ôï÷o 2N¬[@Œ ÿk«=ù¯Àóª°š‹W„ýÿ¿ÿÿ¢@â? 01¸ÿþ½¿u €˜@6þûÏËÉpóXn÷£§,™X˜™è?õÕ13ÿca  “þ‰‰1FF0ìßóÿ܆œœÿñ²ë”>æýýêÿïŸPÇ€I6™c+VPƒ™ ƒ¦Ön®ÿ‡0üûýÚ€˜¿7~žaþõýPé¯_ ôû7ÇÿÿϤaçöÿ@nÛòÿÛW†ï¿þ§È¯4áùÀüGèuv ˆ¿ÿþe•;z €€žþ]Åxó>Pƒów÷Y¹ÿLÿBÐ\FFÆg×®È?þ0Ý©Âû¬±‡‡_š$ÿï?È`ãH-XP÷oÒÀúû{‚ävS†Ýß¾¾ÿu j¸c@äßÿþ2üý»ã€j¸'6_[”áÃ7¤þ…-¾Ù ž-+1UËÅùIEND®B`‚klog-2.3.3/flags/nf.png0000644000015700001710000000113214542412415014537 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ìIDATxÚb`pf€£Ù{g¿~ÿúóçÏ?~|ýöõû÷|Ú½µ›A˜—•ˆˆ«s«ä¿ÿl´lx˜™¿üüüýÏw)^)οNšN­á¿ÿýùý÷÷¦ÜMÒÀÀðÿÉû§ÿýýþóûÿÿÿÿ÷nëýþë{kHë¿ÿ?ÿø|óå­ß¿Ë Ë•``Œ‘€AV½þÿ—áBî‘Ûk›­â‡õ „“éV}øˆ‰áÃßÿŠþüù t#ñÛÇž¿{þìݳ ;&0ügšÔ ÒÖ@ þüý äüù÷ç?î¾¼ûûïï?ýÚt!Ðm~j &†_@3þUE†-;¶ èè?`/¾ÿú~ÖÞYPþAm  (tȰ߿¿{üé˧¯ß¿ÞyuçÛïo@¯=4þï_ ÄÂðƒbÐR ÿüŒüŒ•û¶ôÙY.Y¢¼¢7_Üü 2*@ IJáÏI~I 6VvMNMq †ò†@òñûÇÊ¢*¬ €$€z@èCå’Ê8ƒ6Žw_ÞýøõC„GäË/“MZœ¿˜ >ëT GHäíIEND®B`‚klog-2.3.3/flags/et.png0000644000015700001710000000112014542412415014541 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<âIDATxÚbdˆTdøò‰þýaøõ‡áß/†_¿þ0€Ð†_`ap0 çwÕ©m Åÿþÿûÿ÷ï¿þýýûçüóïÿŸ¿yÿüþdüÞ”; €X~°1üf|òþõß Õ¿ÿýúËø‡‘Eê÷ß_¿Þùýã÷/­¿@VDh.@±0(½øù›éÐH é?3ð‰13³9_~üxþ¨æÿÿ@³–Hðs3ˆ21Îÿýývâÿÿüÿü“Ì„ìö>«àð Ôë2çx:`ÿÿúÿÿûòòÁˆ ìÙ¿@>1üþú‹ ¬ZñÏ¿NòKß|«# @4Í!(#Óí÷Bþýÿ%ÅscËíHNÖ÷p ÿ51Îÿû„jÿåßüüÿüúúùƒQ˜ñ ûþÿóTÿôÿûûüü"ì«Îˆåó£?ÿïýføý(ÁòëW]sÔu m`XjÜ9ÅôûÛÿ_¿þÿjøËðý/Ð9ÒÀôûƒ¤$ؘ¿ ~3ýþ­ýûÐÅÿå¥þÿù4›2`T @Œ_Q†„P¹hR@`! =¦Ú®üŸIEND®B`‚klog-2.3.3/flags/li.png0000644000015700001710000000103114542412415014536 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<«IDATxÚbd]Îð‰„ÿ00üùÃð ‚þ1üJü£_0Æ€b’­ÆrB¯”…ŸÈÞ9óPñÚsÅo„þüùÿçßÿ?þýùûHþ3V¶l °Ùÿ½Ô6²³ü`úóËZö¶oÉåØß¿ÿýþ T÷÷7XõïߥÅ86Hù¿ÿ ;®êr³}cgþñçïŸõçAªAJÿþúóï×ï¿ ôdÐmÄÂðé÷?Æ=7uw_SZúó/ëo ûÿþýý—áÏo_~ÿe‘~þù €X4?íPýÆ'ðõ#ÐÑÿüýûç÷ß?@Nÿý÷7ˆ Ô ä‚b\‚»f˯óyßñ1¼|ðÿï¯ÿ¿ÿüÿýûÿï_˜$Ðf&¥(†¯ÄòìZê?¿€¾‘€äïÀª$ˆû‡ùïŸ7 Ä £? ƒAJ!†Mý5l Póß¿LAñ@,ÿÀÅ$™€~úú÷oÆ¿ ÍL`0€¢ãÏ¿ Õ ` Äxÿ`$* @€}ûa£0²IEND®B`‚klog-2.3.3/flags/gu.png0000644000015700001710000000077514542412415014563 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚbüËÉ€ÿþýbø÷„’ÿPÙÄdMŸRòïßÿ¿@ ÿÀäÿ?@Ü¿þÿùûÿ7P ̨­à ˆÑ/ß‚¥ÿUÿÿû÷_໥¬Lÿç³DþúËøûÏÿß@=þK3þa` &Ù¡ªÿ þË`ý­åžã{žpËć½ Õ@ôDm: €˜€ŽþûŸ¨Èÿû‡è³7Ÿþÿûõðý9¶Ç¿~ÿ©# P@±0ü»hÈÝ@mÿ˜ÿØIúþÿ÷Ÿéß®?þþþÃuÕ_F €bùv´¬áÿ—Ïÿ{& kÈðøòÿ7;Ã/ Y¿¡þ* & þý¦ä\†¯_J ðµœyú“̯ߌ¿Áª²jäiwÁžöç»ÌÏÛ˜W1®”*‚z,ÔT @ 'é{覂ӊÄÿ0 kF j z b€büŒ©Ø©? ˆ¸0ã–Hæ¢ÒsdIEND®B`‚klog-2.3.3/flags/gy.png0000644000015700001710000000120514542412415014554 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚb´´”eÈÓºÃråõ½§ ßþ1€À$ô FþÉ1ÎÿÓî‘’ D! $*íøû°Þ¹æõäýüøüüüÿüüÿûûýüüþûûþüûýû²—²1Îÿ,ýêèÅ‹ÍÃAAUr.Pêöäõö“Óžåóáûû÷úúúþúûþû ú1Îÿ€<<ððÛú¼ÎéûÁ$Ä åI[ACöýþëøöï÷îûúù  ÞÈÞˆñ/PCYãG@û¿ÿþ³á÷QÅßEU¿øÿÿÏùÿÖÏ?‚¿0λ¹âÉ—7«ûWXCQñÿ‡€~ý»ò×/~çß…Å¿™ýÿÔ$ÅÿÿŸûõ·D‡ @±=þÿ/Ä{¿~ÿþÓüû·–÷/—ˆj¶ÿÿKý~ö•eÞþ_^1a1ÎÿþûûÿúúÞüü’ úO{û>8ÿÿ(ûþaæõ¢Ù¶¿åÎÛð×üúô#"ô¤éÏŸý¿o–û[Ý%'Ä“øê×ýÏßšÏNºõþꯟ_~3ü¹•ùÀX –+ /…oøˆW§„¾üö«ûäšÛïþúõñÃy>‰?ÿ@±ñþÿýûï/0XˆQ”“áõ†I çÞ Åô/Ô˜þ&y ï6!j IEND®B`‚klog-2.3.3/flags/sd.png0000644000015700001710000000075414542412415014553 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<~IDATxÚLÂA Àù†×ùÿA’6Iââ`);Þý]LA§Q)\ÄòÜ€abBWξLþ1þûÇð÷ïÿ?þþaüó‡ùϦ߿ÿÿùóF~Ù´ €Xþ0¼øPcú½eÍk¦ß¢ =@ô HþúÿëÍ(+û €@þýúÿDàuI ·C3ÓÆÿÿÿýG€p‚™ùßýûÄÄtñÿ¿~ýyÂû2÷`Õc¶¯ÿùø?ñƒ/ï €bÚðçßßßÁc–Ç5[+þ¢Ø€þýû@ ÿýùóïϯ¿ÄÿŠ7y61þgÀ®è´ÿ䈿¸ßp·{µ3ýdúðýPâ?XY33ó§OŸˆ…áßÿ¸^r½^þ:pfà/0:J‚Yþüþó篊ŠÊÅ‹ˆ…á Ç+N®C\’B’øþå à˜õ þÂ0„ˆÁ–$`J-N:“ÓcIEND®B`‚klog-2.3.3/flags/rs.png0000644000015700001710000000064714542412415014572 0ustar jenkinsjenkins‰PNG  IHDR ù€šntEXtSoftwareAdobe ImageReadyqÉe<IIDATxÚtPMKÃ@m6Å\Dü¨Z©Øœ{òèUQˆGÿ‚7Á¿QD¡WÕ£ …‚TQ”¢¡•4"šq6›„‚øØffç½™ñ €ÉQ™3Ÿ¼xÛÞ">H¤”v“Ódšy­ŸÈ˜E>›Ìî _+*¤·Ë7êê>¤a´o–­Ô ã$k »;óÔiܘLZ=àK¯ä/Î-]wT° íÕ«–ýÝÑÚ‹ÖåQ§Õߩθ·Å’ä€*väÄdåüâø§Õ2ë Œ\™4äjMxo\EÇuní§ÊF8%dQåAse½r°Ïwþ^õâŒ2è½ :ŽÓëõD¿ßBÂWûþéðNomy ¦ÔT³µ,+ CÁ$Û¶azˆyhüB¡ÀV‚ Àæ-Ÿá?ü 0Xxþ<ÜÍ4˜IEND®B`‚klog-2.3.3/flags/bo.png0000644000015700001710000000076414542412415014546 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<†IDATxÚbü/ÊÌÿþüeø¤~0üû¢1@å†`8ÞŽ(o¥KlhF[lã܉¨B)ЀìÔp„øúë °†ÿ ÿß¼*©þó‡*ý÷?HõùÈøÍ(&´ €X¾EüeSýõOèˆ?ÿÿÕýûýÿXÛßß`ôç˜ÁÄ÷í“<@±|Ibà•þñ÷÷×ÿÿÿ0üªþóÿ?PÃo ]0Æo°¿˜Xy?´0 Ð# ƒAÒ@Œßÿ€ÒPEþ1ü3€‚˜€Ü Ä´ü?Ão°jùfÔlˆ%`Íÿ®üÃ@,kþ0Øôçç?° ùÂøf€¹@ÕÀàaþ1ó@±ä~bÈÿýõÁ¯O¿ÿýþóïüõï(\ ˆà ùW‰áëÑO ÄÂð‡($Á" ? Iÿþübø HÐþý÷| Šˆ‘a#8ÿ !÷,n!‚ P À­#|·9FIEND®B`‚klog-2.3.3/flags/ls.png0000644000015700001710000000116414542412415014557 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚb|ûö- üû÷™„€?þ@Þ}r®8@,@¹/ÏN‰ÉÿûûûÕ£3²º^ŒŒÌ ÿ€BÁÔ£O<øÍpà@4H¨XÝ8<ç÷Ïo²úŒŒLHÊ@àËÏßQË.={ÿEF€“‰ €X€vß:¶ôýó{ÿþÿýúᕬ¶'##\õÅ'ÜzÿåÇï ¿ýbP™@,ß>½úÿÿŸ¨¼Á·Ï¯~ÿòç÷fV Òï¿~—m¾vêÉ×_@…?ÿüæ_ú[â=ƒ @1Îÿ &:]ìãÒòêß'<^ÿÿÿ×çðO ÎÉàðùúúúøùú€úÇüòø䇗wŽ Ji000>¿¾ËF©jËõã?|šúñ×·»¿¦þb~óûïo `øÅ1Îÿþþþ'@(@ÿþíôù]¢ÊàðûûÿûúùúœûÔúôûúûüþüýþüü¤‘™õÿ¿Û¯½è>üøû?¿€þûzï—ü”ß,o~ýû ôŸ@ ¨ €@^ù6ñàýÿˆórþáøû›gõoŽ›~ÿåþó÷ÏŸÿþÁÿ¿~1KÏ® §\`xñ Õ¿¾1¨Meàc`zíÐ<ú&ÿI>€mPâ!j&@IEND®B`‚klog-2.3.3/flags/cd.png0000644000015700001710000000102014542412415014516 0ustar jenkinsjenkins‰PNG  IHDR ù€šntEXtSoftwareAdobe ImageReadyqÉe<²IDATxÚt‘?L“AÆŸïúÕR‚L !LUã8 ‰CÃL±‹Æ?,jX]„‰¿+L,4Æ¡$~URЄ’ –ÑÄÉÄÉâW¾ÞÝ÷ò^Û…ËÝåÍ{¿{òÜ=Vð;¸ßµP(>æ åñ’P Òƒ/¿Þì]÷<Àfƹ›}€wŸï\s~Z04iŸ|]-èIû‡{ÓHu¸1‘ûõ!r‰n]å¹|ºúAÉ=9¼sšØ>ÉÍn¦ÞËÿ9ÆŠÝʲ<[ré-Ó%Mî뇻•ábyãß,‘Aˈœ0Šf3ßtg?ò…Mú¦^qÓ,œùû¾†zˆ¸ˆZ ú,ÊÍ|i“k¶®`ñ î+éyVº3Š>¥ BA„ ÌóŸ7`¾œ+½œr†¢áÔíK•huúÃ)ô¨ $Ä%ˆ{}Ñ€¹òêá«©l¢úæ@Ò¦ ’7j `è:úåøõÄ'ƒ¢F3î[P¾½e¡PçP\0L"Öj ÖÐ¥ü#î´5¡êÓF›x·ˆLÄÖ:_zŠñ‘±L1^Q­†ä¤+€†fïì§~x&Àx™ù5^šIEND®B`‚klog-2.3.3/flags/al.png0000644000015700001710000000113014542412415014526 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<êIDATxÚb¼ÌÉÀò‰Xþ0üùÍÀÂÀðƒ"ö‹áý# 8@±¥%'ôUÿÿû÷ß¿,ÿÎyÿ5„“‰éïß¹o¾dr3ÿýó‡ñϯ¿Ñ•鋈… þ¼|ÎüïïâwßB9™t¿þ¨{÷õϯ_œŒ¿Þüë}ý©€› Èe“Z@,ÿþÌ¡?Œ™ÿW¾øôãçÏÿ¿qýù3éóÏß¿~fs2ÿûõû߯_ÿþüº €˜˜~5üþýÿÏï3_¾Kÿûóë÷ï¯?=ýþãçŸ"ÿþôõßÏ_ÿ~ýú €˜þ5üêþÿû Ã_†ß¿K¸‚A%/“À¿_êÿÆÿü ²ö7Ðñ ! c~ÿùû÷·ã_öÿkß}cùýëϯŸ»>üKagdÿóh6Б@³€~  ‹€ªü??rþùÕñòc0ûÿ?~Qcé³@Aj “þþùÆÀ@ þýЉ Ñ6>fæ?¿­™ÿfúÇóç÷!Ö¿¿~|r6ÐÏ  V ë™EĘÀ!ÍÔùûO€0PÈ ?˜@FX@1ÇÃ?¤ýŽ`H¼Bc ,Â0eúB@MvŠ=IEND®B`‚klog-2.3.3/flags/ge.png0000644000015700001710000000112214542412415014526 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<äIDATxÚb|ýú5 üû÷B²ÉH2üeøöøñ?0øóç\ €X€”ˆˆÈÿ÷ïþ^8ϤoÀ((ôÿ?Ã¯ŽŽÿ~óKJþ‚÷ïÿìßËhjÆ )uç΀b‚˜ýûòÅwgŽý¾x¨€áÿßgOÿ>ÿóÜé—û¶ÿ<~¨ h@l*bµuàåaÑ7†pÆÿÿýû?°Ø; ±³±˜YÙ@×ã×ÜtÖ€àÿ?101þÿõëÿß¿ÿ¿ÿsü(P“‘ñ6v 3Ó¿o?™ø^Ô×ËÉ3™„D€øÿçÏÿ߀ÿûûŸ‹ëÿß?6oüÿã;Pðßo…Ìrr_¿ –èP&3UFÆ?‚møöçÔI ~&;G6¶ÿÿþ032ýýñ“IPˆmû.€1Îÿåååüüüûûûó»·úúúùùùøøøîYTíRMõõõôôôóóóç“‹òòòóóóÃÃÈ À?6­}¿kÛ·µ+ ýÿáéÏÓ&¼Ù·ûSwØÓÿˆˆ,v#3þ7oØÍ¬ ¡Ì(.Áðë'###ÍãÊòý;«§$âˆñþýûЈC›M_hï—“'\ˆ:² Ò¶NsKIEND®B`‚klog-2.3.3/flags/pl.png0000644000015700001710000000056614542412415014561 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚbüÿñ# üƒãÿ€ô?l €X@ ùø€ÄÿÿÿÁÚþÿŒÿÿ3300ýG_ž= ¨¢ÿÈŒÿØ##ã¿?ˆ…HÕ) “ˆèVF¸j0Ä£¨ €Xøùúúþ?{öÿφ?þÃÑïßÿ¿ÁŒß Yié ØIþðàÿï_ ¿!ê~ýÿõûÿ¯_ 6ÉøéÐ9vXd<²"TÕËÿ00H3Ø pE˜Úþ5üeøûè€i`úý‡ARlÌ_†? Œ`# $ýý A@ÅÄø¹pÄ€ÊE“€Ðõ\¨Ç´]¡IEND®B`‚klog-2.3.3/flags/bv.png0000644000015700001710000000100014542412415014535 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<’IDATxÚb|ÈrÿÿsE]ú²Dç3ó?†`Aã @,@QÁÚj ùÿÿÿž)FFFá¢Âÿÿ0üùó„~ÿÿ "ÿÉß¿ïnØ@,`ƒþÿ{òH½|ÿ¨íσ@ ¿Š€ªè׿_¿þÿúÍ,+ ´ €ÀþUýÑÿ@ùÿçÈÔ_ ¥ Õ@=¿@$Óïß@W‹Ìß¿@g@œô¨óÿµþc@eŸ>#sðùþdéïÿývó¿@m@ˆü$ÿýþ ŠH ²ÎÎ9 @Œÿþ…ÿŸáÉ‚gÝq’ÿq&&¦÷ïßË=ff‘ܬ?÷î lØô줷vÖÿ~|Ìòîo¨7~ÿaQVºzú@±½ùd@¥ gýÿÿï'DÅ/ H'ˆñè?ÀÀf °†?˜$A.峌,Ó_PÀ3€ƒŸùÏê¿ÿ@ŒWaQ¨ðþ½ Þ‰·Ì® ÿÅ1$‚`$ôžZ’¥l¥¥IEND®B`‚klog-2.3.3/flags/sl.png0000644000015700001710000000066414542412415014563 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<FIDATxÚbd8Ì€þ10ü3þÀØÿ` 0@‘œ1ìn⨷Œ›8TÛ«BdeõîX%ÛN™†¬t@ø÷¹ç ˆ¹O?ûQÁðçï¿¿þÿù TR÷û׿_¶4»4Ѐb±³UaWd ´äß¿@ÕPãÁ¦þi±EYDÖJ­ Ư_sr2-º‡ qFFÆGÞË¿ Õ ¸•eöÃþã@y b€bÔÕ½X\,ùúõŸ¿a®þöÁ_,ùû_\œ­­í @±\¾|ïØ1ž{÷¾ƒå߯_ aÃ@¿ zþ©¨p20\ `°þJKJ²Bƒæ¿C;öü"0 ˆ‘a%"ÑÑ?$1Rqöó}êIEND®B`‚klog-2.3.3/flags/eh.png0000644000015700001710000000077414542412415014543 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ŽIDATxÚb` ld`  U__$ÿýû÷ €Œ?~ÿùbÿþýû…Z¾çݸ €XÀ:ÿ?}ú (ý~ÿùÔ$Àà߯_s¿}“”‘ùÄÀ@,÷ïßJ‚ô¡ Uÿ‚¿ñö–ýõ ÈøÇÀ@,"R"ܬÜÕ `øÿÌ™ÿ'Oþÿðáy9PÑCKKÙŸ?  b` ¦ ÿfé+WþÏšõßÍíÿ÷ï@¨j ñ@ôçP)@1ì…«-­ÿIIÿ×®ÿÏÈäÉîÞû¢ú×/°“ˆñîû»BBþþ9úÿ?ˆN ) ›Aðÿÿß¿˜u,þüaTRzsî@±(7(§¤Ýûxï70 ÿýþ ‘¿Àú "ÿþùôÿ¯ÿM¿Ï–þþûèx€bòûÿII ôŸÿ€µÑŸ@$0¨ÿÿùûïoÐŒ¿;ÿ@Œ Ù ß~Ñ™ýŒ€j9v^f0¹ O :„uIEND®B`‚klog-2.3.3/flags/uz.png0000644000015700001710000000100314542412415014567 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<•IDATxÚbd`H\»¶LCC¤«ëÈÂ…þìÜYwíÊ+5_ß" —áý€0ˆ¨áÓ§i;wÞ=wîÅ¿ÿ²³M¿ÿËÆÆøöí÷™3Ïüùýï÷Ÿ¿ò÷ï¿›6U Ãë×ßìíÞ¼ùæêªôäÉ'a!ÎÇ¿ sÞ½ûî÷¯¿¿~ÿýõëPµ¬,?ЀbIe˜ÿpŽöÇÇ/Dÿþ=¿÷Ïß¿îÿ™yï×ß( ªß¿ÿýúýçˆÁÿ[ê Ãk€büøñ'//+Оÿÿÿ3€!.ÀÈÈxîÜ€bº¢¤·r ,#㿈åÃ?˜^ó6üÿÿç@130$e5¼¿ÿøßŸ?Ánýó "@týo $¤•ärÎm –µþ ÂîÏî½{Vòûן_à€ÏŸß¿þô ††Šð†s ÄŒßÿHòJþ‹þù1ú {Âÿþÿû÷ß_ 'ˆ‘Á•È !!± 0:‘Ïß¿ùü MP1@A5@þs-žÍöþ­ëýkïÞ²UÍD(; €˜UÁ·Ð˜÷¿ÿúëݯ_ŸjZÿ31!Ôƒm –3 ö00p©©3ÍZª±?NÀvÞ_vv¸S áT @Œ?EY™ë;þ½xÊÔ Dß¿ÿÿúå£ûsîͬŒÿxþ³°üÿó(Îðï/£„ôÛi ˆåßëßLׯ2üýýÿ÷o†?þüþÀÁÌ*Éøí-ã¯@S~ƒTƒ¤ž=Z@Œ_^AB@ð‡á ƒªø?Xj0“½RŒ+7¹¬IEND®B`‚klog-2.3.3/flags/cy.png0000644000015700001710000000065414542412415014557 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<>IDATxÚbüøñ#ø÷LÀ) @,@ÀÅÅ”þÿÿ?D˜þÿN!/^ LÑdª²@1 ÅÈÈ´ €˜PUÿcøvíÿ¯çÿOøÿ÷Ëÿwþ?hú¯ñÿÿ?P­ÿþ Üõ m_Nþ¹ôÿ¯7ÿ¾þÿnÛÖÿ|ÿ…"ÿÿg‚úçÏ€bøb§îæ_ÿÿ¿úÏöÿ?›ô«ÿ‚ñp—1€@ 0ÿØ3ùê ããÖ»öùõõÏo^a; €XƃýðøÛ—3¯ÞÈóݼòêŠ0·Âx˜Wˆñýû÷¼¼¼È{þõùîÇÜeœ„9„‘5CéîÝ»Äøöí[>>>dc°…,Hˆä‡wïÞAbñâÀ0”¨]/uT¯IEND®B`‚klog-2.3.3/flags/canary.png0000644000015700001710000000036414542412415015417 0ustar jenkinsjenkins‰PNG  IHDR ù€šn pHYs  šœtIMEß 0p5ó7“IDAT(Ïcüÿÿ?˜zxë¥gÌLŒ ÿ3yËÛàÝÎ𡀉DÀ‚Uôßœ°ØðŸÁ€ÿ‡ÿÿ ŒDÙÀÁô×[è)#Ãÿ럕‰Òà'úàöW1†ÿ~"¾2¡áɾ‡¿…þ30(°ýâüHØÇ?оüñçÕ?Ç?Š1ü'ÂÓ¨þ'M4-1Bû’¿IEND®B`‚klog-2.3.3/flags/nr.png0000644000015700001710000000101714542412415014555 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<¡IDATxÚbdŒgøÃÿþ1üúÃðçˆüû‹$ñ ýŠ P°®#¤øï¿ÿþÁ¿þ‚xþÉ?ƒ×µW ÈàÿÿŸ¾þô÷ß b R°ô? 4ýúýHʈñí †@Sþüý2¤úß/0ùûÏ?˜j0 dÿþ Ô@, \˜™þ03üþÏø÷?Юÿ ×€²ïÄ ÞŸÿ^ú@,÷gÒ°ÿýóÕŸ¿€þ`døûÿß0úýÌø÷ï7˜üÃÂ!qSè/@±(˜÷K>~Áa©#{ôòÃO_‚Üðûϯ¿ 7]òçÏŸß`W)H ™Å@L @ýþg«¯”lÓžáó÷ã÷¾ÿþÿãç¿¿þýøù÷ûÏßÐ/pè0”~]zþæÓ—o?ß}òêÇŸ¿a4ûØ`OÐÓ Ôð ÿ&­9úþów aÞ? 0ýS f@”ÿi FKÔè„Ä(œýŸ-r¾ 9–IEND®B`‚klog-2.3.3/flags/pk.png0000644000015700001710000000107114542412415014550 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ËIDATxÚbüøó#|ùõEzš4Æ ÀÈøfü‚1Xˆ¨”H²1³ÕÛ×ýýõÃß¿ÿþüùûçüýû˜üûç÷¿ß›fl ˆñÿÿÿÿ÷ïßã¯?ýüô÷ßßÿ ÿ¥¹e¾¿ûýï÷_¿ýú÷ ¨Z–Gh@1ATCÈ?ÿþUÿúó+[;ÛFÜúûÏï,Œ,¥¥’œ’@A  «ˆ‰€¦5%¬$­ÔÔv<ÞùóßOnM!Íõ†¿¿6 Ð%ã(¼¬¼œÌœÏ¾<ýõ÷×ÙWçÚÏ´?úüè×ÿ_þÿj & úÿ0Ô”xõí%0âÔâ~ýüõëçÏÃO?øüè ˆ…áß?$ ÿíx°Ó@ØÐGÑâŸ}VàUØpgÞ'{€AÔ@,ÿNúõï7Ð@KêOÖ=ùüÄAʇgâù‰7ÞÝøñ÷ÇŸ¿N  ¡ÄÈÈ(É-ÉÍÌýû?ÈöMw7­¿¿h?ÿdfeVPùûÿ/Ѐb|þþù?0øñç‡j‰*ÃŒFŽx.€‡Ê@Œ¤‘n‡IEND®B`‚klog-2.3.3/flags/pa.png0000644000015700001710000000100714542412415014535 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<™IDATxÚbüøñ#ø÷L)aa ‚þÀ@@,@y>>> ùîÛ2^†ÿÿ¼ÿ¿ þ}ýúÿ÷ïÿþÀÉ×›6 ÄàgŸþ¯9ÿ÷ËÏÿqfLR|Œÿÿÿÿ{ÿÁ¿ÏŸþÿúýï÷¯ÿ¿~U3ÉÊ­  ´$/ƒ®ןŒÕ@Q&C4ü"€b»Þ^™‰á?Ã8øø ¨úX)Xçoæß¿6‹VK“çŸWŸÿÿýûÿÏ¿ÿþ2I†?ªœœ˜~ÿb:$ñ‡é÷oF11–ƒˆåéÏ>üòáÿo° BY«*ÿ£&&¦?ÁÁÄÄðëߟ 0u ôã'ý®î׌¿&L€xÜÔSý÷ÿ/0ùèá?PÕ¯_ÿ½wïïõëþ^½ äþùó €X€N'ÆÃt=0þ€d3ÐTfMMΞPtÊËC €\ß]Åðãï? ”ýïú_@óþPÃp€?y] z”-›IEND®B`‚klog-2.3.3/flags/tm.png0000644000015700001710000000112114542412415014552 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ãIDATxÚbd°d‚Ýï$?Ü|þ…!Ñá·™î×—~10ü`€’? 1Îÿ|s"çùÿþ uð  ïôðRsœÍßÕÔäÚüýüûþûûüýûýû±s™ˆ ¤ë?çO™~>|uæœ'Ï¥‡7ø¹xÛ·Ì 1sÿùç×í—n=xëÙ½ßÿÕÃ?†ÿÿ±²ýÿøü;ë¿3÷¯&Û‡œº{©Ü+‰‘‰“•ýן߿~ÿúõhÉo €bjøóïïÏ¿¿~ÿÉÁøÿÏ_†]—Lˆ©ùý÷ïêSÛï¿yòë÷o žß ² €X€~ú÷ï/+ëßo_þñrýûõçÏå'·RçT©K(Ý{óøÕÇ·@¥ Kþü8 €X€a´áûç_÷8~ó}Ãðëï/ ôÙ‡W~͹ä؆?@o5È “õ/ǯß\ÿýùqÀ/`àüj¹çÿþ50ŒÿûÃghnÂÆÀ¡ ý ê€ß`¿~ýþq0pÿüi ˆ >ß½Å"¦øëÃs)I‰? çü VôïØl øóä€bdàEäÄŸ 2 wÊ€ ÐA&´Œ‚IEND®B`‚klog-2.3.3/flags/ec.png0000644000015700001710000000076414542412415014535 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<†IDATxÚbüySáß'ø¿þýùÇð Èø÷çÿ¿@A 0P D@±0ü{Ç,ÖVþ—áÿ¦ÿ@òßÿÿ!ˆáÿŸÿÿÿ€È@Á?nt ýgøó¦$BÿÀJ$Ãïÿÿ€è#«8Ðz€Úr VÕ u ヹ¿šn ®OŒÌ?þÿ€;† ê ÆŒ,ß8¸ˆE¤¤®-ÑúÕû/þþÿûïÿÀèïï? öï¿ÐäßÿIóLÉ} @,ïoI=ýÀ÷ø Ëo4ÈÖßþý«êùýç?Lðïç¿\ JÄÂðãØ$ºßàŒ¿Ư?ÿÿ@¬úóïï_Pãy©¢¢_üÿýûßïßPò×/ 6$òÿýeUR:{ð @±(00p|ýÀ È  RÁbÿ‰üYTÍð÷ïÿ/ouˆñ!ÃPl¢ ?H $@€ül#Kƒ”¼IEND®B`‚klog-2.3.3/flags/nl.png0000644000015700001710000000070514542412415014552 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<WIDATxÚbüÏ€ÿPÙX@’äà`‚®U  5¨Í/w9ŒÏ~¶½ìã¢LO)¤V *â»×<¬áÏÿ'ÏJþþûÿûÃßß@Œ~ÿÿ$ýÿùÅ(+ ´ €XD ÿËÈ3°ó€Tÿù¶ˆþ€˜Ñ ”j Æ?òòò‚œôÿ?⌌Œ< –ÿþATƒ40àV”edüóç@±üƒ+Âo>а‰ÄÈ Ø_^kÿèõ×ßþýùûïן¿¿ÿþû $ÿÀÉ€äß¿ â<{;g óOï¿þzýñH¤á߯ß@u5@H †?ÿþñp²20¼ †_ u’œ“€–ü#°©@òïŸÿÿþý÷÷ß?`ø@ŒÀhc`øFDþ€£B2kÊg€ºûÑIEND®B`‚klog-2.3.3/flags/so.png0000644000015700001710000000101714542412415014557 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<¡IDATxÚbTœøÿÓøóïߟ? ¿þ1üþâ Ð/É€B97„hžÖh˜”&‰È°O@¦Q]Ûzû7$a’…ð×*®ìÁ§8Á˜û êW_ªAJÿ2üý’²ªŒß`†8#P@1ý*™Ê6†áÃÏÿvrÿþ¿ûöÿǰ†? Ôt@±üaø÷—Èþû÷ÿ¯¿ fÒÿ…8ÿËóÿgdø«÷ÿÙçÿ;ïüÿ¶è †_ ÄôëÈì¿üûüÑNæÿR<ÿ%¸þó°þßæ* ‚¿  –? `W‚öí÷ÿóÏÿ+ ƒàÿ¹gÿßûÏÂóÏ?“ˆåïŸÀÀØ$¶ËñÿŸîÿÏ¿ÿAÚÀfƒdæ2üù@,@[þüeÙ Ó°ìòÿ_@vžy òÉ/¨ñ —3üa †ÿ€-ÂͳWŒÀ þ `¨€ t@12”~eø‹Hb@°‘£G < ·mxí¸€È®IEND®B`‚klog-2.3.3/flags/si.png0000644000015700001710000000077614542412415014564 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚbüúõ+ø÷ï„DfÀÁŸÿˆ(ÊÅÅõÿ?Ãÿsq0ƒ5þ(…¾|ù@,ƒû§<~ñê=ó¿¿­º LLÿ±FFF %ÄÈ,xxB‡ÒçÏ¢B„ç,~õåËßÿþüù÷ç÷¿ßþ¿è÷? CBœ}æÄCÄò÷ý—ÇO~Ô™ÞùËg[®s=b¡Äof ¢_@ ¿Àäï¿~É¿>ýf`x@@'ýûóŸaÑòW"›–ÿùý÷÷é_ÿÿÍ¢_`bü’ þ‚B €€XþþcÚÉlòëØ@Õ@#ÿ0ýúËðû/ᅩPòÃïL@ÅÄÒÊãüµþÓ§@gþýr2”:âן¿@·¹@©ßù%'3L –†×Ìß/ýûvá÷o áÿý!.òç7ÐAŒ?TŒˆ=L@JJå@ÎÊýþÍbÿa€@ô÷/#0žÿ!!T.š^ˆ\1 Pp,IEND®B`‚klog-2.3.3/flags/py.png0000644000015700001710000000073114542412415014570 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<kIDATxÚbüÏ€ÿPÙX@šäØ„¨_ó·¹ÑupÉ’õ2âÒ’KF6h„U ôwgÖÀðÿÿ“§@¥ Õ¿CH(ú$ýÿõ Èf”•Ú@, _¿þgccø÷¬ï?C‚óïˆÏÄôïÍ€bù🙙™ªè´G~nY÷ï÷o6Ÿ 99„ŒŒo~±ħpCAà˧åÚïê¿8ÿÿüþ?2``øóç@1ý[÷É5 œ‡ÿWýXÉÀÁ‰¢ˆþý Æ·¿s±±þiéøs>ÐiÿÃþ! 3Ó“ç/ˆ‘Aðbs‡Ôã—¿ÖýþÃ&ÿƒI8ãÿŸÿþþù/'Á¶fÂi€‘A Ãæð‚ÿ¨4›Ý9…P²ã•è{¥¦AzK8à (UX§ž»_120ŸF8‘IãRÿ¤€•Sþ]¬ÍÐIEND®B`‚klog-2.3.3/flags/lk.png0000644000015700001710000000116314542412415014546 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚDƱ ÃÀ0%³3 R£¯pqòºgë— ҈3êÄO1ÎÿvÎŽúþþû=òáõÚ¼óéÿþûüýüûýûüÿüüù-ð ܤáçïÿßÿ`øûˆþÿg¹¶•‹÷ËŸ¯Œ?¿ýšÊÌòóç—?\"ßœb—×d  †ÿÿ€èÿ_†@K]òåÅß×7˜-Sî=½È!(óñﯿŸ_ý{|Žëë{–ß ˆ ¨øïß¿¿ÿýùÿ÷7Ã_ sAnø÷ï;Ï7à'BŠ®nãåû&(ûáïïßÿþþ & ï€ªÿüù ÔðHþjøýÿÿ/.‰¯7·r3üÿíKÎæ%¯ø 8Ðh€bZT ²áÏ/ ` ¾ÿ¿¿SÕáÃ/ô§?W¶ðƒ}ÿ €X€a÷ûP XõŸ_ÿÿýúû‹H?»Âþé…¿ôç§Ù•¬_ýùùh@×؆¿~ý»ç7ÈIœ‚?ùå~><ÅÁÂÎðÿÇŸŸ–”1ýúú6#ã€bF ãÿß\,Lÿÿ³2300ëø½ùñ‘•›ñÿÖ¿ÿXÿ3±þþÉñú¿ä{náŸÄøéœ#RD‚‚ˆþ¼ŒP’eøŒ}`¤˜TsRS_ÁŸIEND®B`‚klog-2.3.3/flags/uy.png0000644000015700001710000000102414542412415014571 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<¦IDATxÚbüøñ#üûÇÀÄ"AL8…ˆ(ÁÆöçïßMŒŒÿØXþ0 ,=õöÇÏ¿ÿþñß¿ÿ~ÿ2þÿ‘ÿÚÚãÛ·oÙØ611``ŠXügNûÿŸñ?Ã8øc011]¹q €Xþýûóïßw&¦¿ÿÿÿe`¸ÂøÿÏÎk߀Ѐ¦‚Ðß ãAnùÏËÁ\ºè@±°±q°0üüõôÿ¿?l™¿þ³n¿üñó?¿ÿýÿ tÏ“Àä?YA¶ç3ïãë·ïùùýú ´”• há¿o?^þ‡pÒ?¨ÃX˜˜Î_¹ @,E«žÄ;0}üöìÕÁ¾üûè˜þ‚|ä%8Y²fÜ –Å+ÉŠó?y÷ æ¸KþÁ¸Aõ÷¿¼0ûϕ׈ñúýçÒâ"@Ï!”Ãð& 5Æç®#ƒóæªl}`8õû7$ÈÁì?àš tØ? ÿo-Z@Œ÷>ÿóï4!,†?`Ðü?€(ÆþYL Ì“”©À"K{IEND®B`‚klog-2.3.3/flags/mw.png0000644000015700001710000000102114542412415014554 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<£IDATxÚbdÀì  ÿ&3`ˆc"€a‚>jƒN¬„ !˜Lþô¶ŠÝgdælûØÑýÒ_s `K ~I0UÕ@,`mÿŸ~ÿÌÏÍÿû/(4€!1Îÿèüþÿýüÿüðõï÷þ÷# /ଜîßÖïæßÝ¢“! )ýúëðëüþûýþý ˆ Hu?|ÿPšWz±Í¾ÿÿåâÒä5ø%ä3‹¹þÿßã´_]HíÆ›ë¿ÿüÚ1Îÿîæôåe,i73ÿþÿäfeqpÿÿ놅úï†0‡ÁÆÏŠêˆ‘a:Ãï”ß@ÿ};~âý²%ÌÂ"Àxøýñã¿ß¿™¸¸þÿùóóÑC¡ø$n7`ØðeóãÁûe>ˆ3ÔüÄÀÀÆÀðµ@ò˜aC¤ì–¯½&õ À}h&tšƒšÕIEND®B`‚klog-2.3.3/flags/gl.png0000644000015700001710000000072614542412415014546 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<hIDATxÚbüøñ#ø÷LÀ) @,@ >>> ùÿÿŽ÷ïÿÿøÁ $ôŸ•"ˆ ž={@,ƒAª¿|aX¸ðÿéÓ ß¿ÿjˆŽþoa¬š‘‘ñÏŸ?ÄU D ü?xáóçÿß¾ýðàKëÿ«WÑl: €˜ nöìÿ¡C ¿ÿüÿõëÿïß òë×ÿË–aj Æ¿©©Œ!!ÿ?|øÿçЛÿÿÑŸÿÿ¢£??VV ÃìÙÿ¹¸€zÿ÷÷1üGõåþýÿóò þþͨ¤ôïý{€b†HèÞ=†#GQT-‚«føóhÉ€bj`r~þd˜8d±ñfæÿ/^üŸ4éÿ±cP €þ2üý ô,@40ýþà ) 2fÚt1Q66ÆG>|`— BÿBP1@1~Æ(b@å¢I@€Š[JÈăäIEND®B`‚klog-2.3.3/flags/wf.png0000644000015700001710000000105214542412415014551 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<¼IDATxÚbd`˜ÊÀÀðÿÜÀÈøAÉÓóÁöí0@±ÕUWÛõü×+/ÿó÷¯€¹9—šêÿ_¿ÿýùóï÷ïÿþüÿýû/˜½cÓ&€i€¨’ß=úóû7·ŠÊûþþü Tñ÷×ï?¿1üúÔÃ!+ T@ ÿþ1@µýþýïï_2~ýfâåQª¯çÔÒúñðáÔ  ÐUtHÄ’¿ÿ011üøóë—|mí²²w»vÝHN–)*þ 4… €X.:¯“0{:ãèÿ?ùþÿý÷çë׿¿~¥¹tt¤²³ï–•I¤§ ¸¸<èéÚ@,÷öîçÔÑûþàÁ¿ß¿€6€d}üëÐ%{z$RS_,XÀm`Àv@±1ØÅ¿@a$!ìß¿Ò7’’¤KJ]]¹Œn¤§³ñòHÃÿ?ƒCUƒ5]õûÉ“ÙÙ@îÿ?¿þüeQQ* –_ þ°IJ‚‚èÐ0ààY düý A?ˆq)Ã7¤¸ü‡Äþùcp00–A=q‚tݯIEND®B`‚klog-2.3.3/flags/tw.png0000644000015700001710000000072114542412415014571 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<cIDATxÚbdPßÌþЯ ?þ<|.ÁÀð PYK­4fgfb:òôËß ÿþ¸PÀüç+Óïßÿÿüù#¿lÚ@,£E¾þsgee|0ûËá7ßÿüù÷çÞƒ¿?ýÿõûÿï_ÿýªf”•Ú@,@kþýû÷û×_ à¿ïßÿüþû¨ª¤ú7DPš €Xþüùû—áÂß5sîýù÷ïÙÇŸþþû 4Él¸ [ˆ…áPÙ¿¿þ>÷hðï¿ÿ2ØA¨†hŠ20Ëß§¡ —òÿ?x4á7ØHÎ@&ÁN  f  @Q„ª$ t@40ƒƒŒ®SÛ †¿ÀÀú €@˜~ÿa”ó—áH'#ØH DÿBP1@1~EHl± —€ISfàæ§°IEND®B`‚klog-2.3.3/flags/lv.png0000644000015700001710000000072114542412415014560 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<cIDATxÚbœÈÀðƒ þ10ü‘ÈèŒdb` –/ ®ÕÕ@Õÿÿý¡¿ÿýùûïïŸÿþü¢ß¿ÿ‚I ûïïß37m Ñÿ¿>y R D@90 ”‘¿€Œ_ÿ~ýr¹ee– Ð=þýÿ¬( 4¬„€ °¶ß¿?10ãË“'yää€Bÿÿÿg: èˆÛþÿ‡2þA9,llŽ Æ¿ÿ222þãpF&¦>Ë›sç¸ed€60@ÍüÿnŒ ±Š…ýÑÉ“ÄXÎÀà••õñþ}P8üúö(ÈÅá ° P–_I©ýÜ9€bzÈùú  ã?ÐW@ÂøóûÿŸ¿À`º €X€Ññÿ÷.II°1ÿþé„E0B€þ„:0úˆ±”á,"!Eê/Ôh†D?@€|(IE‹PZIEND®B`‚klog-2.3.3/flags/st.png0000644000015700001710000000111014542412415014556 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ÚIDATxÚbÜÍÀà:™áüc`ø#‘Ñ/ÉÂ@,V ï>U÷z00þýþþý÷÷Ï¿?ÿÿ’þþþýLþûóûßïuÓ7 Ãÿ¿ÿs>-ú þýþÒTñû÷_0ùïׯ¿¿~ýù-Ã#ËÀÄ@,@‡p}ÿÏÈþwÒµ¿ÿ~ÿêþrÁ†ßÿþý² ùïïof¦ß[Eˆ è` +8Ÿüáyõ›wî>ö_|ì¿™ÿ:´ý1ÿüµwã/~ö_¼l¿åødÐÁ¿~ÿû‡áéŸÿÿÿùókåÊß+W^¾¿.øµhɯ_¿~‡Eýùó‡ €@þÿýB\¿äA˜˜~ýfgûåãrLTôoNÎ_!á¿þÿ: €X€˜ñ÷ï¿þþù—ñëßO"FŽßÞÁ¿?þy€óW`Ôï?þ°0ÿyðŽ €@žóþ¹Åú»[ç÷ïÝÐ0†„ü t!˜ :eþ¿§zˆå ÃŽ?‹=%ÅýþÃú$Í?“ÀØøŒ# Ô_†/ ĸ–!¸˜á8"!Eê/Ôh†D?@€^mI•9ÑŸ\IEND®B`‚klog-2.3.3/flags/me.png0000644000015700001710000000070014542412415014535 0ustar jenkinsjenkins‰PNG  IHDR ä…ªÖtEXtSoftwareAdobe ImageReadyqÉe<bIDATxÚTR½/CQ?¯÷ö#mcè.!$"tébë` þ›Åß`4u`ê"Hl»•ØÄ •0T"Åb ‚¦T{Ï9ι÷½æy9yï|ü~çóEü´釘T'fbDõ9"‡l¡ü‹«}A²ÇcÂJ {¢êÅÍÕ¯ØçmôòœÔ›‘c=W¯¢V ŹÿèÁÁ,¬[»ac0q9ÎH±`;/f{†Æ ¦’J¿Óe³;ç’bˆ,pŒé#‚h~êxƒ#¸ßi;ß.F¢Á‚Ó é¥Ÿ©U®&‹oŽapÛµ¤Ó“´„ÀC`Aüì=~­´.'.Ž*wý|£½èÂè*‚‚#ôP_ªtZë½¢²'Ïõ¨ß jK¨‹s©m¾/_«Ò|hïÐ_2CÎgÙÏ­W ıŒÃ½F×4ûÙÍæ¶XÚ’•I9MÄjRøAÄ)»¦8=BéO€Aj IÏ~ºIEND®B`‚klog-2.3.3/flags/ng.png0000644000015700001710000000074214542412415014546 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<tIDATxÚbd˜ÈÀðƒþ10üa¸Ÿv_€Màß¿ ÿÞýx§Þ¦Éþb``a †/ Õ®Õéÿÿ‰ ‰³3q00ü  ûoö˜€˜? ¿ÿûóûïïM37 PPúÉ×§ÿýÙLÿá(xûãí_ÿ~ýþ÷[–Gh@±1Ðd Ä úûû?øõ÷HÃßß@t@ÌÿËð÷Ïÿ?þšj … A6P@±=4¨ûÏ_° þü‚8 ¨¨ €@þ‚ÍŠ…p:é?Ô€ir€¢@Õ¿ÿþúÿïÿ$Oà äžÿ¿&Í* °“@JCVþ5ü… P1@±c Æ’Ü’ oüùËÈÈ  ÌLÌJüJÿÿ! †_ ÄÈPÊÀð Ç øþÁp¼á¸›$¦ÿüùóêË+ç gP43€Õð0Ó|v Pý¶ÎIEND®B`‚klog-2.3.3/flags/no.png0000644000015700001710000000100014542412415014542 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<’IDATxÚb|ÈrÿÿsE]ú²Dç3ó?†`Aã @,@QÁÚj ùÿÿÿž)FFFá¢Âÿÿ0üùó„~ÿÿ "ÿÉß¿ïnØ@,`ƒþÿ{òH½|ÿ¨íσ@ ¿Š€ªè׿_¿þÿúÍ,+ ´ €ÀþUýÑÿ@ùÿçÈÔ_ ¥ Õ@=¿@$Óïß@W‹Ìß¿@g@œô¨óÿµþc@eŸ>#sðùþdéïÿývó¿@m@ˆü$ÿýþ ŠH ²ÎÎ9 @Œÿþ…ÿŸáÉ‚gÝq’ÿq&&¦÷ïßË=ff‘ܬ?÷î lØô줷vÖÿ~|Ìòîo¨7~ÿaQVºzú@±½ùd@¥ gýÿÿï'DÅ/ H'ˆñè?ÀÀf °†?˜$A.峌,Ó_PÀ3€ƒŸùÏê¿ÿ@ŒWaQ¨ðþ½ Þ‰·Ì® ÿÅ1$‚`$ôžZ’¥l¥¥IEND®B`‚klog-2.3.3/flags/ma.png0000644000015700001710000000066014542412415014536 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<BIDATxÚbüÏ€ÿPÙX@šäØ„¨_ó·¹ÑupÉ’õ2âÒ’KF6h„U ôwgÖÀðÿÿ“§@¥ Õ¿CH(ú$ýÿõ Èf”•Ú@,`³ÿ£¨þõëØ<º_ =` ¿5 3UUüùÃðHþþþÿ÷Y½ßÿþü6>õ‹íç/°=P @Óˆ ä¢?Hnøýû®Ô¯¯¿¾püº! S AþM °“þþûéȆ߿Õnþúðÿ÷ß?¿4¯þþd#ØIvXä*°Óï_æg@Výûä°›ÿ00H3Ä‹Ð`† ȸȠP¨@ L¿ÿ0HJ‚ú¤“l$„"pP1@1~EHJ~ Ó’åbág`ø–FF ŒŒ¢@Kˆ…áÈ¢»Ú/?¿4˜­ç©+ªû ZÎøW¤ 1ÎÿYëôëî÷î\°]ÎçÎO§Q›Ížìøòùùùøøø÷÷÷öööõõõôôôõõõçççˆâ¿ÓÏNÿùM†GæûŸ¯K//zzãH‰YÑÿ`¯þûÇð˜XÙ¿œ=@P FâFþ>øøà÷¿_N^½üaAôß_¿ÿþùõÿ÷ï¿ýÿû›EVéÆÖSÄÌ Ëð™ÿ£½¼ƒ¹”y÷†Â´Ë¿ƒoýâøýûÓoÆ_ Œ¿˜~1ÙLX„øß\@P*ö•˾µûXv[^ä–È ÝrÈÇÿ˜99I? †_ ¿qóýÿÃasGšáÇßÿÀˆøó—áÏ_ ùÿï?0ùŸáï__6O F†Pq†'k¾é1|úÇðëÃ`tI0û?$*á Zå4ÀK.øíIEND®B`‚klog-2.3.3/flags/ht.png0000644000015700001710000000074714542412415014562 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<yIDATxÚbdU?þ‰þüù÷ÿï ôçÃ? HˆþI€$ÆA!Á}`ä„‚p…&’ TÝ«»=WÿRŠ` ÇŽ™?Ç̱¯bjúÿŸáÕ›_@Õ!rP¥ÿ~CÈßÿ~ÿ1ÄEY– Ъÿÿþÿš Sý¬d$ˆª†jŠ5Ëß? @ 9ˆÁHª!ÄYòïço óÿ ÷—ìD9ÿi€¨ZõçËï¬~É¿@×o.†Äøè‰êüÿüÿó‹áÐîßÿÿúÿ Lþþ ‘`6“œÒû]§ˆå Ð{@‰?þI  Œ~ýƒèùûh)Ë¿?Ϭà0«€ 5¤ú7TØ‹Àˆ °†ßÅ%AFþý÷ç7#D3PHþùƒ Ø@çãcpþƒEæ?H”£ BD À ƒ‡Ê! qIEND®B`‚klog-2.3.3/flags/gt.png0000644000015700001710000000075514542412415014560 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚbdNÿÿ÷üc`øöïñ”,ÿ€$ðïß§oÿÔ#þü¡ÿ8ˆåï†öú¿ÿþÿþÃ(."ÈÌäý Å÷ûFÞÿÿþÿùûÿÏ¿ÿ‹*¿  Hõó@!†þýÿÏ Q@Ew_4üþû_Zh@±]2àР1@sÿ£‚_À6€,aº €X€šþþcrþ‚…ÐTÿÿ÷ÿа{~5üb  †¿ÿþþýÿä ÿ‚P?}4 €À €Ì@·àÈIÿ!Nú †rÒŸÿŒ Õ€†aµäû¿ sþ ïþ0E@ÎE @ÁÅò4@±#ë÷?&1> %?~102‚D!3#ƒ¼0˜nYÀð €\¿2¼û´¨ˆNo{ÅÃÁðçÏŸ`ðæÓW{1p*ø1 ÀÕsÍàÂÔÚIEND®B`‚klog-2.3.3/flags/ar.png0000644000015700001710000000077214542412415014547 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ŒIDATxÚbŒ<þÿËøÇðïÿa üúóïÏ¿?þE@Äøó‰ €X>ýaHU„¨þÿÿ?ã¿ÿ@ÿÿÿþgüûù/ÓßÿÁ\Ê=ö €X~üaøýáýïÿ ¥ÿ@@KþÿÿóŒ@\([˜‘á×?€b©—}£)& ÔóhË6  `>„ $YDµß‹:ï?a6°b°Z ý}ïß/›†2q{þçpûŒŒ f Äñ.T BÿØóïßýÿïýÿ¶ý?2ùí@± «f€è`³cøñNÿ9œ‘Õ3öï@±\ûøO‹÷ÿ¯¿ 0çºþçrù’þÿï+Tõ¿ l,ÿ¾ù @,Y·…J™^~†<@þÂCé4”€A'ÁÉÐyD €X˜þýcd`e‡è_`È‚t2@á t78N@~ú €·~}÷ ‘?@¨úH-(ÎÁèãÿl öpçm†A`IEND®B`‚klog-2.3.3/flags/vn.png0000644000015700001710000000073214542412415014564 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<lIDATxÚbüÏ€ÿPÙX@šäØ„¨_ó·¹ÑupÉ’õ2âÒ’KF6h„U ôwgÖÀðÿÿ“§@¥ Õ¿ƒHõßÿÿýþæ÷ÿ_¿ÿÿþõÿ×/ 8£¬,Ѐb›ýE5PÚýÏÞßÿý«þ ÑÀðû7P@±1#P5ÐÆ?€.ùßòûÿ·ßÿõÿÿÿûë¯ÿ‚¿þ'"4M °“þü…¸’á÷Ÿÿõ¿ÿ/ûR Df¿þ{ÿþÿ ê$ ¡@Óˆ 䤿À~;àͯÿ•@ @ôóïÿ~‚TƒÄIvÒo¥ WM¹$ã÷ÿw¿ÿ/ÿõÅo¸ñ@Cÿ00H38È€€T³ñëÿ3°:ëßÿ9~ÿÿòëÿ P¨@ L¿ÿ0HJ‚ú¤“Qd$È—œøþ@ˆ€Šˆñ+jDâ‰c0RZŒ2IEND®B`‚klog-2.3.3/flags/tt.png0000644000015700001710000000115114542412415014564 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ûIDATxÚÁAÀ0ÀùÅÚ§åÿrŠªªŠˆ%tF‘™~Q½WkÅf1ùxy¸¹8ˆñ¿ªêÿ ¬\yûöíÿþ)))¥DF2ìÛ÷çN†?þÿþý‰ü²i@17¼{ÇhooàáqöÒ¥[·nµ]¿sÇ.,ìÿ‡ÿúÿúÍÿׯÿ¿zDŒ<|þõû/ë¿_Œ"ýï7½`øõŸý÷¿ß Äv Põêÿþ3ýúö™éÕw©÷~üúëôúéÞ¼Mjþÿå×ÿ¿@ˈ¤á?Èìÿÿÿ00þùÿã÷î ¿¾3³þgaþ¯ë›ÆÀÀÄ;7î?ço†ß€jˆåß þüÚÀø‹ùÏ[Á²ßˆ³}øûã÷»ïœ¼¿_ýÙÖøÿïÿÜ¿ÿþj ¦ °ùýŸù×wž »,ïÞˆpþýôûí¾©Qòg×}å•yçÖñÿóo†?þÿýó‡ €˜€Á 4ø?‡æ»z÷>)ÍLeäàüxpÞ†Ÿÿ/Li±’›æþ_ä×ÿ?¿ÿ½ÊÀ@,L< ÿ™þü?þVòn?ûßÿŠ2|·¶°²ýb”g`úÍÀŒÔ? 0ü F “ˆñó|† †?þ‰‚"Çÿ¾‚CA@€…!#꥾IEND®B`‚klog-2.3.3/flags/gq.png0000644000015700001710000000103114542412415014541 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<«IDATxÚbî¼ÿ–A‘þ10ü‘ÈèŒda &™~Ç—o&ýûÿˆþþÿûçßß¿ÿþüùÿçü÷û÷_0ùïÏï¿¿7ÍÜ@,@]ÜÌ|><ù ÿþþþÿHI 4ýúû ˆ€ Y^Y†o Äòç#»“ð¼? ÿA˜¾ü´ÓHþ‡ýÿÏÈÈøÖü-@1ýaø÷ïã÷Œ?~±°0BÑôË—']8ÏÌÀÌÌÀ&¡ˆƒ‰ €˜~ýaøñ—áïÿÿÓOÃÍú¯Ëh¬Ï`ò 0€Ì ¦?¾ÿþÿçïÿD3¨ø“/8X¸Ù˜8>}†¢è¾ÿˆ(ìLŒ|ÿþþû •bþ÷ïï¿bÂÂÀà0Ī™˜~}ù@, Lÿ˜~þò˜’öäó§¿þþûõ ¨ˆhïŸ?÷þ…'PÏŸß@Ø:@, _þð>¿Ë"&öOX˜¨¨â/H5Áô÷ïp|€,’ÿ210 ûúÑ71¢éÈ `¬¥©C&‘5a¹IEND®B`‚klog-2.3.3/flags/cm.png0000644000015700001710000000101514542412415014533 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ŸIDATxÚbd˜ÈÀðƒ X3È€™ÿàè+ÿ0ÄÀ€B97ˆ_`fSVEWÖ†‘çl´]LtkFÔXêr]h@ä#S³ó ÐT†ÿO¾>ýûÿï_Æ¿ÿføü÷ÿïßPÄõûÿ¿_ÿÿÑoFFY %8c`9´ÿÿ£T»°'öEu™É&.$l4‚¸úùeDŽðÈ| €Jþýºd*P[ÐàßÿËýÿ‰¢¨ €˜þ0üù÷÷÷ßß¿ÿý’ ƒ ~ýûõ_ò×ÿª_ îÿ_PTø €@þþÿëï¯_ÿ~ý:£þ×ÿç¿þ?ýù¿ä×ÿß?áþƒœ@,@ ÇþýÔó›ñÈI@gdƒ} ô Ü=ÀPúóç@4üùûä$ °¢_¿ ª!ÕðŒˆk¿ÿý‘ä–úè:&©ß <¿z¦Iž? Œ`ªÿ@Œ ¥ Ÿ€‚ÃÉ… JÈÑ D¡Ñ ÈdƒùPåIEND®B`‚klog-2.3.3/flags/hu.png0000644000015700001710000000066014542412415014555 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<BIDATxÚb<Ë€þ€É0ÆB@Äíbýp 'íVâB÷¨‡BÈÊÝÝñØ¡¤¢,ir€ùN¸ç<Ä6èÿï'Oÿ•þý ’2€$P)üdüúÿëË*+ ´ €XÀfÿGV ”™ V V Ôö ¢ÿ@1þýû—‘‘¤íÿ0Ä€Ê>}ú@'AUÁX#ã¿ÿˆ¡¿ù@þå@12ø3d¥dÝwÿÏß?¿ÿþúõç÷¯¿¿~ÿý D Œ ”UR:[p €X~ðHŨ¢_~AUƒH à¯? ÿüÿ t@±0üb²$$0PþÍùÒfÿ† Pÿ€ñ/H@12X3õ€Ð ýg@"äm~¼gIEND®B`‚klog-2.3.3/flags/mm.png0000644000015700001710000000074314542412415014554 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<uIDATxÚbd`8ÎÀð‡Ø~10üc``a`øô›Á󘃆(÷§¶VQ\‚MW‡ãÇÿ|úþ‘ñïoÆ?™Ìþ0ýþýÿÏŸÿ0ò˦MÔÀÀÊʤ¦Ê.+ËöïÃ÷ïÜ ¾gøýëÿï{ u¿~ÿ²¹¿ee6`Yn€a’ýG¦Â%jHø$HÀ@gßÌÉO·ö² ®j`úþ“áøÉï¿~3|ýöwÍÚ¿31üþV5®h:@ü÷ÿçÏ;÷¾~ôùÓ§?ßÞÿeüÅðï÷oÕ þm –· žœKþ~ôïØ ÒßL¿¾ÿÿõn6Ô`' ãïoÿ}€,¦$ûç0øˆ¨‰d pE˜Úþ5üeøûè€i`úý‡ARlÌ_†? Œ`# $ýý A@ÅÄø5"°Å.\  3ìV[ïõYIEND®B`‚klog-2.3.3/flags/it.png0000644000015700001710000000064414542412415014557 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<6IDATxÚbd˜ÈÀðƒþ10üaxšôô*RUý–„ €baøÂPíZ RÿÿIJJþÿäýÿ§bbþÿþýÿÏ ùeÓ&€ba`‰?ùúôï¿¿@€P·oÿÿõ ¨šQVh@±­š TýˆþþFW @Õ` ¿5Èü¿ ÿ­üBÿ1’ b€bzhöï¿¿ÿü%¤(ÏÀ@ Áfÿú÷ ¨F°“ˆ ¨á÷ÿß¿þ‚Tÿþû »°ñ@Wÿa` °“@JCv €€>ý ô@±cí÷¿?’Ü’ oüù ŽBFFF8PR)# “ˆ‘¡”á(ŽAñýƒálÕY ÍÀ8„@õ öö8†€.Vw„QÂrŸIEND®B`‚klog-2.3.3/flags/vc.png0000644000015700001710000000110114542412415014540 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ÓIDATxÚbd`8ÎÀð‡áÃß»þ ÿ DÉ? ’»‡á Puuµ"‡ôßÿIÕ²³ÿÿÿ/Pñÿf†?Lÿûó'"ö÷ï¿~ÿû½iÂ&€j§Ï~ýûûïïßÇÿÿÚôÿÿo8úó÷×Í÷¿~ÿý-Ë# ´ €˜ÀVÿýóïÏŸÿ`³ÿ¾ÿñë×ßß@óÞýøõÿÿÏÿÿ\Š5РÁÿèÏŸ ÿŸxõkÛÃßF"¿YïxôË_á—‰ðï_@ª–5ÐÙ@Õ¿ÿgüÿûÊ»ß'^þ2þ¥+ôëØ‹_gßüfd€Út0tbHõo ÀÿßZü¿Ô~µûý÷ÿ¯ßÊ|¿~ýû qÄIÒðû7Ão°Ð¹f¢¿LD~m¸÷ûïßý¿˜~úRýçA6(Xîš$ÁÁò‹áÿ/o¹ßßÿ€TCD€®ÿóïï`üa  {$$Ø€>ab’d`àe`ø® ´î#Ão ,3Óeþ¿ 0ÿ Ò@Œ [Áqø(÷öh!P»ðh’òEàÄðcO{Zõέ‘ IEND®B`‚klog-2.3.3/flags/rw.png0000644000015700001710000000102514542412415014565 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<§IDATxÚ$‰Á ƒpÇviSÑSû ¶>ö”¿è TæJ}yü"G±}î ÕÿÿÿÿûŸñß²¿ÿ@ì¿ÿ˜ÿcúÿïO¨È$Æÿ¿–=Ïi›ü €X f¿ú TRú¨ô/ßÿÿÿüýdÿøý?U²‰ç×M¦ßBE~µ1äÐþÿ@E SAªÿüeøýÿÿï¿ ¿Áz–¿Èøþ‡éå/ÑÝo –ß¿þýùÏøë/Ø@–üÿÓóô—hõíù@qf†OŸˆñóOVæÊÿÿý9h:üd0€Ø¿ÿØ¿ âŒLò/^ï ./¾ýgúòŸáÈž_XI&&!>6€bz”‘$ÄÀðUŠj°ìŸ?ˆ…µŽ¡ÄëσO¿ÿûýû/ýúõï„$ÿü1þ¹ÿþ*ñÿ=Ð΀!9H„“XèúÿωèU »+:×Ië6¾ùåF-¢ã¹í Š jëKÖì F†d† @÷#Ð$ò8â!\ ƒ… Àø¹hÁ¸¿åGIEND®B`‚klog-2.3.3/flags/nc.png0000644000015700001710000000111714542412415014537 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<áIDATxÚbdð>Íþ1ü“¿þ€@ò˜ýB‚ÄÂÏð£!C ¤úûO.–çÿÿ3~ü.õ‹åÏ¿ÿÿ‚ÐúFÿ§g –  ÿeÖÊßæÅÍýëÃ'öÍç|ß0ûó¤è÷Ÿ¿ÿþ’’‚l@Ûˆ¥ðÒ¦`YEaÕ3œœ?–-û}éÒß¶¶Q¶ ÔßÜ»wRõïŸÿü… ¾¯¼&1ÎÿŒãŠî|þ÷ÿÿüÒÒü((ûÿÿûû1¾2ŽÓÿúúÿûüÿúûÿûûAËPÇ6€0 Àê7,<ÌÔƒú lME›ÝÓÜÝèÎ"#¸VJÙÆQB„þô]¸À@,À°`8ÍöÏáOt̯߿vÿNLÊÿþ{•hð¯?`@$#Ð ÄÂlþ{»ô?™{Œ'ŽüÙ±ýPÓÏŸ¿RR~7¾æ[ü hé¯?~ÿýóçïeÑ¿gO1 Ђõ—¸™þýõпùýB\píîß!ªöþxøÄÂðƒhÀÖ›ZŒó|þöç÷ŸïÜLg_þ•*Ðô!¨ €”€z€ö€H úÍ€ŒAÇÈÕ$IEND®B`‚klog-2.3.3/flags/mp.png0000644000015700001710000000112514542412415014552 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<çIDATxÚbdÐmd€ƒ~ý“`Æ_ ?þ0üùÅð÷Ã/  ² Už@òÿÿÿþ1ˆðý–—úm,ó‹“áÏÃ/ìÛOý{ôšñÏßÿþüýó÷ï´ÊIÄ6ùÿËw_ÿþý/)ðKGéóŸ§×>–dd”U~è¬òuÁ ™Ϙ~ÿù+!´ €˜€îøÿï?PõŸ¿ÿä¤þHþºúGmÖm¥l ‹øþ}ÏüÿëÏß߀à/P@11üù÷ç?H5˜I¼½üøãŠ­Âÿÿ²±0H¹ònÆM%N†G¿ýùõûïŸ?ÿ€ˆ è¿6üZú—óïUm^!~6c1?'¹S§øYYÿÿú ´áPžá@mø òЀϟ„´eÞ\~üìíÇÏWî>8ûÙÉòÚïì¿AÆCm `Ømðçïæ³ÒL÷ç„1~ox÷Ùó"·ç†Rßûv2 %€9 è¦? oý½t÷Sí9^>qn €Ž4}~æ®ÄÖSãÿ‚4ü †_¿€Æ‹rýóû%Gþüÿ~öœÀËÙ¢öýí7Yñ  ù tPÃ?€bd`NDŽH0úƒDBÔÀ`0Ï@ྭIEND®B`‚klog-2.3.3/flags/tl.png0000644000015700001710000000100214542412415014547 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<”IDATxÚLÂA °]=Á3=\’$IäfMŠNp¼û»˜ :J!s#ÃæÕ5^ü ŒÇÿ1|ûËð÷ïÿ?@òÏÿ?þüùÿû÷$ò˦MÄÔpâ¿çêOãcþ±®øûÿü/  ú$ýÿõ Èf”•ýÇÀ@ ÿþý?´ëï×/Óóþ°þûÙïÿ¯aJAªC40üþ Ô@L@ ÚÚÚÕÕÕG÷ýïìûýÚò÷ÿÖßÿíÿg«û 6þÔ b€iðòô”““knn8sò÷²y¿ÿIþü_üë¿Ô`„†?€6HÃÖm[~äååe€êû!±FÆwÜÑ@¡ïÿ~®º·æûÿß¿þÿ{ѧ?_àzþýû@L@ 7uýýõûŸì[u{„»êÎÊÝvM¿:fß?ˆåÜ ÿƒ>ýü¢ˆT ñíyŒZ4„Ëv0@1¾}û–ŸŸ¿ë!²ŒŒŒwîÜ F +--íÞ½{¿Áà@ Ìúóç÷Ÿ?UTT.^¼@ `ýýû¤¤$P ( ”ƒ€?`Ö0ø @ÅD20ÏžJ* ÃÒ¶IEND®B`‚klog-2.3.3/flags/cu.png0000644000015700001710000000106314542412415014546 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ÅIDATxÚb¼ÍÀ ê¸œ‡áÇ7† þ0üùÇð ˆþÀH0úD¿ØØˆE…á“Íõ¥þ¸…þÿûÿïßÿ?òï? ãÏŸÿýûýçÿïÿ€"ósöãgîêªOÏžó%%ü¶°a`øÔöÿ?ƒ©`š‘‘ñýÇÄtÅïÿ9ÿþ<}Ïׯ ®îÿ  aˆ L222°11ãGöövf3³ß³gÿüþcŸÖvó0 ãÿùrü %¥9–n ,®® ººÌ¿ÿ°Nšd÷ò̧]_ç¨ýþ„ýùûû÷¿_@ þý”àb`¸@ vì`úôé÷ÔÉ?ÿÚË«³Û*ZüÄTú²èc €b|ËÀÀ••õÿþýïþð&Äý û 00ýÀøæÍ€;éÏŸþpe¤ÿöòýÿçÿh¨€H`ø‚ËJß~ü †ÿ·EôýzËðgáMˆíÀø aüÅÃß¿ÿÿþûÿ÷?þæ9ÄxšÁTt&4RÑùÿÐS0ô Lþ“ `’ Àæ©Sì¿vepIEND®B`‚klog-2.3.3/flags/fo.png0000644000015700001710000000073214542412415014545 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<lIDATxÚbüüù3 ðʽ¸ý^U•ýæûbÿþýŠüÃÄåáá’ÿÿÿ/ïyYR $ÊÇÇäB‘Á³gψb6DúÑË?ž>xøó÷l€‘‘h@±ÀUÿ¢¿ÿþýùûëV 1Îÿ èv‰âêýüüþüýÿûúûýÿFuëúûÿûüþúüÿûûþúûþûüÿÁ“܈ñ&ƒhcñŸ'þÿJþùÿ¨ðHÕoãˆñ Â`•S¼¼ñ(@±¨3_Ï{ðóϯ¿ Å E†Š/ 2ûÔl©$ÆrŠá2@±¼#ÁËË q¢kñ«ÿ¿~ýüõïð$L=}/G €X á ºè€_¿±ûþüù@ ð —afþ!#+Ê 4Œ¹P=ÄøòåKx,ÊÊ>ØÏ`ëȰ÷æMäØç°C€ Àx0_æÀiˆ{IEND®B`‚klog-2.3.3/flags/tk.png0000644000015700001710000000117614542412415014562 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚbdà>Êð‹ þücøÿƒÄÿ&y˜ÀŒ?0Ä1Îÿø{‘!þþÿÿõ4'Ô0$Ø îÿþüìó ËÖ%ÃÐ+ëð ûüþûüÿ²™ÀˆdÓ—¿ÿÿiÏ“›²ð‰ßçƒWäÿüþÿ÷ß#ùý¾ßX°ÝùÙ>Y)v ±ÄÄðáßßÿÿþÿñõoEϼË)#XÞ°¿–âòâ#·ŠÌµ‹¿€6üþt@11üý÷÷çï?ß~{šÒU¸œÓ|§µ@¥wyp÷’Ð+÷eþþù»ýŒ±®âõ_¿€Njø@@}ûóç?cªv™›çKªßòüÖó¿~ÿÿýûïÎSþüadø%'öð×ï@e@¨áÏßÿÿüù÷è¥ Ðe±{Öºg€~þfxöõ÷êÏoxGö×ï¿@#€Šˆè ÷\¾+«¯zõã7V_Ó=¦J'¿ìÜêöî™(Ÿä­UÏØþüþô'P1@lø ²ǯª¿ýÀ ´xÇ“÷ߨ¹¹?•ù¬ýõí÷ß?—w ýóø´áPµ¤Ûï_Âû.øýü{ÖÝè‚0ïûÿÿ~¿üÀëöJùâ;ayI^ ³ÿþ…@120¬F‹K†/ Ï€†1000°€eÿÁ@€ö[%›ºétIEND®B`‚klog-2.3.3/flags/jm.png0000644000015700001710000000117514542412415014551 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚbüžáÙ†  '_1€À?0úƒ„~10ü``c¸¨Ç ÃÅ1ÎÿU;¢¤{ Éïþºðþòüýüýýþüüÿüüþüüûû üMûAüöðû%1²1Îÿ«Å=®ÿD2å6'ýýŸèûÌóýûÿûûþûûûû. ûkú úÍÈû¤¼í1Îÿ03<¹Ãðú÷ý4 û=ýþúÓõüþþû[úpú ûû›§ú‚šûùý ÞÞÞˆ¨áïß¿?~þY½ûÏÙ«b½*þÖdýý÷ïo ®_W®þê[üûô•_@Û„~ÿ* & þóçïo0¸zçwíÔß÷ýRãý¥Á÷ëþÃ_¹í Õðç0ˆ lýç×ï_Òb¿*~ÉKþºóá×­÷?å¥~µæüT‘†jø ¶ €@N²€ê}¬ÿÄzýbçý½öé¯iÏÿú÷;UäW¤ÑïÅJ¿úýž±| 1ÎÿFB1bKíMGûîûû…ßú¢êúôýûôýú¿ïûÔòû3úI:û.üÛæÚÝéˆQ“Ÿáè‘$ßÇÞü^þêïK Íà0FˆüýGùO¢È_w±¿ï_ý•wº@Œ_÷2<ûÄ`tŽáóÔØýcÿ“ Û-Ôø ¼Æ>sw!ñIEND®B`‚klog-2.3.3/flags/il.png0000644000015700001710000000065714542412415014553 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<AIDATxÚb|ùò%øpüùóÈ’.@1²»¿œ”'úûþþ*’ÿÿþýdÿùûÿýÈþÿçÏÿîôÄ´ALL ¤ ŒÿØ##ãµk׈®Yuß’ÿÿþÿ/ŒBÑq'@±@\ UýŸaþÖÿ7ÿçgý/Áô?oâ5™ÿ™ @Ÿ\5Xì€õÿ?¿ÿç„ý÷óûÿû÷ÿg+€¦ÃUÁÊýÿÿù¿aÃÿÞ¥ÿÿý?w’úÿ@ÿ ¸ˆ=)~ vçœÿ\¬ÿgƒÂ Y¨ € ~@ œÒ$xÈ 4@< @,ò.ÿZÍ l Œ¥?þþe’ Á¿ ˜rñðï?ÊšÄxûömäˆÄd  J€)yoé~.IEND®B`‚klog-2.3.3/flags/ca.png0000644000015700001710000000116414542412415014524 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚbüèüïÃ&¦¯žpŸ>Í€þÿÿ$ýúõLX˜ È``øÃÀ@,ÿ=á,/J0~ÇÅÅõ ~}üÈøY€ïÿ¿¬,¬¢YY,ì<ÿþþ½?© €Xx8€fý{óöï»WÕþýÿ2mú¿¹«J˜AúoßþÇ)À$%´ €X€òÿýÿý‡áÏ ÜÏ+×þûÅüàï_OŸaùû—ÝÌ”áû÷¿Œÿþ: €XþýúÅð÷ïÿß¿ÿÿü ÔðeÆL.Fnþÿ¬.þüøØÚµÿ¾ÿd`üÎøë'P@±0üøñï÷Ÿ¿ÿûõäKeùÿçÎýgåaüòƒéã3fuÿþýùù‰…¨è$€búóãÇÿ?¿6üûù¨')é›°ÐÓ¿ù"$Æ_^ü Tóó×ß_ 'Ë¿/_Àª‚п ü ß÷ìbdç27gäàø tðÏŸY1üz” €Xþ¼} öÀ¯@·ýû4‘•ÁÔ„‰ƒ¨(øïÇ÷l?™þü: €X€šþýüÍ($Àô÷;#8qÂ.$dýc``bb ²**1 ˆ¼ÊÀ@Œ·ÀQø‰÷Ê•?~À#Âøýû÷#GG6°2 0±2Ý1xÀ·IEND®B`‚klog-2.3.3/flags/lc.png0000644000015700001710000000101014542412415014525 0ustar jenkinsjenkins‰PNG  IHDR ù€šntEXtSoftwareAdobe ImageReadyqÉe<ªIDATxÚ4Q=kTA½3o7Y7F0! M@Æ Ø„ÔPˆ¤,¢¥¿Â&• b¡h*›‰kH‘* 6‚@A,¾}»oß{sgîñÞ€ÃÀ|{>î¸Ç/šb첌t¢mЉ ¶D¦&J¢ atÛhå#÷ð MH‡CºyÛëéû7éÎ F¤„$”F­©–Q ‘H6³Ê­‡|Šð+¿8;«B4¢¹yGsn…ê­J—¥[íùÓý÷ý/×d“ÂÐQ§*0TÖ+¥:1´@„Æ•¬tèóa¿t¼ÚFQ»UÕ•:&Ï 5‹ÐʺFçšûû“‡!TòÍôÕ5qhÌ’²Z%Œ¦™`ùŽÿòîÓî“ðæY³·ûöú†Óæ¨Koª¨ô¦ÈTyœ}å^ÝÚ +÷y}ñõà$Ž£¡™Í³†õ,ÿ å[ë†í ~7O…» E‰Ï;«õÔ*+í._¢Š±^½ó3ÌÃmÅ®waf›™20þúÿ¨ˆ~ýÿ÷ëæý²’l@Kˆ hË¿ÿ ÿ0œ¾ümÉæö.áK¸ÿùó¤¨çßO j úõûßïß@×ý  †¿þüýTsòâ·ë?8ºGÏ?àõçÏŸÿ~ATÿÿ Ôðÿ÷€ÙTúˆþüšqôÜ×Ù«ß»z'ÌÜãÿóçßÿ@?5üÿõë×_  @ Òðl?ÐÒ_€äÿC§¿N]þÎÓ?eúî` Ñ?¥À6ü  ñ¿þüêÚðë÷ߟ¿ÿí?ñu¢w>A™½["Áûýç÷¿¿`¨èÚ`¥@sÀ$í>ö¥{ÞÛ€ð‚¶ ñ@€ºh:@±€løó_R”hãb2@ÒþÝ{ò{ÑÆÙY3— ªÈ±ÿýÒ@Œ ;@±ù‘ «ìTj/¿ÅÀð ¤êË`@´²¯¤IEND®B`‚klog-2.3.3/flags/ci.png0000644000015700001710000000070514542412415014534 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<WIDATxÚbü?‘áücø÷‡áSÎG  Ô¿â'ÄR Àˆ‰ €X¾00¸V¥ÿÿûÇøÿ??ïÿÿ Þ£óçÿïßÿÿüþÿ{Ó±MÄÂÀÿú”áß_†¿áêààö÷Û¿þÿúýï·,»,Ð*€bâÿÿþƒTÿûûÿïo4Õ@ðëß/ %ÿ~]@,@ç12üeøÿç?ÐÿþüÇP ÿ€®i WÀfÿÿK@à‚? Ò4Œ~1üÅkØIÄtã ñ`ÕaÕtÌŸþþÙ@ Ì ¥¿@®úUÃ"`Ë¿ L@MÜ’ =þ‚£‘‘‘”8”€^üûä~1ã×R†Ÿ@q Ô DºîþùóÓ†þ}PL3€cš À¤vœC¡þIEND®B`‚klog-2.3.3/flags/mk.png0000644000015700001710000000123014542412415014542 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<*IDATxÚ<ÂÁ €0°¬äTüŸK‘"RDžxiˆDšø¿{yÊâæbr2}ø1Îÿx{rÿ¯þïþýýÿüýúüüfüúûÿüüÿ ûÿ_üÿ(ûôN²ˆ…¡“AâÿÓ§ Q–ýýæ7HÏÝßÿY~ÿ¿óû?PƒÁ¯ÿ¿þßúÍ8Oößa€1Îÿÿêÿ˜ý#ýÿ@ûýÿºúÿÏüÿûÿúÿHúÿ*ûÿ‰úÿÉûûþ1Îÿþ5ýøüÿÝüÚüÿ+ûÿ2ûÿ5ûÿþûÿíúÿîúÿŠûÿöúÿû(û¼ˆ…áÐŽ¿ÿ¿ýþÿåÃÃ?ÿÏ ¶þýÿÿïÿ—ýÿúûݯÿJ¿þóýfàûó¯’ €Xlþ'üùãÏÿ—¿¾ƒ|öŸù×ÿã@ ¿þ?›½Ìýͨûûß$€bùwœÑð÷ÿû¿dÿüýõÿÞïÿýÿ ¶a߯ÿ>¿ÿüú¿ø7ÐWÿüa`  ?˜ùþüOûÍ óûÿ¼ßÿwÿúÿë׃ßÿYý_ñûÿ‚ßÿAÞ`8õ—a30†ˆåŸ/Sņǒÿ§üfxú—Aæ7Ãïߌj¿˜þ0(ÙnÿahüËPü—Áÿï?Y€büú•á_Ã¿Í @«€ˆLÝùïÃ?k¨ TŠ™á@€ïD‡V’;0IEND®B`‚klog-2.3.3/flags/kh.png0000644000015700001710000000104514542412415014541 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<·IDATxÚbdàÝÏðëüa`ø dCЉÌ` †_ }j@Öÿ@Åÿêÿþýdüùóï÷_†¿þýùaÿÿýûßê‰Gˆ…á Çÿ_Ï^ý**üó÷?DÅ/ û7H5PýúóWZœƒá @±þ髸´ò×ãÇÿþ‚ Zñ÷×O6  æïwn3üùû÷çÿ¿~¥ØäälöÈéAÆ2þþ t·›¿Du•d]-+/7¹)P¤á×/ €bùèÏ_ ­€Æ32 ¥gp{x2pp2ppð…ˆ—ügaýóëýùóƒ €XÀ6üa9ö3'Ÿ« “€ ÐH>OO&&6V¨ñ`ˆ ` …þþ•êí 1²²þFvöÿ rK–0}ö^@ç#ò“‡O¾uýa`úýû/8Xþþ’@n¿¿ÿz^A–{ßêUtß§ßì¼"¬`9Pþ†<(LAÁaüûÿé/Ð>€Ú°–yЈDCÈ1 ALŒ43­UšŠíIEND®B`‚klog-2.3.3/flags/mh.png0000644000015700001710000000116414542412415014545 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚbdà¬f€ƒ~ýcøÿ‡Ž~!‘ÿ¬61Îÿ„’M2' ÂÐæó÷ûýýÿüþþýýþüüþûüýùýúû&äT Åv¤ABˆËÃFñÿ†+wÞ\¾÷öïŸþ•‚зßÌœ?Åðà8Å*"ÿ)– €€þ±³1µ122°±1CLZòí7#Ð`3Ö+‰ü;”y?þWqþo›ò/t@1ÎÿúüÜåò«¸Ø ÈÔèûüýúüÿøûÿê[ ½HÜÿ'9ÿ6^ÿ(ùÿ„¼1Îÿýþöøû¯ÃÞûüÿüüý÷ùüýþCÅ^Ê+*ÿ:—ÿ)âëù³ªÒÒÜ줆tè$ ‚¿ÿûý÷ß÷ïL’ÿÇ ž°5àýoV÷]ÐäøµwÛ9pêÑ‹×_”„€Á@` @K~3±üúÀ{!Æð/»Qô=&½]'_ï:¼ãÚý7?¿ÿþÏÌÈÌÆÌÄôé€jøõýÇ5¦G &oÔ ÌOýÒÞ´ãÍáS{Þ¿ÿúû?PÅ&¦ß  þûïï? €iðQ|¯f§|í»å¢C_ï?ºñûç/1Na~ößàèøý¬Ú@þ£»sö‰g¯ÿ``xŽQ4ô‰Œl€åçöàÚ÷KIEND®B`‚klog-2.3.3/flags/pe.png0000644000015700001710000000061514542412415014545 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚbüÏ€ÿ€øùs† ú(*þKA@±€VW‰ÿÿþ1•Š‹ÿ™ñŸñÿf¦ÿÿÿÇÄüÿýûÿŸ?@ò˦MÖÀðÿÿ“§ ÿшrdpûöÿ_¿€ªee6 ØìÿPÕ¿£« j°†ß¿ˆˆª6þùÃðûÏL€¤h@ôç/Ä•4üù4 €ÀNúûì§_ø50‚@`'ÿõ ä* V `ã†þa` fprV €@¡t@40ýþà ) 6æ/$Ñ©¤ C * ƯH±Šáóç¡ ô"ØÚB¥À À=a„;nÎ'IEND®B`‚klog-2.3.3/flags/bh.png0000644000015700001710000000071114542412415014527 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<[IDATxÚbüôé ðnßþ/*Šáï_÷ý1  €xyy!*þÿûËðú5üùÿ_½føûçÿŸ? þüûþýÿïß@6ü²i@±@•þÿ¢._a˜5óÿÛw ¿~Ñ¿¯_ÿƒ¹Œ²²@ˆ ¡tuÿ761ˆ‹CTüÿõÄ€# f€bù÷ïÜÿ/_fèîùÿá=Ôx †ßÕ @ÄÀ@Lp'€ŽÎÿ‰þKKÁýB±è€b«1ΜfèêþÿîXéo˜Ã 60‚@L@'ý‡#ãÿ&üûÿóšj`pm1@Aýõ÷©Sÿ{{ÿ?{†P !ÿ5ü…Ä@1¾zõJPPê$ ÐÇÿþþÌ û?~€ÄÁèõ•+ÄTúãLj=ÿ¦MûWYÉ€µð˜†€wëTm½ÌIEND®B`‚klog-2.3.3/flags/dm.png0000644000015700001710000000115414542412415014540 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<þIDATxÚbdèd@€ @äß(fU†Ÿ?²W°ƒD~1@É_ ÄTÖìÒ $ÿ2üýÿïÿŸÿþýûÏ ÂZ\üŽ™™9+ ë÷¿ßþýþýïÏŸVÌX@,£Ÿ~{öïß_ PCÌ•_¿ü)ýÍø«=Íéñ$í¿@=¿ÿü–æ‘Ú@L 0üý‹¤Úà×v×?QVS²¬~š¿û”yîû¯?¿~ýûõçï €1Îÿýá‡üæÿÿýÿüüížBóI/\ÛúΑ@X}¹úq ÿÿúòש1Îÿ|{vããâûüüüûû’ íd+ù1\™œ÷ûûñð N×òúúú ¹ºÀˆñïß¿@=ÿ€ÿt¦/2»µ÷KÖÿ„ûßd?ÿ­Ý)ËÔ¾(ÏÄÄôþý{€bd¨f(ö.~øùáï¿ ÐH9ÿÃôÝçµÎ¿vþntÿ›½îÇ!næ&£ÿ@(ò)j?@LÀr~ýýÔðëïï‰ÚÿŽr1%ífzÿ’£~»4D5P ¬žüÃ@,@ÿþÿ[‚SD@À°ZcýÛÏ€3/ýÅò®õËvúË•ÁPH5#C.JDBØ/‹Äž>}*" •…$€M,Œ½8̃IEND®B`‚klog-2.3.3/flags/hn.png0000644000015700001710000000103114542412415014537 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<«IDATxÚbd_ÊðéüùÇðëˆüûÈÁ†ˆ…áݯÆ.[ ëß?†ÿÿýý TüïïŸÿþþÿ"ÿП¿ÿÿWö. †_ÿ~ýþ÷äåÏ¿AªaÒÿƒÑ/ ‚?ÿú'+ÉÉÀð €XÚ'x:J|ûñ÷ÿÿÿÿñÿ ÿÿÿ±Aè÷ÿ¿@»VÿûÇÍÉòç‹@1<þüüýû÷ó—ßÓWÜÿýû÷ÏŸ¿~üüùãÇöÙ7_½ýüõë×/_¾ÉãÇÄ·ÿÁ€!ÐYÈX»çŪí/€Œ/ N6Fˆì?ÿÈ>(ÿÿÏ_ÿæ¬} d9‹…º‹ó6<ýñó/L ˆ±yòI/gõ¯ßþ€\õ( PëÁ®…P%ØÉÿ¹¹XÚ'í F†Þ´z·{O¾þþ “¿¿þüÿõëïïß PLþÝ9î‹úˆÌ, Š2œ ¡ÿ8àAaÿlPt@ßІjXDþÂÆ€Ä:„ä0Ù½tÃ~âIEND®B`‚klog-2.3.3/flags/cf.png0000644000015700001710000000114614542412415014531 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<øIDATxÚbäÔ¿ÁÌ/¸¾VÒ¿ñ9Ãïÿþ~aøxAò/ƒ€ÊcÖ þ2üúÇðLþú1Îÿئ°}ã2¦ªÈkýþÿù ÁmÿüüŠ<ûÿýýÿýþÿûüÿýÿþ‰n܈åß_†ç“9›§lÎúÇøÿßo†ÿÿ¿ÿÿïßOÕÿýù Rúçï? ).ÈÈð… €ŸÊ“#þk†æO¶?ÿ~ýû Tý÷߯Î@çýj1ÎÿSööììû__)) ÆÆï¯©=óìÛÍ"{llûØ!ÃÑÂøóüþüçÒç¬ËÓÒ ?þþóç¿?þ‚Bä0ŒX@®ùý d,Ë×? 3ÿXTáR¹¸â"@Cé×ïßuõx23$KKï€Âœþ0üþÍ Ž ö¿[+ÿ>ðø¹è$€Ú°”áRd"Gì/0 ‘‚ Œû “P=Be²ÂùIEND®B`‚klog-2.3.3/flags/ni.png0000644000015700001710000000077414542412415014555 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ŽIDATxÚbd(üÏð‹ þýcøÃCÿ@è*b`  êú°âÿÿÿýgüûáï Êÿÿ2þùÇüû/ýçïÿß@òßÿ5M_ˆd؆§Ÿþƒ”‚ J3¥ÿ…ªûýçÿ¯¿ ® ?#÷Äbj *ò_hPDüþ÷ߟßÿ¸€z 6IQ.†ÿˆñ/ÐnFF “þÿÿφÿ¿ÌýýåÓ¿¿Y¸8ÿsgü‡ ²OŸ>Ä·P1ý÷×öûj·Öüÿ÷÷d ”Ä‚¬šªƒÑQþÂ_YŽÿ (ê¡òï@1êOÿ]hÁøúë˜ÎýÇøûÃßÿÿ¾ÿã E€¶þeçal[ø €X.îúwZšùþ;`80€B&ÀPâ2@lH˜‚BŒAE˜a%@ƒõßo& ~°(®€äo`$€´1ü’ÀhùËŒ¥? xû@Œ þ_¾À"(öƒ=v!Qþ¤œ• À/1b»ã˜l­IEND®B`‚klog-2.3.3/flags/ke.png0000644000015700001710000000107114542412415014535 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ËIDATxÚb`  9 La†w÷«]çØ2-‚²¬$w>@Uµ;³ß;qXÛÿ'Ož<~üø<-öñ£ø»÷‰IIw?¾}ûöÍ[·nÞ¼ ÔT @ŒWOžTÒÕýÿïßøöêÕ¿%KþüùÅ%&•ø÷‰…ùȦÍÄø’·¶þï“gÿÿüùÿç7P]ý¯ùŒ,¬ÿÖ}|×úóß¿?ÿÿút‹¼Ü­½;P,9@07BâÿÏ”8‘bÛª˜ûdªlójºÖuy©¡Þd9#/5ŒØ‡À€á9FxAÇÊÿ¿ÓZ¤K·“¹$3‰ (N;5,bGâ/ýÊŸº#ûá Æ«×÷+)˜CêÔÿÿ>¼xÄ0yÓŸ¿?³ã$å@b /ügaf9pd%@1ÎÿylJmØóÙûýûûþúúþÿþ 3Ûûúû½"ûíýìúþöüýûüþý+)ʈɈ…áП¿8ä~ƒDÿüþÔöû¾6ˆ!ñ÷è?žÿÿ~ÿûó÷?PË? b€bdÈgR ~ÁÐ$Æã˜äa0[b=+ Š`iIEND®B`‚klog-2.3.3/flags/ua.png0000644000015700001710000000067614542412415014555 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<PIDATxÚbdhýÏÿþ1ü’ òÏ?(ú#ˆ ‡rr1Pz£(*¡ jã—dÍ!ù7n—Gÿ3Kž¦,TCÅ“~KÖÜG±00T?ùú¨ôï? Äß¿ ¿ÿƒ¤!Š~˜!ËÃÈðã@løT´d6Hõ¯ÿÿÿü+…ksÿ¹ €X€.û ²¤úÜl$ÕPä*† Ä rJ„Sá×ߟ wÿû÷¤Hþ»çˆýÊ–ábc:@Œ20Èäÿÿÿà?Ã/ Wÿíø…•dbRzü@±C’, HTE(ªÁ²€¡ @ Ì P®‹6†¿ ô‡ €@˜þuJÂDA:ƒ#Bþªû?€büz¿ÿþ@I8Â`@pA€H‡nèáGIEND®B`‚klog-2.3.3/flags/cr.png0000644000015700001710000000073514542412415014550 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<oIDATxÚbdàoeøÅÿþ1üúÃðÿÃ$ô FÑ?€Ĺ AˆÆèˆ>œÐ*÷€W£m1zžé;d‹†*Ð,º!üÁ{å@Œ?ÿÿgf+`X3 €ð?|ú@, ‹1ÿÿþíÿ? Ä¿ÿÿ`è/˜:lÍÈÅýkõJ€ÆA @ Ø€–ô£…_‰Á!(Ÿ‡h‰\³ŠHD ýÇÓ½úídÞªO±=Èt/PèFˆ°4\ˆüõëßïßL@¤ì) ñ¿@@J*~#› %ˆ €XDÚ[9ÿ}ù q(„üs7úì—¿L||2“'ã÷Ÿ?Y˜™Ar ˆÐù‡J ÀPzóö-@120·Î‹: hÐ0…= ¤ÿ€âdÁ¿ÿ@q ®¥íeÔ‹Ext¹ˆ³$@€yÓêîIEND®B`‚klog-2.3.3/flags/um.png0000644000015700001710000000107314542412415014561 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ÍIDATxÚbŒn¾ÊÿÀŸ?¦ìÉúûõëß[·þÿû÷—‚ˆ¨(½ëôÛ¿ÿþî<ù¨nÛ‰W¿~ýÚrôù÷ïß¿}ûöåË—O`ðáÃ‡ŠŠ €bjˆ÷øôõÏ0j@Æßÿ¼×´0|úüïë×ÿß¿ýûñƒIXèÑæ-Äò(Í`#¼öÐë@ yðe€Èšƒ/?üûÏÒ×Ôq(ÓÿLLÌ·ví † ÿÿ­=ø h*P5Рê÷ÿþ½ú÷ÿgxøÿ?@èçÏ¿3‹Š ïÛ@,@ß9 ®9ðdÉÁW@ræ—É6µÛ^2/] †ÿÿ$3óéÙ³ˆåØÇ@Q Á@ÇÏ8ðòÝÿU›_~ýøÿ——Ðìÿ¿ÿýóçÇŸ? RGŽãùóçµ´´þþý öpœ 1 g ŠŠˆE$%ågNÎß þ¿}ûïóçÿß¿%AƒÍþõçÏÏ?~ÿýûóï_6ii£“'ˆñСC&&&sm€³þüùãÇO°Þ?=Äx—‰ètxDþ‡1¾00|“ï¾10|“@`FEH{ÏíèIEND®B`‚klog-2.3.3/flags/cg.png0000644000015700001710000000101114542412415014521 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<›IDATxÚbd8ÎÀð‡þÁ¸@ìïRâÿþüú÷ïýùÿ¯… €X€ÕŠÕ`•ÿþýÿ÷÷ÿß? ÿþýÃÈð'Fø çïÿÿÿüÿ&·ýþ²}@±€Mûÿä÷S Ò¿ÿþþþÿHUäKü6àøýïPé/Zù›q¥,Ðz€b›ýd0LõŸÿ¿RD[sA”þ‘ë~ýïøõÿ÷o €b*«þóçÿ ù÷ßï4±ßn¼¿ÁΛ½ù÷ÿ¦_ÿþføýh:@4üù2¤çߟ4ÑßÀªÁvüþßðëÿñ @y€‚ØRúë߯$‘?ž|ƒÁäžßÿk~ýÿúûÿ/F°“¤hü¯¿¿bDþøóÔI êŠ_ÿ¿@U3€ j€럿B…~‡ ¹ûXõg Q` €þCè€baøÅàÆ÷Ç_¨š(ô›áÊoÆi¿Äÿ0 ¡¿!è$€bô½Ê°ì'4"ÁÑüÏݘ ªfv&RñÊIEND®B`‚klog-2.3.3/flags/ph.png0000644000015700001710000000103214542412415014542 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<¬IDATxÚb\»vzpð7†/ ðŒþ€ñ Ìø…ÌÀa¼ÓÂP ’ÊŠŠÊ©Ð÷!°\®ÙcïÑ3dÒ€H/(øU#æ@Œß¿¿äàªÛ¶íÉš5·¿}ûõ÷/Ãïßÿÿ©øýëï¯ßý±ee¹·oŸ@L |ÿÿcbºçãÃZR¢%+Ëûë×°Ò?¿ ªÈþ4è$€bú÷H=f`˜þÿÿtm-æúz ž¿?ý‘?!@¢ €X>30<üÿÿÁÿÿ\ ÷¹¹ š›W¬™¬}nåû?¿€®ÿtÕŸ_€ ±?¢NP÷ÿÿ2ÿÿ«ügcø¯üÿûÏÿ‹•‚VÌ»ì?Éô[) €X€.kˆa`øíþÿ)³ÿŸ?÷ìkdÕ àP-@5|e`ùÿ_aÃæÿ³füÿðY”ñ¨á/0ø¨Áèÿ»å K/ü?yœA@€‡¨Œ`# $ýý A@_ Ûý©öÿ`‘ mL7!Uû_)×IEND®B`‚klog-2.3.3/flags/ao.png0000644000015700001710000000065414542412415014543 0ustar jenkinsjenkins‰PNG  IHDR ù€šntEXtSoftwareAdobe ImageReadyqÉe<NIDATxÚ\Q±JAÝ=/wÁÎp\qƒíÅH¥½¤!ø ÿÁ|€~‚e‹`‘ê’..»;»ãÌn8‚Ã2¼™y3óæN~ôûNˆH°)D‚Bô!HI ðK!ELÁñp((pŽ0°µ&/`oÌÛló(D·\"ñˆM5§dñß|Áäо'Ä ì¨Ó±[-4¸a-bݺÿÄŸ´u·`öf#”bo 5Će§ÈÓ3¦õX©«#Ä:y\¯YUµ¦¾¶æë¼î°AkWeÉø[î+ÑÞÞÀ’|u({½^Qê&aˆ£Q=ŸGçgöôÄŸö¦SþP¡”eÙjµŠ¬7 ªä``Úîy"o¯¡)7cŒìv»´¡®ëfRð\^àË+ž¦)mà†<ÏwyýËP7”eé«©]@ƒƒý 0*ÑR !þIEND®B`‚klog-2.3.3/flags/za.png0000644000015700001710000000120214542412415014544 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚb`hfhå÷Þ_~óâéÏêê è7ÃO†ï _>30|d`xÏÀð– €3übÂðï¸t˜­èÞ#,G1üýýÿφ?þÿ1àä—M›ˆÅèƒYøçÚ3_>|yêÅår‡DÕo_XŽþÿàHݯßÿÿúÿëÍ(+û 1ÎÿÉÁ~!'êƒ× çøýý÷s1h$Þæÿõõÿþþÿþýÿýþÿþþ ñ««¤¡¬¬LGã…ƒ-ÃÄœOÿ°¾ûõóïfŽ¿ÿþüþ A 7Éðˆo˜4 €X€þüù»që××ï™Ëü¾wÞçxýëÇŸoŸ?¿øõ÷÷¯¿¿€ªýû ÔÆþ÷'à €iøû÷›“³ý¿ÙØüdýñçëŸÿÿ¸¸…Ùþþ™ý÷Ï †x¸Dx¤ÁßQC—±ã&÷¥Ï,¿~}lSÏÍÄýæ.÷·/ÿþûâÐÿx¸YdÔÒˆe~3ƒºKîI¾7_ÿ0°þ.6IؽœuóÚ÷/^? ¤@+€HE…óâÅ]ÄòÏ‹¡æ"7³…¼h˜”ÿŽyœgÎ}áæcçâ¹ã0þíùûH]ó €2¾f·°®˜üŠè/†`ô ÆøF `’ ÀàB._¦CIEND®B`‚klog-2.3.3/flags/kg.png0000644000015700001710000000077614542412415014552 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚbüÈ€ÿ`$2Žþ€p)À ó0Ø£ý•ÏÚÚꊄ{3Ýé# âpÜzÿU}ÄÖöÿß“§ ¥@ôû7ë_FÙß Œ¿ÿ]üýïËïÿ¿ýûõ (Î$+ ´ €Xþ”ÿG¨füËâó‹ÉèÃßߌš¿~.øõïëïÿ` @T @L @΀ÚΤñ‹Qù÷Ÿ“¿þÿŨô‹YóHõ/¨%@ Äòߟ¿þÿúÍ(úû?ó¯ÿ/~ý}þëã¯ÿ20'Ñ odÃˆÍøõ÷á/†¯¿þóÿbúùÿ˯O~BU-:˜ €À~øýbï_ÎýfÔþÅdðûÿß߯þú½ÿ÷ÿŸ`Ç]ûçP1@5@<uÕ¯³~1éÿþÿãן³¿ÿ}‰üûóäì¿N ˆ %%Ažþ ”1îƒ@ð7#ïÙ0üûè$€b|ŽÂ03v!±‰f  öçT‚ôg_TIEND®B`‚klog-2.3.3/flags/kr.png0000644000015700001710000000112014542412415014545 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<âIDATxÚbüøý+ø÷° þ1@1¥ù8¸€èÙƒGWÏ_dýÏÈÇÁ-ÀÅÅÏÍ-ÈÍËÉÌ|ùÌÙÇwïŠòó‹ 5 Äàׯ_oݺõÃû"bbÊŠŠÿïÞýÿçÏ•g/^®]»F@PPXHHFVh@løÿÿÿ‡~ÿþmhb¬,%ù¿·÷AÁÿ¼œÿuÕ b¢n^^oÞ¼yþâPЀbú—¨íÕ«W\¼¼Œ{pLøÿ÷ï/˜~þü%ñ)"òãë7RÒRŒŒŒž= ˆ/ºEDD€ŒoøŒÿ0ÿfâl2Ìö“½úñ9}vvni) FF “¨¤Þ¾}ËÃÍõU]7W½’™õ»Ø‡?ﻩÿüæíGIIIF žÿˆ ˆªoÞ¼9mÚ4 ¿= 8U-Tž0 1|ÿá¬Ãæê$½oßþúúú“'OBü@,ÿÀ¡ÄÅÅäw+Gý!:;!EE£•à @¤—ã B?>‹~îóþI$&/Ù×Ã1ÎÿþþþÿÿúùùýóòââößáõWG¦ÿûßáâïñîåñîâÓÒö÷ôÞéæåûùüˆÉáÝ áÇ·Äî^žøòÜïßÿþþdàûÀÊòÍÅꬨЛÿƒÂo$E_h*ß๠1Îÿ×ÓÓïùslÏü!äå^P¾úÙÞ.'ÞÐÖ­´.TLæARóˆ‰K@àçïß¿þýcø÷ÿ￟nÖÇß¾c•{ÆÅñýÏïßÿÿýúúåÏß?¿Å_åN1Îÿèðôÿþÿÿýÿ0'Ù/$Ó ó‘ :êÏÕ÷ø*ìE9ÌŽŸr¢1Îÿé ˆÿáâáínìPëŒx›øîñõöúüþ òøõûž­=ÒÙNÍ΃1Îÿþéçïãÿ÷øûýþäæ›¥7ããêéòðþôñþìéÿýú óöúˆ3qrɰJÊ °üûÃxë™]ÿróï?™ýúÅðó'3ÓÏ¿™˜c €Ÿ30|Gã†tw àÈþƒDð?°6pôséš c ÃÑRIEND®B`‚klog-2.3.3/flags/cs.png0000644000015700001710000000066714542412415014555 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IIDATxÚbd`˜ÈÀðƒ þ10ü‘ÈèŒdÀ¡˜ÛÂ@,«1U&aÌFwOx$Ërá±3ç{Ý©IK&_õm@Uë °yÿž<ù T T÷û7üû¨„þþþõ÷×ï¿¿~EþÊÊò20| SSMM!QQ®ÿÿÿ™ýl<È N0ŠDE9¶o· Æ¿/_2ŠŠôÿÿ0Ä?ݸ@,ÏB„à ¬€‘h@±€< Àk>ІÿÀPù@,ÿœœËËÿ¿~Í zÌ€ ‚dEDþtvË¿ë×™ûï0€€è×/‚0à"~3üùË ¢t3@±•é÷II H(÷û7#ˆý‡B‚‡  b€bü ‰b@å¢I@€sŒgë‡_IEND®B`‚klog-2.3.3/flags/bz.png0000644000015700001710000000113014542412415014545 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<êIDATxÚbüÉ€þ€Ñ0› &ø†€ €äïvÔ EÿÿûËð“ƒýë7nŽ_¿ÿýyÿ‰õ 3'ã»þ2üþóÿÏŸó»/ ƒˆÄ.¶gïþÿýûÿÏ?¦? v¯Åd~üøû÷ñ‹_»7hüÈT D2¢L jÄ@“þüýÿ¨šñoDÜ7u^c&Y³>²")yÙXþúóˆ~-bø@L@'ÿù÷Èþûç¿’ä vžŒ—®>wñÐÿG?%ytôîýúÍt"Рèáßß`÷üeQ|!ð_GäÇ“?ÿ¿W`•P~þûï¿_@Wýi &†_ÿþýô÷ÿ¯¿ÿ^<øüÿÃ÷ß?±‹>dP}óéíO†¯ïžòþþõÿ÷o§ˆ…áHõo°g®Ê{ùóƒÅÖP¨ÿîû;Ÿù^Üg öÿ?ÿ€þ@,À0…Ú_†_¾þašÐgãrŽýýŸ? W4;<{ Sê¿!@, ¯^1~–åÚ ì_Ì,—–©òóºóå6ÿÿùù¾=ùèÉ/@?Ü Æ×H ‰æo _À 0b@Šf 0(t0¬âÕõIEND®B`‚klog-2.3.3/flags/sardinia.png0000644000015700001710000000070714542412415015735 0ustar jenkinsjenkins‰PNG  IHDR ù€šn pHYs  šœtIMEâ-.í^ (fIDAT(ÏmQ=OÂP½}•´|%Ü ¡‰ Ý:À€‰*I£‹îüX ’'vBXtáØh°´¯½&žåÝóÞ=÷åœ ˆˆˆ¾ï/‹ù|Îé²ÕY¶:¼Þl6£ÑÈqN @¯×ËçóÝnöaÛv­VÓuÝ4M~³d2MÓêõúv»ý+ ”ªªêºn³ÙÜPJ‡Ãa¹\–$éàI’úý~µZåTp'& "c>‰Hˆ‰XÏ/ººD"L§ÓlVñ<„¯³søÈÇAx`ø °•€8ûž1ÆE“Èêñ Òú xÞㆡªª,Ë@ÄSôýóC-^ßÞ¥$'±(‰EI"napqw{ýp?±-Þ¹3ËåŠÅb£Ñ8Hé4Ö4RÚn·÷RJ&“†a”J¥ã”dY •J%tnz½^3ÆŽ7Áx<Æ¿-«ÃþR¨oIEND®B`‚klog-2.3.3/flags/ps.png0000644000015700001710000000073014542412415014561 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<jIDATxÚb˜Í@ Æÿ oª«w20\ýÿþýóL@Àïß¿a$Ø´i@±5‰0üzòtßß¿Ëÿþýøû7Pùo8ø‚@dÊÊÊHÃÿÿþþuúûWñ÷oïÿ ±ÿ±FFƇË? ŽoßAÚþ)üþóç¶ÿLÿÿÇÄ`j*º €˜Þùñóÿïßÿ?~ü¿hÑÿ¾þÿØt½@,Åÿ?ù÷ÿÃï_ÿÿ³ü÷ üŸ•ŽÅI`Kˆ è$ Áÿ~ýdøþý!ϯÿ^XUƒ ýtõ?€ùùÏ žÝª¿'x°ýþ»þ×–•¿áô÷÷¯¿¿~ÿûóçˆýçß_e~¥£-G¤á=ÛŸ5á’ç”Y%ÁÿïHõ?  `|üùûÿP0 ÿþÿû÷ß_†? ÄØÉÀPÈÀ ÄÀð †þ 1þÀÿÀ$@€ä T1pö4qIEND®B`‚klog-2.3.3/flags/ws.png0000644000015700001710000000073414542412415014574 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<nIDATxÚbd`°f@€ ¿`äŸ wÿ9È €X€ªª«K•DLLä÷ì¾nd${öìãW^ýýóùϦ߿ÿÿùóF~Ù´ €XÀÿ——ž9ãЯ_¸Ž»Ãöûçïßÿý¾ûÿ×ïÿ¿ýÿõ ¨šQVh@1íù÷aÿþ›?þððкzõPö×ï?@Í`u?Aä/¨ €iøû—éÞ½7!Ñ~ü¿uëÕïß ¿ýù 4¨èç/d @ÇÐI¿Xþü`ûýãÔ®‹wo¿`ýó—á×  @'A!Tÿù´ €Xþ2œgø{üÿŸÿoÿbø öÈÑ¿ªa$#ØIÄÄŒ`! (ŠPUƒdÿüùÃÀ@ Ìà c€+ÂÔö¨á/Ãß¿@?HÓï? ’’`cþ2üédÉ!èï_* Ư¨É€µÈR@`oÓ]ï .oIEND®B`‚klog-2.3.3/flags/cn.png0000644000015700001710000000073014542412415014537 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<jIDATxÚb¼ÎÀðŒ˜@@À•áÕn"ø,ø‰ @,@–D}5o,ÃçÿXÿ±›þxú÷ó†? ¿þüÿóçÿïßÿÀ$„}mÓ&€iàûÏ,ö”7îïÛª¿ÿ¾ýf3ù˪þûËÆß u¿€ä¯¿~Ù,²²@Kä/kþÿûü÷ë¶¿üfäýûÿϯ¿/AJÁê~I(úý¨ €X@Îýð÷uцÿ8Mÿ°¨üþ~ä÷÷Ã@Õ³ÿƒUÿk “þýü që÷“8ÞVôû7ÄT˜ñ@@ Òðÿ/È ¿ýýöçÓ:Á÷üƒ› ÑD Ö†’ÐUMÛ@ @ĉÿÀ΀ª€¹l0Xÿþÿû¨ €X@‘òû³¤$PŽ (úç7ÔxXðƒÌþû÷ß_ b€b<Ž‘ÈŒ?H‘ý†€a `:®s0Ö56½IEND®B`‚klog-2.3.3/flags/sk.png0000644000015700001710000000106214542412415014553 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ÄIDATxÚbüûõ;Ã?8ø÷Äù¢ÿA8ÿàà @,@Y&.. ùÿÿˆ&ýŸñÿf° 2øòê @±@Œÿ>1ç/ÿÿÿûÿç/P„£0÷?`ddüóç@1ÎÿBdäm^GÖÚ ïåÿ{}§¦ýÕ×”žåøþýüþýýþüýÿüüþüýþwlÖ1ÎÿÄÊðEBEøøÿjkÿ]]ývzíäñÙðüüûüþûýÿüûþúüþýèˆéï Cþýý÷Æ”ÿ?ý_¾”‰éÿç_Lþýÿý—èÀ?¿ÿÿþbü @ýÀtúãˆì-[ž=þá§Gi¤íËœ¿ÿ‚ ùýñ÷¦?ÿÄø lĸŸA©¼‹•Ÿë»½KóFÖrŸ?\{·~20 ÐaL@7JJþòŒsù" ÜYYÆß@ $ýý A@ÅÄøpÄ€ÊE“€\*=ÐM›½IEND®B`‚klog-2.3.3/flags/mu.png0000644000015700001710000000076014542412415014563 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<‚IDATxÚb<ÎÀð‡þÁ¸`ì0D €XØ”ª«ÿƒÔþ¢ÿÿþÿó÷ÿß?ÿþüùD¿É`È>¿i@±ìb`pbàýúäPé? ºß Õƒý¢_@öï¿@lY©y ÄRÉÐ\ÉïøøÛ×?ÿýiªVüûßo Èø4ᯜ0ï†'8Œ“@€iPÿÿÚ¦‹ Ìa°ÒF\¬¨(”`þ’ÞTóŸ² ì#€X$H ©2ÿy4„þþý ¤Á6üþó*øçÐ)1¡ƒ Ûˆñï_ óÿÿðŸáÃÿ?ÿÿÿþÿÿV’‰IéýûSÄ FF0ÜP¡¨Ëmb –´} êÞÿüýï(hþþûBÿAŒ îo÷¯ÇßÒ} Ä2C0¨%ÁAòœ ö 3 jøÿ÷c@12Ä3E°1þÀÀgb0Äße WIEND®B`‚klog-2.3.3/flags/ai.png0000644000015700001710000000120314542412415014524 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚ1Îÿ]h¶´óï©øÆP9J+ æÅ7¹ùþøúüøùûöúÿøú1ÎÿÎøè,µø Gæ÷ø§0XûàŸaDïúþÿûþþýüþúþýÿÿýÿÿ›\–ˆeù—mlç¾¾zÅðùóÿ_¿#n^ùù)ðç¾ry÷O„¸XˆíÏ¿gŸ°2120| –^6ËR=m‘Ç/]ûÏÅÀ"#ýéó¯c¾ýjghóSãüù™‘é gÞªk ?1Îÿ¡ñ+Ÿóã ê˜ ? ªöøüúþþñ­ñ‘ ïžüþûˆÅO’¡óðýMw¾ðÿÿËü÷ïÔ•'öË X‹~;øëﯿÿJXÄËÝ+úÇkó÷?PÇw€bdÐ[ÔØjùðÃßÿýùDÿÿüý÷ûüÿóû_#yvF àÇ?|±!« €˜~þúóÿß/ˆê¿ÿÿ©þõ8ÿþÿ¿qáÑÓïÿž}g¸qúá¿@~ Ão`Ð1%ÿBÐ_ÙÿþuÃôÿï￟øhá×_Y~   @óÄyÙþ‚m€8 ä¿Aìÿ2€¸@9î? @þ#ƒP'RD~š#Ü¿@7À¿Á$@€‘YH­@{IEND®B`‚klog-2.3.3/flags/sb.png0000644000015700001710000000116014542412415014541 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚbdf>ÛÒ"UYy£ºZ­£ãÅß¿Ÿþ1€À0Br10<™žhäÂ1ÎÿžžVVnn..ÌÌõûûýýþüüÿüüþüûûüJ;Æ>2Ðÿ c„™1ÎÿÞž'44 ¢¢îèèúøøþýýÿûûþûûÿûû÷w_¥,+ÇàôÌ·t·ˆ…åãÇ‚‚Ìþþãçgúúõϯ_@³ÿbó³;⺗ëÍöû í'ɉÊ @,ÖÖ"‰I÷çÏSX³æÃŠo~ÿfcø÷£4f¥¡þÑëŸþän{ñóϯß`[1ÎÿÅÅì¾¾ûúªªï±±òûû H8ÆUF»õߺäˆÉèûþúúþúûüûüüüè¤_»v}zqÅÊÏúª÷|lŽ«*ž½ÿígïÑoWß|ùõÿ×ï¿¿mzê/È€j2~ýbKôß©­pùŸÀ¹ƒ/y[ þ 1¢hüß¿ äi‹«‚v—Uå¿fø³ð Û¾Ï.þõböïß~ýj*ÿ÷¨ €X"M$‚¥”®Þú(9íÜÛ?ÿYeE¸Jÿüýr÷?Pdü…°€b<>™áÔs {10|g  ß+à¨÷9§IEND®B`‚klog-2.3.3/flags/lt.png0000644000015700001710000000077414542412415014566 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ŽIDATxÚbü}•áüûÃðD„ $¡l bb  j&©f šÿÿÿ2üÿÇÌð—ùÿ?†ÿþÃPáÿß@ÿߟ.¯ &F ‚gŒ  ÿÿB¤êÀè×ÿ¿ˆ‘Uh.@±\ú õëÏï_@3þBŒü÷ï7Ø`¢ÿýƒ0þýbeÿuþ@±èïa(sýþèË—?ÿüù÷ç÷¿ß ô÷÷/ùë×ß_ 6˜”çã?¸€ €X~0üù÷Ȫi)Iµýi@hšÈð… €X€ÎúûÿÏŸÿ€ê€B`~‡h‘öÿß@T @,k[tÿÿþþ¨¤ hÖ¿?e`•ò/PñNù?›.2‹ÿ›?_‚ŒJÿÿõë?È0.òç÷ÿ?Y8ÿz00Ë/ “€fKJ¥þüÉ ö É$îýû—ñïß?ÿþ`` ÆÛàˆþ#ÿ¡rÄg%"wCñÒÝ™IEND®B`‚klog-2.3.3/flags/bn.png0000644000015700001710000000117714542412415014544 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚbüz“áüûÄPÆ¿? ö¿Pö0 Ãbl0 Ã0ûÿ7²ô \Q :F+@àBªèûÒkïòW+³òPZ8&ÔšÏ/€X 3ñD3€­ù÷÷Õ¿~yõëÓ'NÁ_ÿ~ÿf`ªþýÿß/FV =ÄÌÅÁaem Ñ´‘‘›‘ÃñÞ[£ßG~ñ(?``üÿïß·~ÿû÷‹‰‰÷ëó[1Îÿwyyíïïëëëbhh"ý÷÷ ­™üúúïý«ÿÿÿÿüáûëyÿþúøˆhpQQñÇþÁï?VÌÌ,Ÿ¼¢T„?-úï×O‰¢Öÿ`ÀÈÄôñÀbü|Q âÎíû•Ÿ€~ÿf™j¯œ½í$ׯßîúïƒ2Y¹¹u€˜˜˜Þ¿1ÎÿñÓuþûàøùóûçâÿñìÐ#øôu³ØÍöéúúúûûû311cee555ˆñãEvÉ †?˜ÿgøõãã¿ßßAøì>ƒwî³ß¿~Üú篊ŠÊÅ‹ˆR@9Ff‰ÿüÿóç?ÃþßLlþýVµú}ó ßÏOÿž<ûóäùŸªŽ¯@ãÛÓ XFáŸ_PdbaødÅ4Ð p”ÿa¸w‰ Àp1ÏÁÝiIEND®B`‚klog-2.3.3/flags/in.png0000644000015700001710000000076714542412415014557 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<‰IDATxÚbü¿ŸþA0ýûÃðïý!0 …rpC1´Å*¦´•ŒäÖúÁ%——öÇ>^092vž8Y•Å% Hˆ½æ@` @öS R†,Šß0òýfd—Ú@,ÿÄL9µXÄþÿÿ÷¨çÿß;¯…ÎÜ‘ûû﯑ÂmU‘§ ³ÿýù÷ÿ#‹è?©íÄøûï_&FÆÿÿ¶ü‡Ø¶lû½ŸŸ¾êkŸ»ó9ÁO h Ð( Töþã'€bb;Ÿ¬‚¾~ý©,͵kÿíÏ_þ«þ‘É?€b‚˜ BŒ`}ÿÿë) ¿úñ—¡ŠØZdô €Š::ž~|úçߟ?ÿþûç÷¿ß€äßß@ù÷ýû#Ã/³¼q9@±0üa€ÁÕ!”þû×ùçß_`00üb  òE¸E Æ@I0ª‚?ÿÿ€¨ÿ` ÿˆ‘!™¨hˆ„£?H"`” úŠT^ÈÀüëמÿ> & “ª02üäa¹ ÷>ã[ŽÇ¬ŒŸáþ€    ÿ¼õõ7ë—ߊp ÿñ¿úÆÿþ'ÈÁÞÙ𠀘€â³ï¿XÖÜËø÷_Œùï?¡?ùçÞˆùò âc ñ@s  þüeùéÜ«Ùw?ªxʬúsã•w>†+$>€î †ÿ~ÿc’äfK0\}ëvá+(à3ÈóÕƒû/#0f€! t@12”eø„—?@¢Pî?¤h±ø ¨:¯ô›ZYIEND®B`‚klog-2.3.3/flags/mx.png0000644000015700001710000000107614542412415014567 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ÐIDATxÚbdˆçf`ba€€?^öÝcb`ú÷ï$ÿüøñJQ$ä‚@•25Fw200þû÷÷×ßßB‚ÂLŒL ÿ¨îÿï߬9 ÿþÿûûȾ5o@ÍþÏðìÓ«¿ÿþ~ÿý ¤Žñ?üûÿëÞõû7³”$ЀbÙ Ô´hÈ¿?ÿÁfß»rèY kf Úß¿ÀŽûÃôç7ÐaÄÄðïÏßÿ@…ÿüýûhïÿÿožxsÿÂꉭwÎï:ëÿ¯_ÿ~ÿþ÷ë÷¿ß€6 ï_ ãÿþªêj`ûÂÄÇ%§- ­þhýŸ?`ü2€6ñd6jØwöèS!Aý]§þ: lÃÿ? ô/@50±áÐÓ ÿLÿ}y ´ÍÙʨÿï¯ßÿÁNúTÄÀ@@'1¶á÷/ þýôŒ…Ò¯_ÿAAÇ —ÿÿ5HÃïÄy„¾ýþÉÈÈ´B‚LL¬r² åŸß@O#ƒ-8€£ñÃÅm٘؀Þû¿¾|yfkËVö@€ú£TðLi)IEND®B`‚klog-2.3.3/flags/bm.png0000644000015700001710000000114314542412415014534 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<õIDATxÚb<™^º‡I¡zúµzÑK,L µ/e²e¿DÙI}X:“‰áÃ?0úF@1Îÿ3k´¢XûøØ×ÿôô»Ñí:ɧüûþûûþüüþûûÿüüÿûûƲ²ˆeοu ×µ8ïcþðñÿ÷ï,‚ßÿ0ZûòóÞ]º_¿ÿþþõï×/†ß¿ÙdeVË“4U-¶7¿ß}Ä(ÊΩ(óöÞË[…Ô~]ùÿû—ÂÊ• ÌÌÿàçχ))@WË3§°_< ò«3Š1ýúõ›š“ºÈÛ“þþúÍøû×ÿ_?kž±ÿù÷¿Mü'ÐI@ 1Îÿt´räy×ëõÿüûøÃÑÞ!H ðíûùýúúÿýýÅkJe[\þMMýüüüˆåÁÓןJüyð÷ů¿ÿø}yå×Û_¿î9íùt×ã»/÷?½¶ €˜€a”Týÿ×/ ãïO/ÿcÖ²³s°qp¸¯ú¶ €X@! 8P˜ü Q %ÿöY rꟿÿþþÆ@4üÿý‡UR¤úÏßÿ°<”ÆÀß¿ÿÉ_ ĸ•á,"ÿÀ¢öX-Ž$@€5›K´]IEND®B`‚klog-2.3.3/flags/tv.png0000644000015700001710000000103014542412415014562 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ªIDATxÚbÌd@€ ÀÈøC`ŒŒX†žÅ ÄTÞ[Rýïÿ¿ÿþþ2þÿù býùûïÏo%KA9†£s?‹ªüÿ±x%@1þÿÿ¨BÂÿ±FFÆOŸ> Dúõ÷ß'^~úüýÏ¿@ÃÿíøûÈ€ _ÿ­6N]þ*¯0ç-@1\ò¢Bôu|·ƒt¢èŸƒôüýõ÷Ï/ R Ô3áNôÁ7 ¿þІ­/l?öZd!Ã×颸ý÷ =¿þ2üúû¤áHOšÜB S ¿~ãßç­ ,üÿ¿øÏípé³IÛá‡?þ@œtÒÿù¹‚‡ÜŽÍÚ)'ȱ«t+@1þþý›ñÇÙןߗVùüåÛ/¸Óÿýÿýê‡æQ·“®ýtß[´ €þüÉÌÌ ò ŽÀ ,0”Þ¾} @ŒÞ éåiΆýo0ùçÏ_ù[Në—‚Þïgwþ^Þ÷ÿß¿¿À€ËÝu €Ý‘"‚~€É2E'†sÖ€#û?,5&ëSPåɽIEND®B`‚klog-2.3.3/flags/sj.png0000644000015700001710000000100014542412415014542 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<’IDATxÚb|ÈrÿÿsE]ú²Dç3ó?†`Aã @,@QÁÚj ùÿÿÿž)FFFá¢Âÿÿ0üùó„~ÿÿ "ÿÉß¿ïnØ@,`ƒþÿ{òH½|ÿ¨íσ@ ¿Š€ªè׿_¿þÿúÍ,+ ´ €ÀþUýÑÿ@ùÿçÈÔ_ ¥ Õ@=¿@$Óïß@W‹Ìß¿@g@œô¨óÿµþc@eŸ>#sðùþdéïÿývó¿@m@ˆü$ÿýþ ŠH ²ÎÎ9 @Œÿþ…ÿŸáÉ‚gÝq’ÿq&&¦÷ïßË=ff‘ܬ?÷î lØô줷vÖÿ~|Ìòîo¨7~ÿaQVºzú@±½ùd@¥ gýÿÿï'DÅ/ H'ˆñè?ÀÀf °†?˜$A.峌,Ó_PÀ3€ƒŸùÏê¿ÿ@ŒWaQ¨ðþ½ Þ‰·Ì® ÿÅ1$‚`$ôžZ’¥l¥¥IEND®B`‚klog-2.3.3/flags/kn.png0000644000015700001710000000113414542412415014546 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<îIDATxÚbd˜ÈÀðƒ þ10ü‘@ô D2ê0ÌãaHŒ„* F†V†j×jâÿÿ€èïÿ¿þýýûïppü —ü½oáŸ'O¿|ûç÷ïß›6m  âÿO¾>*ýûïïï¿ÿþýûûïo-‰ß!ì¿§Wý«k]˜˜Áòÿ‰¢’ìñ\€b:h2PéÙ@•™Ø~å©üÙ5åw÷ý_F–ÜÜ<>ÆÎf÷Ô™´g ù€ªÿüù r†²èï0Þß³[~_¿t¯/{³2¾‰²^Ã×÷ûÿ»ß@ÅÄôÐÑ¿ýf`ý“¥ñ‡çù¿>ªþ-Âÿ« ç·Ç†´_ÿ?þfPü €bÐh)¡?1B¿®ïwܶeÛÓ׿~ýú-!òkZÍo¡c¿þOùýÿׯÿ¿3þþ Ô@, L ! ¿YžýºrÀÕÇ/êõ;†ûVqpüž—÷›±ð×ÿ—PÕ @®5@±Ìu`8¼àÏåK@í‡m|ŽZÓZôKùæïÿ© u Ôð¨èÓ¿@?#g¦'ýùó›ƒí7 Ó߯øß¬G~3ìø 4¤l00ÀÀèõ•+Ä‹d_}†< GAA@€S- \0~IEND®B`‚klog-2.3.3/flags/io.png0000644000015700001710000000122214542412415014543 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<$IDATxÚb¼^Û»ã‡\á”g ް1ý‹¼ª×lþaÏ©ƒ700üa`øÂÀð‹AsÃõ0÷@1Îÿ[G™š—Iûäå÷àâ%$ ¨·æ åìåàú¯ ñðû&Cèæõ1ÎÿšÆÖöóõõ ùúîãùýÿá«Ì üüþüýý>äÜüàüùê÷Ù{UçˆeË;UM.–wîý~ðˆS_(÷þÙ[gIYiÞíªÿÿt ;?»ðÂÅÑ1ÎÿðBPøûþÃÈí"üùÓã 1 ïñ÷ýÌ·àûüþýþR=«<Ñ÷Á.úϺ.“€ˆIæÃwÿ¹4L•ÙÔUÿäægý#£ÈÅÃîê,›™¬£à²Ô\4ýÿÏ_Ê ™r¶[fέ F†ÎÎ>ç§Ï?ƒ\üçÿŸ?ÿþ÷L‚Ù[8)–~½QÊ·Ñþã]áüü?mÿÿûȼ߿wîüËÄSzhÛï?Áä?qî¥} ˆ èÿPKÿ€<D?èÇ/°Û€ªƒUÿùt (lˆ¤p ³CÜ ö20„ fÿ… H@5üþÃ$)É r ÇŒLÌLŒŒ’b\A¡ ‰ÿ@$0êˆñ*jDBHµ«?p‰©+Ö C IJwßOI;WIEND®B`‚klog-2.3.3/flags/re.png0000644000015700001710000000104114542412415014541 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<³IDATxÚb,žz™þýù—çÇ÷÷ïߟ?É?þ022*¹þûÂðç'à€bª ´“’ÿÿýÿ÷¦$ïÿÿÿAÜÿ@î? ÉÚÒ÷ÿÏï¿~ýÿýûmE@40ügøüí÷ß¿ _¿~ý@6Ðx =|Ïžüûõóÿ¯Ÿ Â"@K89€0KøÿƒÝtÕ&Þ8´@œ±[zàÌM"-úƒ½¨bë´—žbùóçPéß¿@ôÈ*)ýqÈm@Õ@ãÿýúÍøë×/€A0Â0øÿ£qƒ;¥ÐÒ^ 7Æö‘Lh»3ªŒü¡Ü |ÄTtÉï¿@òPä?zDýúùèã_¿™À6Ë_@®ÿó¤ˆÿA]T aƒUýð›V ÄòãÇj =þI,è$ Òß¿ÿü†@±|zâÏ?.Nf ïÏ&Hø@â‘ ˜Å%†1ý÷d@±|ûö§mÁå?~}ûñçË_Òœ’@§þòÿÝòëÇz“çÕA¢ î­{f› uDIEND®B`‚klog-2.3.3/flags/fk.png0000644000015700001710000000121014542412415014531 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚb¼_X½‚C§rÉ›ÅL~10%?±hT»çc%e<÷ Ã'†? ?~@’ 1Îÿ;3ƒµŒAöÖÔþóóû °ÚûÌÍãúýýüüýûûþþýýúüþúüÿ²‡1ÎÿÂà’ÿÔÁ¹òóö÷ÿüþQöø³ò1ðù<5ôùýù÷ùÖÑüˆe…”¯ªÇß;ÿ ‹1ËH|zöþ"ç÷·ÿýøó—'ÛžõÏ?†Î_~ÿ¹ 1ÎÿÎJ^I ¦Þ3üýþÿÇ 7M+âèÑïöúúúüýøûýºÏÓ ûõéüþúˆ…m×¶E"A‡ïÿ~ÇÎòûן—.Uæ·fý÷÷ç·ß?ÙY˜¬”ä__9ÁÌ$”j –öó ù~L~~ßþ•çÏï¿ÿþ¼|ñÙÙ?Àaúýã'ן÷Žïõòçož¿A6 пÿCàúýçï¯ßÿ~ýÿÿÈûý7/”á×Ï{¿)ÿaSÐû´ÍHüÔÎ?Ò;0úóç×o û×Ï¿«þÅÛ>Ógxôûׯ¯m=+´ €€¾ýþó_RŒhÓ?˜ëÿƒ êWŸ?.ø:åìÏç?}˜óÿÿs¨¨€b‚ª†Šþÿþ}óŸ·ŸÞ2J^ýfø÷ë×ßWÿ‡7ÿ ²j üɱåºê/ÙÛ?þ¹z13ØA‹¦žä®Ä‚¤¤“—…ÝÈPÿ+ÿßÿ¬4åùY9eÿüù@,÷%$þ§¥ý¼w Àùõ‹ó×/W0Ƚaüë_v•£/(XÿþþÃ$)Éðû7㟿@9Æß¿™ša‘d€"ç/ãq†_°ˆüƒÄøƒßÐÇÂCbÈ1/IEND®B`‚klog-2.3.3/flags/marquesas.png0000644000015700001710000000056314542412415016144 0ustar jenkinsjenkins‰PNG  IHDR vâ 9bKGDÿÿÿ ½§“ pHYs  šœtIMEâ8¾8úYIDAT(Ï’-OÃ`FO¿ÓŽ:þËÈ ¾&0þÉ$n‚‚ÄZÌ6©ÆÐdEŒ…Ñ¥k×÷í‹bެÝñ÷ä¹Ï½ššÞ(&PÎ@£1šRJQ¼Cr _w o#øcz q·™@J©²,À°v `}žcfϵҘišE®ëbÛIòÍ~û3ïÃGŒ Ã0ð<)%e)hµ<ÐLØ=CNöO§P‰ÿW¨ªJÅqL†ø¾OXŽÃêªGÞ¿¥šýÔ+±X˜†‰¾\²8>A¼ŽAÛ|×uMŽí ï˜wƒa­áu•,ã·Æ¤‹áˆy»ƒ½° ¿<~rSbIEND®B`‚klog-2.3.3/flags/hk.png0000644000015700001710000000101714542412415014540 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<¡IDATxÚb|ËÀð þÁHdô,øÌfb`  ‹§º¬ðß úû—áÏßÿÿ0üýûÿ÷oúóN>Þ´ €X˜@jÿÿ{ò¨¤(÷÷/•õn®OkÖüûÔóëÿ¯_@ÕL²²@¥Vÿï?Tõß¿L@ÀÌü?9鿺:‡°0#ÿ_¿ ¨è€bº ¤úφ?9kjþ¿ÿÿþƒÿœÌ“&q?þ5+ë×—/ç ÈA@Îjø÷ûïÿ›7ÿ;9ýß´ù?'çÿÿïÞýïÛ7 ñ `o5Äñ ·þþóqÚ4^ ˆ‘(¸8?¯[÷ûóg¨ÀN &PPuƒ„þMbãçÿ¯§â<´„•‡¢d<Ø€Ù6þ÷?°+¾|ÉXQñãáÃ_Ÿ?ó9òåñc †?¿ÿýùËô÷/P1@âáßï?Œ’’L c€¾ÿý¨YT”YPðË«W,rr ¿ý©† P1@1>d`ø…¯ÈŒ?¨qÏÆÀ`ò‹=æ­†b´IEND®B`‚klog-2.3.3/flags/bs.png0000644000015700001710000000101614542412415014541 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe< IDATxÚbdðöf¨ªb`ccøñƒþýcøóÄ’6„0€ˆ‰ €RÕóæ18:þãäü÷û÷ßÿÿÊÿþû÷È’ ¿ä¿¿ÿÿ¢MÇŽ Ȱ»wžÜ½û7$䯨Äï =¿ÿ1ü†’ÿ~ýûD@m²ì¬ ÿxˆìŠÿ?ú3wn¶Ý +ƒ¿@5@Óÿÿû fü‚1~3þ“ûøc@4üýû÷¼x1ýF†ßæz`û!êÀJÁŒß ÿØ{ƒÁË¿Ûçý~øäצ_PÕ@maì¿€~ ˆ ~ýþÅÃô'5ä·¬ä¯ÿ¿ ¦"ÛÀøï7P@lšýëׯ?<¼©A¿ìMýÿó l*’ {ÀÁöç@±€ôç·˜Øï„„Y…__ý"(d`äP°þù÷_å?ûE–cÒð[N^ÒÏ÷7/?ÿ°Bð78~ÃbÐAäw†_/ˆ…AZz¾ºÃãÇ Ÿ>A£¯¿~¡Ä1$î98 ^/xèÿ‡ÔJIEND®B`‚klog-2.3.3/flags/qa.png0000644000015700001710000000070214542412415014537 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<TIDATxÚbüùõë?(øÇð/IBèÜçß~10ü€‘¿ €ظ¸€¬ÿÿÿC„W—ÿýûûßß¿ÿéßÿüù&ÿýù]¶|-@±@Œ‡«^ÑT÷úѰ" úÔð„~I!i €bBVýïß¿ðÚFZ ¢ß`Æï_ ´¨ €XàŽƒh[\U2õ×/° P³ÁÜßA^c & ©Õ Ñ-é?¿þ UýL PèòÿÿÿýŸ_RrÆ/„ÓÁ6üþò7H@1ýƒÒñ?¡»lä/ù ¬jáo`¨5 ÌIŸÌÌÍq:Øø? ãÿÃøH%@1~|ÿ–‹‡î ÙñìepØÿ‘ ù Œ™ 'ÎÈÞ½û@yYù— ø@€k}[åT^ÒYIEND®B`‚klog-2.3.3/flags/scotland.png0000644000015700001710000000121114542412415015741 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚb|ôèCæÎï[§\bâ`ábøñ‡áÏ?†_`òýw w?ÉÖHúúý;@1Öî|Üä&ÔóíÏߦ­ÿ¾ýñGí/Hñ xþý·Û¤0E.fÆÿÿÿ»M;@̇.[ë™Éò°21º¨ <ùóïôñoý{ûáÇ›;lm$š=eX€ª 7=\—¶ €˜<² D8|¦!Ï#ÂÍb Åíl"ºæàóßßþ.)Õ³Sä*=÷ä‹g˹ßþÞ;û €X€vÿågýóýwýœú–b•R‚Ì›ËõÿÃ@áæ‡{·=ü-Îñ[˜áÇ7€b»ôÿoV¦ßÒ\'Ößóê»ô 7žÙ»èÆ/Þ_lÌ~ÿcøý €˜@60üÿóõϯûŸÔÝd·è k8]kd¤ôëú»_ŸÿÙ€9é÷»¿Þ~«NÐ0“å*úüë¯sóÙßþí«3âaaœª¸G_(±ûÜ_V`X2ñü¢œË ªgáT~âãOfF³Ü#=‡žTxδ‘ãF @1†Î¿¼,F(úëßÿ„ewþ<þü[”ó7ãÿ?ÿýþõïϣϤ¸¶§k²1gàËß @ŒÀ˜þ÷ïŸëâÇ·k0°r0Hñ0|ùŠfúRõÿ ÆP‡+õú@@€)KÓ£iµIEND®B`‚klog-2.3.3/flags/gd.png0000644000015700001710000000117514542412415014535 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚbüÏ€ÿ:^10ô20”3üûÃð¯—á_,Ã?!†þ1@@1þe`X´«:^ ¤žñÃß¿ÿ€bþuüýóŸá÷ ûïïïþ´Ýø“° €X€ _qýozÿ4”ç¯&ÛßÿÌ¿þýýÿï7H)óïÿÿÿÿûëâ_¿ÿfà‘Ú@,L ÿÿý¿óöoÛË¿Ž<¿}ùÿ ³üúÏø¤ô÷¯7?~-yó{Å›__~1üš@, —ýý[#÷§æîŸ-oÿþø;@ð·ç2&†ßŒ#~-xùëÑ÷ß¿þýúÍúû÷?€b»ý¯4ÃïîóŒ@3Ÿÿü-½‘áoäç?1Ÿ¥Ö2<üñû×ÿ_@ ¿þþúó÷Ðt€ùá÷¿?3îý¹£ ýÃÍøûšç/ÙL ¿oÄæ{ñëù/žßŒ¿ÿüû Ô@ 'ýùó{ï? œx~… þ–fýõ¿èõßQ¿~Ùpüžùò×ò׿ÿÁÿ?ˆˆ3ü‘æÿÏóÛŒ8¿€Á¥_ÿÙ~˰ýnâùå,ö»ùÍß_oþM "Ÿÿ4ŠH2±ýføÿ—á/ÈlÆÿ@60æ~ƒâñ=ç_[™¿wþþb` Ư ˆXüÏÀð€áßA†Žà˜>ÌðO™áŸÿ£ Y0BÁ/!íŠiIEND®B`‚klog-2.3.3/flags/ss.png0000644000015700001710000000045614542412415014571 0ustar jenkinsjenkins‰PNG  IHDRðv—bKGDÿÿÿ ½§“ pHYsgŸÒRtIMEß…ýU¤»IDAT(Ïcà2(ûÏÄ)þŸ,ÌÂ*nÉÀ*fÆðëé^†·—2üÿõ‰ÀÈï¾þ? Ó_†¿ÿ™Øÿþµå¾ûÜ–çö&Æÿÿ‰1€…ASê1C†Ó†ÊÕñÌ{>«ËÜ}Í/Søh-ƒåÇk `b```àæøÁÀÄô‘ñ?©Å ¼ì ’Íÿ>õ×ý󎑘þ0ü‘=ÁðWî(ÃÖ$¹€åŸÈ-†ß*;þs½c †ƒO <ÐæIEND®B`‚klog-2.3.3/flags/tr.png0000644000015700001710000000075414542412415014572 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<~IDATxÚbüÏ€ÿPÙX@šäØ„ $™›¡˜-¶‰(Ò¼Nú33ÂÈ–\€F8°UÕ@ÿÞÌ'€Àÿ?yT RíæÆðïßÿ;þúR÷ë÷ÿß¿þÿúd3ÊÊm †ÿ`ƒAª££LMAꔕÿwt€Õýék`øý¨ €˜@îªÚ¨¨ÈàäôúôÿIIÿ7løÿõëÿåËÿóð‚íZT @L 'ýø uqý´äØ1ÜéÓÿW¬ø/$ôÍšÿffP þM †ÿÿ€üôä10Äþkkƒœ¡¦öÿÒ%«=ú¿oDÄIÄÄŒ`K/þÏÇ÷¿¨ä ˆŒüÿåËÿE‹ Žù2ô@40ƒƒ hÀÿ®®ÿ¾¾ÿYYA®ÿüäNˆþ5€Bè€i`úÿŸARlÌ_†“':……øùÀƒ8 ¨ €¿¢F$ž8†€ï×;\F¿oIEND®B`‚klog-2.3.3/flags/as.png0000644000015700001710000000120714542412415014542 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚbTTüÿáüúõïdž¿Ì`@Ʋr†4†¿l 1Îÿì윜ÿÿþÿýýýýýýÿüüûûüó+Ì!Ûú ¥%ª½º1ÎÿÿÿÕÕÿüüüûúûÿûù2À:Çé =7ùÐÑÉùÌÐÙÖ׈…l6Põïß Šÿ.Z°–ä¸ÇÌÁÉe Çê”ÃÀÎmÇÜÇKçݽôH?8DÙ €XþüúÇõï³7Ë.Eök¬Œ¿9äÙsÅäþƒÁ­½Ëž_>Ê"$ÏÅ|‹áó«lÄñu§í§{ÿØŸ±ª«rº2rqÿ‡¯OÚ•ì ÅL ÿ|~}ý"#«¨° @1ÎÿÒ—!;&÷îý ìÛú¼°úÖÐÿ ;ûï¼óÁ ûî!6[åêí1Îÿü——ÊÊÿùùùû×Dº# Ùüò0/JN&õßrûëÿýúH°Â èé¿¿~±üü ÔÀzõ§î¹Ÿ:¿|5þsÈíÉ6¹y,œl\¶¦¬¡1¿Y˜ÙYþ21=   ?»ºX~þúÿóÇÿ`ôó'0AŒÿ?¿z11`?ÌÏ|MZ†ÝÁyË‹—Ôð¯` d.$¦13Ä×10H10–úÑ ã!IEND®B`‚klog-2.3.3/flags/tc.png0000644000015700001710000000116014542412415014543 0ustar jenkinsjenkins‰PNG  IHDR ù€šngAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚbÜŸ_»ƒC­sǧâO›XþÔþp‰¸`$¼ðÃ0ú…„þ£¬yóf)éŸ7n0|þüOJšO˜˃¿—ï½ùó÷ߟ?ÿ~ÿù "ÿýýýçߦîN€1Îÿ°â– Úɾùðñýõ÷÷ý?öúº4òúò ðþþàìûÿúˆe“ŒS¢ª6÷Û'_nÞeeWVxõèõ5NÎï/~ýúSg¿IXïû‡kŸK÷œˆj ¦v~L\\Ë>ŠÞa{ôŸg1‡“Šêkžï¿þ±2³±K²Éåÿùüçÿß@·51ÎÿüÌȨ!Éæþèþ üûƼÙÏ /üúùòøîà çíúüøüúÿúˆeéÁ"l~8õ‡ì¹_7|¿üçﯿŒ¿ýüø™é¯¯ÀwÅ¿~ÿ†Ø€b†Ðû¿þþÿó(òë×ï¿?ÿýõ Ìaø>å„•ëû/_Í>nö—áÃ?€bjøó( 5ù h6˜ "ÿþ½óš3c¹Ï¿¿þùÏÁr@5üúý翤О?  o RãÏ_^ qÿþcüûÿï? §ÿ#C(j\¢Ä+RLÿƒ €2%>ÂÓÕ%üIEND®B`‚klog-2.3.3/infowidget.h0000644000015700001710000000712514542412415014652 0ustar jenkinsjenkins#ifndef KLOG_INFOWIDGET_H #define KLOG_INFOWIDGET_H /*************************************************************************** infowidget.h - description ------------------- begin : ago 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the Info widget where the band, bearing, CQ & ITU zones.... are shown // #include #include #include "locator.h" #include "awards.h" #include "world.h" #include "dataproxy_sqlite.h" #include "dataproxy_sqlite.h" class InfoWidget : public QWidget { Q_OBJECT friend class tst_MainWindow; public: InfoWidget(DataProxy_SQLite *dp, QWidget *parent = 0); ~InfoWidget(); void createUI(); void clear(); void setCurrentLog(const int _log); void setColors (const QString &_newOne, const QString &_needed, const QString &_worked, const QString &_confirmed, const QString &_default); void setImperialSystem (const bool _imp); void showInfo(const int _entity); void showDistanceAndBearing(const QString &_locLocal, const QString &_loc2); void showEntityInfo(const int _enti, int _cq=-1, int _itu=-1); void setLocalLocator(const QString &_loc); //MAYBE NOT NEEDED void setDXLocator(const QString &_loc); //MAYBE NOT NEEDED int getDistance(bool shortPath=true); // Returns the distance in KM private: void clearBandLabels(); void clearInfoFromLocators(); QString getStyleColorToLabelFromBand(const QString &_b, const QString &_q); QLabel *bandLabel1, *bandLabel2, *bandLabel3, *bandLabel4; QLabel *bandLabel5, *bandLabel6, *bandLabel7, *bandLabel8; QLabel *bandLabel9, *bandLabel10, *bandLabel11, *bandLabel12; QLabel *continentLabel, *prefixLabel, *cqzLabel, *ituzLabel; QLabel *gradShortLabel, *distShortLabel; QLabel *gradLongLabel, *distLongLabel; QLabel *distShortLabelN; QLabel *distLongLabelN; Awards *awards; DataProxy_SQLite *dataProxy; Locator *locator; World *world; int currentLog; bool imperialSystem; QString dxLocator, localLocator; }; #endif // INFOWIDGET_H klog-2.3.3/logmodel.cpp0000644000015700001710000001250414542412415014645 0ustar jenkinsjenkins/*************************************************************************** logmodel.cpp - description ------------------- begin : june 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "logmodel.h" LogModel::LogModel(DataProxy_SQLite *dp, QObject *parent):QSqlRelationalTableModel(parent) { //qDebug() << Q_FUNC_INFO ; //logModel = new QSqlRelationalTableModel(this); dataProxy = dp; util = new Utilities(Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << "llamando a filterValidFields"; columns = dataProxy->filterValidFields(util->getDefaultLogFields()); setTable("log"); setEditStrategy(QSqlTableModel::OnFieldChange); //qDebug() << Q_FUNC_INFO << " - END"; } void LogModel::createlogModel(const int _i) { /* Log_Id = 0, Log_Name = 1, Log_BandId = 2, Log_ModeId = 3, Log_DateId = 4, Log_TimeId = 5 setRelation ( int column, const QSqlRelation & relation ) model->setTable("employee"); model->setRelation(2, QSqlRelation("city", "id", "name")); The setRelation() call specifies that column 2 in table employee is a foreign key that maps with field id of table city, and that the view should present the city's name field to the user. */ /* This should be coherent with the logview */ //qDebug() << Q_FUNC_INFO ; QString stringQuery = QString("lognumber='%1'").arg(_i); //QSqlQuery query(stringQuery); setFilter(stringQuery); setColumns(columns); select(); //qDebug() << Q_FUNC_INFO << " - END"; } void LogModel::setColumns(const QStringList &_columns) { //qDebug() << Q_FUNC_INFO ; //QString auxt; //foreach(auxt, _columns) //{ // //qDebug() << Q_FUNC_INFO << ": " << auxt; //} columns.clear(); //qDebug() << Q_FUNC_INFO << "llamando a filterValidFields"; columns << dataProxy->filterValidFields(_columns); QSqlQuery q; QString stringQuery = QString("SELECT * from log LIMIT 1"); QSqlRecord rec; // = q.record(); int nameCol; bool sqlOK = q.exec(stringQuery); if (!sqlOK) { emit queryError(Q_FUNC_INFO, q.lastError().databaseText(), q.lastError().nativeErrorCode(), q.lastQuery()); } q.next(); rec = q.record(); // Number of columns //qDebug() << "LogModel::createlogModel - columns: " << QString::number(rec.count()); if (_columns.contains("bandid")) { nameCol = rec.indexOf("bandid"); setRelation(nameCol, QSqlRelation("band", "id", "name")); } if (_columns.contains("band_rx")) { nameCol = rec.indexOf("band_rx"); setRelation(nameCol, QSqlRelation("band", "id", "name")); } if (_columns.contains("modeid")) { nameCol = rec.indexOf("modeid"); setRelation(nameCol, QSqlRelation("mode", "id", "submode")); } if (_columns.contains("dxcc")) { nameCol = rec.indexOf("dxcc"); setRelation(nameCol, QSqlRelation("entity", "dxcc", "name")); } nameCol = rec.indexOf("id"); setSort(nameCol, Qt::AscendingOrder); QString aux; foreach(aux, columns) { nameCol = rec.indexOf(aux); setHeaderData(nameCol, Qt::Horizontal, util->getLogColumnName(aux)); //qDebug() << Q_FUNC_INFO << ": - " << aux; } //qDebug() << Q_FUNC_INFO << " - END"; } /* void LogModel::showColumn(const QString &_columnName) { QString stringQuery; stringQuery = QString("SELECT * FROM log LIMIT 1"); QSqlQuery query; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } QSqlRecord rec; rec = query.record(); // Number of columns int nameCol = rec.indexOf(_columnName); setHeaderData(nameCol, Qt::Horizontal, _columnName); } */ klog-2.3.3/dxcluster.cpp0000644000015700001710000010137114542412415015061 0ustar jenkinsjenkins/*************************************************************************** dxcluster.cpp - description ------------------- begin : oct 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include "dxcluster.h" /* DXClusterWidget::DXClusterWidget(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "DXClusterWidget::DXClusterWidget"; dataProxy = dp; constrid = 1; awards = new Awards(dataProxy, Q_FUNC_INFO); util = new Utilities(Q_FUNC_INFO); saveSpotsFile = new QFile(); //initClass(); //qDebug() << "DXClusterWidget::DXClusterWidget - END"; } */ DXClusterWidget::DXClusterWidget(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) //DXClusterWidget::DXClusterWidget(DataProxy_SQLite *dp, const QString &clusterToConnect, const int portToConnect, QWidget *parent) // : QWidget(parent) { //qDebug() << "DXClusterWidget::DXClusterWidget2" << clusterToConnect << QString::number(portToConnect); saveSpotsFile = new QFile(); dataProxy = dp; util = new Utilities(Q_FUNC_INFO); util->setLongPrefixes(dataProxy->getLongPrefixes()); util->setSpecialCalls(dataProxy->getSpecialCallsigns()); world = new World(dataProxy, Q_FUNC_INFO); awards = new Awards(dataProxy, Q_FUNC_INFO); tcpSocket = new QTcpSocket(this); dxClusterListWidget = new QListWidget(); inputCommand = new QLineEdit; sendButton = new QPushButton; clearButton = new QPushButton; inputCommand->setDisabled(true); inputCommand->setToolTip(tr("Click on Connect to connect to the DX-Cluster server")); dxClusterListWidget->setMouseTracking(true); sendButton->setText(tr("Connect")); clearButton->setText(tr("Clear")); QHBoxLayout *bottonLayout = new QHBoxLayout; bottonLayout->addWidget(inputCommand); bottonLayout->addWidget(sendButton); bottonLayout->addWidget(clearButton); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(dxClusterListWidget); layout->addLayout(bottonLayout); setLayout(layout); dxClusterListWidget->setContextMenuPolicy(Qt::CustomContextMenu); connect(sendButton , SIGNAL(clicked()), this, SLOT(slotClusterSendToServer()) ); connect(inputCommand, SIGNAL(textChanged(QString)), this, SLOT(slotClusterInputTextChanged()) ); //connect(searchResultsTreeWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, SLOT(slotDoubleClickSearch(QTreeWidgetItem *, int))); connect(dxClusterListWidget, SIGNAL(itemDoubleClicked ( QListWidgetItem *)), this, SLOT(slotClusterDXClusterWidgetItemDoubleClicked( QListWidgetItem * )) ); connect(dxClusterListWidget, SIGNAL(itemEntered ( QListWidgetItem *)), this, SLOT(slotClusterDXClusterWidgetItemEntered( QListWidgetItem * )) ); connect(dxClusterListWidget, SIGNAL(itemSelectionChanged()), this, SLOT(slotClusterDXClusterWidgetItemSelected() ) ); connect(dxClusterListWidget, SIGNAL(customContextMenuRequested( const QPoint& ) ), this, SLOT(slotRighButton( const QPoint& ) ) ); //TESTADDSPOT(); //qDebug() << "DXClusterWidget::DXClusterWidget2 - END" ; } DXClusterWidget::~DXClusterWidget() { delete(dataProxy); delete(awards); delete(world); delete(util); delete(saveSpotsFile); } void DXClusterWidget::createActions() { checkQRZCOMFromLogAct = new QAction(tr("Check in QRZ.com"), this); //checkQRZCOMFromLogAct->setShortcut(Qt::CTRL + Qt::Key_Q); checkQRZCOMFromLogAct->setStatusTip(tr("Check this callsign in QRZ.com")); connect(checkQRZCOMFromLogAct, SIGNAL(triggered()), this, SLOT( slotCheckQRZCom() )); } void DXClusterWidget::init() { dxSpotColor.setNamedColor("slategrey"); dxClusterConnected = false; dxClusterAlreadyConnected = false; showDxMarathon = false; showhf = true; showvhf = true; showwarc = true; showworked = true; showconfirmed = true; showann = true; showwwv = true; showwcy = true; saveSpots = false; myQrz = QString(); currentLog = 0; server = "dxfun.com"; port = quint16(8000); saveSpotsFile->setFileName(util->getSaveSpotsLogFile()); dxClusterSpotItem * item = new dxClusterSpotItem(dxClusterListWidget, tr("Click on connect to connect to the DX-Cluster"), awards->getDefaultColor()); Q_UNUSED(item); createActions (); //TODO: Check how to add an item in a different way } void DXClusterWidget::setMyQRZ(const QString &_qrz) { if (_qrz.length()>2) { myQrz = _qrz; } } void DXClusterWidget::addData() { //qDebug() << "DXClusterWidget::addData "; /* QTreeWidgetItem *item = new QTreeWidgetItem(searchResultsTreeWidget); i = world->getQRZARRLId(_call); aux = world->getEntityName(i) + " - CQ: " + QString::number(world->getEntityCqz(i)); item->setToolTip(0, aux); item->setToolTip(1, aux); item->setToolTip(2, aux); item->setToolTip(3, aux); item->setToolTip(4, aux); item->setToolTip(5, aux); item->setToolTip(6, aux); */ dxClusterSpotItem * item = new dxClusterSpotItem(dxClusterListWidget, tr("Click on connect to connect to the DX-Cluster"), awards->getDefaultColor()); Q_UNUSED(item); } void DXClusterWidget::slotClusterDXClusterWidgetItemDoubleClicked( QListWidgetItem * item ) { //qDebug() << "DXClusterWidget::slotClusterDXClusterWidgetItemDoubleClicked: " << item->text(); QStringList ql; ql.clear(); if (item) { ql = readItem(item); //qDebug() << "DXClusterWidget::slotClusterDXClusterWidgetItemDoubleClicked: Length: " << QString::number(ql.length()) ; if (ql.length()==2) { ql << "double"; //qDebug() << "DXClusterWidget::slotClusterDXClusterWidgetItemDoubleClicked: EMMITED" ; emit dxspotclicked(ql); } else { //qDebug() << "DXClusterWidget::slotClusterDXClusterWidgetItemDoubleClicked: NOT EMMITED-1" ; } } else { //qDebug() << "DXClusterWidget::slotClusterDXClusterWidgetItemDoubleClicked: NOT EMMITED-2 (no item)" ; } } void DXClusterWidget::connectToDXCluster() { //qDebug() << "DXClusterWidget::connectToDXCluster"; if (dxClusterConnected) { //qDebug() << "DXClusterWidget::connectToDXCluster: - Already connected!!"; return; // If we are connected we don't want to start another connection } connect(tcpSocket, SIGNAL(connected()), SLOT(slotClusterSocketConnected()) ); connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(slotClusterDataArrived() )); connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(slotClusterDisplayError(QAbstractSocket::SocketError))); connect(tcpSocket, SIGNAL(disconnected()), SLOT(slotClusterSocketConnectionClosed()) ); connect(inputCommand, SIGNAL(returnPressed()), this, SLOT(slotClusterSendToServer()) ); connect(clearButton, SIGNAL(clicked()), this, SLOT(slotClusterClearLineInput()) ); //openFile(); // This functions opens the file to save the DX-Cluster activity. The file will be closed when the DX is disconnected. tcpSocket->connectToHost( server, port ); dxClusterListWidget->setSortingEnabled (false); //dxClusterSpotItem * item = new dxClusterSpotItem(dxClusterListWidget, tr("Trying to connect to the server") + "\n", awards->getDefaultColor()); dxClusterListWidget->addItem (new dxClusterSpotItem(dxClusterListWidget, tr("Trying to connect to the server") + "\n", awards->getDefaultColor())); } void DXClusterWidget::slotClusterDisplayError(QAbstractSocket::SocketError socketError) { //qDebug() << "DXClusterWidget:displayError:"; switch (socketError) { case QAbstractSocket::RemoteHostClosedError: break; case QAbstractSocket::HostNotFoundError: QMessageBox::warning(this, tr("KLog DXCluster"), tr("The host was not found. Please check:") + "\n\n" + tr ("- your network connection;\n" "- the host name and port settings.")); break; case QAbstractSocket::ConnectionRefusedError: QMessageBox::warning(this, tr("KLog DXCluster"), tr("The connection was refused by the peer. " "Make sure the DXCluster server is running, " "and check that the host name and port " "settings are correct.")); break; default: QMessageBox::warning(this, tr("KLog DXCluster"), tr("The following error occurred: %1.") .arg(tcpSocket->errorString())); } } bool DXClusterWidget::checkIfNeedsToBePrinted(const QString &_DXEntity, int const _band, const int _mode) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: " << _DXEntity << "/" << dataProxy->getNameFromBandId(_band) << QString::number(_mode)<< QT_ENDL; QStringList qs; qs.clear(); qs << _DXEntity << QString::number(_band) << QString::number(_mode) << QString::number(currentLog); //bool isConfirmed = false; bool status = awards->isThisSpotConfirmed (qs); //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: Status: " << _DXEntity << "/" << QString::number(status); if (!showconfirmed) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is confirmed? ("<< QString::number(status)<< ")"; if (status) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: It is confirmed: DON'T' print: " << _DXEntity <<"/" << dataProxy->getNameFromBandId(_band); return false; } } if (!showhf) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is HF?"; if (dataProxy->isHF(_band)) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: Not showing HF but... is it WARC?"; if ( (showwarc) && dataProxy->isWARC(_band) ) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: Not showing HF but... is WARC, print!"; return true; } //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is HF: DON'T print: "<< _DXEntity << "/" << dataProxy->getNameFromBandId(_band) << QString::number(_mode)<< QT_ENDL; return false; } else { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is NOT HF"; } } if (!showwarc) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is WARC?"; if (dataProxy->isWARC(_band)) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is WARC, DON'T print: "<< _DXEntity << "/" << dataProxy->getNameFromBandId(_band) << QString::number(_mode)<< QT_ENDL; return false; } else { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is NOT WARC"; } } if (!showvhf) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is VHF?"; if (dataProxy->isVHF(_band)) { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is VHF, DON'T print: "<< _DXEntity << "/" << dataProxy->getNameFromBandId(_band) << QString::number(_mode)<< QT_ENDL; return false; } else { //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: is NOT VHF "; } } //qDebug() << "DXClusterWidget::checkIfNeedsToBePrinted: returns TRUE and will be printed: " << _DXEntity << "/" << dataProxy->getNameFromBandId(_band) << QString::number(_mode)<< QT_ENDL; return true; } void DXClusterWidget::setCurrentLog(const int _log) { if (dataProxy->doesThisLogExist(_log)) { currentLog = _log; } else { currentLog = -1; } } void DXClusterWidget::slotClusterDataArrived() { //qDebug() << "DXClusterWidget::slotClusterDataArrived"; QStringList qs; QString dxClusterString; QString dxCall; QString dxFrequency; QString spotBand; spotBand = "-1"; //bool isADXSpot = false; int dxEntity = -1; while ( tcpSocket->canReadLine() ) { dxClusterString = tcpSocket->readLine(); dxClusterString = dxClusterString.trimmed(); // Remove BELL-string if exists dxClusterString = dxClusterString.remove("\a"); saveSpot(dxClusterString); QStringList tokens = dxClusterString.split(" ", QT_SKIP); if (tokens.size()<2){ return; } // It is a "DX de SP0TTER FREC DXCALL" //0 = DX, 1 = de, 2 = spotter, 3 = Freq, 4 = dxcall, 5 = comment //qDebug() << "DXClusterWidget::slotClusterDataArrived: " << "DXCLUSTER->" << dxClusterString << "\nTOKENS: " << tokens; if ((tokens[0] == "DX") && (tokens[1] == "de")) { //qDebug() << "******************** DXClusterWidget::slotClusterDataArrived: DX DE"; //isADXSpot = true; QString spotter = tokens[2]; spotter.truncate(spotter.size() - 1); dxFrequency = tokens[3]; // Convert KHz to MHz... //dxFrequency = QString::number(abs (dxFrequency.toFloat())/1000); dxFrequency = QString::number( (dxFrequency.toDouble())/1000); dxCall = tokens[4]; dxEntity = world->getQRZARRLId(dxCall); // spotBand = QString::number(dataProxy->getBandIdFromFreq( dxFrequency.toDouble() ) ); qs.clear(); //spotBand = QString::number(world->getBandIdFromFreq( dxFrequency ) ); qs << QString::number(dxEntity) << spotBand << "-1" << QString::number(currentLog) ; //qDebug() << "DXClusterWidget::slotClusterDataArrived: Calling-2: " << QString::number(dxEntity); dxSpotColor = awards->getQRZDXStatusColor(qs); if (showDxMarathon) { if (awards->isDXMarathonNeed(dxEntity, world->getQRZCqz(dxCall), QDateTime::currentDateTime().date().year(), currentLog)) { dxClusterString = dxClusterString + " ### Needed for DXMarathon - " + QString::number(QDateTime::currentDateTime().date().year()) + " ###"; } } //qDebug() << "DX de ->" << "Spotter: " << spotter << "Freq: "<< dxFrequency << "DX: " << dxCall; } else if ((tokens[0] == "To") && (tokens[1] == "ALL")) { //qDebug() << "DXClusterWidget::slotClusterDataArrived: TO ALL"; dxSpotColor = awards->getDefaultColor(); } //else if ( (dxClusterString.length()>=5) && (world->checkQRZValidFormat(tokens[1])) && (tokens[0]!="login:")) else if ( (dxClusterString.length()>=5) && (util->isValidCall(tokens[1])) && (tokens[0]!="login:")) { // Freq / DXCall / Date // time //_qs << QRZ << Freq in MHz << lognumber; //qDebug() << "DXClusterWidget::slotClusterDataArrived: LENGTH >= 5"; //qDebug() << "DXClusterWidget::slotClusterDataArrived: token0=" << tokens[0] << " / token1=" << tokens[1]; //isADXSpot = true; dxCall = tokens[1]; dxFrequency = tokens[0]; dxFrequency = QString::number( (dxFrequency.toDouble())/1000); qs.clear(); spotBand = QString::number(dataProxy->getBandIdFromFreq( dxFrequency.toDouble() ) ); dxEntity = world->getQRZARRLId(dxCall); //qDebug() << "DXClusterWidget::slotClusterDataArrived: Calling-1: " << QString::number(dxEntity); qs << QString::number(dxEntity) << spotBand << "-1" << QString::number(currentLog) ; dxSpotColor = awards->getQRZDXStatusColor(qs); if (showDxMarathon) { if (awards->isDXMarathonNeed(dxEntity, world->getQRZCqz(dxCall), QDateTime::currentDateTime().date().year(), currentLog)) { dxClusterString = dxClusterString + " ### Needed for DXMarathon - " + QString::number(QDateTime::currentDateTime().date().year()) + " ###"; } } } else { //qDebug() << "DXClusterWidget::slotClusterDataArrived: DEFAULT"; dxSpotColor = awards->getDefaultColor(); } // qs.clear(); //spotBand = QString::number(world->getBandIdFromFreq( dxFrequency ) ); //qs << dxCall << spotBand << "0"; //dxSpotColor = awards->getQRZDXStatusColor(qs); //qDebug() << "DXClusterWidget::slotClusterDataArrived: Call/dxSpotColor: " << dxCall <<"/"<< dxSpotColor.name(); //dxClusterSpotItem * item = new dxClusterSpotItem(dxClusterListWidget, dxClusterString, dxSpotColor); //TODO: Change the "-1" by the mode if (!checkIfNeedsToBePrinted(QString::number(dxEntity), spotBand.toInt(), -1)) { //qDebug() << "DXClusterWidget::slotClusterDataArrived - Not to be printed!: " << dxCall; return; } // QString flagSt; // QString aux; QListWidgetItem *item = new QListWidgetItem(); item->setForeground(QBrush(dxSpotColor)); item->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont)); item->setText(dxClusterString); /* if (dxEntity>0) { flagSt.clear(); aux = dataProxy->getISOName(dxEntity); if (aux.length()>1) { flagSt = ":/" + aux + ".png"; } else { flagSt.clear(); } flagSt = ":/flags/" + dataProxy->getISOName(dxEntity) + ".png"; QIcon flagIcon(flagSt); item->setIcon(flagIcon); } */ dxClusterListWidget->insertItem(0,item); if (util->isValidCall (dxCall)) { //void dxspotArrived(const QString &_call, const QString &_text, const double _freq); QString locator = world->getLocator (dxEntity); emit dxspotArrived(dxCall, locator, dxFrequency.toDouble()); } //dxClusterListWidget->insertItem(0,item); //QListWidgetItem *item = new QListWidgetItem(); //item->setForeground(QBrush(awards->getQRZDXStatusColor(qs))); //item->setText(dxClusterString); //dxClusterListWidget->insertItem(0,item); } //qDebug() << "--------------------- DXClusterWidget::slotClusterDataArrived: " << dxClusterString; //qDebug() << "DXClusterWidget::slotClusterDataArrived: " << dxClusterString; } void DXClusterWidget::slotClusterSocketConnected() { //qDebug() << "DXClusterWidget::slotClusterSocketConnected"; QListWidgetItem *item = new QListWidgetItem(); item->setForeground(QBrush(awards->getDefaultColor())); item->setText(tr("Connected to server")); dxClusterListWidget->insertItem(0,item); // dxClusterSpotItem * item = new dxClusterSpotItem(dxclusterListWidget, i18n("Connected to server"), awards->getDefaultColor()); dxClusterConnected = true; inputCommand->setFocus(Qt::OtherFocusReason); if (( dxClusterConnected ) && (!dxClusterAlreadyConnected) ){ bool ok; QString callsignText; if (myQrz.length()>2) { callsignText = QInputDialog::getText(this, tr("KLog message"), tr("Enter your callsign to connect to the cluster:"), QLineEdit::Normal, myQrz, &ok); } else { callsignText = QInputDialog::getText(this, tr("KLog message"), tr("Enter your callsign to connect to the cluster:"), QLineEdit::Normal, "", &ok); } //QString callsignText = QInputDialog::getText(this, tr("KLog message"), tr("Enter your callsign to connect to the cluster:"), QLineEdit::Normal, "", &ok); QString passwordText = QInputDialog::getText(this, tr("KLog message"), tr("Enter your password to connect to the cluster:\n(Just hit enter for no password)"), QLineEdit::Normal, "", &ok); QTextStream os(tcpSocket); if ( callsignText.length() > 2 && ok ) { os << callsignText << "\n"; //TODO: Check the DXCluster answer and enter the password if needed. sendButton->setText(tr("Disconnect")); clearButton->setText(tr("Clear")); dxClusterAlreadyConnected = true; } else { os << tr("Not logged on, you may need to enter your callsign again.") << "\n"; dxClusterAlreadyConnected = false; } inputCommand->setEnabled(true); inputCommand->setToolTip(tr("Enter here the commands to be sent to the DX-Cluster server.")); } } void DXClusterWidget::slotClusterSocketConnectionClosed() { //qDebug() << "DXClusterWidget::slotClusterSocketConnectionClosed"; QListWidgetItem *item = new QListWidgetItem(); item->setForeground(QBrush(awards->getDefaultColor())); item->setText(tr("Connection closed by the server")); dxClusterListWidget->insertItem(0,item); dxClusterConnected = false; dxClusterAlreadyConnected = false; sendButton->setText(tr("Connect")); inputCommand->setDisabled(true); inputCommand->setToolTip(tr("Click on Connect to connect to the DX-Cluster server.")); //connect(inputCommand, SIGNAL(returnPressed()), this, SLOT(slotClusterSendToServer()) ); disconnect (inputCommand, SIGNAL(returnPressed()), this, SLOT(slotClusterSendToServer()) ); } void DXClusterWidget::slotClusterSendToServer() { //qDebug() << "DXClusterWidget::slotClusterSendToServer()"; if (!dxClusterConnected) { connectToDXCluster(); return; // If we try to connect... } if (( inputCommand ->text().length() < 1 ) && ( sendButton->text() == tr("Disconnect") ) ) { //qDebug() << "DXClusterWidget::slotClusterSendToServer() - Disconnecting"; QTextStream os(tcpSocket); os << "bye\n"; return; } else if ( inputCommand ->text().length() < 1 ) { //qDebug() << "DXClusterWidget::slotClusterSendToServer() - Empty"; return; } // write to the server QTextStream os(tcpSocket); os << inputCommand ->text() << "\n"; inputCommand ->clear(); } void DXClusterWidget::slotClusterClearLineInput() { //qDebug() << "DXClusterWidget::slotClusterClearLineInput"; inputCommand->clear(); } void DXClusterWidget::slotClusterInputTextChanged() { //qDebug() << "DXClusterWidget::slotClusterInputTextChanged"; if ( ((inputCommand->text()).length()) <= 0 ) { sendButton->setText(tr("Disconnect")); clearButton->setText(tr("Clear")); } else if (dxClusterConnected) { sendButton->setText(tr("Send")); clearButton->setText(tr("Clear")); } } void DXClusterWidget::setColors (const QString &_newOne, const QString &_needed, const QString &_worked, const QString &_confirmed, const QString &_default) { //qDebug() << "DXClusterWidget::setColors: " << _newOne << "/" << _needed << "/" << _worked << "/" << _confirmed << "/" << _default; // Just to pass the colors to the awards class awards->setColors(_newOne, _needed, _worked, _confirmed, _default); } void DXClusterWidget::setDXClusterSpotConfig(bool _showhf, bool _showvhf, bool _showwarc, bool _showworked, bool _showconfirmed, bool _showann, bool _showwwv, bool _showwcy ) { //qDebug() << "DXClusterWidget::setDXClusterSpotConfig "; showhf = _showhf; showvhf = _showvhf; showwarc = _showwarc; showworked = _showworked; showconfirmed = _showconfirmed; showann = _showann; showwwv = _showwwv; showwcy = _showwcy; } void DXClusterWidget::slotClusterDXClusterWidgetItemSelected() { //qDebug() << "DXClusterWidget::slotClusterDXClusterWidgetItemSelected "; QListWidgetItem * item = dxClusterListWidget->currentItem(); QStringList ql; ql.clear(); ql = readItem(item); if (ql.length()==2) { ql << "selected"; emit dxspotclicked(ql); } } void DXClusterWidget::slotClusterDXClusterWidgetItemEntered( QListWidgetItem * item ) { //qDebug() << "DXClusterWidget::slotClusterDXClusterWidgetItemEntered"; /* This code comes from slotClusterDXClusterWidgetItemDoubleClicked */ QString tip; tip.clear(); QStringList ql; ql.clear(); if (item) { ql = readItem(item); if (ql.length()==2) { tip = world->getQRZEntityName(ql.at(0)); item->setToolTip(tip); } } } bool DXClusterWidget::isConnected() { return dxClusterConnected; } QStringList DXClusterWidget::readItem(QListWidgetItem * item) { //qDebug() << "DXClusterWidget::readItem"; // Returns: fields << dxCallsign << dxFreq; QStringList fields; QString dxClusterString; //int currentEntity; QString dxCallsign, dxFreq; bool FirstFrecOK; if (item) { fields.clear(); dxClusterString = ((item->data(0)).toString()).simplified(); fields << dxClusterString.split(" "); (fields.at(0)).toFloat(&FirstFrecOK); // Just to see if the first string is a frecuency if ( (fields.at(0) == "DX" ) && (fields.at(1) == "de" ) ) { // DX de EA0XXX: 21200.1 EA0K The comment 1550 if ( world->getQRZARRLId(fields.at(4))> 0 ) { //qDebug() << "DXClusterWidget::slotClusterDXClusterWidgetItemDoubleClicked: ARRLid: " << QString::number(world->getQRZARRLId(fields.at(4))) ; dxCallsign = (fields.at(4)).toUpper(); (fields.at(3)).toFloat(&FirstFrecOK); if (FirstFrecOK) { // The frecuency is valid dxFreq = fields.at(3); fields.clear(); //TODO: Change FREQ into bandId fields << dxCallsign << dxFreq; return fields; } else { // the frecuency is not a number! dxCallsign.clear(); dxFreq.clear(); fields.clear(); } } else { // The callsign is not from a valid country // TODO: if it is from a new entity/prefix it would not work. //qDebug() << "DXClusterWidget::slotClusterDXClusterWidgetItemDoubleClicked: Entity not valid" ; dxCallsign.clear(); dxFreq.clear(); fields.clear(); } } //else if (( isAFrecuency(fields.at(0) ) ) && ( isACall(fields.at(1)) ) ) else if ( (((fields.at(0)).toDouble()) > 0.0 )&& ( world->getQRZARRLId(fields.at(1))> 0 ) ) { // 14205.0 EA0K 5-Mar-2012 1500Z dxCallsign = (fields.at(1)).toUpper(); dxFreq = fields.at(0); fields.clear(); fields << dxCallsign << dxFreq; return fields; } else { dxCallsign.clear(); dxFreq.clear(); fields.clear(); } } else { // No Item } return fields; } void DXClusterWidget::setDXClusterServer(const QString &clusterToConnect, const int portToConnect) { server = clusterToConnect; port = quint16(portToConnect); if ((server.length()< 3) || (port <= 0)) { server = "dxfun.com"; port = 8000; } } void DXClusterWidget::setDXMarathon (const bool _enable) { showDxMarathon = _enable; } void DXClusterWidget::setSaveSpots (const bool _enable) { saveSpots = _enable; } bool DXClusterWidget::openFile() { if (saveSpotsFile->isOpen()) { return true; } if (!saveSpotsFile->open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) /* Flawfinder: ignore */ { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); QString aux = tr("It was not possible to open the file to save the DX-Spots for writing. DX-Cluster activity will not be saved!"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); return false; } else { return true; } } void DXClusterWidget::slotRighButton(const QPoint& pos) { //qDebug() << Q_FUNC_INFO; Q_UNUSED(pos); //int row = (dxClusterListWidget->indexAt(pos)).row(); //qDebug() << Q_FUNC_INFO << " row: " << QString::number(row); QListWidgetItem * item = dxClusterListWidget->currentItem(); QStringList ql; ql.clear(); ql = readItem(item); //qstringlist << dxCallsign << dxFreq; if (ql.length()==2) { rightButtonFromLogMenu(ql); } } void DXClusterWidget::rightButtonFromLogMenu(const QStringList _ql) { // This function creates the context menu checkQRZCOMFromLogAct->setData (_ql.at(0)); QMenu menu(this); menu.addAction(checkQRZCOMFromLogAct); menu.exec(QCursor::pos()); } void DXClusterWidget::slotCheckQRZCom() { QString _c = checkQRZCOMFromLogAct->data ().toString (); util->openQrzcom (_c); } /* void DXClusterWidget::rightButtonFromLogMenu(const int trow) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(trow); int _qsoID = ((logModel->index(trow, 0)).data(0)).toInt(); } */ void DXClusterWidget::saveSpot(const QString &_spot) { //qDebug() << "DXClusterWidget::saveSpot: " << _spot ; if (!saveSpots) { //qDebug() << "DXClusterWidget::saveSpot: Not saving"; return; } else { if (openFile()) { //qDebug() << "DXClusterWidget::saveSpot: File Open"; QTextStream out(saveSpotsFile); out << util->getDateTimeSQLiteStringFromDateTime(QDateTime::currentDateTime()) << " - " << _spot ; saveSpotsFile->close(); } else { { //qDebug() << "DXClusterWidget::saveSpot: File NOT Open"; } } } } void DXClusterWidget::loadSettings() { //qDebug() << Q_FUNC_INFO << " - Start"; QSettings settings(util->getCfgFile (), QSettings::IniFormat); QString aux = settings.value("DXClusterServerToUse").toString (); if (aux.contains(':')) { setDXClusterServer((aux.split(':', QT_SKIP)).at(0), ((aux.split(':', QT_SKIP)).at(1)).toInt()); } //qDebug() << Q_FUNC_INFO << " - END"; } /* void DXClusterWidget::TESTADDSPOT() { //qDebug() << "DXClusterWidget::TESTADDSPOT " ; ; // Just a test spot QListWidgetItem *item = new QListWidgetItem(); item->setForeground(QBrush(dxSpotColor)); item->setText("DX de SP0TTER 14.000 DX1CALL"); dxClusterListWidget->insertItem(0,item); } */ /*************************************************************************** ** This is an auxiliary class intended to provide color to the DX-Cluster ** ** spots. ** ** It may be moved to a self .h & .cpp archives ** ****************************************************************************/ dxClusterSpotItem::dxClusterSpotItem( QListWidget *parent, const QString& spot, const QColor& color ) : QListWidgetItem( parent ){ //qDebug() << "dxClusterSpotItem::dxClusterSpotItem - Constructor"; spotColor = color; setText(spot); // Experimenting with fonts for the cluster QFont f("Helvetica"); f.setFixedPitch(true); setFont(f); } dxClusterSpotItem::~dxClusterSpotItem() { //qDebug() << "dxClusterSpotItem::dxClusterSpotItem - Destructor"; } klog-2.3.3/elogqrzlog.cpp0000644000015700001710000006647414542412415015247 0ustar jenkinsjenkins/*************************************************************************** elogqrzlog.cpp - description ------------------- begin : nov 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "elogqrzlog.h" #include #include #include #include //#include eLogQrzLog::eLogQrzLog(DataProxy_SQLite *dp, const QString &_parentFunction, const QString &_klogVersion) { Q_UNUSED(_parentFunction); #ifdef QT_DEBUG //qDebug() << Q_FUNC_INFO << ": " << _parentFunction; #endif klogVersion = _klogVersion; dataProxy = dp; errorWhileSendingLog = false; sendingQSO = false; lastQSO = false; subscriptionOK = true; qsos.clear(); sessionkey = QString(); logbookkey = QString(); onlineMessage = new OnlineMessageWidget; currentQSO = -1; manager = new QNetworkAccessManager(this); managerLog = new QNetworkAccessManager(this); connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(slotManagerFinished(QNetworkReply*))); connect(managerLog, SIGNAL(finished(QNetworkReply*)), this, SLOT(slotManagerLogFinished(QNetworkReply*))); uploadingFile = false; logged = false; util = new Utilities(Q_FUNC_INFO); util->setLongPrefixes(dataProxy->getLongPrefixes()); util->setSpecialCalls(dataProxy->getSpecialCallsigns()); // serviceUrl = QUrl("https://xmldata.qrz.com/xml/current/"); //serviceUrl = QUrl("https://xmldata.qrz.com/xml/1.31/ "); //qDebug()<< "eLogQrzLog::eLogQrzLog - END" ; } eLogQrzLog::~eLogQrzLog() { delete(util); showDebugLog (Q_FUNC_INFO, "END"); } void eLogQrzLog::showDebugLog(const QString &_func, const QString &_log) { Q_UNUSED(_func); Q_UNUSED(_log); #ifdef QT_DEBUG //qDebug() << _func << ": " << _log; #else #endif } void eLogQrzLog::setLogBookKey(const QString &_key) { //qDebug()<< "eLogQrzLog::setLogBookKey: " << _key ; showDebugLog (Q_FUNC_INFO, "Start: key: " + _key); if (_key.length()>0) { logbookkey = _key; } showDebugLog (Q_FUNC_INFO, "END"); } void eLogQrzLog::parseNetworkError(QNetworkReply::NetworkError _error) { showDebugLog (Q_FUNC_INFO, "Start: " + QString::number(_error)); QString text; switch (_error) { case QNetworkReply::NoError: break; case QNetworkReply::HostNotFoundError: text = "QRZ.com: " + tr("Host not found!"); break; case QNetworkReply::TimeoutError: text = "QRZ.com: " + tr("Timeout error!"); break; default: text = "QRZ.com: " + tr("Undefined error number (#%1)").arg(_error); } //return text; QMessageBox::warning(nullptr, tr("KLog - QRZ.com"), tr("We have received the following error from QRZ.com (%1)").arg(result) + "\n" + text, QMessageBox::Ok); showDebugLog (Q_FUNC_INFO, "END"); } void eLogQrzLog::slotManagerLogFinished(QNetworkReply *data) { //qDebug()<< "eLogQrzLog::slotLogManagerFinished" ; showDebugLog (Q_FUNC_INFO, "Start"); sendingQSO = false; result = data->error(); //qDebug()<< "eLogQrzLog::slotManagerLogFinished - Result = " << QString::number(result); const QByteArray sdata = data->readAll(); //qDebug() << "eLogQrzLog::slotManagerLogFinished: Received: " << sdata; QString text = QString(); //qDebug() << "eLogQrzLog::slotManagerLogFinished - 00010"; if (result == QNetworkReply::NoError) { QString dataReply(sdata); //parseAppAnswer(1, dataReply); parseAppAnswer(dataReply); showDebugLog (Q_FUNC_INFO, "No error"); //qDebug()<< "eLogQrzLog::slotManageLogFinished - NO ERROR"; } else { parseNetworkError(result); //emit disableQRZAction(true); } if (lastQSO) { lastQSO = false; sendSignal(result, qsos); } //qDebug()<< "eLogQrzLog::slotManagerLogFinished - Result = " << QString::number(result); //qDebug()<< "eLogQrzLog::slotManagerLogFinished - Result Text = " << text; showDebugLog (Q_FUNC_INFO, "Text: " + text); emit showMessage(text); showDebugLog (Q_FUNC_INFO, "END"); } void eLogQrzLog::parseXMLAnswer(QXmlStreamReader &xml) { //qDebug() << Q_FUNC_INFO << xml.text(); showDebugLog (Q_FUNC_INFO, "Start: " + xml.text()); QString tdata = QString(); while (!xml.atEnd()) { tdata.clear(); QXmlStreamReader::TokenType t = xml.readNext(); if (t == QXmlStreamReader::StartDocument) { //qDebug() << Q_FUNC_INFO << " - quick read version: " << xml.documentVersion().toString(); //qDebug() << Q_FUNC_INFO << " - quick read encoding: " << xml.documentEncoding().toString(); } if (t == QXmlStreamReader::StartElement) { QString name = xml.name().toString(); //qDebug() << Q_FUNC_INFO << " - quick read name: " << name; if (name == "QRZDatabase" || name == "Session" || name == "Callsign") { //qDebug() << Q_FUNC_INFO << " - No data: " << name; } else if (name == "Key") { tdata = xml.readElementText(); //qDebug() << Q_FUNC_INFO << " - API-Key: " << tdata; if (tdata.length()>0) { sessionkey = tdata; logged = true; } continue; } else if (name == "call") { tdata = xml.readElementText(); if (tdata.length()>0) { //qDebug() << Q_FUNC_INFO << " - CALL: " << tdata; } continue; } else if (name == "Callsign") { // TEMP tdata = xml.readElementText(); if (tdata.length()>0) { //qDebug() << Q_FUNC_INFO << " - CALLSIGN: " << tdata; } continue; } else if (name == "name") { // TEMP tdata = xml.readElementText(); if (tdata.length()>0) { //qDebug() << Q_FUNC_INFO << " - Name: " << tdata; } continue; } else if (name == "country") { // TEMP tdata = xml.readElementText(); if (tdata.length()>0) { //qDebug() << Q_FUNC_INFO << " - Country: " << tdata; } continue; } else if (name == "Error") { tdata = xml.readElementText(); //qDebug() << Q_FUNC_INFO << " - Error: " << tdata; if (tdata == "Username/password incorrect ") { pass = QString(); } emit dataFoundSignal("error", tdata); continue; } else if (name == "Message") { tdata = xml.readElementText(); //qDebug() << Q_FUNC_INFO << " - Message: " << tdata; emit dataFoundSignal("message", tdata); continue; } else if (name == "fname") { tdata = xml.readElementText(); if (tdata.length()>0) { emit dataFoundSignal("name", tdata); //qDebug() << Q_FUNC_INFO << " - FName: " << tdata; } continue; } else if (name == "addr1") { tdata = xml.readElementText(); if (tdata.length()>0) { //emit dataFoundSignal("grid", tdata); //qDebug() << Q_FUNC_INFO << " - addr1: " << tdata; } continue; } else if (name == "addr2") { tdata = xml.readElementText(); if (tdata.length()>0) { emit dataFoundSignal("qth", tdata); //qDebug() << Q_FUNC_INFO << " - addr2: " << tdata; } continue; } else if (name == "grid") { tdata = xml.readElementText(); if (tdata.length()>0) { //qDebug() << Q_FUNC_INFO << " - grid: " << tdata; emit dataFoundSignal("grid", tdata); } continue; } else if (name == "qslmgr") { tdata = xml.readElementText(); if (tdata.length()>0) { //qDebug() << Q_FUNC_INFO << " - qslmgr: " << tdata; emit dataFoundSignal("qslmgr", tdata); } continue; } else if (name == "Remark") { tdata = xml.readElementText(); //qDebug() << Q_FUNC_INFO << " - Remark: " << tdata ; if (tdata.length()>0) { //qDebug() << "eLogQrzLog::parseXMLAnswer: Remark: " << tdata; } continue; } else if ((xml.readElementText() == "non-subscriber") && (subscriptionOK)) { //qDebug() << Q_FUNC_INFO << " - Not Subscribed QRZ.com user"; showDebugLog (Q_FUNC_INFO, "Non Subscribed"); emit showMessage(tr("You are not subscribed to QRZ.com.")); //emit disableQRZAction(true); subscriptionOK = false; } else { //qDebug() << Q_FUNC_INFO << " - ELSE quick read data: " << xml.readElementText(); } } } if (xml.hasError()) { showDebugLog (Q_FUNC_INFO, "Error: " + xml.errorString()); //qDebug() << Q_FUNC_INFO << " - ERROR: " << xml.errorString() ; } else if (xml.atEnd()) { //qDebug() << Q_FUNC_INFO << " - XML END" ; } /* QString tname, tdata; while(!xml.atEnd() && !xml.hasError()) { //qDebug() << "eLogQrzLog::parseXMLAnswer - 00012"; QXmlStreamReader::TokenType token = xml.readNext(); if (token == QXmlStreamReader::StartDocument) { //qDebug() << "eLogQrzLog::parseXMLAnswer - StartDocument"; continue; } //qDebug() << "eLogQrzLog::parseXMLAnswer - 00014"; if (token == QXmlStreamReader::StartElement) { tname = xml.name().toString(); //qDebug() << "eLogQrzLog::parseXMLAnswer - tname = " << tname; if (tname == "Key") { tdata = xml.readElementText(); //qDebug() << "eLogQrzLog::parseXMLAnswer: API-Key: " << tdata; if (tdata.length()>0) { sessionkey = tdata; logged = true; } continue; } if (tname == "Error") { tdata = xml.readElementText(); //qDebug() << "eLogQrzLog::parseXMLAnswer: Error: " << tdata; emit dataFoundSignal("error", tdata); } if (tname == "Message") { tdata = xml.readElementText(); //qDebug() << "eLogQrzLog::parseXMLAnswer: Message: " << tdata; emit dataFoundSignal("message", tdata); } if (tname == "call") { tdata = xml.readElementText(); if (tdata.length()>0) { //qDebug() << "eLogQrzLog::parseXMLAnswer: CALL: " << tdata; } continue; } if (tname == "fname") { tdata = xml.readElementText(); if (tdata.length()>0) { emit dataFoundSignal("name", tdata); //qDebug() << "eLogQrzLog::parseXMLAnswer: Name: " << tdata; } continue; } if (tname == "addr1") { tdata = xml.readElementText(); if (tdata.length()>0) { //emit dataFoundSignal("grid", tdata); //qDebug() << "eLogQrzLog::parseXMLAnswer: addr1: " << tdata; } continue; } if (tname == "addr2") { tdata = xml.readElementText(); if (tdata.length()>0) { emit dataFoundSignal("qth", tdata); //qDebug() << "eLogQrzLog::parseXMLAnswer: addr2: " << tdata; } continue; } if (tname == "grid") { tdata = xml.readElementText(); if (tdata.length()>0) { emit dataFoundSignal("grid", tdata); } continue; } if (tname == "qslmgr") { tdata = xml.readElementText(); if (tdata.length()>0) { emit dataFoundSignal("qslmgr", tdata); } continue; } if (tname == "Remark") { //qDebug() << "eLogQrzLog::parseXMLAnswer: Remark: " ; tdata = xml.readElementText(); if (tdata.length()>0) { //qDebug() << "eLogQrzLog::parseXMLAnswer: Remark: " << tdata; } continue; } if (tname == "Session") { //qDebug() << "eLogQrzLog::parseXMLAnswer: Session: " ; tdata = xml.readElementText(); if (tdata.length()>0) { //qDebug() << "eLogQrzLog::parseXMLAnswer: Session: " << tdata; } continue; } //qDebug() << "eLogQrzLog::parseXMLAnswer: Unknown: " << tname; } } if (xml.hasError()) { //qDebug() << "eLogQrzLog::parseXMLAnswer XML error: " << "XML error: " << xml.errorString(); } else if (xml.atEnd()) { //qDebug() << "eLogQrzLog::parseXMLAnswer XML END: " << "Reached end, done"; } */ //qDebug() << "eLogQrzLog::parseXMLAnswer: END of token while"; //qDebug() << Q_FUNC_INFO << " - NO ERROR" ; showDebugLog (Q_FUNC_INFO, "END"); } void eLogQrzLog::slotManagerFinished(QNetworkReply *data) { //qDebug() << Q_FUNC_INFO; showDebugLog (Q_FUNC_INFO, "Start"); result = data->error(); //qDebug() << Q_FUNC_INFO << " - Result = " << QString::number(result); const QByteArray sdata = data->readAll(); //qDebug() << Q_FUNC_INFO << " - Received: " << sdata; QString text = QString(); //qDebug() << Q_FUNC_INFO << " - 00010"; if (result == QNetworkReply::NoError) { //QXmlStreamReader reader(sdata); reader = new QXmlStreamReader(sdata); parseXMLAnswer(*reader); } else { //sendSignal(result, qsos); //parseNetworkError(result); } //qDebug() << Q_FUNC_INFO << " - Result = " << QString::number(result); //qDebug() << Q_FUNC_INFO << " - Result Text = " << text; emit showMessage(text); showDebugLog (Q_FUNC_INFO, "Text: " + text); showDebugLog (Q_FUNC_INFO, "END"); } void eLogQrzLog::downloadProgress(qint64 received, qint64 total) { //qDebug()<< "eLogQrzLog::downloadProgress: " << QString::number(received) << "/" << QString::number(total); showDebugLog (Q_FUNC_INFO, "Start: " + QString::number(received) +"/"+QString::number(total)); //qDebug()<< received << total; emit actionShowProgres(received, total); showDebugLog (Q_FUNC_INFO, "END"); } void eLogQrzLog::slotErrorManagement(QNetworkReply::NetworkError networkError) { //qDebug()<< "eLogQrzLog::slotErrorManagement: " << QString::number(networkError); showDebugLog (Q_FUNC_INFO, "Start: " + QString::number(networkError)); result = networkError; /* if (result == QNetworkReply::NoError) { } else if (result == QNetworkReply::HostNotFoundError) { //qDebug()<< "eLogQrzLog::slotErrorManagement: Host not found"; } else { //qDebug()<< "eLogQrzLog::slotErrorManagement: ERROR!"; } */ showDebugLog (Q_FUNC_INFO, "END"); } bool eLogQrzLog::canConnect() { showDebugLog (Q_FUNC_INFO, "Start"); if (!logged) { //qDebug() << Q_FUNC_INFO << " - 10"; login(); if (!logged) { //qDebug() << Q_FUNC_INFO << " - Not logged"; showDebugLog (Q_FUNC_INFO, "END-false-1"); return false; } } if (sessionkey.length()<1) { //qDebug() << Q_FUNC_INFO << " - API not valid"; showDebugLog (Q_FUNC_INFO, "END-false-2"); return false; } showDebugLog (Q_FUNC_INFO, "END-true"); return true; } void eLogQrzLog::fetchData() { //qDebug() << Q_FUNC_INFO; showDebugLog (Q_FUNC_INFO, "Start"); if (!canConnect()) { showDebugLog (Q_FUNC_INFO, "END- can't connect"); return; } QUrlQuery params; params.addQueryItem("action", "fetch"); params.addQueryItem("option", "all"); params.addQueryItem("agent", util->getGlobalAgent(klogVersion)); sendDataParams(params); showDebugLog (Q_FUNC_INFO, "END"); } void eLogQrzLog::checkQRZ(const QString &_qrz) { //qDebug() << Q_FUNC_INFO << ": " + _qrz; showDebugLog (Q_FUNC_INFO, "Start: " + _qrz); if (!util->isValidCall(_qrz)) { //qDebug()<< "eLogQrzLog::checkQRZ: CALL not valid" ; showDebugLog (Q_FUNC_INFO, "CALL not valid"); return; } //serviceUrl = QUrl("https://xmldata.qrz.com/xml/current/"); if (!canConnect()) { showDebugLog (Q_FUNC_INFO, "END-can't connect"); return; } //qDebug() << Q_FUNC_INFO << " - Preparing the query" ; QUrlQuery params; params.addQueryItem("s", sessionkey); params.addQueryItem("callsign", _qrz); params.addQueryItem("agent", util->getGlobalAgent(klogVersion)); sendDataParams(params); showDebugLog (Q_FUNC_INFO, "END"); } int eLogQrzLog::sendQSOs(QList _qsos) { //qDebug()<< "eLogQrzLog::sendQSOs: QSOs: " << QString::number(_qsos.length()); showDebugLog (Q_FUNC_INFO, "Start"); errorWhileSendingLog = false; if (logbookkey.length()<1) { //qDebug()<< "eLogQrzLog::sendQSOs: No valid KEY (-2)"; QMessageBox::warning(nullptr, tr("KLog - QRZ.com"), tr("Not valid KEY found") + "\n" + tr("Please configure your QRZ.com API key. You will find it in your QRZ.com Logbook settings webpage.\nYou need a QRZ.com subscription to use this feature."), QMessageBox::Ok); showDebugLog (Q_FUNC_INFO, "END-2"); return -2; } qsos.clear(); qsos << _qsos; lastQSO = false; foreach (int i, _qsos) { sendQSO(i); if (i == _qsos.last()) { lastQSO = true; } } showDebugLog (Q_FUNC_INFO, "END"); return 1; } int eLogQrzLog::sendQSO(const int _qsoID) { //qDebug() << "eLogQrzLog::sendQSO: " << QString::number(_qsoID); showDebugLog (Q_FUNC_INFO, "Start: " + QString::number(_qsoID)); QString adifQSO = dataProxy->getADIFQSO(_qsoID); //qDebug()<< "eLogQrzLog::sendQSO: (ADIF) :" << adifQSO; //qDebug()<< "eLogQrzLog::sendQSO: (KEY) :" << logbookkey; QUrlQuery params; params.addQueryItem("KEY", logbookkey); params.addQueryItem("ACTION", "INSERT"); params.addQueryItem("ADIF",adifQSO); params.addQueryItem("agent", util->getGlobalAgent(klogVersion)); //qDebug() << "eLogQrzLog::sendQSO: END"; QByteArray postData; postData = params.query(QUrl::FullyEncoded).toUtf8(); params.setQuery(postData); QNetworkRequest requestLog(QUrl("https://logbook.qrz.com/api")); requestLog.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); showDebugLog (Q_FUNC_INFO, "postData: " + QString(postData)); //qDebug()<< "eLogQrzLog::sendQSO: postData: " << postData; while (sendingQSO) { //qDebug() << "eLogQrzLog::sendQSO: sending QSO... just wait!"; } managerLog->post(requestLog, postData); showDebugLog (Q_FUNC_INFO, "END"); return 1; } bool eLogQrzLog::hasLogBookKey() { showDebugLog (Q_FUNC_INFO, "Start"); if (logbookkey.length()>0) { showDebugLog (Q_FUNC_INFO, "END-true"); return true; } else { showDebugLog (Q_FUNC_INFO, "END-false"); return false; } } void eLogQrzLog::login() { //qDebug()<< "eLogQrzLog::login" ; showDebugLog (Q_FUNC_INFO, "Start"); if (logged) { //qDebug()<< "eLogQrzLog::login Already logged!" ; showDebugLog (Q_FUNC_INFO, "END-1"); return; } //bool savePassword = true; if (pass.length()<1) { //savePassword = false; bool ok; pass = QInputDialog::getText(nullptr, tr("KLog - QRZ.com password needed"), tr("Please enter your QRZ.com password: "), QLineEdit::Password, "", &ok); if (!ok) { //qDebug() << "eLogQrzLog::login - END 1" << QT_ENDL; showDebugLog (Q_FUNC_INFO, "END-2"); return; } } if ((user.length()<1) || (pass.length()<1)) { //qDebug()<< "eLogQrzLog::login error 2" ; //if (!savePassword) //{// We delete the password as soon as possible if the user is not willing to save it // pass = QString(); //} return; } QUrlQuery params; params.addQueryItem("username", user); params.addQueryItem("password", pass); params.addQueryItem("agent", util->getGlobalAgent(klogVersion)); sendDataParams(params); //if (!savePassword) //{// We delete the password as soon as possible if the user is not willing to save it // pass = QString(); //} //qDebug()<< "eLogQrzLog::login - END" ; showDebugLog (Q_FUNC_INFO, "END"); } int eLogQrzLog::sendDataParams(const QUrlQuery &_params) { //qDebug()<< "eLogQrzLog::sendDataParams: Params: " << _params.query(QUrl::FullyEncoded).toUtf8(); showDebugLog (Q_FUNC_INFO, "Start"); QByteArray postData; QUrlQuery params; postData = params.query(QUrl::FullyEncoded).toUtf8(); postData = postData + "&" + _params.query(QUrl::FullyEncoded).toUtf8(); params.setQuery(postData); postData = params.query(QUrl::FullyEncoded).toUtf8(); serviceUrl = QUrl("https://xmldata.qrz.com/xml/current/"); QNetworkRequest request(serviceUrl); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); //qDebug()<< "eLogQrzLog::sendDataParams: postData: " << postData; manager->post(request, postData); //qDebug()<< "eLogQrzLog::sendDataParams - END"; showDebugLog (Q_FUNC_INFO, "END"); return -1; } void eLogQrzLog::setUser(const QString &_user) { showDebugLog (Q_FUNC_INFO, "Start: " + _user ); user = _user; showDebugLog (Q_FUNC_INFO, "END"); } void eLogQrzLog::setPassword(const QString &_pass) { showDebugLog (Q_FUNC_INFO, "Start: " + _pass); pass = _pass; showDebugLog (Q_FUNC_INFO, "END"); } QString eLogQrzLog::prepareToTranslate(const QString &_m) { //qDebug()<< "eLogQrzLog:: = prepareToTranslate" << _m; showDebugLog (Q_FUNC_INFO, "Start: " + _m); if (_m == "Callsign missing") { return tr("Callsign missing"); } else { return _m; } } void eLogQrzLog::parseAppAnswer (const QString &_m) { //qDebug()<< "eLogQrzLog::parseAppAnswer: " << _m ; showDebugLog (Q_FUNC_INFO, "Start: " + _m); QStringList response; response.clear(); response << _m.split('&'); QString responseType = response.at(0).split('=').at(0); QString responseResult = response.at(0).split('=').at(1); //qDebug()<< "eLogQrzLog::parseAppAnswer: responseType: " << responseType ; //qDebug()<< "eLogQrzLog::parseAppAnswer: responseResult: " << responseResult; if ((responseType == "STATUS") && (responseResult == "OK")) { //qDebug()<< "eLogQrzLog::parseAppAnswer: OK" ; } else if ((responseType == "STATUS") && (responseResult == "FAIL")) { errorWhileSendingLog = true; if (response.at(1).split('=').at(0) == "REASON") { QString reason = response.at(1).split('=').at(1); //qDebug()<< "eLogQrzLog::parseAppAnswer: " << reason ; } } else if ((responseType == "STATUS") && (responseResult == "AUTH")) { errorWhileSendingLog = true; if (response.at(1).split('=').at(0) == "REASON") { QString reason = response.at(1).split('=').at(1); //qDebug()<< "eLogQrzLog::parseAppAnswer: " << reason ; //onlineMessage->showMessage(QNetworkReply::NoError, QRZ, Fail, Other, reason); } } } void eLogQrzLog::sendSignal(QNetworkReply::NetworkError _error, QList _qsos) { showDebugLog (Q_FUNC_INFO, "Error: " + QString::number(_error) + " - List: " + QString::number(_qsos.length ())); errorWhileSendingLog = false; emit signalLogUploaded(_error, _qsos); } void eLogQrzLog::setSubcription(const bool _ok) { //showDebugLog (Q_FUNC_INFO, util->boolToQString (_ok)); subscriptionOK = _ok; } bool eLogQrzLog::getSubscription() { showDebugLog (Q_FUNC_INFO, util->boolToQString (subscriptionOK)); return subscriptionOK; } klog-2.3.3/adif.cpp0000644000015700001710000004223314542412415013750 0ustar jenkinsjenkins/*************************************************************************** utilities.cpp - description ------------------- begin : jun 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include "global.h" #include "adif.h" Adif::Adif(const QString &_parentName) { parentName = _parentName; //qDebug() << Q_FUNC_INFO << " (" << _parentName << ")"; //init(); } Adif::~Adif() { } void Adif::init() { setARRLSect(); setContinents(); setSponsorsList (); } void Adif::InitializeHash() { ADIFHash = { {"ADDRESS", "MultiLineString"}, {"AGE", "Number"}, {"ALTITUDE", "Number"}, {"ANT_AZ", "Number"}, {"ANT_EL", "Number"}, {"ANT_PATH", "Enumeration"}, {"ARRL_SECT", "Enumeration"}, {"AWARD_SUBMITTED", "SponsoredAwardList"}, {"AWARD_GRANTED", "SponsoredAwardList"}, {"A_INDEX", "Number"}, {"BAND", "Enumeration"}, {"BAND_RX", "Enumeration"}, {"CALL", "String"}, {"CHECK", "String"}, {"CLASS", "String"}, {"CLUBLOG_QSO_UPLOAD_DATE", "Date"}, {"CLUBLOG_QSO_UPLOAD_STATUS", "Enumeration"}, {"CNTY", "Enumeration"}, {"COMMENT", "String"}, {"CONT", "Enumeration"}, {"CONTACTED_OP", "String"}, {"CONTEST_ID", "String"}, {"COUNTRY", "String"}, {"CQZ", "PositiveInteger"}, {"CREDIT_SUBMITTED", "CreditList"}, {"CREDIT_GRANTED", "CreditList"}, {"DARC_DOK", "Enumeration"}, {"DISTANCE", "Number"}, {"DXCC", "Enumeration"}, {"EMAIL", "String"}, {"EQ_CALL", "String"}, {"EQSL_QSLRDATE", "Date"}, {"EQSL_QSLSDATE", "Date"}, {"EQSL_QSL_RCVD", "Enumeration"}, {"EQSL_QSL_SENT", "Enumeration"}, {"FISTS", "PositiveInteger"}, {"FISTS_CC", "PositiveInteger"}, {"FORCE_INIT", "Boolean"}, {"FREQ", "Number"}, {"FREQ_RX", "Number"}, {"GRIDSQUARE", "GridSquare"}, {"GRIDSQUARE_EXT", "GridSquareExt"}, {"GUEST_OP", "String"}, {"HAMLOGEU_QSO_UPLOAD_DATE", "Date"}, {"HAMLOGEU_UPLOAD_STATUS", "Enumeration"}, {"HAMQTH_QSO_UPLOAD_DATE", "Date"}, {"HAMQTH_UPLOAD_STATUS", "Enumeration"}, {"HRDLOG_QSO_UPLOAD_DATE", "Date"}, {"HRDLOG_QSO_UPLOAD_STATUS", "Enumeration"}, {"IOTA", "IOTARefNo"}, {"IOTA_ISLAND_ID", "PositiveInteger"}, {"ITUZ", "PositiveInteger"}, {"K_INDEX", "Integer"}, {"LAT", "Location"}, {"LON", "Location"}, {"LOTW_QSLRDATE", "Date"}, {"LOTW_QSLSDATE", "Date"}, {"LOTW_QSL_RCVD", "Enumeration"}, {"LOTW_QSL_SENT", "Enumeration"}, {"MAX_BURSTS", "Number"}, {"MODE", "Enumeration"}, {"MS_SHOWER", "String"}, {"MY_ALTITUDE", "Number"}, {"MY_ANTENNA", "String"}, {"MY_ARRL_SECT", "Enumeration"}, {"MY_CITY", "String"}, {"MY_CNTY", "Enumeration"}, {"MY_COUNTRY", "String"}, {"MY_CQ_ZONE", "PositiveInteger"}, {"MY_DXCC", "Enumeration"}, {"MY_FISTS", "PositiveInteger"}, {"MY_GRIDSQUARE", "GridSquare"}, {"MY_GRIDSQUARE_EXT", "GridSquareExt"}, {"MY_IOTA", "IOTARefNo"}, {"MY_IOTA_ISLAND_ID", "PositiveInteger"}, {"MY_ITU_ZONE", "PositiveInteger"}, {"MY_LAT", "Location"}, {"MY_LON", "Location"}, {"MY_NAME", "String"}, {"MY_POSTAL_CODE", "String"}, {"MY_POTA_REF", "POTARef"}, {"MY_RIG", "String"}, {"MY_SIG", "String"}, {"MY_SIG_INFO", "String"}, {"MY_SOTA_REF", "SOTARef"}, {"MY_STATE", "Enumeration"}, {"MY_STREET", "String"}, {"MY_USACA_COUNTIES", "SecondarySubdivisionList"}, {"MY_VUCC_GRIDS", "GridSquareList"}, {"MY_WWFF_REF", "WWFFRef"}, {"NAME", "String"}, {"NOTES", "MultilineString"}, {"NR_BURSTS", "Integer"}, {"NR_PINGS", "Integer"}, {"OPERATOR", "String"}, {"OWNER_CALLSIGN", "String"}, {"PFX", "String"}, {"POTA_REF", "POTARef"}, {"PRECEDENCE", "String"}, {"PROP_MODE", "Enumeration"}, {"PUBLIC_KEY", "String"}, {"QRZCOM_QSO_UPLOAD_DATE", "Date"}, {"QRZCOM_QSO_UPLOAD_STATUS", "Enumeration"}, {"QSLMSG", "MultilineString"}, {"QSLRDATE", "Date"}, {"QSLSDATE", "Date"}, {"QSL_RCVD", "Enumeration"}, {"QSL_RCVD_VIA", "Enumeration"}, {"QSL_SENT", "Enumeration"}, {"QSL_SENT_VIA", "Enumeration"}, {"QSL_VIA", "String"}, {"QSO_COMPLETE", "Enumeration"}, {"QSO_DATE", "Date"}, {"QSO_DATE_OFF", "Date"}, {"QSO_RANDOM", "Boolean"}, {"QTH", "String"}, {"REGION", "Enumeration"}, {"RIG", "MultilineString"}, {"RST_RCVD", "String"}, {"RST_SENT", "String"}, {"RX_PWR", "Number"}, {"SAT_MODE", "String"}, {"SAT_NAME", "String"}, {"SFI", "Integer"}, {"SIG", "String"}, {"SIG_INFO", "String"}, {"SILENT_KEY", "Boolean"}, {"SKCC", "String"}, {"SOTA_REF", "SOTARef"}, {"SRX", "Integer"}, {"SRX_STRING", "String"}, {"STATE", "Enumeration"}, {"STATION_CALLSIGN", "String"}, {"STX", "Integer"}, {"STX_STRING", "String"}, {"SUBMODE", "String"}, {"SWL", "Boolean"}, {"TEN_TEN", "PositiveInteger"}, {"TIME_OFF", "Time"}, {"TIME_ON", "Time"}, {"TX_PWR", "Number"}, {"UKSMG", "PositiveInteger"}, {"USACA_COUNTIES", "SecondarySubdivisionList"}, {"VE_PROV", "String"}, {"VUCC_GRIDS", "GridSquareList"}, {"WEB", "String"}, {"WWFF_REF", "WWFFRef"}, {"APP_LOTW_RXQSL", "Date"}, {"APP_LOTW_RXQSO", "Date"}, {"APP_LOTW_QSO_TIMESTAMP", "Date"} }; return; } void Adif::setLogLevel(DebugLogLevel _l) { logLevel = _l; } void Adif::setARRLSect() { QStringList pARRL_sects = {"AL", "AK", "AB", "AR", "AZ", "BC", "CO", "CT", "DE", "EB", "EMA", "ENY", "EPA", "EWA" "GA", "GTA", "ID", "IL", "IN", "IA", "KS", "KY", "LAX", "LA", "ME", "MB", "MAR", "MDC", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NM", "NLI", "NL", "NC", "ND", "NTX", "NFL", "NNJ", "NNY", "NT", "NWT", "OH", "OK", "ON", "ONE", "ONN", "ONS", "ORG", "OR", "PAC", "PR", "QC", "RI", "SV", "SDG", "SF", "SJV", "SB", "SCV", "SK", "SC", "SD", "STX", "SFL", "SNJ", "TN", "VI", "UT", "VT", "VA", "WCF", "WTX", "WV", "WMA", "WNY", "WPA", "WWA", "WI", "WY"}; ARRL_sects = pARRL_sects; } void Adif::setContinents() { QStringList pcontinents = {"NA", "SA", "EU", "AF", "OC", "AS", "AN"}; continents = pcontinents; } void Adif::setSponsorsList() { QStringList psponsorsList = {"ADIF_", "ARI_", "ARRL_", "CQ_", "DARC_", "EQSL_", "IARU_", "JARL_", "RSGB_", "TAG_", "WABAG_"}; sponsorsList = psponsorsList; } bool Adif::isValidFreq(const QString &_b) { bool _ok; double f = _b.toDouble(&_ok); if ((_ok) && f>0) { return true; } return false; } bool Adif::isValidPower(const QString &_b) { return (_b.toDouble()>0); } /* bool Utilities::isValidComment(const QString &_b) { return (_b.length()>0); } bool Utilities::isValidName(const QString &_b) { return (_b.length()>0); } bool Utilities::isValidADIFField(const QString &_b) { //qDebug() << "Utilities::isValidADIFField: " << _b ; // This functions checks if the ADIF field has the proper format. // Data if (!((_b.startsWith('<')) && (_b.count('>')) == 1 )) { //qDebug() << "Utilities::isValidADIFField: BAD FORMAT: No < or > delimiters: " << _b ; return false; } if (_b.simplified() == "") { return true; } QStringList validDataTypes = {"B", "N", "D", "T", "S", "I", "M", "G", "E", "L"}; QStringList qs; qs.clear(); qs.append(_b.split('>')); if (qs.size()!= 2) { //qDebug() << "Utilities::isValidADIFField-0 (not two): " << QString::number(qs.size()) ; return false; } QString field = (qs.at(0)).right((qs.at(0)).length() - 1); QString data = (qs.at(1)).simplified(); //data = data.simplified(); QString dataType = QString(); //qDebug() << "Utilities::isValidADIFField-Field: " << field ; //qDebug() << "Utilities::isValidADIFField_Data: " << data ; int length = data.length(); int separatorPosition = 0; int i = (field).count(":"); //Check how many ":" do we have, to see if we have a data type or not if (i == 2) // We have data type { // DATE:8:D / 20141020 separatorPosition = (field.section(':', 1, 1)).toInt(); dataType = field.section(':', 2, 2); if (!validDataTypes.contains(dataType.toUpper())) { //qDebug() << "Utilities::isValidADIFField - FORMAT ERROR: Wrong data type: " << dataType ; return false; } } else if (i == 1) { // DATE:8 / 20141020 separatorPosition = (field.section(':', 1, 1)).toInt(); } else { //qDebug() << "Utilities::isValidADIFField - FORMAT ERROR, more than 2 \":\" - " << field ; return false; } if ( length != separatorPosition) { //qDebug() << "Utilities::isValidADIFField: Data Length problem: " << (field) << "/" << data << " - " << QString::number(length) << "/" << QString::number(separatorPosition) ; return false; } if (separatorPosition <= 0) { //qDebug() << "Utilities::isValidADIFField: Length problem <= 0" ; return false; } //qDebug() << "FileManager::checkADIFValidFormat: Return true" ; return true; } bool Utilities::isValidQSL_Rcvd(const QString &c) { return ((c == "Y") || (c == "N") || (c == "R") || (c == "I") || (c == "V")); } bool Utilities::isValidQSL_Sent(const QString &c) { return ((c == "Y") || (c == "N") || (c == "R") || (c == "Q") || (c == "I")); } bool Utilities::isValidUpload_Status(const QString &c) { return ((c == "Y") || (c == "N") || (c == "M")); } bool Utilities::isValidFISTS(const QString &c) { return (c.toInt ()>0); } QStringList Utilities::getValidADIFFieldAndData(const QString &_b) { //qDebug() << "Utilities::getValidADIFFieldAndData: " << _b ; // This functions checks if the ADIF field has the proper format. // Data QStringList result; result.clear(); if (!(_b.startsWith('<'))) { //qDebug() << "Utilities::getValidADIFFieldAndData: BAD FORMAT: No < or > delimiters: " << _b ; return QStringList(); } if (_b.simplified() == "") { //qDebug() << "Utilities::getValidADIFFieldAndData: EOR" ; result << "EOR" << "EOR"; return result; } QString aux = _b; QStringList qs; qs.clear(); if ((aux.contains("APP_LOTW_")) && aux.contains("//")) { // Trying to fix a LoTW ADIF bug qs.append(aux.split("//")); aux = qs.at(0); } //qDebug() << "Utilities::getValidADIFFieldAndData: -20" ; QStringList validDataTypes = {"B", "N", "D", "T", "S", "I", "M", "G", "E", "L"}; qs.clear(); qs.append(aux.split('>')); if (qs.size()!= 2) { //qDebug() << "Utilities::getValidADIFFieldAndData-0 (not two): " << QString::number(qs.size()) ; return result; } //qDebug() << "Utilities::getValidADIFFieldAndData: -30" ; //QString field = (qs.at(0)).right((qs.at(0)).length() - 1); QString field = (qs.at(0)).right((qs.at(0)).length() - 1); QString data = (qs.at(1)).simplified(); //data = data.simplified(); QString dataType = QString(); //qDebug() << "Utilities::getValidADIFFieldAndData-Field: " << field ; //qDebug() << "Utilities::getValidADIFFieldAndData_Data: " << data ; int length = data.length(); int separatorPosition = 0; int i = (field).count(":"); //Check how many ":" do we have, to see if we have a data type or not if (i == 2) // We have data type { // DATE:8:D / 20141020 separatorPosition = (field.section(':', 1, 1)).toInt(); dataType = field.section(':', 2, 2); //qDebug() << "Utilities::getValidADIFFieldAndData - DataType: -" << dataType << "-" ; if (!validDataTypes.contains(dataType.toUpper())) { //qDebug() << "Utilities::getValidADIFFieldAndData - FORMAT ERROR: Wrong data type: " << dataType ; return result; } } else if (i == 1) { // DATE:8 / 20141020 separatorPosition = (field.section(':', 1, 1)).toInt(); } else { //qDebug() << "Utilities::getValidADIFFieldAndData - FORMAT ERROR, more than 2 \":\" - " << field ; return result; } //qDebug() << "Utilities::getValidADIFFieldAndData: -60" ; if ( length != separatorPosition) { //qDebug() << "Utilities::getValidADIFFieldAndData: Data Length problem: " << (field) << "/" << data << " - " << QString::number(length) << "/" << QString::number(separatorPosition) ; return result; } if (separatorPosition <= 0) { //qDebug() << "Utilities::getValidADIFFieldAndData: Length problem <= 0" ; return result; } //qDebug() << "Utilities::getValidADIFFieldAndData: -90: f: " << field ; //qDebug() << "Utilities::getValidADIFFieldAndData: -90: d: " << data;ield = field.section(':', 0, 0); result.clear(); result << field.section(':', 0, 0) << data; //qDebug() << "Utilities::checkADIFValidFormat: Return true: " << result.at(0) << "/" << result.at(1) ; return result; } QString Utilities::getADIFField(const QString &_fieldName, const QString &_data) {// Receives the ADIF field and the data and returns the ADIF field with a blank space at the end. // Check if _fieldName is a valid ADIF // if (ADIFHash.empty()) { InitializeHash(); } if (!ADIFHash.contains(_fieldName)) { //qDebug() << Q_FUNC_INFO << " - No valid ADIF: " << _fieldName; return QString(); } return QString ("<%1:%2>%3 ").arg(_fieldName).arg(_data.length ()).arg(_data); } bool Utilities::isValidAntPath(const QString &_s) { return ((_s == "G") || (_s == "O") || (_s == "S") || (_s == "L")); } bool Utilities::isValidARRLSect(const QString &_s) { return (ARRL_sects.contains (_s.toUpper ())); } bool Utilities::isValidContinent(const QString &_s) { return (continent.contains (_s.toUpper ())); } bool Utilities::isValidPropMode(const QString &_s) { QStringList propModes; propModes.clear (); propModes << "AS" << "AUE" << "AUR" << "BS" << "ECH" << "EME" << "ES" << "F2" << "FAI" << "GWAVE" << "INTERNET" << "ION" << "IRL" << "LOS" << "MS" << "RPT" << "RS" << "SAT" << "TEP" << "TR"; return propModes.contains (_s.toUpper ()); } bool Utilities::isValidDistance(const double _d) { return (_d>=0); } bool Utilities::isValidSponsor(const QString &_s) { return (sponsorsList.contains (_s.toUpper ())); } */ QString Adif::getADIFField(const QString &_fieldName, const QString &_data) {// Receives the ADIF field and the data and returns the ADIF field with a blank space at the end. // Check if _fieldName is a valid ADIF if (ADIFHash.empty()) { InitializeHash(); } if (!ADIFHash.contains(_fieldName)) { //qDebug() << Q_FUNC_INFO << " - No valid ADIF: " << _fieldName; return QString(); } return QString ("<%1:%2>%3 ").arg(_fieldName).arg(_data.length ()).arg(_data); } bool Adif::isValidCall(const QString &_c) { if (_c.length ()>=3) return true; return false; } void Adif::logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level) { emit debugLog (_func, _msg, _level); } klog-2.3.3/mainqsoentrywidget.h0000644000015700001710000001410214542412415016441 0ustar jenkinsjenkins#ifndef KLOG_MAINQSOENTRYWIDGET_H #define KLOG_MAINQSOENTRYWIDGET_H /*************************************************************************** mainqsoentrywidget.h - description ------------------- begin : january 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include "dataproxy_sqlite.h" #include "utilities.h" class MainQSOEntryWidget : public QWidget { Q_OBJECT friend class tst_MainWindow; public: explicit MainQSOEntryWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~MainQSOEntryWidget(); void setBands(const QStringList &_bands); void setModes(const QStringList &_modes); bool setBand(const QString &_band); bool setFreq(const double _f, bool isRX = false); bool setMode(const QString &_mode); bool setQRZ(const QString &_qrz); void setCurrentQRZ(const QString &_qrz); bool setDateTime(const QDateTime _date); bool setTime(const QTime _time); void setCleaning (const bool _c); bool isModeExisting(const QString &_m); bool isBandExisting(const QString &_b); void setShowSeconds(const bool &t); QString getQrz(); QString getBand(int _b=-1); QString getMode(int _m=-1); QStringList getModes(); QDate getDate(); QTime getTime(); QDateTime getDateTime(); void setRealTime(const bool _realTime); bool getRealTime(); void setManualMode(const bool _manualMode); bool getManualMode(); void toggleRealTime(); void setUTC(const bool _utc); void setModify(const bool _modify); bool getModifying(); void setUpAndRunning(const bool _u); void selectDefaultBand(bool _init = false); void selectDefaultMode(bool _init = false); void setDuplicatedQSOSlot (const int _secs); void setFocusToOK(); void setLogLevel (const DebugLogLevel _b); void setCallValidation (const bool _b); void clear(); protected: //void keyPressEvent(QKeyEvent *event); //void resizeEvent(QResizeEvent *event) override; signals: void debugLog (QString _func, QString _msg, DebugLogLevel _level); void showInfoLabel(QString _msg); void currentQRZSignal(QString _msg); void clearForNextQSOSignal(QString _func); void bandChanged(QString _band); void modeChanged(QString _mode); void OKClicked(); void validBands(QStringList _bands); void handOverFocusSignal(); void manualModeSignal(bool _active); private slots: void slotCaptureDebugLogs(const QString &_func, const QString &_msg, DebugLogLevel _level); void slotUpdateTime(); void slotQRZTextChanged(); void slotBandComboBoxChanged(const QString &_b); void slotModeComboBoxChanged(const QString &_m); void slotOKButtonClicked(); void slotClearButtonClicked(); void slotQRZButtonClicked(); //void slotRealtimeButtonClicked(); void slotCheckBoxClicked(); //void slotRealTimeCheckBoxChanged(); void slotStartDelayInputTimer(); void slotDelayInputTimedOut(); //void slotRealTimeButtonResize(); void slotManualModeCheckBoxClicked(); private: void logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level); bool eventFilter(QObject *object, QEvent *event); void createUI(); void setInitialData(); bool validCharactersInCall(const QString &_qrz); void clearForNextQSO(); void checkIfDupe(const QString &_func); void setDateAndTimeInternally(); bool updateBandComboBox(const QString &_band); // If a new band arrives, we add it if possible to KLog bool newBandNeededForFreq(const double _f); DataProxy_SQLite *dataProxy; QGroupBox *qrzgroupBox;//, *searchgroupBox; QLineEdit *qrzLineEdit; QComboBox *bandComboBox, *modeComboBox; QDateEdit *dateEdit; QTimeEdit *timeEdit; QPushButton *OKButton, *clearButton, *QRZButton; QCheckBox *realtimeCheckBox, *manualModeCheckBox; //QPushButton *realtimeButton; //DebugLogLevel logLevel; bool cleaning; bool qrzAutoChanging; bool InValidCharsInPrevCall; bool qrzSmallModDontCalculate; bool upAndRunning; bool getDarkMode(); QString previousQRZ; QString currentQrz; QStringList bands, modes; QTimer *timer; bool UTCTime, modify, realTime; QPalette palRed, palBlack, palWhite; // To paint Text in red or black(normal) Utilities *util; QPalette::ColorRole enabledCR, disabledCR; int duplicatedQSOSlotInSecs; QTimer *delayInputTimer; QString lastQrz; double freqTX, freqRX, bottomBandLimit, upperBandLimit; DebugLogLevel logLevel; bool modifyingBands; }; #endif // MAINQSOENTRYWIDGET_H klog-2.3.3/adif.h0000644000015700001710000000561214542412415013415 0ustar jenkinsjenkins#ifndef KLOG_ADIF_H #define KLOG_ADIF_H /*************************************************************************** adif.h - description ------------------- begin : ago 2023 copyright : (C) 2023 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ /* This class implements general controls on ADIF standard Refer to https://www.adif.org/ This classs hould not need to query the DB neither the DataProxy Class */ #include #include #include #include #include //#include "locator.h" #include "klogdefinitions.h" class Adif : public QObject { Q_OBJECT //friend class tst_Adif; public: Adif(const QString &_parentName); ~Adif(); void init(); bool isValidFreq(const QString &_b); bool isValidPower(const QString &_b); void setLogLevel(DebugLogLevel _l); QString getADIFField(const QString &_fieldName, const QString &_data); signals: void debugLog (QString _func, QString _msg, DebugLogLevel _level); private: void logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level); void InitializeHash(); void setARRLSect(); void setContinents(); void setSponsorsList(); bool isValidCall(const QString &_c); QString parentName; DebugLogLevel logLevel; QHash ADIFHash; // Name, type QStringList ARRL_sects, continents, sponsorsList; }; #endif // ADIF_H klog-2.3.3/INSTALL-linux0000644000015700001710000000476514542412415014537 0ustar jenkinsjenkinsFollow these steps to build KLog. KLog requires Qt5 to be built. Currently, many distributions are still distributing Qt4 as a default Qt version so it may be needed that you install Qt5 to be able to build KLog in your system. install may depend on your distribution, however, check for similar names & versions and it will probably work :-) If you have any suggestion for this file, please contact me. (Contact details in the AUTHORS file). 1. Install the KLog dependencies There are dependencies to build KLog and dependencies to run KLog. The dependencies to build KLog are: - g++, make, qt5-qmake, qtbase5-dev, qttools5-dev, libqt5charts5-dev, libqt5sql5-sqlite, libqt5serialport5-dev, qtdeclarative5-dev, qtpositioning5-dev & libhamlib-dev packages In Debian it is done with: apt-get install g++ make qt5-qmake qtbase5-dev qttools5-dev libqt5charts5-dev libqt5sql5-sqlite libhamlib++-dev libqt5serialport5-dev qtdeclarative5-dev qtpositioning5-dev The dependencies to run KLog once installed are: - libqt5sql5-sqlite, qml-module-qtquick-window2, qml-module-qtlocation, qml-module-qtpositioning, qml-module-qtquick2 & qml-module-qtquick-controls2 Again in Debian, it is done with: apt-get install libqt5sql5-sqlite qml-module-qtquick-window2 qml-module-qtlocation qml-module-qtpositioning qml-module-qtquick2 qml-module-qtquick-controls2 If your are using the Debian KLog package the dependencies to run KLog will be automatically installed when installing the KLog package. In your distribution, you should know how to install new packages :-) Make sure you have qt5 available. You can do it with the qtchooser command. The output should be something like: user@debian:~$ qtchooser -l 4 5 default qt4-i386-linux-gnu qt4 qt5-i386-linux-gnu qt5 user@debian:~$ It should return the list of qt versions available, qt5 must be one of them. If qt5 is still not there, check your instalallation as one of the previous packages may be missing. 2.- Select the appropriate Qt version (Qt5) export QT_SELECT=qt5 3.- Untar klog tar xvzf klog-version.tar.gz enter the KLog directory cd klog-version 4.- Generate the Makefile qmake PREFIX=/usr/local src.pro 5. Make everything. make If everything goes OK, you should have the klog executable in the folder. 6.- To install KLog, execute the following from the root account. make install Now you are done. Just execute klog and enjoy! 73 klog-2.3.3/searchwindow.h0000644000015700001710000001337314542412415015212 0ustar jenkinsjenkins#ifndef KLOG_SEARCHWINDOW_H #define KLOG_SEARCHWINDOW_H /*************************************************************************** searchwindow.h - description ------------------- begin : sept 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include //#include #include #include #include #include #include #include #include "dataproxy_sqlite.h" #include "searchmodel.h" #include "awards.h" //#include "elogclublog.h" #include "utilities.h" class SearchWindow : public QWidget { Q_OBJECT public: explicit SearchWindow(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~SearchWindow(); void createlogPanel(const int _currentLog); void clear(); void refresh(); void selectAll(); void clearSelection(); void setStationCallsignInHeader(const bool _h); void qslSentViaBureau(const int _qsoId); //Maybe this could be defined as private and call it with an action, if needed. void qslRecViaBureau(const int _qsoId); //Maybe this could be defined as private and call it with an action, if needed. void qslRecViaDirect(const int _qsoId); bool isQSLReceived(const int _qsoId); bool isQSLSent(const int _qsoId); //void setProxyModel (const bool _p); void sortColumn(const int _c); void setFilterString(const QString &_st); QList getSelectedQSOs(); void setNeedingQSL(bool const _q); void slotToolSearchQSL(const int actionQSL); void setColors (const QString &_newOne, const QString &_needed, const QString &_worked, const QString &_confirmed, const QString &_default); signals: void actionQSODoubleClicked(const int _qsoid); void actionDeleteQSO(const int _qsoid); void updateAwards(); void updateSearchText(); void updateSearchLineEdit(); void requestFocus(); void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution private slots: void slotDoubleClickLog(const QModelIndex & index); void slotRighButtonFromLog(const QPoint& pos); void slotQSLSentViaBureauFromLog(); void slotQSLSentViaDirectFromLog(); void slotQSLRecViaDirectFromLog(); void slotQSLRecViaBureauFromLog(); void slotQSLSentMarkAsRequested(); void slotQSLRecMarkAsRequested(); void slotQsoDeleteFromLog(); void slotQSOToEditFromLog(); void slotQueryErrorManagement(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); void slotCheckQRZCom(); void slotCheckDXHeatCom(); void slotQSLSentViaDirectMarkDXReqFromSearch(); void slotQSLSentViaBureauMarkDXReqFromSearch(); //void slotQSLRecMarkAsRequested(); void slotQSLRecViaDirectMarkReqFromSearch(); void slotQSLRecViaBureauMarkReqFromSearch(); private: void createUI(); void createActionsCommon(); void createActions(); //void deleteQSO(const int _qsoID); void rightButtonFromLogMenu(const int row); void showMenuRightButtonFromLogCreateActions(); //void slotToolSearchQSL(const int actionQSL); void searchToolNeededQSLToSend(); void setDefaultData(); void setColumnsToDX(); //void qslRecViaDirectMarkReq(const int _qsoId); //void qslRecViaBureauMarkReq(const int _qsoId); //void colorTheList(); bool qslingNeeded; DataProxy_SQLite *dataProxy; SearchModel *searchModel; Awards *awards; //eLogClubLog *elogClublog; //QTableView *logView; QTreeView *treeView; QLabel *logLabel; QAction *delQSOFromLogAct; QAction *qsoToEditFromLogAct; QAction *qslSentViaBureauFromLogAct; QAction *qslSentViaDirectFromLogAct; QAction *qslRecViaBureauFromLogAct; QAction *qslRecViaDirectFromLogAct; QAction *checkQRZCOMFromLogAct; QAction *checkDXHeatFromLogAct; QAction *qslSentRequestedAct; QAction *qslSentViaDirectMarkRcvReqFromSearchAct; QAction *qslSentViaBureauMarkRcvReqFromSearchAct; QAction *qslRecViaBureauMarkReqFromSearchAct; QAction *qslRecViaDirectMarkReqFromSearchAct; QAction *qslRecRequestedAct; int currentLog; Utilities *util; bool showStationCallsignInHeader; }; #endif // SEARCHWINDOW_H klog-2.3.3/elogclublog.cpp0000644000015700001710000006273314542412415015352 0ustar jenkinsjenkins/*************************************************************************** elogclublog.cpp - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "elogclublog.h" #include #include #include #include //#include //https://clublog.freshdesk.com/support/solutions/59800 eLogClubLog::eLogClubLog() { //qDebug()<< "eLogClubLog::eLogClubLog" ; //email = QString(); //pass = QString(); qsos.clear(); api = "9467beee93377e82a276b0a777d388b5c933d044"; currentQSO = -1; manager = new QNetworkAccessManager(this); connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(slotQsoUploadFinished(QNetworkReply*))); //stationCallsign = QString(); uploadingFile = false; util = new Utilities(Q_FUNC_INFO); //qDebug()<< "eLogClubLog::eLogClubLog - END" ; } eLogClubLog::~eLogClubLog() { delete(util); delete(manager); //qDebug()<< "eLogClubLog::~eLogClubLog" ; } void eLogClubLog::slotQsoUploadFinished(QNetworkReply *data) { //qDebug()<< "eLogClubLog::slotQsoUploadFinished" ; result = data->error(); //qDebug()<< Q_FUNC_INFO << " - Result = " << QString::number(result); const QByteArray sdata = data->readAll(); QString text = QString(); if (currentQSO>0) { emit actionReturnDownload(result, currentQSO); currentQSO = -1; } if (result == QNetworkReply::NoError) { text = "ClubLog: " + prepareToTranslate(sdata); //qDebug()<< sdata; //qDebug()<< Q_FUNC_INFO << " - NO ERROR"; if (uploadingFile) { uploadingFile = false; emit signalFileUploaded(result, qsos); qsos.clear(); return; } } else if (result == QNetworkReply::HostNotFoundError) { //qDebug()<< Q_FUNC_INFO << " - Result = Host Not found! = " << QString::number(result) ; text = "ClubLog: " + tr("Host not found!"); //TODO: Mark the previous QSO as not sent to clublog } else if (result == QNetworkReply::TimeoutError) { //qDebug()<< Q_FUNC_INFO << " - Result = Time out error! = " << QString::number(result) ; text = "ClubLog: " + tr("Timeout error!"); //TODO: Mark the previous QSO as not sent to clublog } else if (result == 201) { text = "ClubLog: " + tr("It seems to be a CREDENTIALS ERROR; check your email and password."); QMessageBox::warning(nullptr, tr("KLog - ClubLog"), tr("It seems that your ClubLog credentials are not correct.") + "\n" + tr("Please check your credentials in the setup. ClubLog uploads will be disabled."), QMessageBox::Ok); emit disableClubLogAction(true); } /* else if (result == 202) { //qDebug()<< Q_FUNC_INFO << " - Result = Password Error! = " << QString::number(result) ; text = "ClubLog: " + tr("It seems to be a PASSWORD ERROR; check your password."); int i = QMessageBox::warning(nullptr, tr("KLog - ClubLog"), tr("It seems that your ClubLog password is not correct.") + "\n" + tr("Please check your password in the setup. ClubLog uploads will be disabled."), QMessageBox::Ok); emit disableClubLogAction(true); //TODO: Mark the previous QSO as not sent to clublog } */ else if (result == 203) { text = "ClubLog: " + tr("QSO dupe or not existing (#%1)... ").arg(result); QMessageBox::warning(nullptr, tr("KLog - ClubLog"), tr("We have received an undefined error from Clublog (%1)").arg(result) + "\n" + tr("This error may be caused for the QSO being duplicated or, if removing, trying to remove a non existing QSO."), QMessageBox::Ok); } else { //qDebug()<< Q_FUNC_INFO << " - Result = UNDEFINED = " << QString::number(result) ; text = "ClubLog: " + tr("Undefined error number (#%1)... ").arg(result); QMessageBox::warning(nullptr, tr("KLog - ClubLog"), tr("We have received an undefined error from Clublog (%1)").arg(result) + "\n" + tr("Please check your config in the setup and contact the KLog development team if you can't fix it. ClubLog uploads will be disabled."), QMessageBox::Ok); emit disableClubLogAction(true); //TODO: Mark the previous QSO as not sent to clublog } //qDebug()<< Q_FUNC_INFO << " - Result = " << QString::number(result); //qDebug()<< Q_FUNC_INFO << " - Result Text = " << text; //emit done(); //emit signalFileUploaded(result, qsos); emit showMessage(text); } void eLogClubLog::slotFileUploadFinished(QNetworkReply *data) { //qDebug()<< "eLogClubLog::slotFileUploadFinished" ; result = data->error(); //qDebug()<< "eLogClubLog::slotFileUploadFinished - Result = " << QString::number(result); const QByteArray sdata = data->readAll(); QString text; if (result == QNetworkReply::NoError) { text = "ClubLog: " + prepareToTranslate(sdata); //qDebug()<< "eLogClubLog::slotFileUploadFinished - Result = NoError = " << QString::number(result) ; //qDebug()<< sdata; } else if (result == QNetworkReply::HostNotFoundError) { //qDebug()<< "eLogClubLog::slotFileUploadFinished - Result = Host Not found! = " << QString::number(result) ; text = "ClubLog: " + tr("Host not found!"); } else if (result == QNetworkReply::TimeoutError) { //qDebug()<< "eLogClubLog::slotFileUploadFinished - Result = Time out error! = " << QString::number(result) ; text = "ClubLog: " + tr("Timeout error!"); } else { //qDebug()<< "eLogClubLog::slotFileUploadFinished - Result = UNDEFINED = " << QString::number(result) ; text = "ClubLog: " + tr("Undefined error..."); } //qDebug()<< "eLogClubLog::slotFileUploadFinished - Result = " << QString::number(result); //emit done(); emit showMessage(text); } void eLogClubLog::downloadProgress(qint64 received, qint64 total) { //qDebug()<< "eLogClubLog::downloadProgress: " << QString::number(received) << "/" << QString::number(total); //qDebug()<< received << total; emit actionShowProgres(received, total); } void eLogClubLog::slotErrorManagement(QNetworkReply::NetworkError networkError) { //qDebug()<< "eLogClubLog::slotErrorManagement: " << QString::number(networkError); result = networkError; /*if (result == QNetworkReply::NoError) { } else if (result == QNetworkReply::HostNotFoundError) { //qDebug()<< "eLogClubLog::slotErrorManagement: Host not found"; } else { //qDebug()<< "eLogClubLog::slotErrorManagement: ERROR!"; } */ //actionError(result); } int eLogClubLog::sendQSO(QStringList _qso) { //qDebug() << "eLogClubLog::sendQSO: " << email << "/" << pass << "/" << api ; //qDebug()<< "eLogClubLog::sendQSO:: length = " << QString::number(_qso.length()); // First Data in the QStringList is the QSO id, not to be sent to clublog but used in the signal actionReturnDownload(const int _i, const int _qsoId); for(int i = 0; i<_qso.length(); i++) { //qDebug()<< "eLogClubLog::sendQSO = qso-at: "<< QString::number(i) << "- " << _qso.at(i); } if (_qso.length()!=18) { //qDebug() << "eLogClubLog::sendQSO:: length - END"; return -1; } currentQSO = (_qso.at(0)).toInt(); _qso.removeFirst(); //_qso.removeFirst(); //qDebug()<< "eLogClubLog::sendQSO CALL TO USE (before checking): " << _qso.at(16); //qDebug()<< "eLogClubLog::sendQSO default StationCallsign): " << stationCallsign; QString tempCall = _qso.at(16); if (tempCall.length()<1) { tempCall = stationCallsign; } //qDebug()<< "eLogClubLog::sendQSO CALL TO USE: " << tempCall; _qso.removeLast(); QString qso = getClubLogAdif(_qso); //qDebug()<< "eLogClubLog::sendQSO: " << qso; QUrlQuery params; params.addQueryItem("adif",qso); //qDebug() << "eLogClubLog::sendQSO: QSO: " << qso; //qDebug() << "eLogClubLog::sendQSO: END"; uploadingFile = false; return sendDataParams(tempCall, params, true); //return sendData(tempCall, qso); } /* int eLogClubLog::deleteQSOid(const int _qsoId) { //qDebug()<< "eLogClubLog::deleteQSOid: " << QString::number(_qsoId); // email, password, callsign, dxcall, datetime, bandid, api QString dxcall, datatime, bandid; QUrlQuery params; params } */ int eLogClubLog::sendDataParams(const QString &_clublogCall, const QUrlQuery &_params, bool _adding) { //qDebug()<< Q_FUNC_INFO << ": Call: " << _clublogCall; //qDebug()<< Q_FUNC_INFO << ": : Params: " << _params.query(QUrl::FullyEncoded).toUtf8(); //qDebug()<< Q_FUNC_INFO << ": email = " << email; //qDebug()<< Q_FUNC_INFO << ": Pass = " << pass; QUrl serviceUrl; if (_adding) { //serviceUrl = QUrl("https://secure.clublog.org/realtime.php"); serviceUrl = QUrl("https://clublog.org/realtime.php"); } else { //serviceUrl = QUrl("https://secure.clublog.org/delete.php"); serviceUrl = QUrl("https://clublog.org/delete.php"); } QByteArray postData; QUrlQuery params; params.addQueryItem("email",email); params.addQueryItem("password",pass); if (_clublogCall.length()>2) { params.addQueryItem("callsign",_clublogCall); //qDebug()<< Q_FUNC_INFO << ": - callsign 1: " << _clublogCall; } else { params.addQueryItem("callsign",stationCallsign); } //qDebug()<< Q_FUNC_INFO << ": - query before send/delete: " << params.query(QUrl::FullyEncoded).toUtf8(); if (_adding) { params.addQueryItem("api",api); postData = params.query(QUrl::FullyEncoded).toUtf8(); postData = postData + "&" + _params.query(QUrl::FullyEncoded).toUtf8(); params.setQuery(postData); //TODO: ADD the params } else { //TODO: ADD the params postData = params.query(QUrl::FullyEncoded).toUtf8(); postData = postData + "&" + _params.query(QUrl::FullyEncoded).toUtf8() ; params.setQuery(postData); params.addQueryItem("api",api); } postData = params.query(QUrl::FullyEncoded).toUtf8(); QNetworkRequest request(serviceUrl); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); //qDebug() << Q_FUNC_INFO << ": " << postData; manager->post(request, postData); //qDebug()<< Q_FUNC_INFO << ": - END"; return -1; } /* int eLogClubLog::sendData(const QString &_clublogCall, const QString &_q) { //qDebug()<< "eLogClubLog::sendData: " << _q; QUrl serviceUrl = QUrl("https://secure.clublog.org/realtime.php"); QByteArray postData; //QByteArray postData; QUrlQuery params; params.addQueryItem("email",email); params.addQueryItem("password",pass); if (_clublogCall.length()>2) { params.addQueryItem("callsign",_clublogCall); //qDebug()<< "eLogClubLog::sendData - callsign 1: " << _clublogCall; } else { params.addQueryItem("callsign",stationCallsign); //ERROR } params.addQueryItem("api",api); params.addQueryItem("adif",_q); postData = params.query(QUrl::FullyEncoded).toUtf8(); //qDebug()<< "eLogClubLog::sendData - query: " << postData; //postData = params.encodedQuery(); // Call the webservice //QNetworkAccessManager *networkManager = new QNetworkAccessManager; QNetworkRequest request(serviceUrl); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); //connect(networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(slotQsoUploadFinished(QNetworkReply*))); manager->post(request, postData); return -1; } */ QString eLogClubLog::getClubLogAdif(const QStringList _q) { //qDebug() << "eLogClubLog::getClubLogAdif: " << QString::number(_q.length()); // _qso must include 16 ordered fields than can be empty or contain data. This function builds the ADIF QSO /* http://clublog.freshdesk.com/support/solutions/articles/53202-which-adif-fields-does-club-log-use- ClubLog only accepts the following ADIF fields: QSO_DATE TIME_ON TIME_OFF (this is stored independently and used for log matching as well as ADIF exports) QSLRDATE QSLSDATE CALL OPERATOR MODE BAND BAND_RX FREQ QSL_RCVD LOTW_QSL_RCVD QSL_SENT DXCC PROP_MODE CREDIT_GRANTED RST_SENT RST_RCVD NOTES */ if (_q.length()!=16) { return QString(); } for (int i = 0; i< _q.length(); i++) { //qDebug()<< QString("eLogClubLog::getClubLogAdif: (%1): %2").arg(i).arg(_q.at(i)); } QString qso, aux1; qso.clear(); aux1 = _q.at(0); //qDebug()<< "eLogClubLog::getClubLogAdif: Date: " << _q.at(0) ; if (QDate::fromString(aux1, "yyyyMMdd").isValid()){ qso = "" + aux1 + " "; } else { //qDebug() << "eLogClubLog::getClubLogAdif: END error "; return QString(); } //qso = "" + _q.at(0) + " "; qso = qso + "" + _q.at(1) + " "; //qDebug()<< "eLogClubLog::getClubLogAdif: 10" ; if ((_q.at(2)).length()>0) { qso = qso + "" + _q.at(2) + " "; } //qDebug()<< "eLogClubLog::getClubLogAdif: 20" ; if ((_q.at(3)).length()>0) { qso = qso + "" + _q.at(3) + " "; } //qDebug()<< "eLogClubLog::getClubLogAdif: 30" ; qso = qso + "" + _q.at(4) + " "; //qDebug()<< "eLogClubLog::getClubLogAdif: 40" ; if ((_q.at(5)).length()>0) { qso = qso + "" + _q.at(5) + " "; } //qDebug()<< "eLogClubLog::getClubLogAdif: 50" ; qso = qso + "" + _q.at(6) + " "; //qDebug()<< "eLogClubLog::getClubLogAdif: 60" ; qso = qso + "" + _q.at(7) + " "; //qDebug()<< "eLogClubLog::getClubLogAdif: 70" ; if ((_q.at(8)).length()> 2) { qso = qso + "" + _q.at(8) + " "; } if ((_q.at(9)).length()> 2) { qso = qso + "" + _q.at(9) + " "; } //qDebug()<< "eLogClubLog::getClubLogAdif: 90" ; qso = qso + "" + _q.at(10) + " "; //qDebug()<< "eLogClubLog::getClubLogAdif: 100" ; qso = qso + "" + _q.at(11) + " "; //qDebug()<< "eLogClubLog::getClubLogAdif: 110" ; //qso = qso + "" + _q.at(12) + " "; //qDebug()<< "eLogClubLog::getClubLogAdif: 120" ; if ((_q.at(13)).toInt()> 0) { qso = qso + "" + _q.at(13) + " "; } //qDebug()<< "eLogClubLog::getClubLogAdif: 130'" ; if ((_q.at(14)).toInt()> 0) { qso = qso + "" + _q.at(14) + " "; } //qDebug()<< "eLogClubLog::getClubLogAdif: 140" ; if ((_q.at(15)).length()>0) { qso = qso + "" + _q.at(15) + " "; } //qDebug()<< "eLogClubLog::getClubLogAdif: 150" ; qso = qso + ""; //qDebug()<< "eLogClubLog:: - QSO: " << qso; //qDebug()<< "eLogClubLog::getClubLogAdif: 100" ; return qso; } void eLogClubLog::setDefaultCallsign(const QString &_defaultStationCallsign) { stationCallsign = _defaultStationCallsign; } int eLogClubLog::deleteQSO(QStringList _qso) { //qDebug()<< "eLogClubLog::deleteQSO: length = " << QString::number(_qso.length()); //qDebug()<< "eLogClubLog::deleteQSO: " << email << "/" << pass << "/" << api ; //qDebug()<< "eLogClubLog::deleteQSO: email = " << email; //qDebug()<< "eLogClubLog::deleteQSO: Pass = " << pass; // email, password, callsign, dxcall, datetime (sqlite format, not ADIF), bandid (only the number, not ADIF), api if (_qso.length()!=18) { return -1; } for (int i = 0; i<_qso.length(); i++) { //qDebug()<< QString("eLogClubLog::deleteQSO: qso.at(%1) = %2").arg(i).arg(_qso.at(i)); } QString dxcall, sdateTime, bandid; QString tempCall = _qso.at(17); if (tempCall.length()<1) { tempCall = stationCallsign; } dxcall = _qso.at(5); QDateTime dateTime; dateTime.setDate(QDate::fromString(_qso.at(1), "yyyyMMdd")); dateTime.setTime(QTime::fromString(_qso.at(2), "HHmmss")); if (!dateTime.isValid()) { return -1; } sdateTime = dateTime.toString("yyyy-MM-dd HH:mm:ss"); //qDebug()<< QString("eLogClubLog::deleteQSO: DateTime = %1").arg(sdateTime); //qDebug()<< QString("eLogClubLog::deleteQSO: band-1: ") << _qso.at(8); bandid = (_qso.at(8)).chopped(1); //qDebug()<< QString("eLogClubLog::deleteQSO: band-2: ") << bandid; bool ok; bandid.toInt(&ok); if (!ok) { // This check is to capture potential QSOs in 222Mhz (AKA 1.25) bandid = bandid.chopped(1); //qDebug()<< QString("eLogClubLog::deleteQSO: band-3: ") << bandid; } //qDebug()<< QString("eLogClubLog::deleteQSO: bandid = %1").arg(bandid); if (bandid.toInt()<=0) { return -2; } QUrlQuery params; params.addQueryItem("dxcall", dxcall); params.addQueryItem("datetime", sdateTime); params.addQueryItem("bandid", bandid); //params.addQueryItem("adif",qso); uploadingFile = false; return sendDataParams(tempCall, params, false); //return sendData(qso); } QString eLogClubLog::prepareToTranslate(const QString &_m) { //qDebug()<< "eLogClubLog:: = prepareToTranslate" << _m; if (_m == "Callsign missing") { return tr("Callsign missing"); } else if (_m == "Invalid callsign") { return tr("Invalid callsign"); } else if (_m == "Skipping SWL callsign") { return tr("Skipping SWL callsign"); } else if (_m == "Callsign is your own call") { return tr("Callsign is your own call"); } else if (_m == "Invalid callsign with no DXCC mapping") { return tr("Invalid callsign with no DXCC mapping"); } else if (_m == "Updated QSO") { return tr("Updated QSO"); } else if (_m == "Invalid ADIF record") { return tr("Invalid ADIF record"); } else if (_m == "Missing ADIF record") { return tr("Missing ADIF record"); } else if (_m == "Test mode - parameters ok, no action taken") { return tr("Test mode - parameters ok, no action taken"); } else if (_m == "Excessive API Usage") { return tr("Excessive API Usage"); } else if (_m == "Internal Error") { return tr("Internal Error"); } else if (_m == "Rejected") { return tr("Rejected"); } else if (_m == "QSO Duplicate") { return tr("QSO Duplicate"); } else if (_m == "QSO Modified") { return tr("QSO Modified"); } else if (_m == "Missing Login") { return tr("Missing Login"); } else if (_m == "QSO OK") { return tr("QSO OK"); } else if (_m == "Upload denied") { return tr("Upload denied"); } else if (_m == "No callsign selected") { return tr("No callsign selected"); } else if (_m == "No match found") { return tr("No match found"); } else if (_m == "Dropped QSO") { return tr("Dropped QSO"); } else if (_m == "OK") { return tr("OK"); } else if (_m == "Login rejected") { return tr("Login rejected"); } else if (_m == "Upload denied") { return tr("Upload denied"); } else if (_m == "Rejected: Callsign is your own call") { return tr("Rejected: Callsign is your own call"); } else { return _m; } } int eLogClubLog::modifyQSO (QStringList _oldQSO, QStringList _newQSO) { //qDebug()<< QString("eLogClubLog::modifyQSO"); int x = -1; x = deleteQSO(_oldQSO); x = sendQSO(_newQSO); return x; } void eLogClubLog::sendLogFile(const QString &_file, QList _qso, bool _overwrite) { //qDebug()<< Q_FUNC_INFO << ": " << _file; qsos.clear(); qsos.append(_qso); QUrl serviceUrl; serviceUrl = QUrl("https://clublog.org/putlogs.php"); QByteArray postData; QUrlQuery params; // FIRST PARAMS is the file QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); QByteArray blob; //QFile *file = new QFile("_file"); QFile *file = new QFile(util->getClubLogFile()); if (file->open(QIODevice::ReadOnly)) /* Flawfinder: ignore */ { blob = file->readAll(); } else { //qDebug()<< Q_FUNC_INFO << ": ERROR File not opened"; return; } file->close(); // The rest of the form goes as usual //qDebug()<< Q_FUNC_INFO << ": email: " << email; //qDebug()<< Q_FUNC_INFO << ": apPass: " << appPass; //qDebug()<< Q_FUNC_INFO << ": stationcall: " << stationCallsign; //qDebug()<< Q_FUNC_INFO << ": api: " << api; QHttpPart emailPart; emailPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"email\"")); emailPart.setBody(email.toUtf8()); QHttpPart passPart; passPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"password\"")); passPart.setBody(appPass.toUtf8()); QHttpPart callPart; callPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"callsign\"")); callPart.setBody(stationCallsign.toUtf8()); QHttpPart apiPart; apiPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"api\"")); apiPart.setBody(api.toUtf8()); QString one; if (_overwrite) { one = QString("1"); } else { one = QString("0"); } //QString one = QString("1"); QHttpPart clearPart; clearPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"clear\"")); clearPart.setBody(one.toUtf8()); QHttpPart filePart; QString aux = QString("form-data; name=\"file\"; filename=\"%1\"").arg(_file); filePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/octet-stream")); filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(aux)); filePart.setBody(blob); multiPart->append(filePart); multiPart->append(emailPart); multiPart->append(passPart); multiPart->append(callPart); multiPart->append(clearPart); multiPart->append(apiPart); uploadingFile = true; QNetworkRequest request(serviceUrl); manager->post(request, multiPart); //qDebug() << Q_FUNC_INFO << ": " << multiPart; //qDebug()<< "eLogClubLog::sendLogFile - END"; } void eLogClubLog::loadSettings() { QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("ClubLog"); email = settings.value ("ClubLogEmail").toString (); pass = settings.value ("ClubLogPass").toString (); appPass = settings.value ("ClubLogAppPass").toString (); settings.endGroup (); } klog-2.3.3/hamlibclass.cpp0000644000015700001710000006665314542412415015343 0ustar jenkinsjenkins/*************************************************************************** hamlibclass.cpp - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles user : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "hamlibclass.h" #include #include #include #include HamLibClass::HamLibClass(QObject *parent) : QObject(parent) { //qDebug() << Q_FUNC_INFO; timer = new QTimer(this); //my_rig = rig_init (RIG_DUMMY); rig_set_debug(RIG_DEBUG_NONE); my_rig = rig_init (RIG_MODEL_DUMMY); retcode = -1; bauds = 9600; //qDebug() << Q_FUNC_INFO << " - END"; } HamLibClass::~HamLibClass() { //qDebug() << Q_FUNC_INFO; if (rigLaunched) { rig_close(my_rig); rig_cleanup(my_rig); rigLaunched = false; } //qDebug() << Q_FUNC_INFO << " - END"; } void HamLibClass::initClass() { //qDebug() << Q_FUNC_INFO ; //showDebugLog(Q_FUNC_INFO, "Start"); strings.clear(); fillRigsList(); retcode = -1; rigLaunched = false; pollInterval = 300; errorCount = 0; readOnlyMode = false; justEmitted = false; reading = false; freq_old = 0.0; bauds = 9600; // default 9600 dataBits = 8; // default 8 stopBits = 1; // default 1 connect(timer, SIGNAL(timeout()), this, SLOT(slotTimer()) ); clean(); //qDebug() << Q_FUNC_INFO << " - END"; } void HamLibClass::clean() { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO ; myrig_model = 1; //Dummy equipment bauds = 9600; dataBits = 8; stopBits = 1; shandshake = RIG_HANDSHAKE_NONE; sparity = RIG_PARITY_NONE; serialPort = QString(); sdtr = RIG_SIGNAL_OFF; srts = RIG_SIGNAL_OFF; networkPort = 4532; networkAddress = "127.0.0.1"; rigLaunched = false; //qDebug() << Q_FUNC_INFO << " - END" ; } void HamLibClass::setPoll(const int _milsecs) { //showDebugLog(Q_FUNC_INFO, "Start"); if (_milsecs>0) { pollInterval = _milsecs; } } double HamLibClass::getFrequency() { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO; if (!isRunning()) { //qDebug() << Q_FUNC_INFO << ": isn't running"; return 0.0; } if (reading) { //qDebug() << Q_FUNC_INFO << ": Exiting, I was already reading ... "; return 0.0; } reading = true; //qDebug() << Q_FUNC_INFO << ": Reading ... "; //retcode = rig_get_freq(my_rig, RIG_VFO_CURR, &freq); retcode = rig_get_freq(my_rig, RIG_VFO_CURR, &freq); if (retcode == RIG_OK) { //qDebug() << Q_FUNC_INFO << ": RIG OK for Freq: " << QString::number(freq); errorCount = 0; reading = false; return freq/1000000; } else { reading = false; //qDebug() << Q_FUNC_INFO << " error on readFreq - END"; return 0.0; } } bool HamLibClass::readRadio(bool _forceRead) { //showDebugLog(Q_FUNC_INFO, "Start"); return readRadioInternal(_forceRead); } bool HamLibClass::readRadioInternal(bool _forceRead) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO; if (!isRunning()) { //qDebug() << Q_FUNC_INFO << ": isn't running"; return false; } if (reading) { //qDebug() << Q_FUNC_INFO << ": Exiting, I was already reading ... "; return false; } reading = true; //qDebug() << Q_FUNC_INFO << ": Reading ... "; retcode = rig_get_freq(my_rig, RIG_VFO_CURR, &freq); if (retcode == RIG_OK) { //qDebug() << Q_FUNC_INFO << ": RIG OK for Freq"; errorCount = 0; //qDebug() << Q_FUNC_INFO << ": Freq: " << QString::number(freq); if ((freq_old > freq) || (freq_old < freq) || (_forceRead == true)) { emit freqChanged(freq/1000000); freq_old = freq; //qDebug() << Q_FUNC_INFO << ": EMITING; " << QString::number(freq); } //qDebug() << Q_FUNC_INFO << ": read: " << QString::number(freq); } else { reading = false; //qDebug() << Q_FUNC_INFO << " error on readFreq - END"; return errorManage(Q_FUNC_INFO, retcode); } retcode = rig_get_mode(my_rig, RIG_VFO_CURR, &rmode, &width); if (retcode == RIG_OK) { //qDebug() << Q_FUNC_INFO << ": RIG OK for Mode"; errorCount = 0; //qDebug() << Q_FUNC_INFO << ": Mode: " << hamlibMode2Mode(rmode); if ((mode_old != rmode) || (_forceRead == true)) { if (justEmitted) { justEmitted = false; reading = false; //qDebug() << Q_FUNC_INFO << " - justEmitted END"; return true; } mode_old = rmode; //qDebug() << Q_FUNC_INFO << " - Emmiting mode: " << hamlibMode2Mode(rmode) ; emit modeChanged(hamlibMode2Mode(rmode)); justEmitted = true; } } else { //qDebug() << Q_FUNC_INFO << " - Error on readMode END"; reading = false; return errorManage(Q_FUNC_INFO, retcode); } //qDebug() << Q_FUNC_INFO << " - END"; reading = false; return true; } void HamLibClass::slotTimer() { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO; if (!isRunning()) { //qDebug() << Q_FUNC_INFO << ": Isn't running..."; return; } readRadioInternal(false); // We don't force the radio reading. //qDebug() << Q_FUNC_INFO << " - END"; } void HamLibClass::setMode(const QString &_m) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << "HamLibClass::setMode: " << _m ; if ((!isRunning()) || (readOnlyMode)) { //qDebug() << Q_FUNC_INFO << ": Not running or RO"; return; } // Check if we are already in a mode that should not be changed (CWR should not be changed to CW and so on) retcode = rig_get_mode(my_rig, RIG_VFO_CURR, &rmode, &width); if (RIG_OK != retcode) { //qDebug() << "HamLibClass::setMode: ERROR: Could not get mode: "; errorManage(Q_FUNC_INFO, retcode); } QString currentMode = hamlibMode2Mode(rmode); if (_m == currentMode) { //qDebug() << "HamLibClass::setMode: ERROR: Same mode"; return; } retcode = rig_set_mode(my_rig, RIG_VFO_CURR, mode2HamlibMode (_m), rig_passband_normal(my_rig, rig_parse_mode(_m.toLocal8Bit()))); //retcode = rig_set_mode(my_rig, RIG_VFO_CURR, rig_parse_mode(_m.toLocal8Bit()), rig_passband_normal(my_rig, rig_parse_mode(_m.toLocal8Bit()))); if (RIG_OK != retcode) { //qDebug() << "HamLibClass::setMode: ERROR: Could not set mode: " << _m; errorManage(Q_FUNC_INFO, retcode); return; } errorCount = 0; //qDebug() << "HamLibClass::setMode - END true "; return; } bool HamLibClass::isModeADIFMode(const QString &_m) { //showDebugLog(Q_FUNC_INFO, "Start"); QString _mode; _mode = _m.toUpper(); if ((_mode == "AM") || (_mode == "CW") || (_mode == "FM") || (_mode == "LSB") || (_mode == "USB") || (_mode == "RTTY") ) { return true; } else { return false; } } QString HamLibClass::hamlibMode2Mode(rmode_t _rmode) { //showDebugLog(Q_FUNC_INFO, "Start"); switch (_rmode) { case RIG_MODE_NONE: return QString(); case RIG_MODE_AM: return "AM"; case RIG_MODE_CW: return "CW"; case RIG_MODE_USB: return "USB"; case RIG_MODE_LSB: return "LSB"; case RIG_MODE_RTTY: return "RTTY"; case RIG_MODE_FM: return "FM"; case RIG_MODE_WFM: return "FM"; case RIG_MODE_CWR: return "CW"; //TODO: Check with ADIF case RIG_MODE_RTTYR: return "RTTY"; // TODO Check case RIG_MODE_AMS://TODO: Check with ADIF return "AM"; case RIG_MODE_PKTLSB: return "LSB";//TODO: Check with ADIF case RIG_MODE_PKTUSB: return "USB";//TODO: Check with ADIF case RIG_MODE_PKTFM: return "FM";//TODO: Check with ADIF case RIG_MODE_ECSSUSB: return "USB";//TODO: Check with ADIF case RIG_MODE_ECSSLSB: return "LSB";//TODO: Check with ADIF case RIG_MODE_FAX: return "FAX"; case RIG_MODE_SAM: return "AM"; //TODO: Check with ADIF case RIG_MODE_SAL: return "LSB";//TODO: Check with ADIF case RIG_MODE_SAH: return "USB";//TODO: Check with ADIF #if defined(Q_OS_OPENBSD) #else case RIG_MODE_FMN: return "FM"; //TODO: Check with ADIF #endif default: return QString(); } } rmode_t HamLibClass::mode2HamlibMode (const QString &_mode) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO << ": " << _mode; if (_mode == "USB") { return RIG_MODE_USB; } else if (_mode == "LSB") { return RIG_MODE_LSB; } else if (_mode == "CW") { return RIG_MODE_CW; } else if (_mode == "AM") { return RIG_MODE_AM; } else if (_mode == "FM") { return RIG_MODE_FM; } else if (_mode == "SSB") { if (freq_old < 10.0) { return RIG_MODE_LSB; } else { return RIG_MODE_USB; } } else { return RIG_MODE_NONE; } } bool HamLibClass::stop() { //qDebug() << Q_FUNC_INFO; timer->stop(); if (!isRunning()) { //qDebug() << Q_FUNC_INFO << " - ALready stopped - END"; return true; } int errorCode = rig_close(my_rig); //qDebug() << Q_FUNC_INFO << " - 10"; if (errorCode == RIG_OK) { errorCount = 0; //qDebug() << Q_FUNC_INFO << " rig_close OK"; errorCode = rig_cleanup(my_rig); if (errorCode == RIG_OK) { errorCount = 0; //qDebug() << Q_FUNC_INFO << " rig_cleanUp OK"; rigLaunched = false; //qDebug() << Q_FUNC_INFO << " - END true"; return true; } else { //return errorManage(Q_FUNC_INFO, retcode); errorCount++; //qDebug() << Q_FUNC_INFO << " rig_cleanup NOK: " << QString::number(errorCode); } } else { errorCount++; //qDebug() << Q_FUNC_INFO << " rig_close NOK: " << QString::number(errorCode); } //qDebug() << Q_FUNC_INFO << " - END false"; return false; } bool HamLibClass::init(bool _active) { //qDebug()<< Q_FUNC_INFO << ": " << getNameFromModelId(myrig_model); if (!_active) { //qDebug()<< Q_FUNC_INFO << ": not active, exiting"; rigLaunched = false; stop(); return false; } if ((getNameFromModelId(myrig_model)).length ()<1) { //qDebug()<< Q_FUNC_INFO << ": no rig model!"; rigLaunched = false; return false; } if (rigLaunched) { //qDebug()<< Q_FUNC_INFO << ": Already init" ; return true; } my_rig = rig_init(myrig_model); //qDebug()<< Q_FUNC_INFO << ": set after init" ; //if (my_rig == nullptr) if (!my_rig) { //qDebug()<< Q_FUNC_INFO << ": Init failed, hamlib returned fail!"; return false; } else { //qDebug()<< Q_FUNC_INFO << ": rig_init went OK!"; } // Code of DG1VS (Thank you!) if (myrig_model == RIG_MODEL_NETRIGCTL) { //qDebug()<< Q_FUNC_INFO << ": RIG_PORT_NETWORK"; // network based communication my_rig->state.rigport.type.rig = RIG_PORT_NETWORK; QString netAddPort = QString("%1:%2").arg (networkAddress).arg(networkPort); qstrncpy (my_rig->state.rigport.pathname, netAddPort.toLocal8Bit().constData(), FILPATHLEN); // the other stuff is hardcoded in hamlib! } else if (myrig_model == RIG_MODEL_FLRIG) { //qDebug()<< Q_FUNC_INFO << ": RIG_PORT_RPC"; my_rig->state.rigport.type.rig = RIG_PORT_RPC; //my_rig->state.rigport.type.rig = RIG_PORT_NETWORK; QString netAddPort = QString("%1:%2").arg (networkAddress).arg(networkPort); //qDebug()<< Q_FUNC_INFO << ": " << netAddPort; qstrncpy (my_rig->state.rigport.pathname, netAddPort.toLocal8Bit().constData(), FILPATHLEN); } else { //qDebug()<< Q_FUNC_INFO << ": !RIG_PORT_NETWORK"; //qDebug()<< Q_FUNC_INFO << ": serialport2: " << serialPort.toLocal8Bit(); my_rig->state.rigport.type.rig = RIG_PORT_SERIAL; //qstrncpy (my_rig->state.rigport.pathname, serialPort.toLocal8Bit().constData(), FILPATHLEN); QVariant aux = QVariant(serialPort); QByteArray portStr = aux.toByteArray(); const char* port = portStr.constData(); strncpy(my_rig->state.rigport.pathname, port, FILPATHLEN - 1); //qDebug()<< Q_FUNC_INFO << ": rigport: " << my_rig->state.rigport.pathname ; my_rig->state.rigport.parm.serial.rate = bauds; //qDebug()<< Q_FUNC_INFO << ": serial rate: " << QString::number(my_rig->state.rigport.parm.serial.rate) ; my_rig->state.rigport.parm.serial.data_bits = dataBits; //qDebug()<< Q_FUNC_INFO << ": data bits: " << QString::number(my_rig->state.rigport.parm.serial.data_bits) ; my_rig->state.rigport.parm.serial.stop_bits = stopBits; //qDebug()<< Q_FUNC_INFO << ": stop bits: " << QString::number(my_rig->state.rigport.parm.serial.stop_bits); my_rig->state.rigport.parm.serial.parity = sparity; //qDebug()<< Q_FUNC_INFO << ": handshake before" ; my_rig->state.rigport.parm.serial.handshake = shandshake; //qDebug()<< Q_FUNC_INFO << ": after handshake " ; // Config done } //qDebug()<< Q_FUNC_INFO << ": Rig model config " ; // Config done retcode = rig_open(my_rig); //qDebug()<< Q_FUNC_INFO << ": retcode: " << QString::number(retcode) ; if (retcode != RIG_OK) { //qDebug()<< Q_FUNC_INFO << ": Can't open: " << rigerror(retcode); rig_cleanup(my_rig); return errorManage(Q_FUNC_INFO, retcode); } //qDebug()<< Q_FUNC_INFO << ": Rig open!" ; errorCount = 0; rigLaunched = true; freq_old = 0.0; timer->start(pollInterval); //qDebug()<< Q_FUNC_INFO << ": END TRUE"; return true; } bool HamLibClass::isRunning() { //showDebugLog(Q_FUNC_INFO, "Start"); return rigLaunched; } void HamLibClass::fillRigsList() { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug()<< "HamLibClass::getRigList: StringsList before filling it: "; // Rutine to fill the rig combo boxes // Do not display debug codes when load the rig's //rig_set_debug (RIG_DEBUG_NONE); //qDebug() << "HamLibClass::getRigList-01"; // and continue... strings.clear(); //qDebug()<< "HamLibClass::getRigList: StringsList after cleaning it: "; //qDebug() << "HamLibClass::getRigList-02"; rig_load_all_backends(); //qDebug() << "HamLibClass::getRigList-10"; rig_list_foreach (addRigToList, this); //qDebug() << "HamLibClass::getRigList-11"; strings.sort(); } QStringList HamLibClass::getRigList () { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug()<< "HamLibClass::getRigList: StringsList before filling it: "; //fillRigsList (); //strings.sort(); //qDebug()<< "HamLibClass::getRigList-12 - Strings length: " << QString::number(strings.length()); return strings; } int HamLibClass::addRigToList (const struct rig_caps *caps, void *data) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug()<< "HamLibClass::addRigToList" << caps->model_name; QString name; //qDebug()<< "HamLibClass::addRigToList-10" ; //HamLibClass *r = (HamLibClass *) data; HamLibClass *r = static_cast (data); //qDebug()<< "HamLibClass::addRigToList-11" ; name = caps->model_name; //qDebug()<< "HamLibClass::addRigToList-12" ; r->rigName2RigId[name] = caps->rig_model; // We fill the equivalences between name & Id //qDebug()<< "HamLibClass::addRigToList-13: " << caps->rig_model; r->rigId2RigName[caps->rig_model] = name; //qDebug()<< "HamLibClass::addRigToList-14: " << name; r->strings << name; //qDebug()<< "HamLibClass::addRigToList-END" ; return -1; // not 0 --> we want all rigs } int HamLibClass::getModelIdFromName (const QString &_name) { //showDebugLog(Q_FUNC_INFO, "Start"); //HamLibClass *r (HamLibClass *) data; int i = -1; i = rigName2RigId[_name]; //qDebug() << Q_FUNC_INFO << "Name: " << _name << " = " << QString::number(i); return i; } QString HamLibClass::getNameFromModelId(const int _id) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << "HamLibClass::getNameFromModelId: " << QString::number(_id) << "/" << rigId2RigName.value(_id) ; return rigId2RigName.value(_id); } void HamLibClass::setModelId(const int _id) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << "HamLibClass::setModelId: " << QString::number(_id); rigLaunched = false; myrig_model = _id; } void HamLibClass::setPort(const QString &_port) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << "HamLibClass::setPort: " << _port; serialPort = _port; rigLaunched = false; //strncpy (my_rig->state.rigport.pathname, serialPort.toLocal8Bit().constData(), FILPATHLEN); //qstrncpy(myport.pathname, serialPort.toLocal8Bit().constData(), serialPort.length()+1); } void HamLibClass::setSpeed(const int _speed) { //showDebugLog(Q_FUNC_INFO, "Start"); //TODO: Check that it is a valid speed bauds = _speed; rigLaunched = false; //qDebug() << Q_FUNC_INFO << ": " << QString::number(bauds); } void HamLibClass::setDataBits(const int _data) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO << ": rec: " << QString::number(_data); if ((_data >= 5) && (_data <= 8)) { dataBits = _data; } else { dataBits = 8; } rigLaunched = false; //qDebug() << Q_FUNC_INFO << ": final: " << QString::number(dataBits); } void HamLibClass::setStop(const QString &_stop) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO << ": " << _stop; if (_stop == "OneStop") { stopBits = 1; } else if (_stop == "OneAndHalfStop") { stopBits = 3; } else if (_stop == "TwoStop") { stopBits = 2; } else { stopBits = -1; } rigLaunched = false; } void HamLibClass::setFlow(const QString &_flow) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO << ": " << _flow; flowControl = _flow.toUpper(); if (flowControl == "HARDWARE") { shandshake = RIG_HANDSHAKE_HARDWARE; } else if (flowControl == "SOFTWARE") { shandshake = RIG_HANDSHAKE_XONXOFF; } else { shandshake = RIG_HANDSHAKE_NONE; } rigLaunched = false; } void HamLibClass::setParity(const QString &_parity) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO << ": " << _parity; parity = _parity.toUpper(); if (parity == "EVEN") { sparity= RIG_PARITY_EVEN; } else if (parity == "ODD") { sparity = RIG_PARITY_ODD; } else if (parity == "SPACE") { sparity = RIG_PARITY_SPACE; } else if (parity == "MARK") { sparity = RIG_PARITY_MARK; } else { sparity = RIG_PARITY_NONE; } rigLaunched = false; } void HamLibClass::setFreq(const double _fr) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << "HamLibClass::setFreq: " << QString::number(_fr); if ((!isRunning()) || (readOnlyMode)) { return; } freq = _fr * 1000000; int retcode = rig_set_freq(my_rig, RIG_VFO_CURR, freq); if (retcode != RIG_OK) { errorManage(Q_FUNC_INFO, retcode); } else { errorCount = 0; //qDebug() << "HamLibClass::setFreq OK: " << QString::number(freq); retcode = rig_get_freq(my_rig, RIG_VFO_CURR, &freq); if (retcode == RIG_OK) { errorCount = 0; //qDebug() << "HamLibClass::setFreq read: " << QString::number(freq); } else { errorManage(Q_FUNC_INFO, retcode); } return; } } void HamLibClass::setRTS(const QString &_state) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO << ": " << _state; if (shandshake == RIG_HANDSHAKE_HARDWARE) { // Note: An attempt to control the RTS signal in the HardwareControl mode will fail with error code // set to UnsupportedOperationError, because the signal is automatically controlled by the driver. return; } if (_state.toUpper() == "TRUE") { srts = RIG_SIGNAL_ON; } else { srts = RIG_SIGNAL_OFF; } rigLaunched = false; } void HamLibClass::setDTR(const QString &_state) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO << ": " << _state; if (_state.toUpper() == "TRUE") { sdtr = RIG_SIGNAL_ON; } else { sdtr = RIG_SIGNAL_OFF; } rigLaunched = false; } void HamLibClass::checkErrorCountAndStop() { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO; if (errorCount > 10) { //qDebug() << Q_FUNC_INFO << ": Error>10 - calling stop"; stop(); } } void HamLibClass::setReadOnly(const bool _r) { //showDebugLog(Q_FUNC_INFO, "Start"); readOnlyMode = _r; } void HamLibClass::setNetworkAddress(const QString &_address) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO << ": " << _address; networkAddress = _address; rigLaunched = false; } void HamLibClass::setNetworkPort(const int _port) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO << ": " << QString::number(_port); if ((_port>0) && (_port<65535)) { networkPort = _port; } rigLaunched = false; } bool HamLibClass::errorManage(const QString &_func, const int _errorcode) { //showDebugLog(Q_FUNC_INFO, "Start"); //qDebug() << Q_FUNC_INFO << ": " << _func << ": error: " << QString::number(_errorcode); Q_UNUSED(_func); if (RIG_OK == _errorcode) { //qDebug() << Q_FUNC_INFO << " - RIG_OK"; return true; } switch (_errorcode) { case (RIG_EINVAL): //qDebug() << Q_FUNC_INFO << ": Error: 1 invalid parameter"; break; case (RIG_ECONF): //qDebug() << Q_FUNC_INFO << ": Error: 2 invalid configuration (serial,..) "; break; case (RIG_ENOMEM): //qDebug() << Q_FUNC_INFO << ": Error: 3 memory shortage"; break; case (RIG_ENIMPL): //qDebug() << Q_FUNC_INFO << ": Error: 4 function not implemented, but will be "; break; case (RIG_ETIMEOUT): //qDebug() << Q_FUNC_INFO << ": Error: 5 communication timed ou"; break; case (RIG_EIO): //qDebug() << Q_FUNC_INFO << ": Error: 6 IO error, including open failed"; break; case (RIG_EINTERNAL): //qDebug() << Q_FUNC_INFO << ": Error: 7 Internal Hamlib error, huh!"; break; case (RIG_EPROTO): //qDebug() << Q_FUNC_INFO << ": Error: 9 Command rejected by the rig"; break; case (RIG_ETRUNC): //qDebug() << Q_FUNC_INFO << ": Error: 10 Command performed, but arg truncated"; break; case (RIG_ENAVAIL): //qDebug() << Q_FUNC_INFO << ": Error: 11 Function not available"; break; case (RIG_ENTARGET): //qDebug() << Q_FUNC_INFO << ": Error: 12 VFO not targetable"; break; case (RIG_BUSERROR): //qDebug() << Q_FUNC_INFO << ": Error: 13 Error talking on the bus"; break; case (RIG_BUSBUSY): //qDebug() << Q_FUNC_INFO << ": Error: 14 Collision on the bus"; break; case (RIG_EARG): //qDebug() << Q_FUNC_INFO << ": Error: 15 NULL RIG handle or any invalid pointer parameter in get arg"; break; case (RIG_EVFO): //qDebug() << Q_FUNC_INFO << ": Error: 16 Invalid VFO"; break; case (RIG_EDOM): //qDebug() << Q_FUNC_INFO << ": Error: 17 Argument out of domain of func"; break; default: //qDebug() << Q_FUNC_INFO << ": Error: ?? Unknown error"; break; } if (_errorcode == RIG_EINVAL || _errorcode == RIG_ENIMPL || _errorcode == RIG_ERJCTED \ || _errorcode == RIG_ETRUNC || _errorcode == RIG_ENAVAIL || _errorcode == RIG_ENTARGET \ || _errorcode == RIG_EVFO || _errorcode == RIG_EDOM) { //qDebug() << Q_FUNC_INFO << ": Soft error: Invalid parameters - No reason to re-initialize the hardware"; } if (errorCount<10) { errorCount++; //qDebug() << Q_FUNC_INFO << ": RIG NOK for Mode: - " << QString::number(errorCount); return false; } else { //qDebug() << Q_FUNC_INFO << ": RIG NOK for Mode"; //qDebug() << Q_FUNC_INFO << ": Calling stop"; stop(); return false; } } /*void HamLibClass::showDebugLog(const QString &_func, const QString &_log) { #ifdef QT_DEBUG //qDebug() << _func << ": " << _log; #else #endif } */ bool HamLibClass::loadSettings() { //qDebug() << Q_FUNC_INFO << " - Start"; Utilities util(Q_FUNC_INFO); QSettings settings(util.getCfgFile (), QSettings::IniFormat); settings.beginGroup ("HamLib"); setModelId(settings.value ("HamLibRigType").toInt()); setPort(settings.value ("HamlibSerialPort").toString()); setSpeed(settings.value ("HamlibSerialBauds", 9600).toInt ()); setDataBits(settings.value ("HamLibSerialDataBits", 8).toInt ()); setStop(settings.value ("HamLibSerialStopBit", "OneStop").toString()); setFlow(settings.value ("HamLibSerialFlowControl", "None").toString()); setParity(settings.value ("HamLibSerialParity", "Even").toString()); setPoll(settings.value ("HamlibRigPollRate", 2000).toInt ()); setReadOnly(settings.value ("HamlibReadOnly", false).toBool ()); setNetworkAddress (settings.value ("HamlibNetAddress").toString()); setNetworkPort (settings.value ("HamlibNetPort", 4532).toInt ()); settings.endGroup (); return true; } klog-2.3.3/klog.10000644000015700001710000000271314542412415013356 0ustar jenkinsjenkins.TH KLog 1 "version 1.4" "Jaime Robles, EA4K" "Hamradio" .SH "NAME" klog \- The Ham Radio Logging program .SH SYNOPSIS \fBklog\fR \fI[option]\fR .SH OPTIONS A summary of options is included below. .TP \fB\-\-help\fR Show summary of options. .TP \fB\-\-version\fR Output version information and exit. .SH DESCRIPTION \fBklog\fR is a ham radio logging program for GNU/Linux, macOS and Windows. With KLog you can log your QSOs and save it in ADIF format. KLog helps you to manage DXCC, WAZ and IOTA award. .SH USAGE Enter you QSO data in the top left box while entity data, direction and other usefull information will be shown in the top right box. .P Previous QSOs are shown in the botton box where you can click to edit them. .P Here is a list of keys that can be used to navigate through klog: .TP \fIControl a\fR: Add a QSO. .TP \fIControl d\fR: Delete a selected QSO. .SH PRINTING KLog has a very basic printing feature implemented. .SH PREFERENCES You can edit the ~/.klog/klogrc file to setup you call and locator. .P All the data files are saved in the KLog home directory (~/.klog) by default. .SH FILES \fI/usr/share/klog/cty.csv\fR contains the DXCC entries read by KLog. \fI~/.klog/logbook.dat.\fR contains all the logbook and information of KLog. .SH AUTHORS KLog was written by Jaime Robles, EA4K Download the last version from: https://www.klog.xyz Calculation of heading and distance was taken from Loccalc code by Marco Bersani, IK2PIH. klog-2.3.3/updatesatsdata.cpp0000644000015700001710000002445414542412415016061 0ustar jenkinsjenkins/*************************************************************************** updatesatsdata.cpp - description ------------------- begin : sep 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "updatesatsdata.h" UpdateSatsData::UpdateSatsData(DataProxy_SQLite *dp, QObject *parent) : QObject(parent) { util = new Utilities(Q_FUNC_INFO); dataProxy = dp; } UpdateSatsData::~UpdateSatsData() { delete(util); } bool UpdateSatsData::satDataFileRead(const QString& tfileName) { //qDebug() << "UpdateSatsData::satDataFileRead: " << tfileName; QString fileName = tfileName; bool errorFound = true; QFile file( fileName ); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << "UpdateSatsData::satDataFileRead File not found" << fileName; return false; } if (dataProxy->clearSatList()) { //qDebug() << "UpdateSatsData::satDataFileRead Sats YES deleted" ; } else { //qDebug() << "UpdateSatsData::satDataFileRead Sats NOT deleted" ; return false; } int numberOfSats = 0; bool hasEOH = false; //bool inHeader = true; QString line = QString(); bool noMoreRegisters = false; qint64 pos; //Position in the file bool haveId = false; bool haveName = false; //bool haveUpLink = false; //bool haveDownLink = false; //bool haveMode = false; pos = file.pos(); while ( !file.atEnd() && !hasEOH) { line = (file.readLine()).toUpper(); numberOfSats = numberOfSats + line.count("EOR>"); if ((line.count("")>0) && (!hasEOH)) { errorFound = false; hasEOH = true; pos = file.pos(); } } file.seek(pos); QProgressDialog progress(tr("Reading Satellites data file..."), tr("Abort reading"), 0, numberOfSats, nullptr); progress.setWindowModality(Qt::ApplicationModal); progress.setVisible(true); progress.setValue(0); progress.setMaximum(numberOfSats); //qDebug() << "UpdateSatsData::satDataFileRead: END OF HEADER" ; //file.seek(pos); //START reading SAT data... //qDebug() << "UpdateSatsData::satDataFileRead: Start reading data" ; QStringList fields, fieldToAnalyze;//, qsToPass; fields.clear(); fieldToAnalyze.clear(); QString aux = QString(); QString field, data; //int tagLength = 0; //int dataLength = 0; QString satID = QString(); QString satName = QString(); QString satUpLink = QString(); QString satDownLink = QString(); QString satMode = QString(); while (!noMoreRegisters) { //qDebug() << "UpdateSatsData::satDataFileRead: While Start" ; if (!file.atEnd()) { line.clear(); line.append(file.readLine().trimmed().toUpper()); fields.clear(); //qDebug() << "UpdateSatsData::satDataFileRead-line:" << line; fields << line.split("<", QT_SKIP); foreach (aux, fields) { aux = aux.simplified(); //qDebug() << "UpdateSatsData::satDataFileRead-aux:" << aux; fieldToAnalyze = util->getValidADIFFieldAndData("<" + aux); if (fieldToAnalyze.size() == 2) { field = fieldToAnalyze.at(0); data = fieldToAnalyze.at(1); //qDebug() << "UpdateSatsData::satDataFileRead-Field:" << field; //qDebug() << "UpdateSatsData::satDataFileRead-Data:" << data; if (field == "EOR") { //qDebug() << "UpdateSatsData::satDataFileRead - EOR DETECTED!"; if (haveId && haveName) { //qDebug() << "UpdateSatsData::satDataFileRead - EOR DETECTED and have it all!"; haveId = false; haveName = false; //haveUpLink = false; //haveDownLink = false; //haveMode = false; if (!dataProxy->addSatellite(satID, satName, satDownLink,satUpLink, satMode)) { //errorFound = true; return false; } //qDebug() << "UpdateSatsData::satDataFileRead - Satellite added: " << satID; satID = QString(); satName = QString(); satUpLink = QString(); satDownLink = QString(); satMode = QString(); } else { haveId = false; haveName = false; //haveUpLink = false; //haveDownLink = false; //haveMode = false; satID = QString(); satName = QString(); satUpLink = QString(); satDownLink = QString(); satMode = QString(); } } else { if (field == "APP_KLOG_SATS_ARRLID") { satID = data; haveId = true; //qDebug() << "UpdateSatsData::satDataFileRead - Detected: " << "APP_KLOG_SATS_ARRLID"; } else if (field == "APP_KLOG_SATS_NAME") { satName = data; haveName = true; //qDebug() << "UpdateSatsData::satDataFileRead - Detected: " << "APP_KLOG_SATS_NAME"; } else if (field == "APP_KLOG_SATS_UPLINK") { satUpLink = data; //haveUpLink = true; //qDebug() << "UpdateSatsData::satDataFileRead - Detected: " << "APP_KLOG_SATS_UPLINK"; } else if (field == "APP_KLOG_SATS_DOWNLINK") { satDownLink = data; //haveDownLink = true; //qDebug() << "UpdateSatsData::satDataFileRead - Detected: " << "APP_KLOG_SATS_DOWNLINK"; } else if (field == "APP_KLOG_SATS_MODE") { satMode = data; //haveMode = true; //qDebug() << "UpdateSatsData::satDataFileRead - Detected: " << "APP_KLOG_SATS_MODE"; } else if (field == "APP_KLOG_DATA") { //qDebug() << "UpdateSatsData::satDataFileRead - Detected: " << "APP_KLOG_DATA"; if (data != "SATS") { return false; } } } } //qDebug() << "UpdateSatsData::satDataFileRead: foreach end" ; } //qDebug() << "UpdateSatsData::satDataFileRead: out of foreach" ; } else { noMoreRegisters = true; } //qDebug() << "UpdateSatsData::satDataFileRead: While END" ; } if (errorFound) { //qDebug() << "UpdateSatsData::satDataFileRead: errorFound = true" ; return false; } else { //qDebug() << "UpdateSatsData::satDataFileRead: END" ; emit satsUpdatedSignal(true); QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("The Satellites information has been updated.")); msgBox.exec(); } //qDebug() << "UpdateSatsData::satDataFileRead: END " ; return true; } bool UpdateSatsData::readSatDataFile() { //qDebug() << Q_FUNC_INFO << " - Start"; //QString fileName = QFileDialog::getOpenFileName(0, tr("Open File"), "/home", "Sat data (*.dat)"); QString fileName = QFileDialog::getOpenFileName(nullptr, tr("Open File"), util->getHomeDir(), tr("Sat Data") + "(*.dat)"); if (fileName.isNull()) { return false; } else { return satDataFileRead(fileName); } //qDebug() << Q_FUNC_INFO << " - END"; } klog-2.3.3/fileawardmanager.h0000644000015700001710000000450714542412415016005 0ustar jenkinsjenkins#ifndef KLOG_FILEAWARDMANAGER_H #define KLOG_FILEAWARDMANAGER_H /*************************************************************************** fileawardmanager.h - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles user : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include "utilities.h" #include "dataproxy_sqlite.h" #include "world.h" class FileAwardManager : public QWidget { Q_OBJECT public: explicit FileAwardManager(DataProxy_SQLite *dp, const QString &_parentFunction); ~FileAwardManager(); bool importNewAwardFile(); signals: public slots: private: void showError(const QString &_header, const QString &_msg, const QString &_detailedMsg); DataProxy_SQLite *dataProxy; Utilities *util; World *world; }; #endif // FILEAWARDMANAGER_H klog-2.3.3/logviewsortfilterproxymodel.h0000644000015700001710000000635014542412415020427 0ustar jenkinsjenkins/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** BSD License Usage ** Alternatively, you may use this file under the terms of the BSD license ** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of The Qt Company Ltd nor the names of its ** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef LOGVIEWSORTFILTERPROXYMODEL_H #define LOGVIEWSORTFILTERPROXYMODEL_H #include #include //! [0] class LogViewSortFilterProxyModel: public QSortFilterProxyModel { Q_OBJECT public: LogViewSortFilterProxyModel(QObject *parent = nullptr); //QDate filterMinimumDate() const { return minDate; } //void setFilterMinimumDate(const QDate &date); //QDate filterMaximumDate() const { return maxDate; } //void setFilterMaximumDate(const QDate &date); protected: //bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override; bool lessThan(const QModelIndex &left, const QModelIndex &right) const override; private: //bool dateInRange(const QDate &date) const; //QDate minDate; //QDate maxDate; }; //! [0] #endif // LOGVIEWSORTFILTERPROXYMODEL_H klog-2.3.3/NEWS0000644000015700001710000000017514542412415013037 0ustar jenkinsjenkinsLook at https://www.klog.xyz for NEWS of KLog. You can also check the Changelog file for the latest updates in the software. klog-2.3.3/INSTALL-es.txt0000644000015700001710000000034014542412415014606 0ustar jenkinsjenkinsEste fichero es sobre el proceso de instalación de KLog: Por favor, lea:: INSTALL-linux.txt para instrucciones de linux. INSTALL-macOS.txt para instrucciones en macOS. INSTALL-win.txt para instrucciones en Windowns.. klog-2.3.3/dxccstatuswidget.cpp0000644000015700001710000010173214542412415016436 0ustar jenkinsjenkins/*************************************************************************** dxccstatuswidget.cpp - description ------------------- begin : feb 2016 copyright : (C) 2016 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "dxccstatuswidget.h" //#include /* TODO: Adjust the header columns TODO: Add some color to the texts depending on C, W or - TODO: Call the creation of this depending on the bands that the user is using */ DXCCStatusWidget::DXCCStatusWidget(DataProxy_SQLite *dp, const QString &_parentFunction, QWidget *parent) : QWidget(parent) { Q_UNUSED(_parentFunction); #ifdef QT_DEBUG //qDebug() << "DXCCStatusWidget::DXCCStatusWidget from: " << _parentFunction; #else #endif dataProxy = dp; locator = new Locator(); awards = new Awards(dataProxy, Q_FUNC_INFO); //qDebug() << "DXCCStatusWidget::DXCCStatusWidget-1"; world = new World(dataProxy,Q_FUNC_INFO); //qDebug() << "DXCCStatusWidget::DXCCStatusWidget-2"; dxccView = new QTableWidget; //qDebug() << "DXCCStatusWidget::DXCCStatusWidget-3"; dxccView->setMouseTracking(true); dxccView->setSortingEnabled(true); numberOfColumns = 0; logNumber = -1; // -1 means that ALL the logs will be used (if showAllLogsButton is not checked) tempLog = -1; // -1 means that ALL the logs will be used loc = QString(); refreshButton = new QPushButton; bandNames.clear(); validBands.clear(); //qDebug() << "DXCCStatusWidget::DXCCStatusWidget-4"; //setDefaultBands(); //qDebug() << "DXCCStatusWidget::DXCCStatusWidget-5"; createUI(); //qDebug() << "DXCCStatusWidget::DXCCStatusWidget - END"; } DXCCStatusWidget::~DXCCStatusWidget() { delete(locator); delete(world); delete(awards); } void DXCCStatusWidget::createUI() { emit debugLog (Q_FUNC_INFO, "Start", Debug); //qDebug() << "DXCCStatusWidget::createUI "; // We remove the vertical header hv = dxccView->verticalHeader(); hv->hide(); hv->setStretchLastSection(true); hh = dxccView->horizontalHeader(); //qDebug() << "DXCCStatusWidget::createUI-10"; refreshButton->setText(tr("Update")); //qDebug() << "DXCCStatusWidget::createUI-11"; dxccView->setContextMenuPolicy(Qt::CustomContextMenu); //qDebug << "DXCCStatusWidget::createUI-12 - setting column count: " << QString::number(numberOfColumns); dxccView->setColumnCount(numberOfColumns); //qDebug() << "DXCCStatusWidget::createUI-13"; dxccView->horizontalHeader()->setStretchLastSection(true); //qDebug() << "DXCCStatusWidget::createUI-14"; dxccView->setRowCount(0); //qDebug() << "DXCCStatusWidget::createUI-20"; QHBoxLayout *bottonLineLayout = new QHBoxLayout; bottonLineLayout->addSpacerItem(new QSpacerItem(10,0,QSizePolicy::Expanding,QSizePolicy::Maximum)); bottonLineLayout->addWidget(refreshButton); QVBoxLayout *tabLayout = new QVBoxLayout; tabLayout->addWidget(dxccView); tabLayout->addLayout(bottonLineLayout); setLayout(tabLayout); //qDebug() << "DXCCStatusWidget::createUI-30"; dxccView->resizeColumnsToContents(); dxccView->resizeRowsToContents(); //qDebug() << "DXCCStatusWidget::createUI-90"; connect(refreshButton, SIGNAL(clicked()), this, SLOT(slotRefreshButtonClicked() ) ); //qDebug() << "DXCCStatusWidget::createUI-91"; connect(dxccView, SIGNAL(itemDoubleClicked(QTableWidgetItem *)), this, SLOT(slotItemDoubleClicked(QTableWidgetItem *) ) ); //qDebug() << "DXCCStatusWidget::createUI-92"; connect(dxccView, SIGNAL(itemEntered(QTableWidgetItem *)), this, SLOT(slotItemEntered(QTableWidgetItem *) ) ); //connect(dxccView, SIGNAL(customContextMenuRequested( const QPoint& ) ), this, SLOT(slotRightButton( const QPoint& ) ) ); //qDebug() << "DXCCStatusWidget::createUI-93"; //dxccView->setSortingEnabled(false); //qDebug() << "DXCCStatusWidget::createUI-END"; emit debugLog (Q_FUNC_INFO, "END", Debug); } void DXCCStatusWidget::update() { emit debugLog (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << ": " << QTime::currentTime().toString("HH:mm:ss"); //int entities = world->getHowManyEntities(); int entities = dataProxy->getMaxEntityID(false); if (!awards->updateDXCCBandsStatus (-1)) // We update all { //qDebug() << Q_FUNC_INFO << "awards->updateDXCCBandsStatus returned FALSE"; // It may be the case that DXCC field in the table is not defined. // It should be updated. QMessageBox msgBox; msgBox.setIcon(QMessageBox::Question); msgBox.setText(tr("It seems that the DXCC status in your database is not updated and KLog can't find any dxcc information. You can try to fix this by updating the log.")); msgBox.setInformativeText(tr("Do you want to update your DXCC status?")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: //qDebug() << Q_FUNC_INFO << " - emitting fillInQSOSignal()"; emit fillInQSOSignal(); return; break; case QMessageBox::No: // No was clicked return; break; default: // should never be reached break; } } else { //qDebug() << Q_FUNC_INFO << "awards->updateDXCCBandsStatus returned TRUE"; } //qDebug() << Q_FUNC_INFO << "AFTER awards->updateDXCCBandsStatus returned"; QList bandIds; bandIds.clear(); QString aux; foreach (aux, bandNames) { bandIds.append (dataProxy->getIdFromBandName (aux)); } //qDebug() << "DXCCStatusWidget::update: " << QString::number(entities) << " entities to update" << QTime::currentTime().toString("HH:mm:ss"); QList list; //qDebug() << "DXCCStatusWidget::update: -1" << QTime::currentTime().toString("HH:mm:ss"); list.clear(); //qDebug() << "DXCCStatusWidget::update: -2" << QTime::currentTime().toString("HH:mm:ss"); //QString prefix; //qDebug() << "DXCCStatusWidget::update: -3" << QTime::currentTime().toString("HH:mm:ss"); if (dxccView->columnCount()>0) { dxccView->clearContents(); //qDebug() << "DXCCStatusWidget::update pre FOR" << QTime::currentTime().toString("HH:mm:ss"); for (int i=1; i<=entities; i++) { //qDebug() << "DXCCStatusWidget::update in FOR " << QString::number(i) << QTime::currentTime().toString("HH:mm:ss"); list.clear(); //if (aux.length()>2) // Not all integers refers to an entity. //{ list.append (i); list.append (bandIds); addEntity(list); //} } } emit debugLog (Q_FUNC_INFO, "END", Debug); //qDebug() << "DXCCStatusWidget::update END" << QTime::currentTime().toString("HH:mm:ss"); } void DXCCStatusWidget::addEntity(const QList &_ent) { emit debugLog (Q_FUNC_INFO, "Start", Debug); // _ent.at(0) = dxcc column of Entity Table (considering big numbers, like 2248 for IT9!) // _ent.at(1) until number of Columns are just the bandnames //qDebug() << "DXCCStatusWidget::addEntity: " << QString::number(_ent.at(0)) << "/" <getEntiNameISOAndPrefixFromId(_dxcc); if (data.length ()!=3) { //qDebug() << "DXCCStatusWidget::addEntity: Wrong Entity Name and Prefix - END" << QTime::currentTime().toString("HH:mm:ss"); return; } QString prefix = data.at(0); QString entName = data.at(1); QString isoName = data.at(2); if ((entName.length()<2) || (prefix.length ()<1) || (isoName.length ()<2)) { //qDebug() << "DXCCStatusWidget::addEntity: ERROR: entname too short!" << QTime::currentTime().toString("HH:mm:ss"); return; } QString flagSt; flagSt.clear(); if (isoName.length()>1) { //flagSt = ":/" + isoName + ".png"; flagSt = ":/flags/" + isoName + ".png"; } else { flagSt.clear(); } //flagSt = ":/flags/" + isoName + ".png"; QIcon flagIcon(flagSt); //qDebug() << "DXCCStatusWidget::addEntity: Name: " << entName << QTime::currentTime().toString("HH:mm:ss"); //qDebug() << "DXCCStatusWidget::addEntity: Prefix: " << prefix << QTime::currentTime().toString("HH:mm:ss"); //qDebug() << "DXCCStatusWidget::addEntity: Flag: " << flagSt << QTime::currentTime().toString("HH:mm:ss"); dxccView->insertRow(dxccView->rowCount()); //qDebug() << "DXCCStatusWidget::addEntity: rowCount: " << QString::number(dxccView->rowCount()) << QTime::currentTime().toString("HH:mm:ss"); QTableWidgetItem *newItemID = new QTableWidgetItem(prefix); newItemID->setTextAlignment(Qt::AlignCenter); newItemID->setFlags(Qt::NoItemFlags); dxccView->setItem(dxccView->rowCount()-1, 0, newItemID); for (int i=1; i < _ent.length(); i++) { //qDebug() << Q_FUNC_INFO << ": " << prefix << " - i = " << QString::number(i) << "/" << _ent.at(i); int bandid = _ent.at(i); QTableWidgetItem *newItem = new QTableWidgetItem(awards->getDXCCStatusBand(_dxcc, bandid)); //QTableWidgetItem *newItem = new QTableWidgetItem(awards->getDXCCStatusBand2(_dxcc, bandid, tempLog)); newItem->setTextAlignment(Qt::AlignCenter); newItem->setFlags(Qt::ItemIsEnabled); //qDebug() << Q_FUNC_INFO << ": C/W/- : " << newItem->text(); if (newItem->text()=="C") { newItem->setForeground (QBrush(Qt::blue)); //newItem->setTextColor(Qt::blue); newItem->setBackground(QBrush(Qt::green)); status = 1; } else if (newItem->text()=="W") { if (status < 0) { status = 0; } newItem->setForeground (QBrush(Qt::red)); newItem->setBackground(QBrush(Qt::yellow)); } dxccView->setItem(dxccView->rowCount()-1, i+1, newItem); //qDebug() << "DXCCStatusWidget::addEntity: rowCount-2: " << QString::number(dxccView->rowCount()) << "/" << QString::number(i) << " / " << newItem->text() << QTime::currentTime().toString("HH:mm:ss"); } QTableWidgetItem *newItemPref = new QTableWidgetItem(prefix); newItemPref->setTextAlignment(Qt::AlignLeft|Qt::AlignVCenter); newItemPref->setFlags(Qt::ItemIsEnabled); QTableWidgetItem *newItemName = new QTableWidgetItem(entName); newItemName->setTextAlignment(Qt::AlignLeft|Qt::AlignVCenter); newItemName->setFlags(Qt::ItemIsEnabled); //newItemName->setFlags(Qt::ItemIsUserCheckable); newItemName->setIcon(flagIcon); if (status == 1) { newItemName->setForeground (QBrush(Qt::blue)); newItemName->setBackground(QBrush(Qt::green)); } else if (status == 0) { newItemName->setForeground(QBrush(Qt::darkRed)); newItemPref->setForeground(QBrush(Qt::darkRed)); } else { newItemName->setForeground(QBrush(Qt::red)); newItemPref->setForeground(QBrush(Qt::red)); } dxccView->setItem(dxccView->rowCount()-1, 0, newItemPref); dxccView->setItem(dxccView->rowCount()-1, 1, newItemName); //qDebug() << "DXCCStatusWidget::addEntity: END" << QTime::currentTime().toString("HH:mm:ss"); emit debugLog (Q_FUNC_INFO, "END", Debug); } void DXCCStatusWidget::addEntity2(const QStringList &_ent) { emit debugLog (Q_FUNC_INFO, "Start", Debug); // _ent.at(0) = dxcc column of Entity Table (considering big numbers, like 2248 for IT9!) // _ent.at(1) until number of Columns are just the bandnames //qDebug() << Q_FUNC_INFO; // DXCC id, Entity Name, bandName1, bandName2, ... //QString au = "New Line "; //foreach (QString a, _ent) //{ // au = au + " - " + a; //} //qDebug() << Q_FUNC_INFO << ": " << au << " - " << QTime::currentTime().toString("HH:mm:ss");; if (_ent.length() != numberOfColumns-1) { //qDebug() << "DXCCStatusWidget::addEntity: ERROR: in number of columns" << QString::number(_ent.length()) << "/" << QString::number(numberOfColumns) << QTime::currentTime().toString("HH:mm:ss"); return; } int status = -1; //qDebug() << "DXCCStatusWidget::addEntity: ent = " << _ent << QTime::currentTime().toString("HH:mm:ss"); int _dxcc = _ent.at(0).toInt(); QStringList data; data.clear(); data << dataProxy->getEntiNameISOAndPrefixFromId(_dxcc); if (data.length ()!=3) { //qDebug() << "DXCCStatusWidget::addEntity: Wrong Entity Name and Prefix - END" << QTime::currentTime().toString("HH:mm:ss"); return; } //au = "data: "; //foreach (QString a, data) //{ // au = au + " - " + a; //} //qDebug() << Q_FUNC_INFO << ": " << au; QString prefix = data.at(0); QString entName = data.at(1); QString isoName = data.at(2); if ((entName.length()<2) || (prefix.length ()<1) || (isoName.length ()<2)) { //qDebug() << "DXCCStatusWidget::addEntity: ERROR: entname too short!" << QTime::currentTime().toString("HH:mm:ss"); return; } QString flagSt; flagSt.clear(); if (isoName.length()>1) { flagSt = ":/" + isoName + ".png"; } else { flagSt.clear(); } flagSt = ":/flags/" + isoName + ".png"; QIcon flagIcon(flagSt); //qDebug() << "DXCCStatusWidget::addEntity: Name: " << entName << QTime::currentTime().toString("HH:mm:ss"); //qDebug() << "DXCCStatusWidget::addEntity: Prefix: " << prefix << QTime::currentTime().toString("HH:mm:ss"); //qDebug() << "DXCCStatusWidget::addEntity: Flag: " << flagSt << QTime::currentTime().toString("HH:mm:ss"); dxccView->insertRow(dxccView->rowCount()); //qDebug() << "DXCCStatusWidget::addEntity: rowCount: " << QString::number(dxccView->rowCount()) << QTime::currentTime().toString("HH:mm:ss"); QTableWidgetItem *newItemID = new QTableWidgetItem(prefix); newItemID->setTextAlignment(Qt::AlignCenter); newItemID->setFlags(Qt::NoItemFlags); dxccView->setItem(dxccView->rowCount()-1, 0, newItemID); awards->updateDXCCBandsStatus (tempLog); for (int i=1; i < _ent.length(); i++) { //qDebug << Q_FUNC_INFO << ": " << prefix << " - i = " << QString::number(i) << "/" << _ent.at(i); int bandid = dataProxy->getIdFromBandName(_ent.at(i)); QTableWidgetItem *newItem = new QTableWidgetItem(awards->getDXCCStatusBand(_dxcc, bandid)); //QTableWidgetItem *newItem = new QTableWidgetItem(awards->getDXCCStatusBand2(_dxcc, bandid, tempLog)); newItem->setTextAlignment(Qt::AlignCenter); newItem->setFlags(Qt::ItemIsEnabled); if (newItem->text()=="C") { newItem->setForeground (QBrush(Qt::blue)); //newItem->setTextColor(Qt::blue); newItem->setBackground(QBrush(Qt::green)); status = 1; } else if (newItem->text()=="W") { if (status < 0) { status = 0; } newItem->setForeground (QBrush(Qt::red)); newItem->setBackground(QBrush(Qt::yellow)); } dxccView->setItem(dxccView->rowCount()-1, i+1, newItem); //qDebug() << "DXCCStatusWidget::addEntity: rowCount-2: " << QString::number(dxccView->rowCount()) << "/" << QString::number(i) << " / " << newItem->text() << QTime::currentTime().toString("HH:mm:ss"); } QTableWidgetItem *newItemPref = new QTableWidgetItem(prefix); newItemPref->setTextAlignment(Qt::AlignLeft|Qt::AlignVCenter); newItemPref->setFlags(Qt::ItemIsEnabled); QTableWidgetItem *newItemName = new QTableWidgetItem(entName); newItemName->setTextAlignment(Qt::AlignLeft|Qt::AlignVCenter); newItemName->setFlags(Qt::ItemIsEnabled); //newItemName->setFlags(Qt::ItemIsUserCheckable); newItemName->setIcon(flagIcon); if (status == 1) { newItemName->setForeground (QBrush(Qt::blue)); newItemName->setBackground(QBrush(Qt::green)); } else if (status == 0) { newItemName->setForeground(QBrush(Qt::darkRed)); newItemPref->setForeground(QBrush(Qt::darkRed)); } else { newItemName->setForeground(QBrush(Qt::red)); newItemPref->setForeground(QBrush(Qt::red)); } dxccView->setItem(dxccView->rowCount()-1, 0, newItemPref); dxccView->setItem(dxccView->rowCount()-1, 1, newItemName); //qDebug() << "DXCCStatusWidget::addEntity: END" << QTime::currentTime().toString("HH:mm:ss"); emit debugLog (Q_FUNC_INFO, "END", Debug); } void DXCCStatusWidget::setBands(const QString &_callingFunc, QStringList const &_ent, const bool _creating) {// Receives the list of band names and defines the columns //qDebug() << Q_FUNC_INFO << "(" << _callingFunc << ")" << QTime::currentTime().toString("HH:mm:ss"); Q_UNUSED(_callingFunc); //foreach(QString aux, _ent) //{ // //qDebug << Q_FUNC_INFO << ": " << aux; //} emit debugLog (Q_FUNC_INFO, "Start", Debug); QStringList qs; qs.clear(); //qDebug() << "DXCCStatusWidget::setBands - 01" << QTime::currentTime().toString("HH:mm:ss"); qs << dataProxy->sortBandNamesBottonUp(_ent); //qDebug() << "DXCCStatusWidget::setBands - 02: Lenght qs: " << QString::number(qs.size()) << QTime::currentTime().toString("HH:mm:ss"); if (qs.length()<0) { //qDebug() << "DXCCStatusWidget::setBands no bands received here " << QTime::currentTime().toString("HH:mm:ss") << QTime::currentTime().toString("HH:mm:ss"); return; } QString testBand; testBand.clear(); bandNames.clear(); //qDebug() << "DXCCStatusWidget::setBands - 03 " << QTime::currentTime().toString("HH:mm:ss"); validBands.clear(); validBands = dataProxy->getBandNames(); //qDebug() << "DXCCStatusWidget::setBands - 04 " << QTime::currentTime().toString("HH:mm:ss"); dxccView->clearSelection(); dxccView->clear(); for (int i = 0; isetColumnCount(0); numberOfColumns = dxccView->columnCount(); while(dxccView->columnCount()>0) { //qDebug() << "DXCCStatusWidget::setBands: Still pending: " << QString::number(dxccView->columnCount()) << QTime::currentTime().toString("HH:mm:ss"); dxccView->removeColumn(0); } numberOfColumns = dxccView->columnCount(); //qDebug() << "DXCCStatusWidget::setBands: -6 All removed: " << QString::number(numberOfColumns) << QTime::currentTime().toString("HH:mm:ss"); numberOfColumns = 2 + bandNames.length(); //Prefix, Entity Name //qDebug() << "DXCCStatusWidget::setBands - 7.1 - columnCount: " << QString::number(dxccView->columnCount()) << QTime::currentTime().toString("HH:mm:ss"); //qDebug() << "DXCCStatusWidget::setBands - 7.1 - numberOfColumns: " << QString::number(numberOfColumns) << QTime::currentTime().toString("HH:mm:ss"); dxccView->setColumnCount(numberOfColumns); //qDebug() << "DXCCStatusWidget::setBands - 7.2 " << QTime::currentTime().toString("HH:mm:ss"); dxccView->setRowCount(0); //qDebug() << "DXCCStatusWidget::setBands - 7.3 " << QTime::currentTime().toString("HH:mm:ss"); QStringList headerqs; //qDebug() << "DXCCStatusWidget::setBands - 7.4 " << QTime::currentTime()).toString("HH:mm:ss"); headerqs.clear(); //qDebug() << "DXCCStatusWidget::setBands - 7.5 " << QTime::currentTime().toString("HH:mm:ss"); headerqs << tr("Prefix") << tr("Entity") << bandNames; //qDebug() << "DXCCStatusWidget::setBands - 8 " << QTime::currentTime().toString("HH:mm:ss"); dxccView->setHorizontalHeaderLabels(headerqs); //qDebug() << "DXCCStatusWidget::setBands - 9 PRE-END" << QTime::currentTime().toString("HH:mm:ss"); if (_creating) { //qDebug() << "DXCCStatusWidget::setBands: 9.1 !_creating so updating!" << QTime::currentTime().toString("HH:mm:ss"); update(); } //qDebug() << "DXCCStatusWidget::setBands: END" << QTime::currentTime().toString("HH:mm:ss"); emit debugLog (Q_FUNC_INFO, "Start", Debug); } void DXCCStatusWidget::setDefaultBands() { emit debugLog (Q_FUNC_INFO, "Start", Debug); //qDebug() << "DXCCStatusWidget::setDefaultBands"; /* Default bands: 160M 80M 40M 30M 20M 17M 15M 12M 10M 6M 4M 2M 70CM 28 27 25 24 23 22 21 12 19 18 17 16 14 */ bandNames.clear(); //bandNames << "160M" << "80M" << "40M" << "30M" << "20M" << "17M" << "15M" << "12M" << "10M" << "6M" << "4M" << "2M" << "70CM"; bandNames << "160M" << "80M" << "40M" << "30M" << "20M" << "17M" << "15M" << "12M" << "10M"; setBands(Q_FUNC_INFO, bandNames, false); //qDebug << "DXCCStatusWidget::setDefaultBands - END"; emit debugLog (Q_FUNC_INFO, "END", Debug); } void DXCCStatusWidget::slotRefreshButtonClicked() { emit debugLog (Q_FUNC_INFO, "Start", Debug); //qDebug() << "DXCCStatusWidget::slotRefreshButtonClicked"; //TODO: Define a way to show the status of the selected log or all the logs in the DB if (dxccView->rowCount()<1) { //qDebug() << "DXCCStatusWidget::slotRefreshButtonClicked - rowcount <1"; return; } QStringList _bands = bandNames; setBands(Q_FUNC_INFO, _bands, true); //emit updateAwards(); //update(); //qDebug << Q_FUNC_INFO << " - END"; emit debugLog (Q_FUNC_INFO, "END", Debug); } void DXCCStatusWidget::refresh() { emit debugLog (Q_FUNC_INFO, "Start", Debug); //qDebug() << "DXCCStatusWidget::refresh"; //update(); slotRefreshButtonClicked(); emit debugLog (Q_FUNC_INFO, "END", Debug); } void DXCCStatusWidget::setCurrentLog(const int _logN) { emit debugLog (Q_FUNC_INFO, "Start", Debug); //qDebug() << "DXCCStatusWidget::setCurrentLog: " << QString::number(_logN); if (dataProxy->doesThisLogExist(_logN)) { logNumber = _logN; } else { logNumber = -1; } emit debugLog (Q_FUNC_INFO, "END", Debug); } void DXCCStatusWidget::slotItemEntered(QTableWidgetItem * item ) { //qDebug << "DXCCStatusWidget::slotItemEntered: " << ((item->data(0)).toString()).simplified(); //qDebug << "DXCCStatusWidget::slotItemEntered: " << item->text(); //qDebug << "DXCCStatusWidget::slotItemEntered: "; emit debugLog (Q_FUNC_INFO, "Start", Debug); if (dxccView->rowCount()<1) { return; } QString tip; tip.clear(); //int row = -1; //int bandi = -1; //QString band = QString(); if (item) { // row = dxccView->row(item); int column = dxccView->column(item); //qDebug() << "DXCCStatusWidget::slotItemEntered: row: " << QString::number(row); //qDebug() << "DXCCStatusWidget::slotItemEntered: hrow: " << dxccView->verticalHeaderItem(row)->text(); // row = (dxccView->item(row,0)->text()).toInt(); int entiID = dataProxy->getEntityIdFromMainPrefix(dxccView->item(dxccView->row(item),0)->text()); if (entiID<0) { // Some prefix are shown with a * in the begining that is removed to show the real prefix entiID = dataProxy->getEntityIdFromMainPrefix("*" + dxccView->item(dxccView->row(item),0)->text()); } //qDebug() << "DXCCStatusWidget::slotItemEntered: entiID: " << QString::number(entiID); if ((column == 0) || (column == 1)) { //tip = tr("Pref: ") + (dxccView->item(row, 1))->text() + " - "; tip = tr("Pref: ") + dataProxy->getEntityMainPrefix(entiID) + " - "; tip = tip + tr("CQ: ") + QString::number(dataProxy->getCQzFromEntity(entiID)) + " - "; tip = tip + tr("ITU: ") + QString::number(dataProxy->getITUzFromEntity(entiID)) + " - "; QString dxLoc = locator->getLocator(dataProxy->getLongitudeFromEntity(entiID), dataProxy->getLatitudeFromEntity(entiID)) ; tip = tip + tr("Beam: ") + QString::number(locator->getBeamBetweenLocators(loc, dxLoc)); } else if (column >= 2) { if (item->text() == "-") { tip = tr("Entity not worked in this band."); } else { QString band = dxccView->horizontalHeaderItem(column)->text(); //qDebug() << "DXCCStatusWidget::slotItemEntered: band: " << band; int bandi = dataProxy->getIdFromBandName(band); //qDebug() << "DXCCStatusWidget::slotItemEntered: band: " << QString::number(bandi); if (item->text() == "C") { tip = awards->getQSOofAward(entiID, bandi, logNumber, true); } else { tip = awards->getQSOofAward(entiID, bandi, logNumber, false); } //qDebug() << "DXCCStatusWidget::slotItemEntered: tip: " << tip; if (tip.length()>3) { tip = "QSO: " + tip; } else { //tip = tr("Text TBD."); tip = tr(""); } } } else { //tip = tr("ADD: Pref: Bearing, CQ & ITU."); tip = ""; // TODO define a text to be shown when no band column is selected (maybe Continent and bearing or a link to wikipedia or whatever!) } item->setToolTip(tip); //qDebug() << "DXCCStatusWidget::slotItemEntered: tip: " << tip; } //qDebug() << "DXCCStatusWidget::slotItemEntered: END "; emit debugLog (Q_FUNC_INFO, "END", Debug); } void DXCCStatusWidget::slotItemDoubleClicked(QTableWidgetItem * item ) { emit debugLog (Q_FUNC_INFO, "Start", Debug); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: " << ((item->data(0)).toString()).simplified(); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: " << item->text(); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked - start"; if (dxccView->rowCount()<1) { return; } int row = -1; //int column = -1; //int bandi = -1; int columns = dxccView->columnCount(); int _entiNumb = -1; //Read the Entity number that the user is selecting. //QString band = QString(); QList qsos; qsos.clear(); QTableWidgetItem * it = new QTableWidgetItem(0); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - Columns: " << QString::number(columns) ; if (item) { row = dxccView->row(item); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - row: " << QString::number(row); _entiNumb= dataProxy->getEntityIdFromMainPrefix(dxccView->item(dxccView->row(item),0)->text()); if (_entiNumb<0) { // Some prefix are shown with a * in the begining that is removed to show the real prefix _entiNumb= dataProxy->getEntityIdFromMainPrefix("*" + dxccView->item(dxccView->row(item),0)->text()); } //_entiNumb = ((dxccView->item(row,0))->text()).toInt(); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - EntityNumber: " << QString::number(_entiNumb); for (int i = 2; i < columns; ++i) { //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - column: " << QString::number(i); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - column header: " << (dxccView->horizontalHeaderItem(i))->text(); //entityName = (dxccView->item(row,i))->text() ; //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - item: " ; it->setText(dxccView->item(row,i)->text()); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - column-txt: " << it->text(); QString band = dxccView->horizontalHeaderItem(i)->text(); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: band: " << band; int bandi = dataProxy->getIdFromBandName(band); //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: band: " << QString::number(bandi); int qsoId = -1; if (item->text() == "C") { qsoId = awards->getQSOIdofAward(_entiNumb, bandi, logNumber, true); } else { qsoId = awards->getQSOIdofAward(_entiNumb, bandi, logNumber, false); } //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: QSOid: " << QString::number(qsoId); if (qsoId>0) { qsos.append(qsoId); } } //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - END of for" ; if (qsos.length()>0) { //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - qsos.length = " << QString::number(qsos.length()) ; emit showQsos(qsos); } //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: - END of column == 1" ; } //qDebug() << "DXCCStatusWidget::slotItemDoubleClicked: END "; } void DXCCStatusWidget::setMyLocator(const QString &_loc) { emit debugLog (Q_FUNC_INFO, "Start", Debug); //qDebug() << "DXCCStatusWidget::setMyLocator: " << _loc; QString l = _loc; if ( locator->isValidLocator(l.toUpper()) ) { loc = l.toUpper(); } } /* void DXCCStatusWidget::slotRightButton(const QPoint& pos) { //qDebug() << "DXCCStatusWidget::slotRighButton" ; int row = (dxccView->indexAt(pos)).row(); showDXCCWikipediaAct = new QAction(tr("&Wikipedia"), this); showDXCCWikipediaAct->setShortcut(Qt::CTRL + Qt::Key_W); showDXCCWikipediaAct->setStatusTip(tr("Show this DXCC in Wikipedia")); connect(showDXCCWikipediaAct, SIGNAL(triggered()), this, SLOT(slotWikipedia())); righButtonFromLogMenu(row); } void DXCCStatusWidget::slotWikipedia() { //qDebug() << "DXCCStatusWidget::slotWikipedia: " << (showDXCCWikipediaAct->data()).toString(); //TODO: To be added to the DXCCStatusWidget and create an action that emist the QSO id //int QSOid = ((logModel->index((showDXCCWikipediaAct->data()).toInt(), 0)).data(0)).toInt(); //qDebug() << "DXCCStatusWidget::slotQsoDeleteFromLog (id): " << QString::number(QSOid); } void DXCCStatusWidget::righButtonFromLogMenu(const int trow) { //qDebug() << "DXCCStatusWidget::slotshowRighButtonFromLogMenu: " << QString::number(trow); //int _qsoID = ((logModel->index(trow, 0)).data(0)).toInt(); //qDebug() << "DXCCStatusWidget::slotshowRighButtonFromLogMenu: QSOid: " << QString::number(_qsoID); QMenu menu(this); menu.addAction(showDXCCWikipediaAct); showDXCCWikipediaAct->setData(trow); menu.exec(QCursor::pos()); } */ klog-2.3.3/downloadcty.cpp0000644000015700001710000001635014542412415015375 0ustar jenkinsjenkins/*************************************************************************** downloadcty.cpp - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "downloadcty.h" #include #include #include #include //#include DownLoadCTY::DownLoadCTY(const QString &_klogDir, const QString &_klogVersion) : QObject(0) { //qDebug() << "DownLoadCTY::DownLoadCTY(): " << _klogDir; util = new Utilities(Q_FUNC_INFO); url = new QUrl; klogDir = _klogDir; result = -1; // Error unknown manager = new QNetworkAccessManager; request = new QNetworkRequest; //request->setUrl(QUrl("https://www.country-files.com/cty/cty.csv")); request->setUrl(QUrl("https://www.country-files.com/bigcty/cty.csv")); QString ver = "KLog"+_klogVersion; QByteArray str; str.clear(); str.append(util->getAgent(_klogVersion).toUtf8()); request->setRawHeader("User-Agent", str); //request->setHeader(QNetworkRequest::UserAgentHeader, str); //qDebug() << "DownLoadCTY::DownLoadCTY() - UserAgent: " << request->rawHeader("QNetworkRequest::UserAgentHeader"); QObject::connect(manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(slotDownloadFinished(QNetworkReply*))); //qDebug() << "DownLoadCTY::DownLoadCTY(): - END" ; } DownLoadCTY::~DownLoadCTY() { delete(util); delete(request); delete(manager); delete(url); //qDebug() << "DownLoadCTY::~DownLoadCTY" ; } void DownLoadCTY::slotDownloadFinished(QNetworkReply *reply) { //qDebug() << "DownLoadCTY::slotDownloadFinished" ; emit downloadStopped(); QUrl url = reply->url(); //qDebug() << "DownLoadCTY::slotDownloadFinished - URL: " << url.toString() ; QMessageBox msgBox; QString aux; aux.clear(); if (reply->error()) { //fprintf(stderr, "Download of %s failed: %s\n", // url.toEncoded().constData(), // qPrintable(reply->errorString())); //errorCode = query.lastError().nativeErrorCode(); msgBox.setIcon(QMessageBox::Warning); aux = tr("Download of cty.csv failed with the following error code: "); msgBox.setText(aux + reply->errorString()); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } else { QString filename = saveFileName(url); if (saveToDisk(filename, reply)) { msgBox.setIcon(QMessageBox::Information); aux = tr("Download of cty.csv done."); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); emit actionReturnDownload(QNetworkReply::NoError); } //printf("Download of %s succeeded (saved to %s)\n", // url.toEncoded().constData(), qPrintable(filename)); } reply->deleteLater(); emit done(true); } int DownLoadCTY::download() { //qDebug() << "DownLoadCTY::download..."; manager->get(*request); return 1; } void DownLoadCTY::slotDownloadProgress(qint64 received, qint64 total) { //qDebug() << "DownLoadCTY::slotDownloadProgress: "; //qDebug() << "DownLoadCTY::downloadProgress: " << QString::number(received) << "/" << QString::number(total); //qDebug() << received << total; emit actionShowProgres(received, total); } void DownLoadCTY::slotErrorManagement(QNetworkReply::NetworkError networkError) { //qDebug() << "DownLoadCTY::slotErrorManagement: " << QString::number(networkError); result = networkError; if (result == QNetworkReply::NoError) { //qDebug() << "DownLoadCTY::downloadFinished: No error"; } else if (result == QNetworkReply::HostNotFoundError) { //qDebug() << "DownLoadCTY::downloadFinished: Host not found"; } else { //qDebug() << "DownLoadCTY::downloadFinished: ERROR: " << QString::number(result); } emit actionError(result); } QString DownLoadCTY::saveFileName(const QUrl &url) { //qDebug() << "DownLoadCTY::saveFileName"; QString path = url.path(); QString basename = QFileInfo(path).fileName(); QMessageBox msgBox; QString aux; aux.clear(); if (basename.isEmpty()) basename = "download"; if (QFile::exists(basename)) { msgBox.setIcon(QMessageBox::Warning); aux = tr("There is already a cty.csv file in the folder but it will be replaced with the new one."); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); // already exists, don't overwrite //int i = 0; //basename += '.'; //while (QFile::exists(basename + QString::number(i))) // ++i; //basename += QString::number(i); } return basename; } bool DownLoadCTY::saveToDisk(const QString &filename, QIODevice *data) { //qDebug() << "DownLoadCTY::saveToDisk: " << filename; QFile file(filename); QMessageBox msgBox; QString aux; aux.clear(); if (!file.open(QIODevice::WriteOnly)) { /* Flawfinder: ignore */ msgBox.setIcon(QMessageBox::Warning); aux = tr("Could not open %1 for writing").arg(filename); //aux = tr("Could not open ") + filename + tr(" for writing."); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); //fprintf(stderr, "Could not open %s for writing: %s\n", // qPrintable(filename), // qPrintable(file.errorString())); return false; } file.write(data->readAll()); file.close(); return true; } klog-2.3.3/TODO0000644000015700001710000004543314542412415013036 0ustar jenkinsjenkinsBUG: KLog needs to update the Entity DB is shown on every start KLog should update ALWAYS when receiving from LoTW the QSL_LOTW_rcvd or add the QSO if not in local log. Review the process after Setup TODO: Integrate HAMQTH https://www.hamqth.com/developers.php TODO:- New feature: Regional Award support: #include "setuppages/setuppagesubdivisions.h" TODO: Stat More frequently worked calls: "select log.call, count(log.call) from log group by log.call ORDER BY count(log.call) DESC" TODO: Stat Number of different callsigns TODO: Find "duplicated" QSOs QUERY=> SELECT call, bandid, modeid, substr(qso_date, 1, 15), COUNT(*) c FROM log GROUP BY call, bandid, modeid, substr(qso_date, 1, 15) HAVING c>1 TODO: Find duplicate queries: select call, qso_date from log where datetime('2007-07-22 09:45:00', '-5 minutes')< datetime(qso_date) AND datetime('2007-07-22 09:49:00', '+5 minutes') > datetime(qso_date) select call, qso_date, bandid, modeid, COUNT(*) c from log where datetime('2010-10-31 19:20:00', '-5 minutes')< datetime(qso_date) AND datetime('2010-10-31 19:20:00', '+5 minutes') > datetime(qso_date) group by call having c>1 RC-BUGS: TODO: Check if dxccStatusWidget in logwindow is useful and remove it if not. NONE TODO: New feature: KLog can now control a rotator through PSTRotator. TODO: UI: Added a DXCC summary obtained from the Tools menu. TBD - 0.9.8 Hamlib: COMports in Windows must follow the format: \\.\com14 for ports highet than 9 but it works also for lower so ALL should be managed that way. For next release: TODO: - Some warnings removed from compilation time. TODO: - The log can be now updated with a LoTW ADIF file import. TODO: - Isolate the Awards tab and create a widget with it. TODO: - ADD A TIP ON the DXCC tab stating Prefix, CQ, ITU & Bearing. TODO: Rework the band & mode hash tables to optimize queries (not sql queries) TODO: Rework the DXCC & WAZ hash table sto optimize queries (not SQL queries) TODO: Import LOTW (MainWindow::slotADIFImport) TODO: Remove the Querys from void SetupPageLogs:: TODO: Create a Widget with the WAZ status (copying the DXCC Status widget) Working: TODO: ADD A TIP ON the DXCC tab stating Prefix, CQ, ITU & Bearing TODO: Check how to implement qInstallMessageHandler SAT DB: https://db.satnogs.org/api/ This is a kind of roadmap for KLog development. It is not fixed... new features may be prioritized or not added without any notice ;-) Feel free to request any roadmap change if you have any suggestion. TODO: To add the support to import/export the following ADIF fields that are already existing in DB AWARD_SUBMITTED AWARD_GRANTED DARC_DOK FISTS FISTS_CC GUEST_OP "hrdlog_qso_upload_date VARCHAR(10)," "hrdlog_qso_upload_status VARCHAR(1)," "my_antenna VARCHAR," "my_dxcc INTEGER, " "my_fists INTEGER, " "my_itu_zone INTEGER ," "my_postal_code VARCHAR ," "my_sota_ref VARCHAR, " "my_usaca_counties VARCHAR, " "my_vucc_grids VARCHAR, " "silent_key VARCHAR(1), " "region VARCHAR, " "qrzcom_qso_upload_date VARCHAR(10), " "qrzcom_qso_upload_status VARCHAR(1), " "skcc VARCHAR, " "sota_ref VARCHAR, " "uksmg INTEGER, " "usaca_counties VARCHAR, " "ve_prov VARCHAR, " "vucc_grids VARCHAR, " TODO: Add a warning or periodically ADIF export so data is backup TODO: Create a function to look for QSO without a DXCC and ask the user to confirm the DXCC. TODO: Isolate the QSO input tab and create a widget with it. TODO: Isolate the Main QRZ box and create a widget with it. TODO: Isolate the Awards tab and create a widget with it. TODO: Add an option to save the DXCluster data to a file (file based on name or so) TODO: Think if it is possible to create a function in the Widgets(i.e. MainWindowInputQSL) to read the data and enter it in the DB automatically when the user clicks on "enter" It would help to "isolate" it and make it more "independant" TODO: Review the color management in MainWindowInputOthers::setIOTA (and maybe others) (completewithPrevious of MainWindow) TODO: Check if in mainwindow (read formUI and modify the eQSL/LOTW REC/SENT values are correct TODO: If no QSL sent via or rec via are defined, KLog shows as direct? It should be bureau TODO: Add a cheking to the list of bureaus and propose the bureau for QSL via when there is an existing one and propose direct when no bureau is existing. (http://www.iaru.org/qsl-bureaus.html) TODO: Define band limits for CW/SSB/RTTY... so when a click on the cluster is done, the right mode is proposed. TODO: Add in the setup/Band/mode a combobox showing all the active band/modes so the user can select the default band/mode from that list. BUG: Potential bug Double click on a QSO in the log on the Mode/Band... you can modifify the value. As it is a double click, the QSO goes to edit and ... Check if: - Only selected modes can be shown there. - If double click on the log we only "quick modify" directly in the log, without editing. BUG: (TNX JL3OXR) The DB is not storing if the time is stored in UTC or local so that info is lost. If a user changes the configuration from time to time, the user will loose the real time when the QSO was made. Solution: - Consider the DB is only storing UTC QSO. - Read config from user (or simply ask) and convert all the DB to UTC if needed (only one time when new version is installed to upgrade the DB) Always: - When entering data from the UI, check the user config and store only UTC time. - TODO: Think how to show the data in the log or search box as data is stored in UTC and showed directly (specially log widget) - Solution: Maybe changing the header to UTC may solve this and provide the info to the user that UTC is being used for storage It may be weird for the user to see the log in UTC when working in local time... in the rest of the functions... TODO: void DXCCStatusWidget::slotRefreshButtonClicked()//TODO: Define a way to show the status of the selected log or all the logs in the DB BUG: Optimize the KLog start BUG: If logbook.dat is not existing but klogrc it is, KLog does not start. TODO: Add a tip on the DXCC Status showing some info: bearing, DXCC status (worked or not...) TODO: Add a link or action on DXCCStatus items to doubleclick and search the QSOs that provide such status. TODO: Show the flag of the worked QRZ on the top right,close to the Entity Name TODO: Add the flags to the DXCluster TODO: Click on an Entity name will select all the QSO of that Entity on the search box Debian: Time in UTC: (not to be fixed) https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=654325 BUG: Check the options that are marked in QSL when rightbutton. i.e.: Is myQSL sent marked as requested when it should be the DX-QSL? TODO GUI: To add the CQ/ITU box or make them editable TODO: checkIfNewBandOrMode() is not being used. Code should be removed... BUG: Clublog: void MainWindow::slotQRZReturnPressed() _x = elogClublog->deleteQSO(clublogPrevQSO); _x = elogClublog->sendQSO(dataProxy->getClubLogRealTimeFromId(modifyingQSO)) It runs so fast and not serialized that at the end sometimes the QSO is deleted but not created afterwards TODO: Add the possibility to the user to select from the setup a call to be used in clublog or use the one comming from the station callsign lineedit TODO: In slotQsoUploadFinished, if QSO is not uploaded. mark it as not uploaded in the log If qsoToEdit, nothing is modified and OK. (Clublog returns QSO DUPE) Again qsoToEdit, nothing is modified and OK (Clublogs returns QSO DROPPED, and QSO is dropped!) TODO: Check the values that clublog is returning to manage errors and show messages to the user TODO: To add the possibility to upload a modified QSO to clublog. TODO: If there is an error in password/username or whatever, disable clublog in KLog TODO: Upload a logfile to clublog // Ideas: https://code.google.com/p/datacod-qt-tools/source/browse/upcoder/uploader.h // https://code.google.com/p/datacod-qt-tools/source/browse/upcoder/uploader.cpp TODO: Define a maximum QSO upload rate to clublog to avoid excesive API usage. KLog 0.9.4 TODO: Some Entities are not recognized by ARRL (I, IG9, IT9 are the same ARRL id entities but different ones). Maybe I should not be working with ARRLid or maybe I should detect special ones and "id+10000" so >10000 ids are special ones. KLog 0.9.3 TODO: Support CQ WW SSB (Including Cabrillo Import/Export) TODO: Support CQ WW CW (Including Cabrillo Import/Export) KLog 0.9.4 TODO: Hamlib support (Linux). KLog 0.9.5 TODO: Support CQ WPX SSB (Including Cabrillo Import/Export) TODO: Support CQ WPX CW (Including Cabrillo Import/Export) KLog 0.9.6 WORLDEDITOR Dialog TODO: WorldEditor is not updated when the CTY.CSV file is updated TODO: World Editor: Create a way to add an entity. TODO: World Editor: Create a way to remove an entity. TODO: World Editor: Create a way to edit an entity. KLog 0.9.7 TODO: Integrate with www.clublog.org (http://www.clublog.org/docs/pages/viewpage.action?pageId=1638482) KLog 0.9.8 TODO: Integrate with eqsl.cc https://www.eqsl.cc/qslcard/ADIFContentSpecs.cfm KLog 0.9.9 TODO: Server to log all the QSO in real time (through the network) from N1MM http://n1mm.hamdocs.com/tiki-index.php?page=UDP+Broadcasts&structure=N1MM+Logger+Documentation KLog 0.9.10 TODO: Integrate with FLIGI real time logging (req by AA5VI) KLog 0.9.11 - Cluster release TODO: DXCluster: Add flags to the DXCluster widget TODO: DXCluster: UI: Modify the DX-Cluster tab to show the data in a table?: DX de/Freq/DX/Comment/Time/Loc TODO: DXCluster: Add the DXMarathon information to the spots TODO: DXCLuster: Create a band map (including a "to-be-worked") TODO: Working on the dxCluster: Tool to save the DXCluster in a file (for further analysis). KLog 0.9.12 TODO: Add the awards functionality (to manage awa files, TPEA, WAS, ...) KLog 0.9.13 TODO: Mobile interface. Create a mobile UI. TODO: Check if the data has been modified (only memory) and save the data! TODO BUG: When modifying allow deleting data (as in KLog 0.5.8) DONE BUG: Worked DXCC and WAZ are not updated until confirmed :-? TODO: When importing an ADIF file with several logs, create automatically the logs as detected. TODO: HelpHelpDialog TODO: HelpAboutDialog TODO: setuppagelogs.cpp TODO: Remove references to DataBase from all classes except DataProxySQLite TODO: DXCluster: Lines that are not a DX should not be in another color than default. TODO: Add a default DX Cluster server TODO: Make a tool to mark and export QSO from the right button. (i.e. To mark several QSO to print and export the ADIF file with just those QSO) TODO: Add all the Entity Info to the slotClear to clear everything. TODO: Add a list of previous QSO with the same station, if any. (Done in the search box) TODO: Create something like a void Awards::setAwardsOfAllQSO to read ALL QSO and set the Awards at once instead of adding one QSO per QSO KLOG TODO: TODO: To create a function tha runs the log and marks "N" if QSL has not been sent or received. TODO: Create a setup page to configure a default prop_mode per band (ie 6m = ES) TODO: CTY.DAT update TODO: Award tabs: center/bold tabs TODO: Add export to cabrillo to the logfile SETUP: TODO: Show progress when doing actions TODO: Open this file when opening TODO: DXCLuster: Show HF activity TODO: DXCLuster: Show WARC TODO: DXCLuster: Show VHUF TODO: DXCLuster: Show confirmed TODO: DXCLuster: Show SSB TODO: DXCLuster: Show CW TODO: DXCLuster: Show Ann/full TODO: DXCLuster: Show WCY TODO: DXCLuster: Show WWV TODO: DXCLuster: Double click on a spot, add it to log TODO: DXCLuster: Add Cluster servers DONE: TODO: Colors: Confirmed, Worked, Needed band, New, Default TODO: Require mandatory fields in all QSO TODO: Awards: Add Award TODO: Awards: Remove Award ===================== TODO: Sats: Create a way to update the list of supported satellites. Maybe another tab in the setup dialog as the World Editor TODO: Sats: https://www.eqsl.cc/qslcard/ADIFContentSpecs.cfm TODO: Sats: https://lotw.arrl.org/lotw/faq#sats TODO: Sat Modes: http://www.amsat.org/amsat/intro/sats_faq.html#RTFToC5 http://www.sckans.edu/~sireland/radio/amsat.html A - This mode requires a 2 meter SSB/CW transmitter and a 10 meter SSB/CW receiver and supports CW and voice. B - This mode requires a 70 cm SSB/CW transmitter and a 2 meter SSB/CW receiver and supports CW and voice. Some satellites also support RTTY and SSTV in this mode. J -> V Uplink and U downlink JA - This mode stands for J Analog and requires a 2 meter SSB/CW transmitter and a 70 cm SSB/CW receiver and supports CW, voice. JD - This mode stands for J Digital and requires a 2 meter FM transmitter and a 70 cm SSB/CW receiver and supports packet. K - This mode requires a 15 meter SSB/CW transmitter and a 10 meter SSB/CW receiver and supports CW and voice. This mode is unique in that it can be done with a simple HF rig. S - This mode requires a 70 cm SSB/CW transmitter and a 2.4 GHz SSB/CW receiver and supports CW and voice. Many people use a 2.4 GHz to 2 meter converter with a 2 meter SSB/CW receiver instead of buying a 2.4 GHz SSB/CW receiver. T - This mode requires a 15 meter SSB/CW transmitter and a 2 meter SSB/CW receiver and supports CW and voice. KT, KA, BS, Some satellites have dual modes that operate simultaneously. For example, AO-13 can operate in mode BS which means that it can do both mode B and mode S simultaneously. Other common dual modes are KT and KA. Mode V Mode U Mode U/V -> B TODO: Code a way to sort the bands/modes in the "setuppagebandsmodes.cpp TODO: Create an "updateKLog" class to manage all the release updates so there is a way to detect the version of KLog and upgrade the DB to the latest. TODO: The following fields may add information, even if the qsl has not been rcvd/sent B B TODO: showStatusOfDXCC should be executed when band change. TODO: Add color support: messages for slotQRZTextChanged TODO: SetupPageColors: Check the style in the buttons as the rounds are lost when I change the color!! TODO: MainWindow::processConfigLine: add support for the cluster data. TODO: Check when to connect the DXCluster and when no, it tries twice or more... TODO: Awards: make a function to calculate the total. TODO: Color support: Add needed, worked, confirmed, neutral colors to the configuration dialog. TODO: Color support: Support the bar when a QRZ is entered. TODO: Color support: Calculate a color for the log. TODO: World::getDXStatus: Calculate the algorithm to know the different status for a DXCC (confirmed, worked, confirmed in another band, ,...) TODO: World:: Maybe the color should be returned from the World class TODO: Check the readDataFromUI. QSO are not added when in contest. TODO: Check that New Log, Open, ... somewhere the log table is removed from the DB! TODO: The confirmed WAZ number is not properly calculated. TODO: GUI: Add in the input box a combobox to change the CQZ TODO: GUI: Add in the input box a combobox to change the ITUZ TODO: In CQWWSSB, when editing QSO the SRX, Points, multiplier, ... are not sent to the edit so after "OK", those data are lost. TODO: MainWindow::slotQsoDeleteFromLog: Add the CALL to the message before detele a QSO. TODO: Search GUI: add multi-selection QSO to do the same actions inmultiple QSO. TODO: When importing ADIF, update the logview sometimes... just to show the progress. TODO: When importing ADIF: Only shows the ProgresDialog when the number is low >1000 <14000 investigate TODO: Import Cabrillo TODO: To check how can I order the columns in the log or in the search QTableView. Now the order depends only on the order of the SQL table. TODO: When modifying a cell directly in the log, it is possible to select a mode/band that is not actually active in the configuration. TODO: Slot: If (only)eqsl/lotw is sent/rec, the QSL_RCVD_VIA should be E TODO: Code a Tool to get statistcs for the contests, some kind of post contest tool. http://www.qsl.net/3v4-002/Contests/2011%20CQ-WW-SSB%203V8SS/index.htm TODO: Be able to send scores to: http://www.cqcontest.ru/help/developers.jsp TODO: Create an update CTY.DAT without overwriting the current data. Just Adding and correcting (asking) if data is already there but different. TODO: Create an export CTY.DAT file to create a CTY.DAT file with ALL the data in the current "world". FILEMANAGER TODO: adifLogExportToFile: Count the marked QSO and adjust the numberOfQsos TODO: FileManager::adifReadLog: Optimize the dialog (maybe updating only each 100 or as in KLog) TODO: FileManager::adifReadLog: Add a semaphore/lock or similar to avoid running the same method twice or more at the same time... or at least the same file. It seems that now it "serializes" the import... TODO: Check that FileManager::adifLogExportToFile is exporting ALL the DB fields. TODO: FileManager::adifLogExportToFile code a progress dialog for exporting. TODO: When importing ADIF: Check if all the QSO have all the mandatory fields and warn the user if not. Optimization: The ADIF import is very slow. Optimization is recommended. IMPROVEMENT: Improve the result of the log printing. DONE: TODO: Working on the DB version update functions DONE: MainWindow::showAwards Remove "empty CQZ" when counting to avoid having 41 CQ zones DONE: Code the color configuration for status of an entity (needed/worked/confirmed). DONE: Color support: Calculate a color for the search results. DONE: Color support: Calculate a color for the DXCluster. DONE: TODO: Colors: Reconfigure the colors needs KLog to be restarted. DONE: Working on the dxCluster: Color support, identify the different kind of lines... DX de, normal spots, comments, ... DONE: Working on setAwardDXCC: When adding if a pair is already entered but we are going to add a confirmed status, modify it. DONE: Right click on log to show a to edit QSO. DONE: Right click on log to show a QSL received. DONE: Right click on log to remove a QSO. DONE: Right click on log to show a QSL sent. TODO: Right click on search to remove a QSO. DONE: Right click on search to show a QSL reception. DONE: Right click on search to show a QSL sent. DONE: Right click on search to show to edit QSO. DONE: Added a select/unselect all button to the search QSO tab. DONE: Search QSO to send DONE: Add a button to export to ADIF the content of searchResultsTreeWidget DONE: When importing ADIF, if the CQZ/ITUZ/DXCC is empty, calculate and add it. DONE: Not export ADIF fields if "N": DONE: Print the log. DONE: TODO: Time in UTC DONE: TODO: Log in real time DONE: Double click on cluster to select DONE: TODO: When double clicking on a DX-Spot, frequency should be also copied to inputbox DONE: TODO: When a DX-Spot is selected, the DX-Entity and status should be shown. DONE: TODO: DXCluster: Connect, disconnect and connect again does not work DONE: TODO: Add a field in Mainwindow to manage RX_PWR DONE: TODO: slotclearbuttons->Colors to default DONE: GUI: Add in the input box a combobox to change the DXCC klog-2.3.3/filemanager.h0000644000015700001710000001710114542412415014760 0ustar jenkinsjenkins#ifndef KLOG_FILEMANAGER_H #define KLOG_FILEMANAGER_H /*************************************************************************** filemanager.h - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include //#include #include #include #include #include #include #include #include #include #include #include "world.h" #include "awards.h" #include "database.h" #include "dataproxy_sqlite.h" #include "dataproxy_sqlite.h" #include "utilities.h" #include "qso.h" /* enum { CQZones = 40, ITUZones = 90, DXCCEntities = 521 // http://www.adif.org/adif302.htm#Country%20Codes }; */ //enum ExportMode {ModeLotW, ModeADIF}; class FileManager : public QWidget { Q_OBJECT public: FileManager(DataProxy_SQLite *dp); //FileManager(DataProxy_SQLite *dp, const QString &_klogDir); //FileManager(DataProxy_SQLite *dp, const QString &_klogDir); //FileManager(DataProxy_SQLite *dp, const QString &_softVersion); ~FileManager(); void init(); //bool readAdif(const QString& tfileName, const int logN); bool adifReadLog(const QString& tfileName, const int logN); bool adifReadLog2(const QString& tfileName, const int logN); QList adifLoTWReadLog2(const QString& fileName, const int logN); QList adifLoTWReadLog(const QString& tfileName, const int logN); //QList adifLoTWLogExport(const QString& _fileName, const QString &_callsign, const QDate &_startDate, const QDate &_endDate, const int _logN); //QList (const QString& _fileName, const QString &_callsign, const QDate &_startDate, const QDate &_endDate, const int _logN, const bool LoTWOnly); bool adifQSOsExport(const QString& _fileName, QList _qsos); bool adifQSOsExport2(const QString& _fileName, const QString& _fields, QList _qsos, ExportMode _em); QList adifLogExportReturnList(const QString& _fileName, const QString &_callsign, const QString &_grid, const QDate &_startDate, const QDate &_endDate, const int _logN, const ExportMode _em); QList adifLogExportReturnList2(const QString& _fileName, const QString &_callsign, QList _qsos, const ExportMode _em, const int _logN); bool adifLogExport(const QString& _fileName, const int _logN); bool adifLogExportMarked(const QString& _fileName); bool adifReqQSLExport(const QString& _fileName); //bool cabrilloLogExport(const QString& _fileName, const QString &_contestType, const int logNconst); //bool modifySetupFile(const QString& _filename, const QString &_field, const QString &_value); void setVersion(const QString &_version); QDateTime getDateTimeOfLastBackup(); void setStationCallSign(const QString& _st); void setDuplicatedQSOSlot (const int _secs); void setSendQSLByDefault (const bool _send); void setCallValidation (const bool _b); private: bool adifLogExportToFile(const QString& _fileName, const int _logN, bool justMarked, bool _qslRequested, bool _lotw); //bool cabrilloLogExportToFile(const QString& _fileName, const int logNconst); //bool cabrilloLogExportCQWWToFile(const QString& _fileName, const int logNconst); //bool adifCheckMoreThanOneLog(QFile &_f); int howManyLogsInFile(QFile & _f); int howManyQSOsInFile (QFile & _f); qint64 passHeader(QFile & _f); bool fillHashLog(QFile & _f); QStringList getListOfLogsInFile(QFile & _f); bool writeBackupDate(); bool getStationCallsignFromUser(const QString &_qrzDX, const QDate &_dt); bool showInvalidCallMessage(const QString &_call); void showError (const QString &_txt); bool askUserToUseAlwaysSameAnswer(); bool askUserToAddThisQSOToLog(const QString &_call, const QDateTime _datetime, const QString &_mode, const QString &_band, const double _freq); //QString checkAndFixASCIIinADIF(_data); bool processQsoReadingADIF(const QStringList &_line, const int logNumber);//, const bool _keepLogsInFile); void queryPreparation(const int _logN); bool checkADIFValidFormat(const QStringList &_qs); QStringList readAdifField (const QString &_field); // void writeAdifField(const QString &_field, const QString &_data); // It should possibly receive also the QTextStream void writeQuery(QSqlQuery query, QTextStream &out, const ExportMode _em, const bool _justMarked, const bool _onlyRequested, const int _logN); void writeADIFHeader(QTextStream &out, const ExportMode _em, const int _numberOfQsos); bool dbCreated; DataBase *db; //float softwareVersion; //DataProxy_SQLite *dataProxy; DataProxy_SQLite *dataProxy;//, *dataProxyPrepared; Utilities *util; //QSO *qso; bool rstTXDefault, rstRXDefault; // If true and a log is not including RST, 59 is automatically added //bool printQs(const QString &_q, const QStringList _line); bool printQs(const QStringList &_line); //int confirmed; QString klogDir; QString klogVersion; QString defaultStationCallsign; bool ignoreUnknownAlways; // When importing ADIF, ignore all unknown fields. bool usePreviousStationCallsignAnswerAlways; // When importing ADIF, ignore all unknown fields. bool noMoreQso; bool sendEQSLByDefault; // When importing a log, if the QSO does not bring info about eQSL // KLog sets or not a default value int duplicatedQSOSlotInSecs; World *world; Awards *awards; //QSqlDatabase db; QHash hashLogs; // to create different logs when importing a ADIF file QSqlQuery preparedQuery; //int constrid; // Just an id for the constructor to check who is being executed at one specific time //Hash for simplifying if-else chain in processQsoReadingADIF to switch statement static QHash SwitchHash; void initializeSwitchHash(); signals: void addQSOToList(QStringList _qso); void queryError(QString _functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution }; #endif // FILEMANAGER_H klog-2.3.3/database.h0000644000015700001710000002407614542412415014263 0ustar jenkinsjenkins#ifndef KLOG_DATABASE_H #define KLOG_DATABASE_H /*************************************************************************** database.h - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include //#include //#include #include #include #include #include #include #include #include #include #include "utilities.h" class QSqlRelationalTableModel; const float DBVersionf = 0.025f; // This is the latest version of the DB. struct AwarddxccEntry { // Information to update the awarddxcc table; For other Award tables, the DXCC is just the ID of the award element QString dxcc; QString band; QString mode; QString status; QString logNumber; QString qsoID; }; struct AwarddxccEntryCheck { // Information to update the awarddxcc table; For other Award tables, the DXCC is just the ID of the award element QString dxcc; QString band; QString mode; QString status; QString logNumber; }; class DataBase : public QObject { Q_OBJECT public: DataBase(const QString &_parentClass, const QString &_DBName); //DataBase(const QString &_softVersion, bool inmemoryonly = false); DataBase(const QString &_parentClass, const QString &_softVersion, const QString &_DBName); //virtual ~DataBase(); ~DataBase(); QString getSoftVersion(); QString getDBVersion(); QString getDBName(); bool createConnection(const QString &function, bool newDB=false); // If true that means that we are creating the DB, // not just connecting to an existing one. // That will be done in the default path bool reConnect(const QString &_DBName); //bool setDir(const QString &_dir); QStringList getColumnNamesFromTable(const QString &_tableName); bool isValidBand (const QString &b); bool isValidMode (const QString &b, const bool _tmp=false); bool isValidBandNumber (const int b); bool isValidModeNumber (const int b); QString getBandNameFromNumber(const int _n); QString getModeNameFromNumber(const int _n, bool _tmp=false); QString getSubModeNameFromNumber(const int _n, bool _tmp=false); int getBandIdFromName(const QString &b); int getModeIdFromName(const QString &b); int getModeIdFromSubMode(const QString &b); bool createBandModeMaps(); int getBandIDFromName2(const QString &b); int getModeIDFromName2(const QString &b); int getSubModeIDFromName2(const QString &b); QString getBandNameFromID2(const int _i); QString getModeNameFromID2(const int _i); QString getSubModeNameFromID2(const int _i); int getBandIdFromFreq(const QString &fr); //Freq should be in MHz bool isThisFreqInBand(const QString &b, const QString &fr); //Freq should be in MHz QString getFreqFromBandId(const int _i); //int getLogTypeNumber(const QString &_logType); //QString getLogTypeName(const int _logType); bool unMarkAllQSO(); bool updateIfNeeded(); void backupB4Update(); void logBackup(); void compress(); QMultiMap fillCountryCodes(); bool updateTheEntityTableISONames(); bool updateTableLogs(); bool updateAwardDXCCTable(); bool updateAwardWAZTable(); int getNumberOfQsos(const int _logNumber); void setLogLevel (const DebugLogLevel _b); //private slots: // void slotPrintErrors(QString _func, QString _msg, int _level); private: //bool beginTransaction(); //bool commitTransaction(); bool execQuery(const QString &function, const QString &stringQuery); bool updateEntity (const QString &_codeString, const int _code); bool createDataBase(); bool isTheDBCreated(); bool isTheTableExisting(const QString &_tableName); bool hasTheTableData(const QString &_tableName); bool requiresManualUpgrade(); bool updateToLatest(); bool updateTo003(); // Updates the DB to 0.0.3 bool updateTo004(); bool updateTo005(); bool updateTo006(); bool updateTo007(); bool updateTo008(); bool updateTo009(); // Updates DB and add the Satellite tables bool updateTo010(); // Updates DB and recreates the supportedcontest table bool updateTo011(); // Updates DB and recreates Satellite data bool updateTo012(); // Updates the flags and so on. bool updateTo013(); // Update the qsl_via_enumeration bug caused for calling the table just qsl_via bool updateTo014(); // Update the Satellite DB bool updateTo015(); // Adds the FT4 mode bool updateTo016(); // Recreates the satellite table to add the QO-100 bool updateTo017(); // Merges the qso_date & time_on fields bool updateTo018(); // Creates Subdivision bool updateTo019(); // Adds FTS4 and FST4W modes and RS-44 satellite //bool updateTo020(); // Adds Q65 mode bool updateTo021(); // Adds 5M & 8M bands bool updateTo022(); // Recovers the 020 that was not executed and adds the Q65 mode bool updateTo023(); // Fixes the cabrillo fields in the table band bool updateTo024(); // Fixes the entity table fixinf the DL id bool updateTo025(); // Adds modes from ADIF 3.1.3 bool updateTableLog(const int _v); bool updateDBVersion(QString _softV, QString _dbV); bool createTheBandQuickReference(); bool createTheModeQuickReference(); //bool updateLog(); // Updates the log table bool recreateTableLog(); bool createTableLog(bool temp = false); // false creates the production DB. True a temporal one. bool createTableLogs(const bool real=true); // real = true creates the production DB. False a temporal one. bool createTableEntity(const bool NoTmp); bool updateTableEntity(); bool createTableClubLogStatus(); bool populateTableClubLogStatus(); bool createTableMode(const bool NoTmp); bool populateTableMode(const bool NoTmp); bool updateTheModeTableAndSyncLog(); bool createTableBand(const bool NoTmp); bool populateTableBand(const bool NoTmp); bool recreateTableBand(); bool syncLogQSOsOnBandTableChange(); bool recreateTableDXCC(); bool createTableAwardDXCC(); bool recreateTableWAZ(); bool createTableAwardWAZ(); bool createTableSubdivision(const bool NoTmp); bool recreateSatelliteData(); bool createTableSatellites(const bool NoTmp); bool populateTableSatellites(const bool NoTmp); bool recreatePropModes(); bool createTablePropModes(); bool populatePropagationModes(); bool recreateContestData(); bool recreateSupportedContest(); bool createTableContest(); bool createTableSupportedContest(); bool populateContestData(); bool populateTableSupportedContest(); bool createTableQSL_Via_enumeration(); bool populateTableQSL_Via_enumeration(); bool howManyQSOsInLog(const int i); //void showError(); //bool moveFromModeIdToSubmodeId(); bool updateModeIdFromSubModeId(); bool updateBandIdTableLogToNewOnes(); bool updateBandIdTableAward(const int _db); bool updateModeIdTableAward(const int _db); void queryErrorManagement(const QString &_functionFailed, const QString &errorCodeS, const QString &_nativeError, const QString &_failedQuery); void logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level); DebugLogLevel logLevel; bool created; float dbVersion; // The current version of the DB. May differ from latestReaded if we are updating the DB! QString dbConnectionName; QString softVersion; float latestReaded; // The latest version of DB readed in the DB itself //bool inMemoryOnly; // The DB is to be created in memory, no file support... Faster but less safe! //QDateTime date; QHash bandIDHash; QHash modeIDHash; QHash subModeIDHash; QHash IDBandHash; QHash IDModeHash; QHash IDSubModeHash; QHash freqBandIdHash; QMap bandQMap; QMap modeQMap; Utilities *util; QSqlDatabase db; QString dbDir, dbName; QStringList insertPreparedQueries, insertQueryFields; QSqlQuery preparedQuery; int constrid; // Just an id for the constructor to check who is being executed at one specific time signals: //void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution void debugLog (QString _func, QString _msg, DebugLogLevel _level); }; #endif // DATABASE_H klog-2.3.3/img/0000755000015700001710000000000014542412415013111 5ustar jenkinsjenkinsklog-2.3.3/img/klog_logo.png0000644000015700001710000001076414542412415015603 0ustar jenkinsjenkins‰PNG  IHDR00Wù‡„iCCPICC profile(‘}‘=HÃP…OSµ";HuÈP,ˆŠ8J‹`¡´Zu0yé4iHR\ׂƒ?‹Ug]\AðÄÉÑIÑEJ¼/)´ˆñÁå}œ÷Îá¾û¡QaªÙ5¨še¤â11›[¯èA˜j‰™z"½˜çúº‡ïwQžå}ïÏÕ¯äMøDâ9¦ññ̦¥sÞ'±’¤ŸÔ ñ#×e—ß8xfÈȤæ‰CÄb±ƒåf%C%ž&Ž(ªFùBÖe…ógµRc­>ù ƒym%Íuªı„’!£†2*°¥]#ÅDŠÎcþ°ãO’K&WŒ ¨B…äøÁÿà÷lÍÂÔ¤›ŒÝ/¶ý1 vfݶ¿m»yøŸ+­í¯6€ÙOÒëm-r l×mMÞ.w€¡']2$GòS …ð~Fß”o¾5wn­sœ>šÕò ppŒ){Ýãݽsû÷Nk~?>rr’¶LóbKGDÿ ¤õ¥{ pHYs  šœtIMEä(Â…C…ñIDAThÞí™ytTõÙÇ?wîd2“™d’ Ù’@X¶„H$ а µbß‚‡VÀÊy­o©R­ ÕÖ¾Ö¥µ*J±}# ÖV$Vˆ!ì²È %Âd›Lf½÷ÎÜ{ß?0T”ÚZOÿð9gÎÌ9¿ežï³?Ͼ¡oè_"áßyù}÷Ýgt¹\¿Ï'HŠ¢þõwÂÿÑ~û»ßÅÊÀ5¿¨ÏçËôx<ñ¯×êózñûý¿Ï×Õãñ4y<žãn÷A-òÿGXþè£ãt]Ðçõ–]¸pÁÒÞÞnéèè0x¼^BŠBHQ‡Ã躎¦iš$Ëp(Ô£Ã& :¿vcF6Øl¶!)©©/)uµµœin¾´nø—ëð[à º¾.߉¶ÛlOædg‡­f³Þ˺ø¯}N`Î×áõQ"ì6 ‚n¸ Sè¡Y„ó"xÿŠžü·™fö 0úï–¼@«•:¼§Ãa¬ÖÀ°ÌL/Z(Q塇F€L&7ö};€ˆ¿3©e<ýU0‰°˜Þg2ÔáàM öõÛ;ø ?üÓeV[\Ü'‹¥Òãñ(7<òÈ£v|G€À”~çÃ:ÌÐ`ÛW@„{éu6¡OJ{€ïéТƒÖoëýy‹?’?^´]’ìØ:ýú}ë–9Ëbbc§©ªú´ Ýý@ @”s¨èó€nµW;_ €Xv` +Uøï‹‹yw.¤þÈJ()yeÌÂ…SÓËJÑUåÜ9ÂîB1Ñ$VW³sç®ûn›1Ýc±Zÿ¦ªj§®ëA]×/iD€\C¯ÔÓéý£ŸO}RR’“N§Ù?Qá7ýÖ¬ÀÆ?ñËeéee±Ö¤$tU]GˆˆMC Õ§+ÂHÜ®ˆóç匹Îb±lU¥õᇑû1”  ëš6qêÔÉÛ¶nÝ6å*–quZ|×â?eee ër¹nv{<ý–F$M,Û<}åïoO)*2GFG# ¨²Lý«¯¢…BDgf¢ @tR¢h´´d¤g4UþµÄ1 Þb¶X†–——ï///gòär¶mßÐt½r\QѬUïrÄ;voÙ²¥ùŸÖÀã¿xüÞÌŒÌߺ\®ÉK—.Ýa˜‰ÔÔW0fYfyùòü¹·a³àkiáÌ»tóMÍfNþéO(== ›?Ÿ¨¤$ƒßODL Ñ'Or ª Û… ÕFî#"v[,–?ʲ¬!€Ûn›»Íåê²½¸â…©¯­}Ãó¥50÷¿n÷ÝïÞü†,ËÏ-Z´è€pOÏì¼Å‹ÖŒ¾óιÙS¦Ðvì#bÒÓ“͆%!æÍ›ñ6Ÿ#ëÛ³päçsnËVºOÂ< ž¨ÄDÐu¼ŠB|i™ññ9‡ÏŸèÜ·ßëˆK³ÅDgбAEµ­­íýøøøG‚AI«®®Þõe4¹qã†IIÉ#;:ÚõY³¾ Ø€×ÊW¼x]ZII¤Ñb¡uÿ~:Ž×¡Ê2æxÃo¹APC!|çZ¨_µŠø‚²oøÁövêÿðŒ) çÆÙŒFü'Obp8ˆs»9øô3¡DQ?Çðá˜cc„^+¿¾SÉ<>üá©­«ÓþöÞæµ£FúHG+Þ½{wBBâ€%>¼üðšÐ¶íÛM×_ýSN§ó{gΜùùk¯½þ’÷“OG&$Þ›!šL |ê:Ö¤Dƒˆ§¥M–‰´ÛÙóøã˜¬6Ôpˆ¨„t]G00šÍ8òò A@t]GééAY¿žU³®çÆÙ³q¹\lÚ´éíúúúê}{÷uíÙóÁ;%%¥wggå ?þÖÊÊJwÿ²ý¬¯Ž2[6y<ž¹N§sÎÖ­[ÿwÞ¼yö…‹ë\»æWU ¾¿«y×.ŸAìÅ®«¢ÉĈyó°&'ãkm%eÜ8b23ð_prfËÚ# öíW{%n0 K§wî"i}%/þè^ ÆŽEÓ4ªªªëÖ­ë^½úÕ9••닞šššÁF£±+1!áÚ£ÝtÅ(ÔætfÁ³uÇëò¯¿áú“Gyª½³ýŽUìo¯{[¸Ðê4ËÒgÍ\4òŽ;†¦¢†ÃÐW  ëtŸ>ÜÓC°³“èôtÐÁ}ö ¹7Ü€®ªŒFº›Ï®\Ï ÷ÝOrJ f³€3gΓ“ÓRë­é^]gS~žþü;‚¥¥¥ÅN§³±ñ“OªEƒ1y`NVþg4 ëhZX“ ¾•+WÇØcî3Šb¢(Š‘¿ÏÔ·??ªÕ9lÓÜÛž[ñÁÎNt]¿Ä<€#7—¤1c°¦¤pn÷ÎTW“9q"º¦V.lÝJêÚµÜZ|-QÄl6ÓÕÖ Ô/]ªÊ ¤$ÒÞz‹»**¬B 0àùçŸß¯É’Òs‘gc>¯O•‚’Rùnå“b„ø-«Õ†ªièºNOïRŽ8UstÜý÷ß?|BY5»÷°#Ê‚}ìXb“’ÐÂat­·8ÕB!Fäc4[0Û휯¯Ç¶w/Ã$™»|aÆÑÒÒ‰åËÉÕu740Óé}|@BG75ã>}»Ý>äî»ïþóÙÆ3ù’,¼"9(‡%I øü¾ï™-fT5LH _6 Ñ'M𴬬¬Ìf‰Šb@\ ¬V>|o»SS3uê%O.,D …ÐÂaÞZ±‚‡f1²|2iéé=zÏš5ŒíèÀ¡ª4lÛÆØ¦&bxš‘AVJ ]]¢ ·¶¶µÙ~E'^½võˆNWgŠ»Ç¢(H’D  ¤(ý·Yg̘q³ÕÚ[ÿäææÒÙÕÅÈìl¾/+t<ó|­­„•áPˆ`gá—WòbáX²ŒÝíFÝ´‰›¶m£àìYVWUQÁˆ¦&<}ã‰÷ßöÌLjîZ„`µ ikkÃd2ÑÐÐ0å¢ÿ^¦ÃGß5¾t<’$!Ë2^¯¯×‹ÒÀ Aƒ¦–”” …hlldˆ?Hizj˜V“‰#Gгsî¸8tŒMÍ䓜šJ~TƒÞÙB‡³‰ˆžGrm_ƒq€³À¡ëÄO>Œif3@I’p»Ýˆ¢ˆËåJ ·Ýu€––– Š¢C0¤££¯Çƒ¬\*×ÉË˳Mš4‰ÆÆFŽøPj$µî£R’Ɉ0r67—S ¤ÆÄ‘‘ù#èêê"Û\ONQ2¾#‡òæè+®^²àL|N‡xWw7^¿Àßï¿$H·Ûm†».3¡p8”¦ëEE…x½^\.¯÷2ˆ% kÜq[1©%¸’‹ùËùnœ²L~ÍG”í-'Ž×Õ!Ë2Võ,¹iÑÕn¤ü8Z£ ±ÏL†ó"ÔÜÂ3°ûÓ¾¤`Ÿ×KßdÜ!ƒ1hZØ øŒ YmVƒ@jz*~¯×‹ÛÝ}¯×‹Åbáè‰é4Å£ŒDÙF°co '¥š£Rš›ÈËÎ&`‹æž‡¢®ö$ÒŽ‰4¹ðÉnNÛŒt•0óg?ãçþsÓº /Jô¯Ï‡ÛÝC  ;' ƒ(–ž `þ €“ 'ùͳÏVU’“Rðûýôôô ªŸöìÇŽsµ··;n½a ›¶ÇãìöÐQ»•É%ãqvMåíªVäô9^SÃu ‰}ò×HÅãØ~`';Vý˜’¢ÊNlÆáp°yóf***æ]d¸_rEÁçóÒÝíB’$6VmàxmGáÊaTVÔŠÓ§OÇçóáñxQûÒ?@ccãú¥K—^ûÄOŒ˜>1¯…=á›9|¬žXÛ9~þ“Bvî@Ni»?<‰ÉÃà \7n…×"à÷ãp8ðx<¼ñÆo?¯O )!<^/]].‚Á ím=Rs± |&Œ ŸúC¿ß×ãAÓúOMP^ýõIYYY¬^½Úéveöt+ÅãÆãÅúª3¤Æ·“•ÁØÂéëJgŸ,S[wœ„øx²²²Ø°aƒ´fÍšgùs„Ãü~ÜîÞ°~‘]'´] @ÕÅ¡Pˆ`0H0¼”Yû]îzì±Ç~¹pá± ,XõòË/“š¨1¾h³gÄ5˜Š×÷cÒOP\˜J“§=nr_9}ú4óæÍûËÈ‘#÷}QK«i²¤ ‘$©¿ ƒ@Ý•üž¾!ÕE½ÈõËÚM€åË—´îÙ³ç®%K–\;pàÀú#G«¶(•¤Ä¦L.ãlkÛ·®gæ…áyiDFšQU•§Ÿ~:ü ¶¶öóÚ܈^Ik(!ùR^º8CN‡®à,ðc@…BH’„¢(èºöGœNg~QQÑâçž{®ö|s ÃGPT0ˆô´YHrA€ýû÷³wïÞ}ùëóDQ$¤„‘e I’.FÃÀÜ+–}Ò_ áí`0H(BÓ5DÑð…ƒAˆÿ¿x tÉ’%K–/_6Gt3uªô´dŒF#@€ŠŠŠêÚÚÚÿÐ0Ödê+idE‘TU½(N_õðøñã³gΜž7\/Ÿðeë® ð½Iøjt#ð‹!ÃruÑ Êq±Ž]{÷îýÿÌ N”92bRùć#.®‰¯ëõ4vXÞи‚Âû7ÉßÐ7ô ýçÒÿtG{ÉÇA?fIEND®B`‚klog-2.3.3/img/stop.svg0000644000015700001710000000022714542412415014620 0ustar jenkinsjenkinsklog-2.3.3/img/klog_512x512.png0000644000015700001710000032151414542412415015570 0ustar jenkinsjenkins‰PNG  IHDRôxÔú„iCCPICC profile(‘}‘=HÃP…OSµ";HuÈP,ˆŠ8J‹`¡´Zu0yé4iHR\ׂƒ?‹Ug]\AðÄÉÑIÑEJ¼/)´ˆñÁå}œ÷Îá¾û¡QaªÙ5¨še¤â11›[¯èA˜j‰™z"½˜çúº‡ïwQžå}ïÏÕ¯äMøDâ9¦ññ̦¥sÞ'±’¤ŸÔ ñ#×e—ß8xfÈȤæ‰CÄb±ƒåf%C%ž&Ž(ªFùBÖe…ógµRc­>ù ƒym%Íuªı„’!£†2*°¥]#ÅDŠÎcþ°ãO’K&WŒ ¨B…äøÁÿà÷lÍÂÔ¤›ŒÝ/¶ý1 vfݶ¿m»yøŸ+­í¯6€ÙOÒëm-r l×mMÞ.w€¡']2$GòS …ð~Fß”o¾5wn­sœ>šÕò ppŒ){Ýãݽsû÷Nk~?>rr’¶LóbKGDÿ ¤õ¥{ pHYs  šœtIMEä&5`ŠÚ IDATxÚìwx\Õµ·ß}¦Ï¨÷f¹âŠ»ÁÝX²1Cè%´ä¦‘JÈMBqh’B’/Rn€BBBB(Æ6ÝšqïU–¬>Òôs¾?ö–dÙ–\5ÒzŸgžI3£™}ÎÙë·×^AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA„㎒!„~‹ÈÒ4Àìß{Ï!^, DìŸc@#°¨2Ä‚ @„ã Å@¶ËåJ+(((ÍÊÊ*ÍÌÌ,LOOÏ ~¿ßïp8Üms€Ò`†RJ)Ã0°,ë€[2™´LÓìðs2™l»·LÓ´LÓ$‘H˜‘H$FÃáp8ÔÒÒÒÐÒÒ²/ mkiiÙfYVÈ ÕÀ`«-"A BþT`8P˜‘‘‘;hР ………ƒrssó333Ó]‡ÏçS~¿_¹Ýn•H$H&*‘HÐÆZ%“I’‰¦ib?Ö¿3MÌdR%’IÌdò#CoÚ÷–ibÙ÷zQ–¥ïµ˜°”RVÛóÛ~‡R–a¦eYV$±"‘ˆ‹ÅÌD"aE£Q³©©©©¹¹yWCCÃê–––u@­->ªäð ‚Aè/†~¬Óé0räÈiƒ ^RRR¼>ŸÏ‘žžn•ˆÇU<WñD‚D"A"S±XLÅãqâñ8 ÛÈwµš?f¿·,- ºùü¶‰G†aX†a˜Ê0L¥Ê0,‡Ã‘L$f86£Ñ¨Çͦ¦¦†úúú ¯›¦¹ X¼´Êé""!ñ3€Q§œrÊø‘#Gž6pàÀò´´4zzº#''ǰLSE£QljF"D¢QÅ0îÇÝПÀßZ ˜†Ói: Ã4 ÃD©D86mB²©©©º±±ñ½h4ú °xÙJ‚Ð ¯·‰ÀIJ²²±S¦L™;tèÐA™™™¾üü|‡ÛíV‘p˜X,¦"‘‘pXÅb1mMó#7ü‰6Ìû[OWþ=}Ÿ¶çÓéwJ) ‡Ãt8 ¥”e8‰X,–‡ÃV$‰577onjj Z–µXl—SOD‰ÄÌFN™2¥rÊ”)§eæåå9ÒÒÒŒH$¢bÑ(‘pX…ÃaâñøkÓ²àdŠ„žþïn>ŸCˆÓþ»išm¢ © #Ñæ)ˆD"ÉH$b†B¡Ý---/X–õ.ð:®@DÈÂ1ÃfS'Ož¼ð´ÓN_VV–VTTä4 ÈjcO8Vq{e¨Õo—FÒÀ;ØJšžïCâ®þv°ÿa¶ ì¶`9Œ èòçC|÷ίQJY†Ó’(ÅbÉH$’lmm݋Ş^žC¶ ‚ …ÀYåååçÌ;·rèСé%%%.·ÛmDÂaZZ[U¸µ•D"±ß•}(£{„.ô#1ü3¦=ý|æÁŒö‘xl—¿y°`ÃÃxõ?ì,„˜IÓ²b±X,Fcñxü-˲þüÉ6D‚p&†± ¢¢â’)S¦Œ(--õæææápXµ¶¶Ò ©D"qX£x$ÆþDüÍÎë'™L~”&ØU$?¶€>Ú›WJ}ôsO·8Œw㘌v‚Á‚$³”ŠÅãñD"‘0MÓ\g‹§€ rª "A®“9gþ9çœsÙøñãËËËË].—Ëhii! ©H8| A;ŒÁµŽòïæAð"‘Ñh”X,F<'™LkË °ÿF‰µ»Û‚¥Í Õ`é‚B8œN'§—Ë…ÇãÁéra†~Žý<‡ÃÑA4­ÑïqТ¾·LËŠZ¦7!j1Øüø'ºP‘ ˆ„~œ´´´ó-Ztɘ1c ÊËË]X–ÑÒÚJsSÓþUþ¡ö®Àèʸ·¶¶‡‰ÚF»¹©‰úúzêë 57‰F;¬ÐS‡ÃËåÂívãv»q8 ‡ÃqÈø‚c™ÙІQ bÖþ’ǫǀ¿¢« ‚AècŒ3 ãc‹-ºjòäɃ ä6“I …T(úÈN{Wòùƒ=?Ó DhimeoU5ÕÕ444L&ûß$¥ÔGÁe{Ú¼í=GºõqÁd™Z DÑ}À‹À?€'ìß ‚AHQ²+¦OŸþ™9sæŒ2dˆÇåt¡–š›šTû=pzhÌu‹Åb444ŽD¨¯«c×®]TWUŽDäˆôÀsÐvk‹AèÎqi=A}¶H-ÀãÀŸ€÷äh"!u˜[TTtÕ\páˆ#2³23Í¡vïw‘“4·p8L}CáÖVvïÙî;¨««KIw}o§½wà#ãݽÕ~OÄ@ÂÞ&ˆèyø•íHÊQDBï#_)uõ‚ >?mÚ´òòòrw4Q*‰ôØuŽyÔÕÕÑÚÚÊ®]»Ø²y3 2ò}"¶H Àoí[ŒŽ @N>“²²²>{ñÅ_>räÈ´ŒôtGSS“jnjR=5úW”m¿±©‰-›6±uËbqÙîoØ^61GÇ üx_FG ''pɨQ£¾xÖYgM>|¸'¥íu6æÝ Ø«¯¯§±±‘ 6°}Û6]èG´°€°©…@xø ºê  ˆ„ãˆøŸ¹sç~yúôéKJJ\-¡ÑÐРÌ.ŠÚn…ß¶‡_WWÇÎ]»X·zµê ÝQS·,NïÚBà)A€ [òÏžsÎ9ŸŸ:ujazzº³±¾Þ…B*ÖuÇà[–E}}=µuu¬]³†ª={dt…£1[$€ÍÀ躦ŒŽ @Žœ!†a\¿hÑ¢OL˜0!#-pÖÖÖí«óuÇø·¹ö«««Yýá‡466ÊÈ ÇZÄM>˜¶÷¡‹ I:ˆ @z@¹ÃáøÊ¹çžûÉ &¤; ÃYWWgDm÷üáVú ëÎ×ÕÕ±wï^Ö|ø!-­­2ªÂ‰­è`ÁUÀýÀ¿dd‚ph ÃøòÂ… ?;vìØ,—Ó鬯«3b±Øa ~ÛㆆjjjX³z5¡PHFT8YB ýÖÀJà.à5A€ t$ øZEEÅ—&Nœ˜år¹œ uuލ]ÿ¾+Cßþq8¦¶¶–µkÖPWW'£)ô6!ж5ð °Ø&##ˆú;ð™ &Ü2mÚ´ü@ ஫­utvõwõ¸m_çŽlÙ²å˜t»„ã("¶ˆ¿îšddBäÜ¡C‡~gúôécrssÝõuuŽpk«:œá‡ÃÔÔÔ°aÝ:ZÃaE!¥t€ ­„Ñ•¿ <„ "„~Â8ŸÏwï¼yóæ 0ÀÓÜÔä57‡rñ[–Ecc#;vì`÷®]Rg_HuLBÄ€€¦C‚¡“©”ºmêÔ©Ÿ1b„?ºš®öøÛîÛJñnÙ´‰f èúš;@g „ÐÛ·#Û‚¡quyyùmS¦L)v»\žúº:g2™ìrŋŨ­­eËæÍRŠWèB ÕΨnAwBJ3Úívß7uêÔYEEEžÆúzw$QWúm÷Ñh”ššvíÜ)n~¡¿ašÐlioÀ3À7)S)ˆRpóÈ‘#¿4dÈ<ó„š›ÛçF£ÔÖÖ²·ªJ ¿Ðß½Q{[ 2øGA€*œž––öó±cÇž’xëë݉vîþö÷Ñh”†úzjjjÄð BGo@[àkÀ2,‚¡·ânÇÅÀnà‚Ð].E7 Év@–ì÷ Bjé¼€ œ‰ÎÜ Ê°ˆ„Ãñ¿ÀÝ |ÈB¶’!U½m^» À0àY[ýãø B·q?.Uà3 C"© K—~ø:F@ €vþ˜­ Ív ‚ÐG°‹5ïjeTDBð(0΀ nAè“" aêì€uÀåÀNBÿeð`¨é/Á~½|·ô® $íûÎ`¬v÷]>¶>a¨Nó‡j7t¾o{ ÐñF`¨Ž¯z¯Ø\lQ ô?ÆEöÊ_ŒÿÉ™-Û'€¤µß`'-mä×B1ÄÑa¢ö-†®¶o­öó°Ÿ{°*qÛƒ Ø7?z[ȃöyíûÃ3¥Å£m>RúýößdŽ:9ç\Ò‚F ª µ2*"„þÃxàoè4¿Ìv“¾p|&\ˆÛÝLKâÎÙIt%·Ztþö6`mÀ[Ñ{¸õÀ>û¾š“[òÕä¹@Ž}ËÒlÑP”Ú·|t¬Içì$eo;öcàRrNo̤öÔkdHD}ŸIÀ@–müå<9¶†>jí_ÁÇèè¡ÙÆ{‡=áî°ýN`³}ß—{»@90ĹÀ``Pf g» Ìa‹ CiKÄêqûl°Z†D€Ðw™lÿL1þGmì“@ÌÒ«ù67|ͶAØìV›dä;g NµÂ´·jÓRÝ œJ{ <" މ¨µEÀ‡2$"„¾ÇiÀ_ 1þGdðc$lcÛÿköoÛÆ~°Ò6øÂ±e0Åö̰½™í&;¶—Àö=ÕÀyH` ¡O1ø‡¬ü»mì-{uŸ@»ôÛöê[€÷Àz`9z/^89 fÚbà ôÖB[«SiO[\»'Lh°ô6Ô¹èí)A€âŒD÷ÏãH£Ÿ°Wù1öGÌ7Ù+ú—€·ì›%£Õkq³Ñ¬ÎDo%´•ÃuÛÞ”¤í Ø|Ìö"„åàI X¢ý»\åGmõ {íÎ_ ¼f?R[̱Á"ÛSà°€ÇRøª“¶ë¬ÎG?D)F1ðo` ÝÔ§ßKÁ‰Ø)xmûø{Ñ’—mÕS§Ï’œÞ.¨D§+*Û+à1ÐA4 ·º.c¿GL ¤éÀ?±†nçÛo;CÚF?j»öÛÒò6 =#KÑÁ{BÿÃ@oT ÝÝùö¤éµA¿$l×;à àórºˆRº¼ïlÛø÷˨6£ßν¿xÜ^íK:žÐ™ÓÑÛ—Úb@µýòj×EðÿwÊ)"@èýü8¿Ÿ6öIÚ“VÄ6ú;‡Ñ’Ú$t—¹èHø tÜ€×¾õ«yÕ„KW¡ü*ºi˜ @è¥,¾¢ ÝØýÜ_V*QôÞ~ Ú½ÿWô¾¾ ).t ÜÇY芄[¸úÑõÕdéëê|tVŒ @èe\<¨Àot¬šÖ'±+ð…Û­öW¡I Ÿp¬€n¡ûI Ðö ø ݩϓÔAUè¸ i#,@èELþ¥ ÍhW­þ¸µÅþüIÙ;"î»ïûÎh4šfš–W)¬@Àß\SS¾÷Þ»¥ÞA×öJøÓè¸Ãöøúx}¤-ÞEÇJˆÈ ôŠÑÑì%vº__5ü1S·¶uÀ/€ß¢ëî ÝäñÇfÍš9J©3mC6݄LJ®x¸xÛ²øÃ¡žR*ºùæÛE tÍ0àzÛ3àVà1tDG½ãv€?_–Ã/@8ù«‘Ólãßç& ¢¶áO £÷fO@q9ü=cÉ’»²Àú´eñtW¾Ã =Û”RßÌÉò×믿JDÀÁÉ>k{2ìšþ¾˜=`AØÔñ×£³jÂIâà³döµ $;¯Õîº÷ð}๞±:=îwÝuç\[<êáܾ“HX?¼ãŽÛ¤ Ì¡qW7…v¥Á@_vP`30X+‡]€pâ9xHAÀv;ö¥+Úð¯žïgÇ6 t6Ô¾•Ø?ûíëÚ…£jt/÷}ÀF[(íEÇF˜ßûÞŒX¬õRt.wþ~žð…p8òÐ=÷ÜcÊ¥wX\ÀµÀ×€¢>è°ìx€m ñ½é€Õw üT»¯{±Å66ïwÁ~´r…nÅ:›ýûò=¹†“è­’:t@ä2 ¶ŒSJýÏ~0ã^‡žÐÝè˜OsÉ÷|>ïKH=…îGǧü¸Æ‚-íðØTT¤›ºÑØ]À7å‹N :.Ý8ø¤žJ†?iAȮϿÑ6üÿêÇQÙFþ“h·ñŽ®p“]Û> ½¿áÈ‘#-Ëò*¥ºª Q üI)~oYlFÍf—K¥†1 ¬Ðmíçt1˜/É%Ø#ÏÉï€G€ë,øšQ^;UW¥ðÉëT°ôùûŸ~$ÖSj‚ú‹¯ô}ÓÔ{ü Æ6üÐ?Úí–ØÆôZ èxüŸÏÇg>ó °¬CšTJ=¦”ºå–[nÝÒÕko½õfÃãñÞÜÚiÙŒ[¼ø;MrYÀ×ÑÁ‚»f‡/•¿ –Ιe‹J¡­…¾Åtà‹vÎqÊÂI¨·ôÞõwÉè’½}Ýø»ÑUÞD»M‹Ž×?š1c:EE…?6lˆ=øà¯Þ¼å–[÷ìµK–Üc‚õ=Ûà·§(—áÓ|Ǿ޳ Ù¾b)ldÒѱ%?Ã+@8~€Ÿ£sS²ÒŸ1{ ¡ÍîGï]÷u ѵÔfÒã†ÓédâĉŒ¿Rн{÷òÄOøvìØñ]à×Àƒ½ÇâÅ·µ«;¿µe‘'—âQ³F÷1`¥ MöJ:™ŠvÆžÎE·ZDÇ»€2[q§Ü¢ßžäš€ÿ¢ƒÝ¾ˆvö‡ëðBàUà¢q]Nœ8‘¬¬¬ ³bÅ ZZZAù] ¼|ûžˆÎ.]K©¾“qÒ x8 ¸Þ‚&ÔÛ0)…Òå]¶ [kï@‚û3«íT¢”*öcAÄŽîoîEw+ì/©dÅè-Ž+èzT wVÒRüyyŠ‹@X¦‰‹i¨'´{­{÷’hjÂJêäˆÃQJ}$”Rlß¾÷Þ{¿ó(³É5ÀÑ^™F€ü…£ºº¦³00•Rur9sžn·àÊ$D -2Ý< H3¡¸ß"ˆŽ^t·+ÅRþ’ImôÀ¿ÿEûõ—cvºPSÜýÇS6g6¥3f((ÀŸŸÃçÅárk£Þɯ’ŒÅˆ…B„kkiÞ¾½o¾IAa!¦i¶{šÉû│;½½ô)à>à©}ûj³Ðéˆí‰[å’<.47¿~l»´p)Эts$¿¥;'þ é(@8&Ü °'‚”ÀÔ]úZÐ.þo¡Ó„ú 8]µð<ºéî7ÜnÊÏZÀ¨Ë¯ gÔH\~­ó¬vFÜ2Í.#$ — ov6ÞœrN9…ÁÓ§“õì³zÓÅ& ±qã¦Ã} 0ŒùÒ¦M›^:thn{!ì°,ñgÞ*¯Zpc⤥‚7ÀR‹Ä{€ôŒÂqc$ði;ê¿×O ’¦ð‹¡ÝÉ·Ú+›þ@:ºü·Ð®ÐnQ~ÖÆ}æ3äŽý‘ÛÞ2`‡Ä²°w$‚J&A©v …ÆÆn°àí·ÿ;ß4-cÀ€²¤×ëqXX–µ|ñâ[»]õmñâ›”Çã ˜&EJ9`ú•R5–eUùýñúo¼Kª TCó€-œl¤Tñ0µçèJ[L 'q5"¤6æ8t–Þnü#¶ñ¯Aïö§ò½SÐ{ýÝ^õ{<œvÓ·vîy8}Ç®¥| ºš’+°Ú €¦¢"–®[Ϫ_ÿšxcÏôXqqqô´ÓN 3:™‘‘ñÉ›nºù°ÞœÛo¿-ÓápœÞ™Îo+FCW|O)þ¦”ñØ-·ÜÚ —ú!çñ/¡ƒ5½¤÷ö`»W@0 í D=äbà—öïéͶ߾àãÀè½þþÒ¢7Óž˜?OZ1çMžÌi7~‰lµ(7ÄîݾöZ@Ó°aTO˜À¾U«Xó§‡ÙòÔS=ý¿¦Óél2 ã{±XìÇ$móî»ïq'“ñ+¥¾I÷š%5 ¾ VpñâïˆËøàœ<ŒUàëå©ÀÉ$Ô£S|¿+‡îäà!HY¼À# ²{ó…nAÌî^‡N뻟.jÒCæ¢]œ—ÒÍjn¿ŸÓnº‰Ó¾~åå`{{çil"m×Î œŸOkAÂBJgÍ&Ü8Âõõ„vìèöbÂ4Mo2™œo¯ê÷ »À}ô–,¹+ϲÌß+¥¾ÞéÎİŸ»X ×É¥PêìóÍ L° awìéÞ†vpªý™[åð‰ºÏs Ý[¼WÖs0uýþt.óeèêvý,t¾óÐitÝò´LÊÜû¾ÏÀy•®ãçÁu‡Ã¤oÛÖAÄ33 •”€ib8d Ê€¹gVVFÃöíÄêë{ò/ríã=](hÏ’%w ¶,ëoèÎpGâyôsæÍ«|vÙ²`\þ‡ºìX¼ ̱´pôÒø —¥3€ÜÀ rèDÝ#øÒÍ~zcðdRô £SƾLÿôs¡+·= œÓÝëËSXÈÔ›oâôo|ƒ@qñ1wùwƉ¾}{‡ß%Ü.Bì÷ܘ&·›‚qc)Ÿ;gzµk×bÆzä¼|j̘Ñ#G}ƒRjÂAž6£ @}ˆöepà>v0´²òŒÇ‚Á“2 ’]öyxŠ¥?%ì,^³í«ôg±ÐÌ#±'Å #¤ß@§ýô:׿Q{oo7ººÝè©>E茵'´ÃO€†Aù¢sXøë_3ü¢‹PÇq7þÊá ~×î¶Ì-[ÙóüÒ—“É$iÅÅLúâ9ûw1ô’‹Qªû6Äét:f̘y…ÓéÝÅŸ[ß)eœjìüdAccèÓLžŽ–|®‹×T‚1N¦€nшn&u³-Ih°WܽÉùmÀäp&¤%ÀJ™½mïßvùGÐ}æ¿Dÿ(êãC—Ì] è1ù«_eð™óOˆáo#RSÃÚ›nå¼ysñxöÇ& þñSúåëÉ›1 L«Kñ`ÆbìyãM>øý¨zååÃþ¿ 0kÖÌ¢A)E2™Üêõú®ÊÎÎzísŸ»®KxÇwä†úº‹\{î[¼ø;Ò_¾gL~ îmAÃ&´Xº¤ôôâA8AÈ@êqpºCG—÷g&õj#ü]­¬?¸óF£ËãÞH7ë›c>ûY¦}û[Mœh»MNŒƒD9ìyîyj_}¡CãóùÚŒ1¡P »ví¢qçNògÏF9º˜, edLùܹd Lý–-ÈÊÊbÑ¢sðz;¦0†B!ž|òÉ}<òÈ;O=õ¯-$(ôÅ_l­¬¬h.ét®G***ÿ J{ùP…öN¶tåI³rÚž‰ðšª8ð2)E!p­Ò«Î^aü-ˆ›:¥¯Ýü?ÌÊ^tæM耷n‘1|8§ÝøuJgÌЫ~ëÄïŒDöT¡”bçÎÝÔÕ7PUµ—ªª½´¶†±, Õ"Þ“{ð²f"+àgøEQ:}:ëÿö7>øíC$[:j¾Y³f’‘‘qÀ÷|öÙgYµêÃaÀÿÙçË}À‹] ¥Ô{–e%;ÍUYymûÇB÷©®¾iÁ&$ WqR·‚ <–.3ý€W&C ° IDATB×|]í«WÔû7!b·í]ÞkÜÖŽÁtßÙݽ~ §“±_ø£>~ž¬,½â? ÆÓÄ•™Jñλïcš&†ÑqîW.—®ÚзK$ð2á _`à¼y¬~äQ6üå/8† Úq ƒuëÖóî»ïµýÊÎ ˜üË×·;~d+ª€#Oˆ8r¾¼nÁ’`Ú™D'Õ(ðZzsðO9D' L|À5½eõoï÷‡ì‹ua?0þà6{¥ZÑ]ãŸ=öTüî!&~áóx23OŽáßï­!cĈ>CgãeáTŽ;§ûE%-ÓÄ2M²GŒ`ú­·pæC¿¥xÎ )(È? ÝðAÜö~tÚà³ÀO€!ûE¥˜ ÐØÔÔ(3Âѱ8XkêàÀèÉü0våB‡½Ä tâ" ÍÐîç“I[U¿(Úuûƒ>>îÊ^íÿ˜ØÝ9|~Æ_ÿF^q9î´´äwè#g‘=~¹sçP| : Ãë¥üškPFÏ×V2‰2 ÊfΤ`Ü8"Ï?òH$÷gëíÝ[Íž={õ6¹è”Ñ Ÿ¿2 cN2ivþ@kL3"«ÿ£g£-ÞiÂÉ“é]´½³Ðž€½rxDûY¨´B>i›$-müCèÒ¶O÷ñ1Ïn®§»QÓJQ_O‚Rê¥[o]rHð“ŸüÔÑØX7 ¯-‹btj½RjµeY+ ñå–[nIôóy¥År—Ÿkp²@‹-)Sþ‰YÝ)¢ÖŸ,…nû5;ÑDkûðX»Ð¥gïA׫ïÞ¢"&~ñz†.Z„ÓçëU†¿³Hˆ75­Ù‡ÃçÅ“›‹ÃçÃJ&Éû—¼ò þªªÍßÿñÞ~ëín¿Ãá`Ô¨QL™2™¢¢"222H&“ ÀÔÅ‹¿³¾«×,YrWºeY—Ÿ³=6‹t¯C7£úÑâÅßy]¦°…À}€÷deÙÙDïgÈá hJ€÷ìžß'| À‚¨éÿ.p :¥¨¯RÜ\ÕÝU¿2 w.ã>ýi²‡ ;)Ñý½ K)Ê_|OmmÀʬ,ÞüËcìY±¢ÇŸÏ¤I“’#GŽxáÇ?þÉB:þð‡?0ZZÂsÀZÌìÁ[×ßu8?»ùæ[¢2Õ0ø£‚L¥ƒO¨ÇÑ„°¥çšSéuDN*R 5˜\¦ p¢ëþ›Ðj»åž>ôÕ¶¬nà“ÀŸìÕG·¶Çåå̸óÆ}êSøóòú½ñPdnÙ‚3é ’”uÙ#FP·y3±ººn¿gkk+›6m2V®\™gYV):ó¤ àÎ;ïôÅãñ›ÐqC{øqÀ|˲˜5kÚŠåË_îïp;ºãYv÷ žsv1±õÀ2õ_$ 5Ho›[O°ño¶t¹Ö? Ýƒá>:¾Ã€GÐ¥|˺eä”bÄÕWsöC¿eà¼y'-¯¿×Š€.¶?¬d§ßÏE‹8ç¡ß2é7âÌÌìÙ9iš™ètØ×oä)Å7б‡ªŒiqð´AðM·Û;[Žk€³Õv†À ëÞi‹ …nm,ˆ@° Ô… |ê‰m%~p7}3çÚ|ø3º i·®‡ÀÀ̺÷N½ö\iirv°¬P¤ïسµµýÄNÓ!$Ýn°,\…'R>¯Ë0¨_½º'1 HæMŸ>íŠ!C†œgYVWí[¥ ~üxxÇ>΃: j'¨•ƒAi4¤ÝðO-ÝçÂ8µö±û‹†ã‹d¤m{îIŽ¿×ÆjWÖ÷+Àã}tL' žæu׳b¸\œú¹Ï1úÊãÍÉé½A~½€¤Çs€ÅV ‘–õ‘·$kȦ~ë› >k<ô;v¿ôR·ÇuÔ¨QÌš5«Ü<ðù ài¥¸µ¾¾jÕý÷ÿ¼ƒx½ýöÛ~àp8n@y¶ŸÏk,ŠõcšÐ¿¿²à\¬Ô}ÔŠeøÅ hê¯Nu`Q”cºð·Ûø6£ƒýþÝÇ2ü/ð{`DwÖ¨Q̾÷n†_t¯÷¤ôéíÄ1Þ~‹ §³ƒØöÒrZÒ3ñî÷'YJ)ÒKKXYIöˆÔoÚtÐþM\—\r1YYY¶^’É$µµµºÝîën»íŽ]¯½¶ò€×¾øâKæüùoZ3é3  ƒõË–¥}»9]ì«ÝåÒ:=â–žó~%Ã/@Ð+šËäÇ‹/i§ùÕ¢óp_ïƒçú<àèjcÝR®ÌL&ÝpÓnþ6Ù§ —U7Øþ—Ç0׬£¸dÿ"N)E<á¿ÿ'sçhÕËÂp¹È>e8ƒž…·°}«>$Ù.°='NdêÔ©´_ý+¥xã7xøáGF¼ôÒKÅÀ&û|>€eË‚feee¸¸ÓŸj‚Áàßä(À3ö53HÏn‚vÌÁv[¤ ÇÙÕ"¤O[ÇÉø[Lê=ÿÝÀ¹è<ܾD.°x8½[¯PВй,øÕƒŒ¹æj\4ÌDBÎÂÃ-ÝÙ\ξں\+‰D‚ššêêêIÔÕ²ïÍ·>ªEÐYXf_v6§^s ‹y˜Q×^{€XPJ1eÊä^¾k×n–.}˲2Ðýå—ßá J±»‹_ûä(”{€;,ˆØ‹…ã¹àÙ,Ã}ü‘€Ô@¡†Ãa™Éä1 ´ aê=ÿ-À¥ÀÖ>¶ê?ø.=ˆ*vçä0ù†¯1ôÜsqz½²êïf4F¢±ê‹5k×±k×jëê ‡u‰r8hݵe-:dÙÍ’2 âôo‹ÁçœÍ{>Èîå+°’I (,,ì°ú7M“åË_"íÊ_ ÜŽî3ðà1Úõ›·,ºjz‘£xH~ŠÎú¾©WǼj ¥·þ+C-As30½¬¬4qÖ9 •Ãá8VZ›ñ_|¬ÿ2ôâŸzbü_p>‹þôz¯ßíãßÓ ÅçÅáócšIÞ\ù_víÞC$A)…j[õ'»7¦–i‚eQ0~<•<ÀÜŸü˜Ì#>lžvA†J)öìÙúuëöV£Ñ5þî©a»¬Ñ]ÌRJÍêâyÊQ쟲 åX‰¥ Î^ÚpاãlônÆK”Rjöì™……EÀ!CxÿwˆDŽÌ[iAÌÞÃ{¸œc¬âO"CûÑ=Å»5y(e0ì²K˜pÝuJJŽM-ü€eYX‰†Ç fïÊH(»è|B›7Þ´¹cgAË"oÁ|²Æí¹gÅNôdf’•—‡Õ®Ì°eYlÞ¼©»ïäÎñûýsªªª<†Ñ–IЪ+»ó&wÝuG§U‰ÞjȰ ×ZàPo,^¼xgŸŸžþÇ‚ßÛÛ™Gófß¹ãÎ9w¡ŠD¢­/_šÜ….ð$ÇÕ’Ð;)ÒÏZxfaù€^‡ÃA2™D)EZz:Û¶n=ãÿp º³_ªã><Œ.›Ü­‰´¡C˜yçœúÉOàJO‡q÷+‡ƒ½¯½Î¦GÅ——''ûˆZøW/ÀøñX†Òå~I|ƒQvõÇpÁùž# W¦IÖ†õ8bû‹Ó%“I^Z¾œÖ––n¿O<wðÁ*G(ÔŒa¤§gàt:?ôxÜ÷>ÿüÒ._óóŸ? ¦M›9¾²²â~P?²=LÓ€1èSl/ÃeÀU••Ã+++ß ƒM}xžÚ„>0´W‰Çíæ×¿ù #†¤|`™ç•W^m­¯«n ¼JÌÁqšKdz%.´‹mÜéSOËš0~B¶×ë#“H$>º_ùæ›l\¿þHŒÿËÀ•¤~i_]Ðçûè¿î©^¯—ÑŸü$£¯ºAAÊE÷'Z[xã›ß¦ùÃÕ8ü~^z1e â/.î=õ ”Ë"ÙÚª[(§ó¨?ŸS¾t)ÎðþS×t¹x%-7úS×­ëqIfÃ0(/`3æwÿþ÷Ó_¤‹@À%Kîʳ,ëÀ—8tÉáÎlWJýe\¼xq_.±ø½ÿ‘xúøöÚkˆD"<þ×?Ç>ù‰Oï6M3†îA"Aâè7Ü TŽ?Î7eò”üôô LÓIJ¬î-Ë"+;›Ý;w‹¾Tw;ã¿Â6þ©íœ܈î>º»/Ê›<‰™wÞÁð /Àé÷§\Ÿr8Øñô3ìøÛßuÿD‚úwßcïë¯cxÜø‹‹qú|½F.ç˜y(”i‘½v-ªÝ÷3]n̳0ô¼óð—–°oÍ=ðX–ECC£Ú°aéÀ™èÊ›[Ñ.}–,¹s´eñ7ta’>lhgkBæàÁœrÁùø‹ ©]¿žDóá·’'MšÈœ9sè5 µÔF£±s–,YòŸçŸáwôҥϱlY0TY9÷ PŸ £<Ô#Á`°®Ìg«Ð}*ºò,¾í6nøú×»<—ÛŒ2™Ä²,òó TVN†÷™ÿ<× ÌžúÊè'|øÔˆ‘#<••…ùy¬ø;¯BÚŒ à‚ .H^|ñÅÑÖp8Ù®ÖZ#ð:Ï?SýœètªÇ¹Ý=Wݹ¹L[|+“¾x=¾œœ>ѵO9Ô¬\ɺ_ü²çbF)’¡5¯½NÝê5¸|……)`Åã|¸är|^òóó:æ–P >óy³fàLKëø:ÓD)EáäÉ >{!(EýƘ žUJqÞyçÐi0óè£øŸ~úéI¶`ºnýTVΫÎwšoŸ ƒ[ûɼö.Úë8ÓöԸƎÏo~ûÛÕ»m7¥EEE‡Óp½ñÆ›1`†=/Hs)ÏXàÿ9ç…_AntõÉ‹ÑY*€Æ»ï¾ÇkYæ@v»ç&•Rß[¶,¸¯ÎuÏÛ‚>|!Þ¼ysÖÙgŸæõzUûù­+ãßvËÉÉU™iޥϿРÌB7xjDbœ üï€e®ó>v^aIq™êìkÿsÛD§”¢¤¤„AƒE.¾øât¿ógSxÒÐ}~ œÚÝUÞäÉ̾çn†ž{.®^e¸;Ÿ{–M¿yˆÝÏ/%’VV¦÷¥RX¦‰át’sê©Íže„¶lÁŒÆŽX$š›Ù÷æÔ­^mÇõÚúδ4âá0Í«×tù}ÓÆŽ¡ìÂa8=Se8(˜0‘gÎÇåñ0!/—ö7ãñÏ>û<--¡ÃdzÑ}(Ô¸q§FÀÏgµK)uï²eËbýtÎ{½w¿ xqýúõçιsç¦íRU%”Räåå90pþ÷íwâ¶øzŒýu½žRt!Ï5×^Y4jÔ©N‡áèrÏ¿óÊßívSYY™¼è¢‹ªB¡Ð_€RxfÙïU€¿»«þ _ý S¿õ-²>f«ëcµúWïåÝ;îŠDZ’IÞŸ]K—âHK#­´ Ãí>êc™&N¿ŸÂiÓÉ;m ±P -Û¶ÅÇVD«k¨Z¾œæíÛñæçáÍËë•Î^áà ï­"²}ÚoYÞÒ†õËxóó{.•޳pùý”O˜@îÆMΫ††‚Á`wK ç Ç%%%%Ç£ö¿N=·xñâ‡÷K–Ü᪬œ? ¢âŒ¹•••gTVVœYYY1eÞ¼Š¼ÊÊy±™3g„–/_žê©„-À¯¼òÊyC‡uO˜0ÁÓ~ÁÓ¹òiû{ÛCnn®§ªjwtëÖm¹èƒWŬˆHÚÕ=äü >–3kæì€ßç?¤Û¿½X°`¿üå/÷._¾ü=ô>*VÆÊAwúzH7Sû gL§â‡?dÐYgá8†ôx°ñÏ¡~åÊýD)ÌH”}¯¾JõÛoã+,Ä_XxL‚ï,ÓÄ›—GÑìÙdŽAKu5‘ªª#7Ü´nÝFÕòD›šðãéeñ›œÉ“H9Oi)i§Ž¦`Á|]}%¾Â¬£ìŒènh cË– ¶¶Ž·Þz«'ocìܹӿjÕ*G"iipZZ𬇂Áàë{Ñ]wÝ•1o^åç,‹‚µÔÕ¶Ga>º°Î`ýÃá˜_YY>óÌŠõ/¼Le!°¨yòÉ'gœþùþââbg{ÐÕ­íoéÒýþËW„b±ØDà Û³ ˆèÕ|¸bÒ”IÞó?v^^AAÑa›˜µR4mÜĪ{îíÚ+¡±}ûØóü 4ïÜA ¬ϱˆ°,”ÒñÅgÌÁ[THÓöí$*> aÕ*ªßxË´””ôžøËB9øËJÉ7–ìSÇ8P Âcðñ¼ ¤íêhG-“ 5ûtgÉDزe‹såÊ·¬ÚÚº= ?Ù¸qãŽÎÏ»÷Þ{¼sçžñqt÷Ï«€2ºnÕ®Ðu—X§VTœñr0øb*×Èÿ Ë/¿üòô@  Úgt¾o_=''Wù^÷k¯¾Þ‚N5| è¯Û+"R€áÀO Ãp~â“×1ú€”¿Î" m域ŸONNNä²Ë.Û|ÝV¼©D)ºkß÷Ð}o‹ ƒgÅœïÝËÀÊJ]Ò¶—©™É$þâ´ªE³ÒešZ¶ncçž!(+Åu ã²ÇŒ¡hæL ¯—æÍ›±¢±#NL„BÔ¾¹’ÚUâ øñõžú–¥+"ãóÁÛÔDÚÎÆÌ˜<™ü_3 nÃFÌH¤‡ÕrVUUemܸñ Û¸ÿ»6Ç’%w¥›¦ùSàv ·‡žÄQJ©ñ••σÁTî1ðbmmíY‰D"0þü4Ã0ºl~ÖùwÃAnnŽ«¹¥)¹~Ý7ºTðóbfDôÖ±þ Pr͵WåÏ™u†·­Æá\ÿN§“©S§šûØÇö´´´üøE }o7:Eña´+³[Z¾²RN¿é&&\wþÂÂÞݵO)jV¾ÅÆ_ýºû«nÓ¤áýØùìs832H++=vñùS&“wúiÄ"Z6oæ£ ó#ønÑšªW¬ iË6¼øòózWìÅ1Ä“¾}{‡ïKO':l%Ó¦Q6s&¦ ëÖÉ9éF§·~ à‚ ÎßP\\ü(p GÞš}0Pºpáü.]º,U·À¯¿þúÆ s7Îs8ãßöØï ž‘æûïÛÿmin@W Ü"æF@oãËÀù3gÍð]xá9yy‡5þm`êÔ©üñ¬^ºtéjàs¤Î¾ÿpt‰ã›»»º1F\}3¿sŧŸÞ«Wým2ÑÒ»÷~—x}}Ï v,ƾW^eï[oáÍÍÅ_TˆêAû¡VÈÞÜ\ gL'ëÔS‰ÔÕÞ¹ e¨#~¿ÖmÛØ»âeÂuõJJR¦~@Op…äoÛÖA$ü~Bå庿@~>e³g“?q"á†zBÛŽ¨Ã¯/Ì?ãŒ9×¥¥¥9ÈsZÑ ¼þŠNë}þîK;ÍÛ ™LZoƒÁ )<ôµ@õ“O>9óÒK/ äåå9ºã°,‹¬Ì,Hóy^^ñJ3z+àqR¿Ý¹€>Äà‡.—ËyÝç?W—ÒÊË)š5_Y)¡í;ˆ74q|€‹Ñøá‡T¿þ:¦e(-Méþ¿­a²¶míp£Í!öú|xr²?*+œ9hådFÓ®]Djz–ÚÙe—2xðà®jáF€‡@]ÙÒùwÝuçsÁ`ð•`0œ;·òQ¥X‰.…›ÝiwƒÁ¿¦øX {ÿý÷\zé¥N§³Kãßù±RÙÙÙÎH,l­]³Î@W |ZÌŽ€Þ€aÂÂÏ}þ³ùsçÌõ¸Ý‡vý·M·Áƒ',XPešæÐE/z;Еü®ºÕ‚N9Œ½îs̺ãòFJ¹öµiåådKÓ–­=ë|Ü[·mcç¿ÿM<%PR‚+=ýèÝí¦‰át‘=jE³ga¤§Ó´~=V4zñ-Ô¾¹’}Oð¡× IDAT‹3=@qñ±ñ\œDÌXŒ ýž>o‡:F<Îk¿û#ÆãÊÒ•©-ÓÄp¹È=šòŠ ÜÙÙÔmØH²õð[ñ£GæŒ3ætaJ)âñ„µgÏîÛï»ï7ƒÁº—_^ÑabxñÅ`rþüy,ËZÞVk?WVÎýU0øbª¯|_ݱcÇÙÙÙž3føÛJX–…×ë#==Í·níÚÖººú!ÀFtQ&AÀIå`ÑÜŠ9¾Ë.»,§­ÑOûW,ÀĉùÁ~°÷wÞyøv/ÿž~àkzõÂHºYÐ'kôhæ|÷^N¹àœ>_ÊdI ¥gÎÇ[ZJãºõ$ZZŽ*¾qÕ*v-]Šáà/.Âáõõgl«7aùÓ¦‘0Mš×¯?òÏ©±ÚZªW¼Lã–-ø ðå¥f|€2 êßy—m¿û#§Œ8Ñ66›×o¤±ªŠüÓ;|?Ë4qM™Â»8SýêÕ‡¬pÉ%—‘ѱ›¡eY<þøãê?ÿyf*:Pp#]”ò^¶lsæÌÜfŽyíþä _¬Nñù2 ¬_ºtéÙ ,ð–––ºµÐþ–žžÏïñ®Ð[ÓÑ¥Ñ[Dœ$NA»þ]_ùê—KÆŒ«ÔA\ÿÀ€XµjUÓí·ß¾íúï­å.zßíoÀ5tlzp·ˆËŸ/^ϬÛo'û”a=r!'Âab¡f|¹¹˜±ø‘‡OkWÓIÖðá”TV‚ÇMó† ˜±#¯ÒgFcÔ¼ú5o¿'; _a¡îv”îv ¼¹¹L›JÎÄ „ëêïØqäžË¢uÛvª^ZN¤®Ž´²2ÜY)U›M{ž}žæµë(*.Âår±wo5›·láwß§¡¡‘hÕ^ œÙµ³,|¹¹”ΘAÑéS‰¶¶Ò´éÀž?£Fdúôé¬þ_{íu^}õUÐÛgSÐ[tHó{é¥åfeeÅB:ö0”2þoÙ²àÎ>0onò–-[vÊ5×\“ár¹TWF¿óφa™™éˆÆ£ÖÚ5ë:^B¶Dœ{€vý_ÿ¥ëòÌ_èñx¼ÿÎ)n·›¼¼¼øÙgŸ]mYÖ­Àk½ô;æ7¡;÷•wÏ®)JæœÁ¬{ïfè¹ça¸œ=ЦV»^~…g>ñ œþ¹cFãðx°’½$.Ò²pú|äOžLþŒéDC-´nß®SÖŽÐݯ«gÏ ËhÞ½onÞ±éâgÇJK)š9‹ÀÐÁ4oÝF¼¾þ¨ê4­^MÕ«¯b²²câ¹8QÔÿ÷Z7l¤ªj/«V¯fóæ­TWï#$ Ïœ@»áÎcš1`æÌ!{Äpwí"R³¿\Çœ9³0`¦}Î+¥¨««ãá‡é¼(HC·Á>%¿Ñ^óÓŸþBE"­Ÿ†v:¿ ƒ»ûÈüùzccã9'PQQH$]ù·ÿ½×ë#=#Í·víºÖz½ Y"N Ÿ.š[1Çw͵ŸÈ)*,î¶ëäÈ‘Ü{ï½Õï½÷Þ‹Àݽô¼Y€ŽP¾ˆîôÉÌdÒW¿Â”¾FÆÀÚ(ö§×ËëßýëÖ³sùr6=ýo²† áÿ³wÖñuÖgÿßv<îÖ¤’zKݽ…–×663†lcÀì·g̘ÀC‡Ž ©¤T)5šZÚHãvÜnùýqŸsš@›¦I€”öz½Î+rîœÜú½ìs}>iƒ›D£ÖÔTòæÌ&eÔ(|ÕÕDš[zž¡ #•}ëM"Á μ˜Š_ ‰²LÊ!äÍ‹’šJûž1¢Ñ5¿‰hÚº %5g~~¿Ç‚@Äã¡õ½Mhš „,9Ù^ráIƒ/#vNÓ‡ £xÑBœ¹¹4îÙƒ ±hÑBìZ]Š¢°qãF<¡Bpf,˜‹Ù8<}úT%xwœ¬ÑAømYÙçFhHv­_¿þÂE‹Ù ”á>Þ HÂjS¬ï¾óž0ù|oö,¦ÞuÇõûûsQCAjËÖrðOª«ëϾa ¤§1hù5ÌŸ%=½oŸØ>ù««9üê«Ô¼ð"ôi’LÆÔÉ ^¾œ´‘#úõCq»ù𧬸êª+Ÿ5jÔ_0å³ãV Lº÷Þûº |ðA›®kC Ø,Bqì3" >eyÏx—Ú.˽ÅÅÅ_Ù¸qc‘,Ë‚ªªtçUßPÇ“Oþ£õµW_wÇ•ïŸuKg+Ÿ–ýtë7nÉøÂù_´Û¬¶„ƒÿ(§uü{0uß].—ºdÉ’]ׂ©žÕ_LÆ”<} 8—núØrr˜z÷}à ½'ôÖßu¾êš9oe%ûŸÛMÖØ±ÈVk¿º!âø€Üys­V|‡ …B=Ç„B4oÜDóŽ(ÉI8rr,JŸôÝ­©©dOšDú”ÉZZVõ &> ºšú5kµµáP„%)¹_>´²ÝNò¨‘øŽTmlLdó‚ ٥䟿¸Ç›-=¥¥¤×t¾wÛÛÛYµjõ©<ƒÃ¸´  À*ŠbÇJâŠÔÔ”¼ñƛǭH(ŠT¸`ÁüÛ Ãø ðA.Æl1Ìæ×èº~þ‚óýóæÍ=¼fÍšh?¸,›Ýn÷“““]sæÌqF£Ñ¶:VlVN§Ã¾sÇÎ8AÐÖ~˜L >‡vpóä)“¬7ß|sfnN^§ ?þŠÿlÞ°æï xä‘G·lÙ²øi?:¦!˜,†?¤3ò¸K+½êJæ<ôyS¦ ö²g-Ê2Õkײç/=!€ÒÐ4š¶@æØ1¤ÜÿfÓ;â¦N!⨮Më1> ÒÒJýê2<ÕÕØÒÓ±efôú\Çù ¹¹äÍ™Còˆá´ï?Ð+þCUñ|¸—ºµë0DWQr?ÄXRSÉœ>•¤sÆbXLÚŒé/¿š¬Ù3{7žjØÝíclhhàý÷·ŸÒGUVVJn·Y–p8X,]„ï¼óû»?ºí<´nÝÚï`â‘.Àä8ÑXc¾ËA¾`Á‚ eeeŸµÎ€ |¸fÍš¥K–,±§§§+«¨ñŒ?¾¦v\k]Î$ì«eÓÆÍ>LƧ9=ÅÓΧ‰e¶»~ô½ÜsÆŽ— ƒÄ ùÑ àØËÀn·SQQáÿáØ„)ÔÖŽGÁ¤-}"öuЧ¸˜Y=ÈÈå˱&'÷‰#VƒAÞùñOð×ÖvéhÆ|ý†]vYÿE3 ¬iiäΞEÊÈ‘×7ôxŸA PUE튕„}~¹yXSSúd?I"©¸˜‚E Q22hÛ±CU{ŽiÙ¼…†M›±f¤›ø€þÄû`ˆŠ‚='‡äáÃI<KJJŸH#Tg@š5=åûNI_@Ó4Ž=ÊÎ;Ù»·Y–X½ºlSssóN:ˆá<ðÀÏJ Ãø'&)éT®0˜¾hÑüÿ¬^]öY÷Ôjì÷ßèW\‘wú'j£Æ¿HJN’A¿zè`…«´á¬›:|Rö3`üW¾zSê_\ê²Zí±›òØKÓŽßp:Æ 7ÜPïõzÿHÿ]‹˜¿ÕÝÅC$†_w³|€Ì1cú `") ^}}O?ÝåvÉ¥¥Ì¼ï^“™î40Ap’7w.ö‚|GŽí©Š_Ìyyöì¡~ýzt œyù(NgŒ HV+é£FQpî"4QijkWLܨ‡Ì‡mmÔ¯YGûþ}¸Š ±ge}¾WAÀÞÚŠ³¶öX`ˆ“'“à HMÛ·ŸÒµ2 ¿ßOyy¹ÐÜܼ,Øzè¡òuÝx˜MU €"àÄåJþ×þýû>ë3¸¥¡¡áâ‚‚ÇèÑ£í‘HUSQ5-ñê˜Á€ÅbÅét8Þ{w£7ž¬æôSQ=œ6øQá€Båöï|;'/·MG¤z'Ço¢YutÝüš’’ÌË/¿ÜòÆo”cj|–¢®˜Óÿ{, è–¥ŽÍì‡dä5W!Ûì=BøŸÈ¼ó“û»dÙ…÷ÿ”Œ#N/ZÚb d—‹œÉ“Éš9“`{;ÃGzŽÀ PSCíÊU„Ýn\ÅL|ÀçVø8fõzp= „2³ˆ*!oò,ZHØç§}ÿþž|¼äY,–i3gθNÄ©'ض÷Œ ð,e@È¥3° 4??CYYÙ‘ÏøôE€Ú+V,¸ð v‡]ÒT=áôu4½s«5¾þ:NÁ•ì’ßß¶=Klž?ë®Î}iàÿ€Ôÿäžìqã&(`JÄš7cÇÒ¿–èùëº)ÑÖÜÜþæ7¿Ùsþ•ŸÑ1ˆ˜ìYOb–ý»EË'9Œ½åkLÿÑ]¤Öçª}¢,³ã/£fÅÛ]nWrÁŒ¹ñ†Ó÷2 “¥o²&O& ᯮê%> …ú5kpWVbMÏÀžÕgåv{fùóç‘2f4m{Ë{ŒCÓhßó!u«ËmV\EE}¢ŒØï‰@Wuug¥Áô4üÙ9€I$T²h!9“&Ó²?¡ææžœOéºë®’••Ux¬L“að$ 7ßsÏ}O–••½³zuÙö²²²çž»ðÃ0ÞÃvҤ‚WvîÜùYŸÂÀ9^¯·`ÞÜyIªE;MC×ôÕV=Qq‘”ÔdKkk[¸¦º&ðcJ2Ÿ Ξ‚>±;…W/¿ÒyÉ%—¥Z­¶Xz,ã×:ôûãUÃбڬüÏoþ§±¢¢âUà/ŸÑþg÷b*÷ înW°`3ïÿ)C.¸À$|écç/ˆ"­{ËÙøÐÏÑCÁngËËcæŒ=3ãô¿“ kz:9³f:j4¦F‚uõ=n ‚@°ªšºÕe„Üì99¦ÐR_•‹ ): Ö¼<Ú>ø Çü‚  …B4¿·‘Æ-[±ffàÈË;ít!ºz^¤PˆäªÎêÑ`wQbœ'AH**dȲ¥$•S·uz¸û#ì#FŒ`áÂ&—AÓuý°(Š—ß~ûןY´è|ßGÿnÕªÕFYYYå‚ó?®¥sÛ #++ýÑÕ«ûÅTÀö½{÷^~Î9çØòòò-šj–ÿ;:~­SÒe®·ÅBJªË¶ní/0SaÑs68k½µ‘À¯].§|÷Ýwååææ (º¦£ÆGÊR&u¥Äö÷·{ÿô§?5bÿ>m°ˆÉ5ðLBŸnÍÎ)))L¼ó&ÜvÉEE]Ò÷ÊtM¿ú­'É<Æ~í«”œ»¨w¥cA0Gèú v0ÁÒ7gŽÂüGiiíy¹]×qø! 6 iξȲLÚðaä/>]ðì-ï1ó!‰ÊÅZ܇pbËÈ8-õ:&M£ößÿ¡H;+ 6·°õíU¤Oœ€¨(*_™#G2xéRd‡ƒ¦vt«ºvíµË; ™"CQž{îùðóÏ¿°÷¡‡~]AR¹ ,¬ãšTì†!®BàטÀÅÂ˖1ûçQ4gR‡«Ï#Y¦zÝzvüî÷].|i£G1åÎ;{>R&h‘Í;wáÈÊD¶Ûû­°(ˤFˆN'Þ#GzŒâø€­[iÞ±ÉjÅ™—×wø‡ƒì)SÈš9k ÁêšžI$Çøü•UÔ®\IØãÅYPˆ’œtÚ µnÿ€Ã{Œ!C¡txn¬6+®‡ˆ,’:ztçë`(N'ùÓ¦Q´`Áöv<‡Ox­† ÆÌ™34Ãñk^VVÆÖ­Û\˜c€ 11UÀÇ2ú믿Vóx<%¯® ]½º¬¿€ç¶‹ÒÓÓ#F w¨ª–H¬Žµ\ã¯Xò• NµVW×›šš`²æcc•Ï|Lñ ?gˆ Žo™˜£3¿Æ”µ»ARE± 2Èvθ±¶AZ‹Eš9kšõŠ+.O³Xl&²ß0̈T×c}©u¥n$¢SxóÍ7ÛÖ®][Ž©¢÷iÿL¡‘gb‹A·¼¸%-©÷ÞËØ¯|Gfæ'¾“QŸw~z?þ£'Ö6%‰É?üÙçœsjLD 5¤~ËVÞ{ðAv<ò^{¤H+-5?¯Ñ Ëv;™Æ“5e2ª¦á¯8Ü+}HK ëÖ㮨ˆá²û¦ÜqÌŸ?Ÿä‘#ðoÁ\ûâÅ‹mùùù®¼Ü<Ùáp Ë2¢`.–º¡£©‚(tZäôNe(=ÆGÖFo¾ùæÃ0¾ ¬ü”Žo0ðËØ.wsfð%3þÖÛH*Èï1ï)E¥ŠÂž'ŸbÓÏ~Öu cáæýú×fÛ g‚(¢´í?@í–Íìÿ׋ø++?¶XgO™Ì´»ï&k̘~I+lhÍìàÐ3Ïкe ‚Ø‹8Þ0­VòŸÇÀK.Æ5p`ßa9D- fÅ üíq¢O¯)ƒSzã—Èž2Å ž‚(òáÏEû¦Íäæf …q»=¦S@À§œô÷¿¢$'Ÿc_ù~uÓ¦Í~UUã7–ìÀäwù/§•ÆåÙàTìà~ Õá°‹ßøÖm)'NJÎÍÉ]Nv››Õ‚,ˈ’ l•eeæ]wÝég§v(ðú¯ýë‚á#†;À¿ØH Ÿˆµ\ãÉ— ŠØm6¬V+’$Alýƒø|>‚¡ mmmz}}wÓÆM;wÇ1€uŸ§w¶`–À Ü!‚í›ß¾5õŽ;ïÈ9gì8û€¢BNNI®$, ’$#`fúBœEYV°Ûì¤$§àr¹Ð5ƒP0ˆ¡ƒÖ£ZU5víÜüóŸÿÜ ÜÊ'KJ!`ö·žÀÄ/t‹ÐG”e†^s ³ö3rÆûT/†(Ëlÿý©]·¶ë'ÿª+vé¥~A@E MÇWSCõ† ìxôÏl¼ÿ~¾ø"-;w¡ú|ÝvˆÍ;w²ï…çQ\.2FŽD´Xú>@QHZJîÌ™HI.S_ ×ø€m4½ÿ>¢Í†3¿©/²ì> kʲ¦M%ØÒJðèÑ^â*©[¹’ˆÏ‹³ ÀÌœû+> vüÍ+‰÷ýÜ / }ÂøSúLÅé¤`ú4 çÎ!)¦4'§Ó&MMÍlØÐ-9¦jÞÒŒŒÌYéE’$u<™+î¾ûžûá™mrêêê†Í˜>#Y–åߊ¡À×V«…ü¼Š3°¤„œì2Ó3HKK#-5•ÌŒ rsrP4€ü¼`üx²¦OCÓ4¼õ mk£qÝzÚÀ–™‰#'§wª€öÕ–‘Aþ¼y¤Œ†çH%ÑÖÖï§¡é&@ÙY™Ÿl·÷Ë…Æ’’‚%'›¶­ïC*eCÓH7†_úR± ö¬,ŠêÄ1 55ÕìÚµûT>*}ïÞ½…Q›ÍêMKKó ‚`î-++;ÐO×ðWÛó ¬†™ñÇÀÖ‡“¡¥¥ 8ˆ”äd¬ ˆb<‰Ã\ÇEQ@‹…¤ä ò ÈÏÏÇn³Ë®‘£GØÖÔ„=ï`1&pû´%<“G,3žtîâE¶ï}ü¼B¥¤x é¢ys˜¾?æø;¢`VDácA<ù‘”˜f»Ïç%‰°ñ½M¾—^zÉÜÔ}BÇ6 s´ïÆXtòÁfcÌ-_còw¿KziégãË4þœöòò.3À‰ß½ÂY³¶´Ð°};{ž|’?ÿ{œÚ 64ô“¬äNBrq ŽÌÌNãZý)°¦¥‘3u*icÇr» TUõ¼Ô.kŽR_¶}΂¬}$;,®È_¸KvžûQýW.ôPˆ–M›iܺ%- gn®yúY[À9 ˆ´‰RS,lŠ(ºîН¸¼×ôÕö–fuu‰@EêêêØ³çÃS¼ ššš¤;wÊååå•yyy«SRRþÞôNdA@Ú»wï„Y³f&Ûì6A×  ÄÒRìG‡$.V)$^½5'rlMcë»( X­6òòòÈÊÊ&ÊcÇŽIV,ŠzðÀ!°,V hæ4µ3 `RÝιäÒ‹ì×^wm®Ë™Äàƒ±X­nƒÃ‡Sq¨‚;wR[[K8ŽIl*äåå2jÔhJK‡0xȤ ˈ¡È <G*sàÀAõwü®¾¢¢b¦¼n¸+øðÕX [–7g6¿ó2†O8“OÛDEáðo²ö»ßí2c·ee1ê†/Ѽ{Õ«VuY)è;¤˰Ë.#mÈ`RFq¹Ð£ÑÓãæ–$Ô@€ú 8ôô³øì>]Ç’™É€‹/¢è ç÷->@’Ô7pø¥©yõßè@Ï« †¢@æôé ¾ú*RGŒD”¥OµŠÕ­Ê…hú±ãìíó&¤ïßOú®]¸‡óò¿^Dõô*ImÜúŸKéÉlð·Ýv[ÆÌ™3’­6+ÆÇÑ1¨2™§ccØFBG¡µµ•`Дå¶Ûm¤§§cµÚ: ±N‰Dùàƒí457²ió&÷sϼЊ9!p%&KáÙà4±ï·Ì™;ËúÍo3Ïis ¥C†¢(J¢”o»wïâµ×^#%9…ââ233p¹’ˆëpG#Q<^ÍMÍìÛ¿¿ßϲ —1iâDdYƈñ`ÀëóqøH»wí‰>øàƒµ@àL^¾°a˜åþyݽ®’ÕÊÄ;ïdȲ¥(.×gzA"^/o~å«´íÞõ™ü[NC.¹˜ÜñãÉ5 [ZZ O ´j!È2¢$¡«ý«%(JÁæfjÞ^ÁágŸ%ÚÖÞ«Q?C×q ÈàåW“7{¶É™ÐGÎU$ÚËË9ðäS´¼÷†ªõ¼§o …]Hɲ¥8 ?³ÀöÓ²´Š 2¶o?vÎ ƒÖñã9‰°ë¯¥zÕêÞ°bJ”¿ÚÇIKo­xeáÂ…¹W^uevvv–0¬t˜Éµ«Ú1O'p´¶–Ý»w³eËftÍ ;;EQ0tŸßGcc#É)ÉL:…‘#F’ž‘±$N7LlÁ®];ih¬góæÍî§ÿùl+æ(åRú‡‚ë)Ù™Øü299Yºã‚þñ IDATï'wçÛ,qPÉ ,Š%6úmÐÚÒÂßÿþwš™° “0ç3q'ÇŽ;hùòkrsss„ÒÁf"_Ë 3í§©±‘ç_xíÛ·“‘žÁ¤ “7nƒ‡ ¡¸¸„ââb† )eÌè1ädç°mÛ6ÞxóMÜn7yyyf@ûÌÌÌ,</é6»Ýª•ïÝgÅœH8í˜ÏÄà1 ûþ~œ“kÍËÉÇåJJdéGŽáo{ŒqcÏ¡tH)®ä$‹b‚…ŽX€ŽŽ@@Q"Ñ(®¤$þóŸÿ““MVVºf˜¥']ÇfµŽ„±;ìJ0T+**Æböë{òT¦ÆJs?Ò»ó–Œ ¦Þsoû†)Áú—GAÀ]YÉ{÷?€êó~¢ÿGIKcØUWrέ·2ñ»ßeäÕW‘9j¶ÔTDY>ålVEÊŸžª7ßâà˯кÿYcÇàÌÉADûO}Í0°¦¦’=u é'šø€#•½Â„jk©_]†¿®gñ¬i}Œ˜?kNÞÇQ½ÞžãÂaZ6o¡qÛ6”äd¹¹}3ÙПL’?"4ŒFñdç Ùm¤””P¼hÎü|Ú«ªˆ´÷ˆÛFÆäÑ_«ùŒük²,_|óÍ7ç 2PT2«Õ–¨º1@à{ïmä•W^eìØ±Œ;gÙÙ98\.‹Y’$I–$ Y‘q8X-VR“S¨¯¯ç­7ß$'7—ÌŒŒÉRfz :‚õuõE±ó±ïtºuδ`)pÝ’/œg_¼dqš,)äåæ'n–ªª*ž}öY-X@fV6›A úëì¸Â‹’H[«‹ÕŠÍf'ÉåbÕêUdge“™™ L†@»ÍŽ?àÃb±ØÞ}÷=A×õFàTkßc0AŒ—Ñ 6?A¸lsz‚™3ûÍÈ” JlýíÃ4l|¯ï?[’È™>‘_ºž ·‡ ßøÅ‹‘\Xh¢Å{Éöç­®fíwnO8ÙöØ÷üóèšFæ˜Ñ(G¿päå‘3k&ÎAƒðVWmmí±ì°¡ëxö ~Í:4MÅU<ÙÑGúŠBÚÈ‘äÌž ’„ïðôp¸Çûmi¥aÍZÜGcÏÊÆž™iâ">€¡ëT?ùOŠœváXPnhàýÕe¤Ž‹h± Y­dÀyó­6ÚŽF†zò/3/bð> “à§hiÀ£—_~yÎôSy¹¤$§Ó%1̹ÿW_}ÆÆæÏ[@Ff6»ÝœýÌmÌÍNÁ0ï1ݧËEJRkךcÉ 0ïOA$))‰ú†zd]½j˜KæN›ñÀ3-ø_ óö;¾­H¹(¿Y6K;íím<ùÔ“,\°´4"ÆFCQDÄU`Ž÷™ù»ÛãFÓ4$YÆjµ’ät±rÕJ† †ÓéJPA0u¬ M ‡ÂúÁƒ bμ»QøeÀS± à¤+bÒ!L»÷Æ~ù&lééý%Jõ[·²íÿýCí[€]éUW±ð÷¿cÄ•W3~<¶´4DE點µ,±õáGhýȘ•¡ªÔoÜÈþW^ÆYP@zié''–ÔSç*I¤”!oî”´4Üûöa„Â=ÇÓC!Z¶n£qÓf””$œǧ´íÁ¾*N'ÙS¦1iŸ@uuÏFcØž`u µo¯ äóáÈËÅ›Ò9m“Q¤qý;Ô<ÿ/† j:·Øu‘…Ýk×£;¤Œ‘x-IIäOŸNþÔ©DC!¼••= TÀ’˜#Þ|Ú$AßÉÏÏŸ}É¥—dåææ y¦œ‰a`¯uƒ×_ÿ7š¦1yÒdN'’»'ãÛ˜'¾BGr7ŸÏEQ°Ù¤$'ñþömˆ¢DA~!†a`Q¬D"Q’’œúîÝŠ€Øv6è6 øÖä©“­_üâÒDA"+#ÛŒu矎I'‘%æüEQH|$ѬÄ‚‚ø_¨ ÃÀãñ jj¹)Š«ÅÂ{ßeÒ„‰‚ˆ¡›­EQðú¼ƒAyó¦Í"ð.&˜¤+³c‚ œTûV$F\ÓgœñãûÝÑ"Þ{à<‡õháëÊògÏ¢dáÂXÖÇ в{7›~zÿ 3HÕï§òÍ·°çæ’1bxÿ{tÉf#cìrfÎDE<åûzqJ¢mí4¬]OëÞ½Øss±„˜¦7€-3ƒÜÙ³H6 _]-áÆÆžÓ ž?¤vu|@_(#~&€@ճϨ¬bРȲŒÇëåhM-ûöí§¹¹•Pc#y‹ÏýØ3ãÈΦhîÒGÂ×Ð`2džÚ9€I˜@¼U|zà@xxñâŹã'Œ³åçæc³Úâž ƒíÛ·S]SÔ)S°;œ1¶H:9}!>˜hí ±XÐôø¼¢ˆ¬ÈØl6\Nï¼û%ÅÅ$''› vGkkÈËϳ½õæ 7PŠÉ-s6ègv0åë·~559)Ùš‘š‰ÍjÅöí+Çëõ2lØ0ìN'¢$!J"¢(!J’Y%D!Føcóþñì ¼^/ÑH[)úkkmC òó„@ÁPUŠUUÕá–––z +Ú® àaLrŸ“2†X³³™vß}ŒºîZ3ËéG£P`ÿ*þó_>üûß»½èHv;Ù“&1éÎ;ýå/SÿÁ„[ZŽŸžäæ2ð¼ó>‘ìÛÀàŸüïáÃ]n—5e2o»­[ZŸeEÀššJöäÉdLšDÈÝÞs|@Ì!‡jk©[]F ± ×€"¬©©}ŠÈ›?[n.¾ÊJ¢nw÷UGhÙ¼™†Í[Q’\8òóO;|€ Ô¿½‚HcÍÍ-ìܹ‡=–S]]C[»;i«ä,>ï¸÷¡ I¤Hñ¸ ñÔÔnm=¥B&øx,&1Ž÷S8ìóeY¾dÙ²¥™…ùb~v>Çchkoç™gŸaæÌY¸\.$INdõñ¨EˆÄIÝbN?æþE×›Xó%YÆbµâ°ÙY¿a='LD”LÜ@(DV$! «²`j9ô/»ȺþK×fkš.äe癥|Ýà•W_aü„ñ¸’’‘$ I–E Ic€øñlÃèüax¼4MMô“dEA`ÓæML›2Õ,™q•@ ¿ß'ÔÕÕG:dÅ,ëÏŠ€§‹c\—–7gszˆ‚™3z'¾ò Z¨¥… ?¹ŸpsS—ŒäÁƒ9çÖ[õ囘úƒ0ìòËI+-Åž‘AÅëÿ&p^[V&C–-ëóÅ\$Ž®ßÀÎ?ý©ËÏVRS™óЃ$ÅGÐú³%ð¹äÌšIRé|Õ5D[ZzŒÂ74 Oy9ukÖ¢i*ÎPú…ŸÀŒ gÖL°(øT¢…B=Ç´·ÓP¶÷‘#س²°ge6øAðWVâÛ»`(„¦i0J±²añrÏ;÷Ä\†dµ’9z4EsfFhݽçTw¥sÂê->y9Ý/O˜0aÊÔiS]ù¹‚ÓáêšÃÛo½ENnééf' ñ¶cºŸŠÂÞçžÇ³¯¼Ëí.[Æ…/¾Èèë¯#oÒ¤Äܹ¡iˆ²Œ%åÄ\Gí¢…û¾"õùØöÈ#]Ÿ[A`ÌM7‘5fÌiõš†¤(äÏŸÏ´ßüš¡ß¸9)©ÇŽPE¢ííøËߨôïrtÕjóšôAPjhö¬,F~íkLùŸß»h¡¹Š÷Ôi‹"-ï¼Ë¦o~›Ý¿û=¾ªj³²ÐÏñ†®“=w.bÈÙç-BìFÊÐuœùùL»ë.ÆÜòµž€-À$XKù„{NVV–Íår 6«ÍÄSi*º¦ÓÞÚÆ¶íï“’œ‚¦i„Ca¡P§Ê,B@·Ðùg1Îè fë7ö%³ ìJJb@q1«V¯B‹ªºËéÂÐ òòòÎÃiagJ`8pݼùsãÆŸã‘pÚè†Aù¾r‹‚ÕjC×u¢Ñ(ª5¿FUTUň)ú $¿ë5%ˆ& hs·'('ǫ̃4 )))IHTšÀÁvZZZ„mÛÞ÷+è,4xS»»K³0ëÁŸ1⪫ú&ÓúÄJ–"íòÞ¢N`ÍMM8 ò»¬âœZ`ÃÌž-/oeÑööãŒH„æM›hܲ%) g~>b?ƸJŠI›< 9# %3ƒ¤Ñ£(¼ê ¾°¤ÇD_™£G“T\LÝæÍè§VMƒ Üð ­å—Ï™;;­¨¨PŒþ1 —^z™Œô ìv{̹‹4ZDI<6KÜÌ5ÝÓÆÐÑ ƒh$‚Çãé´Þ›Ôîf¥$ ¢ùùyèºN DGÃíqG÷~XÊ€úþþˆËœæp:]蚎!¨±HÙãv“šœ ‰þ¿$Ê&)„#‰ˆ=äøû’l²úIR¬Ü…]Áˆõœ$ƒ8ÖÔjµÑÜÒLT‹v"ªˆgH‹E ƒÎûû0õd™ÕàË/câ·¾…#3]ëß§¨(Y±’ª·Þê:ƒ>œ¡—^Ú%zßÐuÙY]:¯ˆ×Ûõ6§”ýKì~℻ܮhÑ" çÌîWüó½-1¤äÒR6mæÀOà;p°à»05¯¾Fúu”\q–,ÆÒBC†¦!Ùí”\t!ÙÓ¦RùïשzùT§Gû*HÃGØqßO¨™3›!W^IúèÑ’Øï®¯¡ë¸JŠI<=†€cš$=µÁË.À–žÆ;÷ÿŒ@UÕ©ø•û€-ÀÊ>>ÔLEQD›Í&¢HT&F³£Ñ(•U•ŽFÍÉ­eþc n²,'2{=îÜu#1‡Í–o¬†‡šB¢ÙÒ­8Äĉ0b,¯¡h”¼¼¼ø–}:<ßgJ H’”`‡R5 A€¨ªâóùÐ =áè;½ÄK”,%X£dYî˜?{ý^t]OôŒü)¢‚1Þ€P(„,ɱÆñÉ#¡J€x“õüQ_ù2çÜr ŠÝÞï?@Äífó/~Þ%]® IŒ¾ñœ99]÷Ù ËI²{Ã裙Q iç.ö¿ðB—ÛYÒÓ}ã&ÚúsF9kh‚¢7g6cÇR³j%‡þñ”™e÷¤- ЍnþòWjßz›Á×-'wÖ,S·—çNWUl™™ ÿÊ—É›;‡CÏ>GýÊU&HçÔ÷U–i}÷=6mx‡¢K/aÐ%ã0À úÑu6 #öl}vÝu fÌ`Þ/ÁêïÞA¨®Û¦6àÀt ¥Óa±XÄø=§jj‚¡ÕínGÕÌ*n$Ž¥^[M®«Åšðñ IçØˆ`0DÓÔc'R:U¾, ¨±öp\8ÖårvJ:û») À@ @³‡O¼ßcøñù|_ÞØËïÅçóá÷úðyýø;¾ûÞëñÄT¥‚D"Ñc7D"ê4å)X I¹Ðup(D$Ñ1ѳbªùu±"Á„ÛogÂ7¾aãNg#;ì|ìqüÕ5]n—7sÅ v Àhq%uù¾¿¡¡Oö]W5ÞÿýºÄ, ½ôR2Gú\‹ÎºŽ%%™A—^ÊÌ?þâ+¯èb^••ìzèl¹ûZwìè³ÀÍÐ4R† aÜ]?dòÿû©ãÇ%dÏA‘ê_â¯ßÊ>CÄíF?ÿ9”adÇüßü?”ÔÔSùÓRàú–[×uMÓŒ8±Zìg|~Ž„Mð_$L8&Š   C‚ÁD–¯ëº‰ËÒttUC×4ü~â{]ÓÐUMÓÐT]ÓEÑœºÐ5tC S$NO<§E ðL©4ÔÕÕë’$£FÕDŒ,Ë2ápM7+¢("‰±¯ñ*€,!‰’™ùËЬ˜ÛÆÚQM# Ë2rTFVdIJ”„˜z  ¦®¸©šŠ»Ý­«ª¿a~Œ t9~Ħ(L¿ÿ§”^tQ¿Ë@N¸Ï²LåÊ•ìzôÑ®Ë46cnº Åé?ûÿøGŽ®XÁÐ/]Oޜٟÿk®ëäNœÈÔÝņüðT®É—0…ÊÞí«d.‰è¡PÈZûh•1!‰Š„!>ÄËÞµX  ©ªù²X°X“' ÁêjU£ø}¾cUÚX *tЃ‰F£(qfAtà üÇðAþÓẞ)Àn@ß¶ukèÊ«.#8Æ’’Œ§Ýƒ×ëEŽ‘þ ÄÎí€X K2Š¢$$ü±ÌPV3PU”F@ÀäL÷üdefur†abª««£±7æ#»r¤Sî¹›!K—žV=æ`k+Û~ø¤Û/YLîÄIÝ>¶“ìød£2¨‘öv¶=üp— A}ýõ$|nzÿÝu i#G0áž{h:o ûÿÁC|L1«›€‰P÷úhZ·ž’«¯¤hñb¬}PU$›’ —‘=u G^y•ª—^Fóû{„e™`E¾£GϘ뭫*—,áÀ+¯Ððn·µ;âì¥WÒ7tÁÕš¦éÍÍÍšJ×SY‘Mç a±Zÿ³ìoŽrkÇ@ØšùRb [¼ÐÚÖJ8þX¥Êd…5ƒ€P0HJjjb=×Ô(V›…C‡ã%¦ÊÓášž)@¨?x "?áHXˆsò²­þ}|>Šbªþ‰’éüãd@’Ø9PdÓùËŠ1Àˆ¬(ȪšÔX0 Ñp„¶ö6†+í´Sáp¿ßG}}C“<âê.ëiW]Ié…‚(žVefkr2ç?þ8o¼Éæ8®.¹’’¨n©ûÇ–í=QPW×+DQ‘ÙÿÒ+'¥*Κ<™’%‹Ï(çÿÑ@@”%rgÍ ýœ1Ô®.ãàãmk7ïÕSN³T¯—ƒþ+5ÿù/¥7|‰Ü™3‘âN½qbÑ(¶ÌLF|õfòçÍåÐó/ÐðöŠa,99Ÿ~¢‚q&˜ IX\®Sý³/³1é‚{kûµª²:¢jšEÓ´DU5)) Q ±@HàSâ캦›¼ª†¡™55«»¢ˆªi457¡ªjâšÆ?Çô š¦áõz)ê@ò‰Dq8ílzoSˆO‡ëy&1ÆÎš=ÓêpØE± Ë2«…=»wãv·£ëZ§ñ¿¨ª¢ÆFUUEÕÔ‰O¼”äóùbsý±W¬'eÄ~6t¿×ÇáÇ™2e2IIÇÊÖ>¿#‡hïlx×cJmײ§Neê÷¿‡%9ù´<ù’ÅBÖ¨Q ¾èB°(4½¿½Óû×/§ô™û¢~?åÿ|ú„ﻊ‹Ô Çì©®býÝ÷tÙû—l6¦Ý}7éCKÏ'pâHÀd”K>œÜùó0dïþýfõ¤‡,}ªÇCã†whÛ[Ž='{vv¯fü;î«-3“œéÓH9S¡Úºî¶®3òŽÛI9òŒ¹î†apø¿ÿeÏß;ÕgJ\Àó}Qˆ.°Z­Y£ÇŒr$'§ ÄÆeY¦²²w»›ÍÔs‰ïwbœ#q¹ôø-Öëw»Ûq»ÛÍAü÷±u< Ô=Êè±£IKKC×uÜž6"шþÜ3/´Å‚”ž ú_µc©Ýa&Mžè ÃØív¬V+Gkk Cx=žDŸH9x5vD"ZZZp»Ýø|>"áp‚3Àèàø;†A4¥µ¥…p$Ìœ9³;!¦[Ûšygû‘>ØáÁT×:îÌš ŠL¿÷ÞÏÀÌârQ0}:…óçákjÄw¤Q–™ñ³ûMÍ‚S°h @ùÓOŸ˜+Àfcè%—ô0ÓÙú›ßÒ´uk×QåÒ¥Œ¼öÚ~K¹üYŠËEÖ¤IdN›fê TUÅ©2O9ÖÖR¿rþæfœXSû@Å/ÆÑá*.&oÖLìx««ˆ¶»Oz=S&Œcø 7"HgŽ:Vá¨øÏÙøÀh¡I¯Ñ™è¬§–§ªê¤aÇ:³²³D»Ýqì™%6mÜDrrò1&Ã’¿$ˆ}L§®éºj®ñáh˜Ú£GÍõ?öÓc€3 O»›ê£GY´h!’$ 0Щ®®ñ–­^ž6ž.NñL±•@ó+/½ÆE-KFU)EOE%&NœH]mÁ`Ð,óÇz=ñ’ÇãáÀ‰J€(ŠØl6’““)--%++ EÓPc#²ª"+ ªª …¨­­å¼óÎí´¨ƒZ[Z-[¶y Ãð'$/ùâÉ<ésUbÎ9’E?LÍú Ô¬[Gr8óe‡ÃXž ?jkE ‡O™ PEÞßNÅ«¯v¹-;›Ñ×_¨Èg³ÿã8W€ÔÒ!Lüñ}4nÙÊÇÇwà@Ïe‡5ÍĬYKÉò«):o1ÖŒôNÿ¯G»ªiÈN'%Ë–’=e2G^û7Õ¯¼‚æó_ ƒ¡× Éf=-&pzëüÛ+*Øõ÷ÿ£â¥—º<Ï¢(&fçWÎöôÁ^­ôz½_ß¶õýÐðáÜi©é‰µµ´t†`*³Šñ±o­C…6öR5 UVñx=´µµáóùüH’DzZi©©±i®cå]’ˆúý4652yò$,±u%ðãJJâµW^÷ÅöïÍÓ¦2{†-KV`zzF†1räG8Ánµ‘äráö¸ ø´´4cèF¢üÓÖÞNMM .— Ã0ˆD"H’”¨466bµÙ°X,‰²9ôOÛ,ßþþ¢E œ†`HV« I’(È/àð‘èQ•¶¶¶„.@sK ™™™f6‰F‘$ ‹Å‚Õj%))‰Ú£GIMK3GÎb7K$&à÷á¸ì²Ë„eÛ‰ IDAT°Z­ b ¿ßGÅá ý©'Ÿn ƒ-˜2šKŽ·Ã–”&~ç;È]ˆ}|›9QM£ü¹çPýf¡C/» KRR·?R”%¿ñ{ÿñ.÷)uøp¦|ï{(NÇYßÍŠ€¨(¤ FÞ¢…V žò}è¹ëO1P½>×­§mo9¶ì>Ä€‰˜6”# µµª­A@´XóýïaKOÿÜ>‹á¶6ÊŸ{ž²ïÜNͪÕhþÀIÿî _ø?ü0‘H„uëÖh³4ÌÞx{ìª7 .TÅR:t°Ååt™Ò½äæærèÐ!š›šQ%1†mÄîCÃ0Ø`?;wíD7tü~?‡p8Œa(Š‚Çë% ’žžžXÓ½n7õMM,\´ˆEE´¹Ûp¹<õÔÓÍ‡Í €ŸÎýÓ¢˜=¨óš[Z"³fÍHòûý8NdY¦¸¤˜#••æ(Hk+¡p˜ädS"8ê1¾€x›†ÅbA7 ¡ ¡PP8Ì5˯&-=-.BMTRßPËK/¾â9pà ¸ xÜabgQ£o¼álùx7¯Õʾ½H¤­í„N§ô’K°gdtû3C­m¬ùÁNü™˜HèIwÞIîÄ g³ÿ²ÃAÖäÉd͘N¨­@UuÏðñkV[KÝÊ•ZZpäcMIíC|ÀrfÎÀ^÷H%E—^BþìÏçÜ¿®ªÔ¬]Çê;¿Gå믟°²öQ›3g<òˆ¢ÈO€¾hì¾X_WŸ4hp‰#-=CŒóÿK²Dii)kÖ¬EUUs¼[0eÛ ¼Û·oÇáp$p\q^EQP—ÓIkk+I.V‹Ÿ×Ck»›ÒáØ9k ‰Fê8äì¯wDzÿŸžVkè¸íΩ©9Zät:Õ‘£F8ƒ¡ 6››ÕÆÐÒR°X,444àp:E“gZ‹õšeYÆb±$‚€8àO’$¡ ºn`±ZX¾ü233=`ºNKk3+V¬ ¬x{e«aŸÄ²ÿÇ òózé¥g€T޼½mí 7rÙ¥8²»GË-*2»ÿþT¿ýv—ÛåϞ͸[nA”å³× Öš–Fþüù¤ŒƒçÐ!"--=®`x÷í§öíè¸ LUÌ>ª\¤N¤}Rþ‰Ó.ë—$|G²ýO²íW¿"ÒÚÚí¿]´h>ú(ÇÌQ¼'žx¢#!ÎG­ x»/î  <^t´¦Ž‘£FØ]II‚)õv»±çŒeݺu昶|,hw·ãõz‘$)!§ÅØýEI¬ë²¢€®#:n¿Ÿ’AƒXrþ$QDÓ4ÚÝ­hº¦Þû£7D"‘(&ƒkãÙ ÿÛj`éŽ;mYÙ XbD#X­6,V ÇG7tÚÚÚÐ4 Aã ‚` It¼Q4M# šÕIdìØ±\|ñE¤¤¤˜3¤ºAk[ e«W‡žî_Mš¦5Ë19 fs·£–ôt†]rqXË>÷&Š”?ó Á.zŠÏ]Dò€ÝXÁ}¨‚wKå3ÙédÚ=÷2°äìùï#sP¸x1¶¼\Ú>ÜÛcrCUiÛö>õë7 §¤àPÔgcƒ²ÓÙ§òÒŸ¹ãEôh”Šÿü‡õwßCýúõÝ®h ‚À-·ÜÂÿþïÿRRrìY°Ùl¬]»–NX`2ö…Õ©gT(,±9NdIF@Àår1yò$:Duu5J,`ø|>dYNTuDe7¾® ˜Q$‰‰S¦pÞyç!Ë2ºaÐÚÚŒl‘Œ¿þù±†ƒ©À€WO·{àLõ*̾û²­[¶ ™Y™FqI‘=Ž`µØe™’â¬V+‡@œ<裀®ëX, ãÇç‚¥0qÂ,Š’@ôiºFsk«W•žzòé&MÓ<À5@ul“јdOrC!†\rÉI…oÎD“,*Þx_uõ ·)˜7¯[JAØô‹_Ѳsg—Û ¹ôR†_yÅçöYTI"uÄ —œ‡.ÉxÊË;kÛŸb  ú|šÉ›;÷s—±÷Iì,Ë´:ĦŸÿœÝþ™¨ÛÝí¿-**â÷¿ÿ=wÜq©Ñ††Þ:±âgø }Ç•¿˜VUU¡iªX\2Àj·Û’¿v»É“'“––Æ{ß# áq»1 ³’Û1±“$)±®Ûl&6,-#+¯ºŠñÆ›“†N[{ ’"ñäOÕ¯^µ&ó%wŽ÷Á™\Ã< \ <þèÿBkKktÉùçeé†&&'¥"I26» ›ÍF$AQ”Dÿ¿c Ë2v»K.½˜sÎ9çcÿ$ r´ö¨ñö[+Üÿ~íu·®ëíÀ@y‡ÍvŸh'UŸÿÿgï¼ã£*³>þ½wjzo!zG,(Šˆ b×UW×ò®««‹kYt±#l¸XP,t"„b%’@ $$¤'S2sïûÇ “>Á„šóùŒ†™{ïÌ}žç>çœß9çw ŽáØon<6F#£¡ÕcjOžT’€Z)¡T"'¶mçÈÊ•­^˵{w¥æ_»¿3ì‹­‡'‰y°«Æ“õÑÇ”ü¶åŒòdI&jÚ4t>>N5–ºTDE,&#ûÿ·„]o¼Ñfƒ+Gqssãé§ŸfÆŒôèÑ£ÅãBBBZ»Lw”’Àòº%+pŸ,Ë_®^µ6Ñh4Y§M›êÒ ½^i”&ªD† BŸ¾}Ø¿ÿë×­ãèÑ|¥dÛ¶Û Mû{*•ŠÀÀ@.¿|=z*÷j±ÔQQYŽU²J Þ_X¸å·­&`ðÐ…º.õ æ~Žê¾ùú»^¿mÞrü/?àí¦Qk¬ŠÂ·/{ùˆÝp|iÔ§=~l %ªÈÌÌ4-^¼¤,7'×î¦i–h6JóˆfÝüÜÕkê7 AsŠ.QFÚPÜ:¯Hõ±ãmv—³ÔHÿf³ÅŽë­xGõ¼d)Ï–Hf3áá ~åeN¦¦²ï­w¨ÉÎv> &Ë^~AC‡v)ÿFÞyÙ¡Cì|ýu 6mvúvì˜ùλîð‹‰ŽQ»»{ ŠÁîââBÿþýÐé´|ñù—‚P¿¯ÛYí{½§§'nnn§‰¨ µ˜ÌŠN_ûϼâÂÂ" ° x%Œ{AJW`YY<ß>ÕÕÕ½7üº±¶¼¢Âäë룮®®R?VPŸåo‡‰ìP‘.ظXü1™ÍÔÔT±oßÞºï¿_VöÙ§_”–••աćîšk¨] LDaËjú%úúÉu)àêꪫ)Ú±³ÅCô~~­6OÕj²ú‰CK¾nañMJbàã·Ù K:pz% ·îÝ ¿zúÐPÊ2÷:• êt$>þnÝ»w¡f6Åo1Ù÷åb6ýíoTææ:}Þµ×^Ë_|ÁwÞIppp½¢lMŽ=ʧŸ~ÚšÇþ.PÙÁ·YkÛc{–––Enܰ©Á××[§ÓéF (|Š‹‹Ù»wjµº~_w h4ºuë† øøáåíNyE…´fõÚSs_}ãTuuX<ŠÒ¸`¥Ë8½(7 $Æçå Ø–ò»i÷î?ôþþþ*;ã“Ê1V¤Õj‘$ ?/Ê+ʬ»RS«¼·°ôû¥ËÊrrrÍ(å*>¡ånX à˜f?4Ñûû4`@׆Öhƒ 4ˆˆqc©-/k¾i(7½åKµ'O²éïOSWÙò~$ªÕ úûß LN:wã/JwI›,\*ëÀ¶AûöŽ'lÒD$A ò@V‹ù²$výd¯¹ºëY±Gqæ^¶þë_úúk§Ñ«¨¨(Þ}÷]ž}öYÂI¢md,Z´ˆVöºwmŽWG‹X“eyðÞÌ}òšÕëªÔjj­Z«×ëA().aÿþõH†}_·{ÿîîîøùùÙú¿ÔY:Töâì—Ofü±ÇŒ’åÿ7à#:.áÜí¡]j¤ñ~#»Ž?þÕìììcbbTžžžÔÔÔ`2™dŒÚ¡NGii))))eœŽkIÀ.Ö+gK^"  YÖ•^ÏäŸ~Ä#4´kcknÞ¬VŽoßÎö9¯RãÀÞ¦õóãæuk›ÍÞÕjvÌÇÞ>jõÚaãÆqù«sÎj2™¨V#IVj NPyìµE'1”c5™q Â3, ·À@\í÷v±¯ Ô®z*²³÷Ý÷9µm›²9Ú†¼ñ:n—øs"¨T ¡Ïwß‘ñλX[©li°Ï¨T<üðÃÜ{ï½$$$œÑwÿöÛoŒ5ª¥kPZžíä!ðCé°ªAè? ŸËðÃô5ÕÕn{3¨õz}=¿‹½Ä[¥RŒ««+F£‘­[·J•••Å&“é¤Í‰{0]4ë¤KuÔ+~Ñd2=ôÐCs<8­GjµZÁ` ¶¶³ÙŒÅb©çþ¶çhµZŠ‹‹Ù²eË`-J\h J¼¿]{¾ VšÚÒÑ·ÜÂÐgþqºÉE—4‘ºêj¯\ÉΗ^F²X5¦nø½OúÔÞ½¬¼íöV››h¼¼ûþûõísVxßAÀj6slóod,ZDÙž=HK‹F‚[d$ñÓ¦Ñmø0¼zô¸$”ž ˆ …¿ÿÎþ·ß¡æp‚J…lµûð_ˆºå–K7ö/Š1œ’BÚ;ïR¶gÓ§FEE1oÞ<&L˜€þO„º¾ûî;¦Nmq+bÒ³4"¾¶=õ Æöž÷€||}}1›Íõ´ï ä øùù¡R©ÐëõX,öíÛ'UTT|4iÒ¤‡ß~ûíº‹i¹tiEùk6nÜ8ê…^ø²¦¦æÊèèh•½FÔbÛ|ãDޱ"µZMMMõèÑ£sÿvsfñ-Ùf4ÜÖÒ¼”íÛ‡kpÉI]‰h--h­–€ÄDzNž *5ÅiiD]{M6@Ùjeó3ÏR•—×êõb§O'æ†ÎÎ:”$ wíbë¿ÿMæÂ1¶:ϲ$a.-åøo¿‘»næŠJ<ÂÃÑy{_ô†€lµâFØ5W£ ¢bÿ~\#‰ðÁ‹ªV¿½¨QÍÉ“ìýì3v¾ü µ­d58OùÇ?þÁ›o¾É!CêÛëž©lذ+V´ôq!0%ìz6Ä€‚Æ~ ü‚"""z¸»» Ža]µZ··w}#8µZ««+‚N§ë—––6>&&fC~~~ÙŲf.y*3Y–½—.]zÇwß}÷o???ÐÐPÁh4*m~m›¨=[T¥R5 ;¾lðµÍhvÃß9w.}úàÝe´<§¸‡„0øÉ'è9aÆS¥ J•Šœ•«(Úþ{«×Ñúø;õ&DºE/¼#åвÙñŸÿ´«4Ë.¦“'ÙóÁä­_OÒ¬Yô˜pW׋º[d± ÐsÊ „ŒIMÁñK³ìÏÞ®wåJ~Ÿó*ÆÂÂvyýo½õV=ÉMGÈñãÇ[û¸…’ý\ÈaÛ+T­VÖh4*G’7{X×¾‡Ø_*•Џ¸81$$dÈž={R'L˜pÛªU«–_Fã%¬$DY–{Ο?ÿƒ5kÖ¼íéïï/4§LìF€£ç/v^-øË@‹¦¥ªŠ­/̦¶¸¤‹Ø ñOL dØÐÓÊ_©)( åŸÿ¤­¦dæòrÒß{ŸâŒ „z>ñNPdV+»ßŸmÏ?FÊßQª²³ÙöÜsì|ý j‹‹/~ÎAÀj2¡õòÄ·wïKNù ¢HMa!)/¾ÄæÇwZù«Õjž{î9¶nÝʤI“:Lù×ÕÕ‘žžÞÚ!YœÉsv§ÎžÈ­×ëqmDíh cÆŒñquu]6dȹ²,_ðú%eYwèС+,XðiiiéèÐÐPÑÎ mY­Öú¿Ûò¢ª««å£Gn@a¥ú³r %›u-ähNR‘ŸO÷‘#/Y¸óŒ7¨êjR^z™òœ:¾üÐ!rV¬ ®¦ψHô>>Š¼È²ÌÎW_cïGwè}žÊÌäDZÝF GëîÞ5ñ¡á#K¹+V²þ¯¥xçN§›ì<˜Ï?ÿœY³fáÞÁk#//ýë_[ΫùøýÞeWxxxˆŽð¿£ß׋ô-<<\tss6wîÜ1ýúõ[{àÀª.àÂPü‚,Ë~©©©,^¼x‰F£I ìuþ­>gáS³Ò5«#ëA Ä«Z”cëÖ‘:>²ÔEtÒ.‹W§£ç„«>Ìés,55ìYø!«î¹‡_ýKmm‡ôŸÈùe9Y_}Õ.ÏÅY¯¾4#ƒ-ÿšÅ`èšø‹LùWæå±ùϰù©§œnÞãééÉ«¯¾ÊÊ•+=zt§ Zyyy”•µ"O?ÿ†ShÓHo&$ \qÅ—i·ß~ûè.àüWþ"·råÊy)))ººººÖg€6çù;ƒ RSSÍf³ùi:®TJ2áTÚÌæ7øÌL­ŽÀädE!u•¶ý°‹"¾qqD\qþ}úP~ô(Æ“ÎM›¹¼œc7R¼7½·7žaajõ» Š”ee±ñïw ö÷ïߟO=Iòý÷ÑûŽ;ˆ¿õVBG_޹Ö@õñã-Bß5Gb•$‚û÷ïê^x(~«ÑHîÊUlxâIJÿøÃi7yòd,XÀ´iÓš@ݸDz`ÁRRRZÜ.QBœçx$ûúúúNðóókÕ’¶#vj`Ç¿U*ÞÞÞBdd¤[iiéŒnݺÕeeem{á….¨Mø’"˲¬«¨¨·|ùòWËÊÊâ½½½‹Å‚Édjð2 þ¶ÿ[jò-))‘·nÝj4›Í‹:ann>§Š`»"‰¼æjn» ÿ„ì2œV¦ÊJެ_ÏÎW_kWCA‰º~2 ·ßŽo|<²­Y”Ó¨‚Ñȶ—_!çûï[ÿ•Š¡³ÿE¯É“Qi4MòLÁï;ØöÒKT·Àð&ˆ"#æü‡èë®Cê¢Æ½@u¿À©H_°€ü5k>/00_|‘iÓ¦áååÕ©¿Ñl63tèPvïÞÝÒ![€+8wI€vñEqÿå—_Ð\Þ—}¼í¹Ž/N‡N§kð·(ŠäææÊûöí[?}öìÙ¥ʺºèY–ý³²²]±bÅ<µZæíí-H’Ô¬§ßø=;:Ðxc—$‰ììliûö퇭VëD`e'ýü,Ò‰ñ­Ü åYÉ]³†ºÚ<ÃÃÑ{{wU8·8PétøÇÅÑëúÉh¼¼)ܾÝésK÷ gõ¬F#ž‘‘è¼¼œwA9±};ió^oÕXS{z2ö½wé9i’r\sÇ žaaDŒGaZ†¢¢fëÉ=™ÄÞ|s p¡)~• KM Yß~Ç–gŸ¥lß>§Ï:u*~ø!'NÄå,Ј§¤¤0wîÜ&b´ çÁ°dY^•——7B£ÑøøøˆÃö¤ïÆ€ãÿKƒƒƒ…ààà¨L9rä®ßÿýè…°¾.Z@–eqöìÙñ[¶l™›––ö???½^$IM”}[!G1¤¥¥Õeee-®Žtæm;^@RkJ&'Sw‘¿-Q¥Â3"B)ë2œ«+!ú1q¦šʳ²œ:O2)ܱƒcÛ¶¡Òiñ GíâÒê¸[MfRçÏožºØ&¢VËo¿E÷áÃÊl×yxœLö²eÈÍ”,Zª«ñŠŠÂ/6¶k²/ „ªp×.6?ûO²¿ùÉI6?>øàžyæBCCÏJµ$I|üñÇlܸ±¥CŒÀãt\˜ôÏÊIàÓ¢¢¢ðêêê???Ucþƒæcåïøòòò"22Ò»¸¸ø¶ÐÐКÌÌÌßÏ÷ÀEiȲ¬«­­»bÅŠKJJF¢(6PþvEoµZ©««kÕ °Kii©¼aÃciiéSÀ“œJH XBŸ×& WZʱ )Ù¿½îÝ»+Ì]a§DïãCÄc4SY1•”8užéÔ)òׯçäžL´žžx„†*ÞvãqJ÷ï#mÞ¼Vç$ùˆ»å§ùdYÆ-0³ÁÀÉ]»š=¦¦äqÓ¦v…繈j5æª*2>þ„mÏ=Gmëuõ ä¶Ûnã³Ï>c̘1šÐ§=RXXÈý÷ßOuuuK‡ìæqö€œ °¬²²òH^^Þ8««k½µdWìŽU-)ûK¯×¡ruu¿`Á‚~3gÎ\¹víÚó–:ø¢3dYöÉÉÉy`ݺuÿU«ÕÞÞÞȲŒ$IØ¡ÿ–ÿZ H’ÄáÇ¥”””«ÕzðÃY¾-3°Ü†8EÐ]}4Ÿ¼•+©>Y„{÷î¸tí¬Îz^‚€Gh(½®»÷ˆN¤¤4ëU7«dãȪU”fgãêï‡{H8dí«42?ÿœâ´´¯áׯCþñt»ázY’Ðyzrð›o›7RJK‰ž2M'%uI‡¬>ŽoÙʺG!ͧµàà`>ùäþñpžõ%K–°dÉ’ÖyØtžúV«õ§¼¼¼1Z­ÖÏÇÇGplÔôßøåXR$ÆfddL9räöíÛ·œ7~Ñ”ÚJü¢vìØñÆæÍ›ÿãåååk¯qm\ÆÑ¸Ì¯¹ÛуÁÀ®]»,»wïþì8G·X < ¬w:°XÈþö;Vßs/~„ñÔ©®p;DíâBì 70eÅ ¸ßyÈÆj%ÍÖÜ}«x“œ®|’üÍ¿µz~üô[pmD]ì4‚áíÓâKf3µ'‹º&ö|Tû¢ˆ©¢‚]o¿Åºûî£æˆs‘EFÃO<Á¶mÛ˜:u*ªsÐ'¤¨¨ˆ?ü°µ$Ø›s>Ë^`pzzúÿvîÜYg4Û¥7ìïI’Tÿïnݺ1a„N÷ÛwÜq—,Ëç]ÒýEaȲ¬¶Z­Ã—-[ö¿ƒÞ¢Öjµ <û«­I”$ ³ÙŒÑh¤¤¤D^·n1//ïïÀÎ}ùJ1Jw«g§-JSq1i¯¿ÎÚ‡áð/˱šLõme»¤Íµ…kP y„k¿_J÷±c7êê(ܲ…ŠÜ¼zÞ€Ú“'1œh™­MãíMÄ•Wb5ŸY¢´J§mЯ±JNµúy—œ9ºa?N»…Ì8]MË7ß|Ü9sˆŒŒºõÖ[?ÿñÇ]Χ¾àµ€,Ëî999·þôÓOï ‚çççWOìÓxráÿæ`“ÉDuu5•••dggK[¶lÉ·X,×ßG·\‹RN³pEépå ¡¨ˆ#kÖPž›‡k@ nÁÁ*±+?ÀIqñ÷§ÇøqøõéCÑžL§ÊÝ"#9{¶2Æ‚@Ù¡Cdýï-Ÿ0ka—B–Ï,No,+cÿç_´8§Q“'ãÕÎþî]ÒYn¿@uAé úŸ9N—¡ººº2{ölÞyç Й´ämJNNO>ù$…-SËÀ_/À.iV«uENNÎåÆÏËËKÐjµõÍßCþŽÿE{ø@™b¥š 00PðññIZ½zõuÆ Û˜ššZr>Üè‹Ø ÿ mÛ¶=÷óÏ?¿çîîÞÍËË«%Öš÷ߨ‚3™LTTTP\\Ljjª%55u90€sO[Ù’@©DXG;øµ®YÚ{îaǼyT9Ò…´gÏV©»ì2&ó5ƒŸûg›­™GþûT6ï_ÌÕÕ­\}ûœy’ž P•´õ‚í¸– Šˆ*¢F ]½':j ‰ŠÑ}díZVÞ}û?ýÌé9¿ì²ËøþûïyòÉ'ÏI¬ßQ, Ÿ|òI[Üÿ©À¯à4¥CwíÚõ]JJŠåäÉ“˜L¦6äÆh€]÷„‡‡ W]uU²,Ë;gÍš5¥ 8så/±_ýõ;ûöí›Õ­[7µ½ÎÕ¾I5ž ;àˆX,êêꨬ¬¤¸¸˜cÇŽÉ›6m2¾<ˆÂ\u>‹äË€ƒ(}¶Úd‹…’ôtŽlÚŒxF„£us»¨»Çu胣Õ˜”Døøq˜jj›- 7Ž~Üß “ßPZJöÒï[й wÝÙ¤u±ÓÖ¼ZÍžO?åT+=àãoŽkpp‹ß,SuâÅüÁ‘µkÉ[·ŽýK¾¦8c¦ÊJ›!# éê/pÆÊ¿ôÐ!¶¿ü ï½G]y¹Sçi4æÌ™Ã¼yóHLL<'±þƲcÇž|òIj[f²”€gQJ™/D1ß••••åææŽñôôT»¹¹ ...Í&Ú; `¦ót:¡¡¡ÚÊÊÊ›<==ý—,Y²váÂ…ç¬,ç‚3éeYÖdee]¾jÕªùV«µwHHˆ Óéê›9Ø¿±ò·+{ûËl6S[[KQQ………¿¢°™V^S8 ø|èС=  †„„àîî^ßMÐÞY°q¹  Mô‘ÅbÁl6“••%oß¾ý7«ÕzÛêÕ«Ï qÐ…Ȳ¬ßºuë-ß|óÍ®®®‘‚ã 7¶ºÇÿ‘€êêjŽ;F~~>©©©–ŒŒŒµÀu@æ¼H«€ÀZ è8•ö_[P@ÞŠ•T<‰[p0®]¯s‹Q­Æ?¡7a— üȪ%ù¡‡ˆºzRE*Ëû¿ø¢ÅËEOzF€¨Rqð‡eY±¢Åc‚†!~Ú´I€¢FSßNv÷ë¯S‘ݦñg5(NKãÐÒïA£Á+2uWia«ÈÌ©½ûØô÷§9ðùçXkjœÛœU*^ýu^}õUzöìyNcýå—_~aöìÙmeþ?„ª¼äð¿cÇŽ%VUUõtuuÝÝÝÑétM¼ÿÆ€Mw5 G{yy þþþÇŽ»9>>~{VVV~—вòw[¾|ù=ß}÷Ý[aaa^ÞÞÞ-z=þÔL.@]]¥¥¥äååqøðaù×_5Ÿ8qbpJ©ÝÅ …ÀO(Ù·=îΞX¶?9«W!™Íx„…¡·åUtIëS’Ðy{sýõ¸÷èAôµ×6ÛµOE|ý5’ÉÜìu|ââðOLl·wYyä([þùÏV õžu!Ô÷Õj wîdų(ÍÈhÿ=[­nÛÆ±”|¢cðŠwеðÒqû¬&û—|Íæ§ž¢:/ÏéSãããY¶lS§NE{žµü>qâO>ù$y­ßÏ—À{œ_Ä?Vj¯JJJŒ999—¹¹¹©\]]777Ôju]ä¨ütX¤ÓéöÌÏÏ¿M«Õž(**Ú}V—è¢üu‹/¾íÚµ¯_>j”zÈ A„„„ wu¥Ö` /7#G´¨««Ã`0PPP@nn.¶oß^,IÒÍÀæóé~¯»î:­‹ú&¡ ‚à%Iòêï¾Yºª…S\€Ñ½(B©o½xˆhÏïðŒ‰!qÖDŽ‹ÖÓ³kswTª½hQ­fÇÿeï4û¹_ß¾Lüø#Tz½Ó_)ÕÕ±íåWÈþöÛ–t•ŠÉ?ýˆwȲŒ ¥§³î/9‡nM4^^\öÊËô˜0‹ÑxÉ/A¥¢8#ƒßç¼JI+¤OMÆQ£aðàÁDGGÆäÉ“IJJ:¯Œ€×_'Ÿ|²µCŽcC@?”Ф{#oúwZ`RÝ´iã”^½z}¤R«ÝA¨Öj´‡½¼¼~a#°E„ó!>9øò²Ë. 1b„»»{ƒ€£1`wHí´—§'a¡¡xxzRg±ÍŸaÝüÛæWóòòží2N+á‡~¸jñâÅKï¸ývבÇ#j­N‡Z£Ád4Q|²˜ôŒt¬Vk“€Åb¡ªªÊîõ“žžn9pàÀà6Ûb«ÅŠÑh¤°°P·wŒ={&!Ë |°û…^¨9‡³^,...VçææÕét*wwwÁÝݽI@–eT*ýúôÁÃMé¡¢JÑa*QERB’xìø±Q{÷íý]–å×¼`6›¯ª¬¬|ô©'žU6hÕõ«ÔjQÄZgÅR§UÕUŒ†ú{üøqöïßOzzº´aÆSµµµ7ž÷6cÆ ×¸Þ±KÜÜÜþìíãã‹ÖV3n/Ul$ûöî„’¬x¦âg{@¿Cáp®Z@–)ÍÌ$wýzQÄ3,L)ëÊh·ˆ*>½z‘ýÝÒæ½vY&í:J³³ñ‹W›lïÛquAiï¾Çï¼Óæôš2…ø[§+ÏŽ(rxùrö}²¨Íó4¾>$ÜuCŸ}†Ä»î"aÖ,¢&OƳWå¹9ÔUV5}^ËÊõ:ºNÙ¡l̵Õx††a5/Zƒ@Ej‹‹Ùóñ'láßÔsTE‘Çœ[n¹£ÑØ¢w¯V«™5k~çØðÞ¸q#Ï<ó f³¹3.ßè3ñꉗG„‡ jµÝ°X-˜Íu˜Í&L&#¥¥¥ú´´]CSwíìûâ‹/ýôñÇŸëf; ÃÖÌÌ̱’$¹»¹¹ žžž¨(¹eY&±wo¼<=±Z,(IžjQ¥Âj±bµXdˆ°Õ?ÿ8Ò`0¼uI², Ÿ|òÉÝ7ß|󈤤$A²ZO6@D¬«ŸEQš§ÊNQSSCNNûöícÇŽ–´´´Y–' t¥êlé\b˜ \ŽÒÈç¨Íjä¦i7% "[¢zF ëÞ­;j• «Õ‚ÅbÅb©kÒ‰Àh0 ³EwÄž$¿ßÛ§ »­55lÙBaÚnt¸wïŽJ§ë2Ú·°q DëéÅñßZî Pqèû/¦(=ªãO•R²?ûEʳÏR¼{w›ãîˈٳÑÚ¼ã©Sl|âIꪪZ=/`ð`ÆÌ›GÔ¤IèýüÐzx qsÃÅÏÀ>}ˆ7Ž:£‰Ò½{›þî£ùô¸ê*ö,ZÄÖ§ÿAUq1!¢óöF2›/CÀ®°ó7ndó3Ï*Í{œÌ“‰‰‰aÑ¢EÜ{ï½ 4ˆ¸¸8ŠŠŠ(--m`X­V®¸â FŒqN½ÿ²²2žzê)öíÛ×™_7|ø0!::%‹ÅJÙŒÉlÂd2c2š0(ˆ@ÏÍ›7Ý×;~ݾ½ûìÌz~·ß~û=?þøŒ™3gNŸ8qâèÁƒÇƼüüüÎD ò€orrrú—””„¹¸¸ˆžžžèt:ôz=‰ Xí-æmal•-_À®Ã, ®.®œ,>é™þGú^:™Añ|ï #feeõëÝ»·P_êgcѪ­àÀÊ„ŒN«£¤¤„Ç“-§¤¤Ô¿‹Ò¾·³“qÉÉÉO\wÝu×÷êÕË«{÷îjN'ÔÔÔÈiiiµÏ?ÿü­V«õÚ§Né­Q«~í×·ŸV£Ñ`2™æ5A!ZiNZiµy¦2%S÷*ài²àT=שôt6>úW_Mï™3HJBl%ù­K‰$?ãV ¥¥ìyÿýV…‚›(ØxfÔß}nÝ,µšœ+0´LÛ @èØ±Œ™;•¾y>Y’p bØ?ŸE–e²¿ù¦!T|ò$|¸°>)ñà—_rðË/þÊ+ÄÞ8Á騸y«üU*ª#}Á^ºÔéJQyúé§yôÑG ¬?66–¿ýíoìÞ½›ï¿ÿ¾ÞðññáŠ+®8çõÿ?üð«V­úS×Љ"%&2&4”?JKùtß>öW6ŒÂnÚ´™!ƒ‡‚(¨ÄKê™(í¶‘ (ÿ‘‘£äÔ©Ón¼âÛ¯—f9ò—3f öóóEQÄh4Êݺu£Gs¯¾úê¥?üðÿRSSuÒ0®ÌÌÌüOAAÁß®¹æMÿþý…àà`üüüês$«UáÎhåB}¶¨°ô’EfÏž-¾óÎ;?ô—‡‚ô..HV«’ÁlƒQ•‡BP<ÿ:k=ÁÂòUËÙµk—´~ýúòšššé(­(;ÕEuwwèþûïÿtÚ´i#¢££Ýzôè¡ |||ðññ‚‚‚´¥¥¥ž.nú ??ß·5^^^ 1„½ÕîýŸ¶¥ªªŠ#G:œ/b°x ØD¢T8ånT:Dî/?Sg4âѽ;zoï.4 Ò}øpêL&JÒÓ;tÜT:£çÿ—ˆ+®ÀjƒlM¥¥ìœ÷:ÆââÏóIJâÊ·ÞDãæÚ¦1'ˆ"݆ &gõê&<ö§23›ÜOþúõìýòKúöÅ7:ë…hØœÜÕ«ùõ±¿Q¼Óy’»˜˜>ûì3î½÷^<<<šzcj5¡¡¡ 2NGvv6×^{-}úô9§·œ——Çc=FQÑ™u’ Õëù×À¼=jS{ö¤—§'ù3>ž)={’àåÅÁòrª-rrsY²äkvïN§¦¶///Tj’UÂd6a4*a£Qy™L&$IÒ3õz½×¤IW_9vìX—nݺáãワ¯¯àëë+¸¹¹©ÜÜÜ»wï~—¯¯oyfffj'Ù:ƒÁ°cÏž=$Irqssz÷/–:Ýmð¿Ú–0èˆXê,LaÉ×KŒ(å”—,@]]Æ\gFàtâÄ?ö=FFY±°³²²¤-[¶d“Q`÷NÕýýû÷gÊ”)S{ôèáNPPP}&¨J¥B–e¼½½‰ŠŠr?QTp¯··* 0É*9xþ6âï߯Ìêà všbý Ei0´˜<D9s²Õdf»j5IwÝI Ðûøt• :!²ÕÊ€GÆ=8˜Ô¹¯a5þùp¦ÖÏ‘/½HøèѧKòÊ£G)k²¯÷N5†>ýw…Ú$G–Ѻ{0ðñÇÙôècÎ=Ïå嬚1“¨oäòWç`5™.˜¹²WO¤¾ùùm'Â5Pì3fÌàé§Ÿ&..®Íã===¹öÚk2dîç˜rÙjµòᇒq<Cýüx$9™ñøkµÊffÛÃÀM¥b€¯/üý¹?9™½å失£°éé¼²};z½žØØXz÷îMtL/‚‚‚ ¥¢×ëõ†††â·7ìÑëõx{{ ÞÞÞîz½~¾(ŠÃ/^|G÷¾F’¤«W¯þøÄ‰£ÇŒ£¶?‡õÕ4Sê%+º, Q}¤NFTÏw@–$©ªàxÁé‰wÄ€ÙF¬Pïùˆ*rrr$È¿³•¿Ï!COžë®»ŽÐF´ÐmtÎï;55•?þØùß L çÄD†…„à¦R5PüÍ®„èïåEn‰¡¶®Žƒ55l=~œÿ¦§óíž= Џ¸ºÐ+*Ša#†5 •ʲ¤öôôl6WBÜÝ݉ˆˆ@§Ói5Í-F£1`éÒ¥7ÑypGñK µµ7 §ËiÒ:ûËÁ­7âµZ¢££5YÍô¹d A¤ØØØ‚ãÇÓ¯_ß&t¿Jó’Ó–S½ ÄË:;ÙÏ{àÀÿ»úꫯ W'$$ ÓéÐëõètºe öI×h4H²„—§gýäÛ•¾ÝªmM ­°¼u€<¼€R› J¹à(I‚Ï¡ð蜹PáÖ ·¦=mñ·Ü‚OLtS8£K[ºøÆÆ2fî\ ¶ÿNúûïS¶wo«œü dwwú>ô17NAçéÙT …mÀÕñÓ¦Ño×{yáѳ'‡9óP3ø©§p rÚ`8§{(Rš•Eê›oR°a£Óç¹¹¹qÛm·1qâDâã㠽ਵkjj˜?¾Sп‹JÅÝ11ÌŠ'ÙÏJÔ>KKB xj4 ôöf Ÿ÷%&òfz:Ï¥¦RUYÅîÝéÔY,Œ5²Ñ©r½ço'»j,†àà`úô飮­­½²¶¶ö»•+WÞˆ-9»3màeQo²;°b#ŽäÓž¿=§MF¦G§.iÀ‡9QxBAhœØØr²\€€pðàÁî@i'ý,MLL̇W^y嘰°0u\\z½OOÏ&É:vtÂÎ] ˲Rú!HœVüvåßZ`MM§*›Çÿ|£÷·¢T4Lþ$á$Ô¡¯¿&wÅ ’^×]‡[PPÐ:€¨Ñ6ê2º Lqf&…iiä­\Eõ‘#XM¦ã§ñðÀ/)‰^“¯#dÈ\mía›S¬ƒÚ¢–ÐèüüðŒˆ8£Ÿ-¨ÕNwLzàûõ=ï•¿ ˜ªªÈ[³†]ÿß.¯ìر̜9“ÐÐPèÑ£ÇÙWcÍš5|ÿý÷­¤Õòפ$¦EGÓÓÓ³¾\µ&³Õʶ'øìÀeg£¦Ù ÊuûÐ;¡7*•ÐMsbœEQ$((ˆ°°0urrò˜òòòEÛ¶m›NçÑ«ÔjAh†º¾>‘Ý®ÇZµZÝé$uç½àíí]Q^V.ËÈBcÀ>PŽ•Èàãë ìéŒßäëëûêèÑ£'………iãããqssÃÛÛ»ÅÅçØ;Ô¶äEAlËjr¾ÐÚ¨®êôV7c¯Pš ÝoC º9sAKU»ßø/‡—¯ Ï=w6z4Z®ü€VíQ«%xÐ º JßûîÃxª”šâbd«$Q«Á50—Wƒ–£-΃Á@]+Mhü““Ñz¸c5™Ïä;¥ÐõÁÁÄÞt‚>?5?¢Æwçü7)ÚºÕéS½¼¼¸ÿþû¹ì²ËÐëõxxx× üB‘ÂÂBæÎÛbÍ/wwžéߟI‘‘éõmÃüíÿªº:¶œ8Á»,/(@cƒ"gÚ¼ÀZ‹…]©»2tP«ÏQkF@TTGÕ&''_SZZúŸ¬¬¬ÿë¤á Ój4õH°è@\ÿìÚô˜£#+Ër§7:ïW¦Éd2UTV(Ö("Ø< ¡…؉ŒŒ§§'´MCyfn²JuûèÑ£gEFFº&%%áééÙªò? OI˜L&T*ÛD$Ij÷·yÿõ×j¸€«k:ôÊlhÉ’^B)Mù» ðpæÂ•YYüöÔÿ:v, 3gØ¿ª.ZáÖõª”ÎÇw»7ºúu«Õ"·Bàâ†l93£ÌP\LM -ˆeàã|Þ*A1–•±÷ó/ØûñÇí*U;v,wÝu!!!X,ÜÜÜèÛ·/æ‚\{‹/fÛ¶mMÞæïÏóƒ128w¦ã¿(Rd0°éøq^IMåŠ \PJ“®Eá¶Ë›1ðEN.Ñ1Qõ¢(RWWçt²´V«%99™ªª*—„„„{ wUTT|Ý Ãé¯Ñjц`«DQÑe¶—½º ™öÅÅÅÞTã¼7$I2•——ƒL}-(ø•c'înîÐN¾{'%±oß¾/FGGûôíÛ__ß•c8J–eL&“ þO;üöØ£k8V8Ôo´ÃÙòÖ »ìîB)Qy8µÓ[·Žã¿þJìm3‰¿å–Ó°sW~@§ŠJ«Å%(¨E cyù™uÊç`*)iõ°à#ˆ3æ¼gQ£¡pçN~í5Jÿp>ãÝÏÏGy„¡C‡¢V«±Z­xxxЧOŸ VùïÙ³‡×^{íôØ·DFò·>}Hö÷Gk Ãv”âÏ­®fu^ÏïÜI±ÙŒð1J7¡ðfNÑ t6ûB’Ø“±—á#†Úœ3“ÙÔqmõ«Eôz=}ûö¥¼¼Ü;??ÿÕ;w¦x÷Öét§é´Uªú¿@–äŠßþÊËËë2¬VkMYYÙéXº}ñ9$O8ÆNdYÆÍÕ œ$´i‡¸øûûÏïß¿Hbb"AAAøøø4IØ•~s O’$Œ&#ZÖá±aÙ_}N@³}°ÔYÎÆO§ù0@“[Ö¡4þ¸øÐÃ)ÏV’8ðÙçä®XIßî§ÇĉJÙ`Ðy N­&h@*³³›ýüä®4ê FTíTZ²ÅBæ¢EmØ}¸µ«ëyg¢ˆ¡¤„?~È/¾h×¹C† áñÇ'((¨ž³C¯×“˜˜ˆ¾ÝÏ)//ç“O>ᥗ^¢¬¬ µšG¸5&†xÄú0럜CA@TTðÝ¡C¼’žŽI’ˆÞG¡MõoãÉÀÝÀGÇ (++ÃÇÇQ¥Â¬ð4k4Þ—í‰ÚÞÞÞ$&& ¥¥¥ÝŽ=:¿¨¨èzZèTx†â¡ÕjëáÙfT‰62 G¥ ’,a6›9yòdm§ï çû¢4 §NªWˆB‡ƒzÅÅÍœÌXwÞPŸ4hР^½zizö쉯¯o“|„Ör$IÂl2+m=î¡Yè_hºX-Kgò8JT; Ã”Þ —£4(r:ñÒT\Ìï/¾Äº‡æè¯¿b5›¯K:AÓ „^vY‹×;Æñ-[Û¯D‘£6R˜’Òêq13nUÊ Ï3å/Û¶³bÖíRþŒ?žääd²²²(++S:”ªÕôîÝ7íò…"GŽáÙgŸ%..Ž'žxO“‰Ç“1u*/J‚·÷iåÿ'× E–I--å±-[èóí·ÌNKc¨$±HntBùƒ’±ü7›1²7s_}§=ƒÁØdŸl #š1"##‰ŠŠÒôéÓg˜Z­þkG;Z­¶ÞëW9äÐȰ¿lho§'}÷€F£)5 ²Ÿ«ÂêöìIN'N¸ê]íHQGIrÏž=ïéÕ«—grr2~~~­òr7†þí€ÙlF£Q#: Žå€Øm¡I€º³Çš&ãQHÚ#ù¶gr± A‡s )IÛͯiÓsòdzϸßÞ½ë;uILjd±Ð}øp´þþ˜[€ëõ5üq n»ZCT©(ËÎ&å…Z-UT¹º?}úy•ø'ˆ"5……üñÑG\üU{œHNNÆÕÕY–9räÄÆÆ2yòd|||.Œõ Idddðþûï³xñbjjjìëË›W^Éݺàê ’¤¼:@ñ›¬Vv–”ðþž=|› ²ÌÍÀ½(ñCí\6¸øè„ÒCAT©0›7š3êëñm{vŸ>}8~ü¸×¡C‡ÊÍÍý…Žãá×éuúú$@û÷‰¢ˆ$ÉJÀ! ɵ†Z€òK¨¬¬±J3 †ñÿÆd@F:‚GÓ]¥R=í×·o_{y¡s›m£…W_¨Q70êK˜¡¥f¬W«å¬ÖÍî ë”óPØß®qöÄÚcÇHùçsä®YCò]wØ¿WÙ`ˆÖÃ!O?Mɾ}Žo~ìeÇ‹/‘æîŽW¯^¸!Pyä•Ù‡.øè£è}}Ï©òD«ÑHΪUìzó-ŒmtBt”Aƒqß}÷Ñ«W/ŒF#{öìáðáÃX,–fó}ìïeggóÆo0hÐ ®¾új‚ƒƒÏÙýòÕW_ñî»ï’““ƒ—ZÍ‹0%*ŠXooT•ØgSüÇ –çä0g÷nòjk þ ÜDtÒ=Þ|(ËÎΡzxu«J¿±qÐØ~ýúqäÈ¿ŒŒŒÿ“$i9²_€——Wwî—ê+Ù”®€R¥o‡ÿíáb  ³×ÇÁPa2™,&£IÛ^—Aíœ&S°•ßøuÀWß3lذž Bhhh–¿ÖÿšCÀˆ§¾!WµcòŸ-ü߬§!]Å×»ƒ¯Wô:“Olþ›#vÆ âo™†WTTÇmX›ØêŒ­f3²­ÚTY‰TW‡ÕlÆ5 ­‡Ý»1fÞ\6>ýjiñr–êjN¥§Ÿ:v,ÝGŽ8§ó$j4”8ÀÎ×_§`Óæv £À<À¤I“pqq©ïå1xð`zõêÅîÝ»9qâD‹Ìs‚ ä𤤤°{÷n®ºê*ÆŒsVûìß¿Ÿ… òé§ŸR^^N¬»;ï_vÃÉpwW þšY8XUÅ×YY¼½g%uu$‹l¿ÿYج攕søðáz¯ÚVÀæŽñõõ%>>^2dH¯m۶݉ÒåŒ%$$$Юè«Bg÷þ%Ij`7,‹•Ž­D¸` I’$“ÑhtµC%ö,yÇ€#‰‚Íðú“ßë«×ëðNJJj¶¬ÇÙ@ûd›LfÔjU@phd7 š5ÎîFڑϬ€’÷g.’µx1‡—-£ïC!êÚkqñ÷ïBš.46ýýiNíÛ‡¹¢Ke¥ÒrW–‘%‰qŸ|L÷¡C‘¬Vúôaì›óÙõæ[lÚÔ¡c)ˆ"É÷ÜÊÎwÖí ‹¡–}_ýÝóçciÖðáùï¾ûˆŒŒlÒŽÛb±àååŘ1c¨¬¬d×®]?~¼Å„`Q1™L,[¶Œ­[·rýõ×3`À€Nã°Z­lß¾ÿþ÷¿,_¾£ÑÈøî8+BCñµwäë ¹¶iåå|ž™É¢ƒ©±Z¹Ü¦ŒÇÑqIXÎÈÀ\YfÛ¶mõ9½ýæöæ–Œ„„„:ä½k×®ÌfóWü‰„¼ÿ?»²Anh8¾¬V« 8+².@–$É`4}dIF&ü9Ð&Ö£­àÏÖâ<0dÈÐÄÄDüýýÛ\4­)ûæa±ZP©Õ r{pÊ9MÐ:óYÍèÈ* ¥3ãŸKM ©¯Íåà?ÒÿÁ ½ì2Ô®®]†€}ù¨TöíKî?6ûyþÆM„ÕbYÆ76–Ëçü‡œ•+Éüô3ªóò:Æ#»ë.üωò5Š÷ìá÷ÿ¼JqêN§ÏsqqáÁdìØ±ètº&ÊßñyöòòbĈŒ;–””V­ZEYYY“> ކ@II }ô›6mâúë¯'&&¦Ãú Ö­[Çœ9sرc‹…»££¹5&†!!ß7É2)ÅÅ|øÇ|“—‡,Ë\<„R |.è¢QÉþ}ê)))Lœ8Ñ)ä´%ãÍÝÝ„„áøñã›7o¾˜{¦¿ÍÏ×ÏS’$$«¤8{âé@ƒ$@J`•¬ ãÙ· " IRµá©1¯~s<6 ÛåO|¥—^¯ŸæÙ»wïV¹¼[{ˆk]]V«µJÝð<ÇŽ€6wY²6]´F£á¬î£¸¾^l IJJ">>žŸ~ú £Ñ¹5_™uý°ñãH¼ã’’ÕêK¾lP–$ü{Ç·hŒúö[o¿ ·úã5îîÄM›F÷‘#É]±’ÃË—SÑB2gzh¼½ˆ›zÓi®³(¦ÊJ|ó o¿ãtEA=z4wÞy'ááá­òmȲŒ··7IIIhµZ´Z-ãÆ£oß¾¬Y³†­[·b2™ZlG pèÐ!Þxã † ”)Sðöö>ãû­¨¨`É’%¼ñÆ~œê'Ðy{áOéýd¼÷~«ˆË€ÇÃ=,ì¬ÏAɾ}ì˜;—âÎ{ý½zõbæÌ™ :FÓ¢×o7772/ `ÆŒ 2„+V™™Y÷6gH’DZZS¦L9£{-((`Á‚,\¸¢¢"Bt:Þ6Œk{öìðø>‚@¹ÙÌšü|ÞÊÈ`kq16Hï †3cî é üxnß>6nÜÈ•W^Ù@W´EÔ*ÇÀ»§¤¤L>:#ÀË[oÿÛ7úÆ!GïßfTvÊ#•TVT6-ûk\ Èé½^¯6 *ÚßâQá¶nݺyEGG·º@ÚãÕÕÕaµXëÉŒ” õLÊFÝŒ4L\`â¼ÜÚ3f ýúõ£¶¶–ððpæÌ™CJJ o½õÎ%ÀʲLæÂ…\º”>Jäøñè<=.Y4@T«éÿ×GYuûíÍ*½,ij{(17ÝØ$›_–eôÞÞ¸øø ؉˜lk´¶¨ˆ=‹>iUùû$&Òc„³·7ˆ"µÅÅìýòKöü‰Ó-†EQdÒ¤ILŸ>ààà•ƒ£èt:Z¥øíÕ«>ø ™™™üüóÏ9r¤ÙýÃjµrã7¶Ûûß¿?sçÎåÛo¿¥ººš¾¾¼1f #"ðéàø>¢È‰ÚZ–çåñvF„¢4癆RÓ{>2tL^$æÌ™Ãå—_ÞbX¦±×ÒüGEEѽ{w/Afɲ|f€··F’$I¨4™¦9É‚ÕÖ¨²²²ôlŒ×…Ò§² ²²R–eYh. б,˨5j\]]EƒÁDûJ)¼€¿öèÑ#)22Rp†Õ«¥F@ÿo±X$©ÐèJ 6ˆ Q¨ºû·t€¯¯/7ß|sýj/}>|8ýúõãçŸfÑ¢EÔ8™Àe>uŠmÏ?ÏÁeËè÷À„ ¤tÀ»Ä Y’ðOèMô´iZ²¤Éç’ÅBÊsÿÄ\YAÜôéÊ5R²,Ÿn×,H »Þ|‹’]i­~wÿ‡FëéÙùÞ¿ K))¤°â;Úåõ?øàƒ$'';Í6)ÑÀ–D£ÑЯ_?¢££Ù¶mkÖ¬QXê ÐÐP† æÔïµX,lÙ²…¹sç²~ýzÌ&ׄ…qïÈ‘Œ ;ÍwÞQc®Rq¨¼œŸrsyë?8j4’ˆ’Ñ?‘Ž©­îL‰^žÙµ‹õë×3~üø“©ðòò"""BŒ>pàÀ@¢³öˆÎÓÃSUo’ )«Íë¯÷þ­Özô·¬¬¬¨Ë8­, +**Àά'KMÇPzÖ·fh€;Aèçêêz³‹‹‹¯ÕjÅÏÏKÒát@£€¢ú(åæWÎR'ÀŽ’ÀS­ÇM7ÝDddd“ Øl6£R©˜>}:£GfÑ¢E¬^½ºMxÖ.§ÒÒXwß}ô¼ñFgÌÀ'&ú´7{‰ˆJ§£ßC¡83“òÌ̦F‚UbçœW)Í>Lâm3ñîÕK£ÆëÎÆœ—ññ'd/]Úú„_w݆étå/ªÕTðÇpè›oÛ•zóÍ7sã7âïïï”×oWÉÉÉøúú¶ëwº»»×çüúë¯üöÛoF¬V+7ß|s›Í‚jkkY¶lo¾ù&©©©ˆÀÑÑÜǨ°v,/ˆ$ŠüQRÂ7‡ñîÞ½TY­\¼\A'õVï$™‚’ 0oÞÐêÐþ»¸¸øX—p~««¨¬hBüÓœò·[u~~~Âÿ³wæñQ•×ÿޙɾ“}_È !a“EPEq¥¶ÖVK«¶îÕV[µZmµVÛ¢REE´®Uµ-(Ze”5@BÙÈJ²/“™¹÷þþ¸s'“ÉÜÉLH€ ¯Ÿ|ˆÉLfæ.ïyÎsžóœšš­v¶« Ãu —é f³™ÞÞ^º»»y6»à]ùO˲lCwýà6@{À~’Õ wÌ0ÞÖ%ÆU¶páB—poo/¡¡¡Üÿý\vÙe<ýôÓ¹í‡P¾v-•ï¿Ï¤Ûn#óòˈŽþVÿðpÎþýïÙxã˜[[>¦lÍÊß{Ìü€¤óæž•…wH:½Ñl¦åP …«VQ£áhÛD˜´ì'Šcàhfý¢HÙúõìüûßé©v?~<·ß~;yyyš÷—Ö}““Cddä°ßvdd$ßûÞ÷˜>}:6l@&L˜ ùø¦¦&V¯^ͪU«8rä^^üvòd~™INX˜øG0øÝÇŽñÂÁƒ¼^V†$Ë\Ž¢èŸÅÈT=+¸xtçN6mÚär¯q7É ÕO›6튪ªª+šššþtÿ¶àÚ-0ÆÏÏOéP>ITE‹hA²v€544´~¬«««ËØÖÖ†Ú8È Ð TVP[÷ìkðË„„„_¦¦¦†b±X0ôööòï©ìß¾ P–e`÷JØZ8w3àÓ`ÍEìü‚3øáHXX˜[Á¼··—ŒŒ V¬XÁÖ­[yæ™ghjjr/«Eö=õ%kÖ0íÎ;I^p>†SÔ›~²—,Ë„OœÀùO?ÅWø#í¥¥Î'Š”¼þ:%¯¿ŽWh(±±xÐ]WO†Sà€ûD§£àÎ; ËÈÕ¬¿³¶–]O=­Ùâèôy:×_=—_~9AAA›ieddŒˆ‹Ÿ ¤¥¥qÓM7a6›Ö¥>ÌŠ+xë­·hjjbbp0ÿ˜3‡ËÆ'ÞÏO©íTà·zôïhhàñÝ»ù_}=z”Á<ËPFíúŒÅk8¼…2V`çÎ,\¸ÐvO8ŠÈÝÝçÃÃù袋ˆŠŠ¢©©‰††† ¢¢¢Û>ÿüóÛÚÛÛ{€•Àjà ãSõ:½0€2¢¤‹d±½¯£Gš¾ý7±µµUvæèL `EljÐ÷þ0a„»²³³½‚‚‚èííÅh4j¶ü£0€FÕèõÎ5êÿ9ë8‰£€íï¥á¬Pà÷¸˜8gÎÎ:ë,6cÍŸ?ŸéÓ§óî»ïòÆoÐ×çž0ÒX[˶{ï¥ìœsÈ¿éF"óòN«ét£ˆˆ™6ÿXÁÞ•ÏS6onk£­Í3¿“¸sæ‘yùå£ö$³™Ã|ÀŽGþ€Øç> ɬY³˜:u*†a´ˆ&%%‘˜˜8¢ŸEm´_ªèõ?ÿù===œÃm\Ày „Xg0Œ¤°¯ÅhdkCîØÁž¶6€‡ïY(cvÇÚ’€Bk~•~ßÞˆˆn¸á—쬻{½½jܸq„„„––Æ‚ ¨ªªò/))¹û³Ï>»Ûh4nB©œüWÝ«¹› (™¿m”½]íßb±Øö¹ÞÞ^,ËwF@vY`góñfÜqT)«`gIjjêsçÎ  µeûÎ.GáÞ‰‚G´©fð:½nP€0 kubtò§‹ 72þeº§ÓÆ5×\ƒ÷0Åy}}}xyy±lÙ2Î;ïÿüsdQä©©Ü”“Ãô¨(|Up:RÇT§£¾«‹OkkùÃΔvu‘< ,FiŸ‹ËŒRøÀšD]ŽâŸûàꫯ&..Îé~?œdÏÞ´ÇþûèèhBBBÈÎΦ¢¢bþ®]»æ=zôkT  Q ÙšüYµ^*õo-¶äÏ£z¾ÖÕÑÑÑÞÚÚŠh¼ìÚ6œ´ª'900PñÅ/.((°Õ÷µ¦D9-´èÉ î,‹•‘Ñ ö“At‚ö-æ“NÿgçICiÖ¼£/^Lffæ  £ÑHll,>ú(»wïæé§Ÿ¦¢¢Âí¿[üÊ+”¾ý6S﹇´‹/Â'4ôŒgôÞÞ¤]´ˆè)þàö?·±oøIFPz:ç<ögBSSG6ø æînÊþû_v>ñ$bO›OHJJbêÔ©„‡‡Ûö½^Ogg'_~ù%ÑÑÑLš4‰¨¨(Íû622’¬¬,—&2Ã]ÝÝݬ^½š•+WR\\Œ¿NǯsrøAVBB0Œ¤cŸ5ðWttðßÊJþ²g5F#yÀ+À…@ì½–»€Àç@0ð#`! Ü`e[–-[fó]ÐÚ£‡Ãh}o0HHH`ܸqTWWÏØ·oß–cÇŽÕêõzAEt‚ÎjûÞÏXD‹Í%V}ŸÖޝÎï@ÿÁo6ôôödêϰ%kংzbCCC‰Ðêã9 ž¢ 0˜Íf› ¤“íË7E'µ~‹xÚ/ÝMŠÖÆÏâÅ‹G4‹2™LLž<™çŸžO>ù„矞ööv·ž/ööòõÿHñ;ï0í®;‰Ÿ5 ½Ï™ÍÈ2ÑÑLþÙÏH:÷\¿ÿ>¥o¾…hò¬Ü˜¼ø"füêׯŹí¸çnÖ¼¸˜=Ï­Rx8€‰ !??Ÿ””¼¼¼4 _Ù´i)))L˜0÷XX¹¹¹CöŽ{ºêêêxñÅY±bÍÍÍDy{óÌÌ™\’šJR@€5#¹À/ ¥mm¼UZÊÓÐf±0XÎØSôÛ¯&à=~½ˆîF©Ž ß5À?ÿ9iiiN÷úá€UÈíôm6¾  <<œ™3gRZZ`¶(û¿^¯·QR¨³h°Ç[Àw"@uùøø4F¹··—ÀÀÀ]Z @@@fëD4Ç“ïìÿ‡“ñÛ I´þ¦ús‹Å‚ Ð9´ºìEñ¤{Ý{ú‚³­ \#ÑqõÕW=âS EQD.¹äf͚ſþõ/Ö­[çvÙ¤³´”M·ÜJÒ¢ELúé2"&N<-æ×&@—™Éô{î!󪫨øðC*ÿ÷?:J»¾##É»é&2.¿  þ‚NG_[Åo¿Íþ•Ï#zàyqþùç³lÙ2‚ƒƒÙ³gGu9¥O–eÊÊʨ©©!++‹ŒŒ |}} &''gDƒÿÞ½{y饗xþùç1›Íd²âüó9/>žH{1êYõš%‰­­<»?¯9‚I’¸ ø…5HúÑk¶xxÌšgòQ¾HÖŒ¥ø7ŠÇÈÝwßíÒÒy¸û½jÔãhâらÆÛ׋¨Œ–СCFÉþÕào¯ýêëë“­xç;““SSRR"Fåævè°¹Úö÷÷§··×éÉŠ p'Ówçq6Ïe¼£B :×Àɦ*I§5´þëtÍœ9“³Ï>{T?‡Éd"((ˆÛo¿E‹±råJ¾ùæ·_óèGqtãF&ßv+™W]…ÿ ´~ èt„¦¥1åöÛ™xÝut××ÓU_OSá~ŽÓ×ÞŽd$ã²³‰šœGTA>AAHÖMp$‚–Î` þë¯Ùµü)švºï±ÎwÜÁÌ™3mA{Þ¼y;vŒ;wÒÒÒ¢yét:Ìf3………TVVRPPÀå—_>do¾»Çõã?æÅ_d­UtyNTϘÁô¨( †‘¥ù>Q䋯Fþ¾gjk‘e™Ÿ×ÓQúrÇÚ’€ý(²ú§­?›b?œjýL’ÝFål¶ß»àüýýÝÞ»Õ–oW­‚C1Z Àb±àåí…ÙÒ?¡P@ªâ?G‘·Éd’ñÌÀîÌ›7o6…††ŠF£ÑËY·Q0²dëðòòB î‚W@@«TàÎÿ« h•\€S0íΓ~£k€ùZ¿ déÒ¥øûûŸ”N£ÑHRR?þ8_~ù%+V¬°Ínwc÷fß3+(zý füæ>RÎ?ƒ¿ÿ¯% Ÿ|CC Ÿ8‘äóÏG–$•®´^²$¹m·;dÜ20?ξç_ øŸÿôè¹ ,`Ù²eÄÄÄ x‹…ˆˆ-ZDEEûöí£§§Ç%èêêbË–-466rÉ%—™™é–ý·ãêííeÍš5¬\¹’/¿ü/ŽŸ¤§s[^9áá#ïØ§ÓÑi2±±¶–å»wóes3Ào¥À$Nýpžá¬^àKàEàmk€ZŒÒWkýL²“ ÅüÐ{8ûì³]ºÿ ØÙ| ¸bÔ!pÞÞÞ ÌÀ±ñ¢$b̓:¿DQ”Æï€Ýñ7›Í&£ÑèëÔ X¶Ëþ­ç×ËËkàìD9î^ ž\H* J ÀEüqªh?6îîòÉÀ½¸èºè¢‹ÈÉÉ9©ŸAEÞ³gÏ&??Ÿõë×óòË/Ó㦠ÌÜÚÊ÷ý†CS¦0íÎ;ˆž2E™nw†/Ù!3•Ey”^§îómlÿóŸéc_°Và¶YÛ1}}}ƒwA€«Ÿi!K­ì_ft:Áåð IrN­šO¾ ;/(w¡ŒâvºRRR¸ôÒKÑëõ#zzzèîî&""Âe9ÅÛÛ›k®¹†yóæñÚk¯ñᇺÝ6x|÷n6^ã—.eÒõ?&$5õŒÖŒöÒ ô67³ûÙg)}ãMOî.¹ä®»î:"##Ý2ÅRUÙ“'O&55•}ûöQ]]­9¥O§Ó!I[·neïÞ½,X°€yóæiúÿ:tˆ—^z‰Õ«WÓÒÒBf` /Íˉ‰$ìD>kà¯îéáíÒR–ïÛGm_ù(ù%(ê÷±¸ª€€¿Ó/ì»…î´f"CEÂ6`àëëC\|œÍsÅÙ^ë¸gÛƒH­dОÅuÕà,¾¨¢?I–0[ÌHzi@ ÀÙ¾ØÙÙi:YǬ0ˆ¢ØÝgê4ùϾо ÀÇÇ£ÑèôÄ8¢5wh"w}ÃI’lˆŠþœmB‹óÀÔg<é“ÝQÐÍB)3j®Ë/¿œøøø‘ïöïßOYYãÇ'''‡ÀÀ@ÍÇ›L&ÂÃù÷Þ{¹øâ‹yî¹ç8pà€Ûï«ìÝw)_·Ž‚»IÆ’ËðÆwÀÃû·¯Š?á›'ž ·Îýòfvv67ß|3šYÿûÌ;—cÇŽ±gÏš››53?½^Oww7ëÖ­ãË/¿dÉ’%L™2oooDQdÇŽ<÷Üs¬Y³£ÑÈœÈH~}á…Ìeœ¯¯øG²d'”ttðÏâbž>p€nQäl”¸ó¬™òX[PŒ¢èhrPD~9(Š~ÑMÒìJœÌ ¼ ,³Ë2¯3Àý—³ ï*¹”eŸAÌäP¯×ÑÑqÒ¿Œ Ër‡©ÏdU1ã2øƒÒÚ××çiÑ6®w~çŒ0›-ètŠpðÙ/t úN;à"üÓì(š9s&çœsΨPÿÍÍÍTTT Óé(//§ªªŠÜÜ\ÒÓÓñõõÕ<Ž&“‰ììl–/_ÎÖ­[yöÙgݶ–E‘ÝO>>˜L&·Ôšî”ìýîvØÿ\A~:§T” D~ÿÓ\ œ¯õK///®¸â BBBF\ù/Ë2{öì€Þ%Ibß¾}”••‘——Gbb¢fÙA}?óçÏgÚ´i¬[·Ž7ß|Ó}[áúz6ß~±çœÃÔÛn%<'ç»’€Kc6)_¿ž]ËŸÂtü¸ÛÏ4i7ß|3&LðXoã2ó”$RRR?~×ñãÍ߀Á7pm[{›SY’2ŽB@-áÆP@Àq#qe"¤ÅX,¢µÀBã‚Ó9§ˆpõ‚·¡”Ꜯ˜˜–,Y¢éÈv¢Ü'óí«ãÛ'Ÿ|BJJ 999ßœey <ôÐCìÞ½›•+WRVVæö{/zi5‡^ƒ÷ÿ–´‹/Æ+ à[Ëz=–Þ^ŠÞ]Ãî¿ýÍ#CŸüü|~þóŸ“‘‘1*@*""‚ÌÌÌAuÿ¸¸8–-[ƬY³X½z5ëׯ§¼¼³Ù̼ÈHnš9“…IIDŒR}¿ÙdbCUOîÞÍþövB€?Wãqá«}¯ UþZk–ÿ+·°Üö¹¼ÇQTÊ[:A`bfºÍºYÐ ˜Ì¦AcŸ]±žj\1Ž%€á€cÇŽÕ¬s5–@{kk«0àJƒ¿ãI Âd2¡×ë‡p€¯Ÿx‚Æ_»ýûì3úúúøAJ ×eg3?>¿Ñ¨ïëtTuuñïÊJþøÍ74šLÄ ÔÆ/âÆàù—€CÀ(Å¢ŸS@Üö¹ üFàŠ3à^`\ø8ÒÒú›u‚³•ð¤ÆïìqZ €}9À•Àb±âñ笯¯¯ù8,½^¿´³³ÓéÉ’$IdRpp0&“ ooï!‘š+&`(! 3vÀþç¢(b¶˜­ €à¼[@Ön÷3À Eø¥õ¤‚‚Î;ï¼Q¥ÂØ9s&©©©ìß¿Ÿ––— @E ©¨¨ 77—¤¤$͉p’$áååÅâÅ‹™1ckÖ¬ñÈV¸ëÈþwãM$^´ˆ‚›NXfÆÏ:£‘¢×ß`ïSOydœ””ļyó(((µk&((ˆüüüAÁ¿··—õë×óØc±wï^dIâÖ øAf&gEE¡a~5ðµ¶²¶¼œ?íÙƒQ™„ÒÊ7‡~?û±´ú€ƒ(õýwPÄC‹¬_“¬ÆSaŸ³Àß ì±«2+Û7!›”Ô¤#–“ÙäVG—»%{À•À1¦ˆ¢è± ¯¯öövñd¿±nÊÎΞÔÞÑ>è„Ù OZpp0f³ƒÁàÖ s§çßÙϵ(¤>f‹ åÿ-³M}Ò}œ9æ,.r•_uÕU„……ªå¯,Ëèt:ââ∈ˆàèÑ£8p`À˜ggï­»»›¯¾úŠòòrÛD8Wú€°°0~ñ‹_°`ÁV­Zå‘­põ‡Q³ñc&Ýz+ÙK¯Æ?"âŒÔȲLãîÝlì1ZtûyþþþœuÖY¤¥¥¡ÓéøôÓOIHH 77—°°0·(Yw_'77w@ðommåÕW_eùòåTVV¨×óûü|®NOg‚ýTÈüß46òö‘#,?pI–¹eVì Æ¦G7ð5ð{”‰|:5ÿù@:¶ í'Lõw_YÙ‘:ëž¾pöL&LÈÆ"Š´¶¶`²f¥L}¦A €Óë 8þN«àLý¯j¿<µ—îêêÅ_å ëaþÖ}LLÌŸòòò8Öpl0b“d§m€*hiiÁÇÇÇ%]ãø¯VÀ÷„pd(ÔaŽ @ø—ŽýNïó(€qÀ¸è>ºøâ‹™2eÊI{¯²,ãååEzz:qqq”””pøða—&?:ަ¦&>ûì3ÒÒÒ˜0aÁÁÁšÁÆb±––Æÿýßÿ±}ûvž{î9êêêÜó„$ Ÿy†â×^ã¬ûKò‚|Æ¢†Û)µB_[‡þõ6…Ï>ëvÖ/™™™äççÛŽ»  kkk©««#33“ììì¶Ž6 äää@MM O?ý4/½ô---¤°rÎ.MK#ÎÏoä³}À$Ë|sì/ñZy9²,s#ʸÚiVJm¬­àSàw(Æ=!( óPÔÁ'ZßW Š#à›(Sqbbb¸aÑB¦N›ŠÙb¦µ¥•ÖÖ–Á׈ (†;n”\±¿Î ‚<éP€§¶ÒV·ÒàQ”®Ïo=øåôéÓý¼¼hkoÃfl7X-8£ÿŽ;¦éÛì ØOø;‘®{A°©zœg“-'ßÐY àç@ž+šõ²Ë.sÙƒ?dpedÁsÉ“,Ëøûû“ŸŸOrr2EEEÔÔÔ <ÊÊÊ8zô¨m"œŸŸŸKºpΜ9Lž<™>úˆW^y…în÷À¹¹­m÷ÞGQ~>Óï¾›˜)Êu0F¿l±Ð°s'ßü}9­û÷»ýÔèèh&OžLbb¢f­_–e:dóuHNNV7€N§³™CíÙ³‡¿þõ¯¼ÿþûtwwsvd$w.XÀ…II«“ÿF8ðwŠ";øã®]l:v ÅÝî*` cSØW¼üŤ> ¸Å ,Ⱥo­“&`г_‡ ––ÆO—^͹çžK¯±—Ö¶VÚZ[•{í.QÌ&³Ë͆ױà®P žN—4ö gïþû6]ddä111˜L&ŒF#}}}øøø Tö;t¨+00³Ù<è$¹²tª¯ßÙãŒFR—=¤Ä¥o]'Øm‚ÖngÁ^´ˆ§â¸Û€ À­¸èDºöÚkIMM=¡ì_ þÃêq7n³gϦ¡¡ÂÂBZ[[]f£‹…ýû÷ÛNbb"^^^N?‡(Šøùù±téRæÌ™Ã[o½Å‡~è6@kÙ»—?þ1ã—^MÞO~BpJʘÒz=Ý ½þ:Åÿ|ÉM]„N§ãûßÿ>—^z)===ù$Û¶mcåÊ•46º7ÁSEvÿå ÅVø·¿!qÞ¿êØ÷ð‰5ÿҺÄ@ÐW¿ˆ¢è_‹"ðÓZ}F#²,Y¿0ìM¶î›Ž[°±¾îè¹\•wÝ)¸b†#tØ£ (‚À¿à‚œœœ4õ èõzDQ¤··WÉ–gtjdŸý;þ«Eß Ñ¡³ìßž-kö/ ˜a [iQý§@`BiÝ}ÐAÀ"Ë·µñÚ¡C<}ð }’Ä¥À/€s›ýǬ9°Ë ^nFiù CõDàïCéXƒ2`ÈûÃØgÝ“±‚«aŠ @'fÓà€;;Ëëx ºÃôO€µœ(À b”ÆŸÎà†ððp[ö¯žÜ^c¯>À89aƒ“ɤôµNœ³ >\õu-vŸcÀ@#ë­¥•ž"ŠáÏT­_úøøpÅWœðYV¨@A”ýëF×ýA’¨ºæ b?ÙÌôŸÿ’ªk®¤êš+±º @ÑÌ™3‡††öíÛG[[›Ë¬Ól6Ûô999$''kÖ¡Õ~_ÕVøõ×_góæÍîÛ oýœ Ÿo#ûúë™xÝ Šw;Û­ÕVVƶGu;ørà 7°xñb|}}‡¹¬²`QQQÌ›7êêj“ü%û½›Ày'€€Åì~ 'ÚûkÛR²:oÄ“ålÎ Jçè· ü4..N¯öQªÀ`0 Ž¶•$IsƒU'Ú3΀€(ŠtuuÙždþCY«A’$ôƒ-ó·Ï‚eY:½aOM&8e^‡Ó•””ÄÂ… Oغuý/Ë x·µ“´æ"vìdÊÝPú‹eýê–^1¦ßŒPßׇèA½½> >>žÒÒRJKK‡¬C755±yóf’’’ÈÍÍu©˜:u*Ë—/gÓ¦M¬ZµÊm[a±×ÈŽG¡øÍ7˜ñë_7kÖI³–Ìf*>úˆ/xÐ-ÿ°°0n¼ñFæÏŸo¾5ìkÁª˜8q"‰‰‰SYYIoo/%%%ÑÕÕE^Ï ¸*=Ìt£áØ'tšL|V[Ë;vp°£ƒ oûï[3å±¶ŒÖ`üO»^€ù(¾t”z¿4¿e:ßvàYN¬5Ðd6Y­ÞŠÕàïì” ‚ÒN=T"çî4Wûß¹ÓèXFö´ à¸ó©™sPô¤Õß  Óé® À€2£Ûd6!Ê"Xƒ¦V ("@³Ùì´ @ýÞl6ÓÒÒ2 kQ_Ï1ÁöÙ¥Öf±X-¼} ¶AFýKA´Zb¿Sä 7I‹ÕÿøÇDFFŽÌ{Sék9 nÃÇ–WRrÇÍ Ó‘±r5ÓÛn¢æòÅ6°PSKΟþÆñ©ù”/»Ùƒ@©ú’’Baa!õõõ.?“,ËTVVR__Off¦Í?@KàëëË%—\ÂŒ3xï½÷X»v­Û¶Â‡ð¿›n&qáB&ÿìg„e¤cðóóÈj×Ýã,Ó^UÅþ—VS¶v­[YÿâÅ‹¹òÊ+IJJ²}Þ‘ZÁÁÁ$&&òÕW_±qãFL&1>>¬˜7 ‰³¸4¿Éhd}EîÚEEO)(-pW1c0ð·¡Lä[Žb¬ã\ ,þ(^Gš_”¢¸¾2Bï½?“—¬ã¤þ=SV“'yеi±XÐõZÞ à 8þ¿3/õþ÷t×›}ðØ·ÆÄÄÌS3gû;½^ÑhT6™ßÙòõõY£ÑHcc£f&ç®k”³ Åþ÷&“‰>SAþ€ÃÅ6„àÍVé9sæ0kÖ¬‘{_öÇOði:Nü†Ñ™Lx·¶Qså¥4ÏœNÚËoО“­°’Dø7»™øørt¢ˆÏñª—^†iƒ7dY&,,Œ¹sçR__Oaaáú“É4`¾ÀPú€ˆˆn¾ùfæÏŸÏË/¿Ì×_í¾­ðÆToÜHâ…’ºðBbgÌÀwÜ8½\\ûC}@4™h)>DÉš5Tüûßnõöûûûsçw2þ|·{ó=Y‡â¿ÿý/7nD–erCBøëyç13:š`u"ßH ª»»y»¤„¿Ò`21Õšñ_ÌØôèo>A©»‡·[©½(N|/(= ÌøÅ(h$—ÙbQ²ÉŽÀu €€(Zeâ®ØõwŽ:0g Þ± Õ^.If³M–}[Àõ¡¡¡‚#ýoehïh·©þ]ÕÿUÀþ$ÙŸ¨žž\Ö{Üù²o´Øö5£ÞÞ^»Ç9¨R­_fÍ9æÓæÄx{{sÍ5׸œªw¢«/2œ=?BößþAúªW‰Ùô9¥·þŒ’;nFeô½FRÞx‡¤µÐpÞ9¢H@U5ÿá;ª« N||<ÑÑÑ”——»¥èîîfûö픕•‘——Gtt´SЦ^ééé<òÈ#ìØ±ƒ^xÁ­Žøøcj>ùA¯'æì9Äž5“ð Ù„$'ãÞ ·wA§³•Ž½ÙºiYúŒôµ´ÒY_ϱ]»(_¿ö’·“^¯çî»ïæÜsÏQp*Ë2_ý5ï½÷;wîD'\šÀo¦Lard$þj}„Ëa¢ p¸­—ŠŠXQ\ŒQ9¥6¾€±©è? ¬GñèoR¬ßO±‚€‘ ùõ(mBûPZù¶qâš§çÇ*æ“샵]¹GËÈb1öânÇM‹éuŒö¶ì3 Ð>e€Ó‚0WõîwÚÚÛú€¤Mÿ« ”ýwvvºíéî,¨;ûÞ^áï˜ý[,Û[ ²]/+X4ÚÝm); ç…¥K—’=*#[Õó%Ë2=ñqìyòD|õ5ÙËŸcÊݰïÑèII"û¯ÏVxºE (¹ãf¦þò·ôEE 9õê©« *HSýŠŠŠ8räˆ[ú€M›6‘˜˜Hnn.¡¡¡š¬’^¯çì³Ï&//?þ˜W^yEõÿvëýÉ u›·P·y‹"Œ À/:ŸÐÂÒÓ NKÃà­´À æî.zššè®«§¥¤„žêêa•|}}ùÝï~ÇܹsGôš´X,¼üò˼ýöÛ‚À½“&ñýÌL&…‡c šß¼ö65ñüÁƒ¬>|½•â¿ Åén,zôïBi¯{¥î>E¯0eØÐHþn`¿•æ/¥Àßmˆv>òú_[ ”œµž¨FÅS# ¡Œ«<×ŸÑ 00ðrÕôǾþ¯f íííÚ‡ FãÆÃd2ÙßÑÑAMÍÐã–]y¸‹ûúúìô2:ÞÆ\ŠÐDQc°éô`"##Y¼xñ¨Ìl¯««ãСCäçça£&›fŸÅñ©$­ýÑÏ—©wÜ‹¡»Yˆýè´ååp´†ÖüIŸÙLPii¯ý‹ªï]AKÁdú´dYÆ××—©S§’––6¤>@ÕTUUQ__OFFÙÙÙš-’*=xõÕW3sæLÞ}÷]6lØà‘z^}Ÿ–®.:»ºèšwí•s̓>ȤI“F4øK’ĺuëX»v-ƒI”ˆðõebXXð9K¯(²­¾ž•°îèQüPÙüÂ(õŒ­¥öÕ¿ˆâØp Ê(ÞLëç‰V>=Š–`/°e*ßÉXÊPÙ¡ @² þ²Óa@’(ð pUÎuÅ8îçŽFq®‚¿(Š„‡‡{|?X§j­‹Ït0;88ØG þŽ@’$¨'OúÒ§¾¾Aèèè ººÚ£ v(€Jí;>Ïl6Û€‡z1êtª©rKv”ÖéÌèt:~ò“Ÿ=âÁ_õãommå“O>!--ÜÜ\›Û›äãMåµKñ«o cB&•?¸š¾ˆp î{˜‰/A #+Ãö÷"¶ÃøU¯á_WÎd¢fÉEÈèŒ&D_ϦñɲLhh(óæÍ£®®Ž½{÷éco6›9xð G%''‡ÔÔTM[aI’ˆç®»îbÁ‚¬^½šÂÂÂÓjtpJJ wÝu'NÑÁT²,óÑGñÚk¯±èœ\èGüiùZî{ïK$YæÖ¼<õ#’³™Oª«yîÀ>mh ÂJ‹_¤Ò_Ë+«EeÿVúÝ ¥Ol®õóÈŒŒkŸ¥•o§5ð·žäÏÙÓÝl-Ø Õ=Svj„Mx­åËbÏ8~?”À€ BC=StwwuïŸm=-#V ;ÝÀ|///§Ù¿º:::l-sîl”¡¡¡TWWc4©¬¬t»'{¨Ç¹*H’d«ûv@ñµ–TÅ»ÜOcie§0yòdæÍ›7*©¼¼œ¶¶6Ûñ+++³ çÉÈÈÀËË Y–éaߣØTëÛ_ZÁø—^#qí¿éŸFð¡Ãd?½Ÿ¦fçÍÆ¯ágÏâøŒ©èL&òY38zõeÚÆGtt4eee8p`H{Õ?àðáÃãô«Ç477—?ÿùÏ|ñżð 455R ÀYgEZZEEE˜L&› ïH$¶Æá IDAT¬;wòÒK/‘—Ë_½Ì„Hž}ìgùóÛ×>Å,ËÜ1yrÿľaþ¦Þ^6TUñÔ¾}ìio' ¥5íRüX[u(*û_£‚CPóLC±ê‰Q¼jào@i|ÛPú”±à'muww[E€ç UPËÃŽÁßÙ}çNq5 @ËdÎb±x¬pc¨Å™yíHãÓ ètºóUË_Çú¿Šº:::<ÚÃÂÂèì줺ºÚ£ç9këÐ)ì(ìéé€"`e l}¬kYZ%ó)f¼¼¼¸á†FEø×ÓÓCQQÑ XEöîÝË‘#G((( >>^9Æv›»,èûLÈÞ^èÌf¦Ýyí9Ù|ýâÓ$¬û:‹™Ê뾇d0÷É&BÓûì3’’’˜4i!!!š@ÀËË‹óÎ;©S§²uëVÞyçjkkOêùöóó#??Ÿ´´4üýým×xII UUULœ8‘ÔÔTÛDÎá¬#GŽðøãä'ðì_n"3!d™`_oð‡Œ òãáçþ‹ÑbáÞiÓöÄA¨êêâ?ååüßîÝ4˜Ld¢ô¾_DŒ± /£´×}Ü‹¢_HFË›[ƒþHL €Z[à·PJ Væ…3ýþd~ö®®n›жçJ²Ë€2mUvªТý‡c¤ÅØ?ÎS WCËìVÞ ¼½½ç¨hÊ\Z…j1555 @œQþÎèGzW[ì\dY¶Ž¶³¶s´ÒdNqÀ/~ñ fΜI{{û Rlj®ââbz{{2=‚ ÐÝÝÍçŸNLL yyy„‡‡8Þ×^OS3Ýɉ|ñæ* î}ˆi·ÜƒWg'å?ú]ãSñml"å­µtLÈâØ¹gTVAèþƒT¥úªËèNŒ÷øºðóócúôéŒ?ž}ûöqìØ±!õ•••¶ù&LÐ4Α$‰   ®ºê*Î?ÿ|ùðÃÙ³gÏ€ãD€MBB©©©$%%Ù‚»ýg¾¾>vïÞMee¥ÍÑ`0xøýïOoOëV?À”ìD°äìíÅ}w^…·—GžzŸúÞ^žž;—½Þ¥PÒé(niáÝ#GøãÞ½ˆ²ÌT`µ•7 cßl¼oOY€*ì›Dÿ(Þ‘°ê•JkTÙÐÿ7·Zÿ»Ö‡>x²AWw×` ýÝN¯;eW­€»õûûÞþoºSðt¿4ºa¾…¢W}øL™>>>ÞZõG@p3“Óʸ<Cµÿ©ßK’Dgg§í"Qߣzá:Áî¦_Ü"i×,§ÄÆÆrçw’––F}}=%%%X,·ýPÇVuÉru>AàØ±c|üñÇŒ?~€>À4.ŒÂG~ @_ø8v>ó“x߯&BŠ!ˆ"‰ï¯Ç¯¾)¸ïa|Ž· ëtôÆÆ°î?”/»sPà°ÞXXóçϧ®®ŽÝ»wéco±X8xð UUULš4‰””M}€ÑhÄ××—¤¤$n¿ývÚÛÛ)++£°°mÛ¶Q[[‹ÑhÖµ-ÁÁÁ0kÖ,²²²ˆŒŒ¤¶¶–ýû÷»ÌDA µµ•­[·ONNŽÛb§îîn~øaxã·1zˆƒ¯û`o¿úż zxr Ýf3Ïž{.ã¼¼‚AÀ,Ëìljâµâbž+)A‡"‚{Àš!û3¶V7аïYk@Ö¡ å¹E¨8ýû*—,¢(ùßDÑXÿüzß Ïœ'÷Xtw+"@‡6@YÈ Ü’&pœ1ÎÊZ]Z>žººÙò=a$ñé.ÖétšõõĘÍfúúúÜvYòt³»Áßþ1êÅÑÕÕe{ÿö‘½@–dd]?àÊQᕇåyäÒÒÒl` 22’òòrªªªN˜ ÐétœœLaa!ÕÕÕè]Ô{A ¼¼œ£G’››Ëøñãñööpœýkj ).¡èÞ;é‰&¤èq~¢8 þ5uT_q µK.¢72ÉÛë„Jê5 ê>Ì\ÞÈ*³±}ûvJJJÈÏÏ'66Öefo2™ðóócÒ¤Iäååñãÿ˜®®.©««ãøñãtuuÙ¾ïéé±mJ¾¾¾„……1nÜ8‰ŽŽ&**Šððp›Q‰z ÓÒÒˆ‹‹£´´”’’—àBêêêhhh ==¬¬,5ÙI’x衇(++ã/^˵W΃>íòV€÷üüRd|ò]ežž7(Ðéè¶Xø²¡ç y¯ºo?û›ì2ä±´ZPêûO_XËPüR #Wß7[AÆ[V–Å)x-Já^-’åd“Þž^EhßeÎ1‰ ¨µœµÊŽû¾ìØ üEQÄË˳«Ðͽ^o%µ¶i Ò±ýϱ ª;ÕìÈ]zs$‚¿–ú_½X, ===‚`+ 8U b?Ör¨á)§ L›6¥K—¼X¬ú ”””ÐØØè1Êu<Æaaa6•}aa!ÇwyÎ, {öì¡´´Ô¦Pé:2Óùâµ1!ˆ"¹ú+ö=r?’—Sîý}‘t'Ä…NÐûý|ÜȰUp—MJJ û÷ïw‹®oiiaóæÍÄÇÇ3yòdÍùÎ6"•HNN¶1{æÉ> ±gì¯5gÁÚ××—¼¼<’““Ù¿ÿfEª> ººšììl§úI’øÓŸþľ}ûøÍmKøõ-K\uùxéyàÎ+ÐéîÿË;ô‰"ž7â¦&žØ½›/›› C©‡_ä0öV-J}ÿqŸXàNúû,Ö¯]ê8ÞmÀ;€Õþ© øðg j¨Ëüd›žžžó^$YqìŸ8Xè†Jæ<©ÿ;2Cµzš|zPÞ›sÆA.Ѫÿ«[§Óa6›Ý­•œàêÂqF+©í‰ê{wŽ*…þÚ• ´ºš`Å“~.Ôì_«EõÐ?~ü8EEEÆa3êqJHH ::šŠŠ öíÛG__Ÿæßžž›> ??ŸqãÆ)uêH…Žöml" º†šKÑ6i"ÕŠ˜nè€.·k/I¯¾Êá›näø„,>‹3fÌ ==Ý»wÓØØè2‹–e™êêjÈÌÌté õšZRÔÃY!!!Ì™3‡cÇŽQXXèÊ¢TÓÝÛkÓäää‡^¯G’$^yå6oÞÌß?‡ßýòj0¹Òd@”øíí—À-¿û'¾õ}’D ðа/mŒ}Ùìßž‰(…Ý™ô÷ŒTàïB™ð/Àê€R¼nÍø›ÜO'û8)¶ïv{¯4p%=q÷œ¡Üï3O}<ºruX±g\ @§Óe»ªÿÛ3¨a dp6ØÇñ¤ÛÿÎh4Ú–ú3{ ÖÍkÐ×Ùõ²"Ë.K’xò§ÆÇÇ3{öì!ÎÙgŸÍÑ£G)--u*Úôýª.| sèÐ!ÛùÐ*lܸq>ÀÉ×+žDÖëšß:?B0ko«‚$‘þÞz^y‹ê[o %3}ØŸ%44” PSSÃîÝ»]|Øë***ÈËË#%%eTL—<½bbbŒOv¾U}À¶mÛlú€M›6ñÖ[o±dAyøzü zÏýD‰Ÿ^{èáæû^æà6ÆÞp eï*à5”zÿ\à>½ÂH÷¨¿øx°ªS*PZúŸG±ðôíŸt@¶7}³,k;82ZÉœ3@à*Imà d;¬%(Æ•g ¼]õÿ«6ªê?w—§'ÁBÔêhoowI#©Ï•”V6Y½X%Í÷!‚qÀùùù¹§›äädbcc9|ø0555n•$I@§snŽãççÇ”)Sl*ûªª*—SÊÊʨ¬¬$//ôôt¼¼¼°Ø‰ûd‹“¶JY¯Cg2“ûòëŒûè3ŽüöNjfÍ`#,HþÇéJˆw«, ~–øøxbcc)))áàÁƒCêz{{Ù±c‡&??TÌ—<]z½žŒŒ âãã)))áðáÃC2 µµµlÚ´‰íÛ·séù“YñÄM„úû ÛÖWÀ’…gñû'×RÒÔAô ü&`“•±Xo ΣLäË´cFâ,ë¬Yþg(v½Ö³tÈJó¿ ô óOŸ"@Ø8 Pöˆ΀7ǽر ¥°X,ø{8Ÿ¤¹¹Ù݇&Xâ}šÜ# ÕƒéìKï¨fÒž¸ãùsHŒ³qÎ~ÖÕÕ…ÙlÖ ö ö‰¿$s©uŸŠ•••åq&ïííMNN³fÍBåìj•×øòøê$š½{u˜ÆÜ¹sY°`ÁÁÁCŠÒ$Ib÷îÝ|ôÑG6ßõst'&pè®[0…… B:A5õ̺ý^BöîãÀ_áèÜÙgQ‹™rïC¤¯Y‡wg§Â,¸y ‚Àĉ¹ä’KHKKs«\rüøq6mÚĶmÛèììñÌáܪGÀ\@B‚k+êêj¾þúk&gÇñ¿û‰aA'ìéÂM?¾€5(èN÷Õn¥Ýç¡(ù·×[3ò_ZƒÿH~=pÄšÚ_¼’»­8c2ðÏþp 4&“i€˜O–­ƒèï rœ%lZÞ.îgY¾3! úxÏœG=zï§3†Hªÿ_eTJ}´€uäˆþ:::• ìéõqÊDZ ýF@šÖ“§€þlS톳‚ƒƒ™9s& 鬮ÃGý¨9æc‹ QÀ wÞ~Gdd$Ge×®]˜L&Í€¨ÓéèêêbóæÍÄÅÅQPPÀ¸qãÀ` ~ÑùÊ8aU[¢×^\ÊÄÇŸ¢7%‘·ß„q\Ø  _g2‘òÚðö"~íz¢¶~IÕÒ+h˜1MBäF`“$ fÏžMVV;w¹yHÿ€£GR__oÓœˆÏH­ÐÐPæÌ™£9>¹©©‰­[·æÇóû¹)Ñ#>Ì"W\|øû:6J2¹§ià?Fÿ`žJ”‰|¿FQn…Ž`ÐWïªB”q¼ë•¿kAi(xør3÷“~Ñõõõ ®*cj?F]ëÀ¨VÀC±Z¿ÓŠî–†w<(€"yåL~*jÓRÿÛÏ÷$3öööÆÛÛÛcO}­Ú¿=‚ìééÁb± ×ë€û.€~‘–¢%Y°ú¨ªVÏãJ0šËÓö§ÙZL ”——SYY9@Ù/É ÈHî!&ÒÄñ6/–¿Ïây-ÌÌëp<õz=iii$$$PTTÄ\v  Ù°aYYYLœ8QÑØeõ)ŸIÊßWÐ6÷lÞx=?G0¦Ó‘øÅöî£è±ßÑž˜HÚúÈ|ì)Æ-<‡â—!ú¸/4µX,„††rá…RUUÅîÝ»éîîvéƒà¨°WþŸª%qqqDEEQYYÉèíí¥££ƒO?ýƒNâÕçî¤ #aD§ùMH‹eþì‰<ºí ?á${Ó±ÊP”uO Ô÷sPÔýyŒÜD>5ð[Púõ֢̕î¾÷PfÆïå Xf³yÐÿ¯vÍ^@Мà í8føÎØõk„G;[ñ#qŒO0Ý>Ðjeøêww|ªºÔ@žÇî¬ÐÙÙ©)´ÿ;¢$"謀ÀPl.µ{§OÅ©àâØ6ØÔÔ„^¯§³[Oyµ/—œÓBãqo^ZC[§:Áz~:ü|¤A-ú²,ãíím³ªÝ·o•••.õz½žÃ‡SVVƤI“ÈÈÈÀÛÛ}O/55TÞr#‹.P´ÎÚâZÛH|ù_È^¾øtta áàO®#bÚ¼;»ý|D#È:Á ÖF…III$$$PZZÊþýû1™L.@oo¯m¾Àé¢0 ¤§§ÏÎ;ùÇ?þAOOÿúÇmœ;%c€ËßH,o½ŽÛ–-âŠmùÊÊoŸÊ%£ Ëù'ŠylÍôŒgäû@©×v£ _¶zQt…+P\ƒGó£žR ÙtØÀ€Ö½âLàŒêײóÕÊþÝÕœ8"÷ïi¦Ø²^ëvdlÃt¬n€žRÚžûà­EuuuÙ2SÇç© @ý×b¶ Xÿ³µÊýVÀZS OU `$œþì—¿¿?ùùù477SRR‘"=z½Lrœ‘UëbN"3¥—Ž.=«ÖÅbo/çeàà`æÎKVV_ý5mmmšŒ€zöìÙ3`¾@ñ¾‡,Šè4ºJdŽÔ Ÿ`hm¦ùÂù¤¬|…˜-Û¨¸âRšòr€5øÇìÙ‡_]5çÎÃàvY`„ ¤¤¤°oß>***4Ë&êgQõ‰‰‰äæærÊ€——k×®¥¹¹™¿=x-K—Ìó(xXH2gdÀkmÝ,£À;Pô~–S¸OŸôÍH’$,¢^™¡Òo,»fè·Âv¦ÑÒJìFÊ p8ÀS]›• Òq‚¥™Óä µ ¤xÌxJÇhmœªëŸ(ŠšõfǪ¢(ZÕüÖ X”Ð :ëNµ a4ÆE€N7îñÞ¼¶<†¸(ãBõ|µÛ“¹‹#ÕA\yA3Ù¼¾>†Cþä¦wóöÆHj}¸èl¥>öæú(ºzõÜzMz½s#!Î=÷\š››ùâ‹/èèèÐ<_ꪽ{÷R^^N^^‰‰‰¶,º;*Š=7ßLäüsÉxqÉkÿCÕEü?{ïU™¾ÿ¿Ï™>éeÒ+ ©@ H¨RlXWa¿êZWÝU±¬«kÛu]Öºb×µ`GEY‘"Hï%@€$¤÷Þ§žßS˜„dfHŸçõš×.ñÌœ™sžóÜ×sÝ×}ÝŒzñuÔ‡ŽaðChkÇ¿´ Ѩ§-(ˆ^ ÊŒ&D³ “Vë‘‘}ñJKK#>>ÞÑ_À]7Fg}À¨Q£ðññùÕ@ÀO?ýÄ{ï½ÇÅçàýîÄK­:'ÁA@!™xüÓ¸`k9gñãõXóíŸoØóhàPÙVݳøÛçcõø¥ûçÖl¤Ã@s¾Y›¿™l-§-N6ÀnŒ€„“»ugwVW~Üû3é\æð{¦¼¼¼úõ[]uàt1²lSuH€w87Óú­°w=; Ø3¯o¿Q=wþv¡Šsðt D³Íù«àO²™Y¸³þ-2Ù#Nd¬ÙÔ‰Z%pÏMþ̽,„/––°?OM|Ts¦Õs𸫷0c|#åÕ*÷⢠ˆ2Ém dΜ9²uëV—m‡e2ííílÚ´‰ððpFމN§sì j‡'ÑðôßÑTV“ùÈ£È:%Žüë1¼*«ˆýð 0Y0+Utu[ˆÔõDìÙGز•˜|5äÝq-±Ñ_+»> ''‡ÄÄDöîÝKee¥K6ÀîP^^NJJ ÉÉÉgÝ?`×®]¼ù曌ÃKOßDXˆÿYWü÷º²[ ½ÚòÔB°¯œw[LÌ”gøé­XÍzÞ–cö]ŠUØw–#¡hÇ€÷±Öíõ¸zf¬î}ƒ!ø`4P«UŽ ‹e{f‹¹OÀÓ΀î€ÞØag?›~Î~ØÛ÷`χ<ðÈsÖ~áAèw @.—»ˆõvÃ{æˆ F£™Læø¥$ÐÏBÎÈ&öõ&¿TÅ•ÔÓÒ&g×!o JÕÅ»€4##ƒk¯½–ÈÈH—œÑ)((àÇ$77÷¤û $aðñ¡1!ÞÚXH’èÔ!t$% 3É~ò_$ýåLÞ^ìÿï‹ÿþwȺÚ)¸ëV ~>/`ôñËfèزϧÈÈH.¾øbÆŒƒJ¥r líú€­[·²fͪ]U>x0ÊÊÊxá…¨­­eÆä‘h|´V‘š\vg ’ºj¡f”} õÁØÐ= ™%.†(X~g9µvy%”-»»èì²™®â³¥ -ÍÜwc'o/%2DÏ×TÒÖ!ã¹¢9Vl z:ŒF#}À¶mÛ\O»>`óæÍäçç“‘‘AHHˆcŽtú³õ¹çP··£÷óãÀ½w£›>•¸ÅK{Ó½f#‡ç߃$ŠDn߉ï–Ýä?tF­–¨{ÐmÛŽ¼¡×\I}Zªu“<4jµš1cÆ8œËËËÝÞ¿ââbÊÊÊHMMeøðá¨Õj·@@¯×óïÿ›#Gºï[ë›ÚYöÓ~Üp€UŸ?Ê”±)ýK˜º ³ ZóÀPk›ùxè‘ËEîý]<³v4°k¾¾×ïä /lþ"¬9þ4ÛJj9Ë¿Xe;_’’ÂÔŒ ¾üòKw‰gXÅÿ aÌ&ÓÉ@‹“# «]» 8Ò=Uû=×õþjzs4›Í¨TJ{â¯DGG‘›{¨ß€:;;ñ÷÷£©©_¤ÏÓnƒ!ౡÁn½‰ .œ† ýMh4:;Nª,/œ1ëo¸ÎãÝ¿$Iʸ¯zÿ¾è¤““F°uþëÑÜ¥ZCL I«V­:EÑjo™üÙgŸñ /pðàA·zŒ £Õ\0Q‹Løä›6®™åC\|"å5J.ŸÞFeBhdRv ’]"ûzq¸@‹ÉìÙ÷7™LÄÅÅqÝuבžžîö;Éd2jkkY»v-[·níÆX”J:¬÷L¨5‚Ãóÿ„ °¨T ó}´•ľÿ #|åOL¾ê&’_€²²–朌þæÇ»¢úÁ˜Ífüýý™2e S§N% Àío1›Í?§·6=ƒ}Ï çJ;ÐÓ?Úb±¾Áúr‰:膜n  ¤¤„ŸþÙ%€(..æõ×_'##ƒË.»Œèh׿¯È—o„âí%RZiµTΙDo-ÅÅ¥\9½–æ6Ï/Š¡¹MD£´àïcæ–+«ò7zD§dgg“””Ä®]»())éóØ[aa!ååå$''“””„Z­>%èFmÛ†Y«aß‹ÿDÙÖJäC¨‹ÊiOOBTÊ0„êØþÖ‹ü|€oäŠÕøîÜÉÎçžÁàïß/ðIhh(………äææÒÑÑáò·Øû äçç“™™Ù­òÁ>>ýôSV­Zåö;–Õsûü7XüÞC¤Ç‡Á)þvŠ¿ ÚòÀÔæNŸu ôSòȼa<öÎqva5ç©¶ÑîOb•Ñ÷`õO ³ü³ù|‰Àa¬Î€ßÛž¡ &ðä“O2uêT$Iâ©§žâØ1—vý¹Xe ƒq `6Y×L'# “ @ßì‹ÅÜ7kÛ߀óZÑ[Àn½‘ظؓÁ¼½Ã%ËÙÛhkkexÒ$yôaž}fÁ9ƒðˆÇ¿ãÎ[ññ± hµŒF£Ç'P*•„‡Ev{O@`wÞu›ÛEÕÙÈÝ«7”i6›­NÖ€u";å´ì潞ˆùx{{3uêT—%gvP´gÏ,XÀ’%KÜ–u‹Q$#;]ÅEçkxæÕ¼£åËÕÃññ åÛµÁ‚…¿Ü\Æc·—‚ëwZ›q´¶Ë<"RL&jµš©S§2sæL·ùqQ18p€Õ«WSXXؽÌP’8zÉlöüçY“è#òÝ©»äBv¼ø “Æ!¶waR©Àb‹‹\†÷Þ\ ‘áœô’(zÌØhrr2_|1iiiníýì̆³ûà÷ßÏ'Ÿ|âñÈ=VÁu·½HQ¹Í±^Áb°æõ+„Šeм Ìíý@ºŽ³'‡h¾jÛÙϳípÇjÕ{-Öšã³ýTížÆ*î[©P0kÖ,vìØÁÏ?ÿÌŒ3P(ìܹ“W_}ÕÕǰ–ýUýèÎ>YÓ¤6À"¹ldOôeõÛÛ¿Ý¥w¿KOÁ_dd&Žïvz½ÞÐo KoÕ„Lœ4žŒÌQž¾-àŒ×úA0±<’KŽy²û·V«íwÙĈô‘9œ×ý3Gtü{£‹\ÑG½¢M³ÁÞËÚVÎbv”¶H}ŠOS2`)€   ®¿þzî½÷^FŽéòsAÀh4²jÕ*žyæ6nÜè–Õxé 7_ëK\”‚+/ö%%%ÃÞLÏé"4H—ÆL°¿‘ÊZµ -޹¾t<›ê&“‰àà`.¿ürÆB¡p ÚÚÚØ²e k×®¥¦¦æ$€Zâã$‰€’cÅ—^„E!Ç¬Ñ  ÈœÚTË F”µUtÅÅaQÈ2éÛå=Úï…S­V“ÍÌ™3‰ŽŽö¨ ¶¸¸˜+V››ËæÍ›yóÍþoH«`ÙŠ-`n€Ú­VŠ¿îg0Ôœñn¿¯‘íÅù£üø'pŸmkô<Öyb•KŸ­foÇ» «)ÿÀVµš¹sçrøðaV¬XÁèÑ£¥`ÍÍͼþúëîÜÞÖbmç;XÇ€Š6ÀxPÙýzªër~9›þ˜Ífæ\uy7·ÑÖ–Vü|û—í›S¹\Î﮿ÖÓ·ý&ªÜúw$&&v²¡J­B¥êŸí‡R©¤¥¹»P,&&šÐÐPGiToô_Tko“©·Ý³ƒ6pX¬n€[YYß‹øÐs”Éd$%%ËþýûYµj%%%.kš››ùøãY¿~=W_}5iii}+ó¸föIÒ¨µÝ‚—FFtT4 ¾ìÜ[An¾–ãšXñK‹Àÿ6²js—_OvZ›GtºÙlfذaÄÄÄ››ËáÇ] ‰¢Hmm­CeŸžžîð@’({Õ€ÑÇÁb¡3ÐÑØ…¼« £·õ9ÖT×"vtÑ4,ÁlA0›ñþÇ„|ù ÞÓ§Ðü—ùXúYngoM:iÒ$*++9pàuuu.ë”- kÖ¬aÕªU§[ŸLÁ‘mPÙ féW úÝ(Ô&‹…‘ÀÀˆ_!rɰj v‹€"ÀÇLJù·Ýƃ>Hddï-ÚW®\ÉâÅ‹]}tÖ²¿ï°2Àn&@7.€t×ô•ºííïîÖüÞÞ—8<±Û±ûöígÒ„)§®Nž;99ÉSßÍ™^ßÁÜ–2ddvß©×T×àãÓÿ^!ºš›ððwL”‘£Ò©þ©ºÏ…°·…¾/‹ÉžâAûgØwøÖ2@‹(Ãl±ØZ†ömd± Ð_ÐÜjõ9ðõ9ù>•JÅØ±cINNv쎛šš\ÒÒR^}õU²²²¸üòËû\P‡—È®óá£oZ9§eçhbÂD„X¹9€)ç51!£…¯Ò±l}J¥o…˜ˆ®Sú ôE§ggg“˜˜ÈîÝ»)//ïØsçv}@RRÉÉÉ}€Á÷¤ç•ÐÑ…`± ji¥38¿ò £Ds\,ʶvÒÞ[Dð²Õ”ßv3y×_íqu@_ ˜]PTTÄúÔ444°nݺ~¥ÙzŽÒÊ6ÌÒY){4aviæ—-üÍFÿŸÍíª«!ÿà¿X[óêt:ž½ÿ~n¿ýv—ÍÆJKKyå•WÜâc¡0˜ÇUØD€vU¿ ¸ Ž=D€îòÿ®ºöÜ8—}GÇDàßm½PÈÕhµÚ~ÿNçÕÄÇׇQ£Ø·wßož‡pmœÛùZ€ÚOïD¢H[{»ݘOSO %ìâ$jœÊÍH‚€E°¸\©,–¡á°mo'ÿXØÈûχ’Ð}Núùù1kÖ,222X·nÛ¶m£««Ëeݽ{7à /dÆŒøúº{·þÎÔDwtpÃ>üîoþø7%!z®¾°Iin•ÓÚ!géº`ê›\<±‘™=ë¿m2™ÐjµL›6ªª*vîÜéÌØõ¤¨¨ˆ‘#G{Ò…O’(?ñ_¡Ðë­9K™ˆoUúpF¥‚‘ÿý¿Õ¿Pð×{)ºpª}òÙ n4‰‰‰DFF’——G^^^· €––6nÜx:Ýɺ3å˜Mdâ¯ß¢Ø`´°tS"V7À³õÔ(°öÚÝ|t qqq<óÐCÌ;7"M³ÙÌçŸÎöíÛ]^*à?`=`Zºk§W)>çÆtΛç¡7‹ªÓúÑÑ1ÝÎ葎à7áàvTW×tûwDD8'Nœè÷Î}÷ž=voZ]UÓg€w%髌¤wÁ  aÚ¬äìmíBÐ2ªL&‰CÇ L¯ÅÇKdýÖN.¿­‚Ï—žÚ²\&“‘œœÌwÞÉ-·ÜBTT”Û\^[[‹-bÁ‚Ž<¼»qñ-ÝHN–¥:Œ•›™%‘™ÚIs«œ¢J5Ãc:ië”ñã–>ý_(ÛúböÀ?À~_¸üòË1b„[}A¨««cýúõlÚ´‰¶¶6‡­°ã“ 2¼wïGÖÖÎþgŸ¦jÔˆ^·³1ìsÓÏÏ &0yòd¶mÛFeeåYùü–v3Mç …%Yµ­†ê&ÓÏ0J @!ðÖ^“¦Mã»ï¾c×®]Ì›7ÏãàßÙÙÉÛo¿íîzþbÃCa Èbd1™»UxÚ È™5è'@oÖ¾=ggØnŒ‘B~:m}0ŒÝÀ‡Á³2÷3^ äCaæ8p°Û¿323X¶t9ãÆ;…õ5Ž;†·“G³$IÌ=är‘ìíov¹ل³.Àù½Î €½äÏl± ˆ¢\%¢‡B  ¸ÜÄÑB7]ãÆí<þb¢Ãb”Hì:ÐE¨NNLÄÉ©¦V«7n©©©ýÒ¼üòËŒ3†+®¸‚ððð>¿Sp Œß_iÍ·õCf3<5?_¯`YP‰B“G7³hY(5*²SÚøac 5 .RïÑSe±XËådee‘Àž={(++s|ßÞ~ƒ$IQYYIRR)))ݼüÜv AS&Ó¬£30àÊ_’ËñÍ/ 56Ö:oÜì‚xÁÃÜÆçŸÎÒ¥KÏê ð PþÊ«—ÀÞãÍl?ÒÊïèŸ"Jº°Öð?üØ*ŠÜvûíìÞ½›¯¿þšéÓ§ŸV𯭭åÕW_uWAñ5Ö&„Ce œP²81§ž•öU¾Ý«ëÑèáxð`.F£É‰°J÷W?ÓØØH.°ÛyöìÞ{N®¯8TfßÁƒ¹'B_®¾æJÜÏÇLCCßb®’’Þzû-RÓSˆëþ™=˜…Þ»+')OM&,’d³üÅAc|õ< xZú%I°fS'A"O¾\ÏÅS´D†ÉIORÒÚ.ñÐ?ëQ)E>­C­ê{!µëî»ï>FŽéуø¿ÿýÇœ-[¶¸ý¾i‰ÖÐPUc&.ZÆsÃ)¬ˆ +M";µƒW>dãn?ÔJ‹ËxÙ¥éèû¡¡¡Ìœ9“qãÆyÔ¥¯££ƒmÛ¶±fÍjjjܯÖèHŽ=ó$~ëwsÇ]ÊëåâH„ïØÅˆÇþÉÈ7ÞÆ§¼Â5ƒS\Ü/£OÇEçäÿëîþ‘‹|ô¿R¼Í£=ŒP2 +÷~?0(ôöæÞ{ï娱c¼ûî»dggŸÑ×úæ›oÜ9'VÏa5ÿ*c@J’Ìvët§õÒ­6Ê…°+ÀS³7;hmm;%=ú¼l¶m÷¼ C’$6oÞÄðá Ž¿8QD]]ý¹Ùì ‚‰õ´'Í;ÊEÏp8,…††àããÃÆ›X±b…#0FZZZ())aÕªU|·ô;FŒHeö%w£¶›xâoOõ9ãÆÍ«~bÝúu¬\µÉbAET*%¡¡!üþÆHKK=åÂ/ûî{:;»\Þw7Ï]G@ûqÉÚ»Õ¦,8l+{=Çi¾ÿþ{î»ï>·‚§ú3­í.˜¨å‰{)«4QRafÕ†vªjͼ÷\^Zûþ^GI…‘ÄX%ßéOxˆuÚí: G©„‘É*0P«ÕääätóhnnvYrWRRÂsÏ=ÇØ±c¹âŠ+\V‡ÈlñrÞöÒs×ãÍŒ~Ì¿EITÐ úÒðÔ6*زןŒäV|´f· …B¡ ++ËÑ¥¯´´Ô­@II •••¤¤¤ššŠB¡8…EŒFÌ295c²¬½ mu ?þLíõWP—–Ü- ‰¢55`û›\.gæÌ™Ìœ9½^Okk+yyyìß¿Ÿ®®.Ž9Buu5]]]S¥r™ÀØT0üŠ –BdËÞzZÛLÌr±ûz¬ ¾ꀄ„Üv÷ÜsOŸ ÿt†Á`àƒ>àðáîÛ‡µGÐPÂ;Ôú=4nS©_ö힬õÎå²ö¿-þâ+.œ1蘓=M²²3Ù·w?7n$''§W[àÚÚZ~Ùô YÙ# s*E¯¨¨ä£?9g×W>”fàï/"2*¢[.?<"œ›o¹‘úºzê0Mˆ¢ˆŸŸ/¡a¡½ ÚÖþ´ŽÏ?[ìÑMïkïËȹAƒÆ·#F»“•Å‚Å,€Lp)8“¨àöíÛÙºu+\pËãb£ä¬\R) V ÈÓÓ¥—¨®3óŸ'‚‰ SpÛ#Õè ÜêÏ’•m<öB=ï?Š$Á ï6Rßhá‡ÃQ)»_ fÍšEff&k×®uKõ‹¢È®]»Ø½{7—^z)Ó§OwÙ.ÚÇKä…°ÿ°ƒQ"y˜o?žÙlrÞlòÝÚ`d2 s¦×#Š’Ç‹—··7“'O¦ªªŠ}ûöQWWç²9ÉdâàÁƒ‘‘A|||ïs¡à/˜Í$,_29—ÌD’ÉDUS Q»v#êÔ'ÄÓèD9Ú‡J¥B¥R1iÒ$&Mš„£F¢¨¨ˆ‚‚Ž?Κ5kÈÏÏ'??¿O«j™L¹€Y)"%D¹Æ³ Œ<ÿÑqFaµý•z Õ¶mö2¬Š»ÌÌLþùÇ?rã7¢ÑhÎús³cÇÞyçW‡˜€`íüÀƒaéÙ —üÿ)φ­pOo €s*ÀÕ:ܳͻó{ï¿ðèßéÖ(3+ƒúúÖoXƒdˆŒŒBE:::(8‘Odd8Ó.˜Üí=ƒ>üøœ¦~‡L À>6ý²™a ñÝ—z B¢#XŒO¯»­uë~æù¿äò:Žøøx—»gÊßþïÞ&N{{;Œ|}}QkÔ¶ô}¡jkïÝž¶²¢’Ɔƹ)Ì™3ÇíB©ÕˆŽà½b}ÅåFž¼7é´ü¸±ï~lG©¯dTªŠ%+Û¸þ2~ÞÚÉgK[yæÁ@’†)û¼Æ>>>¤§§“œœLSS“;j€£G²e˼½½ uÙb3L''2LŽJe½—¾¾¾˜…P¾_+Çß»µÊÂÑZ–oâ’óð÷1óóŽj„‘ËO.£@oi|I’ðööfذaøúúÒØØˆ^¯w™Þ0™L”••Q^^Ž¿¿¿ÛæDö…Ow8øWޥ쮛¨¨›w÷ƒøÿ² eu=QK–!×hhèÁ8¥RɨQ£Ðjµ“””ĸqã˜;w.·Þz+óæÍs,žþþþF'ZUbñª >[YÊÑâVòŠÛ0JXY/…ˆÚK&錊˜v¶ðïE…\dØÁö*ÂêØ÷<Ö¾º9“&ñÒK/ñÒK/1vìX·bÓÓ---<þøãìÞ½ÛÕaKm_ËÄÐiX;ŸÓ‘’’BHX&³ “Ñ„ÁhÄh4œ²p~6:::ðõö#::¥RyHôRæg6›1.7|---œ8q¢OŒ²ÒrŒ&#£2FvÓñhµââb‰A” (ÕrBCuŒ5‚ÈȈnë’ÙlæóOóý²ÿõ÷ýÿ#àŒŸ~ònúÃÿãÒË.ÁÏÏ3KàÆ†F–-]îvçï<™\9C93®ƒ“ÔÖÇÚÆH‚€X\9¥Iw7oÞÌ¢E‹xà<~σ·ûsílo¢m%û鑤⑻xáFŽÐÊ€×5‘=BÅŒÉZL& Qúlx'—ËINN&&&†ƒ²bÅ ÊÊÊ\ÐÖÖV>øà~þùg®¹æ†îqy£Þ ãëU2ïJ'Ü«Œo~Ò¢ 41õ¼&òK5–«°”ªÙ°Û?Ì©"2Ä@[‡Œ×>äŠiu¤%tô¹‹6läååqôèQŒF£ËïÕØØÈš5kˆŽŽ&33Ÿ¾wÞ] ûâkº’â)š2 °: F8ˆ¼®žï.¤5&Ѝ_¶’ô¯W¨ÉEKLT¯s;;;/¯Þ{h4RRRxóÍ79qâ‹/&//ÎÎNôz=ÕÕÕ444PßÜÌ›Ë*¬¬ ‹¤Åj•èÃÄQÄ…k‰õ&1P 2ÉD0y°û‘ |¿ºŒ`œS4= |lD™Œ3fððÃ3eÊ”~U¶œÎX¹r%K–,quˆÝï¿“¡9°8ZÛ+z2µÝX%zuùëËØà »ä«o‘,sç]¯Ï)ëž* IDAT‘³epÏÑÖÖÎW‹¿fñ_óë+¢“‘>ü„o—|ÇwÝAZZ ‘Q‘§I’(-)%7÷0o¿ù.]]]¾+DèL¹+'é ¬“OD- ˆfWñ_ÐküÈ#0qâDrrr<~OLäÉ)5uœ†Uê9Qjàóü¨©7¡T|õC¥•fž4˜ÅË[ùßšvdüáZ_2ÒT}Z#h4šnýV¯^Ý­umoi¢¢"žþy&L˜ÀÅ_LDD„ÛÒ®ÔD%W]ìÍkuàçLM£‰»¯¯g_ž7…ej&eµ×Á;_‡³i¯¿›YK}³œÌ”6´j‹ÛM©T’™™I||<¹¹¹»u!+))¡¬¬Œ´´´Þõ‚@즭xoÛMÞ¿žÂèã ’„`±Xux’ˆÑ×I.§vD*ÃE¯¦&šãcuv!L˜µjd*£³²ú þ=G||<>ú({öìaÑ¢E´µµ9ÄO&“ “ÉDmm-TWWs¢ºš#e|üc•$E©™4*€´x2’ýˆ V¤ÆO%‚Åê’è`*¨¨é╯K™…Õùo'°ØŽUCrÍe—ñ裒‘‘qF­<ååå,\¸Ð]y×FH Õ10g `KuV¢Ïµ×"Yº û<1n;Ýàoß,ùŽòÇ»ï ==Ñ ¶$I9œÇ»ï¼ÇáCGä¦ ƒ`b•(§ Ñ‘•IPUÉ[[[ÇÞÝû¨¯ï9EJJ Ó§O'""¢ïMˆLæx‰¢Øíå¼×ÔÔ°víZ::Û‰ŒŒÀßß™\ŽÜö>DƆ†^'Ù®»9QX4 7'33“~øÁåµèk˜L_ÿÐÎû_5ÓÚnáÖëü¸êb/æÜ^Éä±r²T<þB=—L÷ÂßWä»ÛYôR(iÃÝWtK’DUUk×®eÓ¦MµNE‘Ù³g3uêT·R’k6w{Ô@fšµJàöGj ×éii“¡Õ˜©oR0{r©Ã:xîýhn¼¼šQIí¨”žçðA ººšýû÷{T (IÆaãëtäDïÞMÉyc1«”HršªZ,J9cü†Pµ—Ï&è—-øýø ;½†ßñâßþY‡¦ós=ñWüÇçœÖ\Ñëõ¬[·ŽÅ‹£P(\¦Å:;;©¬¬D£ÑÐÚÚÊþýû Z¥HR”†Ì$_&e¢%>Ö‹(?%*µŒ/V–òûgs™…µžnÖj†yóæñÐC‘pÚ-­Og‡úüóÏó裺:,8ßöu‡ê¸øâ\ŸôÒK/!#+ƒAOWWtt´;u tbXm!­¡¾Ðp&Nœˆ¯¯o¯{-¿Á`À`0¸o¬[·Ž¼¼<¿÷¨Œ‘\}Í•DD„æ ª*«¨¨¬bé·ËÎF½¿0`oLàlŽääd·@Eär¹Øÿ×Yp¬¡³«“ðˆpüüü‘ËåÈå"¢ "ˆ" Ö«Ðãnìܱ›¢E~=æÍ›Ç»ï¾{Z]®Ú;,té%‚düí…zVþÜÎÒwùý¯5d¤ªXð×`®¼£‚‹&kùÓMþM §ˆO& X¹r%¹¹¹n~‹ÅB@@W_}5™™™‹Á¾XÖÊËï5ññ¨(+åé×êRP××ðÒŠxi­?§¦ÞÌÜ+|Ð$J+M^"·ÌM㺻ˉГ×ÉóDÕÅ”1MlÙïËG߇rï¼r4* ÁFèd»ú>66–C‡9œÆ\1¥¥¥”••‘žžNZZ2™Ì:§,ÅÓ¦€—–¸7Þ!±º}b4‡ÿþ­±Ñˆ’„E-’n0âåçtèBS;Bs+´µÃ†Hµu0<!; 4ê~Ýïøøxžzê)vìØÁ|àRð¨P(¨¬¬dáÂ…deeqÅWCDD„Cƒb±X¨©©áĉ¤¥¥yÜä×7ntç¢Ø<´ý8½a¶ íÍ}ì>Žõ´û:mOX,’ƒ%ð¤௠3{>ÊgYçÖ$¤¯@g‘`[›Õ.Òl1ãíåR©´Rÿ67@Ðô½ŠÀÊËËin<½BÖ¬YCbb"ééég”c•ÉrÔDÓʧK[ùy[MÖòÚ¢&|¼E^~BGN¦š¶«Ž`Þo¼ÙH¿Œ ¾§­J¥"!!ÌÌLÌf3eeen;õ•••±yófŒF#aaa.ÓÞZ‘‹§z1y¬†e?µ³b}' Ÿ áÇMrò es.Åë¾ûáÕw>øü½‘æÿá‰BA1Âëo#uv"Lž§¡¦ŒŒä‚ .@.—sàÀ—l‹L&£¦¦† 6 ×ëÑétxyy9@µ··7ÑÑÑÝê§bÔÕÕñÐCqìØ1W‡½g{Yú#¸ò\Ÿ4>>žð°PÌf&“£ÑèT¶gÛ\I6Á´deÄ»:;Q«5DDD8\5û²6™Ln@kk+'Nœ8-=Ù9ÿêàQ@1˜®ª¸2’±ž–À½Nž¢XlMc”J‚h;Þ¶-ÖÛZ?ž *0¬\¹’ÐÐPF}ÆŸ&çêYÞL¯å÷Wùª“óú¢&&ŽÑ0uœ5göõmŒã”<óZ‡Ž(¯2¦“à'ëó¾ØýRRRÜúØœ£G²{÷n4 :®OÚZÀÛK$>ZAÒ0%þJ^x·ƒÛ~§%;ÍH^…¯Wë˜v^ó.­¡©UÎŽƒ~LÓŒLÖ?ÐîååEll,þþþ466ÒÕÕåX,JJJ(--%88///+*—c°UXd2â¶n'þ“¯Qþýq„‡„¤$„~BšDG!Ìé­×>4i<Â=‰c!!þ´îµB¡ %%…óÏ?ŸÆÆF—iûs•ŸŸÏ¶mÛÉd„††öê¨6Pã“O>áÕW_uuH5pÐÈocdsÎõI‡ÅÇj­(1š0Ø<N©À²m† «« •JMxX8Z­¶ÏJ»Àhkk£¨¨h0#ÖÒÒ! Ôƒéªïèùêmòœ(:ÅbÁËK‹Bag¬ÓU Fƒ#ì<*Ê+ij\ÝBF#Ë—/ÇÏÏìììÓÒ8¹\ (@†—ÖzMò Œ8¢')^ÉÏÛ:ùè›Vn¾Ö/¾o¥½ÃBVºš]û»øê‡vfO³–ª)}çûƒ‚‚ÈÊÊ"22’òòrÚÚÚ\útuu±gÏ   OAžZ%ÿ2Ò!+ãŒî·V«å¼óÎcĈ=zÔ¥àQEL&û÷ïçСCøùùxÆsîLG~~>óçÏwgJõ8VâßÊÈ®8×'‹‹%4, ³ÉŒÑƘÌf›6À–@ê&—êÒëQ)Õ„‡‡;„Ë={à÷´¶¶VÐ…µ¯Ä÷>ƒéªy”pÎÿvÎù·¶¶R\T„E² Õj»3‚•°7¶8TT 8ŠµÄºÏñÓO?AZZÚYuVËJW±ë€žEKZؾ×ÀÕ³½‰ —óé·­<ÿX0wÜàGC“…u[:X¿µ“oWµ¡T.Kår9QQQŒ=___ŠŠŠÜÚ 744°uëVêêê éÓY¬ú€ 'iQ*~ú¥¿i癇B˜86œ_vÉùi³’«fÔqà˜7߬ FoÙ¶ß—öÉñÖ´@A©†Å+Cˆ ×ãÝK¯I’Ëå„„„ÙlvtÁtššš8zô(2™Ì"ÒÒÒPÂÕs (**áÚ9÷Þƒ$áHùǾûÉ×¾þaé2¤ùFˆ‹uâÁëaß~ ~å   ¦OŸNpp0t hd2mmmlݺ•ÒÒRt:~~~ç¤Æ¿ç0™L<÷Üs,[¶ÌÕa{€ûýoŒ.fgÌ&Gãž“¹}‹C `§ô]z” ¡¡aV¬.®ÎŸ3D€à…¡nwlÄÆÆºeœkþí´eÏÙ:yŠ‘l@¡Pœ¢pAì¶´2Mq žb\ÝI’B»1cÆœv‰`Ï¡Q‹ÌšæÅE“µÌ›ãÃøl5?[GÚp÷ßêO[‡…‡Ÿ­#}¸’‡ï  ¶ÞÌ'ßµpÝ%ÞhÔ®‚Z­&!!ììlL&¥¥¥nÁ]YYÛ¶mÃl6£ÓéÜþΨ0©‰Jfž¯¥¥]ÎS¯è3JÅä12Þ^ì…¿‰;¯­".¢‹ï731³Q„eëƒ8V¬!3¥_“ÛßIXX骪ªâ9G¹œBšŠpñE™ Õ"¼ùÒ?Bxýe$o-lÙ†ðé7Špï=àoÞÁŸ€O>‡k®7ÏJ_×766–éÓ§#“É8tèËòG»>`Ó¦M´··êö=ÛcëÖ­<òÈ#tvöiè'·`5&ü-1Àeçú¤1±1„†…b2›1™ŒÝ€ke•½×ºmèõzr%aaaŽùÑ›°¯2ÂÞ€âââÁjW†:ø;O;Ð×lŸ<’dA£Õ P(OÑØsZ¢ØTVTÒÔ8 ` VÏò)@h_Y,¶mÛÆñãÇÉÎÎ&((è¬}_o/­ÈñFVÿÒÉÓ÷$ã•÷›ØwXÏ; B™¢bãŽNê,\¹5õ&vì³6$ÒÊzm=l’¥§§“ššê‘>Àl6“——ÇÞ½{Q©T÷Y !— $ÆZ=~ÙÑÅú­<ûp0;s•T×™ÉN—ør¥/M­rê›”L=¯™ÊZ%Ë7qá¸&ÆŽlõøÙq466ÒÙÙéFvîÜI^^QQQøûû÷vS{)(&OƒaùwH¯-D˜`UãK!üé>«øêã÷ÂÑ‚ŠJ™ oùùùìܹ“ &œ3m@[[<ò{öìq÷ì¼ÄoCø7(@Xh(f`4mÀZBm±—òur%¡¡¡Ý€žUýa)(Þê`40v(2Î R_6À­­­!!¡Ñj‘+ä§0v:Ú  ÀÀ€ÿ??cu0 uup^^ëÖ­#>>þ¬»°…˸îoÂCä”yìùz®»Ä›Ëgxsü„g_oä÷Wù" ðÇÇjÙ²»‹ÿ­m§¾Ñ̸Ñúú*v}ÀèÑ£‰ŠŠ¢´´Ô­> ³³“½{÷RXXèV§`ÖT-ÃbÙ¾¯‹—ŸŒbòy*ö1Üɘô¾X‚—ÆÂµ3kQÈû'EbccQ«Õéذa---DGGw¯zˆ‰†I9ðÊþñÂÞHï¿…pÕ`0 -þáú¹pùåðÂéö?!üy>ÂûŸÃ–MH)ÉÑQý¾×ÞÞÞŽR΂‚—̆ \pÁdee³‡béÒ¥,X°ÀUθն¡ŠÝþ<—žë“FGGjmd2ÙšNÙêû-’-ÿßÝ P¯×#—) ÁÛÛ»×]¿§ùÿAöp†æLƒœLŠ 7`OM@[[Å%Å€ZB.?…0›ÌHH§ìz*+«h°Ø…µ}úr¬âŸ@—\Tm-K–,!&&†”””³*Ô’Ël­•ÍÐÖ!qÏ~("O¾\Ñ$ñàí̦™(°èÅPÆe«Yðf#—L÷Âϧ{Ù¹_dcì´rdd$çw^^^ýÒÔÔÔ Óéðõõí3àúØÎ¥`û¾.>ù¶… Û\1Ó{n ¡¸R÷«eÌ›]Cháô¯‘\ŽN§#..///JKKûÜEÛçiqq1ëׯw¤÷,.aî\¤kç Üw7ÂèlëëÕ7þúw¤WžGøóÝ “Ã?þ…ðÁ'H¾ð·‡ŠK^þÌ› ÚÓk¹Ì”)S âðáØL¦S~‡V«åöÛo?g»ÿŠŠ þüç?SVVæê°ç€oùmޱÀ%çDêÚËö,f ¬ §*ƒÞ€L.'DâÐqõfä©Ð ßk†:8˜6˜®ª],Õ ¯…¶µµ•’’‡‡û© €`í=/œ *+*€Uhò50ˆvõ&³ÙÌÒ¥K)++#%%…àà³+íÐjD¦ŽÓ Õˆì;¬gáMø²…œL5aº“ E¥R‘˜˜È˜1c0ù”——³cÇ !!!.õ*¥À¬i^D„ʉ–3.Kƒ—VFk‡’ÉJ®š†B!G’$Gk]ûy\ ûwT«Õ„……1bÄ&NœHVVõõõ”••¹c‹…ÜÜ\vìØAPP¡¡¡Ös*¡!àã Õ5H= Ÿ|o-D¸z(°}'Üu?Ò+ n¿Âà 4áùW®½ !"šjë¼½AôœE‘ØØXG'¿ãÇ;®‡$IÜpà $%%³â7ÞpgúskÙßoIø7à *:’Л€édÛi'ñŸÝ$‡¯Š\&G¬ëÆô,ô„þwvÑí k°6¿Ò ˜1Ø€˜˜· [ J§ÿíYPRR‚„Zƒ\.ëÁXݮ腨ªª¢±a@ʈW`m²æx€Õ@ 0ÜÝ›÷ïßÏêÕ«±X,•SžÎÕÉ3JÍù9J+L¬ÝÔɇ/†0.[Íò5í(•"wßèß-æ|¹¼Öµc2KÜxµ/þ²S‚º——#FŒ 55•ºº:—¨ßYpàÀ …£ä®×‡M&«`TªŠ@/ý·‘O—¶ñ×»ñóUHdd$ÕA4µ1,N‹B!ëÖsBEÔj5^^^øûûE\\‰‰‰èt:Ôj5‚ àïïÏèÑ£6lEEE.Ëíìé;vŸŸOttôI—½²r¸ôZðQÁ»o!Lq2úï"8~áõ…`?›7#|³áž;ò f^‚°ð-¤’“ 4¤_÷Y¥R‘ššÊ˜1chhh ¢¢‚ÈÈHæÎû«·øµpÿý÷ÓÒÒâê°?Ú(Ùßê Ì>ç @”Ø;KZ«3 Ã˜î;yƒÞ€L&'8(Ÿn»ÿž=%%%ƒü2Ô@*P^r6€';4;«»›L~’°³Öœ-§€êªêdÒ­ììLÀw€7󦆆V­ZŶmÛ $::ú´-„{¿î&G.ÕÉØu@Ï—ËÛ8^ddôH÷ýÁŸ¿“ôU­™§ÿSŸ·ˆF-ãîÿç‡\&`‘¬fCµ f¢Â䈢àÐŒ3†¨¨(JJJèèèp¹[íèè`ß¾}äççãïïïV®“ãí%2>[íÄ¢ÀgË:xã“ZÚ}8|4é©1DEEMLL †0>[®áÈ ÂBüçÝkëQ™LFxx8ãÆÃ××—£GºÕÔÕÕ±aÃÚÛÛ‰ŒŠB#ÓæÍEˆs¦{^}¢¢nþ½õ†Ô7ÀŸæ#¤¦À­7!DE‚Ö é¦¹°ï Â? ]|‘•Yèçðññ!''ÇQÅao9ük½^Ï“O>Ɇ .7Z뱚 ZÏØ³´Q;ç *: ]ˆµÙÕI ¥JÇå×ë ÈD9AAAøúú:˜®Þœ‡8Xlê@ü¿ÁtUû“°/œ½‰•ì @ii) V«Ë¬Ñj€`›œ 8‚}ÔÔÔR_7 y§•ÀŽ^þnÖb9]€Ž%%%|ûí·>|˜ˆˆ"##Ïzý¶R!pád-2™@W—Dz²ŠìªnÀ7?iáàQ=Ó'ZÁ®žåÑ$ñé·­¼øßF–­n'3]El¤¢[ŒŒdܸqh4«¥³‹¶Ã‚ ÐØØÈöíÛ©««#00Ð¥> (@FVºª˜€‰c4¤&*YººØ(%Iñ `4šàOOÕ²?Ï€,ZÒ‚(À˜Q}{i)•JÈÉÉÁl6“ŸŸïœœ8q‚6 R«‰—ƒÜßS¾hM-Â'KÆd"(äðÆ›߬Dzþ„¬ Ë""ÆdCv‹oB|„q§}¯CBBÎjµ‰»±víZžxâ G©n/à \ÅÐnõëÉÌ Óu«°7TëÞÈþbk¢%s€î½Xº§<ƒ8ð pp¨€z௃ˆŽŽöØ=üûB’­­­”••"!¡Ö¨‘ËdÀfC+Y €sp¬­­£®¶n .ÁÀö>þ›«>` 0<, GŽá»ï¾£¦¦†aÆõE\©•¢bêx ‰qŠnÁÿh¡ñÿkïÌÜ*¯?þ¹7ëì̾Ȣ¢¨€lVq·‚(J[µV±J-«?­ÖâVѺ/U nÅ¥âhQë†È"«‚È3̾Ï$3“IrÜ$“d2™ döóyž<ÞL2¹oÞ÷ûž÷œïáágËùão“ص×A¿LN²òôË•¼º¤Š†w¼•¹W%J›˜Íf† Ƙ1cp8-ú€Þ gãÆÔÖÖ’‘‘Ñ*ŸEAýLL=#–áƒÍŠŸ(Q˜<&†óOã—'Q^éæµ÷ª¸ô‚¬%¬8ñoŒ=šââbòóóà —ËÅŽ;Ø´i½{÷¦W¯^Ý.‡C³U Ìý <õ<ÚÆïàÑù(3/Ös²÷£œy6ZYÊÚo`ÝF¸ò2”ãGu‰¯¢¢‚¹sç²wïÞp—= ¼L÷gp^G€^½Ó|á—Ë¥wt¹ÿà#UÑ€÷(+T Ò&?8ðp¨« €:à:QGÀÔÔT @\õÌÞÝ]ð®Ö¿PNN.(`±Zô³\¯°ç@óøÀªª`TRRJqQ‡T…^yDÀ è¦A-ßèº:Ö¯_ÏÊ•+½ÑG\+kÆ[KƒS㾧˨±kÌ¿9ç^¯äÔñ±¼õa5Ÿ¬±3iŒ•C.îÿK}3ÃW.ÄÇÇ3zôhŽ9把ŠÂNÞü€={ö°}ûvÌfsXÿ€PX-jÀâï/vŒ…?9Xù…¢R³f&’[èäë u*pÒ/ˈÁÐô¹ªª’ššÊ˜1c0` ¦¦&l¹Ífcݺudgg“••ERR’>îcbPÎ<fLƒóϰ U• IDAT†»oG™2íö;!9eÀÈÈByæY´ãŽ…ÛnBùå¹àÿx'a¥ó5}íµ×X¸pa¸…¢Ô³û¯í`bG €´´T߀æë èïèï è@5ø"páZG‚Ífë¬`Gxìdè$¿È­€¹³|ªÞ3ëÖ&¯…²®©©iŒX-Tƒ~^ëITн¬"žSZZJQa‡ €HΖJ€×=ÿ}QMVyy9«V­â³Ï>£W¯^ 80ªùþTUk¼»¢†k.M$+ÝÀs‹+Ùµ×AI™‹‡ÿÖ‹W—Tqê„.8+ž{ÿYÆGŸÛQ 0¨¯1乺חüøñdee±ÿþp®pù{öìñùÙ·6MÓ`÷>Ï¿QÉ“‹*Xôvﬨ¡Þ·]—JQ©‹ÿ»·„O¾¶óÉ;›¾¯çô‰±XÌ¡V£ÑHß¾}?~<ñññüôÓO-æóõ×_ëù}ûêþŠ0ü(””0¨pÏðÕ7(¿»NƒVR (7Îÿ²=ÿ ¸“ €}ûöqýõ×·TúõWŽ0 »‹ €sÛ] èGjjJ@ãokàÆn€AI€ª¢ÿM™÷¿#Å(/ïT}\À½GúC:‹¸Hï,Ÿìá€à‰Ó;ت««ÉÉÍEQôŒfƒAEQU}ñ0jÌðþ¬Ò²2 Š:â#XMäÉ%.à+ô¼ `x¤Ñœ‚‚–-[ƶmÛ0@OtS¢¼ÄX.<'ŽaƒLlý¡že«l læŸ÷ôækkÙºÓÁ#ëMBœÂ?7§ðÚ²jötrêøðFBýúõcòäÉÄÄİoß¾ˆò6nÜHaa¡ÏÏ>ÒßwùÿlüíáR¾ÿÑÁøÑV.<'žY3¹îò$’“Unü{ ƒúYx:çM‰cÑÛUÄÆ¨Mr ‚ñ–?Ž7‡ÃAvvv‹9ûöícÍš5˜L&233Å›¢À ðè¿ {ÔT£¼û6JQÌú-¾3–àÅ?`BV:4¨i>ø Ë—/wÙvtóîœøçϤýtà ÿ»Ýz€¯Æn€z÷k0’’ÒXÍM*Z#rrr:›¨@?è`8úS§ %%%â#€æÔ¤¿8tè a±XP T¿ }ò# à]ÊËÊ)((ì(ðmkæL ø/z~ÀH +’'ºÝnöìÙòeËÚ,?À êâ*-Å@V†‘k/M *Üú@ ¿»$‘Ô$•Ç_¬À^«qæ$ݹïåw«øÕ´xvýÔ€½VkR2èÅd21lØ0ÆGmm­ç^‡‰¹¹¹lܸ»Ýq~Àú­õ¬ßRG\ŒÊe&0íÌ8ö5£ògÊ9Tèä™{{3t ‰Þ©Þú°«Yáì_IJ/§×Þ«fø`31ÖÐQøøxŽ?þxFEQQEEEaœN'ßÿ=[·n%%%…^½zù¢ÊÐ!(¿º¶nAyò9(­BûçC(ÆyB^~aÿ&‹?X¿~=·Ür uuuá.» ØGÏapN{¿hÿºeuc@óùøBùAÝŽEñ €æŽ"Åf³uF°x¥»€qt"3 o 5çÓÍíäjjj8tè'`ö ó7xŸ¯@EEùyñ| ¬=Œç9Ñ; ¾ãÇa§Çºº:Ö­[Ç’%K0uÔQQk0äÅlR5ÂBb¼ÊŠÏlü¸ÏÉÝ7¦rÃ=ÅTÕ¸‰SYü^5k6Ö1l°™KÎK`î=E¼¿ÚÆÑG™±Zb­*UnìµZÀblj'žÈÑGM~~~ØÉ»€îÙ³‡mÛ¶a2é¶¥áº*Ž>ÚÂgÅ“WèäÅ·*Ùòƒƒ¾F *̪Œ‹Ï‹cúÙzÄjÓŽzÞ]Qï§%pìp3?þÜÀ ¯WòÆ«<ÀÄ ~¦f£þåûöíÃn·‡=°Ùl¬_¿žœœÒÓÓILLÔÇw¯4”óσ+~ƒvË(£Ž Ü,{fp$Àÿµ:@Øívnºé&¶mÛî²÷Ð]ÿz§Ð~-ýú÷'99©1üïj\üÝ^@7N€ ô#€P€ÖœÿwâÀkèå§ÝBMøL·¥ðÏ8”wÈnÕxEÕ'8Ÿ‰'üï/*+*ÉËëê¢Ï€oŽàùuèI„ïFà8"(ô~ÙV¯^ͪU«ÈÌÌdРAQm7ì帑ΛKBœÂ«Kª9m| 7ý>EÑí‚ï¾1•m»êyoU ©É>øÔÆ{«l¸\_­¯ãÙÅ•œ{Z\“ÌûÔÔT&NœHff&ûöí£¾¾yc8UU©­­eëÖ­üôÓO$&&6É´÷'>VåÌɱL<ÉÊWëëÜß(¼ûQ 7þ>…þYFlv–ScssÓ5É$Æ«ôË4²s¯ƒŸ8™~V\‹ÉŽÞöÉ&L ..޽{÷¶˜PTTÄ×_Ýn'++‹˜˜ýú„«%²óþàïðÁ´ä÷_î[RAÏâÀYíè×Ä¤Ä Í÷gcøß+ŽTEï‘áßðêp@'| ¬é. ½v§ýúõku†z° wAË;tEQ0›M(ªÚÄEo¨ª¬äС¼ŽøþÁ…nô ° èG.‚^ Yºt)Û¶mcàÀôïß?ê¿d\¬ŠÉ¤0úh |jã¿ŸØøtM-§Œ‹á·%pë%Œ9ÎÊs¤sÁYqdö6ðÖ‡5|µ¾–Q#ÌL=#.d–¾~€ÕjeïÞ½aϽ z6nÜH~~>ééé¡;õyÈèeä³ã:À„Ù¤°Ì#Lô5ñìâ >]SÇŸ¯NfòXÝ‹ÿ»ïëø×+•üjj<—œŸ°®685 ÍXôZ,† ÆØ±c©««ãàÁƒ-æ,ìÛ·o¿ý³ÙLzzºžàv7.æ‘.þÞ ž¨ÛPqÍ5×PP6êö°”žGÇ€}ILJXü5¿?}%€þI€ t7ÌPG‡#rss;›ø7°£; €»é$¥€‡Æ? //T0›-¾^Añ®ýz$@U}I€Þ`UU5‡ruÄG-ºo@zØÔ›ÑÝnvïÞÍ›o¾Iaa!Ç'555ê¿lVº‘‹Îgø`3¶Õq× ©,]YÃÚMu,¼/Œ^’TŽfaëÎzJÊÜT׸ÉL70lPóÕ f³™áÇsòÉ'ëB0/¯Eñèí/P[[Kfff`§¾‘¡ç5ÄŪôÉ0°øýjÞx¿šŸ²Ìš™À•—$b4(ÔÕkÜ÷t9.Ü}c q*šk6Ör÷ãe¼þ~5Åe.ŽnÆl Ÿ0räHŠ‹‹)))  hhh`ûöí|ÿý÷$&&Ò;=]Ï·x‡:héÚ(³páBÞx#lsµ<ônz§¢›µ³èïËäw»Ü}Ü­€} º Ž@!%9¥Ù@kè¤à÷ч†Nô Í;Sàp=ìýKMjjjÈÏÏóDÌz g±Ç/ à¿ø{@MµÇC cÀ×Qþ™NàGà- Ý? ¢Øét²aÃÞzë-âââ:th³ ãá¢*Ð'ÃÈŒsãINT™÷H)ÓÏŽcúÙ"pã¶:ü§’›g§pìdœðÔKlÜVÇÀ>F’¿NUnßñ@\\cÆŒaĈ:tˆÊÊʰBÀår±{÷n6oÞŒÉd"###ì1ȰÁf¦ÇÄ“b¸bFçM‰Ãä‰L,ÿŸ7þ[ÃW'1þÝ-påç6þöp}2L™ÃÒ•6ròL™¶ê¡W¯^Œ7Ž>}úMmmmX!PSSÆ ÈÍÍõuMصk×]w555á.›KS‹ìž$Îhï0°?‰‰ MZùêy!œiÉIɾ€Ã)ÿóâv2PïÙ01I F÷›î4 \ ¥°’÷¿«««ÉÏÏÏ€/àqôŠïÂo0ø €9s:â#ø½´¯­¯7?ÀŠžQï`›ÍÆÊ•+Y¾|9YYY 2$ªm‡AO4›~9%–Ic¬ÄXõ{Qïиÿ™rb­*·þ1…´µµn¶írPß ±à?• î§'ØÕÖiÜ|_ ¶ÖqƤÆDÆ´´4&MšDïÞ½Ù»w/Gó^UUêêêØ¶m»víòeÚ7·€ÆÅªôÏ2Ò+Åàk€TTêâïÿ,cp?7^“ŒÙ¤P^éböߊÈL7póìdÎ:%PxëÃ~{aBÈ(€?þù‹ÅWþN²víZª««ÉÈÈ ..®ñúæBÿá„@”§ÓÉßþö7Ö¬ ôZü™žËi!@B|nÍËånrì¨ (¨$%%‘œœ|DáÿN*¶/DeãÓ‰Xngy#Áõ¢¡Í €æ®ÃÓ±Êׯ|^Özvtã5þ“gÑÖ/¬=êdôîƒß›~ø™3grÑE±qcÛlÈúdJÿöç6°nKÓÎŒÅb‚7?¨æŸ/U0 ‘Ù—%qÔ 3KVê»Ç ÛêX·¥žø85ä:yòdî»ï>¦NÚ¢!ªªìß¿Ÿgžy†ÿûßÙ{y÷£ä:™}Y"ñ±ú{ùÏÒjjjܘM ó.eÎÅœ99†LÇjm|¿öZ‚âæ} ¹à‚ ¸ûî»™8qb‹“ªÛíæóÏ?çÁä“O>¡ºººé¢jqoƒ¿‰Úýâ‹–Bÿ ç(õ”šÿŽ˜š|¾n~&s/Zkàày8TWÀHæöNÈòhý Îp×v†7’’’Bß¾}(À»x×ÔÔPPP€¢€Él ðPT=À?ô¯TŸ°­¦†ƒ:$ðyFÖô&*KÑ[©Ž"BC(MÓØ»w/¯¼ò ••• >!†§ÿÞ›égÅñê’*jln~55Á9(.uqÛ%¼þßjÎ?=®ÙŠ¢ÀèÑ£1bùùù”••µ˜°cÇvîÜI||<©©©á£8mú¯ªªböìÙdgg‡»ì?À¿èÙL¡JµÔ»²úwôš¹C¶ÖÇŠBRbRTæ›ÍÆ¡C‡:Sà]¢tÕ™@.pggˆJ¤¤¤Ð¯_¿#ªC÷ï_¯çxÎqUUÕ…Þò?¯04( ÊvО§.ôü€7ÐBO"úðÝn7ß~û-/½ô)))m’º£àÔ3â}Œ·«¾°sןS¹ô‚6l«GQî»%­;¼º´š»þœÊÈ¡-Û'$$0nÜ8† âóå'œN'?þø#[·nÅjµ’žžÞìj±(Œbö³4Ö]G 5sƤ4࿟ØHˆW9ûýãÞù“ƒëï,FÓàÑy½è•j`÷¾ŠË\ôJ5„\UU¥wïÞŒ?žÌÌLŸ=r8!PUUÅwß}Gnn®¯iKÀñFkªŽ€7ß|“ „ÛéU5=\œÖQ ..·Û{à5òDSÝMwêΆÐßÀ‘b·Û;›øƒg\v+ºÕ䀎~Þ@4Œh|UÁd2ùÿë~ªßù¿· Л'Pc³qðÀÁž ¼Ô¡½îç8V¬XÁ²eË4hC† iµß~K YéFúe1›uÿ€÷?¶ñÓ7ÏNá¤Qn{°„“G[™53!d/æHOOgòäɤ¦¦òóÏ?‡k?ëë/°eËöìÙCZZiii-)  /¿[Å¡||jcÇnº2™ÁýM¬úÒÎMóK3Ê·¥§rÓ½%<õRﯮaã¶:~1.Æ—Ñäó1éß¿?ãÇÇl6ûÚ'·ä°nÝ:l6ƒnj+܆‹ÿÁƒ¹âŠ+Â&eG/cíéLñ<ÚW H\\œp¹qùvÿîÆãÔ 2À§…ÄÄÄî¨þµÈf'd}è€D“`’““Ë ¹Á“ŸŸ¯˜LzØßÏ@ñÿû%*Š‚­ÆÆŽ_Ò±MNªÑ{ ¬†xQVVÆ›o¾É¶mÛ9r$YYYQsUaÌqV¦žGC£ªÆÍsSùaƒ¡ML;#ޤÄÖµ ƒ bÒ¤IhšÆžAzý6lØ@QQ™™™$$„7^1ÄÄ€>&Ön®Å^ëfÎo“9ó”ž]o2tÅE Üz] f‹Âß.eÝ–:î¹)•K/ˆgÉG5»™21|„Åjµ2bÄN<ñDŸ=²·mvsѲÚÚZN?ýô¦ÑŒær¢ÀC=ÄG…M?Ù \é‰P‰è0hÐbccwÿ~N€ÞR@_N€äÒ“=’’•@nn.Âûé]`Yw.ôúÆnÐLfO@U|ê@J0xlVíØß£"ëzÝõ;èY¯£€Þ‘>y÷îÝ<ÿüóÔÖÖ2räÈKÐha1+Œmå—§ÅQessé EôÉ0rΩã¦ÚææÑç˱Z²2Œ!×1·U.ŒFƒª`±X8öØc=z4%%%”””„š¦qðàAÖ¯_Ãá› ª Ù˜zFŸOÿ>Fî~¢ŒŸÛ¸ëÏi\~‘^ °ò /¿SÃ-HáÒ è—ebÓ÷õìÚëà7$àrj”U¸±ZTB&(о;á„6l”——7+®¾újúöíÛnƒkÓ¦Müñ if;eíïÀÀàÄÆÆâv»Ž´& {Ïq:5ê€N"^ãðlÚ»„Èñ„7Œù&RRRèÓ§OT€(@Qñ¨ÞºE °6x޼Àn·s`ÿž*üEáNàUtûÕ1@ćüß|ó , OŸ> :´ÅĹÃ…Ø•Ž6sÂ1ÒRýÞøo5/½SEnž“‰'Y1ù•ÚÌsrçc¥<ñï >úÜN|¬ÊÐfT’’’?~< àÀØl¶f߃ªª8NŸ@lllØüƒª i ÿ|¹œÍ;êyòîÞüb\ ªÇ|ïž'ʈ‹Õó …Êj7/¾YÅÐ&úgùëC¥,|­‚¿²“žf``?SØü€“O>™^½zqàÀêêê„ÀñÇÏ´iÓڭ꥾¾ž¹sç²cGX#µUD©ÖZÀD"&ƪ/þ.®;`ÍÓ8¸ Ð Q>ÈËËë,àZt‡Õ¨ v¶¬£ß@s%~‡ýêVå«fñ´°ô•ú½¾w0wJ'5ÀcèBÿ"}¢ÃáàÚk¯eüøñ|üñÇ­j±’VaÂIV† 4ìÉèeà•Ç2xt^/*ªÝhš^ts0ÏÉô³õ ‚;+åã¯l;éN8»îº‹_ÿú×ÄÄÄ„=PU•’’^zé%žxâ víÚÕìõª ×_‘ÌkOfpüÈÆ¶ÁU5n~>ØÀÙ§Äú|>øÄFn¾“sOÅ톪j¿‘ÈðÁfnùG ¶…휇ÕjåÔSOå®»îbÚ´i˜L&4MCUU.ºè¢Ã7: V®\ÉŠ+ÂjàYó;~NPü&M¯ç?~óª[£Ù97Úsy' Ô³IŽÞ¼Õ Z*pAG¾äää#.ôWÁµ1àhh¬P…Z{-û³;$ð¥' ЩVxvh­Ê(--eñâÅìܹ“£>šŒŒŒvyêª0d€‰3&Å8öJ50õô8ΘË/N¶òßÕ6JË]L=#pìF†Ê„ p»Ýäää4›`çÍ/ñæ’••Õ$?@ïP©4IêSXù…ƒª0á$+_o¬åñ*8i”…ë¯L¦_–‘ Ό㔱1Œ=ÞÊâ÷ôÖÿ8¹åÀŒ~@MM £Fbâĉí7ƒ––rùå—S\\î²§ÐQ…Ž 2‹Õ‚ËÿÀ¥ùåx6X4–:œ(@bbôr:I`!zo•¨aì„íà¹Îˆ†êkT£JÈ€ïO¼‰¬~F@ª*ÓNhÜèý°ÏE/Ñz8*Ò'/Y²„%K–0þ|fÏžMfff»¼iÿöÁ^ŠJ]ä:Ù½¯o7×r0Ïů¦&›ïä©—+8˜çdÔp3×ÿ.‰´)))\vÙeLš4‰¥K—úvøÍ o™äöíÛ9ûì³™2eJ‹‰‚³ÂM¿O⯕2ýš<Ê+Ý bâîS±Zöç6›ïdïþ¾\_KµMãÄQ‘­(ŠBß¾}™={6.Wûæ×-^¼˜={ö„»¤ø‡|Å:YÜÁ3A6FNƒ ܽôÿ¯Duï$|íØ#n`,0¢##QÍð&úE”f"ƒÁ÷÷ºº:²÷eK ÌwؼØ<ã&â•èóÏ?çù矧ÿþuÔQ%hmLE•›”ñÀ‚2Þü šÛ84~{QžϬ[ Ù»ßÉ Ç˜Y¿¥Žõ[ë8oJFƒâ£Þü€¼¼<ªªªÂ–Û9NvíÚÅwß}G||<™™™aË$‡ 0qî©qôJ5pÖ)±ÜpU2Õ6[(់*Xþ™~r`2*\eÓÏŠÈд–÷½ ¯íÅž={¸ì²ËµhÖ€›‰b’•DŽŒ¡C‡`6›õ€· À¿%pP €Ó¥çD˨“Dl´Qž±“¶%tð1@[(¿€ŒUÿ?©þ¯©*ŠL;‘9@Ͻ¸*Ò±]SSÕW^É“O>É“O>Éi§ÖöoÖîfÖ-…ìÞ×À” Vf_–Dÿ,# ñ*Füí‘RJ+\¼ü˜~6ÿåºZæÜYÄΟœx¬…òJ7I‰ºH<ñÄ9r$k×®eùòåTWW7+TU¥´´”E‹ñÕW_1cÆ †ÞìûØÏÈÀ~z´à§l¿û¿BªjÜ\uI"3Î#£·«EÁbŒn颣ub =¾Ë?þx qS6/Ëשm}-Ö½sf`ô” ^Í£ÔÊ÷px±-~hg1ÿݦË/þºIEàÏóYùFs` oì«6kÆtÑ/IŽG%O¢•Ý ·lÙ”)S¸úê«Ù½{w›¾I‹Yá² ãÉì­òó¶ÿXÙ¬`µ(ì=ÐÀÇ_Ú¹â¢D_b^µMOTp¹á‘çʹäº|¾ÚP«ß¬˜Î<óLî¸ãÎ:ë,Ìfs³‰ŽÞü€={öðøã³hÑ" Z|Ïýû˜¸ñêdR“ ¬ù®–í?:0›Z^üCý½#øê«¯X´hQ¸KÀ_šÿN5'¨ªÒØK…æ}ÿýõ¢½øw’$À·»ª‹Œ4`bG¼prr2YYYQ9°Ûí>'@£Ñè)T}á%¸Pm<hp4°wïÏñlA7áéªäyDäèeƒÇ·nÝÊ‚ ˆ‰‰aøðáQI 5©ná’_Æc¯ÕXôvigâ+eg˙׋øX•z‡Æ¿^­À­i̾4‰‹B¿L#~fcù§v¦LŒñ5-ŠeÔ¨QŒ5ŠÊÊJŠŠŠÂæxýÖ­[@Ÿ>}š=1ŽiaÆyñ;yþJ6l«ç¼Sc0ÕNµØ7‰¸ØlÌš5‹ƒÃzj¼<-ë|³\Œkï=ꨡMF\.·¯п%p(+`—Ë…$ùµ>Ò9š·ß~›ÚÚÚ6yƒ q*¾:™e/dqæ)±¤¥¨«Ó°X >¶±üní¦:.>/žäDEj»›²r7—^Ϧ&?wàÀ\ýõÌ™3‡þýû‡-{ôæš,]º”ùóçóí·ß†5ÇIIR™÷§TÞ|&“«.ŒÅbiyñ×´Žm£÷Þ{ï±vmØcýRà.Yã;ßœ ¨j@ÇTÿ¦€„-ÛëVŸý“mõƒ;s ø­(óꌛͦ;ª o@UÖ TEÅéròÓž½ñÙïÞë&_žôã€ÅèN‚ÇF*|kkkY²d _~ù%G}4ýúõk³šÄx•‰'Y±˜z§YòQ {ö;غÓÁ‚ÿT2áD+7_›‚Å¢Pïиÿérœ.¸sn ñ*n >ÿÖÎ;Ë«ÉÉsrÔ 3f³JVVãÇ'--œœl6[³¢Òk<µeËvïÞMFFiii;ç^)† ²àMÓ·øÿÿàɹ-£yyy̘1»ÝÞÜ%nà>ZÑ’º‡r)zoŽveøˆ£Pµ1à6r7mäô$&%u‡@p àìièÀrœhH¸½[ &Í/ÀðæŒÄvà ,øp*°®5O\³f “&Mâºë®k©„ìˆ9j‰…÷÷¦´ÜÍ7k™zFÝÑ‹Ä},|¶ÖÎÆíu\53Ìt=ÏqÓö:n¨”5ßÕñΊ.»¡€ü"}¾ˆ‰‰aÊ”)Ü~ûíš’* IDATœsÎ9åìÝ»—Ç{Œ—_~9l›bïâ}8 ¸ÿóÚr·öâ‹/¶Tó¿ iõ ’ (JPÙ%€ÍÍ×DÙ¨y ¨m«nèäƒn?ðK _GD¢ÑVÖn·{Œ€ŒFSØ€A5  üWÖöÎ;'¨ŠêÀg hõë™?5ÚdGßQ€×6í×Àÿh¤H&úpÖ 4-T†Ÿ  ÿâïwÁÐa·'¦‡LjÕè _ŽE/³‰¸,//™3g2uêTÖ¬YÓ&ýüq¹õÀ˜ã¬L£çcmÚQÇçq0¯©gıðµ*æÞṴÁfþtecáCƒSãî'JyøÙr\.ÝVøøãçÿþïÿ˜5kiii- ÒÒR^xá{ì1öî,/%Ü®>„KTY½z5K—. wIp›ŸØ•è˜2@ƒÚXÿMŽæÚ •pµÖÌï„›vhFeè"ƒïà´SCŠÄÄĨ%zÃGŠF“ÑwΪªjè@ ·#à»vwÄ ,žíA“[ºùÔçè‰N}"}âþýûyùå—)))aøðáaçŽl'“ÇÆpö)±>Ká¥Õ°yG=o=“É´3ãèjàË µ¼ôhúèùe.n¸§˜{Ìš™È€¾FÜn}25›M 4ˆ“N: ³ÙÌÁƒ}½ÔC‰oµk×RVVF¿~ýZõñÿû¿D´ÃÿÌœ9“ÒÒÒp“ë3ˆßk¸HoÏ4 Œ9¼±üÏåòk Üt±öŽ%½ P!%%%*GÞ$Àªªªöüõo´¹Àê"ƒo ° =_0ÚÂUø•j¡¼¢Ñ,=t’ûn&”ߪoëÂ…sÌ1<þøãäçç·‰hSš MƒÙ¬ðÆÕ”–»(-wQ[§Q^©2~>ÐÀ•7b·k,¼¿7£Fšyø¹2~yU—ü1ŸU_ÚÑ4HMMåâ‹/æ¶Ûncüøñ¾Iµ¹h€¦i|ýõ×Ü}÷Ý|ôÑGƒø'ý5g Þ~ûí–’5³Ñ;K xN0 ;{‚z§h¡Lš›s»\`5íÔŠÚÐ…àÿ€ë€¸¶~¡¤¤$233£’è0E““ÿ ƒ/ðóÞŸ=ý­Û}>ÕC':Í#8yò‰€)¢˜ÛÍêÕ«Y²d }úôaРAmÚ_ +ÝÈà~&^~§ŠW–TñåúZNeå·%°~ksï*áè£Ì<2¯YéFîz¼Œÿ®¶sö/bINTyñÍJŽ;ÚLÿ,=9599™Ñ£G3bÄJJJ(,,lÖ«ßÛhhçÎlذääd233[¬\iË?@vv6çŸ~¸#™à¯À7²¦·Š¿ÐŠ„Ù¨(‹…¡G ñE\.·§€«± Ðåͱj\¤Ý.7(š’Úbã«ÖÌáí¸Xß/dìB°øG´[ z?Gñ3þÁÏÆÒoϯ>GQŒ¦¹Ef„ ÏB±x˜©`>pà—^z)çž{.wÞy'ãÇÇd2Eý * œsj,“ÇZY¿µžz‡›ñ'XùàSO¼XÁ%¿Œç¦k’±Z>øÔÆÇ_Ù¹áª$f_–„Û ÛwåñßÕ6&ãq2rÌ1Ç0hÐ 6mÚÄòåË),,löý«ªJyy9Ï=÷#FŒ`æÌ™ 2$bmžzê©°FFž…± ïVcjï4šŒMŒÒü*ý¬ÝM¬Ö•®Û ð‹öŸ†.6÷©èaÚ.060xòüÊ=€ƒûsÚ̉. uÀ£2çº!Õ[À·À èç -a?ÿü³/?`àÀ¤¥¥µ‰·ƒÙ¤0¸¿‰AýL,üO%‹Þªâ/×%ó‡Ë“0uáyÇ£¥$'¸ï/i˜Œ åU.^]RñG™>ÄÄ+Kªød“A!£·«ÕÌÀ;v,ñññdggãp8 •––²fÍ***Z Ö¯_ÏìÙ³[ŠlÍF?ZÇí´s%@||<ýök4r¹BtôXYƒBjjô"………í°§Ó ×Ò#¥+6œÿ?ÏdÜ.€hýûDðS¸Á¡ôµßø½¯À —Vd?û쳌;–'žxÂWß6cŽnæŸ÷ôâ7Ó|%„Ù9 ìÉnà7Óâ}žŸ~m§ªÚŤ±18ädéʶïrðç¿óø‹8ú{LIIaÚ´iÌ›7É“'ãt:Ãæ€Þxç®»îâ›oÚ/Ê^WWÇí·ßÞÒeoÑÊ&QBㆼÝ'!³±qOï_jn%0:Ðóx;0 Ý÷¿ÝèŠÀÞ˜"·+ß@%°NÕ/^x ‡Á:d-6È|’àyô¼€ÇšHŸX__Ïm·ÝÆgœÁ»ï¾Û&¦"f“ÂÔ3â˜<60re4(hnðÚJìÞçà…7«8á “ÆXõcƒE}xý© îº1…×߯fÇGÀÂÞ·o_®ºê*þú׿2räHG³ïCQœNgTv_‘òá‡òÅ_„»$xP†p×™ŒcP-`Šl<Ð|Mš+ì"àYàÝöþŒÕ.:‹‹Z3·vñúÏ ¡\5›\7ŠÜÆë:(  <%À­ÀàCôü”ˆØ½{7¿ùÍo¸ôÒKùì³Ï¨«kû®×ýû9çÔXþ§’y”òÇyŸ\0ïO)X- {²˜÷H)¶Õ³ak=.—Fƒ³éwÀh42räHæÎËœ9sHMM é iÇwÇ×>ÖñÅÅÅÌ™3'Ü%.ô†*úïJÀ3÷i~»{üÚ«æQù¬u9k‡/Ð)Ûµ ÈMÀ9ž]Y'„R®”þù§°NºèÄüL÷<¾£FB«V­â¬³Îâ/ù ;vìðœ[¶ ŠÜ–ÆÌóãÉÉwrâ±fÞß›½Øù“«YÏøÓ]ElÜVÇ›ÄØã¬A߇Æÿ¶Z­L˜0yóæqÉ%—`4²îM&3fÌh“ÆI¡xõÕWÃÕüƒ^Õño®]Lý“ýæÑ@þ%Dµ °Ö±©=æ¦F™\ô3½Ë£ù»$&&’žž•$Àºº:ò òQ£_7@EQ0üJU¿2@O) ªª”––R\\ÒÞŸ«†n‘+DÆÏÀk@0H ÂDÁ7²xñb, ýúõ#11±MN£Qaü V.<;ŽsOÓMƒøW9«¿®åšK9sr,ßn®ãôI±üyVrÈF=ÁoËjµ2lØ0N>ùdøùçŸQU•³Ï>›‰'¶Ëÿã?rá…†»ÄüØ.Ãôˆ¸»½×‹ôŒ RÓRqyL€|†@n—ŸPp€‚Û/ 0.îÈ«Æív;EEEm‘¸˜TuÔMU»ÁÀü½mpÔ3'£PPBFŽ·Ý4ÝÔ19 B«µº{×XàŸèÕQ]]Í­·ÞÊyçÇâÅ‹)//o;ÅoÐû ( \ýëD²sÜýx Ÿ¬±³ï`{÷7„ôï6ñi4òQHOOçŠ+®àŽ;îàøãçœsÎi•ªi<üðÃ-]¶ÂóºØœ`2ð?ûoŒ„š›½G­îÀxjçl&·fžÐ<<æÑ\ø£º¡ö÷ªÞk5ÒüDBåˆ8| ›=Ê~ ­hå¹k×.®¼òJ®¼òJ>ûì³6/ÿxÀú«[‚$€çI «²øp>p/º‡@Dß·åË—³bÅ æÎËÕW_ͨQ£ÚÌHhÂIVÞIq™“³JRRdN~ŠÒ ð Í9F›ššn¹å–T7Ï#¡ÿ.‹Ñh ꘪ…ˆ¢jvÁ>eªhQ›Ã£Ì[ÀoÑ«Ùzžªkcjs?r„ÉÑ,QPšhÁë¾B‹èÊ|œÜ„~æ§E:þžyæN?ýtyäöïßßf“™Á™½$&ª­ø~4!h–,Y–-[ÂThçþ!Ýœv¿Óº˜lœý#¡ÃÿslkZ·Ó1€½¡ÒeeñïŽÀ‹·Vû³#ÙùG×ÀïËP(U ÿ©tÌ + ºØ=‹Ñ/Ð#>÷«¬¬äÎ;ïdúôé¼öÚkmšÐRûÞàkƒ¯×´¶oó ““Ãõׇ­šr ×üÊÐëºs‚¢4ÝiM6iÞȀ拶ú—FÕÌíðÙü«³ÝTµØ€³€èÙÙ‡%¢3?Eü!Îÿƒž+t Ðû œ ,£ùßÿ=W]uW^y%«V­Š¸_4hé«Ð‹¾ÿwfáÂ…-åG|,•áÖŇ¢͉4YüýÍ€ˆjÀabCo¢4Αêt¨=`½d¿Dò„à>Ó­yø÷©ö>ðOš á*ÐØßZ@7dz~À¯Ð›ÓDÜîqùòåL:•›o¾™-[¶„4âi«È@“ã« ¶¾þùmÅÆy衇Â]RÌo¸:¯ðßú{ §ÌµÿZh¯€#yøæñÈq/CÐC;­3‘ÚƒÆÓËÀ à t÷¶foŠËÓn2ZgE¾š†°ü2\š¶TE•™ {âF/O;˜‹žÙÝnžþyÎ=÷\}ôQ8Ðæo6¸ ðp"GJYYóçÏoé²7€µ2¼ºPÕÀù‘f\Cœ÷ûϱÑu¹Ñ»‡Do]_ÔÙ?㞸º¼ŽîÜ6˜‡^B0u544ÐÐÐÕä-ììtþï÷WÕ €nN zÎÊÏn!b×§ââbæÍ›ÇôéÓY´hQKnxQÁ;ýàè@[íþO?ý4+V„-éÏžèÌ;®®ºwÈ⤨!ŽFµ&!¨A@Ëõ#|x׃0nkiç†>"osñ@_ôÚ퀊ºº:êëë£gä©™Ò‚¬,ÃX¡Ïÿ54TU\y{‡ÐÏ ÏÞDOŒˆíÛ·síµ×rÕUWññÇ·{ûhÿE¿­¢+W®äñÇoi÷õ°O†RÔéA¥Ô€?~û§ßÿ`!@t“¸ëëëCõìÈC/ïY~ýÌ¿K!ñe|ôf!ש yÑlÒâMfñÙXù…§‚ ]›|Û µÇ|á@ϸ’ÃÈX±bÓ¦Mãæ›ofóæÍí’¼ûo‹ÀÁƒ™3g55a{}‹nÇ,t“9Á7÷ÕJ8©jA^~ÿ-êêêp8NàiÏ?ųiü;°§+ßT!ºËåÚU[[‹ÃáˆÞ1@P éw+¨í¥çšö2VЩp¢ûœîcñ$ãt:yî¹çøå/Éý÷ßOvvÛ7Àk«…ôsÿ»ï¾›üüüp—U¡{ÕWÊÐéF@5øoþöOÞ *ü"Õ~›¬#y8jkkq»Ý_7¢ŸñWt—›* 4ÿs8îÚÚÚ¨,þªªzþˆ-ì׬ƒ€]†@§  ½OøÀ´"©¨¨¨ˆ{ï½—‹/¾˜—_~™²²²®§‚œN,XÀ«¯¾ÚÒ¥Ï_ÊpiSÚ½ªÂ`0”ÿ°øû·ÍígDô*<A7ð¿îxSE„fkMM­¦¦&J¿€às,-Äù¿Ÿè 'À2:‡€;Ð].ßn@Ûºu+¿ÿýï™5kV»û n·›åË—GÒìg+ðâ÷ßÖä¶»0pE#øø´±ü¯qnÕš¯éÜ]SSƒÍf³¡·”ÐCø´¢¢¢¤²²²µõŸ!ñZ„ñm-„ î/€odtNaŠžðkÏŽ7âEïÃ?ä /ä†n`Ó¦M‘–5uk×®eΜ9èso³T¢•Âáß’ö|1oÛôà@•P•ZtÎ+4M£²²’òòòRÓUV@×Äáv»WÕÖÖºm6[Ôr‚CYM@ps FÐÝÕ¾ùØD÷¸½çÅèpðÒK/1}útþñpðàÁNù nÞ¼™3fPPÖÀÓ <ŒÔü·ûÛóÅ|‘ÏÐö(~¦?~=ª¢³û·Ûín·Û½ ¨гx«¼¼¼ª¼¼<*e€¾>ÖA |“H@ˆ7›Û½#àÏrû;=ÕÀ¿ÑËjÍ.8//{3f°hÑ¢N“àv»ùì³Ï˜>}:%%-þ:ïÓ ½Õ»1íz,h2›‚ó¢›ìœ|sjðœKt|***¨¨¨¨B?vë–ˆhž¯ªªª~¨¬¬äHK½>þ#:8”ÕÔ¸‹ÅÒÞ¿û{rû» ¹è†Vç‹iE~ÀæÍ›™={6—]vü1Ñ,}=œÅõêÕ\sÍ5:Ô¢ÊOèî‰5rû»çœ` ˜óüz¦ø…ú›†ÿý;®Y¿ºº:*++©ªªÚ‰Þ[B@äéÊÊÊêÒÒÒ(FB˜¥4sþïÖvùˆzWCCORº¸=? â¶Ã«W¯æ¢‹.bîܹlÞ¼¹Ýól6‹/æW¿úU$¶Æ?¡·T•NíKí˜ka±X\Q´CÞ' ÿÆ~G(--¥¢¢¢x¦;ßTáYZVVöCEEv»ýÈz™Y4™¿µ¦ïóÍfs{þίÈmï²8€O€ ÑM­~jÍŽgÑ¢Eœ}öÙLŸ> °mÛ¶6?ÈÎÎæ†nફ®jÉè ½—Ç&¹ÕB»Í f‹™°%Ò~ýS šÎ¡­}Øív***(++Û ,éÎ7Ô(c:,.MÓþQRRòZ\\\rÿþý[¿5óEüJƒø`J ·#ëä¶wy*•À€9@¯HžXVVÆG}ÄG}„¢( 0€K.¹„SN9…±cÇ’‘‘AZRR§Ÿ~ÊüùóÙµ+¢N©åžÿ¹½F»}ö¾1° ûŸó{ÿ_Й?Z³¹T‘R\\Liii…¦iÑ 'ήˆÍ·ÌžúúúÑ‹åh‹Å¢Z­ÖÖmɪkª±ÛíTUEUõ? Ïß  ¾GàßE¡¼¼œ¢¢âöø]ËÑÛ& ݃*ôã€Ð• o­è¯¬¬äÛo¿åwÞáÅ_dÇŽØívjkk±Z­˜Í戫T\.999¬^½š9sæð¯ý‹ââˆÆu©GÈ|$·´CÙ‰Þô¦Íw$}úd’’’‚ÓåÂåtár9q:]¸\Á7n— Ms£ª§dZQTÒÒÒhí|]QQAQQ‘«¨¨h9pw¿¡ˆŒ{ &X,–ÁV«µU;rMÓô–¾Á­ƒ¯#ô¿˜Û/ YÕÝ7°ÝÃü?À]À/ZûC¼eQï¼óï¼óªª’‘‘ÁqÇÇYgűÇKZZñññX­Vbbb¨¯¯÷…SwíÚÅÚµkY¶l••­rì-FÏmXŽXTw··yÀb ]ÿçÿO¾¨¸½¥JÓqÛšÍZQQ9èÖÒÝ‘ñSCCÃüÒÒÒ'Ífsrß¾}[]›ßÜéèñƲ´O€†îs-tOêÑóÖ£' ÎCïdvxªÂí&??Ÿüü|V¯^íÙu)(Ђɤ—­:N_?õÃäGàRôIBçà%௴q‹ààc&­ùõß/ì¯(Péx.(( ¬¬¬²¡¡áZá¯Ñ•‘$ÀÈyµ¼¼|iyyymqqqÄË¿°)`¨$Á€ä¿!oh;à— àž@•'p:zˆ3jY~Þž¾¾žúúz\.ב,þ«Ñ=dñïd›!Ú¡ë¢AU›Ïÿ×ü;âg³XКq[\\LYYY]YYÙûèþ=­Û!ßXPP°¦¬¬ÌQ\\ŒÛíÈu»ÝMe€M7÷~ƒ¹yÚÁ Ø üCnq"¸8Õ3¡WÒ9üôk<ïk:z¡óñô£¥6£Éœœ8í6Àþ‚ xŽõ())¡´´ÔQPPð-p=è¨I@ë°išöûœœœ%%% Á" ì`P§Zˆ±­5‰´£¸È–ÛÛãp?³Ð.F?ÚÕïʼnÞqíT`>ÝÔzµ›°x°=w^43oôÀíg ¸É õp»ÝSRRÒ““³EÓ´Yè›=Éh=¹š¦]•››ûº¦i'¸\.K¯^½šÍ Ð4 ÕÎ hmÉÀ÷¶n[°]vÿ"Ðu>ð<‑À8`0ÈlÃùýôä²÷dáï2Ü\â'Ñß™ú5jœ›ß4ùÜÕ¦ ÈïvSRRByy¹ãСCÛ5Mûp°§ÝD‡ÇÏn·{fnnîËÀD‡Ã׫W¯%'N§³Å¬gÌø÷ éqz°¶a3 zô$+É®ü±¡›ílž'ç{vèé@,GA,G·X}ø\þ.‡ ˜ l¢ž¥¬ÏyZè8@À¿i[`Õ“Œêr¹B €úúzŠ‹‹±Ûíöœœœõš¦]MÍpd‘€999¥§§Ït:½cccÕÄÄD_™ Ûí&66–üÑ©(ª‘æiR I7À¶IÔ€tL¸WèZð<ÞE¯ïŒÎŽ)@º·ˆw+žÿv{DÅ~Ï‚ñz¿<Ÿ]šÐ>$ÊUFÿ9Ok~ hìùEU©««#&&—Ëå‹&Ô××S]]ÝnתªªŠ ßnCÏ鑈82j€¹EEE+KJJî8pàQn·;YUUUQ©¯¯¯ªwÔÙÌÀÖ?ZË˳oYU”ù ºSœ ´†zôä¼ežž`*ÐýøÀ≸€ ôJƒƒè=&Üòv+VW¡W–Doa2ÃOŽAýKUEAUÕ ‡Ãa0 UUUÞãÍf³UnïÛ·Ï7uuõǯýši`3?<ÊÀ…ža-®jB´pž‡Ðóx ½ å;D)±Üd2ãv»üý- O’µÕjýÑn/?sݺu÷õïßÿ¼˜˜Saa¡½²²r'zë-¤á™€6ؽ ¼i·Û-ÙÙÙ}ñë •žž1¥¸¤xmCCȰ#Z ©†]DǶyâ§.BôY œ¼ :B`t××»šd6éŸÔ&8!>îg³Ùrn}}}pMNNN? =U-·))l;1°¿ö™[¶l)ëÝ«÷ø˜˜˜5-z^¡(l>ÂE[¢Ÿ×Êâ/B[°½ßÄ«Gøs¾STõûÈgH¬¬ÌµG5üäøgóç¢ç*Èâ/ cÙ²eKåþìý¿Hˆ}FQÕ Á¬5;ÀM»Ý ¢µ©œè-<þ„ªAh+lè¾'y¢­Íùpå¾HŽ>5 )1‘Q£Žy:''wò7ß|S&· r¤`PRRºrààþ«”ã¾¾N€ªW@ƒASÃßß}gé‹è‰WŸ“ßÚµø x½wú›þ‘A„v X¼ŒÞÐ)ÈhaÓ¹Ý[`ÍÎvî:îøcãFã$§Ó‰£¡¡I'À„„úè·~ÈÐÁ—|õåécr(òt,ã&Œ›àvº§›ÌƳÌ&S¢Édrƃ&³ù£Ù´äý%ï‡*Ó†îåžàù»ÝÚu=ÐÌB„.à `,…^-bôD Ö[‚/þÕ¥Ÿˆ¦\èr¹ÏlhhÈpkn4·V¥ªêÿb,–eï¾»l|¤‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ S6­IDAT‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ô,þ M™ncyIEND®B`‚klog-2.3.3/img/klog_256x256.png0000644000015700001710000012210614542412415015576 0ustar jenkinsjenkins‰PNG  IHDR\r¨f„iCCPICC profile(‘}‘=HÃP…OSµ";HuÈP,ˆŠ8J‹`¡´Zu0yé4iHR\ׂƒ?‹Ug]\AðÄÉÑIÑEJ¼/)´ˆñÁå}œ÷Îá¾û¡QaªÙ5¨še¤â11›[¯èA˜j‰™z"½˜çúº‡ïwQžå}ïÏÕ¯äMøDâ9¦ññ̦¥sÞ'±’¤ŸÔ ñ#×e—ß8xfÈȤæ‰CÄb±ƒåf%C%ž&Ž(ªFùBÖe…ógµRc­>ù ƒym%Íuªı„’!£†2*°¥]#ÅDŠÎcþ°ãO’K&WŒ ¨B…äøÁÿà÷lÍÂÔ¤›ŒÝ/¶ý1 vfݶ¿m»yøŸ+­í¯6€ÙOÒëm-r l×mMÞ.w€¡']2$GòS …ð~Fß”o¾5wn­sœ>šÕò ppŒ){Ýãݽsû÷Nk~?>rr’¶LóbKGDÿ ¤õ¥{ pHYs  šœtIMEä'Üð IDATxÚìwxTeÚÆçLŸÉ¤÷J ½÷ÐC±  节]±²‚î®î' «X×]±­®«®«‹«®eÁŽ@"Òkè%@HHBÒ3ýœóýq&! ¡'!àÜ×5WÂÌ9óž÷¹ß§?àƒ>øàƒ>øàƒ>øàƒ>øàƒ>øàƒ>øàƒ>øàƒ>øàƒ>øàƒ>øàƒ>øàƒ>øàƒ>øàƒ>øàƒ>øàƒ>øàƒ>øàƒ>øàƒ>øàƒ>øàƒ>øàƒ>´ ßüª!~Þ‡0zŸ«ƒpN  ¨ß²ùÀ‡ö_;ƨ$wêÔ)\¯×Ç †­Vä°ÛcÁ"ɲ(K’ ˲ + ²$!Ë2Ò‰ŸŠ$IŠ,˲$I²Ëí¶K’T®ÑhòÇq—ËuÌf³)((È+))9Žùn|h„ÄÄÄô7n\ïàààÞf³¹«$I]4¢hÑëõ¢$I‚ËåÂåt .— ·Û]/Ü ý|~GQDQDQ–<ÙåvKn·û¸,ËÛìvûžÒÒÒ½ååå›=€ì»]>ðáÂTöž7ÞxãÐäääT½^?P«Ñt4Z—Ó‰ÝnœNç u£Ó_–OÒN÷¹Éï‚(Ê‚(Ên·Ûãr»+%IÚP[[»®¼¼|µ¢(›¼¦…>ðá4ˆ›8qâ•}ûöoÐëG™-–PAD{m-N§óœ„ø¤÷I’úzÓßO'à§zíTäÒä5Á#+ŠÇérU¹ÝîU‡c¹Çãù8â»Õ>ðÐét}ï¾ûîëbcc'Æî½^SSS#¸\®S ã™NvǃÃáÀívãr»q9õæ@ÝÃíñ yøuÝAè>sæÌ›âââ¦ùùù%¡(šÚššF'ôéßãñP[[K­Í†­¶–ššjm6ÊËÊ(.*Âîp´Úµk4 z=ZFƒ¨Ñ 6 é ×^G2 ¸p*°øø ŸCÑG—1§Nzc·nÝî ð÷ï#Š¢¦¦¦æ$aoú°ÙíÔTWSUUEYY………ä9R/HíÊi!Šh4šFDÝ÷P”SG½D`Wà;àC`9¾¤.X­Ö~wÜqǃ¡!!Ó,‹¥ºªJðx<' zÝéY]]Myy9%%%ädgSTTôkZ.Y‡{w€O€ß.òÀ¥Í€&6ìÑÐ!’Ç£±ÙlNĺ‡ÝnçxYÇŠŠØ»gUUU¾Õ;¡SàÀßã¾Uñ@{‡iذaÓûõë÷h```[Mèv»Oüêêjõ„ÏÉ!';Û·j§'·Çxx(ö­ŠÚôC‡½µgÿX]U%J’T/øŠ¢Ô ýÁƒ)*,ô­ØùA‰oo ¦+ûà#€‹»¦)))7 8ðéÿε55¢ÇãAQEÁårQZZJnn.ùyy¾Õj"p)§À ¨CoU|Ðæ0 CÇÿbHppª­¶V['ø²,SSSñcÇ8°?’ìˈm%"pȰ ø°Ú·">h+D <øÙÈÈÈ[%·Ûàr¹ê¿ªªŠü¼<Š‹}fj[ñ€ µ | ÌJ|Kâ#€V[¿¸¸¸{:tèð´A¯°Ûlb]è®Nðm6›o•.<2Qàÿ€ÿú–ÃG-ä®]º¼0Æn·ë¯7¿¦¶–â¢"N_K;1 l2| ü(õ­ˆ.xÍüýýˆxN#An—KP§ÓIÙñã¸Ünß µOm WYÀRßrøà¼m}«Õú¶¿ÕzµÇí6(Þ¼öÚÚZÜ>Á¿T|¯Ï.ß’øàìJFë´Úèuº$Y’4u¶¾$I¾Å¹´L§ ¿wù>ðálÖèÌÁê[³Ë’9ÀíÀÚ_óBh|{á´ðþ)ƒ"X|ÂÙ@!˜ Û}àCSÄKD¸B½o9.C«LÀxÔnÈ?ûÀ‡:ô¾Ñ@O´¾å¸¬í;½ƒ•ð—ò+k\êSiOÆh‰}™­âÝÜ²Òø¹ºŸÊ)öF£ŸÂ‰ƒC¸œÖÇëüªsÐî#€_'& ð¾!—ØÚÈ H€¤x…p¥ŠÚ§¿µR®Ìûpx.ïfw þÿ†±L=jb³÷að>,@(ª íD ‹ê Õ êºiñRÓžpɪp`óÀ¯ SÕáØž÷¨¢Vºy¼?Ë؉êÑ>ˆÚY÷p”¶ï¥g€H t  ÐAPÉC+¨Úƒ¦“€» ÔúÀ'üûdw+ªÀ€-¨o{½‚~)Àt÷úVú•ô¨6¸¦’Àw^púàòÆU^›?¸½l>o}{1ZÖºØw™­{00Œ —×!§oûÒkü¸“˸¿À¯† °X„ðv ôvߣª [øuy¤ã€±ÀÕŒÀÏk6ñ¾8eøð;ß9yù¡‹95 \„‡GP»Û®Gm`‘ì»%õðn> LçEºGŠ úæønÉå…P`‡¤¶ÞP¢êqÏþô÷ÝŠ3"µ”wƒµãž jåjŸ py@,Ö¨`m¦RduÈÅnàmà  º=-Êôé7Òµkh`Ð5D¸V…ÕsçÎ÷´“½:¸S€IÞÔì¶¼Gì÷À¥?‹ð°×¾lmÈ ØeÕ‘÷ð#wºÐÜç/XðL ð¸t þ.BT+ ¾KV3ò Î¯kËžø“WøÏÚ´IKCXX˜NQrrr”O>ùtŸÝnßš\¾`ÁÓO€p‹÷¤Ú  yÀ ¼%Ás"ŒõVúµ¸†+‚E†W57£ìR ñWBŠ0ŠÖÉ8“e(—áe`j;ê¶þÞ¨>†ÿkNøEkJ Q£G1|8ÖädDj2wíÚEQp8|ýõ7¢ÝnU{ù   —91mçR(‰Þ L’áf ö)­ÔöKP¤/ø4€K˜'¨5ß-}ê;dµ£ÌïækK˜¹¨I*ß/%™ÞwßCh÷nXÂÃÑY,¢ÊõŠ$᪭ŖŸOðNõ’É£´´´¡ñ°î‹/¾Z8jÔÈ$ïï—Ð=ÿH—Õû~¿¨šCB €V€é ü›K|ɯ^ôV÷µô©_¦¨žó7hûTÑQ¨áÄ®6¦(2ø©§è8ñj´&Sc²ª›F$èýü°$$ Ý³{H0‚V‹âñ4Øã¤fff¦úùùÉ))É6«ÕšÞô",x&˜Œšç¯v KæÍ{òH;¸ï5ÀX"Á¢ÚÛ¡Å´,¼è½—lcÈË= p¨f“™[ØÖ_ÜZÓ–DÝtw7%ï¨1cè?ë!BºvUkÏCu5qËTeáÈ‘­¬b燒ýå—'oAðï)ŠòPüì³ tÞßçp²Sµ˜5þ“¶£}`žöj~-µï½ß{E—ª€\ÎtÀ¿Eˆo¡®ÈP£À«ÀLÔ^rmIÔ“€o´†¾Ñ``ÈÓ¢ßCâyö7^’8x[L b|ñ£F9d0•…ØŽmê+ÌŒˆgàÀ ‚0ÓëPPÊe¨ª¶¸*-mLzFFF{™~êAõÜoRõ:Ÿ):RPÇ”_’ZÀåì¼ETÃW-!ü’w°Ä4¯ÝíhÃïë=a{¯Gü5×0髯H™:­ñÜ\Çs#{ÍÛKq×Ô ˆ"‘pÅ[o1â¯Á{’2nܸEQœìý÷j†€'Iž$ÔL¹J/ ü¾!ÁR¥…&%Mó™í z`³z¶Ê¿¸µÙF[’ó¨ÞæFÕŠÚ€Rÿô'âGB£?w³VEv>÷©Á¸œ.rr#N¹ŽˆÃªýØ—q`Éb2¾Š"I¤¤$3}út4 ååå|ôÑG[JK?ŽZ¶,{ýÿD-¡Í ‹¿ÿþÚ«ïëIñšv:ÀF`ð¥((—«ð7b T×y³ùþ…êioËS¿#jÆÙø¦$Ý馛èsïL,`ËÈèƒYºtEýsIbã³@QŒÁAôºë.ÒÒØùÑGô4ÕjÌÈø™ÒÒãýŸP“bæ¢FBê²…ššÚfSÛ‰Ið¤[exK„ˆ ц表ÎÀ•>h˜q¹þŠ U <áĶô[ÌBÍ"lt2cc61©©õ!½ AÜ”ë°åäb?pˆ€Ô!„öë×üB( þ ›7ˆåË¡ºšòò ¶mÛÖPS¹µˆèEQF ‚°Ïn¯h$üÏ>»À”^ŠBêØî­9½x±‡$øD£¦LkΓŒŠš}yÉÀåh(¸€?² ŠªÆ.oÃëîƒÚÒø tŸy=n½cHÈYyøÏšå$ Om-:«Uí’tXºmm-…ÿüð#ùùM.U`À€þôêÕK‰ŒŒ|ì¹çžÿ‹j,ejô" Á)þ¤ÑhÞ≹³ùIðFœoa‘¤¶gK¤qcÕvË1 ÐA€Yçó•$È®C õµL¨i¼ÿDÍ0«G`¯^ŒþËˤL™rR\¿EØ_Ñ g%ü(”•…èñ ÷êEÔw` ¥hÕ2ë$º €ÌÌLaõêÕŠ¹sŸ°kµÚ `"''cYkE)ÏÈÈØp÷L-ð…É‚ú8ÍX‹ÚÉéè¥$,—cÀs>v§Imº9µú­-0ÈôÚφ†'i¿ÇþÀUïþƒˆS¨æCW”µª\ˆÆÀ@zÞv×}ó5)3fœD"Š¢$} IÒ6TO¹‚Úîì ›—dzµÐ§žyæÿ‹ü mÀ­2¼-ŸÇ\/itöù.>òP“QÎÅ»ë–ap3PÑ× < <Ø”„#GŽdÀÿUzÚÇŠ©=vŒ@‹yÛ6*FºtÁ?>ž¡ÿ÷G:NœHæ;ïP´ò„|ÕUWáççgT…ýû÷祧gÌ/((Øê}yï‚ÏØ½§f 0Õ¡x±G(“áñó¨ÕûàâCV W„Hå,ìeo˜ïkÔI±­íPSg_ñÚ‹'T1ŽAOΧãUWµŠº¡(߹͑<ª, ‹8VVA@]Ö¡ Þ»ã^]Hþš5lxùeä¢c$%%¢( ÅÅÅüç?ŸÄ˲¼5§áàÙ ”µ€vôu(P!Ãóç&”\\|ÌêÙ³GJTt4+–þt&áwÊjéî}´RåXÃÃ5‹ð7MOý¸«®¢ÿ¬‡èСÝ.ª.0Í[¶PaââNj/¤ÑëIHK#²jú £(‚ °k×#ª#ðà5›­ö€Ùln¨¹µ'¼¡@­¬ö8£y’Ø1QwèPŽÍGã:vJz|РAAŠñ 9|øTÂïáCÔ°[kóˆÀ ï©ÚðÕJêSOÑaü8Dm ß A "+ ¿ØØÑ(‚{÷"bêu”|÷–݈¿ñšÕ°ƒ¿?C£l܊®]'¹T€'ÓÓ3<ƒ $,,¬J…u/¾õÖBޝˆš5ÕYxX ÂóçÏo«aÿôjˆ; <÷ 1L¾fⵯVVV^‹:Óá’Àåì¶äšk&¦X,~Z»ÝÎñãÇùá›oðHRsÂÿ>ð0­[»ßx¸ò¤‹v#}fÎÄ/:Eiù\gY¿Üu¦Øh:ßu¡½{#h.<è#»\ˆg‘}rð A;v h4lìØ‰­ïþƒ‚å+šá)ÄÄÙÙ9wËž}ö³¢°µ?as¼¸fþü'+ÛpoÝ*À›Í‘@—nÝÈøùgBBBøäÓkn™qÛOÀt.‘‰B—KÐ"ÂÇS§Né©—$ Y–Ñjµ„„†’“ÝTíÿg+ ¿˜j^toø‚16–‘þ3ÝgLGïßJŽoþ÷sÊ7nÄURJáO˨*(À/6CPÐ…ýé³$Se%¦¢"œÃ†ÑáŠ+ëÛ—c;wâ®h,»ååV`†^¯œššzƒ(Š7y5§ZTÇàÔpi(jq—FFÆ÷m¸¿v ÎZLkš`öÕâÅtéÒ€„„z^ñËÊ_¬¨Ne´þ2ùºIWwíÚÍOQdYFQDQ$<"‚Þ}ú¹eKðàUû[Kø{¢öÖ»›&›¥û}÷2ò™§ éÒ¹E²ùN…êÇٹà¹FIC¶œò¿ý·Çƒ5.­¥[# rv@^m-†ØXüããI™2K\,ëÖ7ì? L:%9:::Àãñü"ŠâèùóŸüGFFÆ’±cÓÞEí~Ô蜖6æõŒŒŒ¶LºÙ†!U—còï?æê«¯öZ> Š¢Ð)9Ù”—w¸ã¾½ûsiûrñ_%Lš:äÑ1£ÓBEQ¬¿¢(2hÐ ç3Ïh=$'$Ľ;í¦›ãüüü„º“¿Nø{õêåùôÓO—îß¿ÿ ïFZØJ¿QÀW¨ùàÚ†öm¿ÇþÀàßÿžÀÄÄ úE’©=š>àÌѲО=Ñ„„P±}Štr™ºìpPºvÇ6o‰92¢E5Én'kÑسgYY©­©%üŠ jʱ—ˆô~~Ħ¦76Ú²2úÆÆ’œœ ¬Y³†¬¬ïºÞâ5v§¥„Zw ‚ðrzzÆÅ®²V¡Öf«±Z­úÔÔÔ ºƒÇãñàñx°XüÄè˜h¿%‹—ô>§½” À|pï}÷öNˆï ¯;ùEñ:–•íÛ·ïZ´hѨÍ*öµÂÉüuèG£ŽÃá©C³ð:Œ{εúÍ¡$3“ ýà—ZMBÔë éÖ¨±cñ( Õ{›,ì>^FáòåTæçá‹!¸e$k dŽÊmÛ@Ы&9jD³)ǦÐPÇ'ÖbÆb·ãr¹øì³ÿâ9aø{…~R¯^=»[,–8ਠˆÏ¦§§×Û8Ï>û´0fLZlZÚ˜niicBÒÒÒª222ZKðVŸ¦§§ïéÑ£ÇÄîÝ»›€Çã!,,\«Ókƒ×¯ß ~n¯Bt)GæNŸqó£W]yu°ÇãÁétâr¹p¹\˜ÍfGÉ£>:‰ÖÉéPSZ_§Iþ¾ Ñ0hÞ<:Mº¶E@r8XûÈ£ÔîÏRÌj¥ËC=rš3~†@Åþýìûà*6n:­s/þ¦i$Nºcxø…) ¶£È’Kl쇑™™øåäPe³ñÊßÞFª:ÙɯÓé6l˜³{÷nÿýÛßÞº à…ž=Ïu¨éÔ}8‘cQ ¼¥(òóO>ù§ÖôÈ?²mÛ¶çzõêe²ÛíÔ=…E…ÌûÄÑU¿¬¾ H÷i-‡A}ûöþó­·Üa2™„¦vXX˜mæÌ™ó½jyK#ø;ðÐÈ¥{夽ò q#†·h\??=‚%_Ÿ-—‹’Õk8¶e ¦èḩ)è1††3f Ö.)ÏÊBªªnÞ?°ÓëðóÃ/6öÂü‚€Îß}`àY™þè*+¢£ }èAƒ‘Ò­[›.²Lnn®vÓ¦M=€®qqqÛúöíûðg¯&4ñÉŒ!úÊ+Ç}³|y«É߯ô˜8qbW½^/J’„$Ix<´Z-±q1¦ü±§Ûíù‚¶í)qÙ€E„þïÿþ˜— m(ü±±±Ò[o½µ$;;û´l3 ¸ø59¥~³i¬V†?ÿ}fÞ‹)´e»*+ÙòÄ<×ɉŠîÒãþ´ŒÊü|üââNâD¿øxb'ŒGFùŽM½ðª9”®[GÑÆM˜"[Þ?pJjq1†òr$I¦¦{wb‡¥7v,öêªhî^ô¸á†ë è}”Ÿ¾ñjf±@IRÒ322Z«›“’““³Òh4N>|x¸,Ëx<êˆ À?@ã`õ[½zM0ðƒ.óž=ëšQ£ÆøÕy_ënlÞ¼ùÐ|0-ZP#¿§InxÇßü†Ñ/ÿ™ˆ¾}5-¿œ£‘àþý¨-)Åq´ùJS[N.y_ƒ[’°ÆÇ£5Ÿº ²F¯'¸kW¢ÇEª¼­ÁO"—2¯àÈ,qqƒƒZí†zjj°-^Bˆ¿?¢ÇMæÆMõë‹)4”cÓëײÜ\Å'ì†Ê AE€ŠŠJ~øá‡×þóŸO^ÉÈÈ8‘‘±7-mÌbà!Ô]IFFFköv°ýòË/‡†zm‡Œu¯æ£(DFD Æegçì£ÍW¸Ô`ÐÐÔÁ/<ðÀCf“¹ÑÉ/Š"N§³zÖ¬Y³P{´µt¨aÃ/QKXëO}S\#^|ž·ß†¾Î»ÝÎÊJÊöíÃuáÓÈL!!ÄŒ¥ªðû³ª›w~WîØIÞ?¢ 8cˆOg±>paÃR±•—a?Ò|*¾íðaŽ~ÿ=n—ëŒär¾¨Î=Lá·ßQ[[ËÖ­Û)ݹ›¨k&"êt¢ˆ|<¯ºk‡nÛ†l·3iÒµX­V$IâóÏ?g÷î=£Pë,Šý×_cÃa»µòroFFÆ7­¼7ýøã¡Ó§O`2™4 I@£Ñeúù矻9ÎÏÛ“)p)€Q„^|éÅ.I‰IÚ¦§¿¿¿¿ôÌ3Ï|’ŸŸÿb }^/à ÔB¡F¹¯Ýï»—áO=Eh÷î§´®]Çò{¸˜àN0]cMEüâ∻bÚ°PÊ·ïhV…W\.J×®£hãFU…8½ o &zäHü»u£27Oyù)ü»¼äâáþ¦ú¼(rhñ×å`·Û±öïKä˜Ñ¢½žÐ®]éxÍ5è¬þô D«ÕrôèQ–-«?ÜC¼$vüxiaJJÊÝÞ{·4##£QfÞ‚ÏXÓÒÆôKKÓ9--MsÅÊ—/¿°ä=‡Ã±^£Ñ\5räÈhEQ¨ËH•e«¿U´XÌ–ukנމ÷À9bÎï~ÿÈ WL¸Ê*ËrKB¯7žž~hÑ¢EÓQcÆtàóQ›6 ÞtïÎè¿þ…äÉ“Ñ&“Î][˲Y³ðTWS¾gûþóüââé|áý"D½ž ®]‰7 ¨ÚwŠ_Y9…ËW¨*|lŒW…NC.±Äއ>:š²Ìmg&—¨¨3’ËYoB“‰À~ý5¬½{ÒaÚ´Sj:‹…¸îÝ ÉÉ`ß¾}de¤UÇ›ÍæÑÑÑz³ÙŒ(ŠO¥§gäz?1-mÌk¨¡÷·ɲ|eZÚ˜íâ²Y¿~ýþaÆ]c¬sz<dY&<<Ü—ŸäHÞVÚIéð¥B] ìÿêœÙ³£ôzƒàñ¸q»Ýõ‹[RRb{衇~Ï…‡ü†£ößo”Ѓ ÐçÑGH}âÿèÐá´wA8°äkr¿>¡qjýýé?g6z?¿[Ÿáƒ:tµ¥¥8òžR…Ïÿö;\.7~qqèNs ¢NG`J 1WL@1¨Ü¾£Ùؽ»¬œÂeË©ÌË;£óñl¡ $¤__‚zöDk>}¶¤Þá ;(ïÚ•¢ãeØ ËmYY™°qã&ŠŠŠøñÇ«œNç– žŒš£?„ƽÿD ˜––6fiFFÆ… }9¼jÕªÈÉ“'D§Ë‰ËåÄåR³–ÃÃÃË–-ï¢(Êg´ƒþ—ˆÀ;Ï=ÿlŸÄÄ$*ü<7’äAQùÍ7ÿöáC‡æ]Àg †’þF“„ž°!ƒóÊ_Iºò 4ú37®-*bÅÃsP\'BÏ©Ï>KdÿÖiíe !zÔ(¬]ºP‘•…§ªyßgå®]ä/ý Å‚_ÜéUx­ÙLXß¾DŒ½¦[Nó‡•-÷0yß~‡[òàŸÐfL4.ÙÙ(€4t(qS§Ô¹3G7mBv46¯KKKq:ƒûõëwW×®]¦£ŽWs£6&y„7PK‡{¼ ±±1ïØ±ãü}ÕÕ›­VëuÝ»wuºœ¸œ.Ün.·)DV IDAT³É¢ñ³Zü2·f À/>83n»ÿ{ïž8ñš@$áv»q{ÜÞP‹Ìú ë¿ûî»·¢¶™>gÓ5¡g jÉn½>+hµ š?AsæàsÖpû»ïQ¼~]ý¿#†§ÿC¶J„à$~Âx´áaTìÜ…âv7¯Â¯_Oáú #±DFžV…7=b½{S™“»¬¬yÿÀŽä}ÿÚ @¬±±-ßÛ ©ž]QAHžê´,«¬D騑 ädR®»]PÇÖŸ¬ÞtÓ4³Éd2(ŠÂÞíµ×ïOOÏ8‘‘Q‘‘±&-mL0 ˆ yõ ìk×®->|ø•V«ŸÞåªÓXÕC+44ÄxäÈ‘NÇŽKG­2ô€W%»ø-0/0(`nJç”?„†…Ž™3gv„Éd=ï"zûô³¬?üpp.Ua"pjaP£‘[‹™!O=EÒ„ çìå–=V<ò(é'2Î:ßz+Cì„-Èn7Õyy”îÙËo¾æØ*u¼¼!:ŠáO?MÌС§õ1œ *²õïS¶zÍ)[ ‚@ì¿!iÊLgHœeed/ùšÃÿ^tÚ÷†ŽEò-3HJjqØùÌsÈYYÔÖª¸gÏ"rÔÈÆ„$ËÛšÉæ7Þ`\ÇŽôèÑY–ùðÃÉÎΩ{›„š44ïÙgÜ®(Ê€rQbæÎooËí÷ÔSO-0p@°ÇãÆíÕÜÞ=l«µ9µZ­b·ÛÉÏÏwçåç9Vþ¼²¸¤¤ôcÔ—;h§oøÍÔ;g̘ÖµK7­ŸÅ¯^µT¯NPB€ªªjŠŠ q¹\ìÛ·ß>{öìÙÀ»çðyI¨ùû›¾Ðé¦iôºë.üccϽC päçŸÉxð¡dbaò—_àŸ€³ªŠŠìŽmË$ë˯¨ñNåmÑãÆÒÖ,‚SRZdˆâñP¼e {ßùŽÜçVý,tºçâÆ=s¬_¨ÊÉåÀ¢E”¤gœö} 3n&qÒ$Œ¡¡-¶iʶmgÿ‚çAQÐøÓëÏ/b kþï{"2~&Èn£²²’¿üå¯ÍªìS§NquíÚUo4WÏŸÿä„–ºÖ¨¨¨7^|ñÅ̳Æãqc6[ˆ ÀÏÏA¼½Õ••dçdË¿üòKÕgŸ~v ¶Öö0­<Ÿâb›/Ïzø¡»î¸ýŽˆîÝzˆF“ §ËINN¹¹¹RS[ƒÅbA¯×c0°Z­TVU²lÙòªÌÌÌ79»ZÔ¬°Ïh20ÔËÈ?¿D·›oÆx~6iu5+ywÅ Âîô›0³kÑ"V?ö8YŸ~Jáš5¸š³£½'[üÕWÓaÜ8Ì¡¡[D¨Ëˆ?]D;wžB…ws|ý ׬Á…%êÌþ¨áà ìÕ‹ÊÜ\ÜÇ›ÿ^jrÒÞä¤ 7sL‘‘„ŽNÀ $L¿é´QQ«%øx)ºêjjív6lÚÜhIù¹wï>ãÆN§ó§Ã‡üÜRjxMMÍ‘›;vL2'%&‘”˜„ÙbA£‘™ššÜn7&£ ?«±qqB—Î]Œñ ñáÅ%ÇÆ+Ùç5U.; àÎÛï¸å…3n‰è˜˜Œ¬Èlݺ•cELj‰‰ÁjõGA¡ºªšíÛ·Ó±c"©©ÃÐê´xÜvìÚ¡¼öêkÛW­Z5æ ªR¤×Ö¿¶é ]ï¹›ž·ÞŠéN'Aصèc6?ÿü¹{ðccérãDôéC`R"ÆààÆ§¾ P¶?:œ×àæ®ÕV\Böâÿ‘÷ÉéÝ&ÁÃRé|Ûm$w:ãß•œNŽ®\Éþ¿½}Ê,Esr':ßs7áýúµH³Ĕ ˜ŽÅÉ®ÈHvþë_dõ¿ÓiX€™¨ÃN/hÉ£¢¢>|üM9b”ÞêgE ¨¨ˆ={÷b¯µañ³"KUUUèôZúõïOpp0555ü²j¥çŸï¿Ÿ»wïþ)´Ò°š‹¥„tJîøÞ½÷Ýß±C²àr:ùé§¥„ƒÙlB«Õ Õi1™Í˜- ŠØ¸qIIIh5üü¬‚^¯ ^±b…GQ”ŸOñ9£P 06|Òš’Âè¿þ….S§ž6¡çlPŸOÆìÙÍ&Î4§ÇLOïû ïÃÓïÁˆ8¿¨¨fCh’ËEÆc÷¿ÿMPr'¬ÑÑîiµ˜ 0€°ñ•—c?Ò¼eÏËãèwßátÚ±&$ ³øö” èÔ‰Ø Àh¤rç®f…Ë]VFÑòT9Œ_\œJxmá]Þ½“Û…TSCy|¯¹†ÈÁƒ¨È?zRþ€±¨s"JQ'7¯-výý÷ß÷DZicÍþVdYfÓ¦”””’ÐÈèh‚ƒ &<"‚ªÊjÖ­[‹$IÄÆÄ$Z¬fóÊŸIFí/©\.p߃³¸¦{—&‹ÙªU«è˜Ô‹ŸVƒ¨ÑÔ«ŸŠ¬àt¹q¹ÝhµZvíØIJr2¢ ¢Óé4%¥%IÙ‡²ß§q_xµ=WpCì=g6©ó昔tv3ñ΀-oþã™™§ø†¸òßÑû®»JVSƒÏä%Ï[µŠ½ï½‡«¬ŒC‹S‘ŸGÔ Ah † ¾ncPÑ£Fâß½•9§Hªví!ÿ»МE °Öd"´o_ÂGŽÄQSƒ-'§yr9|„üo¿Ãéváߪý «eãZ¶Œ€€ªÊËÙžþ3cÓð‹‰!éÊ+èÔ‰¢;‘jOrúë¼Zc êØsm&#ôéÓçýo¼±cltÈ [¶nÁd²M£öu^±–d “ÙBÞ‘#¸\.âbãQ«ÓkvíÚ½unåeAOßzÛ-c£âÄ£ùùè zBBCÑêµhµºúôukãt:©©©F«ÕQ[[ƒ( eeºõëÖoj°8ÔzýÇiÍgŒ‹cÌ« I¾¶åu”lßΆ§Ÿn$ðÑiiô¼w&½z¨Ô¡þñDÚw§ë§b‰Œ<;¿BM +fÏÁSy¢1Fä Á$ŒÝbá5Að‹­KŽRK„›);VÜnJ×­§pí:LQ‘g•?5|½{Su8÷ñæÛâUíÜEÞ÷? ñ·â×"þ“ÈæX{>û‚]»öpàÀ!$‡“¨k®FÐhu:‚;w¦ÓÄ«ÑZý8¶±Ù²!^çñwÞ¨ÁÙb൓®ýÝÐAC ½ž’’²sr‰‰‰EÅú‰J¢ :¹AÀãñàö¸±ZýÙ·w±1±˜ÍfÜ’K“¾"CFÍWiQ\Œá –”ÎÉ]´Š,s$?Q#RU]…ÝæÀíráñxPd¥^ãQÐhTYdÏÞ=8].A $$Ø€Z¸êôÙOP;òÖ¿ “®åšþIô A-rêשç›^£‘ªÛmæ=Œó ’'M"¤sgÌaa…ºªú¬óÐwß7RϵÁÁô¼óŽ–·­ÉD‡‰ñÏ÷ˆŸ1ýÔ”›KæŸ`óÓ ¨÷,½îº³ÅsÔm%%¬{ò©FÏ øÝ£'Õþ7µÕUgG»}Œìµð7ôþ θ¿¿pr:³¼D“A/§t<êtApºœ”W”SS[CUU5•UUTUUQYYÍfÇãö¦ »ÝÔÔTãv¹p»\HÕÕÕ8ÜNQ HmÈÒâÎ’‹AEYY$PPQ™cEERPP@AaGU"(*àpÞaŠ‹QYYËåDVdÔο U••’Ûív£öä¯?¡G½ú*ÉS¦´XV]ÿù7lxÿÎIšpÅI›ºiÃΚ£GÏh¿—ìÚž>j$ý; ]O 4"á0ìÕWéúØМÂQ'Ùlì_økfý–¢ O Q¬ññô}ì1¼ºK—S—GùäSVÝy7U§p$¶&¢ú÷gÈÓjî%jè3ÊË媴ÛlЬ(xdI%€êJªªª(¯¨ ¬¬Œò²2l¶ZÜ.555^R¨Åá°×ïuµË5”–”*´l—«‹fTlËÜž]]Sågñ×DFE²yÓôzZ­½N§šF#F£I’ÐéõívŒf3( A€‚Ë墰°Ð tEm @ï9sè0nl«œ˜‚(2àᇱÆÄ°ýµ×ÕÓÎlt~–fÕ߆¨Ì>ýf–Ün¶þí­F×Ýñ†ˆì׋EAc2’pÕ•D HÎ’¯9²èãf3%í¹‡Ùös –JÊm·˜œ|:ŠÐÞ½H]ø GWþBÖ;ïà)?9•#°Oo¬qqák+§óµLRQgžîod•”–º$Éc4™Œ¸ÝnªªªÔì?IRë\nœFƒÒ²ãÔTW#QQÄjµÖïó_V®.C­¸,¢±ödðó³²mÛ6ªª«q8ÔÚl>r„¼¼<ÊËË©õUWû¼´”=ºãïïOEe9Ÿ}òß’’’’x/;cMNfؼ¹gÑ.ûü¡3›‰ìߟ„+& ]nüM³pŠ,³ëý÷ëÚívÓã–[šWk¼Ÿf×ßÿÞÈ~ñüs˜Ú(^~Ú“Âd"¬oÂGÂQ}š_^ùß}ÃaÇÚ<‹ºü˜ñãÁl:) Ï¼¹-šB|6ð8dÿø#ëæÎ«¿–&Z¤€i:SÇi»Õj½µwï^&ƒÁ€Ín§  PÕ\½6¿$I”——QXTHAÁQE©ïsQUQI‡¤D,3GÚ~øaéo$â² €Üêêêiýô $Yfßž½Øív )++#??‡ÃAuš ,y<Øm6‚‚‚èÓ§²$±aãÇ×K¾ýµK¯ºifÍ"r@ÿ6ù¦à`âGŽ8eøJv}øa}ê­l·ÓýÎ;š¥;++YöÛ‡‘jjNÀ#0f í j‰ðpúxC|¥§ñíÞCÞ·ß!ú[ñ‹=m&£Öd"´wo"FÄi³Q›Mì¿!þŠ mö½I¢hËÖ¿ô{ß{¿½ñÆØívrssëžJ@sºì¯’‚‚ÂQ}úöN CCBY¹r%¢¨AöjYYY|ÿý÷lØ´‘ƒ‡¡È2~ .§ ‡ÓÁÔ¡Øíµ,_±âøî]{ž¡º],¨,,(ÔEEGö‹Ž‰6'%&!ID§×ãr¹e³ÙŒÁ`@ööˆŒŠ`ܸ±h4rçÈïüýÝU•UÿhèüëzÛmøÇÆ´Ý79]w Qdÿÿþ‡»Îû¯(t½õÖ“ìyAØûégä-]z‚\ââH;·Íšlœëw¶DF;n¦„xÊ23Q\ÍÔx<_¿¢uë0Fœ]þ@ä°T‚úô&bðà ÎÒ<ÛïR•—dž?¿Ì–—^¢¦IÁÔ¼yó˜={6†%KêÃðFïiœZmÂãÉóxÜ“zôìa  66–5«× Õj°ÙììØ¹‡ÓAee%ƒ‡Ó‰I¯Çév2ñÚkE8”}°öõWß\êõ=p¹À†Í›¶ôì˜iêÒ¹+!¡!8pI’E“É„ÑhÄÏÏ„+&0|øp4 ùGóåwßy·`ÿþ¬™@%ê,yâÇ¿à9|-é/ØûÙg¸dÙu¾i†&cÁ«Ž&ãáÙŠTRŸ~š°ÝiϵZ:v$öê«Àb¡bÛöæ¡¢’¢éTÉ#rø°Ó’€ ˜##ÛDø%—‹Cß~KúC³(ßÕ8ÕÞl6óþûïóàƒb4q¹\¼÷Þ{ö/°õ q$7÷°Õl6÷INîd §K—Îìß·cÅE8Îúü£ÑˆÅb!!)‘ë¦LÁd6QP˜ïZøÊëYU•Uw¶†ðb€ü¸vͺŽf‹):2*Âh±ø‰»víF–e´Z-&“ ‹Å½÷Î$1)Iò°s×Çßß~çÈλ–¡¦?Rç™5EE“:¬}Hˆ,³ó_àiP ÓqÊu˜ÚµŠÂæ×^§l牺“È#è{ÿ}­ÞY§ÅüF#a}ú™6{m-¶ƒ‡šÕŒn¸ž ®]ÚÅ5Wdg³ú©?±÷ý6ªŽÔh4<ñļ÷Þ{Œ5ª>+ÕívóÚk¯5üÛŒ³ø¨U;¶ïˆ5BÇŒ¡¡aBÿý c÷®ÝõŸi4‰‰‰aÊÔ)øY-d̲ýõ/¯È;’w;­ÜÔÞlßlËÜ^¶}ûöAP,ÕU5:Që Àh4’Ø1AÉ?zÔ¾xñâ²·Þ|{yiié=œ¨“¶SQ«þ8¾sÉ×Omõñ,ÔË€„Ží݃ÛëåNœ8¿E=Ç23ÙøÜsNÀ/œº‹ÐÙ}¬ ž²m‘7ЀÈôþþDNÐÀTÊn”lî˜D÷¸è¤æ¶ÙÈúê+2xêÜÆ&õÍ7ßÌÇÌM7ÝDP“ãÚÚZ.\ØTXv6Çðî»Ýû²öw Ôê#™™Û¨Ûëf³™ÈÈH F{ýú Ç_~ñ/«ª*«îö¶*y·‡sÒét.š1cF²ã•³ƒ‚‚¨ªªRÃ^gÙ¬Þ…Zñ'‡_ÔÞ ëìÎ}_|I¿h'MÜÈ‘DôíËÁï¾có³Ïá¬>¡Éy6.|µ‘ ¦Üz+á½zž—–eeQ¼cå‡!{$B:§œ’BH—.'…$[!Ý»3üÍ×Éÿåö½ò*Rm-]î»÷¢û3JwïfÓk¯Q¼fm£ç­V+ï¼ó“'OÆ|Šf(ž“ó\ç²ÇWvíØ½d׎Ý÷GFF\Ó@¿N¤Õjq»Ý£×ëùụò¡C‡¢6©•[{M.zK°+V$.^¼øY–G¹\.ªªªp:õàp8”ï¿ÿ~êHæSÁuüwTÝÉ;þý÷ˆ2¤mOÁ3 úèQÊöí'aÜX,^ÌÚ'æž°©u:®ûö¬±±çôwåålýÛ[øä“f_8þ¿EDß¾m2篡&⬬¤pÍâ'LhÓ$µºš}ŸÁ¶… Qš4¹óÎ;™7oIgh]¶mÛ6úöíÛð©‡9Ë´àf`n7nÜ;F$‰ÀÀ@ŒF£ZµXUU™››{ߪU«>kíµ¹h&€¢(bïÞ½'¯_¿~‰Åbé®( ‡—ËU¯‰¢ˆÛíæÀÿâô9ÐNÔ¾€“ëžÈ[·ŽøQ£Ï»ËOkÀàïO`’ê ¬ÌÍeùÌ{”"Ë Ó˜x’£ðT¨-.&ã±ÇÈÿqé)ßc+(àÐÿ#„õìÙªŠOÚ`ÉÉmJ< qlëV2{œÜ%K­udd$ÿþ÷¿yôÑG =‹\ƒ 6ðé§Ÿ6|j!}ž—å,]ºt¹Ól6 F£QÑh4 """Œñññ×ÇÄÄ„¦¤¤¤ïÛ·Oº¬@QË_|ñ\^^Þ+f³Ùêt:q88œÎÆ£Ü+++åÜÜÜ—ãgø³;€Þ¨ÝU‘kmîØNüèѧ†qÑÜ¢ˆ5)‘¢mÛ‘í'úO–nÛFÖWÿCï@@BÂiUwÃÁš§Ÿ¡heãöò “®¥ëŒ[ˆ:”м¼úVeEë×£&¬GO‘nop”•³íÝ÷X7wÎ’Æãç̙ÿþõ/ Tïä;Þ{ï=Ö­[×P¥Œ ›BÓ±cÇ»F£Pw/DQÄ`0ÔiBRRÒ Q'$$$,ÛµkWåeA¹¹¹)Ë—/ÿÂn·ß¤ÕjÅ:¡¯#WƒzôÂÂBÛÚµk”eùl&»*¨S_®C‡³¸„¼µkñ‹ŒÄ{ÑN¡f/!]»’<éZô¡¡­=a—*.GW®äðêUøÇÄ`‰9ùÚœ¥Ke Z-cß~‹^wÝEh·®„õêIÊäI(zÅ›6P°z 1#Gb‰ˆ¸,_‘e Ö®cÅï~GÁòÆÛ¦[·n,Z´ˆûî»ÀsÐ +++™9s&µ'*w¯\¨r"ÂÀÀÀ$­V+4%½^Ùl&>>>&((è¶ÄÄÄÝ›7o>pÉ€¢(âäÉ“§ìÙ³çK­VÛU–eœNg½ð;Nìv{}*dVV־͛7_)Ëò¹ R´+QDš\ÇËÈùî{Žg" !á¤ý‹ ÙLDŸ>$N¼—ÛUßËÀYzœìo¾¥,'ÿø¸F×î®­%ã±Ç5"óÆëÄÕøëõDôéÃÑ-[êÛ_9í’®˜Ð ¦.¢F%ØŠ‹ÙôÚkl~þ…FëjBÏÛo¿M¯^½Ô†ç€Õ«Wó÷D ¼åÝg¹¬¬ì?¥¥¥r@@ÀH³Ù, ‚€Á`¨Ô5 7ÅÄÄÜœ’’bžmŸÓ “¢(ì~ç,ùÍdýo1n›­Å:µ”_ rÀ®üûÛ ûóKJpE!kÑÇïØ ŠT4)Æé:íÆÓš8 ‹£YÆ]SsYu~>¿<ù$+gÏnÔÄC£ÑðÊ+¯ðõ×_3bĈóöy¬Y³†Ï?ÿ¼áSëQ#N-‰›6mê·cÇŽŒÊÊJ$IªïØPN´Z-}ûö9pàÀÌ{î¹gL»&EQ„Õ«WHOO_¥ÑhÆk4šú‘Þ ÀívsìØ16mÚthåÊ•©n·ûï-t i¨å›[±zi)kçÎ凙÷R°~C‹·¡º`ÿ€ÉD§‰¹þûïè6sfýóæÄD:^uŠ,ãhÒÄÓÿ4e³‚ PÒdØeÓœärQ™›KÉΔ8€«ºº]‘cSHN'‡¾ýŽ%S¯'wqãVyW^y%ëׯgΜ9_@%euu5O7ìù¨â%ZÇx*Ü¿ÿ„ôôôçrrrd·ÛÝHøœ‰‰‰©©©Ëî»ï¾?nÞ¼ù‚n’ÐJÂ/.Z´è®ÊÊÊWÃÂÂ,F£Fƒ¢(x<œN'6›ââb¶oß®¬[·îËÜÜÜ™´Þ($p'ð4MÆ$NJ¯;ï¬ѵ/ýV¡hëVVÎˈ§Ÿ&zð`ö}þþô§ú·M[½ ã)dØŽóåÕW×OÎ5ÅÅqý×KÐèõÈ’DÎO?±íí¿SsèÄü Q§£û½3é|ýõíÊa(å±ùÍ79úÓO'½öÖ[o1cÆ o-ý…á£>âöÛooøT:ê¿ÖžÝwõرc?1bDhdd$‹³ÙŒ^¯¯PWô IDAT—#·ÛMEEëׯÿº°°ð¶%K–T¶ PE\¸pác!AAÏõìÕK´Û+>Vá Ô}V¯^íJOOÿƒÓé|ýB?wÒ¤I¢Á¤(‚U–•­_ü÷˲ZNW/ ˜€›Q›†6j hµô™ý0)×]§ËlG D®ª*tfsýÉ]¸y3?Ý~Gý[®úÏÇ„÷îÝ,l}ëmv¾õVýS}}„>3gâ®­eÃËáàg§Î7Ñ’¶ð¢‡ 9)‰¦­á±Û9ðÍ7lZðìI×Ë}÷ÝÇìÙ³[DøóòòHMM%?¿¾àω:Bü8êO§WË”V®ü9,%%e¦N§¯ ^)ÂA.dÅõéÓç“+¯¼rXçÎë§c5$?‹£ÉÄŠ+ö~ôÑGssss.:<õÔSW èßÿ›á©©£É„F«#ûP6{öíAQìv;»wïfùòå9›6mº5§ú¼qã´©¡ <¡Ñjï$)ÈÛ­fÝçŸ}y/êäß«iœò,yí8=0 éãã4gñ£G·iúì9;§jkùjêõ8¼4|X*iý+†›_²—þÄ/>ÚÈÏ0iñÿLJbóëo°ûÿhö”mÚõgâçÿ%´[·‹ö}K÷ìaÓ«¯Q¼fMc߆FðaÃèØ±#«ÕÊìÙ³IHH8ïÏ’e™§žzŠgŸ}¶áÓ‡˜&{É:\tî_~þ~‡R'UÕU’N«[3«k×n»/àkëcbb^¼öÚkg:Tôóó«Ï[è’œLdd$ª+«ùxÑLJæünÎ I’ÊÎåZ< 0vìØ×n™>½3²ÚÁWDDDŽ—§¸¤˜5kÖ(ß|óÍ·»wï¾ÊË ç¢ÆFíç*¦MŸ6!&&6=,4l¬(ˆ&§ËYg/Åíݳï& O3~ˆ÷ÞÌŨ ê EOe‡—þDñ¾ýøÇÅao—I3ƒÀÄ$r¾ù€Ú¼Ž*ûHrkCå+VphÙGùä§ñ:VâäI ~è!¶¾ü2-.™„¼?ü‚ûïÃ/8µN‡.8˜>ƒ¡ðçô–-´Ÿú(ñññ 4ˆ´´4*++¹á†ˆ¿A³ÙÌ#<¾}¾GñEi4¼4t(ããã©jhàŒÕêo0TP€ ´µµÑÔÔD]}¡þlýìĤÄöY3g-:tèmñññs333ïHKK«ÿé§ŸŠ»yZ‡:ôymmmadddìÐ!CP©T*zƒ›Õ†Íb£©¹É°áÇ ÿ9/ÂùbSF“Q£R©P©Õ¨T*DQy@š›šååË—OVœÏùÍ›7ïŸ&L¸3;;[ŒZ­&'''âàá/õŽê-´µµÛLJ NÒZ*Òíõ ,Ú9ç}9üÁ”~öy„´‰×¢ þŸâÒ§LÁ?"’-/½H{y…Ïץθ‘!øj½žæãÇ9å2Ö;$;›Ì™7yÿ©SÙý××e™&{ÿú©uëøn×.¦|ò1Rèc™›šØûþûì³ãä÷iÓ¦ñì³Ï2`À€s.JEVVO?ýt·K{}­5kÖx¦ýœ+Ãߟ×GbB|¼óø}N­’ÄWÇŽñÔä)”šL 7–¼yÏQ%KÒŸûöíKdd$¢(Ñ'""â]›Í6ìå—_¾îM*Û¾}û'Ož|}ÆôéwüüÎy¦²’&îݧwŸó½^ÍÅmA~ååWªAè£R©ìˆ²Ã•’éBIÕóí¦OŸþãÆ»=77Wp¿,Ëèõz!2"A¥BP9F+£4,ÖóéÔD")~3p ðJ+æ§ÖÞÎŽ^àÈ—_2èÁˆ6ìJ¬#¶p8S—-£jÓ&Ž~û-µ[¶"‹"‚ZMÂ5×Ð÷†iDä¬h­®vûýóæúÔOÐ÷ê…!.Žöª*·ãEÏ>KPLŒW…àï¢Èé;Ø´àyLî~rr2wß}7S§N%#ûœ¸îG‹ÕÕÕñÔSOu É®ŒŠbѨQd‡…ÙçÕÉn$k  0'-9ii Vóúž=<üÙç :˜¤”$dY\CµZMrr²0nܸ;«ªªTK—.½‹î¥M'Ožü#‚p§Z£Ôjµ“¯‘e™€€€¦ßjjkÎ ‚‚ÊN2I­V+½éfª¯¨¨è±Ñ£Gß–——'xÖmK’„V«L rÎVsáò¬^ô麊2€ûíç¶ÑÎöÞ‚’6t*s4íßÏ÷wÝMÂÄkɽývzedüÏ€€.8˜ÔI“H›<sS3¢ÙŒZï‡ÎKÅ£çÎÄG$«Ñc^`Ü5×wÅÈ‹gü‚@[u {ߟî3ìë–[naÊ”)dddзoßKv—.]êtýýU*nLNæÏEEDéõ ß“”•e¾(+cÖ?°¥5õîâL1}á±Ûý„„aذa·WUUÙ¸qã_»ùé´ZA£Ñ8»:ï­Óéªs8}ú´ åä\ÐÉŽ€Ýêq 1bĈg UÞš6,‹26LP!*e÷w!êÄóK5(ùÝO\ØÝw€¯€'PJ?üÀñ•«8¾ê;rî»—~Ó§ãõ¿8„ @ò]êìÙjl³×x[ee˜kjÜŽåß1_áw.Â’l6ª6mbós °Ö¹W×FGGóä“OÒ¿¢¢¢ÈÌ̼d„ìÁƒyâ‰'S«y$7—ÿ—ŸŸ£²²“ï¶]’ø×Þ½<º};_¢ägx§Ù̽“š–‚Ùlî˜jµš¨***žß¿ÿ溺º­Ý8ÕP?½V‹J­F–q Ùl6Óù^÷E¯«pUh‘eö.~ƒofÌ ôÛo±üÿe…¦¥¹I™þò+$[Ç0T´X(yç]·cÙ÷Þsq<A åäI6¿°ïÀÍøA`РAŒ;–¦¦&T*™™™çÝÄÓÕÞÞÎý÷ßϨÜ\Þ/,¤îöÛyª àœñûX V+lÞLÊ;ï0lûvd”¡”®ðT >V†Ùlq¶¹;ìA™ø# Ñh9r¤aðàÁÿÆe¸M'Ë߯­\¸ÝØÞò›@kkkµÑd<·ûKçç$%%ýaüøñ™  ßñ§Õj=ö᪂<5º¹:“àÝLBqËëZjϰùñ'X{ï½TïÜù›Ëtgù…„0è‰Çÿ®\¾œ‹þA[uµóž·ÕÔ°sÑ"*WœãlÕAAô»ñÆ þ|‡ï7×O£ìóÏÝþ/33“믿ž¼¼vÇnw‡ÕFYi™Óð û¨û1cÆd'%%=ÜS7è´:§`³ÙD¥LØd2wƒÒEÔju£Éh"00I”œóÍÔµƒèl%:ô÷l®«Ë';'ìXp ŽñÊ®7×fé‘п+ÛžÁØ€"Ôè–k:³}k¶Ï%}ÖL²çÜBpbÂÿœáK66“ AȘv ¥Ç8ºl™â¿ó.‡Þÿ€àŒ dY¢åÐá.ëÐ?>I@'“€»AÓpì¿.^̉5ÓÕ>ø ãÇÇf³±gÏŽÛ‰@›ÍÆ_|Á?üÀŒ3ÈÏÏïÛ/Ë2û÷ïgÆôé$67óúWñ»ßußljbÎÚµ$56ò »•CáÇ«8~ü8žeÇó‘‘¡È É¢MD%l¢ I’jshmm5™MfÅø%Éé¨5j€N“éýúõ{l̘1a޶MBº>ˆ²,c±œóT‚BÿI.¯±õ¬¹§»Oö,Oãw]G?ú˜ÒO?cà£ÿôÉ“ñs0Ç¿å6>ùGªÖ®E2™è{ˆ?þ8Cù½ÒÓÙùÚkˆ­­È¢H“‹ëê5p IcÆôølf3G¿ù† _ìÐ|UXXÈüùóILLD–eüüü5jÁÁÁ¬X±‚ŠŠ <øÏþCzz:Ó§OïRÇÏõ™Y¾|9wÜr Ó££ùiØ0"üüº4|ØXSÃÔ+˜#I|ßÕìà ¸Wy~Ù2®»î:7ãœaV«eÔ¨Q½JJJ=|øðƒ>w©Œþ½l6*•Ê ¢(b­X,–ßž0›Í-&“ÉÍøeYvÌEï¬8'aàÀ7§¥¥yÝ9\ã'“É„Ú^g€½ÀÕõnkëQ«kwîE8J­€óË[¸p!³fÍr÷TD‘__y•å7Ï¡rý÷HËo ²L¨+F¥­xÉRšOœ@£×Óï¦\÷õW¾ü·ÞJÜ„ñdÜrK‡NÀAÜÖß¿G_èkï»Ÿí žw3þàà`žxâ žy朆¡R©ÈÍÍ%//ÇœÛn»Í­¾ÿèÑ£¼üòËlö( î:6ùË_Ðh(ùeNΘÁ¿®¸‚®SÃ/+*P½õ[–/§N’XÜãw¬!@Ì?PQQÑa3s}n8pà-9ÉÉÉ¢U´·!ÚDçÜÌêêê¶ßÚÚÚjÛÚÚœ€ìuÚ¾4¿/,, ÖjµnÄŸ7Ö×d2áö:Dé܃ÕÒÒv)ÌHžs cfΜÉСC¹ãŽ;ø÷¿ÿÍP{§ž“`*/çÇä‡G£nÿßÔˆ-*"$K¡9dIbÛ_þŠé¬R6Mú”) ü1ÆüíoÂ{¹kò´iô)8ÿy‹–ÖVJÞŸ•ÓoäÌVw‚{âĉ,^¼˜1cÆt(ÛÍÊÊ"Ä^y©Õj),,äùçŸgÒ¤Ihìõ:ެ¬,ŸÄÞܹs‰ó÷'cýzÚçÏç÷ í"ƒ`‘eþ}àš·Þ¢uÝ:Dà(µâ²´À6ÿûß½ò®À7tèИ˜˜›}½W||¼ŸÍfSªÿ¬Šá[mVl¢'NÔŸï¹]ô **ª®­­M–$Ip¿$K¨Õj"""¢››:‘}úô¹)88ø“É4" @ÑÍI°f³C€ÞIâ’hk½$ÜéøGHHS¦LQÆ=K©©©,\¸;vðÚk¯Qï2ãäúõœ\¿žÌùóÉœy— z®«¥ d䂬œ5 Ùjåäºu¬:q‚AÜOïÜ\üBC±´µqlÅJŠÿþú¹T­fÀ¼¹ç-é]S\ÌÖ—^¦i¿{/LPP>ú(C† q³›‹kOùy®ÀÀ@¦NÊСCùöÛoIMMí ëwòäInš1ƒöø÷UWñþm·)ãÖºÞQäå;y­¤„o¸4Íþ€êã©xðAâããÝŒÞÍÅ '&&æÙíííßÛy'§ªiP`P”ͪt#K²„ÍjÃjµ"J"üíëŒF£Ùh4v3‘IHH+++K>|ø3¡¡¡¿“eYÓØØHcc£ÏÝÞ!èi±XШ5ö`ekíi,G–à"/ ÊpFgîìî»ï&22²š:”÷ߟ5kÖð¯ýË ˜¼ý6‡>ü!Oý‘”qã.ûô¢ðþý¸fÉÙôÜZ¢åàA6Ü{‚Fƒ!.sM ¢Ó>äé§íf¬ `jläÀG±wñÞ8yäRRR¼¥¦¦ã25ÉÛêÓ§óçÏw»¯Û¶mcæ7’,5Š„ìlì òÎAÊlæáM›8X^λÀK—ðÞ—[ÍfÒV¯fþüùn©@Ï5zôèÈ{î¹gö©S§f—––J»víúfïÞ½oßË’a³ÙQ2lV«“Å„Íf£¤¤Äø›@KKK«Éh:—°ó’,yÅüùóét:uCC vUÙûöDŽãu{Àé€3ð2Á¥Û‘r'ÿwp¥ã¹¹¹Œé½N–e Ó¦McèС|úé§|kïØeDø/O?ÃáÏ¿ àˆ<è²êôGæä0ñ·9üÕWÿM”!Ûl´{ŒÉè7oéS§vïæI§wìdË‹/Òæ",Àˆ#ˆ‹‹cçδ··Ó·o_7×?..®Û-¼‚  V«Y²d ÷ßs÷¤¤P2f A¢³_(knæ® ð¯©áuàRÉÀÈÀr™êë€ÀØXntI£úQÈÈHôz½*66öúþýû_¿oß¾ŸÚÚÛzY-VgŠÝb±`±X°óní¿9˜Íæºæ–fY’$Ááþ‹’¢q–®Óéhhhp+ˆðURêí5²,cµXP©·/Õaø6›x± Ìus¹sç¢×ë;}3I’ˆŽŽæ÷¿ÿ=cÇŽå?ÿùû]Üá†âbÖß~;I×]Ç€yóKK½l àÊ€yóHºê*JW­âà’¥ØšÎ•‘«t:ÿñIú^}×=‚@{M {—,áлïuøï9s朜Ì)»È©(ŠìÝ»—ÒÒRòòòHHH ::š¾}ûv«ÊÏjµ²`Á^|é%Þ1‚úY³Ðt³:pw}=³Ö¬aD[—èþZÿ ”.D©-ß ¾÷^»ÈR‰¢èTÇvÈ€…††’™™y…M´a²˜ÐÉ:¥óÕlÄ*Zµ/ ¿9<öØcgZš[dg@R*•ìµÊn‚‡¾@ÀÓà= Ëjµ¡R©ÝÈr q|}+O¢è0uêTŸä“/ËÌÌäµ×^ãçŸæµ×^s+h©øúk*¾þšüGþ ¨]€†Ýù®àÄDÞ{/Ù7ßL{m-Ɔ4~z‚âч†vYë/KÇ7ndË ±x” '%%ñûßÿž¬¬,T*uuuìÚµËÉF¶nÝJii)óæÍëÒø›šš¸í¶ÛØðÍ7|>a ︣[¤ª ¬=y’ «Vñ Š8ä¥ ¼Z€gQF½c7| h¾ïÕ‹÷nº©Ãóî˰ÙlNp ¥õþzŒ&£ ²„ÉlrHíÉ(ŠØ¿màü£ØÖÖfqÍ8Oi>' ê(côŒñ;û‘$ «Íê–¥rH9â"@6J““ˆš6mZ·KR]+5 £GfÉ’%Ì;·Ã¿ûµ¿ñå Ó)_»Ñdºl €,£ "45•èAƒˆÌÉÆ/$¤SãÖS§øù¹üxÿŒÿ¶ÛncÑ¢EdÛ'ɲLxx8cÇŽ¥¨¨ÈÍ{:sæ þóŸùïÿK]]ÇB¶ÒÒRòss™’–Æ j5go¿«bbº4~ðþ‘#¨Þz‹«Važ¿DÆ_ LFûñ«í@`4ˆÀÀ@¯››çèê8~¶¤Óé0ZŒ´›Ûi7µcµY  E¦ì·õLfS›$I‡Á:BNG[[›Ó­qUî®7 Š"V‹8GººT†´‡ž›ëRÁe¶Àí·ßÞ%Iåꑬ^½šÞ½{“““ãüòCCC¹å–[9r$~ø!?ØÅ<¬µµüôðˆQDÁ=÷•;àN™W²Ù([½š­Ï>çu2ÝÜ~ûídddøøøx¢££©¬¬d÷îÝNÏmÓ¦MüòË/L™2…Q£F±eË~7s&BBX]XHoÇ ×. ß,IüuÏžÞ¹“•\ÚÙ';€[¾À]@ýó\?³ØÈðþý$É­}××gત­R©$ ³ÅÝÖM&Sê¤/ 475Ÿ%1{§’ƒ ÓëõJÊÂCÜÞþî )ñs*#¹€í¢ÀT”A222=ºûRìGŽÁh4RQQAUUYYYôíÛFƒ$I$&&òä“O2~üxÞxã gÙ+@íÏ›ùîçÍdÜz Y³gwÚ®{¹– 4–•±ãõpÒcä–J¥â¡‡⪫®Â`0t:øûû3gΦM›ÆŠ+œ=‹…^x‰'òl~>eS§ÐŽ<€&«•'~ù…•‡ñ)ðÔ%º"ŠàõÀÝ(ãÕ>H$ÇîOÿ~¨ìéb•JÕáY÷|Þî¿#pÝ0}IÙl¶Æÿ8Sw¦Få¾²,; f³ÙyQ®×™Ëïpíèx.Þ—‘e÷ö_±ç!€ëvˆ¢ÿ.¸ºµç1M¨¥¥ÅÍ¥+))áÈ‘#äççãÚèTPPÀo¼Á† X´h‘€þà¿Y²”ÁO?Eêµ×¢»j·=Y6“‰Òo¿eûó/thv1bóæÍë6ƒ¯V«ÉËËÃ`0`0˜;w.C† áŽ;î`ÿ¶mügÔ(6ÍŸßeSŽc0¹{ÃZNžäMàÿ.Ñ=0o¢ÌÎîæwv†Jò~MP )q1˜-f'»ïëÙvõ\ÝW/À`0øº¯§ÿW ¦êDÕ@§ÁJ¢ÓÐjµF¯æÊxþéJ:8€sñ¾ìf4ÐçêB=8k’'L˜@^^Þy½ÙСCINN¦¸¸˜³öŠ;“ÉÄÖ­[@à(|2 Lœ8‘AƒñÕW_ñù矟 {$‰íÏ¿À¾?dØ£;üòª=r„m}ͧïðáà îæ(s‡ñ;Êzëëë¹iÆ NmÛÆ[W_MÑí·wËÍGØÛÐÀÜõëÉjhà=àRM|lBÑŒûÔnøbOîÄðëí»ÇÑ^a G«Õb6[¼zºž€kà Žc¾àìÙ³v§CüM`РAÏê ú׋q ŸŸf³Ùm÷÷ô<ßaž€Œ|ÎpkÏCG5Õ·ö¦›nêQ÷YTTcÆŒ¡²²’={ö`²ÇÌõõõ¬_¿ž¤¤$²³³ü@TTwÝu£Gæƒ>`Û¶sŠéíÇÊøá›0ž¼;î ¼_¿Kjø–ÖVŽ|õ»^ýs—>--L}}=kÖ¬!--¬¬,Ÿ¨ ôïߟÐÐP:ÄĉIkoçÍÑ£I™=»{†ü\]ÍÔÕ«¹Ëje£ÝU»ëJÙçàQà»ÑKþ à@è—ÁÜy·R__OÕ‰*³0;Çyqÿ®¾k¨ìúãë9¬®®Nîþý[@l||ümf³³ÉŒZ£VÚí©9ƒÁ€ÅbqNr½0×Þ)]Ý&Q•ª?ù(¸vÿY-=®4Ú¿ÇWí|wÞyç©ÌªT*’““‰åðáÃú(¹¹¹”––räÈçµ”––RQQAvv6iiiÊ|322ضm·Þz+7öîͯ£FÚÂû–¶²¢‚©ëÖñ:p—’Ì‹¼v3L”<¾ÁG|ïjø‡Pz¢³²xÿí·ih>Þ©STTDNN«W¯æ­·ÞrKqîû¿sà½÷öܳ$ƒÖ`¸àïO4›)yï}J/î`”“'Oææ›o&<<€¼¼<絜±±±È²Ìúõë™0a/HÍôé躙ٰÈ2o8Àý[¶8§¼^Ša–ŠÜÓdà^ûÚÕçÀV;ÙèøV›s3zƒé¬Ô!£eµZ¼npÞBWÀ5hµZñó1¬Æ¢tœÆ¿>ø-@5×qâíÆvüô~n Ñhœ|®$‡g±ƒçMr»kêÐy‘ݪÿ\»Ï—èþêBêrûí·Ü9«-ËÈö:°¼’~ÿø7Ö ÊgßDÝðÁ^Haa!iiiìÞ½ÛY¬¬B– IDATm4Ù²e áááäçç;û ‚‚‚˜1cÇçÓO?eÕªUç\“‰-O<ÉÁ¼Oüû‡èSPÐé„àNßba׿þo¿ív<::š|Áƒ;^KHH#GŽäôéÓÓd¯&lmmåÇdÇŽ>p€/ÆãåÛnë6±×&м°cîݡ—0•g±ûCv×}C7~GÖ/{;ïöv$QD’:¦³= oo¡®·ÀÓðUêà™€û~áƒÁÐÛáê˜Ì&l¢Í¹[»r "*€Éd¢¥¥…ððp¯ñ#pºûv°pz’Œèò²Øc0ÆÿpÕUW1hРN_¶R‚,ÓïïÿÂÔ;’c·ÝLÐÑ2åšÏÔcŽ ÷ÊŒ;–ÊÊJŠ‹‹÷Å•p­ˆ‹‹ãá‡fìØ±¼óÎ;nƒ+Š‹Y;wž2ätî\BSSÎë›**øuñT}÷ÛñÙ³gsýõ×Öé}ˆŽŽ&**Šòòr¶lÙªU«ˆ·XX:f yEEÝŽïëÍfüé'ŽTTððÊ%2ü”н÷ìˆÿc7@FDQˆ}£3Òh:gäö*X'ˆ¶©ïÎ<ÏL™ÃKÖø €«ÎɶF)M8rY !!ázI’0›ÍB¬¢ÕmGÖëõ˜ÍfAÀjµÒÚÚJ]]Ñל{Y–”NO,€ØóQ߉®qû¬Y³|Þlo«×ÎÝh›š9øØCD¯þžÃ¸Þ?üDÚ[ðË;‹ý çÍ?~ÜY?àÐ?ÈÉÉáÕW_eÓ¦M,Z´ˆv‰ïò/¿¤üË/I¾þ:’ÇO $1€>}Ðèt R)F(È¢ˆ©©‰¦òr*ÖÏá>èÐÕ¸`Á @ÛÕ:zô(úÓŸÀ¾ èíïßmF¿¬¥…ÛÖ­#´®ŽÙ‘øR¬J»‹xÜ…Øë,¾7ÛƒêO»ãQØS}²|N Ïé­ÙÓᾈ?_$ kAPgý'.CL±ÓÏ_VÐét-‹³Ü·¥µÅm·v0êjµÚ9ÚøôéÓ.ž´Ü%Øl6ŒF#‚J…$É‚‚´®`ìy­ó^Ì›7ääîõˆ™ÍfZ[[†pä>™´7ßãà#óìËh››1G„#”/NEÔíFl’Ý~ ))‰’’'šK’ÄÞ½{9zô¨[ý€ŸŸcÇŽ%??Ÿ+V°téR·‡­ü«¯)ÿêkå¢BC II&,£*µssg¡õȯ†íççÇ‹/¾ÈÀ»UVÝÐÐÀ½÷ÞË11T\wA’ª†¿ãÌn\½šIF#Ëé¦f|ÖN”qÐÉÀ=x¯Øó4ü&à(óÀ»RX” ÏéàžÅr u;#†ïøǃñ‘pýçu—rAèíI’hkossÿ+44”òòrW—åJúH8 ½½«ÕªTUÉ‚, Ë’;/¬Ž>**Šk®¹¦Û¯?|ø0 99™œœξþ ÁS=f1«Ö¶g*Q¤Ïú‰Y¹–Ó&Ó’žŠ±OT¢0((ˆ¢¢"jkkÙµkJq—kýÀÀ‰ˆˆpÖ×Ï;—‘#GòÑG±aCÇ(ÖÖØHý®ÝÔïÚÝåµ$%%1aÂRSS»eüííí<þøãü륛yõ™ÿr§)‹ .4dA`õñã\»n¯Š"‡ð˜Ó~‰½ÕÀDû®ÿ7|Wì¹~µ=,ØÙƒÏlnnvjôI²„ä6¢NöÊuy#½½el6¾sµ5.+¥4âL—Yª‹q³µZíh‡P‡£ÒÏÛ €°°0Ê˽1w¸?ž½¢(:_E• YRÜ,É¥H‰Ã.L:úÑGÅÛ0__ø¡C‡”]·¼œ•+WràÐ!ê3Ò¨YÈž—þ„5$ˆŒþ¿ºz4­mÔ^9‚Ü?.@ÓÚF@ÕIŸ 4nÜ8† âÆúÖ×׳nÝ:¶nÝJ[[›3=š’’ÂO<ÁâÅ‹¹ùæ›»]˜ãp÷SRR˜4iW]u6›ï¾ûŽ={öt*¯.IÏ=÷o¾<‹éãñíª…ÌÞµ‰ò¶6Ÿ1ô‡£zóMêV¯Æ*ŠøµÉLö¿ҖOÕu“h‹ñʤ¤¤ÏÁƒ9xð ó¾y«P«Õôë×ÌÌL¦OŸÎ‰'¨®®æØ±cœ:uŠ'N`6› $11‘´´4HHH €ƒRZZêÜ‘°†Ÿ]$)ÏŽvk«we^_yLW×ßó¦455á˜6$Š¢bøvð 3. €'žx½^^¯'<<œÊÊJÊËË}–¿¿?#FŒàÌ™3üúë¯N—½½½Í›7A~~>á@ñ‹Ï`ŽŒ ÿ±?±gáÓıœÃ÷ßyî¾´ ®©áLr’§wÅ€HII¡¸¸ØIö8ê<ùI’ ¤_¿~ôë×Ï­I–e§!{ºø¤¤¤°gÏg5Ç×ïŽ?žŠŠ vïÞíô~êêêX·n“ð7ØýÊs¨$µƒ«‚ÎÔ‘öå7žqƒrC-D‡n½Ë}9r$555>ù×þW£ïîý cÔ¨Qœ:uŠÝ»w;A¼¡¡ 6ÏéÓ§‰jâ‘ù³ÝŒß±B |ÿÉÓÜzÏßyåÈ‘ó«K=õ+0Çž·½‡s3µ:3|X ¼¦8"Û©Ù…Ð#$±ƒQûâ|‘€®„¡«ä£̇­ ¾\g³Ù‹Åâ4I’|Å%Ƨž®¿(Š4559 ÝQ €= àÿK¢Ô㉵±±±^Ó~z½žììlâââ8|ø°›gÓÚ®¦ö¬–”8eÚNrr2qqq:tˆ8Ï¥¼¼œãÇ“Mzz:†S¯A Ï¡#DîÚÍÞ¹7cÓéd™¼·Þ£=.†²«GcvLG¿€7°qÔ$&&2`ÀŸñbw8ØØXz÷îͱcÇØ»w¯Ó«Ú²e QÁmüíÅùÜç@n˜y5g6äbv,ÈÀ7(­¸÷‹ºùÛ€•tžeêó§Ýø¨ó^®<•äRÄæêú \Ëá½yuú™f°§¶+/5 +Š"f³ÙI:þôzV”¬º†¢(ÒÚÚê¬+p½i®u®ZPè]]³C† ¡_¿~N 8XæOUµžÇüi3ª.{NN“&MrváàV­ZÅñãÇ©˜KDYÕÕì»éFlöaÑ!rjð`’Öþ š‡çá›É“'w˜˜[YYÉÊ•+Ù¿ÿ©#k4222”¦´4êêêPKµ,^0ƒ® ³%ÆϼhU|6`±ýa=èBìiºpó(ò\c¡ñE°GO÷Rú=:m“ÉtÎÈE÷,€`'=>|•;v~GÁ\g}߃gº¬»å "Ìf³óÇ›¼“Ã@:3~WConnö*– ØÓ€’$#ºTþ]€þݘzãØ ‰ãp…I‚e«¢0™Uüôë¹Ù11vìX·¬‚ƒøþûï9H騑ÈvSÅBìêõ4eô%ñ»µ™6}k+¹ïÿ—à3u^ïenn.'NtkXrÔ¬\¹²Ã4šó]ƒ„„*ýÊÛ¯ÜA°¿_·~/*,ˆð‡®ó=䮫øŠ2bkƒÙêê>‹ÒÂ; *–+²naÀOçélœÂl>ç؉@—‡Ç¹«wÆ8û]\4?¾ø³Nx¯ìËav€€Éd¢¶¶ö¼ Ís÷ooowvP¹¢¥ãb@á²ëËRÏôó©úÓjµ$%÷åd]Íí¤ÆY½9 ƒŸäöäȲLDD&L`øðáè컼 N~`Û¶mÎ ‡ÖdÆ… üÝ„ž®&sÙ'ˆþ¨} ¼,Ë2bÄ®ºê*7°1™LüòË/¬_¿žºººn©îz®ÖÖ~øa>}óa¢Ã»Ÿ^T©TÜpíPVöà»8LGÙ²‡Úãöôn<È'P:ø¦Ã¯› ^Rjö÷0Ú8OÅ>±Ç¡!¹Ô v/ÐÛ¯4 ëîoµZ}ÚN“‹¢³Çêu9 ¯ëÎã_ÐYlê mmm^;­6ë9Ù=.`§;_ã°Ze¦MâÞ¹É;Lj¼ŠSz>]IS«†£Ç T×kZMLLdÊ”)ää丽£~`ÿþý4ô”ÌšIkD/â¶n'ýãÏd8~œÖ°0åþ=K⯻:‚+?0lØ0'ظòŽúóÙÑ}ô1V½s?鉽ÏÓ„dú'FR6%—¦nþÊ;u}70ÏÎÐõîÂUÀQ”Á s ¥úÈ0ÈŽ=Nlõˆ£eÌ—Á¸ni@:Tz6·yÊÞ¹vvÖäª>å±Ò.yÞ›ÍFmm­W×S§Ó1qò5>o C<Á!â‰ÑOÑæNž8ºK’$±mÛ6'·¨âîÙ!H;RºoÚN@Õ§Î|AÞ@™Ý]XÚr»‹ÿ6ŠÃct­Þ«B©Ö›ˆ"ÜQ­¼ÕLz }±<G<.Šç Ý<9€Îšƒ<=•Jå“è¤^¥÷å¯~IÁ ^OÌÏÏß͞ų žöé˜L&ŸJ)6›"0bmöÖKé¿5èRê{Ïž=¼ýöÛ,\¸’’ççf¦ë˜26€¤8 qd÷Æ*‘mâóulØê5®>|8ãǧ—Ë£ÑÈæÍ›Y¿~=µ ˆz?dšsf jÔÈ’ˆu ¥7\GÒ/ÛQ›­D¯"¼¢Òk˜2`À¯ü€l*++}ò‹-bÛ¶m<ðô{¬ßz4]ÔÒYÛàô¨X u?‚dIfL^8ŸxÙR-vbO kPæ®w'[ŒEÑÜ·¯oï.b¡‡`EÏÔ½ÁÊÝp¿ã˜§§ëû ãOÏýѧÐ ¨»Сkæ®{î`µã¼€^¯Çb±P4¢ÛçÏõêxK—¸þÝ!&Šë­/…`2™øôS…<®®®æŸÿü'‹/vëgHOÖñ̽˜vm(µ ahü¢˜r••J¦¦^GUµ’$¸]k¯^½?~<………N‚G7—½ÅlæD^.ͽ{S6y"‚ÉDPE%½ÿû)Io}@pm-–À@Rø•GM„+?põÕWf#`³uëV'?àº>üðCV¬XÀÑŠZÆÞô"ëÞ*{$KpvT.…S_åL‡ï *̈[“p=7¡ôß'ØpE7}òÏ€ñj5†… ñsO'·¡äõ/–t@Ùd›Íjç:zÅÿÞš¬V+é}Ó¸ù–ßáàï“ÌÍËfÔ•^ïbÜeF]9­Fã•Ôjµøi$»òª+;¸Þf¸’ƒV«dED!Z. Ø™ V«™8q¢[ªpïÞ½¼ð |òÉ'N&À_E\ ‹D’œH]K:£†G°üÇógÕ¦0ÌU¢0!!)S¦0`À€.ûªU«Ø·o6›–ˆp~½ã6Ø»ðiŒùYTäåÒAĦ-HZ-þMÍhŽ!=ÁÈè!ú‹n “••ERR{ö졲Rqë½I†œx ’Z€ÆhBÝÒJ{v&Á5µôû=ΟG³wÑÁ8ô8à¦?°mÛ6·A¦žë‡•28,Îgþ¢ ‘ÁZ~A¬ëNy’`O.J¢¢øvÕ*– ˆ üüóϼþúë®/¯þÌÅ]ò…€F£öR”vŽpj[zlv®a°ÕjEoГ”¤ÈTøiô’É)IDFEr¦Ö­°K¸‹á¸‡‰ö¶Z­>y#• rV/%$Æ»]HW‚ ¢hS:m6lvù¥‹‘è >üº£I&88˜ë¯¿žgžy†‚‚7fÙ²e¼ð ìÝ»×ùÅ÷OÓ‘¯eж”ô¦oZ8# ,Í*>\Åæâà_¤¿¿?………Œ;¶?°eË'? ‡¦N† Æ0™HÿòkJî»›æÈˆ.Ó˜999Lœ8‘ÄÄDdY¦¡¡ï¾ë<„®©kírä¶7`õŽ:æÑµ‚¯ ¨EiÎy¼_?þyä§jj(((PÆ‘µ¶òâ‹/zþÚ“öÈâb®ž{6+6Qtvzã\=OÀÒÓÓœ}5!t¨¡V«É˜wÞüEo̪¬TÄ.ƒƒ‚¼öü?^éL?^å†|ÞÜ~×›MTD@DÑfs+¶¸‚_¿+Š2kj§¶^ä­šeˆ‰‰áÎ;ïäá‡&!Á97”êêj-ZÄ?ÿùO§P¦J€'²àápR˜y}f1”éã9XæÏ‘JÊüÝÀÒÑë?nÜ87~À3¥W/Xý CB°öŽdϼ[1  î¢“Q–e(,,¤  €U«VuÙHUßbÅj=?Ûh1ÚøaMñl«*û6~ðÆWðÅéÓì?xôt÷ìÿ·ß~ËêÕ«]ýH7:Þ.+`íHN»zžR_¾„¬V«SíI«ÕÒÞÖõäo/­ðÂe€½%û¨¯«'>!ž_¶mqSý(+/CBIkÔÔÔr¬´Ì§àlȲ„hH{1ÀW.õØqáa*þôZ=F³Ì_4³­XQ6ÎÌÌäñÇç–[néÀ,X°€O?ý”ææfçñ9Ó‚$'îéÞҾäö×óÕ÷ì;@Ù ïÞZBB“'O&''ÇkJoÿþý4shÌÕØtJŒ¨6[ÈYºŒ>GÎÉž©'åçÍêÚÚÚx饗|Õ“»»zÂyŽ*JÊ[ˆ-nöºû«€}À `õÌ™lkjbãÆôéÓ§ÃkO:ÅÓO?íI<Š{ßÅZ=®)w5l7:®¯óü±Z­ì)ÞC{»???›Îzý¼ºº:‚‚”¢¯­ÛÎßó½7ü µZÍÔë§°výj>\ö!ëÖ­céÒ%œúÈg£˜,˼ûî»”••¹~—ž ÷t º.6àAv– p„ &“™}{ñ×ÞÑQ9rØí­­­¥¹µ€€öï;€¥31Ôáf=çyà׻蛑NJJ2YÙ™ÄÅÅÐ+"ŒœYÄ'(º÷[6oåï¯ýÃù;ÁÁÁäææ:+ؽëòÏqìôéSÔÕׂ`Ÿ/àH7ÛÛ)/¯èÑEÔ××3yòäÓÕ*¸áš@¾^ÛŽ$É àLJ_·°kŸ™¡ùzþ³Ñà øùùÑ¿òóóinnvz>6›’’vïÞMdd$¨UQjRµœª•¹öªpr3©«oA–ml؆N+×ÇŒ+5¡ÓéHHH OŸ>4559wm›ÍFUU§OŸ&44”€€%UêR ˜òË6dÑMæÊïè½k­ñq¨‚ƒ5j³fÍ⡇âÏþ3C‡Åd2QYYé<4+™”¸ÀnÓdgÚ¬¼÷Øn®v9¶xTõÊ+|ùÝwLœ8±Ë2ì’’fÏžíúðŸA)þk»Dp#ݨ£÷¶„F£¦­½My.ePvôè>1ôêÕË-ÏïPÐrå“öìÙCSS²,sèàa G ',,ÿU'ŽÓÐx–3uµüu„G„SWWÇ+/ý™¦¦fo§´à²À†~Do0AX¯0üý ¨5jjkjYñí*7ã¥oÀ€hµZ'r ‚€J¥r#èNž<ÅÙ³u‡ R ج6,Vewmo7RÑCEYuêÔ©ne´½#5ª ˜}]0ÿYÖDz²Ž#åVÚÚeúDª‰ŽÒ`ЫÈ HOOçäɓΠµµ•mÛ¶QUUEll,ÁÁÁhÔÙ~ô‰Ô`ð`Ù ‚øy'ôKiçûm¡D$IàÔ?z…(Š¿¿?)))SWWç|€ŒF#eee´¶¶Ò«W/çuø76‘ðÝ:M™HXM-þ ”AêÆMÔf¤#H¡½z9‡vöë×™3gòÔSO1gÎÂÃÃñóócÉw§xfñ.Þ_Qƪmg0Y$BzùÑ+X×TË7&~c-½€%ÀŸt:æðK?ûŒ‘#GvY|J‘Ë“O>Iqq±ëáÇ鞌O× ìMnç» D­ÑÐÖÖ¦4ÿÈç„k{Gõ!,,Ì­å×Ñ@äpýàI[ZZ9pà ii©DFELpp!¡ÁøùùQzô¯ýõuJóuJ .‰«s>)“ÔôTââb©:~‚²ce^_Ü9sÜbiFƒN§C£Ñ8Õ†vïÞMiÙQâãðÓi1[-ídI]]¾ßxA³páBž|òIŸçêíü²Ëĕà ü÷‹f’ãµH’ÂøÏ˜Øááݶm_}õ•Ç cÇŽeܸq„„œë þøcœ;Ø™3ghiiá`ÉN"‚ERcƒ¸at WŠ w¨ŽÛŸÝAÍæö…„ðÉ—_rå•WvËè]×wß}ǵ×^ëzh70ÌÎ\ªõ9Šjøy¯;ﺃ€êÏÖÓÞÞn/U—1Mäæä“‘‘á6¼­­ÍÍhiiaÉ’%œ:uªÃ{?–AƒLKs ;wîbÍwk/(œ¹,ÐÃÍ7ßìjµ­VëÔ¼]»vQ^qŒ˜ØXüt:§bÔ©cÃ/ø\–-[ÆÌ™3;­\óS;&“ÌÆmíüí™H~ØbäÄi:L¿&æÜï6559ë\{ Ó¦McøðánLÿ¾Ã¾ý¾=ÚÉLiàt­ÈÉZ?Òâ•ú½äÁµ))²½{÷RQáîéõz ”r`R¶nÇÿôi4MÍ”½šôÝ{0<ò0~K–Âw 75!$%‚C5™Llܸ‘Ï?ÿÜí¸N§cÒ¤I 8ýû÷óÁ°rùW‡ñÍ7ß››Û£NijgÏ2nÜ8~ýõWWv~Ì%Þý¾´Sç½n›?€€Îž­Çd2ÙÓÖ`6šÈÊÌ¡ÿþnp$ÎÀÒ¥K½À¥à3.Ø.F(ÃìÙ³Ý$ÃT*•¡À®Ý»¨¨(':&N‡h³a¶(ÃF.¨Õj>ûì3®¿¾óg@”àoo5`¡š–ú ­V 4X…^'0ºÐ€ÖNž<ÉòåËÙå1t3::šo¼‘¬¬,çi¶È0óÕêVt#í—ë0šU èÛÆ°Í^¦1Œ­ IDATHw¥Íx×®]ÚÃÃÃ)(( <<\™M ÷£ÿªµôž0Õ»ÀäɰnŒ½ÁϦOë”/Y¾|9?ÿü³ÛŽÁôéÓÉËËsï‰á;Ö¿þõ/î»ï>×C£Ê—¾ÂeFäù¬[çÞB@ ? ˜Í&{ÚZÂl¶Ð·o?²2³œ`±X0ndakk+K—.í=»€t¦úRsÚ }“ÀÀ@rrrœ€ã¦¸²,súÔi›ðpÎ pT ¶··SQ^ÙÓS¨DÑž@–e>ùä222:tÔáæR4È@QÒJ…8\f¡¦NdÇ3·離#8HÊ…HKKëÀüòË/?~œ˜˜BBBШâúh𝧮Aͨá½Ù¹Wdì°³ìÜïŸNâL£ŽˆP+f« Y•Jvò!!!øcÇŽÑÞÞNhï(RRRHÌÏCX¾ "Œ½aÏ7áçÍ0ê °Z¡µ ôî5èþþþäçç“MUU•³,·½½;vPVVFtt4¡¡¡=€ÒÒRfÍšå*-׊¢ùÙÈ¥_¿2zò‹9²Ñh4F¬6{M€¬µ!Á¡DDD¸¹Æÿ`ïÞ½>EuÏs™/5Ü—~€ó]AAAdggw Ž|pSS#TŽù0^lFi-wê|ùå—„„„——ç³Û‘QKKÒÑn’HOÔ±­ØÌs‡óõÚ6*NXm«A­R®#**ŠáÇNYY=Åšš~úé'ÚÛÛ‰‹‹C¯×ã§Ð߯9$ˆÕ?û“«áû_t4µ¨èbcÝVEŒ$<ÔæÜuCBBHMME«ÕræÌçýlhh ´´”ØØXâòrÑŒ‹00-Fs5üç-„믃ÈxíuˆŠ@T~:ðhGíÕ«EEEDGGsäÈçuÔÕÕ±iÓ&šššÈÎÎ>ï¸_E^|ñE~üñG7z¥s˜ÿeÈÊÎr€hµ!JHJÚ:8(„ÈÈH·Às2¶Åbaß¾} šè¢LúbÀõ(Í] \ó¿®»¿’99‘¢¢"T*eeeN#-++cóæÍèõz¢££Ñh4„‡© V×GCK›†Þ‘zZjÂCeNÕÀMŠtÔj5‘‘‘Níúúzç½Ü¿?Û·o'""‚¨¨(„ü<()A= ÒR‘_ý+¼[aÍz„;W¯Eu…’u½n•ŠØØXF…N§ãˆKñQzzz”[·r×]w¹:†"æi½L0Ûu#8Ÿ•™ÕFãtÿ%QtN° "22²C5 'q|àJ/Õ%€ßÑ ñÁî„YYY<×ÝP ©½AïGÍÀÀQ”¹_ (©8ŸÜÝ»w³nÝ:ÒÒÒˆ÷)Ì Õ ªè—ªC«(9dæX¥•¸h-Å,\;Ú•Jàoo7ÐÒ&“Ù7þýûSPPàV?`µZÙ»w/ÅÅÅ„‡‡+õj‘áj2Rtœªµ1fD01˜® %*2•Ò¢k7LÇ|ƒôôt®¾újòòò¨­­uò—½´´”¸ÔTB ¡©yÙG¿ZZàØ1xäaøu'ô‰FذTjð×jµôíÛ—aÆÑÖÖFmm-wÝuW· Œ\W{{;÷Ýw¥¥¥®‡ç{¹|k6]«y]ýû+¢±&“IfŸ$ÚDüˆŒˆìÐp =€ƒt1*übÀ$z˜3õ®€+‘äðš[šñÓû¡V)­µ‚ <ðF£‰ò²@)° ¥hík;¹9ÊA”ÖÔÔ°dÉNœ8ARR½{÷î4¾5èU„©1HOuHk›ÄèBú¦è8RfeÑ{\1Ô@p Šï·ÉÏ gðàA¤§§SUUåÆlß¾ãÇ­ðì¾~„©©9#28/«È»_è(’ÂÀ¼dBÂX¹1˜ÐÐH23ÂP«U„††2tèPâãã)++sÕÕÕñÓO?ÑÚÚJ\j*†k&@` rYXm )¸b5ÂÌÊøõO>…¤$}Ç `àÀ 6ÌM »ë‹/¾àÕW_u=´¥‘ðr®›{ ý3P«UX,¥TÝEºÎ ÷w†^«íÀþýû/ì>ºÔ0€îi:t ™™™bmGàø{uu5Í-Mèýô¨T‚b‚âîšM&ÊÊÊ{z Ç€‹¢"[ \‹Ë»ââbÞ~ûmdY&==½Ë9|*•@~–) Zr2tH,z¿‰„X q}´¼öV#¥V¦Ž @"##)**"""‚ÒÒR§tWMM ›6m¢­­ÍÉhµ©‰Êýò7¨Èíï‡N' Âj•ÑjÞÿ¼…üL€N«VÅÄÄ0bÄüýý9zô¨[KðÆmÛÐûûƒ66áøqä]»`Òµ~:„,½áŠà9£²ì¹ª««™1c†kÿ„ÕÎÆŸù ­GÐ/Ý9Ot„’Œ(ÚÐë DEEu(ýõç£ÝØÉZ…"¶tI ¡o@ÿþýݪð<½´´4£óÓ¡²‡‚  V©1›Í”» Xêqì0J·Y*â§?þø#K–,!22’””Ÿj-NŽ#@…J%Pß q¶Q¤ê”ÈÑr *5ÜzC0+~h#8PED˜2B=!!¢¢"Ôj5ÇŽs2òóÏ?ãçççäœFgPè¯âT%_µ°c‰Ð`U§m|²¢•S5"ùY~‚â²§¥¥1|øpgÙ¯c˾}ûعs'á‘‘D¡:êëaùJ;2û{è œTþÇ?þÁ×_ízh1Jáå^sz }3ÒQ©TJ©¯¨(+½+"z?‘‘‘n=/h{³™\,XlºÔào'h.Øèß¿¿àÊ8nZuu5­­Íèt:• •J@£Ö`¶˜Ýº Ïs•yøÿÚ;÷訪{Ι33y` „WòA "WQѶ.|,/V©Úe­µWyI­Õ{ïZ]+j ­Z• >ŠH« \- (¢ ‚ ¼òL¨$™„L&ÉÌœ™ûÇ>3™’Ì# Ü×,a&!™=ûüÎï÷Ý¿‡˜;ù¢im]V|ð……… :4¬>¢kÐØ‘V̚¨ ßëÔÕ{°;¼lÞÑÄ 4 UUHLPýõãǧ®®Î?³Ïívóí·ß²wï^RSSéׯ_P8²~«ƒÛ<0+™¼‘qlù¢‰?=‘JÁÊÓLº<ž …ÒjX- Œ;–Ñ£GSYYImmmБ^ii©8šÌÍEIKE©ª†+'‚ÕÚvi`ŒÇ~û÷ïçg?ûYàEaCdã5ŸðsÃèGMNn&“ŠËå+ý5Z}»ÝX­q¤¥¥€Ð½ît:9tèPW€—ÃÝmD›·NßÔÐE ÜÜ••'ihhÀl¶ˆÀ¨0iÂíê„8ÚÁÝÆkˆ„o5Àt[)//ç­·Þâøñãdeeù‡hvDÆ3I½T2†˜Y¿µ‘æf/YÃ̬ù¨‘CÅN¾9ìd×þf&äÅ‘””ÄøñãÉÊÊ¢¼¼ÜŸVìÓŽ;æÏ•kaüh+;¿n¡â¤›QÃ-ü»ÒM}£—MMàÙ‚:ÆŒ°Ò¯¯Éï]¥¤¤0qâDLYY™ÿüݧ444>f ñ—;óâï¤!p¹\<þøã¡ùþã˜î.21 Û99™˜4 ·Ûå?ð°³ZIKëßÚÖ¾pøðá®2‹w·8…èÊ¢uÖø<€3®¾€öÙ•••Øíhf UQQT“IEÓ4\.wGE‘€a¾Æ |,7<Ÿ¼À5Ü·oË–-CQrrrÂŽ‹SIëkbìH+'m:&]ÇìŸ_Ä?77Ò`÷2d™„³&ò&OžLß¾})**ò'ùTUU±mÛ¶ ü”Þ&.eePÿûØNQ™‹¿¼ˆÝû[hnñpËõ‰,_ÓÀºÍd5“ÜKõë“'OnS(,,Äb±}ÀAîW„F`Ó¦M<úè£OíCôñž#p/m4»„ìÜlLª ·Ëmô«‚t݃Åb òÚ3†]d<Àìpkhꢻ1ˆ°SÀðáÃÛôUUUØí ˜5³ðT“ICÓL躛⢒X…ãáŽLh4–’h¬¶lÙÂòåË8p YYYgè¡$÷R™G¿T—_Çñn¾Úß‚û/âýv6ÖDÞ(++O“=,Ž‘— còäÉ"n ¨‘/++cÛ¶mÄÇÇ3hÐ 4M£W¢Ê5“˜>%UQx¶àü*…õ[|¼¥‘éW%p¸ÄÅØKZ5 ³ÙLNN'N¤¹¹Ùßk@×u8À—_~IŸ>}HKKkMò ½Ø#¼øëêê¸çž{üáÁ,à s¾€œ\¡¸ÜF¿ £mÇ£c6[HKKkóÎï»Éu¡pÀ8àRÂm krss;œè3v4Í$.~UÜý5³èBÜ p, àHŒc–¯€q€ÿp¼©©‰÷ߟÂÂB2222dHØŒ¸>½Mh&…†/ÅÇ\üss#fMáÛ#N2†h|}ÐÉŒëQ1_aÔ¨QŒ7›ÍæŸÄäv»ùæ›o‚úˆP t†¦›ÉÍ0S°ò4>ÂÛÚyø¾‹°Õê,^vŠÿ‡Y_ïÓFŽy†>°{÷nJKK0`@Û)¿€+Vðꫯ>µXĹå^`Xl K”©»]¸]ºh]ï5<ô‡/8räHW€õˆãì³bSY:mÂyÕÕÕ46Ú1™Lþi)š¦¡in·~¶<€P} x1—ò }àÍ7ߤ¼¼œÜÜ\úõ Û©™‹’U®¼<UUØw¨…k'%PsJgæI¤ô6"ÉÉÉL˜0ŒŒ Ž;æß8möÐ¥‰Híû*í»›è¤’˜ ²üÝzî¸)‰ÅËêX¿ÕÁÈ+%‹4ì>}ú0qâD t†>°}ûv,©ø.ú/þcÇŽqóÍ7N)jBûÕ¿ ¥Uô´¶ÿò€Žö·Ë墨¨¨+ ÀãÆtV À÷ˆ‰N1%$$tèøðÑ#À0f ³ÙŒ®ëgÛDÐÇ£þ«õ믿fÉ’%X,rrr‚ªÛBU g˜™É—Çcµª44z˜4.Ž’c.þ¹©‘áYâlÿtƒ‡Ï÷´9€ë§O!99™¢¢"Šiee%[·n¥¹¹Ù¯ä²22Ç‚£ÉËÞ-<ö`–®¬ç¦ëÉbf÷7Í´´xijö’šbò§ü^uÕUÄÅÅQRR‚Çã!99™Ûo¿½5̉ðâ÷x<äççSX4´÷™HîZ=݈ Âðè:^]„‹5¬@ìëïàkÚ ~cÜΊhAÔiíŒÈÉɉØ2†àÑ=wÆXÞkшhû¡¡ ©É›7oæõ×_gذadff†5xV«BZ_#2-¨*ôJT©´yHÜKåH©“ƒ%NV¯³sÍ•½><‹I“&áv»ý³JKKÙ¶m‰‰‰Fþ€‰^‰*I½Tn˜’€Õ¢ðæšz~}Wo–¼uš¦$°ï“MŸ‰£É´T“_ÈÍÍe„ 8¦M›Fffô‚ùÎ;¹ÿþûŸú‘Vîêà3^Ü.7.··n¤ë¬"`{§ÓIQQQg @ítêê.¢íûO:k¢ñT“Šf2¡ifa¼^ŠŽœs¨¬ö ¦Õöõ½ÐÜÜÌÚµkÙ¹s'¤§§w¨ˆTgã3)ä ª}s‹èp¬ÂÍéõv/]]Ïà‰üøúË3f 6›êêj¿>°ÿ~öíÛG¿~ýèׯ½“L¨ÆÈ¯§—×WÕ3!/ŽÄx‘PTtÔÅ5ãHM5²åå呞žuÉoSSsçÎ *2Tÿ½ô :åWÞÛ?%Hœùû @8 ¸¸¸³`9a2ýžf.Ú»t¢ŸºOio Hhâ„Çkü™ÖcBUéT*ZwtHöžÀhà·„ °Ø´iS§NeΜ9Go¸þøÊ)Þ]gç–¹ëÖ$öhaÁ/SXù^Õ5:u˜7o>³gÏÚx'Nœàù矧   ¨óÌ7%±ø‰TRû˜È©–ñcâøËS© nnsÈKh¡V¤|ôÑG¬[·.ð©-Àjz¸1•«/¯¯×Óa›û¶öw°ò,¼Ñ3°c‰lä[›@vvvر6›ÆÆqôg2aÒ4ÌÆ)€¢(9\ëï_myÝ|üHFäø ÎîÝ»yñÅéÝ»7999çÑ_16U…}[(*srû½¨ªÕ±Õê\=!ß>m㊼xFäŠÜÿäädŠ‹‹ýúÀÉ“'),,Äår1xð`¬V+š¦q±™Ks­løW#Ó§$z×,DUU·Þzk`D08Ùƒ Àl`P,ߘ;<Û?ØCx­·/0œPRRÒà °ð\ŸÛ{o¬À×À"œ°ÛíþF¡¾#@MÓ0©&ŠyFä)C9íNùÙ#BÝÌ 6ðöÛo“‘‘Á°aî…YS™caÜ¥VÌf•¿½ßÀWû[xäöjA×á'ÓYú·Ó|}ÀÍŒàê«'£ëº¿w ×륤¤„íÛ·“””ä×õט2!Þ„Øê¥µê|¾›U4Æáå—_æ½÷Þ |êD†eOb> ÖlÛä »uœ.—‘ …z<â"0N§Óß¹)Fúß]à8blÔb`||Î̈á™L»z zø())aÛ¶m$''3pà@¹³Å P»Ýν÷ÞKEEEàZßèÁÐYX¢ý&«ÕJfæ0œN§!=tá$$$Ò·oß÷·ÛíêÖ©ó ܂ȥˆ µ›°QËÝmÐÑâ´ù@„¾š§p9:ÒÔzÈæÛ\…(ˆ9øBYY3gÎdæÌ™lß¾="Cgµ(ŒieÌ+?”‚Õ¢P]£så¸8þõ¹ƒáY>ßÛÌÿ,ªÁ©'ñÓŸþ”§žzм¼<¿;êp8X¾|9«V­Šé ­Y³†/¾ø"ð©wéþá!¦ÊV«Õâßþ£?ñwOdû9Fïõ)`g,ߨvã"îDœDÔDuÑ,&¾\ãÇXã,±þ¾¦´½ˆ&$—w£ ) ëׯgÊ”)Ì›7ÇG7ŽÌ±`µ(hšÂ¸K­<ôd5ÙC- ¨Qñ½›S§uvñ蠟§óàƒ²`Áÿ°TEQ¸úê«£~#<ðÀOÕšGO&¦½`±ZÎØ£¢ÐÓš·á# þN˜Þÿ]né¢àãg,dQÛk“Ô±¡ «<µnÄFD?ü7ùÎ@O¥  €eË–ñì³Ïr÷Ýw‰yñë»zÓâôRö‹çߨ#{˜™ô$3Æj~u_UUFÅÂ… Ù±c6›MŒ‹’¥K—û€¨ô;Öà @L{Áb±ú…éÖ‡Ý+fDr‡Òø€ÝÏæ¦_‰èxª+¼iøŸ×Û ôà YŽèRs•!úoº®óè£2eÊV¯^Q7YE8«È!¸ùúD•ëÌœ†¨çõ akêÔ©aǤµÅž={ÈϺ9ÏÓó‰i/X-¿ûÔöK÷evéÝÿ #Ìvõt°Épg7„»ø}í’Û{ ë Œ@òfó…hõiˆ¢™ Þg%%%ÜqÇÜvÛmlݺ5b!tB^üM IIZ£Ýò´´´ðôÓO‡†5bçi4³fÜŠ0Æ‘ ¡o…ßßa@Bíÿ¥!¦r>½É~l¨•ûÚ2¹?ABI ›å{ aUåG7B«±†>T;ÿÉ'Ÿ0mÚ4æÌ™ÃÁƒc:W<âóÛØ(ÿ™ 6°víÚÀ§6Ò3J}»Ïj(J›!€Çëñ{‘„Áí|Q/1 xíœÆ:äCD.ütCÀ¨‘Ý‘e Ô‚Ü%ßbÿ3]øÀ‡ÝÐÆA+øÊ+¯pÙe—±xñâ¨'Ͷ•äðÝwßñÈ#>ÕŒèá¹?UUýÖÒ_äñDæèºª™4#jHò£ëÊϹØÑ…aÁ]ˆœëéN§ó#§ÓYŒÔF6 ï$À¤™øQnAW!†™ø/]§ÓÉï~÷;¦NÊ;ï¼Õ´™Ð4ßH=€––.\𽏨¡šf2´(ãõyžÈ5§ÓIKKKðºêõîë®õë ·K'°Éív¿b·Û#H‚ã$oÐ5k1lèçùþÛ…¨Ã˜…s¤Ìš5‹[n¹%*} ÐDâx½^^{í5V¬j®|øýyfÅ`̆$rdíË ¼Ðm·ÛÑu}6bâÛtsDOò—wTWW7†« kJ€ÐzÛ3[bÎ8ÊùX…hGv†>°yóf¦M›ÆÜ¹s9pà@WÕžûùôÓO™?~èïó œõ0bš1¯™5qC f(FÐÀf³5;ÎZØÒƒÝVWW÷©Ãáˆ8 ð-²ïÀëõv¦)H>}`4"#(¨\ºt)ãÇgÑ¢EQëíQXXÈŒ3BÇ]?O„iz1íÕ/Ò®ØÑÃápP[[»‰³X Õ£³ššš‚ªª*=Ò 5 5Pc?¿ÃÒ DyèBRo›››yì±Ç˜°ªªJ¯­­]r6ßhO“Ì7VTTlolllW!õZƒ|éÀª)fp.;Ã[î ÕŽ=ʬY³7nùùùlÞ¼™“'OFTVV’ŸŸÏŒ3BÛXèòãildwÝu×^{-¹¹¹¤§§“˜˜ˆ¦i8Nœ8ÁŽ;ÈÏϧ²²2ôçìn&¤~á<ã CŠj:¦iþ½è¿Iy!þùm[·o)/¯+(‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘ôDþ¦¨ùàéªIEND®B`‚klog-2.3.3/img/marker.png0000644000015700001710000000436314542412415015106 0ustar jenkinsjenkins‰PNG  IHDR,,y}Žu„iCCPICC profile(‘}‘=HÃ@Å_SÅ¯ŠƒD:dh,ˆŠ8J‹`¡´Zu0¹ô š4$).Ž‚kÁÁŪƒ‹³®®‚ øâèä¤è"%þ/)´ˆñà¸ïî=îÞB£ÂT³kP5ËHÅcb6·*ö¼B@èCDb¦žH/fà9¾îáãë]”gyŸûs *y“>‘xŽé†E¼A<³iéœ÷‰ƒ¬$)ÄçÄã]ø‘ë²Ëoœ‹ <3hdRóÄAb±ØÁr³’¡O‡U£|!ë²Ây‹³Z©±Ö=ù ym%Íuš!ı„’!£†2*°¥U#ÅDŠöcþQÇŸ$—L®29P… ÉñƒÿÁïnÍÂÔ¤›ˆÝ/¶ýzvfݶ¿m»yøŸ+­í¯6€ÙOÒëm-| m×mMÞ.w€‘']2$GòÓ àýŒ¾) ßýkno­}œ>êjù88ÆŠ”½îñîÞÎÞþ=Óêïh¯r£ˆÑÊÑbKGDÿÿÿ ½§“ pHYs  šœtIMEæ  6‚LtEXtCommentCreated with GIMPWËIDATxÚíÜ;ŽÛEÑ ™6nuˆŽÑ!º€IÊÁ//D9e !$DÆç¬½Ç°®õ®^Æ93V}nU0Ô;ÿb«úuÄÿîÍD°X)Jb†`Ñ.P†`(C°Dª%ñ,DJ¼,DJ¼,¡B¸ ‘/ ¡.K¨.ÁB¬D ÁB¨„ Á*„K°+ÑB°„ áB°Ä Ñ,„J¸,±B´,±B´ ¡.K¬Z^ÖNŸ‰h –X ½©Ÿ—h –X¹|QŸ¡h –X¹hQŸ«h –X¹\QŸ±h –‹ä2E}æ¢%X.Ž õù‹–`¹,.MÔ³-ÁrA\”¨çâY–KárD=#ÏE°\"êyyF‚%V.‚h  ±rø3Ÿ¡ç&Xb…h p÷dqÐ÷ÿ,ýé ËY¬<[ÏS°Ä Ñ,Ä ÑZÞ{ÁÚfŸ7ÖòëÊÅ™õì=oÁ+DK°T‡ÖYðü¯á{X qX=+f]³'XÞâx>Mx ¼á\çÙ,±B´|Iˆé¹ù,¬QëÊ¡wfœ °°¼)½5±²,¬q>ÏÁŠYWàŒ –·1ž«`áPãù –© Ϊ`yûâ9 –78³‚å­‹ç`íŒ|ø¯íI>c“Ï•…XXÖ•ueeYY0–`yûá€`=À/Þá, ¾ Ày,€ß©¿?eKÇó7íÌYX€` X<Æ÷¯p>k~ÿ g[° @°âû8'‚ X€`Ö#üJθ`V?ùÁy,Á @° ,Á«óÿ9¿å‚p‰{ÃUu{ûÇ/XXK»Umoÿøâñ‚`Y€K½çÊÚ<[°°‚|¨ª1VÂÊz©ªoGÿ{üê΋`ü¡ý;ãæ²qõyœr-,@°VaýàŒ €`%ò“œÁ,@°+ïOà|Ö.üjζ`€`Ì÷)p.  ª†}Ãî¬7oòsÆ™›xÎ,,@°|IèËBœµ±çËÂËÛÕ²= ¨­êËæ§„ýùµ¿·¬uu ïâé6ð…8ö'Yg®?1t®œ) ,’×Ö•`5äË4,¬,Ï׋V°v>\Ÿ¯ˆh‰‚õ?o©çªúêñvnÇcò¯5|ªªŸ)ëʹþ\9å>çÇyñ%¡C‚E§u‡u%XV–h‰‚åð3÷yYW‚µÜ¡-±B°\¢Ÿu%XV–çâ*Xã‰h‰‚å’󬫿óÁ, ‡wÞó÷Ì-,—±¬žV;4¢åsF°\&–ú|­+ÁjuxDËç:¢‡foã^ÏÖó´°\6|~–Ãmmy–žŸ……µ VXX“¢àd=;ÏK°¬Á—ò‚Eâ—^/…5,XTö÷Š&\ޤç#V‚åR ½(–¯`Ñ4X].µ+X ŒVÚêðÙ –`¹4M/”—‚å"-{ɼ ,—k¹Ë7ñ³«ÇÝ}ˆ–K ÖÕÎüÇÏ€…eeueaVÖ•…`aYYXW€…eea]aaVÖ•…åÀ‚^V‚…ƒ ‚^R– ‚x9]ɇ|¿æ VXX€……•…ueaXXVÖ•…`aYYXWXX:à¥#X< Xàe#X8ø Xà%ƒ`¹ Xàå‚`¹€`—Š`áB€`— ‚åb@,—d1þšƒ—`aaeYWXX–•…ueaXXVÖˆ•`á`—ƒ`ù\$,ðR@°\(˜ÊEâ×¼ ,, +˺ÂÂ,,¬,ë À²²°®,, +˺ÂÂ,,¬,ë À²²°®,,\F,tË¥Á!G°p9A°p — „ÁrYA°@°9‹ÛØÄÿdG¬,, +˺ÂÂÂ%F°@˜,\f,ÁÂ¥Á!F°p¹,` — áE°pÙA°@p,—Þ¥'ŽC;\Ú_sZ ÀÂÂʲ®°° +˺°°˜°²¬+,,ÀÂÂʲ®°° ËGÀª+˺ÂÂ"‚X!Xˆ¾$Ä—†‚‰…`a±êʲ®°° +˺°°XueYWXX€……•e]aaXX¬º²¬+,,À‚=W–u……Åá„ÁBô@° ÄÁBx@°9 ÁBÜ@°" D ÁB@°3 aÁ÷ „a»#MzŠÇIEND®B`‚klog-2.3.3/img/klog.ico0000644000015700001710000032473514542412415014557 0ustar jenkinsjenkins Ç©‰PNG  IHDRôxÔú IDATxœìÝwxœÅµøñï¼[´Òª÷f¹âŠ»ÁÝØ²1Åz %ÉM#!•›„â„b !íæ&!…”_ „„\ÀX€é†ÐŒ{¯rQ_iû;¿?feK²l¯dI«•ÎçyöYiµ»š•vß9ïÌ™3 „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!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„¢×©D7@‘0 ÈÒ4À»Ý¤œà±A@a û>4‡Z Ò[ Bœ: „8,`0(r\.WzaaaYvvvYVVVQFFF®×ëÍLKKKs8nbÇe`Y–RJ)˲ÐZs‰F£Ú¶ívßG£ÑÖkmÛ¶¶m›H$bH0ôûý~_sss}ssóaŸÏ·³¹¹y§ÖÚ‡ »˜ BÑG$"yXÀéÀh (333oذaSŠŠŠ†ååådeee¸ GjjªJKKSn·[E"¢‘ˆŠD"DLg­¢Ñ(ÑHÛ¶‰}mn³mìhTE¢QìhôHGoÇ®´m£c×(¥ÑÚ\J)­”Ò­÷o½ ¥´eY¶ÖZt(²#‘ˆƒvccccSSÓÞúúúuÍÍÍLpð>PÝwf! „èZ;ú‰N§sÈØ±cg 6ltiii‘×ëõ¤¦¦:222,¯×«"á° ‡Ã*‰‰Dˆ„B* ©p8L8&ëä;;›ï±Ûµ6AAœ÷sàQ–…eYÚ²,[Y–­”BY–v8ÑH$bûý~; êp8l766Ö×ÕÕm©¯¯ͶíÀ&àM %aÿ%!’œB$–˜Œ;í´Ó&;öŒ¡C‡V¤§§§edd8rss-mÛ* ªp8L0  ªp(tLçÞë}Þ`™Á¶œNÛaY¶eY6JEü~¿Aˆ666lhhx7 ¾ ¬^B¦„ˆ‹BôL¦–——Oœ1cÆÂ‘#GËÊÊJ-((p¸Ýnðû …B*ðûU(2£m†ïëŽùx?ëê™WŸ§õþt¸M)…åpا3¢”Ò–Ã …B¿ß¯@¨©©i[ccc•Özð"°+±ÿv!ú' „è=)Àb`ìŒ3*g̘qFqqqV~~¾#==Ý * ðû•ßï'w»³¶µ†D ]ýÝqÞ¿µóï,H°c?·m»5(ˆ*ËŠ´Žh °}>ß¾æææç´ÖïÏaò „ô$¢çXÀ<`æôéÓÏ=ãŒ3&———§;-˲‚¦³Çï÷«pìÌþDg¿v’±¼ãI£»ØyŸ #îìgÇûv›ÄÀ¸–“~‚×Þñ1J)m9a ŠRáP( Ñ–––]¡PèààdÊ@ RqjŠ€s***Î_¸paåÈ‘#3JKK]n·Û øý4·´(K ‘HäèPö‰:ÝuŠÇùYw;þãu¦]mŸÝö9»øšŽ¹=6äßÙï?Þï‰÷õÇV!„4Dm­C¡P( CápøM­õ߀!« Ä "€]7Ͳ¬¥‹-º|ÆŒcÊÊÊŸ øýÇvh'épOÖ!w§3·m›@ @0$ ‡‰F£„ZWÄ~  µ¹Ç–Öý”þX¦ N‡§Ó‰ÃéÄår‘’’‚Óå²,sŸØýÀ±¯¥›þ‰:þN“͵¶µjÛÛÔ&ÊÙ üø?L¡"! „8¾ééé-[¶ìò &VTT¸ÐÚjni¡©±ñèY~ÛËI:ôx:ýuî---øý~‚±N»©±‘ºº:êëêð55Û¡' ‡ÃËåÂívãv»q8G ‡ÃqÂü‚®Žœp"FCPCH-y¼xø ¦z¡IO!Ú›dYÖ‡–-[víôéÓ‡ 6ÌmG£Êçó)ŸÏwd8œ¶CÉÝìäw¿ßO“ÏG0 ¹¥…ÕÕ:xúúz¢Ñh¢ÿ>}N)u$@pÅFZGàäÓ ñü?N@Û&bö=ˆÏÝ&DR’@È®ž={ö',X0vĈ).§Óò57ÓÔØ¨ÚίÃïNç …¨¯¯ÇPW[ËÞ½{9X]?Hôß#i8Ž#—Ö„xþ/@—GJÌ,ˆÍÀcÀ€w{ø¥ Ñë$ƒÙÂâââk/¾øâKÆŒ“••åhòùÌð~'kòOåâ÷û©«¯ÇßÒ¾ýûÙ»{7µµµI9\ßßµhçÙ~Ü4DbÓó-ï¿ÀŒ ¾a‘”$ƒMR꺥K—~fÖ¬Yî`  T0èòÐ}g—h4Jmm----ìÝ»—íÛ¶Q__Ÿè×-z‰ X ê_Ç.‡Ú0!NB1XLËÎÎþÔe—]vÕØ±cÓ332ª©±QuµÓ:íðÙ¾u+;¶o'–©áÁ&6*Ð „1y?ÞKlË„èœb s—7îsçœsδѣG§„‚A«¡¡áȲ=8vùY«¾¾^Ùµ9Ù~ë~mm-{öîeãºu’¨'â¢!h›-‹£À;˜@àÉĶJC1Ÿ:ÿüó?3sæÌ¢ŒŒ gC]åóùÚU¬‹§Ã×ZSWWGMm-Ö¯§zÿþ¾,‘ì4„b@ØüSWàÔ+/ ÑMˆ`„eY7.[¶ì£S¦LÉL÷z555VÛê|pòοuhÿàÁƒ¬ûàùšÄ¤!l›åƒ`;p?¦¸,}N‘Ì*Ç/¸à‚M™2%ÃaYÎÚÚZ+ž?Ù™>˜ºóµµµ8p€õ|@sKKÂ^Œ 1¡–¢¿»`äȑߜ={ö„¼¼ÌŠåÀïÜ$‘„$‰rfzzúO'NœxZº×ëi¨«sGÚ ÷·½ƒÔ×ÕqèÐ!éø…8ªm’à«Àç€Ý n“H"ˆ¾–Ü1|øð)/Oõ·´x~¿¥:tüáp˜ºº:êêê¤ãâ8bE„š0—¯Kp“D’@ô¥Ùn·ûÁ1cÆT¸]®ÔfŸÏ­mû˜3þh4JSS“tüBÄOÇrB˜=n¤Ü¥8! D_°€[ ¾TTX˜ …ÒÂÁ Õ±ã·m¿ßOCCƒTì¢b•}À^à3Àk n’èÇ$½m¼eY?,..ž‘–ššêoiñèXçÞ6…Bø|>Z—ý !º-5ÓAàÀw‘*‚¢ˆÞt½Ûí¾7///CÛ¶7 9¡}ÇßzÖ/ëø…èY64ÇÊ ¿€I<à&‰~FÑ2€û=Ïei©©žH8ìEkÕqy_$‘Ž_ˆ^Ô&A°ø,°:ÁMýˆ#Ñ Î¥Ô£.—k¾¡`0-‰¨H$B4%D‡Ã2Ï/D/Sà°À£!¸“$øz‚›%ú =ézà; < 28Ý !„«žnÄ|-1 DOp×(p[™è !ŽeCP›)u˜€}W‚›$Hqª ßgXàUšàö!N@CÄ6» 6`‚€—Ü$‘ ’ NÅTLÑ‘Ñd)3Ï(„èÇX¤hSŸã2`ð~‚›%@Ñ]W`6 Éq@¶Ì÷ ‘T”ÀÎÆ¬Ü©Jl“D_“@tÇ÷(Hu@62•$DRj3j7< Ä nÑ.àGÀ R-ð&ºABˆSgC@›Â/ÅäˆN¯ àwÀ|é±áC!Ä+Ô¼ |¨Ip“D/“@Ä£x˜dA¦w¢$„èy± ÀFà*`O‚›$z‘âd†FÆ2ý%Ù¯ÓÚÌáÚ@4vÝq'ÝæºÓ¯·sŒjÌPm.trÝú…ÂäY€¥Ú?Fô3m‚€ÝÀ•Àæ7IôùŠ™< ÇÎü¥óOm:fˆQ}äf¢Útò'ÛB1„1Ãc—¦œ?vi‰ÝØ}W%΋éÈÁ$yc—4Ì´P f„È»>Ù{Æ¡Lpà vHbK¾º€ È]²€tLÐP ”Å.˜\“Ž«“TlÚÉŠ}í\JÞ“½ÍŽš‘€CÀÅÀú·Gô0 Dg¦Ù±Î_Þ'=$ÖÑõÑ3øíGèC˜Î{7总ÓÙï¶Å®òÞîPŒÀyÀp`PŽ ŽŒ*´˜©‡Š}Ý×ÀZƒ€Ã˜ `]‚Û#zØEGÓ1–tþ§&v6Òæl¾u¾U¦CØìÖ[û¼¡ÉE£Ó1ÂÌhÕÚ/Ku+p*3b‚§¢5¨Á$¸=¢‡ÈÁ]´uð S:ÿ®Ó¦³Ä:ûÐÑ›9¼…éìwk0¾èY£€˜ƒ9˜Qƒ¬ÖƇ2Ó®Ä41iµ ‘ÄÀAð¢ÕdàïÈ™\bCø¡XgÔGçê›÷€ÕÀ&àEÌ\¼HŒaÀ\L0pfj¡u«S™‘·$¸ÆÅ¶¡^›i¨ 0ÓS"‰ÉA^ŒÅìž/ÿñÅÎîC±yûÖŒùFÌý À›±Ë@ž£Ov.`>f#«³1S ­åpݱÑI0<®hl$`3ð!̈€HRr §O%’íß^ì,?ëøƒæ&˜áü•À«±¯Eòr 0Á2ÌH#¤Ä)|ÕF›:k‹0_‹$$ÀàVüÛÔgÐwþÚÁ Ä–àµÎãÀŒ¼„éøƒ‰jŸèuÀy˜é‚JÌrEpK0`Ä‚€zÌTוID€Á+ø?`¢e¶ó´;CÆ:ý`lh¿uYÞfÌÈÈJLòž|,Ì4Á"Ìpw€O, Ô‰„möxøL¢Û#ºN€ÁÉ…)ï;?ÖùʨÖN¿Íðþfà1ÌÙ¾,lj™&¸ ¨6ÁÀ ü µÙEð€»ÝÑ5 N¿.¤ûDc­¦Óßü³B–6‰x-ÄdÂ_dbò<±Ë :®ÚЬMÊ/a6 IbP½QË/*ȰŽf?x±N?ˆ™ÛoÆ ïÿ3¯/Dw¹0‰pæa*¦ÄA3E`C£6Ÿ«‹0«bD`p¹xPAšÕ¾jÚ€«Àços¶¿x³Á‘$ò‰ž6³…îÇ€"̨@ªe6Fð¢&)°“7!Û' )À?¤[mª£ DÚlªÓzÆþüY²×-÷ßÿ]g0L·míQ íõ¦5:Tç¿ï¾{¤ÞAç,Ì™ð'0yVlD u€×ˆÆ‚€w0¹d÷s %˜löÒØr¿)–•ìÇ ó×?~©»/âôØcdýú-¹J©³1ÙÌ&<©˜Š‡û·´æ_‡zR©¨ïÖ[ï` s£€1#n)–Ùq@®ºÑŽÕøð…D·Gœ˜Ÿ…Yî7+Öù¸†`¬ã`²÷ÿs Ÿðâ+VÜ úZóEÌ®|'¢J©¯åæŽøË7^+AÀñŸÂŒ dÆj ¤ ÄÕü¶É¸³ªFôS |÷Ÿ² k %%Å–ñµÄvÝ{ø.ðï7+‘Z?ϺÃ×q¹ûî»b‚§qtíØ¾‰èïßyç·¤ ̉¹k›¢X¥Aï@ bIMÀ`C¢Û#:'ÀÀvðolØq@ˆñ·`:þ5À€gÛª>—I:»”ƾOÃ|®]˜¿ÑAÌ^î‡-˜@é&7ÂøÎw¾g…B-W`Ört³=à³~à¡{ï½×>é½… øðe xŽèX>À˜ @òú¡òfÇ üD{ tþ±ùÅfLgó.pP•ØVõ7æÌüBÌf6­óò]ù G1S%µ˜„ÈU@U0Ø ml"Ào€‡4|YCP'¶T7iGi•ÙnÙ«Íû÷_ ž`=i$í›KœÐrà‹`Þß¶Í8„éøfpl·[ŠéL?÷Æ/HMM哟ü$EE…hÝîOUJ=ª”ºí¶ÛnßÞÙco¿ýV+%Åsp;í#;IË—³±7Ú<d_Á$ ¦Äjv¤&¸M§Ä†mVŽÌÕ¢ŸHöa&q¬ÙÀçbkŽ“¶ó·Á…:m殿 LÇ”ì迳±Ê˜aÓ^éüæÌ™MqqQÇΟ͛7‡|ðoÜvÛíû÷Ø+îµAÓá·U íùÖõÀ71ŸãG54Å>¡“<®ß²ÌÆcÀ÷ÝÑž‹ø)f­qRVúÓŠð|˜ ‹æ`殺"L-õÿÅt¤½Æét2uêÔv¿RŠðøã§îÞ½ûÛÀ/Ç{ŽåË¿Õ ¬ëøÔZ“ß+\va–Ñ}XcCcìL:šàvu‡;]€ÙjYô ,w屈;ÙØ±ƒ\#ðL²Ûç0C‡…)Óü p)}ð¹œ:u*ÙÙÙí€p8ÌêÕ«inn“äwðð Ž?ÑqHW+50’Nû‰×s€5챡.¶&©(SÙ…ÈIpsDŒ$sëbK‰’ªØ†@,»¿ ¸³[á`YJV‚™â¸†î|•·¬Œ´ü|¼%Å ,´mc‡BêëðíÛOËDÑQs9fÌh”RG¥»víâÝwßëøÊ1ÿ“ëaFe|ðgŽƒu l¥Tm—_‡8™Ç€g€;4\… eV $Ínž¤ÛPÜÉo &ÀÀàÁ¬áv%Ù’¿hÔtúàŸÀc’ýp%¦PS—†û3G¦|Á|ÊæÌÁ[XHZAŽT—ÛtêmïlÛDC!B>þššvíâÀoPXT„mÛmîfóÞ{ÇtþmÇL/}¸xòðášlÌrĶ‚ÀŽ®¼·à&à·Àl˜+-œN$t+³9Rš6;'þÙ50á$n†ÄIÁ6»ô5c†ø¿ŽY&4(à4LÕ ‰s¸ßr»©8g)㮺šÜqcq¥™8O·éĵmwš!i¹\xrrðäæ’{Úi Ÿ=›ì§Ÿ6“.1>Ÿ-[¶ž¬`&&ó…­[·¾0räȼ¶°[kèeï•À—4Ü…°éÉ0`AZÔ‰÷KøI½ýšÉo,ð‰XÖ¿ÿjˆÚ&Á/„N¾Øò ©ÿuÌPh\*ÎYʤO~’¼ñã Ûk»3$Z£w €ŠFA=iôùšihˆûß,}ë­ÿ,±mm RõxRZƒÖúÅåËo»êÛòå·¨””T¯mS¬”• všRêÖº:--\wóÍw–© ®²10ÿ… ˜–,£xm3rt &˜ Ò¯ß(".8L–~-6×ïà ó‰ÁU¾wf®ñžõ§¤pÆ-ß`ÔâLí¹-å½Rºz5ºMÐX\ÌÊ›XûË_Ž? ¤¤$xÆgø&LÍÌÌüØ-·ÜzÒÑœ;îøV–Ãá83 2³þ½µQSyð]¥ø«RÖ£·Ýv{}—5¸(Lñ¥o` eô÷%À±½ªi˜‘@‘$·Ë€ŸÇ>ðUrë/tìÇÌõ–-z³0æÏÐ…­˜ó§O猛¿BÑÔ©Ý;Û?Œ}û(zõÕv#£Fqpʯ]Ëú?ü‘íO>ÙÕßk;ÎF˲¾ …~Äq–mÞsϽîh4üa¥Ô׈oÓ¡(°Ô—@W-_þM2>¾Ó€‰ RûùRàhê0K|¿èÆ VI•-.Úñ+ÈéÏt ¡Øþ൘e}ÄEMºh!fˆó â¬ææHKãŒ[nጯÜDfEèžïïRIß»§]à/( ¥°oQeóæS0iþº:|»wÇû´Ê¶mO4]‚9«ßÙîÈ X±âî|­íß*¥¾™‰çÄŠÝw°¡ªªjc¼ „j1ï7'0EC$¶Û`\îma¦1NÇ´9é–6$¯Ïç[foñþøÇ6õû›1k™¯ÄT· ²1ëˆYF×H[áÌ™,¼ÿ» ]\‰åê½\·ßOÆÎí€pV¾ÒR°m,‡ƒìQ#²ð,ÒË˩ߵ‹P]]W~Eæÿ½S(hÿŠw×Zÿ³3\wFÓ€‹W>½jUÕ`Y)Ò6°x X Màè§ùA.mV¹çݘÁH€ä” üF™Í~úcðhÔôñc–Œ}Á‘èçÂTn{8Ÿ8?_)EE̼õÎüêWñ–”ôøGÎ@€Œ]»ÚÝq»ð rä{mÛ8Ün 'M¤báBœéÔlØ€êÒàÍ0àã&Œ;~üø›”R— ¶ Û0 >ÀŒerìvÆÝoÄê–¸Ï&º-ƒQ¿‰EÜJ5 ²úÛÜlÈ?€Ùgþó Ž¢>©˜’¹Ë!'¹ïÞaØþ¥/1üì%}Òñ· :Ć[nçÂÅ II9š7‰DøûßÿIÙn$Î,°Ù”à ±ÿõ7xÿ·¿£úå—Núû–.]ʼysÛ J)¢Ñè'õÚœœìW?ýé: ï¼óÎËRÅì"×ÖýË—Sö—ïš)À/€áý-i؆fmJJOÁœ<ˆ>"SÉçàL‡É.ï/œ5gàû˜jeƒa8o<¦<îÍÄYßÜr8˜ð©O1ë_§xêTsc/$úuF9ìæYj^y‘#‡“ššÚÚãó5³wï^öì¡`þ|”£“CƒÖ(Ë"køp*.$sÄpê¶o?n~@vv6Ë–ÇÓ~ £Ïçã‰'ž8üðÿýä“ÿØÎq’BŸþù–ÊÊEÍÀå´¯-ªü}U•l/ß՘ѩñÚTž´ûÝ…, IDATQá gld¼šèÆ &ý11D_ðeÎ:ûEç¯!l›%} ˜=ÌÃQÙƒI¼“ð—ÌÑ£9ãæ¯P6gŽ9ë¿­Àþj”RìÙ³Úºzª«P]}€–?ZkT“p“”¼ã—•°#\Þ4F_z)e³g³é¯åý_?D´¹}Ì7oÞ\233yO?ý4k×~0 ø˜÷ËýÀót(¥ÞÕZGi¬Ê.,Ìo?ñ«®¾¦áf"–É«HèT°KAŠ6e¦€ü_ûŒÉås˜j_ý¢Þ¿ ض½ë0s÷†ˆf`ÊøÎ'ÎÏåt2ñ³Ÿe܇¯&%;Ûœñ' óǶqee‚R¼ýÎ{ضeµ?ö+—ËTmˆçé"ÒŠŠ˜òÙÏ2tñbÖ=ü›ÿüg#FŒlw˲ظqï¼ónëM̪€9À?0×·Ú7Y•¢cà‡#tßw×4ü. vl%QBûmNp.þ/‘mL$ 0y¤×÷—³ÿØ|¿óa=—ßù{oaÎTç3gâé,ýÍCLýìgHÉÊJLÇ£Ì1cŽ´¡cçÖ¤«ÀQImÛhÛ&gÌfß~g?ôkJ, ¨¨ˆÂ‚c¶>ΰ}fÙàÓÀ­?°,Ê8v5@Ccã`XTÒ«^Î6Ø&90îòͽ!V¹Ð9‘}DF’Ç¥@ºe†Ÿ©µª_3tû½·§·)ÌÙþ©ñ>È‘šÆä?ËØ«¯ÂžÞgI~'¤59“'‘·p5U/@‡Àòx¨¸þzTÇÀ ž§ŽFQ–EùܹNšDàÙgqhM$ztµÞÙ¿ÿ‰ž&³dôà_X–µ µ;6h½mäìÿÔmÁï?·a©‚h"Gc£ó0#ÕŽÁD€äq®2rÂ75Dµéü}˜Ò¶O%ª-}$¸ ¸‘x³¦•¢dÞ\¦ñKL<;íŒr8ùÙOã)+¥úïOmnA)…gèP*®¿†œÓÇŸR{íHgZÃN;ÈúõG¯RìÛ·—H$®UhåÀ=J©ëš›[²RSSÛ$(¥^¸ýö' ~üãŸ8jÇ“•bªÖ”`’Të”Rë´Ö«-˱ý¶ÛnëWËâ  ³Šån Ÿn“Ðçb@3&üy"Ú0Ø$|(YÄm‹‚’DEè±d¿F`&‘hC"ÚÑG\˜Ò³÷bêÕÇÅS\ÌÔÏÝÈÈeËp¦¦ö«Ž¿Ø’¼pc#ÁC‡q¤zHÉËÑšŠŽö@}¥(}ùeÒª«Þüíïç­7ß:þã:p8Œ7Ž3¦S\\Lff&Ñh´˜¹|ù77uö˜+îÎÐZ_|3bs¼L÷ZÌfT?\¾ü›¯Åݨí:̨ž'Q«Œb«‰ÞÎêëß=IJwc{~÷ù€†`,ÓÿàzÌ’¢ª¸¸–8Ïú•e1ì ˜ô‰O3jTB²ûû­Ï?OJM͑۔R¬ÉÎæ??ÊþÕ«»üœL›6-:vì˜ç~ô£ŸK‡Àïÿ{Vs³èÀÜ.<õ!àÛ‡ão½õ¶„΃÷óß+ÈR&9°OGmðks¬9ÁQG$¡¤@r˜\©ÀÛ×uÿmh‰ Ë= |¨Û²ºÀœ}Ä5=æ­¨`Î]w2éã'-?ÐwþJCÖöí8#·i¥ˆ.ZDù9ç3f µÛ¶ª­û9[ZZغu«µfÍš|­ufåI#À]wÝ•‡oÁä Œ<Ñót ,ÑZ3oÞ¬Õ/¾øÒ`ÿîÂT`<'¶€»9ŽX1±MÀû}ø{%Y2b×}:bcC“6åZ‡ìt‹×`ð0¦”oy<PJ1æºë8ï¡_3tñâ„­ëï¯T'Ó:Å™–ƈeË8ÿ¡_3í«7ãÌÊêÒóÚ¶…YûðÂÂÂ|¥ø*&WãD•15Ç_6è¾æv{æw©1×zà<`]l…@ŸíÞ 6fkcÑËd 9Œ.Qªú(°¡!‰ß ÜÃÀ\s|ø¦ i\ŸïС̻ï^NÿÈõ¸ÒÓ{³}ÉÉRdìÞ³åè¯ h1‚¨Û Zãòz)š:•ŠÅ•hË¢nݺ®äL( X<{ö¬«GŒq¡Öº³í[€• ~üxxóFûÏ’ÔÐE‹*©ªª’†Ì0üãÀTmö¹°ú°V@ó¿ûsý¾AKV$‡Ö9÷(½?j£Û”õý"ðX/ÿ¾D™‚IxZLœA•årqú§?Íøk>Œ'7·ÿ&ùõÑ”öé Põõ™ Z-É1‚™_ÿÃÏYÊûý†}/¼÷ßuܸqÌ›7¯Â>öþà)¥¸½®®zíü´]ðzÇßúžÃḠ“äÙöxè‰t(F4ˆ5b~¡átí>j%}ð{=HuÀ—§:¶(JO²cÛø6a’ýþÙ‹¿+Q¼À¿ÆgçŸ=nóﻇї^ŠÃãIhAŸþ.T߀õÖ›d:ö­ Øù‹4gdá))::ž¤5J)2ÊÊZYIΘ1ÔmÝzÜýZ9.¿ü2²³³ÛM½D£Qjjjt»Ý7|ë[wî}õÕ5Ç<öùç_°—,Yô†ÖÌ¥}΀²,6­ZU%õè²1žJ1»\ê>ØC ¬Í1ï½ü{= ’C¸JA^/~ø¢±e~5˜u¸mi”s¶ÿ{Lµ±¸)WVÓnº‰Y·~ƒœÓFËYvýùQìõ))=z§”"ìðŸ¿ý… ˜ ª-­±\.rNͰsÏÁSTÄáµm“HØÖÔ©S™9s&mÏþ•R¼þúëüñyá…J€­˜÷ó1V­ª²+++#Àe~t¨ªªê¯ÝxÙÝ¿1Ÿ™@´7wŒåìÂé¢I`òxJ÷Rç¯!5sþû€ 0ëp’<`ðpf\PŠÒE Yú‹™pýu¸¼éØñ±Ô ®z‘Ã5µG†V"‘‡¢¶¶ŽHm ‡ßxóH-‚v´FÛQRsr8ýúëYöð÷‘,(¥˜1cú1ß»w+W>‡Ö:³¿üJà›'±S)öurs_ q'«{;5b' ½%lëÅç1’&Ða9ÚŽF{,PCÄ6sþÛ+€=õÜý€¸ø6]È*vçæ2ý¦/3ò‚ pzë7ldïÞýÔÔÖá÷›$Êá eï”e·èŽm–”5lg~ãë ?ÿ<Þ}ðAö½¸RXXHQQQ»³Û¶yñÅÛ-å/îÀì3ðcàQÚì7¯5mzÐùƒhõÌê ïÚ@oT ÔfÚá?=ý¼âX2nf———EÎ9ÿ\åèl¯önhÓù¯>ÄÀêüË1sˆ  ÿð‹/bÙþŸ™ëw»¥óï"+Õƒ#5 ÛŽòÆšÿ°wß~J)TëY4¾¿©¶mКÂÉ“©üÁXøã‘5f £G"¥M’¡RŠýû÷³qc§ÅÆcjü³§FlHAïä¾}S«žð;àóü±ãGÑ&;$StLô2 ú¿+€Oääæ8gœ1ÃUZZÆô3ãÅ>‘XißzL¤}pÂ]Z’ˆS³` fñ¸†tS Xð½û™ç]dÚ›íÐ\™™äÌsÂûäLžÔ¥$JmÛXn7C++9ï÷¿cò9KÛ=^)ÅîÝ'ÝgÀÌÆ„ó”Ró:¹ßq7lp{ ø¸†æž ”R,=o)˜€þ©×É@ÿ6X¡”RóçÏ-**,¶FŒÁ{o¿Mà8 R'£!›Ã{ ¸ŠŽâh$ðfOñ¸JYŒºòr¦ÜpÞÒÒž©…ß´ÖèH+Å vÿZ‘P~éEø¶mÿu[ûµ&é²'MìúÈJlé`JVÙùùè6e†µÖlÛ¶5ÞgJÎOKK[P]]RXXˆeY­+ Z”âØe¸ûî;‹Á:t%fª!Óqm^õúòåË÷tá&£§€ÿÒðÛØt@ת:uðÍ;ïäü ÎU@°åùªæwc <‰^"«ú¯Bà ãœsÏ.ª2Ôãp8ˆF£(¥HÏÈ`çŽ]~Ò6ÿ«Àå˜ý’ø$ðGLÙä¸r$ÒGŽ`î]wqúÇ>Š+#’d¸_9xõ5¶>ò©ù¤äætk ßÞâÊÌ$gòd´¥L¹ßH”ÔáÃ(¿îà ¹ø"¬”î'+Û&{ó&¡£Åé¢Ñ(/¼ø"-ÍÍq?O8v¿ÿþZ‡ÏׄeYdddât:?HIqß÷ì³+;}ÌOú5kÖÜÉ••‹õCÌÓ,`&Gç4Ì(ÕÀµ••‹FWVV¾]UUÕ› s‰¶“4|`ww¯’·›_þêWŒ=–Š¡å)/¿üJK]mÝx̶Àk{°½¢ Ù ¨ra†Ø&9óŒì)“§äx<©„Ãa"‘È‘ë5o¼Á–MÇ÷£ ##Û¶ÑZ¹ÖZ““þ={…N^ª»Mç¿Óù'{¶s&p3fßðÎ’¹:•?}sﺓї\Œ3--é’ü”ÃÁî§þÍî¿þÍì?‰P÷λxí5¬7i%%8SSûM `¹\8RRzl„BÙšœ Pm^ŸírcŸ³”‘^HZY)‡×¯'Ò…Ñ­5õõ jóæÍ§gc*oîÀ é³bÅ]ãµæ¯˜|œ®.ÅÍÂÔÕµªªjW›L¶b6ïYFG.¿òJn»ývœ±ÂQ–eQ^^îÈÊNw¯z®Ê îŸÂ(=H€þç:àóC*ÊÝsçÍ-ÉÏ+Pm;ý¶§ÓIaQÛ¶n=áYO,á¯í™2wþ X<„©VW’Ÿ3=_ûof|ùËäŒÕ›íëUƒyÿ°[Ú Þ(E¤ÉÇÁW^¥nãFœ^/©E…8\½Y42A,ÈÚ¶«í¨¥¨>•’Bá”) ?ç´²¨ß²;îʳ;€!˜•Ó­Ë—/w:Ž'0ù8'ÒúìlTÕ ÌX²dñã«V­jéäçÅVLÄ2L± “ééé<öøã¹Í¶m\N. ™ÿ¼õ¶…ù<)‡.zˆýËxà-Ëržþ¹%CÊ+J©vgþÀ‘k¥©iidçæ²sûöNŸ0Öù700:ÿ\LAŸûÄ9…U2>ó﹇ŠÊE8“¹Œ¯¥Øòð#^ýR§gÔJ)ÕÕTWUÑ\]'¿€”¼Ü~•pª”ÖdoÛ†nÓ±+EÃÈ‘h§âòz©X´ˆò ð¨c6¯ÙŒÉè8 ^¤5{ªªª^ïJC’ÐfL p.f$à„ O>õÓ¦Mkw›Öšh4JZjåC†¤î¯Þܼis&/ªó Ñ-ôé˜-is/¸pYј1ã_sM0:ÅŠÿzöÙ玎^¹òV­ªòUV.|ÔGi? ž ê᪪ªÚ®¾ö$´³Ã": Xþ­oqÓW¾Òé{¹µóF£h­)È/TÙ¹™žÿë™&`ð,0þ†½.ùŒÃÇ€;&¥²rQQA~á1güÏBZ;¯×ËÅ_½ì²Ë‚-~´M­µàMÌ:ÿd\êçÄ,§z XHœïUw^³–ßδÏÝHjnnÒvvm)‡ƒCkÖ°ñg?ïz0£QŸC¯¾Fíºõ¸¼^R‹Š°’0?@‡Ã|°â^rS=ä¹])E³¯™þý ùóæàLOoÿ8ÛF)EÑôé ?ï\PŠº-[°“<«”â /8f§A¿ßÏ#<œöÔSOMÃŒìÆÔ­?Feåâ:à`x››ÀUUU;ºóú“Ð;˜Qǹ­™Mœ<™_ýú×íª9¶Õ´^”R;NËõúëo„€9˜ãBr-ßé‡$H¼‰Àÿ8ç%—^T2lè«uÞ¿ãœÛ¡¥‡ƒ«®ºŠx ú­·Þz ¨Ó®!ˆùð]MòùQ˜áÓÿÅ”@ÎŽçA–ËÅèk¯aÁ½÷R:sfo¶¯Ïéh”OþƒÆ L@Ï@J)‚Rý 4ï߇'/O^.*‰FGšwîdߣãpºR^†Ïçcßþýlذ™-[¶jn&ãôñ¤ r샕2ËSS©X´²yó4ÔÓ´cÇ1ùEEE,^\Ùáኗ^z™·ß~ÌÖ¸W“0¥ƒ[1ЪªªŠÊÊE‹iŸ<¨”R¯ZUwÕ¢à b»*@sÿzÉ’% >ü˜7rëq¯càv§P\R쮫« oܰ)“¬ùï>~-Nò|ú¦TLñšÜ+¯º¼hÒÄ)).—«Ó9ÿVm€eË–±råʃ?ûÙÏöcΖÿŠ9ãxø É7L–Š ùÀÄYÍ/sôhfÝ~㯹†”¬¬þ³´¯ug,Ë¢ðŒ3È3†¦Ý»:ß4Àq4oÛNõ /ò5‘V\‚;ë” ¸õ™À¡CZYEsK [6oåƒuرc7uuu„#S kìX2ÇŽ9áȉ’–ŸÏˆsÏ%Ò$vîÂàÀ‘ŸWV.¢¢¢¢ÝçîðáÃüéOnû4 ƒ †aßµ½Ceå¢Ó>@+¥~¿jUÕ`Ûén5P¨aBìäÄ~òÉ'k¯ºêªÔìììc>ã¶m“îÍ 7/'íÝwßm©­©…Ù½t]_¿˜D€Äº˜}ÖÂùóæÍÏÊHÏ8nçG€Y³fqàÀ†¯~õ«µÀ1gûÿGò%üÍÄlÞóÌf 'e¹\Lüìg˜}ûmLœxJbQа¯™õ>HJn.žÜÜ 2† £´r1)……4íØI¤±±{¯Y)t8LÃûk9øÆ´ÖxKKú}~€¶m<ó,v$B8¶ °íë·#Ê.»OQaO«¥1b#—·¬”úí;ˆ66²¨rGß‚JY¼òÊËìØÑé>AnLõÉË0«T6 ÷Üs¯GkûN §Í}£J©ï¬ZUÕµlÄáYL@>ë÷û‡oÛ¶-û¼óÎK÷xf 5iÒé¯×{3íÞÏj¯Rê¾U«V¼r×Àô2fî~/ðü¦M›.œ .L·Ú,U=Q ”"??ß…ó?o½Æ_r´ƒè £ SÈ&åú\S¼Çή{„Røà;ïF‡Ãèh”ú÷ÞcïÊ•8ÒÓI/+ÇrwµÜ±´mãLK£hÖlòϘAÈ×LóÎîïbkòQýâ‹4íÚ…§ O~~ÿQé côhüª ìÚÆŒÃk­ñ”•2úK_ÀSPÐõ`P™< WZS¦·ek»÷U}}=UUUñ–Ζ:ŽËKKK½)))êèãÔ3Ë—/ÿãÉž`ÅŠ;]••K†,ZtÖÂÊÊʳ*+]Y¹hÆâÅ‹ò++‡æÎã{ñÅûÉv )ee¤Ÿ>žÂ¥KvÝ5¤¢OqgDw}=™Û·· jjjyóÍ7»ò4Öž={ÒÖ®]«üþ@ =ÝëOOOw‚~¨ªªêµã=èî»ïÎ\¼¸òÓZó}Ð+@]‡QX‚)¬s5èÿr8K*+ùÏ>{Ѧ瞫Jæ@àpè‰'ž˜sÑE¥•””8áø9mƒ€ÌŒL¼ii«_\í …BS×1# ¢ $è{Ÿ®ž6cšç¢]˜_XX|ÒÎL0}útÞ{コ+VÂ$ËêôÎý—…Ù4äqÌ-®^ÜéMgÆ•3¿úUÒKûц7m)Eã–­¬½÷¾ÎG%”"tø0ûŸ}ަ=»ñ–—‘ÒùZ£”É(9kžâ"wí"ÒÐpJùõk×rðõ×ѶÆ[ZÚò´F9¤•—‘=i"9§OÀ;t¨ { yžúzÒ÷¶ïG´ÍæC‡ÍΆ]ؾ}»sÍš7uMMíþúúúoÙ²ewÇûÝwß½ž… Ïú0f÷Ïkr:ߪ]aê .ךÓ-:륪ªç“¹FþÀðªªªŠ«®º*Ãëõª¶+:^·-‹ž››§Ò¼÷«¯¼ÖŒYjø(0X§WºE€¾5ø‰eYÎ~ìú’±cƳä:ú/(( 777på•W¾‚‰x“If×¾ï` úœ”²,†žs ¾sC++MIÛþÐ uÂŽFùàg?£åD[4+S¦©yÇNöüëßDÂa¼åe¸z0? gŠçÎÅòxhÚ¶  u{Ù`Äç£æ5Ô¬ý§7´ââþS?@kS±‡ßžÆFÒ÷ìi÷7³¦O§àÃWãôz©Ý¼;еjÚZkguuuö–-[®Ætîÿ!V›cÅŠ»3lÛþ p×…§UÀ8¥ÔäÊÊEÿ®ªªJÖB_Ï×ÔÔœ‰D¼K–,I·,«ÓÍÏ:Þæ°äå庚š£›6nvcJ?›è“L$è;àW@éõ¹¶`Á¼³<­…0N6ôït:™9s¦ý¡}hssóŸŸõ]³O™³Dñ˜¡Ì¸2´RËË8ó–[˜rà ¤õŸ¥}QŠCkÞdË/~ÿY·mSÿÞûìyúœ™™¤——õ\~€×KÁŒéäŸy¡@€æmÛ82aÞUJ>S§â¯¯Ã·³[;ü¦z½Þ%gµà†ôôô ǹO f¯¿`–õ¾ŽùÜ—Ñþ¸­€±Ñ¨~«ªªjó1Ï’|5)9Ùý»ã?Bqð7Øóøßº]¥¥×Ô²åJšöìÁ[RBJNΩïâ{/¥WTPͼ;ï$ܸ¤Û¾6½¢‚ìIiܾ£Ë‰bm)¥hÙ¹“=ÿü'á`oi)®ŒŒSn·m,§‹œqã(ž?+#ƒÆM›ÐÁà)ä4SóÆ¿ýÎŒt¼%%=3r‘@v(Äæ‡~ËÐTO»:V8Ì«¿ù=™S&ãÊ6•©µmc¹\äOÅ¢E¸sr¨Ý¼…hËɧâÇÏYg-h„)¥‡#zÿþ}wÜÿ÷n­ªªª}é¥Õí Ï?_]²dñf­õ&Ì´ZÛãwIeåÂ_TU=Ÿìg¾¯ìÞ½û✜œ”9s椵nt¢@kÇ“JFFzêÆ ZjkëF[0E™Ä HÐûn–-\´ õÊ+¯ÌmÝè§Õñæý¦NÊ÷¾÷½o¿ýöËÀ7ú¨½Ý•|Sß`,qôÉ?žß¾Ó.¾gjjo¶¯W¥•–RvöFëßfÛ¦-4TWS0gv»×§m·×KñŒ ‰gª[·î„5.¿ür23Ûïf¨µæ±ÇSÿú׿gb·ÐI)ïU«V±`ÁÜ–åø0ßæG)ÀÃUUÏ<…?C6­\¹ò¼¥K—zÊÊÊ\'š h{ÉÈÈ$5-ųÚLÌÆ”FOæäÈ^'@ï: 3ôïúâ—¾P:aÂD¥Ž3ôßVëÐÿÚµkï¸ãŽ˜¡ÿþZîRaæÝþ \OûíOËr¹˜ô¹™wÇäœ6ªKCÈ¿Ÿ¯‰Ô¼<ìP¸ûéS=ÌrþöÎ;<Žêlû¿3e»zo–›ÜmÜ{·©ÁôN(!!!¤JÊ›7¤È›PC ¡[¶1àŠqï²U¬ÞV«í;3ß³»–À’UÖ¶s_×Z–4š=³;{Îsžç~î[!uÄò/«Ïþý衾«ôéÁ |HÃæÍXÓR±çäDÛÝú™n7À–‘Aö̤Ošˆ¿¹eeß3/†¯¼‚ÚÕk47ã*,Ä’š|Zi³ I¢æíåxöì%7/UU©««§ìÐ!¶|¼ÖV7ÁÚ:rÎ9ûØÁ˜a`ÏÈ `ölr§Ï èóÑvðÓž?£GbÖ¬YŸÚýøá:>øà0ËgS1‰NÌ@ S›ßêÕkôÅ‹GgŸIé©•+K«úýbœz”™+W®,¹á†’UUÇZô?ù½$I¤¤¤ÈÁpÐØ³{¯ÀäK|V èŸ'±ÔÞí_ûJæ9KϳZ­æÄÑ]Ë€Åb!333|þùç׆q?ðáIwoÜ‹éÜ7¨' „ þæ>ú0Ã.\†¤*½bS YæÈÚ÷y릛PN2ÆŽA¶Z1´‹4 »¬)SÈš=‹`»_E…Ù²ÖÇt{¸¹…š+ñTWcËÈLŒ‹_”à,( wÎ\œÃ†à9\N¸¥¥_úm»vQûÁ€³°0!™‹“…–¶àÛ€ÚÚ:vìÚEYÙaêëñûM[ !I䜽ôSvÃqD_Óä¢"ŠæÏ'mäÜGŽh8*×1þ<ŠŠŠÐ£÷¼‚ææfþùϧ?¹)paÚ`_€É’?€¹;æ7¿ù½|7Ã:@ü©´´´ºÿ¯Ä€À:·Û}Õju.Z´È‰DºÜùwü¹Íf')Ùeß³g¯¯Å,|ÖÐ > Nn.[¸h¾ý†oJÏÍÉëqêÔ¨Q<úè£õ[·n]<|r†Û+Ș‚>ÿ.£§‚>))Lþæ7˜z×$›‹b/¡Øl¬ûéÏpïÝGÕš5|ã?¤JÚ°af 1PÈh†55•¼ùóH;–öÊJBM}>ßár޼ý!¿g^ÔÅ/BB’¢2|8y  ¦¦ÒºsF8ÜgB£æ5ù ›6£¦¦àÌÏðü!¡¶6š?\¦i`ð©@È’“Máe7ø2¢¯iúÈ‘/]‚37—ú;1–.]‚½C©KUUÖ­[Ç]:gb 0K‡fÍš¡bÞ;kt¿*-ý¯1ŠÛß{k—.]j/((P»â|º„Õ¦Z?xÿC&aòy¢ÁÓg茒<ý¯C1ð¦,Ëö_ÿö±¢óÉš¦‰DÐ4í˜]×ÉÈÈ`ß¾}m×^{m%¦aЧ”ÃN1a¶õÝDÓýB†^z ã¾ðÒKJÐû¸[’D㎼~啟úyÞ¼¹Ì¸÷^2F"ìõöéü' B"?Õ¥«9ð÷§ÔÔôOgß0PÓÓzýu,Z„%==1OtLÞÊJ½ú*U/¼ý!dBVȘ1a×_OÚ˜Ñýã DÈíf×Âø0ŸœH„’{¿crzñZÇÞg÷áÃzíß\˜™ALÿ ‰ð‡?üºº•îÀòk®¹úù±cÇþ Ó>;†r`êü Ûàᇶéº6Ü0ŒiBˆâè9B ÁÇŠ¢ìüÞ÷îôøO<(..þÒºuëŠE‘H„ž¶œfÜ÷}ÆÝ|sÿ}„à½{諒òeNÃÀS^ξç_ àv“5aŠõXV§1~@îÂHV+퇣}ç4®[OãÖ­¨ÉI8rr-jBêîÖÔT²§N%}ú4|MMø+úÈÂäTVR»j–\ƒŠ°$õ¨9ä¤C±ÛI;†öÃå„ëÍ9Ö–›ÅåäŸnŸ7[z:ƒJJH¯ê|ï¶¶¶²bÅÊ9dÈeVI’:f—§¦¦üýÍ7ßúÔ†ªÊ…‹/ºË0Œ?ßB\ŠYb˜Ì.®ÓuýüÅ‹y.\phÕªUá¾\k‚±Áív.99Ù5þ|g8î²Ð1+`³Úp:öm[·Å‚61ð6S§Ÿ‰Ç%À­Ó¦OµÞzë­™¹9yvø±Gì{ó†5VPPÀã?^¿qãÆ5ÀOõ…tÀpLÃïÑ™yÜ-J®¹šù¤˜´Ù³(¾þZ²æÍé_{ªa`w·~Je°®®Ž>ÚÒ«S•——ËnwŠ"ãp8°X,ºâá{îùÎŽOûÐC%­Y³úNL>Ò…˜ú]]ˆ3Ãw…bÔâŋז––žjŸ°kÕªUËÎ;ï<{zzºÚ1‹ÛñÇæÔŽs­Ë™„Ýaµ¬_·¡SñiNµ“‚Ï€Ä"x°Ýûýoçž5a’lÄoÈOGv»²²2ï÷¾÷½LàÞËÊ%*¦léß0?@=ô).fî#3æúë±&''d!Žøý¼ÿÃá­î†ã$ã¿z#¯¸b`·¢Ö´4rçÍ%eÌ|õukëú ‹Ÿ“¾ôå[R/üÜ2—ÕjÞ”Gšvì2€Óé4n¾ùæZÇó;FëÊẌùôpò²Ì¨n`ÞÑ9~|Â&²ª²ÿÕרûôÓÝ—\Rœ<`*ÓBà*,$oÁì´>L¸¯.~†AÛÎÔ¾÷:μ|T§3mƒ²ÕJúرœ½M’hÛ¾=jnÔGåÖjW­¡uß^\E…س²ú7Æ!°77㬮>Ò´iäß|3²ÃAÖ-½z¯ ÃÀëõ²gÏÑØØ¸“,Ø|䑇òuÝx˜G] €"Ã`°Ë•ü¯}ûööá ÅÆºººK ãÆ³‡B!"Z„ˆA‹?:f0`±Xq:Ž?Xç ‡Ãg+9ý\TO> ‡9À÷ ªwÝùÍœ¼Ü4=‘ê~“ͪ£ëæ×””d^~ùå¦7ß|s¦gÀ©4õpa.úÅÜô©ãÆ1sÝ5(6{Ÿþ]ÁW_Ïû?z°[•=IU™ýàÉ=zà¥þ»C”1ž:j$9óç!;x—£ùý}N·ÇvÙ[·¡88rs­Ö„ŠËEδidÍ™ƒ¿µß¡Ã}ç`૪¢úÝÝn\ŃL~ÀéôþõVOÎ#G„ ™Exè`ò¦MgÐÒ%Û½´îÛ×—ÓK@p‰Åb™9gÎì„ftql3&1î!xD)àréL,(ÉÏÏ_[ZZz¸/ƒJ B@õòåË_|ñÅN»Ã.k‘z|Ñ×ÑôÎ¥ÖØüët:…+Ù¥|´y‹scóü)¾–ƒÏ€ÄÀüúÃÝŸ=qâdL‹Xófì˜ú×â5]7-Ú›‚_ÿú×1ÿòSt ¦zÖS˜iÿÉòÉnû ³¾/é#G&ܵOR¶þé/T-§Ûã_x!ã¿psBŸû¤Â0L•¾É“Éš6°?€·²¢Ÿü€&jW­Â]^Ž5={vVÂÒíöÌ ò-$eü8Zvïé3?@¡i´îÜEÍÊR$›WQQBœ,>®ÊÊÎNƒéix³sSHhðÒ%äLFÓ¾}{ßÑ'„o¸áóó²² Á•i0 ‘eqëý÷ÿà©ÒÒÒ÷W®,ÝRZZºîì³—¼`Ƈ˜„ÀN>B ¼²mÛ¶Þ_tb±8Ëãñ,\°0) ‰-þš†®é²­z<ã*„DJj²¥¹¹%XUY•x1-™Ïx|$÷K®½þjçe—]‘jµÚ¢èѿ֡ÞË †ŽÕfåù¿õeee¯:EãÏÀtîvœcMAÁâÅÌyðÇ ¿ðBSð%Á‹¿$šwïaÝ#¢ü]gËËcΈ=³7vê†5=œ¹³I;_C=þšÚ>—„ø+*©YYJÀ݆='Ç4ZJ\……Ö¼þ¸ÏúB´@€Æ×Q¿qÖÌ yy‹Ð\ÑÙ=0ì÷ã.*BŠé$ARQ!Ã/ZFÒàbj6mFö¼…}ôèÑ,Y²ØÔ2è]×I’tå]w}õ™¥KÏoÿäß­X±Ò(---_¼xÑ.àót.dde¥ÿaåÊѰe÷îÝWžuÖY¶¼¼|‹1Óÿ~­Ó¦Ëœo-ª…”T—mÍêµ` ¦ÃbÛ)¾–SŽÏ€þc ð —Ë©Üwß½y¹¹ù¢#E×ttÃÀøDZÊ”®”ÙòÑÏïÿûzLâßÉ&ÛH˜ZÇôéQ’”{îfòw\TÔ­¬q¿ ë¬ÿùÏi>ÎÎcÂW¾Ìà³—ö/u,„ÙB7@¸ƒq•¾ùóqà=r„PSsßÓíºŽ{×.êÖ®EÓ4œ…‰ãHŠBÚ¨‘äŸ{º$hÛ½§ÏʇÄ3«q—ÄYXˆ-#c`“:{CÓ¨þ÷(’¥ÎNƒMlzgéS&#©jüç’¢9f Ö-Cq8høxk²kŸÿüõ„†L“¡0Ï=÷|ðùç_ØýÈ#¿(£«ÜÅ‹—Ô€q³vÃ+--Äd7`Y¿~ýY]tQ²$IÂLûñR€¡2®ºaη‡SJJrJÛ·íˆ`jµ¼vНå”ã³àø,n¾|Óàç.Ì”ýµ€üÀïÏšß%éééÎÑ£G9"-¾±:Zr=¢›¯¸mpªµ²²ÊßÐÐ0S0˜€™ùÌÇ4:Õ]' ŸÇF&fëÌ/0mmçcÞ ©ªªZ† j;kâÛÐ!C¬ªÅ"Ï™;ÓzÕUW¦Y,6“ÙofDªëѺTTºR7âÑ)Þzë­–Õ«WïÁtÑ;YÄ?i4ò ædУUÜ’–ÆŒ`—¾ˆ#³ÇR}F¸½÷ü Þ#]{›H²Ì´ï}—ì³ÎêÝ&B’‰øýÔnÜć?ÌÖÇgÿk¯‘4hi%%æù -ª9yYÓ§Ñ4¼e‡úå/jj¢nÍ{¸ËÊ¢ü€ìĤۣ-Žù‹‘f¶o2f{]5zãçÌ™%kšöUL#ø%*--­KÀË‘h@åºuëÎY¼x±Óérʺ¦Å³¬Ÿì²ŠÍɆ®£Z,df¥[Þ_û“¸}>¦°ÙùÀŘ™Ø[0çülÌ®ŠÖSs™'§_8}b‘ |¸Žh:|áâösÏ=×–ŸŸïÊËÍSŠ¢ s²Ô -¢!$Ñi’Ó;¥¡ôx4#9R¾õÖ[« Ãø2ðîIº¾aÀÏ0oôž‰³ Á°Ë.eÒíwTßgßÞ@VUv>õÖÿä'ÝW¸d1 ñ s{!@’ˆø|´ìÛOõÆ ìû׋xË;s.…$‘=}3ﻬñ㤬°¡i4~¼•ƒÏŒ‡~È¥ëú>Ìq -B0ñþûPq¬“œB<µlÙ²¥·ßq{®¡º®"ñòkG>€¦iºA0dÏž=^!DX Ì9\ÓñùÚ½{öEÖ¯ßàD"±˶b껼Áiåqy||Å…Àƒ@ªÃa—¾ö;R¦L™šœ›“+¹œ.ì6;6«EQ: y€9…#aÁ ^¯—`0ÂìÓXtTþ Cüñ¬}ã7Vן„k³b–*ÆÜôŽAEL¿çŠ.쿺\O!ÞšÞüÂñVtÝ¡$%qöÿ@ΤI]–„$!$‰öêjÚ**9¼ü*Þ]¿¶ö¸ÃT…×\ÃÄÛoÇ™“CÄçPŸ!ID¼^jÖ¾OÙsÏâݰ_†®cÍÊdÐ¥—RtþyØ23V ’„¿¾ž²_¢ò¥WЃ~Y#ËdΞͰk¯&uÔ(ó\8’DÅ˯Rõï2c£$'1éw¿î±†…$¼µµì~æYv?õ¹éiÜr˱XŽ&ôü~?¿ýíoq»Ëu«ÃìþùíÏþ³Â`0XJç Â&EQçÜ{。cÿù)Ãàõ_üâ£FrĉÑ–@=Ö-¹Æ6_B’°ÛlX­VdY†èüí÷ûiooÇðÓÒÒ¢×ÖÖxÖ¯[ïÛ¶mGŒ3qxXsê.9±ø¬`¦ÀÜ-„°}ý›·§Þ}ÏÝ9gM˜hT4HääääJÂb± Ë s§/b"(BBEQ±Ûì¤$§àr¹Ð5ƒ€ß¡ƒÖA£:ÑØ¾m»ÿüc3p;'V”B`Ö·þ†É_è‘ ¤(Œ¸î:æýä'äLœx‡wìçÞò›ßQ½fu·Ç¸æjF^~yç‰_„$ah:íUUT®]ËÖ?ü‘u>È_¤iÛv"íŸ"@†®Ó¸m{_xÕå"cÌ$‹e`ñT•”%äΙƒœä2ýúÍØLÃG!Ùl8ó ±ËŽò²¦O'kæ üMÍøé'? œšwß%ÔîÁYP`îœ*? zýï€:Æjä^|!é“'õꜪÓIÁ¬™.˜OR0HINN§CY»¶Gv".L×¼e™s32Ò‹dYîøb.¿ï¾û_ìùàNš€œššš‘³gÍNV%®·bèFòµÕj!?¯€âAÅ <˜œì2Ó3HKK#-5•ÌŒ rsrT4ˆü¼Sf-Bn7­ee”½ñ&ëö3¶üêÿQñÎ;¸÷ïï×¢­CT­ZMÙo’2dÉEEk·ãLšDÖ¬™hš†çÀÁ~ñÂ--Ô¯yÖû±efâÈÉéŸ+`‡±Ú22È_¸”Ñ#i;\N¸¹¹Ïã44ÝÔ(]…Pdœùù(öÉWœtXRR°ädÓ²é#è ¥lhÉÇ3䦛úÌm°geQ4dh'!UU•lßþ){€î¾{÷îÂúúú°Ífõ¤¥¥y„vàÒÒÒý}܉ÇÖúúúkŠ‹‹íùV ÃÜñGÉÖ‡“%% 2””äd¬ H)¶‰ÃœÇ‘$„$$j±”œBA~ùùùØmv¥  À5fÜhû‘ªª`[›g4p.&qû´n%<“æÎxêÙç.µ}ûÛwçå窃‹‡ž‘Ì›Ã\û£ ?‚I˜ÙI|*00!„DJÔ³½½ÝC(b݇ëÛ_zé¥6à@Í º¶™˜­}_ÀŒî Ùfcüm_aÚ·¾EzIÉ V÷04u?Jëž=]$S¾u…sçâoj¢nËv>õëý)»Ÿ|’êµkñ×Õ%n‘kF¹3¦“\<Gff§v­ƒ(ù.gÆ Ò&L àv㫨è{ª]üUG¨-]…·¶gAÖÙ !p Dþ’%X²³hÛ¿ˆ××çÌ…д~õ›6¡¦¥áÌÍ5ߣ¨ÎAE¤M™ŒœšŠ°X° *¢è†ë(¾êÊ~ËWÛ›qÔÔÄI’¨©©açÎ]½:a444ÈÛ¶mSöìÙSž——·2%%å¯À +øy÷îÝ“çΓl³Û„®C‡ exI v‡£Ã&ÎüÇä]HHÑD®ÄÑ9]ŠÎï’$°Zmäåå‘••M8V&LŸ¬ZÔÈý]ÀE˜™€Þ+6  М٠‡À”ºÙå—Ø?Ãçs]Î$† †Åjít“:tˆ²ƒelÛ¶êêj‚Á`ÔbS%//—±cÇQR2œaÇ#G YF”En``ÐÖÖÆáòCìß òëÇ][VV¶Ó^·ç*ÇG*ð}à˘€!oþ<¦Üy'£F|‡Ô3HªÊ¡7ßbõ·¾ÕíŽÝ–•ÅØ›o¢qÇN*W¬è6SП±¤O˜ÀÈ+® mø0R‡ Cu¹ÐÃAåø²LÄç£víZ>ý,ÞúÅ@×±df2èÒK(ºàüÄòd_m‡^z‘ªë7:x IDATWÿîóõ=Û` 2gÍbص×:z ’"ŸÔ,Öñ „À€¦½Îþ~Þ„ }ß>Ò·o?ú#`ë¡C¼ü¯‰´õk“Ú‚Ù1ôsNJéñ0ø¿;î¸#cΜÙÉV›•‘#FáèT™ÊÓÑ6l#î£ÐÜÜŒßoÚrÛí6ÒÓÓ±ZÍLL4A`Vª€P(ÌÇo¡¡±žõÖ»Ÿ{æ…fÌ«1U O;œ©Àw€Ûæ/˜kýú7¿žç´9EÉð¨ªOå†ÁŽÛyíµ×HIN¡¸x0™™¸\IÄ|¸Ã¡0mž6Ù»o/^¯—‹.¾ˆ©S¦ ( Äo6 O{;‡—±cûÎðÃ?\íóù^ÀÔHFb¦ûÒÃ÷U¶Z™rÏ= ¿hª«G‰‚†ÇÃ[_ú2-;¶ÿà[NÃ/»”ÜI“È;[ZZ”OÐýBghBQd=2°J‚’,ãol¤êåzöYÂ-­ýjõ3tÇ! »þZòæÍ35´¸ Y¦uÏö?õš>ü#Ò7 ds Âb¡ð’‹|Ñ2œ……ñŸÿ·"­¬ŒŒ-[޾f†Aó¤Iì…Øþç?S¹beØ]˜寒ØMK1xeÉ’%¹W_suvvv–Y2ÒÔZˆfm 0“¹©®fÇŽlܸ]3ÈÎÎFUU Ý ÝÛN}}=É)É̘11£Çž‘ÑMœn˜Ü‚íÛ·QW_ˆ ÜOÿóÙfÌVÊe ×^áL,L~–œœ,ÿàG÷åÛ,ièà¡XTK´õÛ ¹©‰¿þõ¯4ÔÕ3mê4FŒIVvIIIX¬6T‹ŠÅjÃf·“”œLVV™ºÁ¶mÛXûþû 2§Óeþ›DEQ$E•åÌÌ,Ëúõë‹0ÛoúY˘m‹Oaþz4k,YÌÂÿý_-ZtÊSÚ²ª²ëÿ¤ì•—OÞsZ,dϜɄ/ßÊ”oÝŤÛn£hþ|’;úÔgÁ’DýÖ­¼ûµ;H9Š”!CT`DÉg&={6ºnàÙÛ'£ÀܽFÜnê×¼GËž=ز³päå&j°Ø23É[¸€ä‘#ñTVjl쳚 ºŽ{çNªW¬EÁYo¦ÙÿKƒ«ÇÓÉi!§¦bŒàŋÉ?Ou5þºú¾¾Y˜‹\>°S0çTCžš0aÂÐ믿.777G” 37r±¹Ü0·ý4Ô×óü /°eË2Ò3˜:y*'NdØðᦸ¸˜áÃK?n<9Ù9lÞ¼™7ßz ·ÛM^^žPDÏ™™™E[›‡ŒŒt›ÝnÕöìÞkÅìH8í”ÏÄà ûÁ‡~˜“kÍËÉÇåJŠïÒ>Ì_þò'œEÉð\ÉI¨Õ$ŠŽ\€£'’@UUBá0®¤$„ÿùÏÈÉÉ&++ ]3ÌÔ“®c³Z †‚ØvÕïóGÊÊÊ&`Öëûò©LÅLÍýHïþP–Œ fÜ?SîøšiÁzŠÓ£BÜåå|øàCDÚ='ôyÔ´4F^s5gÝ~;S¾õ-Æ\{ ™cÇbKMER”^ïf…$±çùç©xëm¼ü Íûö“5a<ΜôPxàä× kj*Ù3¦“>eŠÉ8\Þ/~@ ºšÚ•¥xkjpš–`~À¢EXsrð:DÄãé;? ¤iÃFê7oFMNÆ‘››˜Î†!}>’?a4ä‡iËÎA¶ÛH<˜â¥KqæçÓZQA¨µOÚ6 ¦Žþ2ÌŒÀáD ¿øŠ¢(—Þzë­yÆ‘‡ŠÕj‹g](!ðÃ×ñÊ+¯2aÂ&ž5‘ìì.ªÅ‚"ËȲ‚¬ÈȲŒ¢*8œN¬+©É)ÔÖÖòö[o‘“›KfFF\d)3=ƒºúzŠŠ uuuþÚšÚ"Ì×ã”û&÷gZ° ¸á¼ αŸ{Þ¹iЬ’—›¿Y***xöÙgYºx1™YYØlv„,!! Fúë@ì8ÃK²DK³‹ÕŠÍf'ÉåbÅÊdge“™™ L…@»ÍŽ×׎Åb±}ðÁ‡B×õz ·¹ïñ˜$Æ+蚟$†\t y˜‚9sLË”d6ýê1êÖ}˜øsË29³f1榙|×LþÚ×(^º”äÂB“-ÞOµ?Oe%«ï¼ËüÆ0hÝ¿Ÿ½Ï?®idއêp ¨¶AG^9sçà:Oe%áææ>ÛºNÛ¾ýÔ®Zƒ¦EpBq$È_@UI3†œyó@–i?t=ìóXÃMÍÔ­Zûð!ìYÙØ33M^ÄA `è:•Oý“"§!ŽuÁº:>ZYJê„ H ²ÕJÖøñ Z¸Éj£åð!t—¶Ý!ø&ïc:( žD¤¸òÊ+sfÍžáÈË- %9å¨/‰aöý¿úêkÔ××±háb223°Ùífï¿017:e „aÞcºN—‹”¤$V¯6Û’ dÞŸB"))‰ÚºZ† j]¹b•˜Ž¹™8iÀãàL þy×ÝßÌVe‹R”_„¢˜©ÖÖžúÇS,Y¼„´4“"E[C„$! ©C@aòÌö>Àw›MÓ«ÕJ’ÓÅ»+ÞeäÈ‘8®8EaúXš õ`.æ=‚¹èÿ384|83¸Ÿ _¼[zú€!EI²Lí¦MlþŸ_bDK°+¹æ–üæ×Œ¾ú*r&M––†¤ª‰«Y+2›{œæO´Y‘µëֱq^RrâÌ’úÃ@’eRJ†“·`>jZî½{1Á>·ãéM›6S¿~jJ΂‚cKÚöa¬ªÓIöôédLJ¨½_eeßZ£ÜeÕï,'ÐÞŽ#/k´Kçt…$êß{ŸªçÿÅÈ‘#ÌÅ ó}QT•«ßCw8H3:ðZ’’ÈŸ5‹ü3xÊËû¨:€ó0âµÀÉ º3??Þe—_–•››+ òL;ÃÀ$^믿þo4McÚÔi8œNd5zOÆŽ1Ž…Žâníí^,ªŠÍæ %9‰¶lF’d ò 1 ‹j% !$!'%9õ;vI€Ø|’_‹>ãL Æߘ6cšõsŸ» M2YÙf¤¨ë<ÿüsL2•ììl,ÑÅ_’Dü«%3 €£Iûh¡­­ˆf’,£ª¬ ®û€©“§ „„¡›¥UUñ´{ðûýʆõ$àL2Iw°c’×ûVÈ2£o¼YÜOΤ^ˆŒœ$h¡>ômöúo—¾ÎŸ7—ÁK–Dƒ´" ëÈ6Æ“3gº$Ѷ§ïÙKS? •ºÕïѼ{7öÜ\쟦é3 [f¹óæ’n,íuu¦Bfï^LÅ$â­àä‘Uà±sÏ=7wÒ䉶üÜ|lVÑ• ƒ-[¶PYUÅôéÓ±;œQµH:-ú"Ö/íŠh,h¶¶µ{’„¢*Øl6\Nïð>ƒ‹‹INN6=ìŽTW‘—Ÿg{û­ån S[æ´À™ÜLÿêí_NMNJ¶f¤fb³Z1€½{÷àñx9r$v§I–‘d I’‘dÙÌH2’ˆ þDÓF@|÷‡p¦­%ýµ4· „  ??.$ø~"‘°TQQljjªº“íÊÃ÷9®bˆ5;›™?øcoø¼¹Ë »þdU¥ì?o°ë¯íñ¤#ÛídOÊÔ{îfÜ¿HíÇlj:汎Ü\†œsÎ Ù}¼ÿ£ã9t¨Û㲦OcÊwôÈ«à”!Ƙ6Œ©S ¸[ûΈ.ÈêjjV–â«oÀ5¨kjjBùy‹bËÍ¥½¼œ°ÛÝç±êÁM6P·aj’ G~þiÇ’ öå„êhllbÛ¶ìܵ‡ÊÊ*ZZÝæAZ„œsÏ9æ}(d™Ô!C(^²Wa!mUU››{3 “|<SçÄyŽâ|EQ.»è¢e™…ùR~vTÝ<ú¾µ´¶ò̳Ï0gÎ\\.²¬D5I"æ¿`ö÷Å)&ñnj´y<ñ9_V,V+›÷־ǔÉSd“7ðûQTY„BÁÈ-˜Þ‡OÂëÐoœIÀ}@Ö7}>[Ót‘—g¦òuƒW^}…I“'áJJF–edEF’ddYŠÒ§wFçÿ†A›§ M‹ÄëIŠª" X¿a=3§Ï0S¦FÌ%PÃëm55µáƒZ1ÓúÇBð4p)æ®[äÍŸÏüG¡`Îìþ™¯œ@ššXû£ 6v­„,d™äaÃ8ëöÛûÅ[˜ñÝï2òÊ+I+)Áž‘AÙëÿÆ×…®¿-+“á]”ðÉ\È2GÞ[˶ßÿ¾Ûs«©©Ìäa’b-hq~@.9sçT2œöÊ*ÂMM}fášFÛž=Ô¬Z¦Ep„š~œ0šœ¹sÀ¢â=\ŽôÐÚJ]é*܇cÏÊž•uÚð„xËËiß½ €¦i8J&ìŃÈ=ç쮵 Ùj%sÜ8ŠæÏ#Ѽcgo‡R‚Ùaõ6'ÞN÷‹“'Ož>cæ W~np:b-ÌðÎÛo““›Czz†¹"nÞvT§-Hæë%q45gòx<ñ¹_ªª ¨ mn7 ÈËËÝä465’–žÊªÒ5^Lm€îµÌ ïyZ@J233äÔ´TIUTÀ¬ÃW×ÔàJNBVÂá0@€@ H8&1þ´˜¹„®Gëh˜Ñ#G¿ý_tà `€$$\®$ìv;e‡ËÐt MÓˆh³D`·âr¹lÀŽ/‹Ž{‘ŠÂØ/}‰ùüF_sMbvZ'B’hÝ€zÍ×u+±5;›Ù?xGVÖ±[!¨Ý´©ËŠ‚Ñ×_o¦tIQØ÷âKü׿º=.u̦ûÛ(öÓË·>Ã@¶ÙH7ŽÜùóÐÏž=ýóhm¥î½µ´ìÚ#7{vvbר¿@Μ9¤Œ¿±uu¿ÚvíæÈŠ• Ë8 ö£7¥$BA?dòäIèºfftvŸ‡¦¦f6nØØfÆ ƈ+^À$Ùt‹ŒI“˜÷àÉŸ1sÀïXÀ`ý£?¥iëÇÝ5î‹·0ô¼óºœ|$E¡fã&>ú蘿×ÃaF]w=ªÓÙïÇà­©aÍ÷¾GÄÛu†SRUf|ÿûd7 Á0°¤¤5u S§hó˜þÐ7>Q~ÀªUøpäw›ÅéÕé¥(?`ÞÒæ¸“6m*JFjfIãÆRxÍU\p^Ÿ…¾2Ç#©¸˜š Ð{—MI\Û§'î“+ç/˜—VTT(ÅZÿŒ¨ÐK/½LFzv»=º¸KUÈ2¾C‡ÙúƒQ5レôqã²4àÞ_C×q .&iØPô(ˆ/\}Ű‹.Ä–žÆûþ_EEOÿLÁ4;Û¼Ûç'?62UU•l6›’D8Ž·f‡ÃaÊ+Ê)(( ›[ÒüGÜŠ¢Äwözlq×cÞ-Á`Ð,ùbæpcô@ÓCH2Kºe™2e2FTå5“——»Ñ²|Ý'gJ ȲW‡ŠhB@8¡½½ÝÐã }§‡U‰Rä¸j”¢(ó{׃®ëñš‘0Ì›2n*Õ (²- ë\1¢ª X‡9^Í_Æ~鋜uÛm¨vû€_üBn7~úh·r¹B–÷…›qæät_g7 ,ÇÙÝF‚zþ%Aöíì{á…n³¤§3î _0ÙÖt§ØWš†PUòæÏ#cªV¼ËÁ¿ÿÃÜe÷¥, IDÜmìÿÓŸ©~û†Ýp=¹sçš–¸ý|íôH[f&£¾ôEòÌçà³ÏQûî „IÒéýX…æ>dýÚ÷)ºü2†^v)ÎAƒÌ `½Ï†a`D?[‰•¡é̞͟ý”•ߺ›@M LmÀï€YÀ±[uú‡Åb‘b÷\D‹ÄZÝîV"š™Å ƒÑ­WgÇVS+@Çj±Æ×ƒX¤Ç&cÃÀð£i‘£/¤2_‹…úúz"ÑòpÌ8ÖåŠÏI‰K=ž@œ)$@€ÏçC’„YÃ'Vï1ðù¼´··w~x¢¯‡ööv¼žvÚ=^¼ý¿§­-ê*å' ½!âQ§iOiDSHztù7]× „B!“={1¦›_×0ù®»˜üµ¯™Ä¸4 uÅá`ÛOâ­¬êö¸¼9³)^²¤GF‹+©Ûß{ëêz5Æ® G4>úÍo»å,Œ¸ür2ÇŽP‹B¢aè:–”d†^~9s~÷[Н¾ª_Œy!¾òr¶?òS6Þw?Í[·&,p34”áÙxï÷˜ö??'uÒÄøÙ§±J•/¾Äû_½ýÿ|†ÛH„àчadOœÈ¢_þjjjoþ´xˆÄŠb뺮£išV‹~O»· †‚&ù/$ ľðûýøý|~|—¯ëºÉËÒtôˆ†®ix½ÞøÿuMCDÐ4 -A×4$I2».t ÝÐÃ4‰Ó㟃•"êÿýw¯‰€ššZ]–"á±ÐNQ‚Á šnf$IB–¢_cYEF–dsç¯È¨Šj-„5 Ÿß‡¢((aEUQd9žvQ÷@!‰¸RW -‚»Õ­G"°?Ä$º’ª2ëÁSrÉ%nÒ$E¡üÝwÙþ‡?t{œl³1þ–[PÎã¦X ]Ç’Ü}ŽjÈ÷'@ŠLÅ;¥Ô¬í¾œ™4l#¯¾ŠÄí½.b;&GA>coû ù ràÙgi\½Æ< /üàuóGlÚ±“œ³—2ôÊ+H*.Ž=aßǪë!Èš>´1c8²²”²gžÅ_QÑ'‹d!Ihí^öýîwY¾œ7ÝHÞüy}ßéC×É2…ß¿—µßý^oÞ“›0Ê>HÐP|¡PH¦ÑÚ'~ ‡…BBAˆ5qDwïZ4PÐ"óa±`±¨¦N@\ÕÕ  ãmo?š¥%ªÐÁ&£Æ”è†xòƒNt+dBp¦;}ó¦M«¯¹¿ï¨þuJJ2m­mx<”¨èÏÑ@@ê\ˆЬ ªjÜ@ÂÝ*ªj‘j”# 05Ó½>/Y™Yt\ Ãä"TVV†£¿˜Œéê"$Eaúý÷1|Ù²Wƒìþæf6?öØq+>ï\r§LíñµO`Ç[W‡PŒ~Ø †Z[ÙüØcÝf$„$1îÆI*(8­Þ—þ"v­icF3ùþûi8g#ûž|ïƒê­½€è¡5¯ÿ‡†5ï1øÚ«):÷\¬‰àD"È6ƒ/¾ˆìÓ9üÊ«T¼ô2š×Û'~€¤(øËÊh?r¤_ã: G" 9ï<ö¿ò uôØ»#¦^z5‰‘ ®Ô4MollÔ"á°Üq>UTÅ\ü,VëQòŸ0Óþf+·v”„­™5ºa‹eš[š †:“…ˆ©ÂšA@Àï'%5•Øók‘0V›…ƒe‡b)¦þ8¼ž4œ)€¨=°¿,ßçóÁPPÄ4ù Ù\ûííí¨ªéú'Éæâ’¥Î€ª˜‹¿¢ª%Œ(ªŠ‰Ä€H4B†himaÄÈ’Nƒ ƒx½íÔÖÖ€vàªî.¢äš«)¹øbúÑï| `MNæü'Ÿ¤ìÍ·ØðÐCÇô%WSR{óÍ ÷üÚâ¶½]À[SÓ/DIUØ÷Ò+Ç•*Κ6Áç{F-þaè:’"“;w6ég§ze)ž|’pK«y¯öBñx8ðÇ?SõŸ7(¹ù&rçÌAŽ8õz8Œ-3“Ñ_¾•ü… 8øü Ô½³¼OÜKNÅçŸÏ`œ ²ŒÅå:þq0S.¸¿Ø D*Ê+CM³hšϪ&%%!É>Ÿ/ÄêþÄ%ØuM7u"†ff"ᰙݕ$"šFCc‘H$þžÆÎc® 2š¦áñx(ê ò …q8í¬ÿp½p­'gJ ˜B;æÎ›cu8쪪ZP‹ÕÂÎ;p»[Ñu­Sû_8!mŒD"D´H\Ä'–JjooöõGÑš”ýÞÐu¼žv:ÄôéÓHJ:š¶n÷¶søÐaíýµ´ù|¾0¼«ÁgϘÁŒï|KròIx©Ùb!kìX†]r1XT>ÚÒé÷£®¿ž’^*÷…½^öüóé.ï*.fh?æ¶Ê Þ»ïþnkÿ²ÍÆÌûî#}Dɳt‰¨¢\Ú¨Qä.Zˆ¡(xöí3³'}Té‹´µQ¿ö}ZvïÁž“=;»_=þÇjËÌ$gÖLRÆŒÆÛÐ@ º¦ççÖuÆÜ}écÆœ1ï»azã vþå‰Þ~¦dÀ<Ÿ€aèÀ…V«5kÜø±ŽääÔh›£¢(”——ãnuc³™~.±qÇÛù0âo—Þ? Ekýnw+nw«Y"ˆý<:ǃŸª#G7aiii躎»­…P8¤?÷Ì -˜AÊ?p­'gR Ë컘:mŠ3èb·Û±Z­©®Æïàik‹×‰"Ñ>½ B¡MMM¸ÝnÚÛÛ ƒqÍ£ÃÂß)0 Âá0ÍMMCAæÏŸ×‰1ÝÜÒÈûk?}üñV7„ù!ù„$1ëþ+f—‹‚Y³(\´ö†zÚ—#) ³ò éYÐ „}>ö<ýt×Z6#.»¬Oã²Ä¦_þІM›º=nȲeŒùüç¬äò)a º\dMJæÌ™¦¿@EEL*³wçŠﯮ¦öÝxq`MM€‹_T£ÃU\LÞÜ9Ø ðTVnu÷ýL™<‘Q7!Ÿ<êh†£ì?o°î¡‡Ð}².^£³ÐY_‘‰D¦Ž5™•%ÙíŽø/$Ifýºõ$''U2Œ*µÅÄÛ0b}ÿѲ@Äœãƒá ÕGŽ˜ó”ì§GÝ0âA@[«›Ê#GXºt ²,ã÷û0Щ¬¬ò”®\ížÖ%à:O8Δ˜ý¨¯¼ô—\rQz8‘SôT$IfÊ”)ÔT×à÷ûÍ4´ÖKù´µµ±ÿþx&@’$l6ÉÉÉ”””••…ªiD¢-J$‚¢ªD"BÕÕÕœsÎÙ&¿ßGsS³±qãfa^º‘Ïü¹Ï‘;­çµñÓ™cưô±Ç¨zo-UkÖÜÍ|Åá0 –]Ôç-ÍD‚Á^« I¢î£-”½új·ÇÙ²³wãHªrÚf GôõH-Δþ€ú›‘4Ç IDATØÿÄ“´ïßßg5A]ÓL~ÀªÕ ¾þZŠÎ9kFz§çëÓP5 ÅédðEËÈž>ïý›ÊW^Ak÷{¬†ÁˆoB¶YO‹œ~AZËÊØþ×ÿ£ì¥—º}%IŠ÷Î.à ×&ÇÀ»ç«›7}5j¤3-5=>·–” Ǧ3«kûÖ:dh£ˆ¦Q"´yÚhii¡½½ŸÏ‹,ˤ§¥‘–šíæ:šþ×e™°×K}C=Ó¦MÅW|>/®¤$^{åõöèøÞJÀ5žœI0{ìg¥gdcÆŒvƒ!ìVI.î67>¯¦¦F ݈§ZZ[©ªªÂåra¡PY–ãÙƒúúz¬6‹%žöEŒŸ·ÛMZZsæÎé4s÷ÿahýú -†al&qŒv!ILüú×H1â¿n‘’DêÁΛkª•õòú ]g÷?ŸF›[¤‡BŒ½ùFdµw€³öþð”wÏã{Ë- 9ïÜÿº÷%ÑB4¨ˆ‚¥K°æåâÞ¹ Íïï³yÓ¼i3µï¯EMM1Uúú¨v׆a ¸\dMžLæô鄃AÚËÊ>u\þ² |ñE§êfß!$ Cû^~™~øC“ øþ÷¿ÏÎ;ñûý]’ "#Ë2‹«ÕJRRÕGŽš–f¶œEo–P0ˆÏÛŽ×çãŠ+®ÀjµÆ…)¼ÞvÊ•éÿxêé&¿ßß„é uαlIIaÊw¢tcöqºCô•Ô¨iìyî9"Þ.jô†Áˆ+®À’Ô}»`GHŠÌ¡7ßf÷ßÿÞí˜RGbú·¿êttyÌgè#êâ7j$yK— ¬ÚöìEï¨]ßAÄÓNýš÷hÙ½[vù`òfÎ$eô--ª«A$‹…ñßù6¶ôô„<Ï@ƒ$‚--ìyîyJ+ª+Ѻú|uÀ\Àc=F(bÍš5]–†YoMÀP=~¿‰ªª–’Ã,.§Ë´îE››ËÁƒilhDUÕx¶Y 0€}û÷±mû6tCÇëõÒÖÖF0Ä0 TU¥ÍãÁï÷“žžŸÓ=n7µ ,Yº”AEE-î\.ÿøÇӇ̀ûp}'gZƬAÓØÔš;wv’×ëÅáp¢( Ń‹9\^n¶‚47IN6-‚ÃQ2 Õ ˆ1²‰aX,tà ðø ƒ\wýµ¤¥§EÛ¢LÏ€Úºj^zñ•¶ýûx€1ÿŽÙLì,*bÜnþ¬Æ| ÈV+{ÿõ"¡––c`”\vöŒŒŸ3Ðܪï~·ësb2¡§Þs¹S&¶ûï- Åá kÚ4²fÏ"ÐÒ‚¯¢²oü€(ÕÕÔ¼û.¾¦&ùXSRÈDÎœÙØ òñ.§èòËÈŸ÷ßÙ÷¯G"T­^ÃÊ{¾Mùë¯w™Yû$æÏŸÏã?NAA’$ñ·¿ý­«CUL=€D”öŸ«­©M:l°#-=CŠéÿËŠLII «V­&‰˜íÝ´m3 ð´µ±eËGœÇÓPUUUq9477“äraµXh÷´ÑÜê¦dÔHæÌ ü?ápƒe½Oüù¯nÌÝÿpm' gZ°8«ªêH‘Ó錌;Úéø±ÙìØ¬6F””PWW‡Åb¡®®‡Ó‰$™:ÓZ´Ö¬( ‹%IJ, øÑu‹ÕÂõ×_Gfffü‰u]§©¹‘åËWø–¿ón³aë€ç³5Xg~>#.¿ü³àXÐ4¿³ouu—‡ ¿ârÙ=“å–T…ý?*ßy§ÛãòçÍcâm·!*p' †5-íÿ³wÞñQ•ÙÿÞ;5™dÒ© )" ‚‚‚ E Öµ®ºõ·Ö]\uW]t-Ø+«b/t”"Mj€@„ô@zO¦dæÞß7&e’çó%3ï{ç¶¹ç¼ç<ç9ô›8Ÿ”djÆZQqÂÑd™ºÌƒY¹ I¯ˆp¥+f7짨ÑàOèøqø'%u©?q¦AP©¨/*b×[ ÙñÒKX++Ýž;iÒ$.\H||< ”â}üñÇ΂8m‘tþs2p ©©éš¢Â£ ILððòö”VïàááAÊÐÖ¯_¯”i«9Õ5ÕÔÕÕ¡R©ZÀÙ›Õý4MËs]­Ñ€$!È5 Ä À”©SP‰"v»êšJì’ÝöÌ“ÿ(±Z­M( ®7 ée8€_«vïÞ£  ÿk“NV§%>>I–¨ªªÂn·#BK9ˆ ($œo»ÝŽÙdR¢*‘””®½ö|||”RdI¦²ª‚5¿þj^üå×ev»½¸E£`ÿ‚¯¼Òeƒ+g üqn¹åú÷ïïr\XXXg› G) ì" €¸W–åÏV,_•d6[ì3gÎð ë‡^¯4JU"£ÇŒfhêP22ðËêÕäç(%ÛÍÏq‡£éxO¥RÌE]HÿʱÚlMÔÔVc—ìÒ·Þ)ÞðÛF °x°›Žå”ã\v@áÌÞ[üå×[¿¡èÝï7(ΠQkìŠÁwÜ$Žò‡àüÒ¨­øehn(QGzzºeÑ¢/ªr²sL@!ðÚ³D³PšGt¸ÌÏY±’a#Z5§è€Œ©¬s]‘ú¢.»ËÙMl_ðj‡ÅÎH¸ùf|cœUz ½’ÕŠwT£þõ¥Û·³ÿµ×iÈÊr? &Ë_t!cÆô'‚@Õ¡Cl{ùeެsÉÔoOOOî¹çî¼óNQwÁ}éÂP¡´ îNÔwʲüÞÚ5ëR ­wÞu{À ¸Aj//oAqØ=<<>|:–O?ù AZžëÕ@dzÞh4b0Ž Q™±XM””–˜_ú÷ü²ââ°¸%{Fâ\M8£E¢Ò¯¾¾~Èš_×6V×ÔXüýýÔõõuê¢Â#-,G˜È*r„‹A`pü`‚‚±X­44Ô±ÿ¾¦o¿ý¾êã>­¬ªªjBÉÝtÔP»˜Š¢–Õ~óò‰»fÚY] xB¡©¾ž’­Û\ÑtÚÈ’„!<œ¨+.GAUú>·ø¢NGÒì¿`¡~›ÙÌþϱ6'ÇíyW]uŸ~ú)wÞy'¡¡¡-†²3äççóÑG¹úØŽ’/¯us÷ÝE#Ê3v@eeUÌÚ5ëêüý}u:NÐhÔ‚Òȧ¬¬Œ}ûö£V«[žëÎ)FC¿~ýÀ ||½¨®©‘V®XU1oî+õõ và àÏ()3}€;°…˜›“´yÓï–]»vëUÅ'‡"”s®H«Õ"I~>T×TÙwlß^·ðÍw*¿ýæûªìì+J¹ÊpÝ K"€‰~h6£ dĈ¾šA täH¢'O¢±ºªã¦=¢@üM7¹ÜFci)ëþö8Mµ®ŸG¢ZÍÈ¿ýà”äÓwþAé.Ù¼ Εû ùí?$È˧" µ2]òdI"òšiD]yEßoå|”¥ïcã?þÁ¡/¿t;zËo¼ÁSO=E”;$Z'äççóᇺúXBqÜ'¸°(”eyÔ¾ôýòÊ«ëÔjj­Z«×ëA(/+'#ã@K$Ãñ\w¬þ½¼¼hîÿÒd?tèPÕss^(ݳ{¯…åÿWà=ºÇpÚÐÇdjY–=/½ôÒ¹YYY 4He4ihhÀb±´bŒ:Bÿ:ŽÊÊJ6mÚTű¼–ì@Q½r·ä%؃Ò Tz=Ó~ü¾[ívжlaË‹sipRoÓpÃêU²·Eµš­óæ³ï½÷:ÝvääÉ\4÷ÅSJ&Õj$ÉNÑ£ÔÒXRŠ©¼ »ÅŠghÆÈH ÁÁx#:Žíl¿/dP{ê©É:̾7Þ¢bófåæähƒýÊËÎñ߉ R)‚>_Íž×ßÀÞIe‹3T*=ô÷Üs‰‰‰'ôÝ¿ýö^x¡«PZžçŸÐÆÝ‡7ðà&@/‚0|Ä0±ãÎ×7Ô×ö¥Pëõú}G‰·J¥"44OOOÌf37n”jkkË,K)Ê"î-À½“y Ïh†,Ë¢Åb yðÁçüª½{‘l¶ÇŠj5†˜fÎ¤ßØóñéßÿœ0z‚ j4ÿþ;ÿ}†ÃÙ*²ÝÎà‡þHì7ž»¹APœáM›ØùúTíÝëöÔØØXæÏŸÏ”)SПDªë믿fÆ —±r`0à¾ØÀÉÁå™z-0¨ù=ß#FøùûûcµZ[dßAá  R©ÐëõØl6öïß/ÕÔÔ¼wùå—?ôßÿþ·s¢Ð†>KȲ¬Y»ví…Ï>ûìg —ÄÅÅ©5¢¶æ‡¯sžÈ9W¤V«ihh°çççÏþØÅ‰å·d§áV\\—ªýûñ #(%¹ˆæ*­– ¤$L›*5e;w{Õ•íÔe»õO>E]nn§Û|ÓM ºöÚÜc§}’$Šwì`ã?ÿIú;ïb*.îô:Ë’„µ²’¢ß~#gõj¬5µxGE¡óõ=ëÙnÇ;2’È+¯@BMFžÑQ$<ðÀYU«<ÕjJKÙ÷ñÇl{á_4v"Õjž(òÄOðꫯ2zôè–öº'Š5kÖ°téRW PÒ®§&”hìgÀÏÀa $::º¿———àœÖU«Õøúú¶4‚S«Õxzz-ètºa;wî¼tРAk \Ë„ža8׫eÙ÷›o¾¹ý믿þg@@€wDD„`6›•6¿ÍQ[T¥Rµp‡sœØ |‰â´ßWIbÛ¼y Šÿ ¸>'ÀdYÆ+,ŒQ>€)S0WT¶*T*²—-§dËïnGëçÇà×#jÔ.Wá݉CßÿÀÖÿû¸J³°”–²÷í·Éýå’︃þS.CãéyVw«“l6L¿–°ñãi8Rtn–ý9Úõ.[Æï/ÎÅ\\ìöÔØØX^{íµ‘›î@QQQgW£H²Ÿn~E¨Õê Få,òæHë‚ò q¼T*ñññbXXØè½{÷nŸ2eÊ­Ë—/_ršŽ¡[qÎ4˲,ʲ<`Á‚o¯\¹ò常8c```»”ˆ³à¼òïãïÀ €KÓVWÇÆgçÐXVÞ'ì“ ;Ì1ã/Š49¦§Ÿ¦«¦dÖêjÒÞ|‹²={ZôÄ»’Ýή·Þbóßÿ~BÆßuYYl~æ¶½ü eeg¿f `·XÐúñ2äœ3þ‚(ÒP\̦çžgýìÙnµZÍ3Ï<ÃÆ¹üòË»Íø755‘––ÖÙLzyα¨s¹õz=žm¤£€aâĉ~žžžß=zž,Ëg|ýŒ?€,˺C‡]²páÂ*++'DDDˆ]hÇËn··ü»«UT}}½œŸŸ¿E•êdQÂfŒ ކéh15„Ά;OMõõlzþªèz0P}èÙK—ÒÔP1:½Ÿ_·F^dYfÛÜ—Ø÷ÞûݶM€ŠôtŽîÜI¿qcÑzyuë¶ûÐ ÐÜy4gé2~ùÓŸ(Û¶Íí&»£Fâ“O>áŽ;îÀ«›ïÜÜ\þñ`vÍ«yè<ôÖó¸ ::úboooÑ9üïìàw¤õâ}‹ŠŠ ÃùóæÍ›8lذU¨;ÇrR8Ë—­!˲ ËrÀöíÛ^´hÑ&1""BpÔù7içùu«Ò5«;ëA¢ä«\¢põj¶/X€,[+ž“…J§cÀ”Ë{¾Ûsl ì}ç]–ß}7þ÷9¶ÆÆné?ýó2ÿ÷?·Ç ‚àöª¾rÏ6üc6×ýÙûp&B¨ÍÍeýO²þ±ÇÜnÞc4™;w.Ë–-c„ =ÑÊÍÍ¥ª“Nš@§áÓ®ÎC[›Ðœ.¾øâ €·ÝvÛ„S²£=€s& ˲Ä/[¶lþ¦M›öôôôla€v´òw'`2™Ø¾}»Õjµ>N÷u‚jB!Î@‘Íì•ééZÁ))ŠA:‹ó½ÝAñ'úâ‹ :”êü|Ì4r†µºšÂµk)Û—ŽÞ×cd$‚Z}Bç]Eª23Yû·¿¹ö>œó{””ûîeÈí·“póÍDL¸k£‰ú¢"—¡ï†ü|ì’Dèðá}Ý Ïtv³™œeËYóÈ£TîÞíæ4iÓ¦±páBfΜÙ.ÔÝ]e™… ²iÓ&WCL()ΞÐ8¤úûûO èÔ“vDÒÀÎÿV©Tøúú 111†ÊÊÊ[úõë×”™™¹ùÙgŸ=£ÂçDY–e]MMÍä%K–Ì­ªªJðõõl6‹¥ÕËl6·ú·ãoÉEÈ·¼¼\Þ¸q£Ùjµ>¸T¾8A(¥+ŸàB"Cså$Þz+‰‰J°Ïp ‚(b©­%ï—_Ø6÷¥ãjˆ"ˆ"±×L#ñ¶ÛðOH@nnå.lf3›_øÙß~Ûù÷¨TŒ™óN›†J£iŸ~eŽü¾•ÍÏ?O½ …7A÷⿉»új¤s,G~¶@* máB V®r{^pp0Ï=÷3gÎÄÇǧ÷P‰„Ž3†]»v¹²¸˜ÓGtÀ_ÅŒ‹.º(¨#Þ(çÛÁ p~ét:t:]«‹¢HNN޼ÿþU 7Í™3çT•8ž4Îú€,Ë™™™^ºté|µZéëë+H’ÔáJ¿í{Žè@Û»$IdeeI[¶l9l·Û§w‘9qd¢ˆN\ÚÉRyœ•+ijlÀ…Þ×·¯BÀÈ2*ŽÀøx^3 /Å[¶¸=·2ãÙ+Vb7›1ÆÄ óñqë¼ ¢ÈÑ-[Ø9ÿåN5µÑȤ7ß`Àå—+ã:+##‰¾t2Å;wb*)ép_K÷¦3ø†ú¢g• [C™_}͆§ž¢jÿ~·çΘ1ƒwß}—©S§âq dÄ7mÚļyó\.˜P„ÑÖôøŽt “,ËËsssÇi4š ???±mÀAúnpþ¿sIxhh¨{àÀ™ãÇßñûï¿÷´ÐQ·à¬udYçÌ™“°aÆy;wîüc@@€‡^¯G’¤vƾ«€3Ìf3;wîlÊÌÌü¸ÈëÉöäÎJ ¥ÛwP°y¢J…1:Z)ësÜ‚ÆÓ“°Éž:KCÕ™™nÍ“ÌfŠ·n¥pófT:-ƨ(Ôžw»ÅÊö :–.n†¨Õrñ_#|ìX·˜í:oo‚RRÈúþ{äJmõõøÄÆ0x°[ÇÕ‡ÓA)Þ±ƒõO=MÖâÅHnªùòöÛoóä“OqJª…$Iâý÷ßgíÚµ®†˜Ùt_šôdQ |TRRU__Ÿ j«Бáokü_>>>ÄÄÄø–••ÝÑžžþ{oO œ•€,ËºÆÆÆIK—.}·¼¼|BPP Šb+ãï0ôv»¦¦¦N*++å5kÖ˜+++åÔHBJÀ ùÌø®[++)\³–òŒ ô~~x…‡+Ê}i· ÷ó#úâ‰<ŠÌƒXÊËÝšg©¨ à—_(Ý›ŽÖhÄ;"BYm·=ï‚@eÆ~vΟßé5I¹ÿ~âo¼ÑmýY–1c5™(ݱ£Ã1 åÄÏœÑçörˆj5Öº:ö¼ÿ›Ÿy†ÆÎëê[áÖ[oåã?fâĉ'-ès<(..æ¾û¾ÞÕ]À|N;°ß×ÖÖæåææN Ôxzz¶xKÃî\àÊø;^z½žèèh•§§ç¥ .6kÖ¬e«V­êµÒÁg ˲_vvöý«W¯þZ­ŽöõõE–e$IÂúwEüs•$‰Ã‡K›6mʶÛíWßâòKP"n t×ç»lõ¥%x…‡ãÔ£;x6A¼#"xõUxEGstÓ¦WÕ¡¡°¼åË©ÌÊÂ30¯°0pbí«4Ò?ù„²;]n#`Ø0F?ñøq‡ëeIBg4rpñW~n©¬$nút4=DëCw@ hÃFV?ü0+Wºí¬…††òÁðÄOt~ë_|ñ_|ñEgCþ ¬;E»s¼Øm·ÛÌÍͨÕjüüüçA®Bÿm_Î%…!!!Bppðà={öL?~ü–-[¶¸'ËxŠqÖ”6—øÅnݺõ•õë×ÿÛÇÇÇßQãÚ¶Œ£m™_G;¢&“‰;vØvíÚõp°õ4b=ðð‹»$›¬¯¾fÅÝ÷°çÝ÷0WTôå€j_{-Ó—.%éþûÜž'Ùí¬\ÉÊ?ÜÍŠû t÷±Ê'(Xÿ[§ónºÏ6ÒÅîBïëçòKV+¥púpÚ!ˆ"–švü÷5Vß{/ yîe5 <ò›7ofÆŒ¨NCŸ’’Þ}÷ÝÎH° ( ˜ÞŒ}À¨´´´Ï·mÛÖd6›Ën8Þ“$©åï~ýú1eÊ”A:î·Ûo¿ý.Y–{éþ¬pdYVÛíö±ßÿýç¼=,,L­Õj[­ü¯®.¢$IX­VÌf3åååòêի͹¹¹¦súËWÊPº[= ¸íQZÊÊØùòˬzðaÿ¼»ÅÒÒV¶C–eñŽ;ˆ¼èBdùÄòôæª*2>ùÔå56 ŸãìïÞ‡‚ Päi ²ýß/º]†êééÉœ9sxýõ×1bDâðY¹ IDATOÊ’w‰ììl}ôQŠ]KËÀŸ83vÚíö¥ÙÙÙi4šA«Õ¶4kòwþ[Eé8VM,øùù%¯X±âêóÏ?íöíÛÝ#õ0ÎØ@sÈ?dóæÍÏüôÓOozyyõóññiå‰u¶úoëÁY,jjj(++cûöí¶íÛ·/Fpúe+]áp?J%ÂjŽC_;åJVÞ}7[çϧ&/¯/pT*"/¸€i‹¿dÔ3OwÙšyü?ŸEÕ¼úk}}§WpêÐ'é uùw<Žm ¢ˆ¨R!jÔ¢Ð×{¢› ˆŠÓ·jËþp7}ìö5¿à‚ øöÛoyôÑGOK®ß6›>ø +íÿíÀ¯§h—ºiÀ˜;v|½iÓ&[ii)‹¥ËrÛh€ÃöDEE —]vYŠ,ËÛî¸ãŽé§ñØZpF>ù›Uýùå—¯ïß¿ÿŽ~ýú©u®Ž‡TÛ‹áˆ8Gl6MMMÔÖÖRVVFaa¡¼nÝ:kqqñsÀ(ÊU½ |Dé³íÖSA¶Ù(OK#oÝzÀ…Ö`8.1›s*­–àäd¢.Œ¥¡±Ã²ÁˆÉ“vÿ}­˜ü¦ÊJ²¾éXüGﺳ]ëbw!ªÕìýè#*:éŸpóMx††ºü~d™º£G)Û½›¼U«È]½šŒ/¾¤lÏ^,µJ—kM_‚ ŠT:Ä–þÅž7ߤ©ºÚ­y†_|‘ùóç“””tZrým±uëV}ôQ]+YJÀS(¥Ìg",À×UUUU999F£Ú`0G”ß”3?@§Ó¡­­­½Þh4~ñÅ«ÞyçÓV–sƹô²,k233/Z¾|ù»Ý>$,,LÐét-Í'¿­ñw{ÇËjµÒØØHII ÅÅÅv,*®¯TÌM¢ˆÍd"wå*ÒÞy‡úìì–÷¯]¶VãKw¥±lÖ,¸æ§ñéßÿø÷Ch(.áçY³0¹è¯öô䚟~ÄÐÖd»#›·pè»ï(XµªÓòC]@¯½–¸k¦á£´Zîs;… Š )÷§ŸØ±àU,nÊO\vÙeÌ™3‡‘#Gö ÃÐÐÐÀ½÷ÞËÿ:ïcñ+Ššií©Ù«ÅùÀ'cÆŒ0bÄ1,, //¯–n‚ŽÎ‚mËAhgl6V«•ÌÌLyË–-¿Ùíö[W¬XqZ„ƒzÇÝä&dYÖoܸñÆÅ‹¿íéé,8Ÿä¶^WÛü¿s$ ¾¾žÂÂB ؾ}»mÏž=«€«ôÓz'‡:`-° únÑþ!wé2êJK1„†âÔòu²Œ¨V˜8„È ÆQ—G}^>)>Hì—·3¤²,‘ñé§.77cÆ ED•Šƒß}OÞÒ¥.Ç„ŒMÂÌ™­H€¢FÓÒNv×Ë/S“•Õ¥óg7™(Û¹“Cß|  >11¨ûJ ]BT«©Ø·Ÿu{œŸ|‚½¡Á­y*•Š—_~™¹sç2`À€Óšëo‹Ÿþ™9sætÅü%Uy6 ø¼°°0©®®n€§§§èåå…N§k·úoZ-Fé!000º°°ð†„„„-™™™§ú Î@–eÃ’%Kîþúë¯_‹ŒŒôñõõuyÒèˆ ÐÔÔDee%¹¹¹>|Xþõ×_­G}¸¥Ôîl@1ð# ûvîîĪŒ ²W,G²ZñŽŒDßÌ«èCç% ¯/ƒ®¹¯þý‰»êª»ö ¢È/¿D²X;ÜŽ_|Fg\}õÕZõõB@ÁG’ä_/þf¹‹)ÀZzP‚Rßz#ðg úxöÃ8hIwÜN̤Ihƾ‡»;e•Êå*ZT«ÙúÊØ÷öÛ~šÊÔ÷ßC¥×»ý•RS›_øY_u, yqÚ?àÛ¿?²,#%ii¬þãƒnç¡;ƒÆÇ‡ þõý§LÁæºü9A¥¢lÏ~q.åˆ>µ…F£aÔ¨QÄÅÅÉ´iÓHNNîUNÀË/¿Ì£>ÚÙ"`p†’št&¢«;TÈ[·níô¾§R«½A¨×j´‡}||~a-°A„ÞŸ|vÁDŽ7NŒŽŽÆËË«U ÀÙZE }ŒF"#"ð6i²ÙÈÊÊâÓO>µ¯ÿmýÜÜÜܧNÕAôz@–eá»ï¾»lÑ¢EßÜ~ÛmžãÇŽEÔ ZµFƒÅl¡¬´Œ´=iØíöv)›ÍF]]cÕOZZšíÀ€[QnÆ^fN¿YF¸¸„Ž¯Í”¯¾üfEó¿Gw³€®Ú|Õ¢üà¼Q$…dz_ý&\Dâ­·6r$bGéúp\(Ùµ‹å³nuùùðGf“|×]nmKP©Hÿè#vÌ}©ÓHMä¤I\üêeŽ P““Ã/³gS›yðøv¾ \±øK‚’“Ïé{ÄRSÃÁo¾%íµ×šÜÓs¸¸8RSSñqŠºI’Djj*W^y%111§=-—žžÎ´iÓÈn溸@øu±¹rà£æ×>€?>tÿ¥×^3}…¢ *blf‹??¿ºÐ°´¨¨¨¹ÀJANwWÁà“ÄÄÄ‹/¼ðBubb"~~~h4š -@%ŠÄD`` ­^¨Ra1Y(-)å7ß°ôÉG///ÿש8€^Ÿ˜3gŽ÷ÓO?½èšiÓ"¦N™"мzi‘fUØl6Ô¢¥å ¹ÆÙø———“™™IFF†¼nݺ¦‚‚‚ùÀíôrÊ 3§_=$iÈrAÿ Óéh4訫Vêþ}ï‹À(À¥¢ˆ"€j§Ç7¯]n9K–ÐXU‰1<ý ²Ôû ÀBiz:õùó~Š·nÅEPJ ¸ˆº8,¾ø’­/¼Ðé÷©ôzÎÿÇßñG–eìV+›æÌ¡l{Ç=:ü¾6«W(Þ±“˜É“Ð ç–àPó±ïØÎ†Ì!û›oÝv‚ ãÆcèСxxx´räAàèÑ£Ô×ןöš‹Å /¼ÀÊ•+»ê•ì žÀXà(ÑÉŸ¦M›öu\Ü PFƒCÏÅn³c6›)..ÖíÛ·7zÏÞ½—#ËÁ ¾½ëÙgŸuPÑ3h•••©srrÆèt:•———àååÕ. Ë2*•ŠaC‡âmPº»«š£¢J±a*QErb²XXTxá¾ýû~—eÙu·°nB¯w¬Vëeµµµ~ì‘GDUshÕêW©Õ¢ˆ½ÉŽ­Iqêêë0™•ê=‹ÅBQQ¤¥¥IkÖ¬©hll¼x÷ô•‚[n¹Å3~Èà/ Ã?CCC}ýüüÑ6׌;JÛ hÿ¾Œ‘(dÅ…Šw¾%§å^µ€,S™žNÎ/¿ ˆ"ÆÈH¥¬pÜU*ü$ëëo:^µË2«VS™•E@B‚"ØÔü¾Ã×9ÂÎ7Þd÷ë¯wy NŸNÂÍ7)¿Qäð’%ìÿàÃ.çiüýH¼ë.Æ<õ$IwÝEâw;mƱTçdÓT[×n޵ª Q¯#|ìXªeam¬Ç‰Ýl>kAi,+cïû°åÙÒXè^PQEfÏžÍ7ÞˆÙlv¹ºW«ÕÜqÇœfÇ{íÚµ<ùä“X­óWNÀ¡S¯˜zQtT” V; ›Ý†ÕÚ„ÕjÁb1SYY©ß¹sǘí;¶¥>÷Üó?¾ÿþû§»ÙΓɴ1==}’$I^ƒA0¨$¹eY&iÈ|ŒFì6 ÉS­Ñ ªTØmvì6;‚,­úá§Æ›L¦×zzÇ{µ ˲ðÁüá†n—œœ,Hvû1 9 "v[³ªŸM1šU444ÍþýûÙºu«mçΛdYž‚Ò•ª§Ñ¸%Å0¸¥‘O>Š×Èõ3¯OD6Ĉ=?¼_8j• »Ý†ÍfÇfkj׉Àl2 3ÅuÃþ @ Iðsý· »í Ù°â»Ðy{ãŽJ§ës޲ŒGp0Z£E¿¹î Psè‹Q’–F]ÑÌ•”gd°ÑÿØôÔS”íÚÕåy7ÆfÜœ9h›WæŠ Ö>ò(Muí·3‚FbâüùÄ^~9ú€´ÞÞh <:”˜É“i2[¨Ü·¯ý~çÐÿ²ËØûá‡l|ü êÊÊ;ïüøÃaÀ7=´¯@/Ì™3G|ýõ×g?øÇCôHv»Â`F £*? AYù7Ù[–,_ÂŽ;¤_~ù¥º¡¡á&”V”=ºDõòòzð¾ûîûhæÌ™ãâââ ýû÷W ~~~øùù !!!ÚÊÊJ£‡AàÿZRb’ÆÇÇG†pô#°;VÿǼAgÔÕÕ‘—×íz#ÀKÀ”È@8nÊD×:DÎÏ?Ñd6ãŽÞ×·/p;–&‹…ò´´n=o*Ž þCôÅcoÙZ*+Ù6ÿeÌee.çù%'sÉk¯¢1xvéÌ ¢H¿Ñ£È^±¢Ž}Ezz»ã)øåö}öA©©øÇÅa?€æEHΊüú—¿RÖyœV4hü1÷ÜsÞÞÞí>W«ÕDDD0zôht:YYY\uÕU :´;ฑ››Ë_þòJJޝ“¤J¸=.Ž…^ȣÇ“àãƒ^Ñ‹"^^œÂ}‰‰L‹eˆ–¦&åäòÍ’%|µø+JKËhh¨G’dÔj5v»³YI˜ÍÊËb± I’˜¥×ë}.¿üŠK&Mšäѯ_?üüüð÷÷üýýƒÁ 2 IáááwùûûW§§§oÀj“É´uïÞ½S$Iò0 Â!Cð÷ÇÖ¤DwÅæð¿º™0è°5Ù0YLÂ_~aF)§ì1ôöMMMk“Åákûqþq£ÿþžQQQ„„„´0AU*²,ãëëKll¬×Ñ’#÷øúú©‚‚ƒ‘ì’ÓÊ¿Y8Âiõ߬ÌÚ‚¬Çÿ… ¸ØÜÌF!v »Åʾwß#gù ’ﺓþS¦ ÷óë+t²ÝΈ‡Â+4”íó^Ân>ùt¦6 €ñÏ?GÔ„ ÇJòÚü|ª:Ù; j4ŒyüoŠ$´;‘YFëåÍy³g³îÏqkßšª«Y~Ë,b¯»Ž‹æ¾ˆÝrºÓ·îÃQ=±ýÕ×(èš×µZÍ-·ÜÂã?N|||—ãF#W]u£GÆë4K.ÛívÞ}÷]ö‡N„ZÍì”®8Á~~¨÷Rë‡ZAà<__Î à¤$òëëÉ®®&½¼œÿüô_}õžžžÄÄÄ0th Ñ1Ñ}Œ-ÑR'èõzý8çß {ôz=¾¾¾‚¯¯¯—^¯_ ŠâØE‹ÝKÏɽ¯”$é¼+V¼ôèÑ 'NTvÈ©T] ƒR/Y±eAAAˆ¢è×¼[ÑÛY’¤º#EG i1ü€b¹YXÁ•¨";;[B ù÷´ñ÷=zô¢iÓ¦MŠŠŠÒÄÇÇc0E±•¤ÝnG£Ñ`4Õ²$…(ÈÍá~%ì,¬¥Zû4€½çn#ð/àa”–Ço¢ôïþp «·K4ðû³ÿ$oõj’°‘#Qé´}iN 7ë$Ü|ÁDZëÍ7)\µú„·çÕ¿?cÿþ a£Fµ:ï¢JEA'|€Øë¯#85õ¸¾O²Ù=ïtˆW÷î¥Àl&xHn6oÞÌÔ˧¶šêÊè·…(Š„„„©NII™X]]ýáæÍ›o¢çd‹ËTjµà(áu–®o!²;ì˜Ó‚V­V÷¸H]¯w|}}kª«ªeYhŽyNÇÈøùû„®û¢žüýýçN˜0áòÈÈHmBBƒ___—7ŸsïhdP7“QhËj7_À9´Q_×ã­ ¢½`þ‡Òdè>”hA?w6h««c×+ÿáð’¥ ½ûDN˜€ÖۻРdYFÔj 9’~cÆzx+*i(+C¶Û@’µ<ƒƒÑùø´j9ê 6“‰¦NšÐ¦¤ õöÂî¢GA;ì–Aׇ†2øúëÆ¢7¢y…V¶gÛ¼JÉÆnOõññá¾ûîã‚ .@¯×ãííM|||«zð3ÅÅÅÌ›7¯ÃšÿgRS™6`æ°,Ÿüõì²ÌÁêj>ÊÈàŒ ªm6.^¦†æ¡¡ ¿€€@×ÙÉÎ~¢(K~~¾6%%åÊÊÊÊgffþßÉ„KDj5š–H°#à,[ï°cŽýn¶i=Þ¨×ß™‹ÅRS[£xw¢ˆÐìavpüm4¡kÊ‚J¥ºm„ wÄÄÄx&''c4;5þH’„ÅbA¥j¾I’Úäý›Wÿ-Ûj}×»ÙEì$àLÖ¸ø¼ x¥4åo(QötæP›™Éoý“&‘8kÁÇ¡ê“”ÎÏŸoÇãÜxøª´ZäN\¼£"‘m'æ”™ÊÊhpÑ‚Øç=2CXh¯5þ‚(b®ªbß'Ÿ²ïý÷«TqÒ¤IÜu×]„……a³Ù0 ¤¦¦¢iö:ÓðÉ'Ÿ°yóæ–¿½T*^5Š©11 0••~w\GAÀ*Ëì*-eaz:Ÿ>Œ$Ë\Ò¼ä" í¼˜lý}—LžØòìE‘¦¦&·ÉÒZ­–””êêê<ï...ÞQSSóåÉT;j´ZAlŽ`«DQ±eÍ/Guò1[Y–)++ëñ¦½Þ$ÉR]] 2-µ Ž\JËÉrÊx¼à8õîÝDRjjêsqqq~©©©øûû»4þmÃQ²,c±XšÃÿ~Çrÿm¶á\áà€ÉÔS„ÕVèÌp ¸ ¥Då)`í§¢põjŠ~ý•Á·Î"áÆ…{©Q8[ Òjñ q)d®®>±Î ‚@Õál,åå 7Žè‰{íu5Š·mã÷—^¢r·ûŒ÷€€~øaÆŒÓRªæííÍСCÏ8ã/Ë2‡æÇäÉ'Ÿ ÉhäÉáù4&†­¶{Âü‚@ƒ$±¡¨ˆ×öìaia!j”®eE õ»ªQB!+ͪª¢¤¸„аPT*‹ÕÒ:âÚ DQD¯×“ššJuuµoAAÁÜmÛ¶¥Ýx÷ÕétÇä´Uª– €,É­ ¿ã•››ÛçØíö†ªªªc¹ôfNä ç܉,Ë< ঠÍqÀ#00pÁðáÃÃ’’’ ÁÏϯUJÂaô;ºñ$IÂl1£Õh戭ËþZ8öÀÖä!ì$q§ÚBV››'€þî|,Iøør–.#õþûè?uªR6Ø è1ˆj5!#†S›•Õáç¥;vÒd2£:N£%Ûl¤øa§cA õþûP{zö:@ELååì~ç]|úéqÍ=z4³gÏ&$$¤E³C¯×“””„þ8º9žn455±wï^¾øâ Þxã L\ÎýII\‰GKºµ{Vü•6«òòxu÷n6——ã…Rs|7Š$©;$—£4ع#É—]¢(ªTX]€€¶ÏeQÛ××—¤¤$¡²²²_~~þ‚’’’kpÑ©ðá­Õj[Âÿ2 6§dZ¯ú‘A’%¬V+¥¥¥=Jú‚3À0™L5H’„ U+ƒë¸ÐÎùY–ñ0x€›Œuw!Šâ£#GŽ9pà@Í€ð÷÷oÇGèŒ IV‹Uiëé¨uúÚ߬6›­'uœ‹r_¸ëm4 ôVXŽò;¾ 7Ë-eeüþÜó^²„”?ü~cÇ¢Öëûž€ qÁúrq‡7R´a1“'»]y ˆ"y«¡xÓ¦NÇ ºåf¥¼°—8ºy ›_xºÃî÷]ñööæüóÏ'::šÌÌL´Zm xÈ! †®7Ò `2™øý÷ßyçwX¼x1¢,sÇÀÌŠçÂÐnNÕGÍf–ää° -}uuóPBún­œà¼ \ÓÐ@ñÑb"£"Q‰"&“¹Ýs²•p‚s¹`LL EEEš¡C‡žÿ믿þÉf³Í;Î]ê Z­öXÀ©§‡óþ9¿š£½=Núêõ€F£©4™L²>W·ZÀ~* IDAT«;Ø“#Nxê=ÁÍ´›H0`ÀÝ4¦¤¤Щ.wÛÐ?(+z«ÕŠF£FtvœËqøB»>M§N5M.E: Dï¡D&ã^§BÊwîâ×1`Ú4†Ür3þC†´tëC÷@²Ù;m` Váúßç¾D`b†Ð®«5D•Šª¬,6=ûl§ƒÊÓ“„›nêUÄ?Ai(.f÷{ïqpÑÿÜž'Š"‰‰‰¤¤¤àéé‰,ËäååqäÈÌ´iÓðóëêQ·¢¦¦†5kÖðŸÿü‡õë×ã¯ÑðDR7D¢Ÿ_÷úrêêø1'‡ùiišÍÄ¢è‡Ä¦/€½{öЍRa6wì´ý[–åcõø(Ïì¡C‡RTTäsèСsrr~¦ûtøuz¾…èø>Q‘$YI8¥$Y¢ÑÔJçÖE¯wjkk˜Íf< žÇàXýdÛ€‡‡€›ÍmÜ€<7lذСC‡¶¨ü¹Zõ;—ý9{ž’$ÑÔdE£Ñ¶|.tPèøÂ¶)€¦Sþw ™ãwØŽâÔ_ÂHÁMÉéì~ ·¹l0nút¼šÛ×öÃq¦CíáAÊÝ`ûÜ—:<§¬òIÆ<ñ8~*îtÛq‚€¨VS‘‘Á†9sº,öç?áÓ;®¡ Y­ü¶móçÓ—çöÔàà`FŽIX˜b²œç6›ôôtŽ=Ê´iÓ9rd¯Ìÿ9r„Ÿþ™ ‘‘Á@//^;ÿ|®%‘žé¦ë$ ŠÞÿ7‡óâîݘìv’PVíÓY~(Œäë8RT„¯&“ÉåŠZ;mŸÝžžž :”âââМœœç€ë»a7Ô:NQªU©Z‰I’½U$Û-nŽTtÓ÷»Þ±žþ‚“ÅàÁƒäääÈf³¹5Û¿MÞÄ™ ¨÷Ð (Ò¶Ý›‡ 6666V‡§ç1jA‹wT$tÂe«µ µZÕF$¨ecÊÿ8¶-gØl§T7Ý-f'hB©ø%µ÷' Ò‰RS»ß|‹C?þDêý÷3ùR´Fï¾´@7@–$]{-%;vR°jU‡cJ6ofÕC“tûmDŒ‡wd$¢F£”úÙl4“õÓOì}çì]èRxÇÆ{ŽBJEjòóØóîûdû­Û÷“Z­fúôé8úv¸Ü¾ PQQÁ‡~Èúõë™>}:ƒ ê®Ý?)ddd°xñb.\Hqq1çò¿‹/fjt4¾Í×¶»òûM²ÌÎòr8À32€ñÀ`4ÇJùº —c€½û0lDj»€;D@gÄÄÄ0`À]jjê…iii×_wÃnê´:$IBT)ÌšíD‹ñoŽH’„$K˜L&8Ú ßÝ)z½ðÃ?Ô [Ÿ{ž^^ø ˆgH‚µyyÔfv»<î¼?ÿ½¿ÿi5þ‚(b7›É^¾œ¯¾†¹‹NˆÎ9r$÷Þ{/Äl6³wï^>ŒÍfëïãx/++‹W^y…‘#GrÅWÚmÇã.dYfÆ ,Z´ˆ?þ«ÅµQQÜ3u*†‡ãá SwǵEm66•”ðNz:_åæ¶0úA 'v+!Ë >(ìãi ÒØØØ©Ñoë´uA`ذaäååìÙ³çÿ$IZÂIö ðññ WÂýRK%›ÒPjeôáGº躶ö$Ñë‹Åb³˜-ZçÐŽ#g´rddGø- ¾úîóÏ?@bb¢ÑJå¯3â_GQÅ0cÔ·Öªv&ÿ5§ÿ;\iôtSˆ6ÒÍÛ+žÈÄ£ëãèúß|Ë-$Ü8ŸØæþD½!¤ÜÛÐ\gl·Z‘›ë¡-µµHMMØ­V<ƒ‚Ðz{ãÞ‰óç±öñ'hì$ n«¯§"-í„â“&>~Üi½N¢FCål{ùeެ[ïöøGb¯º ÀÀ¾h@[È2ëþö8û÷c­©ÁV[«´Ü•edIbòï>f ’ÝNÐСLzu;^}#ëÖuë¹D‘”»ÿ€J¯?-€ ˆØLìÿßçìZ°Ûqh;–{ï½—˜˜˜ví¸m6>>>Lœ8‘ÚÚZvìØAQQ‘KB°(ŠX,¾ÿþ{6nÜÈ5×\È#z„PQQÁ’%Kxå•Wؽ{7a:/žw× @¬ÑØ}Š}*Eõõ¬,(`Þ®]dÔÖŠÂè¿8Õ‰oà9`J“üü—%€=›]9 ‰‰‰:tÈwÇŽ÷[­Öÿq„¼ À ‡±Aní8¿ìv»#pJ:e €,I’Él6ûÉ’Œ,´&ü9É&¶D4Z œ|ºéþÑ£GG$%%ØÚº»ê‡c7¡ÍfÃf·¡R«[qÚl¤yNû‡q“õ”rºó ‹¢ÞyÒ°54°ý¥yüá†?ð\€Ú³ë¾õç •ŠàÔTr~ø¡ÃÏ Ö®#rÜ8ì6È2þƒsÑ‹ÿ&{Ù2Ò?ú˜úÜÜnÙ!wÝE`RÒi1þ¢FCÙÞ½üþï¹”mï¼ù‘3<<Ë7ß|3 ‚êÖ¬¥~íÇäÿô§Œ[z!a‰Ihÿ»úM#füxb§Læà¦ï|­twSñÎ;_½ÈË×WSUB(¼ö'd/¹€öÚZº¤cÿ~: ŒŒ &7#»vRúäSn=.“o¹…Д”ã~ ——óípè[ÏgýYYY\~ùå̘1ÃY¿ŽQ£FQPP Šy9 66–Ë.»ŒéÓ§óá‡RVVfw÷:C/`VRRÂ\àñ±(ŠÂ† x饗X¾|9þ²ÌÕYY,+,¤ :š@_ û$ «ªRÖÒ‹åå.!!_"¸7÷Øüùó)..¦««‹ÔÔTî½÷^¾úê+}ôQ({öY*ßz‹É7ßLÚé§ö?ë ýü˜ô‹›Yuå•. ÁŽgž%<)™œ — PókšFPd$ÁQQHz!¦Þ{´ëÀ¶/Á­ñ*( ýŒ3|þ›Œ É2]‡±cÅ v>ÿ‚Ç-†eYfÑ¢E\rÉ%ÄÇÇG’ŸŸï¶ÄoVV?ÿùÏ)++ã¿ÿý/ûöís9~(ŠÂ’%K<žý···³~ýzžxâ V¯^M¨Ÿ).fiv6¹‘‘Èv¨o ¿Ùfã›æfžß¾Wjj@Ó¸ø "•ïD-rŒ¨@vf}=o¾ù&×^{í ë8¦p»Bff&III’$]­iÚÐ@d¤¿ªªHªdï·¡1P`Sm(½ÚÛÛU+û~8á @/ÚÛÛ5MÓ$W"@Çf@š¦áçïGHHˆÜÝ݇w©À/ÒÓÓ'¤¥¥IžTõ2jäü¯ÍfCUÕ~§-ÙÿrEF˜@FŒ“ŒˆŽŽæ¢‹.²ÇMõÔ—Y³fQ\\Ìÿû_–/_N§‡.Ks3_ßq•ï¾KñÏ~F´©¢ÞÿÐT•Ñùãɾøbvÿç?¾Wm6¾úÓíXÚÛȽäqŽœŒº¦i}íš% Õfcó#rxs‰Û}OZ¶Œ€ððc?û—$4U¥á«¯Øú̳úö[WÕtaa¡ÇÕ&%IÂÙhŠ‹‹ÉÎÎæë¯¿fÍš59r¤HNNfæÌ™ƒn«¶¶–uëÖñ÷¿ÿŠŠ yfî\NON&-,Ìwù$‰v«•õ<±mkššÔ4nB4™ÊÐzEoœ‚è øÄOpî¹ç2zôhC1 '™Œ;V7n\ö®]»¦ yƒÀð°p“ª¤Š kï¬ß>ûW»÷·¥¥å€—ûFˆŽŽnjkk ÷âéy“ŽG @pp0ˆžõî€?ðcI’ŠCBB. ŽV…˜˜|"Ò1€Ø5N!è+þ#ZC¹®§N€¾B:ð£/%Iâ /$--mÀl±X0™L\rÉ%œ|òÉ,_¾œÕ«WêžÕÑ\RÂÇ×]GÆ’%\vQ9Ù}³Ùÿ˜)¾ñ••ÑZV6à{MQÙtï}ÙSEÁ—™•%Αó}'I¨V+¥Ï¿Àž·Þr»ÏôsÎ!qÆôcnüe??:ØöÌ3ì~ý ¯ ]tK–,±Oî MÓ(,,$:Ú£öv„††ÚõŸ~ú)Ÿþ9f³EQ¸è¢‹ = ªª²k×.V®\ÉÝwßM{{;##y}áBæÅÅ1&8X~_ _e™ƒf3«jkyh˶¶¶2Q¸g)¢ÔîHB" ñܽ{yýõ×¹á†Ü.ïÉŸ@hhh p°ø/àióˆ¤ÐÐP{  ÞÕÖPT»Pqhÿ}èСz·?,Œhmkoë7ãw6úŽaI’ˆ‰‰‘êëëÒÙ–øùù]žœœ|vXX˜ÉÏÏ«ÕJww7j6W!gÖ©³;?ÓÀ4@ñøÇ±“•#ÌÇGê  Ãê'YYY,\¸ÐíÜÝÝMdd$·Ývçž{.>ú(ååå×C¨~ë-ö¾û.–-#ç¼s÷?EBbb8é/aõOе¥Åå2Uo¾Iõ;ïsÉ%¤ž2Ÿ˜q㈈@6™P¬VŽìª ô¹ç¨7¨¨Ã/t®ù±¨x¬ IhŠBÕðÝCÑUçùø˜™™ÉM7ÝDaa¡áóåz—ùùùÄÆÆõ¨‰å¢‹.bêÔ©|øá‡H’D^Þ@³ÚÓÓömÛø×¿þÅ3Ï<ƒ¢(œ—’ÂMóæ1mÌBõ^ >4üû:;ykÏÞº•:³™LDµ® ð]ÕãNDÑ! øç?ÿÉ~ô#"## ¯¹§“¼ÈÈHÓ”)SÎß·oßù‡z8 ü XûjñÁÁÁ"@Ÿð©Ò€€¢(ØjoXSS“ë‡ÖÇ ££ÃÜÚÚŠž8 `/)н€žºçèÃ~™œœüËôôôÈÐÐPl6f³™îîîÍv|5ûwLÔ4ÍîpØŽ#œ§3àsí]ÂÏÏË.»Œ¨¨(Œyww7ÙÙÙ<þøãlذÇ{ŒC‡yt ª¢°í‘G¨xóM¦Ü|3cœŠß÷”›~¼¡i1ãó8õÑGøú®¿ÑVYéz9E¡bÅ *V¬À?2’Q ø‡Ž¢³¡‘.ƒJŽd™â›o&*;Û×?ÁÙÏ£û÷³ù‘G S]®'Ë\uÕUœwÞy„……y]L+;;Û'Uü$I"##ƒë®»«ÕÚ/]ðèÑ£lܸ‘Gy„>ø?Yæyy\>nù£GèËø>€,³³­—ví⩲2Zm6¦÷gÒÀIh¾î¤ÏG?sæÌ~5\‰È=çcbb8óÌ33f ‡¢©©)¬¼¼|Ù矾¬­­­ xxØá¼ªI6Iý<R€¢ ãoSmö㪭­µ ë„xˆA$I2·´´hý. ª¹$zGÀ^M‚Þ•——wKnn®XXÝÝݘÍfÔ_Gè“ɵ@ç*à8¶Ö1ÔE"¼‡†:¡Ù³g3}út¯cÍŸ?Ÿ©S§òÆoðòË/ÓÓã™0Ò¼?_üö·TÍ›GÑu?%¶°ð„êNwÌ iÄO™Â‚'gëÓÏP5ˆßÚÚJk«wõNçÍ%ç¼ó†s”n¡Z­ì~ï=¾¹ó.”Ͻ`±±±Ìœ9“É“'ã7„ÑÔÔTRR|›Ù®§8p€uëÖqÿý÷SRRB|@L›Æ¹dFD û2¾ I|×ÜÌ‹åå<_Y‰YQ8 ¸ÑUod40ˆzàSàvD;Òш´Äfફ®bÔ¨Qn½³žŽõŽªýèèh"""ÈÈÈ`Á‚ìÛ·/¤¢¢âÖO?ýôV³Ùüð`e晴Roq7I3{£8‡Ø¿Íf³sÝÝÝØl¶ÿ_HGww÷ÑÃ͇í'Í]%@Ý…Ò+Ø9'==ý9sæ„GFFÚgû:œÝôŽÿ—8³M}/›äYŽ{rUà8¶Ö1Ô‘ç2`¶Ñ—QQQ\|ñÅ Qœ×ÓÓƒ¿¿?×\s §œr Ï=÷Ÿþ¹Çiƒë×Ó¸~=yW_Mî.&<5U|ñ&šªš˜ÈÌÛÿHÒ¬Yl~âq:«k|²íˆ¼\¦þú×ø»d‡ I–ißWËw>J퇞7¦ôóócòäÉäææÀæÍ›©ªª"??Ÿ””È@||<ééÞv¨÷ ÕÕÕ¬ZµŠ¿ÿýïìß¿Ÿ)QQ,Ÿ73RS‰ ñm|Ñ•ë˦&^(/çÕšPU.®A4Ñ p¿ú ‹]Àˆ¢Ìè߀h„`Þ¼yLž<¹ß:Ãì9íqü;..Žˆˆrss©©©™¿yóæùµµµß"tP¡’I’EE€´ÞÉ_¯ÖKwýÛ›}ò×k£ÜwÚòFhoookiiA±)Hþi.Òõ‹jZ´hÑâââb{|ß•ÁwüÛÕ 2”ÍÕ:Š¢ ¡!KŽ+‚ââá·ßVÀ04¨øgøD-^¼˜œœœa ³ÙLBBýë_)))áÑG¥¦¦Æãíî|ñE*_{É¿ú‹Î$02òMLdœyq“ŠÙýÞ{lêi=(®–•ż{î%2=Ý·Æ_’°vvRµr%ß=ð J—gã $I¤¦¦2yòdbbbìcÉdâèÑ£|õÕWÄÅÅ1aÂÆŒãrš¦˸qãÜÿòš¦±cÇ^~ùe{ì1:;;¹ %…+O;))Œòóóm|èTU6ìßÏ“ee|P_O° ¸˜Èñ©Ñïk(À6à%D"+¢ÀÙ@ÂÕû" pË-·Øu\îÆõ¡xŒþöóó#99™èèhêêê¦mÛ¶mýö›L&IQdIî-ûÞç°)6{•XÝ+Ú›ñutègÊsŒ iÚa³ÙLWwa~aúgÂ@_þ¿£ 22’„„„~©>Î$ÁùïaŸË¿aµZíe ¢¯ â"ÖoSNxà ÞiF dff²xñâáS?hš†Åbaâĉ<óÌ3¬]»–gžy†¶¶6ÖWº»ùöocçë¯3å–›Iš9S`àšh𯍏8&^{-©'ŸÌîwߥò•WQ,Þ…Ç.>“i¿þ ¡‰‰WÜó’,Ó¼s'[žzzPá¡#"""(**"-- —Ï ,ËûŒ´´4òòòˆˆˆè÷üGEEQPP`XÒ×[X,JKK¹÷Þ{y÷ÝwQ…ëss¹$+‹9 ȾlÌ I´X,¬­«ã¡mÛØxø°=&w1ïJ|Ot# ÿ½ù½ \„h<Îa¹Fà„ëÊ”).ÇzÞ]Èílôíe|HALL 3fÌ ²²2 Àjã¿Éd²E®«bí7Æ÷€ÿ/ÔØd6›µîînBCCûeyF…µ·#šóÅwõÞÕ߃ÁQHb´Mýs›Í†$KÈN)€Îpeìac ow8 1¹p Y–¹ð ‰‹‹óyWCEQ$‰³Î:‹™3gòŸÿü‡·ß~Ûã°ÉÑÊJ>»áFRÏ8ƒ ?¹†ÑãÇŸýë4M÷‰ÎÉaê¯~EÎ’%Ô|ô{?þ˜öÊÝn× Œ¥ðºëÈ>ï\Fò™ñ—d™žÖVv¾öÛŸ~Å‹š§žz*×\s ááálÙ²…ÚÚZCq—þœVUUQ__ϸqãÈÎÎ&((ˆððpòóó}büÛÛÛùú믹í¶Û())Á$Iü¡¨ˆ‹23™Ó7Ó÷¡°¯¶³“U{÷rß–-Twv’ <Žè¿ÊÈÈáwF+°¸(Ex-®CÔýOExô3¼ƒhŸ7wî\‚‚‚ ÇòáŒ÷z¡ç">n<Ñ`SD i 1û׿£ö«§§GÌìØXî?Ÿ3ÒÒˆÔµ>¼‡4YfÓ¡C¼½g••aUUÎ~pÅh5ú=To÷mÀxD–ÂL„¡Òp=3Q÷›I&9.n€AõE¨×Ùů“wMMà„˜þmãUÁªXd~)Š¢[HÚ IDAT‡t ^bD@³Z­³Ùä²°æ0ûï½¾þþþý<®. ÜŽGãŲÐç$0Þ®ë:ÇÃp:ÁÓQ~,ð[ÜhŠÎ<óLòóóëoЙ÷¬Y³(**âƒ>`ùòåty((³¶´ðåï~Ï®I“˜ró/ˆ›4It·ûCm6+²ÜçúweUÕµkÕzü‹y²C ž3¬“––ÆÙgŸÉdò9èêꢳ³“Ñ£G» §pñÅ3wî\^zé%>úè#Ó›KJX}ÕÕd.]Ê„«®$"=ý­8Öýüè>|˜’'Ÿ¤òåW<^O×x\~ùåÄÆÆzTKWeOœ8‘ôôt¶mÛF]]a—>Y–QU• 6°uëV,XÀܹsÔÿïèè°{–V®\I°,smN—çå1-&Æ÷±vI¢ÃfcãÜ_RÂÇ€`Ý…ŒLE'ð5ð"a>Xœöyjýü^+žžF{{»½æŠ«±ÖyÌv$‘F“AG/®»,WöEý©šŠÕfE5©ýB®ÆÅ£G—"@0B€¢(=–û,_WþÛßký³1›Í./Œ3[ƒÁÝDž0#2 ªª}¢³?WƒÍæÚ0õ˜{'@Ot3“CœwÞy$%%ùÜøK’ÄöíÛ©ªª"33“üü|BCC —·X,ÄÄÄðÛßþ–E‹ñÔSOQVVæñqU½ñÕo¿Mñ­¿$ûœs ŽŽ:&3ã2”žjÖ¬eÓÐía§G=Ù¯¿þzŠ‹‹ gýn÷«(Œ5Š9sæpàÀ¶lÙÂáÇ×3?“ÉDgg'o¿ý6_}õçœsÅÅÅ´µµ±víZþïÿþ-[¶ÈÅÅ\FTÊùQ´çÇEÂð{s……€Ò3Òˆˆ§ãèQl6«Ë‰œ#œ=ƒFFßÝäRÓ4ûmC÷»Û_{{ûqkü2b€¦ií–‹8q!WÆDÕ­žž·ìÌÈmÓ»?—ŸyòÃ1Û÷cµÚe!xCö‰]ÁÓŠw>Ä` !ü3¬:cÆ æÍ›çsãpøðajjje™êêjöíÛGAAYYYžG‹ÅBnn.?ü06làÉ'Ÿô¸¬°¦(”<ð å+^fÆm uî\$æŠÿP!™d:›PúÜóT¾ü²Ç÷CPPW\qgœq‘‘‘Ã.…­( ±±±œ~úé˜ÍfÖ¯_ÏáÇ ãý&“‰ƒòüMÓøâ‹/hjj"/<œgçÌaqz:‰zYi_Þã²LCGkëêøó¦Mìëîf ð$°¡~‰Ø‡Pé? Ô b‡¿BT!ŒÄ{ÃbÔ\h&Ù9Â)É26›b8Áód¬7òè…{œ €PU•Ç=ÈýÒÚÚÚáå©2F̦iÚ‘öövq’ÒUMµ¿tb±XLuu5;vì@QNçŸ rRR’öÿ§­÷ª«¹gËš­V&w§3rýeˆøþsˆ´¾BDžɈYÄP ?ˆz;E²s² @Y’í£ÉÙ`†ÞÈc À%peg7ü6IbWk+Ëwîä©òrº……ÀÏ©5>ÛÓñƒ|üx ¡(ž,A´öÇXÑï)dà߈™JêØ;“e ‹ÅjŽ›¤ 6ásüN·!0Ù’Þž4^¡¹¹yàwŒ0b€¦iû[ÛZ…ñtî¨j.=ÎB@#áÆ`DÀé8ÜÎß¹òØlJo Mjš®gpÕ¾€».ò¾ŒçœsÎ1¬È6¨ªJ™‹þöŽÐ+¾­]»–´´4òóóûU|s†Õj%99™;’’ž~úiªªª<>öòç_`׊—™vÛÈX´=ßû’É„­»›ò7Þ¤äÿðª OQQ?ûÙÏÈÎÎ>&DjôèÑäää ˆû'&&²téRjkkY¾|9õõõ„šLüiâD.7ŽìðpL¾®ØôhÛáÁ-[xsï^Mãr„¨f#SÑß…ˆÇ?¬Fú³{_)ô¥ò ç,š€À'ÀW@fV}4I’%,VKßøÚ w^o5`ìpÛUU8pàÀq©#‹´µ´´Hý. Úßø;_ݰ0, &“iЋåÎ¥ïÈ¿s8¾~;¿tñ‡c oñPÅ9ÍÇŸ‰PŠkÝ­¸dÉÆŽ{LqY–™5kåååÔÖÖº]V’$öîÝK}}=yyyöŠoFÇ¥ª*“&Mâ±ÇãÓO?åÙgŸõ¸¬°ÚÓÃÆ?ÿ…²—V0ãw¿%qÆŒÿ‰´AGH²Ìá²2¾}à~ó­Çë³lÙ2N?ýô~e»}MÓˆˆˆ ??¿_kX€¦¦&V¯^Íßÿþw*++I ä©Y³8;=$G"ç«c’$ºl6¾>tˆ»7m⳦&nEôÏ.fd–êmÖ%ˆŠ`×§±±¢/ -°‘òg“$â™X4±ßr²$cíõ¸ËÈ'Çp€;-€ÍfëGNòˆWåSSS™;w.ÅÅÅÇìž £¨¨¨Ÿñ¯¬¬dåÊ•üñÄl63><œ·,`^RÑz?_$Ñnµ²fÿ~îùî;JŽ! ¿Èbd*úkµùïATïKþL£OØC7üz‡”=ÀGÀ›ˆIÀøüñL›>• À@ÚÚÛ°8ô²d‹ÕârÖám@ÿ~0 €³MQÅk @OOmmm¾©¶åF ¸.77wB[{Û€ æ(t¾há½E!üüü<º`®nîØ¡‘ É‘ Ø¬675Ä{›Íµ¡±ÿn€®*朜i´‚,Ë,Y²„¨¨¨cûסi²,“˜˜ÈèÑ£©­­¥¬¬¬_›gWÇÖÙÙÉ×_Muuµ½#œ;}@TT?ÿùÏY°`Ï=÷œWe…ë>ZEýê5L¸ñFr—^HÈèÑÇ”}_Ð4ƒ%%l¼çZÊvx¼^HHÓ§O'##Y–ùä“OHNN¦  €¨¨(\²žî§  Ànü¿ýö[Þzë-î¿ÿ~dIâô„n›<™É±±„ aŸ$ÑÜÓÃ÷îåÞ’*Ž%¡„¿‘ö6±‘{"V8ø%".8aŸ©wýrDËßÂâÓçŸÌì“NbThímmiØ/G–$,=ýCî<½:ŒÆ}ÇïŒBý&¢ÿ*Šâuy鎎õU@”K8¦ Àÿ÷ÂÂB4ÈØÔ>"àŠ9r„ÀÀ@·îçûmß–8˜«IUU{3gèæ_sÙöw(¹Ï>€3ˆFû`£-ZĤI“ŽÛ±jš†¿¿?YYY$&&RQQÁîÝ»Ýù‘e™C‡ñé§Ÿ’‘‘A^^ááá†ÆÆf³‘‘‘ÁÝwßÍÆyê©§hhhðÈ8iªJéc±ó¥—˜~Û»`~#1²ë’DOk+»þó¥O>éñ¬_’$rrr(**²Ÿw@ïß¿Ÿ††rrrÈÍÍvéh???»Ûÿã?æßÿþ7/½ôA&7ææò“ñã)ˆ‰Áîð1AÛßÝÍ**ø¿ÒR{z˜€hU{6âaiP1÷×)‰2B«ð# ¡ö…á·;c"ôÚ+.ç¤Ù³‰ˆŒ µµ•–Öq¹\k$IÜñ àÎûë8Ž9~æi€N¼)+ èÕJ#€¿"2%)FøåÔ©ScüýýimkÅ^ Ø¡°pFXX0¬ÛìŽ8vøNÖ€£I²ûú\‘W‡›ÿáì/€ûšÇc†ȱ±±ŒÇb±`6›ééé!00°ß‰vÎЊÕjp‘Ü•ttÅõ÷Ž0"ÎË:ºƒ„ýyë²ä0jBèÊØ+Õ1 @p#n*Ž^z饤§§kö¯ÿ¡ý#W…ήNüÐpˆÿ«® @XXŠ¢ô{¹clFßë_?6Çe¿= Њ„dŸüÙ{ô.£ô°ù¨ûš—Ð € ܆Ð÷¸Ä¸qãX°`Á°â¶ŽFßÙøKŠ‚æ!‹Ö¯Ebb"±±±ÔÔÔP^^>¨>@¯ï>fÌ&L˜@\\œ[}@\\·Þz+ .äÙgŸeûöíÿöª7Þ¤úíw(þÕ­äœ{.QQ'4$ U±Q³f ›}ŒÎš×MOOgÙ²eÙ¯M||žGO?“ˆ Fß—Ï’$aÓ4>mhàéíÛy§¶DYÛ›ñpÃB'0ö"ww H@ðD†B ÂE?\Ÿ¤žÊ÷5ð4®Gæ3!!!¨š†¦9d`9²€°X­žÇÁ¼·ŽË¹úÌ9ÐoêæàÝ]à$8¾ø3âRœÐ $$ä7±±±öVºŠ¢ÐÕÝEDxÄ€«@ppð€j€ƒ¹mt†çÎå¯/¯»2]y „\öÐÐ fÿ€ÏÚ¯z Ýb.Îw·à¥—^JLLŒ×³I­/"âræoê63öÃÕôŒŽáÀ´ÉØ‚=›Kiš†ŸŸ999¤¤¤PQQAeeå ú€Ã‡óÙgŸõ«àêwéì~üøñ<øàƒ|ñÅ<ýôÓ<èYOMQ(¹ÿQVø¿'eî\ä°¬°ìïOÇþýlyò)ªÞzËã‚>~~~\}õÕœsÎ9Œ5ªßóH~~>)))”——³oß>·÷Ž$IÔ××ÓÐÐ@vv6ãÆ³oÓb±°gÏÞyçÖ¯_ªª\•Å5yyL3†Q&“0¾œñKŠÂª}ûxª¬ŒOššˆþ\†Pô´æ< Bp÷Bا"Ì¿àÞe<óù¸†®è¯>C¸úëxÓc6£ijïËÁø£‡€lIÂîõ5—?sÞu„QÀ`("@§1Ê!¼Ý«xoÔéÃiùùù€=–¢( ÝÝÝb¶ìäpåÒ 9Îþÿ5r߀{ Ã•×Ày9UUQl¶ÞÙ¿äàÊê½‰Ñ ]ý߃ijŠ`Ÿ£Œ:í´Ó˜:uê±· bä̼5˜å$¾³ÿ#­Œ™7“š Î¥-#Í+@pp0'N$55•;v°ÿþAgë555ìß¿Ÿœœrrrvùu8þ|ŠŠŠxï½÷xõÕWÝÎlanhe…çÎaÒ²eŒ.(8a¼’,Ó¼c^~6õ ÚðÞ|óÍv;Ó4Q"uÚ´idddPVVÆîCªªÚõYYYtttðꫯ²cÇ‚M&~?aee1>&}Ÿ¾<—’D³Å««ùǶmlok#áº^ÄȬÑß|‡¨Ø÷/„»ïTD†B.}ùûÙ‚è”~/BÍÿž ³¹§wL¦—ˆq7×W’$¬–!ç=ñ8ÃS€}Òg³ —€ wpŒÚŸÈàꘘûìÄÅí6wÛÝçý<..˜ŸŸ‹ÅÐè]8p­Œ¸ZV߯ÍáwhšÖ×Ш—¸ÍN¿'¢àÏd£/9ÿüó‡%üCÓÄ #IfÿAGZHZõ1–„14,9‡¸ÏÖSø§»h\r.{ÏX€5Ì3I•~M¢££™={6MMMlÛ¶ÖÖVÃuDÑj×äçç3vìXÃ8´žï«—^±bëÖ­óø¼4nøœ?ÿ‚Ü«®büå—–”äñlûX¡µªŠ/îü«ÇÆ?44”«¯¾šÅ‹4hËeÝ 6fÌæÎK]];vìàèÑ£†ëtuuQYYÉ /¼@WWéÁÁ<:s&‹ÓÒÈ3}_(I¢¾³“÷ª«ùËwßqØj%xQèÆ°(Æ Œ6àKà!Dg¾`àrÄïÉ¢ÏàçLJ½Û©Ax>Å{"Ñcé±»ÿûfûúÌß`¿’„µ·°+ƒo4¦ëï—q|¯ZÇ÷îlÉP€ }Ì(à„Óç8Q À¨¤¤¤‹ì@’$L&æsÿT M5hì!Ç‹etáto¸yâp\VߟÉä: Þe\Aý~f„©ÀOps\zé¥dggÙøkRoKMàþ—…¸›ˆø¦„æSç°ÿä94ž4‹Ô5õÕ74Mì1°ïO¨(++s[fY×lܸ‘êêj ˆ·oÏŠ¢0vìXn»í6Î<óLžyæË kšÆÎ_¤òµÿ0å·¿#sñ"üCC»G@ö÷§¥²’ ü#G¶•º¼$IL›6«®ºŠqãÆÙïwO¡i¢gzzz: .õmmmÔÔÔ°uëVl6sccùùŒœ–’BŒß÷5a’$vµ´ð^M ·mÞŒªi+Â>ï ¼~ÿh@¸ßïCäò' „}3dDl¸G=•¯ xÑòw¨Ý_U{ª·£Ç‡É“óØ xòr†£Ñ÷…€ô—Þoĸês\ÍÿøIbb¢IÏ£Ô €ŸŸzK`{@u=û‡¾Ž€ŽWD@Q:::ì ofþ®€óßvàçgŸù;,„¦  +|O3Áóp3Æ¥¦¦²páÂa—nàþ×4$Bëö“°j-Ö11Ä|ò9…‡›ÙwÁ9ìYr.þ Ð%M¶ÚðëêÂæq怦õé’’’¨¬¬¤²²rÐ8ô¡C‡X·n©©©¸ÕLž<™‡~˜Ï>ûŒçž{Îã²ÂJ·™o¯¼Ì´ßü†Ä™3[YaÕj¥fÕ*¾üãíÕñŠŠâ§?ý)óçÏ·7ß*4MèÆOJJ eeelÙ²…²²2öìÙƒªª\œ–ÆÇçä„Q|_6<È;UUÜ»};2pÂ[„(t3’ !Œñ;ˆ#"®ÿ'` ¢Ÿ·Âð…}`FäðÿØ5Ìí¢¢Ÿª êÆßÕÐ#I"z°‰œ»I}?½pôæ:kŒˆ€¾¾·YÍ®»fÎF´S¨ójcà„$²,_0jÔ( ˆÝ«ES ×h¥‚Z­V—YúßV«•#GŽô›µèûsˆ€± Ä±n€óËf³¡ØlúÙõmK0Z#±ßp ì0àZn87W^y%±±±¾96Ýý¯‰p€lî!é“ÏðkieׯnBÖ í·ÿ×ûÙù‡_r`úTü:»Húòk’_‡¦ ΦæôSQ½xØ4MÔ(..&--ÒÒRÝþ&MÓØ»w/äääØëé‚‚‚8묳˜6mï¼óo½õ–Çe…Ûwïáãë®'eáB&^{-QÙYø{Uj×#ôžû¶}ûØþü T½õ–«H,^¼˜ .¸€ÔTýöU¨Êl6S[[Ë{ï½Çwß}À/òò¸*/I£G»ÿ’„EUùº±‘ïÚÅ {öà‡pýQÃßýN8ؾg3ñn„ù%â÷#‚ʾ˜ñw"´/"\þ¾BßL^íåzjߘ٫p~^õô^Gw=xÒuµœãgÎÞHC¦æ­û ˆ(Í=^opœˆ 4>>~.Ð/þ‚˜Íf1Øhô;ù®Ô8{Ìf34œÉ9¿Œ£Îë8/g±Xè±ô0*,pºÙÑ|OÀ³gÏfæÌ™¾;.Çó'Iøuu^±‡€æVFï(§váilýý¯ˆÛ\B[V&’ªt¸™ôV½f’I"tw,˜?ÄÝkDEE1gÎ)--T`±XúõL0zôh®¿þzæÏŸÏòåËùöÛo=6˜u«WS·z5)§ŸNúÂÓI˜6 èh$“ ÜÜûnÑûL) Gvî¢âÍ7©yÿ}rûCBB¸ùæ›™?¾Ç¹ùž ½½ÒÒRV¬XÁž={1™¸kòd.ËÍ%]oÌãëgA’8jµòec#nÝÊ'MM fÇK ¾ÝÛqØ Ü ¬Dùň „Yôuä.]“9üŸ/MÃÜž+Xm61ûW<½ÿÝ Šb0‡ÁúÎ:0g8Š'’F!åÐÐP¯³›Þ&×ð?B®ŠŒŒ”œÝÿ b²mímvÕ¿»ø?`Ÿ¹òtuuÑÔÔäróÔí¯ß,Ž®pg&©g.ô-ç¤Jí}Y û 'ùÆ·àâ‹/vÛUo¸è‰Ž¢ô··0ö“ψë}¢¿ùŽ}_HÃÌhþDî®"ó•×ñ?r„ª®!õ­÷éJNDFîÁIJJ"..Žêêjôlܸ‘ªª* ‰‹‹³oÏyûŠ¢••ÅwÞÉ7ß|óÏ>ëQF‚Žº5k¨_»Éd"þ¤Ù$LŸAL^.cÇ3“_of„$!ɲ=t$™Lh½ƒ–­ÇLÏ‘Ž66r`ófª?ø¶Š Ï“ÉdâÖ[oåä“Ovù;‡UUY³f +V¬ ©©‰qaa<3{6çggpl ¿,s¨»›uû÷sûÆTvv…¨Ñ&ÂPŽ4t „v÷#~À%ˆß“HŸ¸gRFäð¯þK6‡¥W̧:k‡ûÁ•@x”Gq·óÍÈÓ«Ãq,÷&0”N€n<Yƒ0À G$Iš£×îwEZÛZû€jìþ×— 0û?zô¨Ç5ÝÁµ:ÔUÀñsÇÙ¿ÍfCÓ´>¢ õ1Yý~¶¤zfí¿ IDATšRv¬!IK—.%77×çÆ_ßž~~Ì£c¨¼ð|L*"ý½Èú¿Çé¸ïNBIé?ø7d÷ï~A[f‡Ó™˜€æ'—-dEÅì¹NÓ„ M¯P^^n?A×|öÙg¤¤¤PPP@dd¤¡WÉd2qÒI'QXXÈš5kxñÅõúߟf³Ñ°n= ëÖ aì¨QÇÅATVáøˆŽv’ŸÖκ¢³¡‘#tÕÕ )ŒÄŸþô'æÌ™ãÓ{òý÷ßçñÇ`fl,žu‘þþÇÌð×utðáÞ½üáÛoi±ZIGûNâ}»·ã‚CˆÂ= JèÆË¿Ç—BE؇Hå{ƒá‡<ͦÐW@S{o C €8‹axa*(xSȨp•;¸! ºFß7¤`€Ž„††ž§ýqŒÿƒ˜´µµõKÌEGGc±XìË···S_?x»e£øŽ7Œ±§§ÇAo !Ë&»çBj@;P\ô°XN @ll,‹/>&=ÛصkEEEŒ=Íd¢5;‹Òe×qæé„ï©&ý¹Ó— V+™O=Ïè™S1µ´Ócß–¤ªDT×ôéFUì¦ì×7ÓçU¿UMÓ bòäÉddd ªÐõûöí£±±‘ììlrss S$u÷à…^ÈŒ3xã7øðýRÏëÇiëèàhGGÛK¼ZßSÄÅÅqûí·3aŸÿ/¾ø‚'žx‚3O.$;=ŽÇ_ü˜gwìà—'ú.æÞ;~T¶·óFe%ݺ‹ª2 ø0—‘§è×­x_F¨ûÇ!ªÅÌB}ñ„JÃ_Ž'¬ôÁ6½hê£9e¨Æ IBUú<à>œëΠÃñ;gO‚ÑKQbÆ%O ªªÞ Ћø€Yáááºñw&ªª  _<7³111466"IíííÔÕyîAqwã8‡œ×³Z­vâ¡ßŒ²,éê4­7ů÷u"{dYæÇ?þ1qqq>7þz=þ––Ö®]KFFöjoJPGòóèJˆC æÐ¤"üzzÈXù±¯¿‡„92Ùj%|_)«?&rÃWø·´Ñzò,l!Áøõ˜ >xˆŽ”d¯ú hšFdd$sçÎ¥¡¡­[·ZÇÞjµ²cÇjkkÉÏÏ'==ݰ¬°ªª$%%qË-·°`Á^xáJKKYxe(HKKã–[naüøñ>mLUVVÆ]wÝÅ„qI<{ÿu‡…Ðc±ñ»—?£ÅlæÎéÓ‡WJW’PT•Gް|çNßµ EU¹ÑÙj6#¯F¿ ìžG 2S[‰ôuäîÝ£WíÛŒhÇûÉ0·7Ttuv¢õ†€ú˜éê9‘z³¬t¯+àrü\þ=˜À“€N"#½£–ƒ=û'!8™ÏR_N40ßßßßåì_G{{»=eΓ222’ºº:Ìf3{÷îõhg8Ø2Î!UUíqÀÈâfÖ4{¼¾£Ù߉à˜8q"sçÎ=&†©ººšÖÖVûù«ªª²7çÉÎÎÆßß_„¢£Ùò,Z(åW\Bak+Á»kðëì$󽕄µ‰Ã OáÐÜÙÄ­ûœÚÅg` #nã&²žy¿û%GòÆ é8‰‹‹£ªªŠ²²²AëØëõvïÞMqq1ñññ.¯±~N ¸÷Þ{ùòË/yöÙg9tèÐ÷JFÅôéÓÉÈÈ ¼¼‹Åb/Ã;\ÔÔÔp×]w‘Æžù%É 1 *ÜwûåȒ̽+>¡Ófã¾Y³ö¶s¢$aVJ››ydÛ6^ë}æŠ(Õ;1‚Ž$X€o]_£¯bßEˆV¼2¾öÑ»ow{÷‰ù¿Û{?öÁ.xªŽ‡8¡€,˧ê%ãÿ€Ý…ïÍÀÅÑ£G©««ój=g7‘‘ÐÕ°«««‹ ×S ³WúDzŒBÖïÙàïïÏÕW_}L„]]]”——÷ûLÿlݺ•={öP\\LRRRÿЃ$¢‚¢bNI$ «›¨/¾¦múÏ#ç…shÑi´äæ|¸™Ô•Ñ“˜@WÜ$Uů«ÕÏ„âešŽÉdbܸq¤¤¤°cǪ««Õ477óé§Ÿ’ššÊ„ ˆˆˆ0$þþþœrÊ)Lž<™ 6ðú믳ÿ~¯Žq¸¦¨¨ˆŒŒ BBBì÷xEEûöícüøñ¤§§Û;rz‹C‡ñàƒ"«Ý¬xâ×äe$Ø›ôD„ñàŸ¯ ПGž_…¢iümÆ ¢<xJíV+ß<È=›7óqSþˆÙñ¥ˆþ‘†VÄìû1`=Âcñ#D‘Žxúfú¾˜ñw›5úE?CÚ{ß>T#’#Ž+:::í"@û˜«jnC¢ÛªæR`äöwõr†þ¹ã³ëÎ.èÝC½»¦e(ä‡JfëlÊÜ– u…ÈÈHêëë½€¸rù»rÿ;»wõ¶ÅÎÄEÓ´ÞÀ½ŒS¢_E+CÀ÷œðóŸÿœ3fÐÖÖ6 Ô1\ìܹ“îîn—žI’èììäóÏ?'>>žÂÂBbbbìç[ `çµWÚØHs^.›¾ŸÌVSpç½hþÔÏ; Õd"þó¯Uº“ÚË.$jgaûj ßY5:Šª‹–Бo{Mý¦NJff&Û¶mãÀ†ÆP?Þ½{÷Úû äååÎQU•°°0–,Y©§žÊÁƒùè£Ø²eË „c¨0™L$''“žžNjjªÝ¸;þ&I’èé顤¤„½{÷Ú«"úùùyLZZZxøá‡©ÛWÍkOßÂÜéyàúÒ4Bü¹ï—äÏ=Oü—@Iâ÷S§2ƨ«š$qÈba}]woÞÌÖÖV"€¿32ýûÿ"füeˆŽ|7!fýQøÆÍ¢iQ3Âð?…HëŽ "þ‰è8îΈu£o䥕ú²nÜ…<ÿëpÞ¦'!oÇK³Å·­þìÕ†ÝàD"9Fñèïpe4\ÁhÆå Ü1DÇ™¿þ·ªª=zÔ~“èǨß8’,9ÜÀô‰[T㸓í{$ Ü|óÍdddÐØØHEE6›Íãs٫d¹»ž’$qàÀÖ¬YCfff?}@Od=‘ÂÍÖÁ¼<¢ƒÖ`Œ ¬¾Ù¦¸úcä Éo¯Dî6Ó•FGNí9YH6«WÆßùø£¢¢˜?> ”””¸%§º:yÇŽìÛ· &––f¨0›Í‘ššÊM7ÝD[[UUU”––òÅ_°ÿ~ÌfóîmI’§¸¸˜™3g2nÜ8bccÙ¿?Û·ow;‘$‰––6lØ@RRùùù‰ÚÚÚxùå—))ùŽå-ãÌ“'ö7þ:4@Yâ/¿¹˜Ð îøÇ[µÙ¸gölF;z$‰Ú®.VVWó­[©êê"x1BÆy}V¾_h@%ð&Âð7ÙÀˆŠ}aå½/蟢+ßF„áïõ1Ö#òÌ_ÅÎâqEgg§:ÎÌû‡%ž'Õ8¿wž¹» eÕð¶  ‡)ßy^mtœH`‘,ˆñýÂX­Vzzz<®²äm?fçýÇe OÁ©¿ãMä¨ÐT Mîóhšq`0n|¬!Ë2wÞy'€ ±±±TWW³oß¾a{dY¦¸¸˜±cÇRZZJ]]&7]þ$I¢ººšÚÚZ ÈÌÌ$  ßyÖ‚iž3‹šóÎBC"ó­w‘vÒ¼p>¦£G Ù]Í®®åhÚXTßèÌ5M³ëvïÞMYY™ÛY÷llܸ‘ŠŠ ŠŠŠHHHp;³·X,3a ¹òÊ+éèèààÁƒ444ÐÜÜLGG‡ýï®®.û DTTÑÑѤ¤¤ǘ1cˆ‰‰±*ÑÏaFF‰‰‰TVVRQQá–\H’DCCMMMdee1nÜ8BCC]’™îîn>úè#Þÿ}½û*–,˜4hËÜàÖŸMtd(ËîømV+OÌ›ÇèÀ@vµ·óFEO”•qÐba:ðwàtFž¢ß ”/!È‹ aðPö‡ ¿/*öIˆJ}Ÿ#ºÿÙ„õ܉p˜¼ˆ÷á¸×$ïîê"@Çl,; WœD'ÔF•Â:Œ€£Á×?sgüEÁßË1ÆÃ±Þ„~áÕÆ p"€Xçô?瀦‰ØŽ>;òŒŒ¾‘ÄÅëêêB’${h@‡Ý õ÷èlÖÝ@û}€)S¦°téÒ~Ÿé5ô“““©¨¨ààÁƒ^³\úyŒŠŠ²«ìKKKinnv{Íl6[¶l¡²²Ò®0™Lh@sÞ8Z²3Ñd™¸o6ýÅFö/9‡ÚE IùøSBöÔ nüeÙ܃„äÁ ['w¹¹¹¤¥¥±}ûvÜõGŽaݺu$%%1qâDÃþŽûÑï=Ý;0vìX;sô<9ÎB½ Ž÷š+cDaa!cÇŽeûöíƒ+ÒõuuuäææÐ(ŠÂG}ÄsÏ=Çn>«–žLŸgÏdI檋æèoâšß>G—ÕJzx8/TTУ(œŽÈy?ð¾èê÷‹N„ØîiD:Ÿ X,Ò³¯JõìV#z(bÓuƒ>À³VÇÝÐÕÕկߋª‰n}  ¸ŸÌ¹z9Ãñ¹sî1à. àíäÓ‹ðÞl~h@’¤³ŒâÿúÉ–e«Õêi¬ºÀq¿®nç÷zz¢~ì®Y¥Ô»’D æ¦€mˆá‹áÀÏÏ;ï¼Ó0E¯¡ßÜÜLyy9f³yÈý<%''GMM Û¶m£§§Çp›’$ÑÕÕe×- _/!éHN¦é¼E4Ì;Ir­/åÒ=$7o%õßÿf÷u?¥Ù‹¬M m¦M›FVV%%% õ$œhhFŒÜöþŒhõv:¢bøFѯ·ã­DdlÛTÿ¼Ïî;îQöÝaìUû{Ü=Ê®€£PÀ`$À•ÀÀ[ »Ê£NHðjÃnpÂY–sÝÅÿ¡ÏàʼnRCW}ôý»Š™Íf»ÁÒ?s$zÜ\ê5ú²C.+šæ6 *Ç¿`qq1³fÍt¹˜˜N:é$jkk©¬¬t)ÚôªªÚ«ð%''³sçNví=ÅŒ¶)Ë2dõêÕô)Iì¹ð|4Y³ UCR5dƒz Še½óÉ/¾JÝWs$gh2UU‰ŒŒdÁ‚Ô××SRRâ¶À‡£> ¦¦†ÂÂBÒÒÒŽIÑ%o IñññýÚ'»#ߺ>à‹/¾ )) EQxøá‡™7+»o]JDÀІ?IâúkÎâ»u¬xu=÷c‡ø›¾/ìÖw#TöqÀ¯­xcÆÚWZBÄôw"úÇn+ôE6 qÓÇ} êêê²ÏôUUíßXõT\ÁÙ f4Ówß¶sàŽd;áà¯6n€…„Fñ'Üd2¡ªªWõñ½½ú¾ô]=ΟI’D[[›[7’¾ž$éUtÁÓô›Õõ³¥ïãxcÉ’%„……y´¬$IŒ;–„„vïÞM}}½Ga]Ua¤$t1*¤¿AVU•àà`&MšdWÙïÛ·Ïí6%I¢ªªŠ½{÷RXXHVV–¨ÐJÐ4Q^Ø6*ÉEHE3ÉÈ+ËW½êSöüáfêgNëW4HRUB¤#9É£°€þ[’’’HHH ¢¢‚;v ªèîîæ›o¾a÷îÝ“âKÞÂd2‘MRRìÞ½{PÏÂæÍ›Y¹r%é)£Yñè2ÆD‡«u¯d±ñ£sOâùW×ó5#‡”!ÊçÞƒHë+@€B ßÄ÷A$ˆwÛ¾}âãnD”áÀó¦®ñ=yÆ]Ñ´=”jOCF)Î0 il6!!Þ5>|ø°§‹¦zµa78QÀBýdÅÿõÎcz76OáíEÐáÌð\Å|dY¦££«Õj?>GbàêÛ®N^õ8–qìg¨îÛᢸ¸Øë™|@@ùùùöúíí톱|MƒU_Db2E°ì²úB|ýŒˆˆ`Μ9dggSRRBKK‹á6õ¸wII {ö졨¨¨¯~Ð8k:ɉ˜ësË2aõÞu?²¬QvÿÎÎìoä%‰1;v’sÿ#4\°˜º§Ðé±>@’${þü¶mÛØ»wï Ä®¹¹™Ï>ûŒääd Õkhšf¯––FYY™aIíÖÖVV­ZÅè¨Q|´â$ÅE¹Vü{‰Ù3ò˜0.‰;+ös'nÜߊ0Ä/ fáVà4à,„„;ßÄ÷AþvD@ÿyì]ùš³ý§éŸÊ7wj±Xú‰ù4­·1}TFÐ ³£7·Ÿ˜ÐÉ`;G æp&úò^ý^/€ 1öµ=Q@–Qü_‡îï„qC%Žû5Šÿ+ŠB{{û€£û__Nü ÔWÈh`ÿ>ÜÿÀ…}ÿ»óŽªJßø÷Þi™ôÞ+„JBé@Dq-뺶]uÝ]]ËÚÖ]]ײºÅú[ÛªØÁˆRTJPZ5ž^H&eÚ½¿?nîd’L…@Â>|æC29÷Ü2gÎyÏû>ï󄆆2mÚ4ª««9tèPŸ’ÎuzJªõ\·¸A€ºFmíZÒ“{’Õg˜˜˜HLL eeeìÚµ ‹Åâ– e›7o&11‘ñãÇ Z--é=û×hˆ:T@ÖSÏÑ‘žÂþßßLgdDŸ…]´XHçcÐëHúä+b¿ßFéÏ.¥zÊ$…PèÃ]’$ çœs#FŒ`çÎÔ××»ÄÔ1TVVFUU•ƒp²<ý‰ððpÎ=÷\—å“M&ëׯG@æ“WïfÄÐÄ~YüŒ‚Àoo¸[ï<`j¿ôÚhCYøÿ |‹²È_ÌGQìèŸø>]}5¢T|GÞ^Šà%àD?œÆg|Ð™Íæ‹«ê1•Õ0€;8¤€½yÜý­7œ õwO!€“Ywü€ByÓï“ôÂ`1Œ€c±pÅþw®=îÏÎX¯×£×ëýÖÔwûw¶ ÛÛÛ±Ùlh4š>–¦3Q¹^… K2²Ð¥ ²ZÝÜ'nÀ`G||<ÑÑÑQRRÒcç^Û€N ‰ñm4žÐñöªxZ5¥¥¥ìÞ½›¶¶6:½ùÎÌÿ‚ $&&KII û÷ï§¹¹™M›6ÑÒÒª×îâ¼é£ÀÚcX–™?s,Qä Ib2ƒCÖ·…Ñ7Já p J¡¡DºüþŠñW£æùÅíix E¼gàµÃû V«µ û÷1{Ám-Üþ*z{zÿîÊ ÐÏ¥€]!Éï¸À`1&C÷Bën‡¯>x_˧ªP ù W¸«@kk«[ s?vÉŽ v½<ŠÌ¥ëÁ7.ßþ@ï´Áºº:DQÃîƒÁd$Z2ÚùÏ{ÉTÖk;ÔŒ1ÀNk›–GÂÈÎjÆÐsñe½^ïªUÝéž<†£GRXXÈØ±c6lz½M{A”ÜökŠ/\€h±¸ÜÉ45“òÆJd]†–°0Üð ¢'M@ßjÂn4€$+œQ@ðÁk£…©©©$''SPP@~~>‹Å£!ÐÑÑá¨/0XøZ­–ÌÌL‚‚‚xê©§¨««åÝÿû—œ?±ÿ.d¤ÅqÃU³xç½Mü ¥@ú@¡e§ÿÊ¢‹’¿J|_¢ÿvû Äõ?¥GÞÞvFÿGýt*O8ã­· ÔP3ÜW‚U³_z®\ý®vï®Bþr΀ì÷ \`°ÔÔÜÛ ˲CmÏSE6Wˆ‹‹óËPÏé|nçŸeYÆd29v¦½Sõ›Õ†Ðõµ¿.÷?²ûª†èo’““C}}=ùû 8Zn`ÆøV|’HB´•–v‘‰£MØl"Ÿ|˾B#¡!6²†õõbªŸEhh(3gÎdĈüøã477{äȲ̞={zÔ8tõÈv;¢›¬YÉXó Ú¦zêÏŸCúËoÿÝŠ/½˜ºq£’`×â¿'ãñãTÌ>kPÏa€Q£F‘žžN^^ÅÅÅ.Ã&Î÷¢òRRR3f aaajttt°iÓ&<Ès\˲ó'+Ïå4@´Ù¹zÉt^{oߣø9Ó(@cÿ;Ð Œ~‹’–h ÝüªRÏ'(y{²BØØuúÍýt*_pÆ'#• ò{ºÉ^<‚{€óßûwè½ùSßs·û—$‰ˆÞ\#àg`¦ß'pÁàAè¡%ª>T»ÝŽÍfsü¬Zu'NøÞŠ‹ó_Ô•ÛÈÙj4™L.½®,M»ÝîâRsÿeœ¬Yw€³Üà Aˆ‰‰!8l<'Ú4ü°;Q9wRf‘èˆNÖo‰aב@~¹¸Îåâï õùÆÆÆ²hÑ"¦OŸî0ÝA£ÑÐÞÞÎwß}ǦM›¨«©q\[ß †ˆâRâ>øœêë®fßÝ·‘÷÷¿` 0’þÖÊîf²Lú¦ïñבñìëŒzímd?Ýóv»½^ÏôéÓ¹à‚ ˆ÷Ø^5hJKKùú믺 ý!Ñì/¬V+kÖ¬á7Þà‘;–rÃÕó0èNovþÔ)£ÈÊLàï(4÷3+°e¡<„²àÿ xe6ÖÓÛdØÙužßßB§¬èøL.D1Îä10›Ýi>•s¦c#媠·×½çto¡ç¹ÜÝ®ßùå‹<¶3Ìf³¿¢oY~À ‹ ÇutÇÍ{Zi'눉‰ñ«½«ó€hkkëá©èpîG=^)ÿ‹2p»vGª5ëÖ0@Àé\HŽ[$À¯¯ìä‡\=©q aãÎ`®]TOΨÚ;5hDƒÞó3PŸ÷СCIKKãÀìÛ·ÏcX@«ÕRWWÇúõëÉÌÌdôèÑ}eleˆ8R€ØÙLèöDϦ>k$-÷üý‰HZ-ÚN3Ã>ÿ’„×ߥê†kˆüv3æ”$Nv®Tùóçϧ¼¼ÜQ_À“7Àn·÷á8óeN'$IbÆ ,_¾œ?Üx>¿ýõB‚Nó⤹û¶%Üt×+ä£,ħ &`7ð°e¢ZŠÂêA×Wšþ[í(~ýP$‚QùÂ~:ÍÉàŒêæOEÐÿW~v ¡;õ\Ïç½C¾ðz{Ü…ìv»ßJ÷F¨¿¸Â`0FºzS5ÔCE‡€3ëØDGGŸÔ…¹úív»ƒ´ÕÛCર‹ú7%@ñ* Ëšu§àqŸ¥ˆ‰Ò2k’‡ïŠ&&:×TS¢’ÜP®¾ ‘œ¬¬ÞÇ–½Aõ2 gœ`Jv¢(#I»÷G0nT3z]Ïg&Ë Q4''‡ÌÌLvîÜIii©G=nQ9v옣Ìmff&F£Qù¼(¾`>µ9c¾jÙ¿ÿ# - èšŸÑM`]=Y¯¿Eèæ\Šþt75#†“ðÆû´¦¥ œ‚û[÷ÉÉÉ$$$PPPà±j"¸×Pû;]ÈÍÍå¹çžcáì±Ü÷»¥Dž¡ÄßÉôÑŒâ¾ì® I’ˆŒŒdéÒ¥±}ûöc¨74 mmmlÙ²…„„ÆŽKLLŒcQ7l8ücU 9÷=€¦CæÐTUMÚïƒM®7Ðídl ÐÐDâî½Ä¯^‹-ÔÈá›EKšïÜu•0uêT233Ù³gUUU½²¬èTVV2räHFŒѯúEEE<úè£D†êùìõ{HŽ:%•?Ÿ`20K#"Ëæ&ðìÇe¬n=…®eàðŠrN ÜŒp ÿˆ} Lº¥(†×q[‰ÇŽB/H·¿3d2²Z,’‡…Z…€€]ê+äÊà*öï ®<®¼Ãêÿþ¦éú#oï„‘À®“9PÅ`0|ÒœU¼ ~‡´Z­W‚Xo¸"ÿY,‡êŸÚŸ§4@õºw j¢(()€ŽË‹ðë>û ý±klhh <<Üc®~t¤†?ÍÖ•ÞÙ¡ÅÔ)òú#Á”•6òÂcihÑmæ§¼êš5üæJEüJVÈ÷^a·ÛIOOw(æååy¼&FCMM 555 2„¬¬,‡ Ÿ=Ј)3ƒ_z ÚzGC°Ù©šCÎãÿ{¶@#º¶6âŽûÝVÂÖ~GçØLôÅÇÑ$ÇÐ ‚@`u5m }uÜ@åÌ;—ÊÊJöîÝKSS“ljÆn·³ÿ~ŠŠŠÈÉÉ!55õ”ë Ô××óØcqâD3¾÷ #³Ò ã¤&/ïíÐ^m…ÐQ² (÷rŒ¬‡çØm¿¢jÆ9>ÐêøJJJ">>ž£GràÀ:::§¤¢Ž™3Æ0,>²â‰]‰o–fh-„ö":èŽTö´øŒ: ·]–ÎuOìg/¾çEµ¡TÇ{ø…½¿¸¥¯š~×__?%•ïK"¡ìýÙwÑÿj~§‚‰Gªé|’¤„JÝÿžža÷F«§GÖÓËz½ÏÑûC` 5hNRöÝ¿8ƒ À¯yCÂÂÃèèèðÙµo0ˆaöìóHÏHãŸO?ãõçA¡r,‹GÍõ=çAç°6QÝHvì’ˆ¡Ë¥ˆZ¸¹ Ÿîo°aË–-?~œãÇsøðafϞͼyó¼c´GÿÍûŸ6óÜ&Rƒxôî¶½Vfø¬ø$‘°;³ÚØôS(M­Οᛆ¶êNŸ;w.µµµlݺ•––²Â6›={ö8„„RSSûÄâ ¦vä` m£†¡íì¤#5ca)È2žÑÿ÷-çÏâxÎXD«Œw?D ¦%s¨ò kµhÌfì:OuÜ5ŠÔÔT:ä(ÐãÉ{ÓÐÐÀÆIKKcìØ±„„„øl´··³|ùröíÛ×õ,%Ö}—ϺïòIKŠdÅngîøa'—ÿ/`k‡¶ ÅÅo­§{Zð0=È2çMˆÆ Ya•¼ Àz¿útû.@©Èý»ã·¡,üÿE)Á'jµ\ÿË_²qãFJJJ<þJ ¡Á„™Œl¶žY’|ðt×ðFìý³?€Þý‰¢Àm¿»…°°0ŒFÿ¤€OÒðkóì ƒè—˜×=÷ÞETT¤_¤ ƒÁà(É{þ ¸÷þ{|:ÎyÐX­V¯¤³ÁÐ;6$8ÞW-Y©‹Ð"9Òûœßç;ì_œJ ¡¡/¾øÂa™ÍfÖ­[Çã?ÎæÍ›=–“ˆ×pÛQ|òJ"Ïý5ŽòJX¿]÷SׇM‚«U3}|#s&·²ó`v»ª²è¬V+,]º”3fxu‹«ü€­[·²qãFjkk{ÈUwD†³ý©§¨˜>sXûn¿{Cq S®»}QE/DEwî&tÛ.Ê~v)ÖÀ@’ÚÍøg_dÂãO½ÿ€rBŸ¿Ýn' €I“&qÁ””äÓ‚^ZZÊÚµkÉÏÏ÷I?Àb±ðÁ°nÝ:×ýU6ríÍϰó@)h}u} ].þãPóT| ÛÁÚˆ?ÓRz¼‘ß-MæÜË‹PS?*ûPêã^‹âGí¯…_:Q³··{ôzþõÌ38p€©S§z[ükPˆ'å>€ÝfëNìZø½òÁ.èíꇞ º«€§9Ý]ìß`Ðó×Çæœs§##û]¨££ƒðp¿ÕO9çv0> ÜpÓuÌ›?DZ°ø £ÑHG{·Á0Á\®ºú ·í{ð²,;b4®\FžÜIÝV¥RþW’z·ÀCªÖYe™uëÖõ1ÎÔ’Éï¾û.ÿøÇ?ÈÏÏ÷ÊÇÐj² Å*3uœž‹æÇp¸$„ÙSt¤$ê$‰ñcš¸fq-í¾ÜË«$±97šŽNß¾6›ôôt®¸â Fíõš4 uuulذíÛ·÷ðHz=írBݸ1¼ów²É``Ø^'ðxi¯¿ hHXû 3/»Ž=‰¾ªŽS§b òðQ‚ïfJú»ÝNxx8³fÍböìÙDDDx½»ÝN~~>ëÖ­£¨¨ÈáUpõŒÖ¬YÃ{ï½ç±¿ã5'XxÍì+¨ÑA¡²ø›¡q7T|µß@G ;bû~Á.sÉœ:€M½þ´EH' e!žF ¬/Dá ô'±¯%´p=Jæ@Kl,¯½þ:¥¥¥üáJùöýë_ÞºZŽC`Pa`<v»Ó®¿g&€»KR Ùžvù®}wp^ô³ÒÔÀýþ‘””d@Ù`øk´··óø“ó·Û0¿NâƒÁð‰ÈÎâ‹"Š"z½Þo wžå¥—]âñCrå6rçNr5°œÿw5’¤îWwq‹Áå8Y”••±yóf;ÊÒÒR^|ñE^~ùeÊËËݶS1)'åOÇ£Ó Ì˜ÀÁB-¡‘c1™3Ði5D‡wòášxv dìð Ë ¼µ*Iòm­.”&Là²Ë.#99Ùãâ©Þ[QQëׯgß¾}n«&çæb4²ç¹Ç)ºé’ö  ¤’¶Ñ™ˆz-–¸¶|´‚Ÿ|˜£- %)¤-ÛÉ~ä ôþÉ‚öà,X°€)S¦88 žîE­/°aÃjkk{Ü£$IlÙ²…W^yÅ'ÏB]£‰%×þücÇé¯ÀÞ -Gàø8þ´î©„Sš4"œ™cCyhF‘Èû0 x˜Â ZŽ·? A -|\üH™4‰•+Wrøðan¼ñFâãã±X,¼ñÆxên?JßÁˆñØmÊ|é$Ôíp}Œ€"£îngïÍ8ð´™sõºî†_–žæh×ÞÖN@€š&S+Ægrßôç°ÿ À§@þÍ·ÜDHˆÂó 4bµú^ôJ¯×“ŸÔ㘈Ènùͯ<§€ž©Ü¿Ü-þ’,u1‹º²SL‹.—–ËóŸîÔ*78Ù@pp0³gÏö˜r¦Zç»wïæÉ'Ÿäã?öšÖ©^ÎÒ…aL«çÚ»yì%&ëh̶D•¸îâ¦oä¢Yõ*  ²Ö@eU %¾ñdl6Ìž=› .¸Àk|\E¬V+ûöícýúõ!ËNi†²Ì‘E ÙýÌã4 J{BÇuÛ¾wÀù}u’up†$):‚¬f(é,vI@‡Uë 'I 0DEEqÕUW1yòdÖ®]Ë<V«•uëÖ‘››Ë’%K˜:uªÇ/Nx¨È½¿æêeVôz˜H-ï}ª!=©•1#µ˜L2V«QPÖ˜×GQR­ç×—Õ’×IXˆ÷…Ìf³Í’%K(,,d×®]«ô‰¢ˆÉdbÛ¶m;vŒììlâââ”· Ð’‘Ž ËD”•!XM”.>I§Ån4"X,h,$½ÂåÑX¬èëª1MÍAÒi­6e†úõ£‡Ó4Ìwƒ_åL˜0!C†°oß>ÊÊʼæ'—––R^^Npp0ÿýïOF¡ŒM¹Ô~OphØÛé^ìO“Ä´,3,1 8Šâî?—nÑžþdóËÀq”ìU€øå/É/~ñ æÌ™ãÒ…{âÄ ^|ñEoÏrŠÖÿ`Å€’2ÀŽ*žt< õÞ°y 8ÿ­wàÒË–ôPmmi%,ÔÿuY5²µZ-W^õ3òöúúŸÈðZL=3s(qñÝ}  ~Ô`Å Ðr¢§Þrjj qqqÔt…QáÑ-ïdôL@Ÿ Ö‘:"t²¢( ’(zŒó»“>Ý8 F£aøðᤥ¥‘——Ǻuë(++ó(\sâÄ Þ~ûm6mÚIJeËÈÊÊò¸P¥$vᆦ¨¬5!²-u|¾ÑFfr'õ + I2³vK•u:‚øhï¡#õ‹>dÈRSSÙ¿?ì¹ÃïQ©««s°ìGíÐ@–)Ÿ2™š·W` F$:"íh;;±+ßccMb{'ÍC2ì‚ÝΘ×ß&öƒOž;‹÷Þ‰ä3ÉN$)¥Ig̘AUUûöí£¾¾Þc mSS+W®ô[q³ûœvšê (˜Ó¶è;Á.Áæ½J)Õ£ìömôŸbŸ€²ý-FÑè_ßÕ÷-·Ü 7ÜÀäÉ“=Ž×µkײråJ·G‰\<†¢„;þÚD{‡†)£¸ôÂVžz%‚¹ÚY<¯Šº&=O¼–Âʯb‰ ³3q´‰¬aÞ7õsž0a™™™ìÚµ‹ÊÊJ·†€šZTTDee%ÇgĈÝú¡ÝR5B{'‚$ahi¥#: °ÊãV™éièMmd½ö&Ñ«×Sù«ë9|Õ2Å­áC,¾7Ô±˜””D\\%%%ìÛ·ööö> Wgg'ëׯ?éÅ_9´¶XNúxQÕdæ¿ë*˜ ¥ÿèóÊBøE¹O«Óqçwpýõ×3jÔ(¯•òòrž}öYo§zÈí‡K> ,»#kJÝ@©"?nÑ‹è-þß»­+¨›ç´ï”Ô"ºÖPæ 6€À@ÿR¡§™¸ìqìݳ×Ûaþí‚]`0^ƒ›Îå|eYÆdò»r’r"QÄÔÖæ0€ž_à z©”ÁªÆ¥ddÉŽ,H‚äѱæN h0Áf—yùݾÏíàéû,ø袋ÈÎÎfãÆäææÒÙÙéqݵkûöícþüù,X°€ÐP÷Æž^'põeáÌŸB[‡DB¬–÷?  µÝÄÒ‹N Û%ö C`bV;'L^ù4–»¯µ’šè[*©Íf#009sæP]]ÍO?ýäјQùùùù”””0vìXÒÒÒºÓ e™ÊéSŸxÙ¬Ä,5"¡ÕÕ˜b°êuŒ}õ ÂÖÿ@áý·S2¶ÒñI,þÎP šÌÌL’’’8|ø0‡vdX,Ö¯_ï·Ô¶+4°(Ù§{ k¾ßÓÀ‘òN~MÿøUÀÝ(;þ(á­¿Þq?ÿùÏÉÈÈðIêÕn·óÞ{ï±cÇOÍ g Ö Œ@%J=¹S¾„zs·÷!Ë2»vïf\ε=û®î;áõ¶ ]ý]ÝM©»'5î=Ð!€.KV–$Å ‚ »—=²**ÍD†Š$'é9tÔÌ]k 0@`úä`‚{ö£Ñh1biiiìÝ»—¯¿þšòòra“ÉÄ›o¾ÉƹüòË5j”Çë3è>\žˆÝ®¬«Ÿ|¥cH2,[DmM3ßíˆ$1ÚJBl'Ÿ}Ƕ}Á vÍ8Áäq͈¢wYa€¡C‡:ê >|Ø£ Ÿ Ô×׳iÓ&RRR7n¡¡¡=Æ—`³NCð®<Ú'e“÷ø#œHNì»ë?É0€«ûe™°°0Î9çrss9vìØ)÷«¢º¾óôÓÆ8PjbÝŽ®æäóúÀ„’>ø>PŒ1‚·ÿô'.¾øbÂÃÃ=ï ¼üòËTUUyjöJ ¢³2I6{ _‹õôt·÷E 7z{Ô¹ÞbéæÒé´´µœÃj±ö˜?,¾¥¹Ÿ²‰}Vûöå÷ø=;'›Õ«¾`Ú´i}¬0w((( 8$£“F³,Ëä«êk.àn0¨^u08®8W~W Ë.I¢€(áA4eàB¾v Ölê༉:$»Ìïþ\Ç “̼i‚ŠÊ¬¼÷q3×]FJRw¸* €iÓ¦1jÔ(¿øÿþ÷¿™4i—\r .Û‚@2)‰-bì˜d66E°çh·þ¬†m»#ÙšÌ/סÓÙY±*ŽøØNÒ| H’„V«eüøñ :”Ý»wSQQáöù©ã¤¤¤„ªª*†ÎÈ‘#1 C`߯n$jÖLÚ£c舌è³ÐËZ-¡Ç iMKSÆ—]/†‚Ýnç³Ï>㫯¾òé¾}…Âo•O¯@'òé¦ã˜Íçâÿ ¥joPÒùÚI“&±üᇙ;wîIÅrUlÞ¼™×_÷X˧Eño0éý{Âyì͇ÀÛ¸v*ìÎåïŠà©_W€²Ò²¿GEE‘·ç{ÆŒƒ¿hljèñ{i¯¾Oƒ€W-8F­“`ô˜, |üñÇ}¬0WhjjâÃ?`æy3z¼_^^AuÕ©¥Ýö¶{ÿÞí‘U¨BòÀô÷zZà«ÐÙ)±ë€…ø=w<\Çù3 ˜1-æ;~ºžM?š1µ»¾•p×]w1kÖ,.~õºvíÚÅ#<ªU«hmõ\Ø ð»_EsÞô`šNØyá 3 Î12v  !8ÐζÝa%‚$›ýwßÙív‚‚‚õ"##=~n*?`ÿþý¬]»–¢¢"ǽ4 FGD¸ËÅ;´´œ‰·ÝÉèVÐÐàÚxkë‰Î?€ Ë^e…wìØÁòåËý¸cß0ad‚ã¶?PÙhæãÕŒ2¼¶î†(^®F) tÞ…òÝwß±uëV/^|J‹]]Ï?ÿ¼·TåP ž-8 Ü=ovkxæ¸ÚÙ{J ôjè@}åçïÇjíþŒ•ùK¢­Í?ŽZSSQ1‘=γ{׿ú8Yœ@~þ~ÇÏ¡¡!,»üRöåçñöÛoÓèA5­¬¬Œ—^~‰Q£G’‘‘Þ³Ï^žgxŠï»bŽz™d¹Kò‡«ûåÞò(À×/Ä#fšM2ï¯614UËâù!´¶IÄDkyæå Êl¼ðh £†yVÅRùwÜqcǺ×fP!I_~ù%=ôÛ¶móI""LÃo ç¶ëÂТé0‹üåw2s§µ²â³xj›´ÄE{®S°{¦v×N3»ÝN\\\pÓ¦Më±³wAhoo'77—o¿ý–ÚÚZ¯Õ-[S’(øÛ_Ûô#Soþ ‘÷m$É$ü¸“1>ÆØÿ{™Êãûlhhðø÷“Ax †¬aa`?,Qà§MW™YŠo™¥ï³À À{ ×Þx#¹¹¹¬^½šóÎ;½þ”‰Õ|òÉ'në&t¡ x EüçlÁ€¤$ÙUét§ùÒ+7ʃ°'/€//µ½Ýn§µÕDqqqSOœ<ܾ'tȲÌÖ­[6l¨ã½ââêëûÿ{é gEàõWß`ÊÔÉ5À±ãÆpée—°ê³/رc_|1Æ #,, Y–ijjb÷îÝìÙ»‡)S&rÁ… zô×ÔÔÌò—_óxNO¬PH€²$;„€¤.U+©ëïžvÛE¬¯÷­ºÞÑ"36›ÌÔqþrW4ßo31)KÏ'_¶òív3/<Ű!z˜Ñi†q?¹jµZ? //µk×RQQá1,ÐÞÞÎ믿Ά ¸òÊ+ÉÌÌôÈÎ>gŠ’ooµÉÌœh`s®‘s'…qõÂJ:;íÄF¹»UTYñyËæŠÌ™æúË©Ž—ÌÌLRRR8tèn¥‚U¨úÉÉÉäääêZJ’¨œ6™šœ1Då ixfß6¢@ñ… *« æ³µTÍžMk’ .A/^Ìœ9s(..¦¦¦†ââbÖ¬YƒÍf;) €‘é ‰óO Õ_HZ‘?(&E–ƒ÷íi>Š\ï@£ÓqÏ]wqå•W2nÜ8¿k·{BAA/¼ð‚·fÏ£džM8”ξ°ÛìNU¥®p€÷]»Ô‹î¥|} ¨Ç÷æwmýaÇw tEGGQXÎû=Ús(@–e6lÜÀèq£zž?îøÉãqý‰³Æ¨¯oà«/ÖrÕÏ»‹øL6…ÔÔ¾^÷ 7mdíºµÈ’„ Š zââbùÅ/¯&+kT¾dYfõgŸÓÑá~Ççm0x[ü{Gd¥0]MåÈÙJ—ç ÀŠ+˜7ožW7èð!:–Î3rçÍ‘D¾ÿÉÌþcVö³òÏ#="€;ÿRö½‚"3&éøÓ1Š´µKÜ÷xwý:œ!éÝ®÷€€¦NÚC?àĉSîÊÊÊxê©§˜2e —\r‰×ìVàñûbx÷“f^yßLFJ"÷þFKyéQL&SŸö² «6Äe㜠M^ŸŸ$Ièt:ÆÏ!CÈËË£¼¼¼‡aè u¼”••QUUÅÈ‘#5j:®A°Z±k´ÔN¯H»@`M-‘_o¦îªK¨ÏÑcñ—EQ 8½Ę1c±Ëë®»Ž††Ìf3­­­ìÙ³‡òòr6mÚÔƒìꋦÇb Ô€ù4°2ì+7ñÝžf®¢PÒöœ! l¯óPÊñê {øa.¹ä¯dÒ“ÅbaÅŠRˆ,[ŸMþ‘0—éùÝ•5èu’$xÍeò fæÌ™TWW³wï^êëëÝzÔôÇüü| ÉÎÎ&#C‰n÷ naÁngèk@£¥pÑÈ ²(`hn!yç.D³•†¡49¹{C§ÓOHHãÆ# ›ÍFKK GŽaïÞ½,_¾œÂÂBl6[Ÿê[ö5ñÖÚ F¦¤%%:€`½FYB$N=‹Á ²9·­$3‹žÂ?”ª|y(u €þï©§¸ð ÏótàÇä•W^ñÔÄ<ŠRFàlÀªÕ‘þç"þßç»ÑUØ_€;8oê\ûµWWðÀŸîëQ(g|6 lúî[d»@RR2¢(ÒÞÞNañ1’’˜3ofc, o½ñö ýöŸïëäñˆ?·ü°•!C3zX\ ÔˆŠŠ"&6†è˜hBBB\Zø7næé¿{.ÉCFF†#Üà ê"/xpå˲L[[………X¬BCC 0 ˆb÷q€©­ï® êxMÞwœý Y–),,déÒ¥žÕ&ÕÛ¶XeŒ‰ Î dñ‚::$î{²ÙSô¼ü~+)1ûÚÈLÓ£åkà×˹`ŽçgÂèÑ£1bÍÍÍÔÕyŸ;9¶mÛ&..Îc‰M(8îABCCùïgì/Ð2<ÝD‡YÃò•nfæ”F^û8‰M;"°šuÄÇv¢Ó*Bs‹I¿;C–e‚ƒƒ2d¡¡¡455a6›=†7l6TVVîµ8Q×ÄéÈ‘#‰Åf·a³Ú°X­X­–>›çïF{{;¡Áa¤¤¤8\ëîÔÿìv;V«Õㆯ¥¥…ââb·¡ÑŠòJ¬6+ã²Çö'IOO#-#Q+ ÐÃØqcHJJì1/ÙívÞûïJ>_ý¥¿è¯þàŒ³ÊÊùÈ_þÆu7\Ëâ‹æ›$pSc«W}áuçžE€Ô÷=ê{®Úw[ ŠÛUõÈ‚€ Hž˜Ò(¸uëVÞ|óMîºë.ŸÚ‰ÜxM¤c=é4ËXl°ä‚`îý­>kæP‘•œ1|üÅ ÌføÙ%á´´J´¶) ~îÂä*? 55•üü|Ö¬Yã•ÐÚÚÊŠ+ؼy3—_~9Æ óI½ =IËò-A\8g,¹{i2‰üfV=Qföäfö áÕ’¸íê ´™í{ÂÉÝÄŸn.C¯ëkÁ«»ˆ!C†˜˜ÈáÇ9räV«Õãu555ñí·ß’’’BNN!!!n‹Di::òþGtÏ dÖ @QLÙ—¶¾Ÿ–?Gkj2É?lgøÏR;~-©=•ËÔ±=a‚‚Ü׉ŒŒäÆodΜ9ŽÒ·C‡*^…ŽŽÚÚÚ0™LTWWÓØØÈ[kx¹£Q@€œ¡ K bÉŒ8’bŒÄÇIŽ2¨´"ØÜ¨d Ûö5RÝdãV (¶ïõÀ”)Sxþþû™3gÎIåðŸ Ö®]ËÇ쩉ª÷ï[žéàÃz”Ø¿B˜–zì{3ù….cÒÙ#Û»;-Oðf|üá§È’Ìϯ¹ŠÐž›AzH÷†ÉÔÆ‡+?båûz<ÇéÀYg¨xëwøôãϸå77“•5’¤ä¤> ‚,Ë”—•³ÿA^þÏr:;=³¼{ëîCwvõ~yê§{ð‰¢²€è[+¤Üwß}œ{î¹L:ÕçcÔ *BÃM? æ…Í\8;½Aç¯Ä#Iðê‡mÕrïM:::ƒøÇëñh42ÓsZšÖFîÁšNè0›u Mí gT :‹¿3$IB¯×“““CFFû÷ï§´´Ô-?pð***ÈÊÊrÍÒ¶l'8w‡ŸxkH0È2‚$)d|YÄ‚¬ÕR7fÃD‘ æfNd¤¢éèD´Ø° 1˜8~¼ÇÅß<ðÀìÞ½›7ß|“É„ÑhÄh4Mzz:’$a³Ùhmm¥©©‰––ÊÊÊ(o–ùäûCØl6ƒ45\:3–ái!ŒJjT!zÂÃtŽŒ‹Mâ­5å$ÑÀKÀ§(B>K–,á–[naÞ¼y~—c=TVVòÜsÏy[D–>•x¤€c±vA”û*$¹[ úz\e¸ƒ¯¡ØO>þŒ}ûò¹õ¶›=z4¢—4XY–9tð0Ë_yƒ†: ÌÎ^è—U.&6†ñrˆŠRò)ëêêÙ³kïI¥99’¹sçz”þÔh4Ž—(Š=^Îymm-6l ½£¤¤DÂÃÃÑhµh»ŽChjlt9Èvþ´‹â¢¿¯¿?‘““ÃW_}å· *(Þå-;Úø~G; Ñ®XÎÓ/6°û ™ü9†[ï¯ã¢ó¸ú²0>[ÓÂþ#V^y:_HÙ²,S]]͆ زe‹O¥“EQdáÂ…Ìž=Û'©Ò +:@t¤†+n­")ÆNRL# ¢ºQÇðÔN~uùqþó^2²,pÓå•Ȳ@x¨÷²Ã*A ¦¦†¼¼<ŸReYÆh4:d|mG)»vQ6y vƒY«ÁX]‡¤×2åî?a‰‹¡nÉB¢~ØFØ×?ðã›/v´Œ—W i·Ð|ÞT4¾Ÿðé¾|Î0›Ílܸ‘•+W¢Óé<Z²,ÓÚÚJ\\ÙÙÙ=z”cÇŽ±mÛ6jjjPÕ3'd“š`dé¹q¤'Ñaµ³èž]È’ŒˆâK¿þúë¹îºë˜5kV¿û¼A’$ž~úixàOÍŽ硤ÿ­¸ E(ñŒbñâEdÏÆb1ÓÙÙI{{íímNU<¬464›À¹çžKhh¨K€šËo±X°X,·ãdzqãFv‘vëã²Ç²ìòKILL >!ÞaZ,ª«ª9^UͪOW÷G¾ÿ) ø³ÖÐuµu¬_÷M¿ôåiG¯¢7Ðùؾ})ƒKQ”$I”@µ@ }>ÊâöÀÞ½{¹÷Þ{Y¾|¹ßâ(‚3§1sš²›Ü•×ΧßvðÒß"9p°£Qà¦_D©áÂ9ÁlÛÛH[»„(BmƒèH ¡Áî s \uÕULž<™µkײÿ~Ïi•’ÄçŸÎ?üÀ²eËÈÉÉñÈqHKV„‰¬6ˆŽˆ2pá‚t4ÚjÞ]£eñ¬Fö„RT¥çž_g÷þp>ÝÎý¿*'&Âê2в,Ǽyó())áàÁƒœ8q­! lÛ¶ƒ2uêTbbb°ÛíØŒFŠgô»¹|Öˆ(¶¾ý2#?_CDîO„|»¦y3Ìf2Ÿy‰–s§P=w™¡»ýNør5ÄÅx½öÞ0 \tÑEL›6Õ«W³qãF\~T¾…Édb÷îÝ,[¶Œûî»A(..æØ±c”””°aÃö°ú©ƒJv…VÄÞ•óû;îàšk®aÒ¤Ig|áW‘ŸŸÏK/½ä­ÙcœÝ‹? T` 'Ö¾ËyZùÝ.ÙJS×:.½‰‚®àm-p…}yùìËStfA (H™;ÛÚÚŒÜí g ðL@u]zªBçLtGTcÑEÅEØí6B‚ƒ1è ˆ¢€@×1‚R‚U¦¯ øxÅqš›^)4??Ÿ€€Î=÷\Ÿã讠׋$ÇÀüY¡|ó]f3\uI(‚ÑQZ–^Le••ß inn&66ƒÁÐcrƒÅJÊkïb‹¢&'›ðâ •U¸ë6ª«‰^ÿ=ûøQ—]BÄ‚ùðï‘gLE8¶¼Ñh$''‡œœŠ‹‹ihhpkЈ¢ˆÝngÏž=:tˆ¸¸8ÆŒøqã8çœs¸öÚk¹âŠ+¸þúëY´hqñ ,Z´ˆçž{Žk¯½–¤¤¾¡¿3…ŽŽ}ôQ6mÚä©ÙFà/œ]¢?® \v¦Oš9t(q qØì6¬6V‹«ÕÚƒ[å±vÓÙÑI 1¤¤d‡Ú;íÏÙà-þßÒÒBIIÉ)‰fY,V,ß=ƒ~à”H€ƒÁx˜ÁŠp ::ÚkxÏPÝœÅÅÅ])aA úîãdNs§Ëã++sb›6m"##ƒÑ£GŸ´pJ QdÌ(#Z@ QàÍOLè52w Šî{¼ŽØ( /=ÇøÑ:þôÏ&Ì0ªœÓÝ\¯ÓéHNNfâĉSVV†Õêþ 'MMMlÛ¶††‹ÝÝb`7ÚÈäœN4ÙøõµQü¸7í{íÜ|E=_AS‹–»®«`æ„6ìˆÀdÒÓÙ©E£ ïÄoY–Ñh4ÄÇÇ“œœŒÍf£©©Éq½î ¦çI’Dttt·1#Éôt¤¤¿ú)ï|ŠÆÜÉáûÿ@Sæ»Dü7ß1ÑS¦À±"„WÞBXx>¤$Ã7·åB[;BL èüsFDD0{ölÉËËóX0I£Ñ`2™Ø¶mÄÅÅŠ(Š„„„˰aÃ8ÿüó™1cqqq¶ð«Ø¸q#>ø §ôÔNàz”’¿g;r€KÏôI3† !>>›Maë[­Åp¸ÿûz];:;1’””äÒp®h³Ù¼†ûÃ8Mù0bI«_ çÿßWœÉ¤ÈEÚ%;ÁAÁèõzDAt¤? €ÙbvI«¬¬4À·ß~Kff&£G>åÉ7>VÇ´l=«×·q¨ÐÆèázÚÚì¼þ¡‰¿?ÃÐ41‘Z>ü² Y:JÊ-<òzæ„Aï¡ ÁÀСCÉÉÉÁn·SQQáÑå&lݺ«ÕJ||¼Ç°@pȼ™Aèt"?ßÄM? &33þkã—‹ÉHn£º.ö„`ÐI´˜´|º1ŠáiD„ù¶e™€€RRRˆ§­­––¯Þ—ÚÚZ¥èUp0‘‘‘Ê} p"%™Ê‹. fÁ,J.»S|I›· ²t1AwüžaÅ{Œ|çïá¡Gþü–"¼ø2rGÂÌøDÐè…¤¤$æÍ›‡V«eß¾}žÓ25jkkùî»ï0›ÍÄÄÄô1ÌzáE-óž{î¡  ÀS³×º^#éÙ¿ #ƒ„ø8ìv6›µËPÓö$GøT¦+ŒŠ@gGF1=6›Í«@ÝÄ RàÑSé`0ž«Àœa¨€'!ÀQ°·'À­­­—#uÑëu¢“ Ë•«öçŒÁä°Z­¬]»–¸¸8&NœxÊýÅÆè¸hn0—^Bj’ž’r+_lhç÷7„`È?ØÁÊ/ÛøÙ¢žy­™¼£6~ÜÝÁ±ÂNFd tÏPõFŽéU?@U·;rä»víÂh4ã±8‘N+pÙ† 5ðÀ“d&k¸ïöDÚ;,<ÿvI16nûyCSÛÙ²;ŒÔX;)]•eï5z "--ððpšššèììôhH’¤0ìËË‰ŽŽ&((HI£Òj±teH éÛwñÎGèÿúÂï†áþúùÎß@J2Âw#¿ôÂsO#ϘŽðÛ{áÜ)0ôäB:Ž‘#GrÞyçÑÔÔDqq±Ûç«~¯Ž;Fnn.†¸¸¸3Êì÷†wÞy‡çŸÞS“à:àÌ yœŒ–žé“ÉÈPB6U@Ñè“ÕPBªC ñ ºÍP‰€Þ “É4X=V~ÉIc0÷§W8ÜODEE‘‘‘á“àŠà “ɤ’DPP :ê¥r5X¬Gþµ3ŽWV €3¬V+_|ñaaaL˜0ÁãnÎ8?²Ð` [w´S\j¦ªÆÊ³¯·0ozá¡"ï}ÑΣw†1f Ͼي™À@ƒˆÁà> 0**ŠñãÇ“””Dee%&“Éc\½³³“Ý»wSXXHDDnCZ€A/0{z Ó&mdç>#«6X¹ûÆNô&öåP‰‘…ç5PSÀ§ßÄ’w(”Ð ™Èðî°pÓ Æ7ê~‚@dd$iii êëë=ºÓÕû8zô(­­­ÄÄÄ ×ë“edXi æ£Ý¾ù“O ï ¼ý¼º¡¦^{áwÀ HJDxïÈ ã³]žÓW2yòdÆŒÑ#G<EQÄf³‘——Ç #22ò”ÇÜ©âØ±cÜyçÞD©B©4ü¿‚ñÀ%gú¤ééiÄÅÇc·Ù±vylv»bÔʲ@îA˜î4›1èHHHp—{{Ô…ß µµu°À§ÒÁ`0n<ûÚÏ0¢¢¢| }þÞuZ[[)-)A’%{z@±ê>Àñ#6%¿ùæÉÊÊòZÆ×WæžHE¥™Ü=Î ä’‹B¹ïÉn¹2ˆk.À xã£VöXùaG'o~ÔÂÌ)F¢"Üe­Vëà„††RRRâUV¸±±‘íÛ·S__Oll¬[eIP¸ a¡ì’Ìÿ½ÙÌì)®ÿyh"yü%éc[ˆŠ°ñâÊDÆ í$!Ö̇ßD24ÙBD¨•N³ÈŸ%r° „ñY®K˲ŒV«%66–””ìv»£ ¦'C ¹¹™#GŽ ÑhFDVVº¨HX¶¢"áxül)Âí¿E„ÄäcG>û94>úaÕjä;žÖ}‚úØ›±±àç¢Åܹs‰ŽŽ&??ß'~ÀöíÛ)//'&&†°°°S"¤ž,l6O=õ«W¯öÔl7pྺÔÙ‡‰À’3}Òôô4âU€Ý†Åbq,ÚÎa‡ €¹ÓŒ^§#.Náõ¸bÿ;ÞXùƒØÐüãT: À¯Q4= T6¶7€sοê¶TV¡ žRä.@§Óõá8 AìA‡T<Íý{s¾áI Ÿ‹,Ë|ýõ×´µµ1iÒ¤SªŸîŒ@£ÈÄì@Í&{tï}ÒÌŽ<+OÞƒ1@äÍ÷9Zjgå‹ñ\¹$„¾4"3~¬gÉbP :” &`³Ù(//÷Ø^åäææb·Û‰‰‰ñxŸ¢ °p^0ã²Dxó}%Ç%žy$…WW TÕ d$X™>±‰êZ#’]ÃÔvóÍŽ0æNn!9Á»XU@@IIIÄÇÇÓÞÞî? ººšââb²²²HJJRÞÔéFB¸ð|„œl DøÏ+ȯ¾…ðâ¿‘ƒa[.Â?„8„Û á]ú E%ðû»à÷àòKÁËwÅA --¹sç¢Ñh8pà€G‚©Êزe mmmÄÅÅyýŽö7¶oßÎ}÷Ý×§þdàFÀcE ³“€‹ÏôISÓR‰‹Ãf·c³Y{]u%dµÖzÌf3:­žøøxÇøpUØ—@P<¥¥¥ƒÑ¨C©n}Ò À•@š×VgªÀ—ÉEõ¸›€ÕÁ#ËÆ@#:¾@i‰bO êxÍMb¼¢Y> ˆs×H’$rss9zô(&L **ªß.Ày38i¬žìÑFŠJ-üá±F¹=‚)Œ•Xxwµ‰«/ !8HüöÎ;>ª2}ûßs¦¥÷Þ=캲ØŠº¢Ëº»(¼bÙµëʪ(®uÑ]+EVP‘+¥Š jBÒÛ”L;ï'3sf2™LÈ40—Ÿ1dræœg2'Ïs=÷}Ý×Ͳ/Y³ÑHb‚HjŠ÷© ÄÅÅ1hÐ Š‹‹ýÒØl6~ùå¶mÛ†N§#--Ígßx­VI ¬Ą̂a:ŠúEóâ[zž¹/žøx ÿx;–šF gëÉHmeÑ—™d¦Z˜p¾l7ì/âââÈÏÏ'%%…úúzŒF£O"`±Xؼy3¿üò yyyÞmrív„‡ÿ†”š çžf3ÂòO‘þù ÂÙ Húég„iwËâ«wç#dg#ýô3”W ¨Tà§‹ ë÷¥¥¸¸˜³Ï>›ššŽ;ÖÎPËÇß[II ›7of̘1!Ó´´´ðÀ°uëV_‡-^àÔþ)6•™‰­-`±XڀΒ0£QkÉÌÌt‹xVt%¡à0¯;'ˆ0îA(áo\RG6ÀÍÍÍ>r ‰è˜Ôu»€#í ”‡¬¾¾Cv0ëüòË/|óÍ7ôîÝ›¾}ûT¥›­a`_’ϼRƒ ÁƒÓd¢ñÌ+5¤§ª¹abúk%UµvR“Dž{£‰!Er2;NM8ôÇ'//ÒÒÒNõF£‘mÛ¶qðàÁNõ¢ƒ‹¢8m@jÀî=FŒ&k&¤0z˜–ŒD‰ÓúÕràHëvÆqË„*’»à ¨|IIIôêÕ‹¨¨(¿ôuuu|ÿý÷455‘ŸŸï^õP猂—_B˜ù¶Hó_G¸æJ0›‘>Z„pãM0q"ƒðÖ{HoÏCxä~¤#¥/¾7ß1§e¼!--qãÆ‘ššÊîÝ»½"ÅÄÄpÇw„l÷_^^ÎôéÓ)++óuØsÈ­ NEŒ®õEóóóÉÌÊtŠe{v›;2 @Q`n5£R«ÉHÏpê¸kböüfŽ5séùq({uèt:úõëLj#°X,~ù;vŒM›6a6›ÉÈÈð©HLP1áâx.ÃÍW%’¬bó¶V.=?ŽKƧ’Ÿ—…Z­F’$Ìf‹Ó>º³hŠcŒQQQdee1xð`ÆŽ˰aè­­¥¬¬Ì'³ÛíìÚµ‹M›6‘ššê2ØÑj23 >ŽW!Ýÿ¼÷>¼þ µWF7ÃÔH/ÏB¸ã÷™³_Fºþ„œl¨k@ª®Aˆ‹ƒNš£(!Š"½zõbܸq¨T*öïßïü}H’ĤI“0`€ßçë.æÌ™Ã{ï½çëCÈe§’ðO‰°€¼ü\223Ú|¬N@»Bü'—HN_µJMzZº[À›`W€CtAøø¾;'ˆ0 ¸8܃P"55•8,Q IDAT‚‚‚N €ãæñ4ò¬8zô(v¢£¢Q«UÙï/€ÊÊJêëÂRFü°Yñ} ° (úwöâ;v°jÕ*ìv»_å”]…(Àèá1Œ+›ý´Ë„J„É“R}fõµ®¸$Œ4×ÂWZnåo/ס7Ùù¿Ëb¼ŠeÏîXLqq1555>Y¿R°sçN4³äÎûñ2ˆ‰9ViåæU î¯fø´Z-)))ÄÄe±ð?Ñä¥Ó·0•J…Z­vk:¥ÕF¡ÖÄ’ššD^^………ôë×ôôt¢¢¢¤¤$†NŸ>}8|øp§ýŒF#›6m¢¤¤„üü|W³¤²c0ázˆ×Á›¯#ŒS˜ýkìß‹ðÚ+à ?k×",YŽpבJ"\zÂ+¯#í܉0pdftþ+ Óé(..fĈÔÕÕQ^^Nnn.7ÝtÓ ;Rv;wîdÆŒ455ù:ìÏÈ!ÙS#ß„ú¢ùy2°Z­Î‡Ý.ÉÝqßÉ›[ͨTjÒRÓˆwÛý{vô—=z4R ÀÝ9A$€bÂP^â þè|‡æ »»©Ô®€# çliGŽWVQW–›îKÜ È‘€O8d_pŸµuuu¬\¹’ 6’’B~~¾Oá܉@­–Wýûhxóý&Þ[ÖÌòÿxpz EýÜû¼ñn=ŽZÉÉPsɸzÈcÙ±ÛÄS/ÕÐ+Wí$ }Àˆ#ÈËËãèÑ£ †Ç!Š"ƒíÛ·SRRBRR’O}@b¼Š+/‰¡¨_Q ƒ¦f;›·šø÷"+¢Ï„K{Ó« ¼¼<ùw•òU±¼½4ŠÊªx† J%7'Îë}¨R©ÈÎÎfôèÑ$$$°wïÞNõ555|ÿý÷èõzróòˆNK…ÓOC¸ù&„Þ…®ƒm6¤Wç@^>Âm·È즶¦ÝƒP\S&#äåBL,Òä›`ûO3g!]v‰Yè"âãã5j”³Š##£ëç8´¶¶òøãóý÷>7Zß"šEN——Àca yùy¤gÈÍ®\Àö‹¸¼ŽË¿þÖV3*QMjjª³Ÿ‹ÒÈ“t†&Ë Ý9A$€tàwá„]I€{  Ž@ii)¥C­’5¢l€mBQt?OUU5µ5aÉ;} lòò¼X,rº?=ÊÒ¥KÙ½{7999äææ¼~;)QÅÕ—Ç3d –‰ÇÒ»@‡VãZä~ÞÛÊsó¸gJ"Ÿ­60åÆDR“UlÙibê#Õì9dÅÒjãÂsÝ?o‡>`ôèÑDGG;{:tG7RSSCJJŠO}@|œÊmñÙjø‚sã8s†ƒ¥VÎJåJ3-³°`‰ž›&DÓØ/Ìo休QV=€¬²ïÛ·/£FÂf³QRRÒéîùСCüðý÷袢È= u’GûdQ„ªj„÷#8A£†9s–|‰4ûïÆ‚Z…”“ƒ0âL8s(Â?æBï<„1£}^Û222ZmÒV¯^Íc=櫯„ ¹IÎÉÞí¯3Œ.õEóòóHOOw«{Ø]³ÙŒ(ªœ@‘õLøƒN¼üÔD¨ ÷ ”HMM%??ß/àððïˆI677SVVŠ„DTtj• Áh³¡•ì΀rq¬®®¡¦º&`ï« ø ØØÁÏìÈú€¯sñÃÃÁn·³gÏ>ýôSªªªèÓ§OÀ'qµJ 'KCFšÚµ¨Z¬0ûõ:²RD.>/–Ͼ6pç­‰¬ÝdàþgêÐj´jçN'1ÁûŸƒV«¥ÿþ >³ÙÜ©@ii)›7oÆh4’™™ÙeŸ„ì, £Îˆv#2éij.??–‘Ãbyf4,k!%Îâ[p§Lo :”êêj***|›ÍÆ®]»Ø²e éééî†a@$}´ûá•76ÿžŸ‰pÝ5²FàÐa„ /FªkBX·6l†['! Ü¥ßE¸ÐÐÐÀ´iÓ())ñuØëÀÛ!R81¸,ÔÍËÏ#-=Õþ·ÙlØ%Y¨\ü=S¢ G*Ë[Àß¶¼˜ ëÎ "˜ˆ°Ž€)))ëG=³cw繫U6*--tQ:9—ë°nKHv g@aTSSKuUX*Š|Ž!“€3€Nj2™Ø¸q#_~ù% 7úðçwÜ|·¶…7>hfö#i”³PrØ‚Z„¿¿ÖÈŸ&ųa›‰?ßϸ1±XÌR›>Ãû¹âââ:t(§vUUU>'‡>`ß¾}ìܹ­VÛ©€Û땪ý@ôz;ÕµVöheÑglØaáÖk∋S±è?|»Ö€€D^Ž÷눢HJJ ǧ  €#GŽÐÒÒâ³ÜN¯×³aÃ:Dvv6‰‰‰ò}pápõøÍÅðøƒãÇ#=ø($% @f6Â?_G:}üuÂå—‚òwà˜„X:(¼÷Þ{Ì;××BQ‹¼ûïÐèÂÙ„‰¤¦¦8S’½-|ïæ¨ôd ªœ8o;óÿz½>R ÀTº™vŠð ° ânÀ‘³îªxÍ›%pKK‹+¥C%ªE—€€ìeíh;Mmm-UÇÃFüÉ-Õï·ýûLÀ¯š¬úúzV®\ÉêÕ«IKK£W¯^×8`±ØIŒ¸ü‚x¾]ÓÂ?¶òó> />šJc½…ý‡­<6#åÿmáî¿Õ°i«Â\é7ªIIIaÔ¨Qdggsøða_®pnú€}ûö9ýì»*`«©³1ç­z}¡ž‹›øò{•µvîžœÀØ‘±Ü~o%ßll%Z o/Ñ£UK Ôq‹ µZMnn.£F"..Žýû÷wª¨®®æÇ”õ¹¹²€ @f& 臜 *žx~X‹ð»›`äp¤šZhh@¸{(Ëö”p„€ƒrçwvVúõÝTaŸD8¸4ÔÍ+È#%%Ù­qÝîXÄíÎÅß-`6# ¢Ü}pE­¹#6ºÙ "‡Ü„FÕãN„xNœŽ›­¹¹™Ò²2AV4«T"‚(Ê‹¿›‰Kà8Wm]Ç+«øÎüÆ*ü—Ø€u™ÀüŒæTVV²téRvìØAAAyyy5HKQ3jX4v Þ]ÜDC£ÄüçÒÉHUs×ßêxø®$†žE|œÈé5÷Óò×çêÔOMn¶o#¡¼¼<ÆŽKtt4ôK°yófŽ?îô³÷çýV×Z™rÿqVo0qóĘšÂÔ[’˜rcEýt|-“[®M$9^|«™k/#&ZÄî£û £üñ¬³ÎÂl6sèСN5dÍš5h4²²²ÜÉ› @a<ÿ:-Í‹>F¨j€Ûn–µÐ~ñw›…°Æ%IbÖ¬Y¬X±Â×a;‘mÌOeáŸcÈ“ €3üo·Ëg) £ Pn,à *’““]Õ,¸7ò7ÿ´EqK#4 §º…H!sLääd¿SàM* À±cÇ N‡¨R!**äÉ·€cQ¨¯«§²òx ßš¿X¬ïÂñP üYP„ÜK SØívöíÛÇÒ¥Kƒ¦¹tpüÙ1\:>†~…Z^œW‹ü~RϪæÕwš‘( cÓ6™i"ýûDñÁ’zòs]ÆAžÐh4ôïߟ³Î: £ÑØöY{‡ãs-++cóæÍ ¿ô‚ «“X¿­µJàô"}{kѨvïmåé¹<9#™Ñm¾›ùò{¿»&N`öÜ:jk-ô)ÔyM+8쑇 ÂàÁƒ©ªª¢ªªÊgZÀjµòÓO?±}ûv’““IKKsF5„¾}®¿¶oCxiÔ6!½ü,Bÿþm!/EØ¿Ýâïv!Ÿ¿—`aãÆÜwß}˜L>û2L†hH‘€1À%¡¾h~lYíŠHNg(ߣ ÙlA'è(à/ôz}$€MÀ‚îž$RÀYD#ЕütG;¹––Ž;ÖÐ*Âü®€ãõ¢Ê444PQ^ÙÍwsBøXw¯³{O Áüìôh2™Ø°a‹/F­VÓ¯_¿€5r@£HJPaj•øeŸ‰+.Š£´Ì̇+ <ôçDZ[íüýµFô&¸{J·˜ùZ#Ñ*; Mv²35h4·INR¹ ôbcc6lÅÅÅTTTøœ, è¾}ûرcl[ÚQWEFà´Q\{yÕ•fžž×HÉÁVÎ9+šO>k¤ü¸GïNC£0˜$^[Ð@fšÈu¨o°2ëõF~Xoäâq²w‚7x–?yôèÑÄÆÆRRRÒ©> ªªŠüƒÁ@vv6ÑÑÑòñññQ:ÿòýžÏ‡|öÙgùý·"û–„Å¢3Œ8¸(ÔÍÏË#!1ÁÃÇ_r~u…ÿ@Àl¶ r eë%ø XÓÝ“D ¨GîŸHII!//¯Ë uO'@´òcÇ­Vƒ ŠíŒ€äVÀž€¦ÆFŽ+Üó߀› Ù<è¿ÀJ ?\8~ü8K–,aÇŽôêÕ‹ü|Ÿ.Ä'A€Â|-#‡hùú=¯/l¦Õ"ñ÷¿¤ñÙWͬßnfѼ,.{²24œ;:–¼,Áý5äd©ù˳õðÙ\­¹ÛŸ9(ˆlœ‡lþRää;•üv›ÝÕÀîÞ Ø¹  `1[ä¤ä#]A„€ß€û0RÈŠÚ„p\€õ°W–š´´´PQQÞÐÊÀ¶ÅE@¹ø;@Ks›‡@èñ Ýô˜ö+ð ðP…ìà×/Øjµ²iÓ&>úè#bccéÛ·o‡ cwЧ—ŽÓ‹£Øö“‘ÛZyüžtçîØ`”˜õZŽU<~_:cÏŠáo/T3ÿ£&L …ù:§«_S‹ƒÑîÜmÇÆÆ2|øpȱcÇhllìp ÿ€½{÷²uëV4 ™™™¦AÔ*YpÄ8n¾:Ë/ˆCۖ㯪±ñ÷Wê1XË­×'¡V 44Ù¸ý¾ã$Ç À¯ÞÁz½ž/¿ü’+VMŸ>}Þv w–IWÅ»Ùô~·NÏÛKõ̼/•œL5*$Æ‹Œ¬ã—Þx¿‘ß\‡V#ðÍ=7ϨâìaZ²2\‹jjj*cÆŒ!==’’ÌæŽ ¼(Š˜L&vìØÁž={œJûŽP­F :Ê}Q|wQ#k·´òèÝ©äfÉ¿§·>¨gõ†V~{a ½{i9,š5äe©¼j<¡Ôèt:gù£/"püøqÖ­[Gss3™™™ÄÆÆºŽï(ôß|…\NV«•‡zˆ5k|½6ÿ/ >¹0Ž0€^½ ˆ‹Ç.Ù±ÙìíRžN€`±XILL$))©[áˆH°x3'Š$p:Ò099™¼¼|8&“‰ÒÒRŸúI’8tè›6mB¥R‘‘‘Îa ¤,‰õ¶ÓreÀ7ß|ÃC=äÓǸK8.B0Ž0TjëªPD\Àå`±X„„'ÚmÐüÛ#0ð/ä9ºÛˆ$`þîA€Lrss»¥pL†---TVV" ÑjÜ<QÖ¸-þ*Ñi¬oi ø–àõÈ¢ª­À`ü4„’$‰’’,X@cc# ð)œë =MÅŒ ÙYþß,f˜xq,˾jáÝezŠzk¸ý†D¶ì0òÞ2=Ïü%•‚ŽÝ µZ-EEE >œ††ŽïØïAé°iÓ&Z[[ÉÎÎ&*ªc§¿˜h‘«.ãôbq±2¡Üõ‹‰¯~0ò΋YŒKÿB5O¼ÒÀ•Ç’ÖÖL¨Õ,ñÁ’F¹¢Þjúôêø=‚@||`×®]ìÞ½›¸¸8RRR|Gq‚úojjâŽ;îàСC¾{x- >ù0ž0€^½ä®¬Ê.€ŽÅßîµ°|!$&$dNÐëõ;v,’À"”Š l[¶îarž8bà‹%vöpkYé¨RUšPHm!,·ÿ"¡c¶"‹ÏA¶Wõ»’Åbá…^`È!Ì›7/h¤Eýt|07›ë'&¢ÕФ$ Íí7È»ñÿw{ ¼±°‘ë.aøPÿ4 ÙÙÙÜyçÜ}÷ÝdgûöNr¤–/_ÎsÏ=Çš5k|šÕ$ĉ¤§ºW•V+4ëånùq•€Jl3žj´ñüœÞ^Ü̼§Ò8ÿœ8~9ÐÊ·kZ(9ÔqºB¥RQ\\Ìý÷ßÏ”)SÜv]½²²2æÍ›Ç›o¾é,3tƒRxy[±téRÖ¯÷éyÕL„5+ûµÁµƒwÌÉmÿ¦ƒ¼$yt ìÞ#±,P'ФÈV“~5– &€@Ñ8#¢ §œùÙ@Täÿe€@‹^ÏÑ#GðŽºŒïǹ Ù€è} †.èÌf3Ÿþ9K—.¥°°>}útÙo¿3¨D­V`ôðhZZ¬|¸¬…7>jaüYZþø»6o7²z­‰G¦§’ß5n‘‘ÁرcIIIáÀ¾ÚÏ:û lÛ¶}ûö‘ššJjjj§%zéjiåÃeÍlÙiäÝeþïòh.“ÉÀ~:.ªçž§êøz­‰O¾h!N'1¸8ªÃM¸Z­&??ŸQ£F¡Õjí“;óذaz½žÞ½{··vÏ÷×U=z”[n¹Å§(ørë¯ãÛ!E¯Â^ÄÆÆÊ››s÷ï°öl«A‘è.",Ð<¨“EÈ! BO$%%€7èõzY ¸4‚Â@ðÈý«^ú=GÂC¾'¼MNš‘{ | ôi{ø…ºº:>üðCvìØAQQQ§»êN+púiÑŒC«ÞÂÍ×$b¶H45Ù¹îŠ8 ò\Â?« }B¥RQXXȘ1c$‰#GŽtª¨««cÓ¦MTUU‘••E||ÇÆ‹*Q`üØ2RDZ[%®¼(†›¯Mbçn#}º†Â| Ï>’AFššo×êyø…îŸϬÓè“§fæœF.;/š”$ßÓFTTdذaN{dI’:$’$a49ÿüóÛ§:ÒÏ>û,_|ñ…¯CJ€[‘Ó“¿vŒ'  °°€˜˜˜6 ÍÍ ÐQ è(”@.´ÈVÀ‰‰‰$''w{ ƒ²²2"Âûi°4P'‹4`C®o +¨ W´mQp~• € j³Y5päð¯* „„\wý ²êu0îï‹÷îÝËo¼Ñh¤¨¨È/á\W¡Ó œ;:–Ìt5‹–71ûÍ&n½6ÁYƒ°êû>ü´‘Â|-I ÞÿÜÊ[©k°‘˜ B@Ø 4ˆ¡C‡RSSCMMLJãäÑ£GÙ¸q#f³Ù§>@% ô-Ô2zx }{kùêÛfœ]Ïﮊãî?¦-ÒØlçáY5œÞ_Ã_ïJ#6FDTÁûËô\0ZG~Ž–Ã¥f›í¾'Aw`gœqýû÷§²²’úúúIÀí·ß1gGزe þóŸ}FZ€Û€Ý¡QÄc<áˆôîELL v»ÍEœf@  ‚'[­@ x BÀ{œ˜M»WD(Eo¾¶« HNN&''' @ŽTºª¡-ìï¨P”¶¥À`0pä𑼣.ã;ÂO°!OÂï Û¯ü6X»v-sæÌ!''‡¾}ûúÎug‰fìð(z)vÿv;Œ6þ³²……ËZÈËÛ‰êÞþ¸»«aÑçz¶ï00h€Žä¶vbb"£F¢  €#GŽ ×ë;¼¾(ŠX­V§@LL >vGY™³ ‘{§$ríoZ€m;¼µXϬSÉÉ’ßϪïôüï'3SnHdî;õ<8»Ž¥+õ(11¨HG|œ÷©DEÒÓÓ9r$iii9r“ÉäF† „ :Ma ­­­L›6]»|©­$@µÖ§ÆŽ@ïB¢££äÅßfÃæf,!):‚£ н  »Ðëõ”——G ø²Ãj@ià4äÜoØ””XÐÐ:"B[ ]@å–0è øž•™fä… 7:?ï_›ÍÆgŸ}ƧŸ~JÿþýéÓ§OP›´÷á‚ì2xÕoHŽƒÜ Yéî ò±r éÉ"ùS?ïmåÓ¯ô\v¾«a dee1vìXâãã9xð 3Äé â¸mÛ6öîÝKZZiii^ONTqÅ…qôï£s‹°¯ÿŸž-?›™1%­V ´ÜÂóóZ¬áÚßÄSSkcð Ó&'ñÍZ¶˜¸d\¬×Nƒ¨ÕjzõêåÔ>|›Í†J¥âücÐ*8¼aÅŠ<ýôÓ¾Ò+­Àµ@uÈù8Ÿ0€Þ½{ݶøÛÜK=Ì€°X¬r@b`«"€Ôò„‘HR€ß†sIIIÝ.t@¯×Sé]7•‹‚€Ñ`äð¡à&dtQP[[ËÂ… Ù½{7ÅÅÅdffkŒnØOGFºº]*»_çœCN– |ÚÂo/ˆ%5Y…Å*aµÊnjµš¾}û2zôhìv;¥¥¥ ì$Ó¡8~ü8ÙÙÙ^õj•ÐnLÆV‰¥_é9ó4 ¢(ðÌ+5TÖØy|F*™éjŠúëqF4Yéj F}aà†ßÆwØ2Y ¥> ¥¥…ÁƒsöÙgwé÷ÙÔÖÖrÓM7Q]ísmYˆÚÆЧ]”›2`“:Ï*«ÅŠ$$N!€9ݱ IDAT¹È½U†°†Ú;À`P¢ˆ§I…Bæ^Æ‚óö•/约p¢¶©§>ìÈý°/®žúùûâÅ‹³xñbfΜÉwÜAV–_­ ºgßZ völ¥¢ÒÊöŸM¬ZÓʰ²³Ô,ø¸—· ÕÜyK<‹G­–{œOš4‰1cưdÉöìÙÓ¡ÀNìv;ëׯgçÎ\|ñÅŒ?Þ§P`ÈiQÜuSÓ¯Eb£^y"•}uTÕØØwÀDÅq+Ûv™XµÎÌçF‘–ìÿ^Brss¹ãŽ;:3ß 8.\Ⱦ}û|R <¢áô 38në¶ Ò1_¢ÿµ•ý9Ž—Þ¾1Û‰"‚J¿ ô #1`FÃ5€`¥”¡ƒ€J¥r~o2™8tЧAI°É%$`ð G¾oüNòûí·¼ñÆäççÓ¯_?÷´ Âl‘XùM3÷ý½–·—4³y§Ü2øúËc˜z[ ˾hâó›™|U,gœ¦eÖÍ ,TÑ[a,”””äÔ”——ÓÔÔä3-`µZÙ³gÿûßÿˆ‹‹#++«Ã2I•J`øÐh.Í¥çEó‡I‰dehX¸¨ž{Ÿ®eé*‡K­ÄňÜ~],“®Irë2è˜/;˲8¯¡Â¾}û˜4i’¯Íp/YBO"}ûöA«ÕÊ·@›×ŠŸ«MÖÊ(B"z‚`”‰€Å„9 g~nŠUåοíä~M1D¢¨Szàd…ìÀdü¼·[ZZ¸õÖ[y饗x饗7n\‡)cåê&}©‘ôd‘ÍJçŒAÑÄDË¡øÿí0òÊ»Í<ô§n¹^ž¼¶ÿlæó¯ œ?6‹U¢¢ÊJ¯\¹¯Ä°aÃ(**bݺu¬X±‚æææ‰€(ŠÔÖÖ2þ|~øá®¾új Ðá8{hé] ϯO¿\Íû+ ¨åÉûRé] igs íI j_¿!I/¼ðÍÍ;Û¼¢!lÏfQpìäÁáö«Œž:£ʹZñ}íÞ»‹㤑Øì¾‚’””DvvvÀ"N+`¢ Ð3 Èÿ;¢­æV” À;ê26_‡ãÂÝDð²> èåï +++Y°`GŽ¡¸¸˜´´´`‘Ül-Ù)°z½‰cåVr2UdeªQ©æ.¨§Å ñØŒ4tZƒQâ­Ošè“§bܘX±pÝÔJšêÌôî¥%>N…F£¡OŸ>Œ1[ w$tèjjjظq#UUUäääøì|)0lH4™I°ü[#Ç*,äe«ÉÌP»-ôÊã½ý;œøá‡˜1c†¯Á Ü„Etsà `L¨/Ú¯¿ÜðËÞ°yöðpìsD»'tD:1Œ 6î!½("•¤¡S)H`0œN€jµº­ Pt.þ‚g  èJXÌJJàuÛMxNV”#û·ÿ‚\6è÷,°}ûvæÌ™Ctt4 ˆÔZ­À ¢(®½<ŽºZ3OÍmÄb²1°_3ÿYÏ]7Ç1lˆ\é¸q›‘÷?kaòõ ô+”½Ò“^~§…ÄX³ÎpUDÆÄÄ0xð`Lcc#UUU>õÿ€ 6““ÓaD§rZ4W^CɳÿÕHNºÈ€>:Å9#gÁWB¯×sÛm·qô¨OO÷WC4¤“Wg…ú¢ýúõE­Qc³Ù¥€Ê*ÉK€ÍfC퀻ƒÁ@EEE8 À1äÔTÀÉ*³yáºp0BÿÎ?.a ¤ˆý;SŠ×pïôî#8Åò¡… øÙ@èQdwA¿ I<ðÅÅÅ|üñÇÆ  0-EÅ´?¤ññ?3¸äü8Ô*ùÒn—^YmåÕ·ÔOÃÙ#d2j±J¬Ùldp?5×ý6Á}Üm_{õêÅwÞÉÔ©SÉÏÏÇî8¡8´&K–,aæÌ™¬_¿Þ§9Nv¦†GïÍàßϦsÎȘNóýA¶ò÷ Ÿ~ú)ëÖùLë×…h8'+Â2'¢Ø6˧€ÚþïèŽÑ /ëÄ‘¨Î¥ e^BàS¢€ÊEŸ%€*• Q±Ú¬ìßW€wÔeìFnÎs*Àü,Dv„ŸÄ×h4²xñb¾ÿþ{Š‹‹ÉËË ’€šôT5:­€ˆÄ¼š©­±ðïš8^kãÙÓÈÏ‘ yÖn60ïƒfîÿc"CO“çäÊ*+o.¬ã‡õbc²3e}@vv6£F"55•ÒÒRôz}‡¤ÒÓ? 33“ÔÔÔÇœ•¡q–ýùó+Qã993jP^^ÎÕW_Á`èè;ðwÀ§'p¸‘0ø³ ØQ]»§½]Àjm&&ž  ²'EPåE2Ùpr¨/š””DVVV@«DAD­V;M~\W •" UØì6öíÝ€wÔe” [ðžJhB&5_#“€<_xôèQæÏŸOyy9ô¹0vCEQ˜#²m·™‚\5LO¡x€fol¶óô+uôÉWsÇÍÉh5V+<ñB ¶¶Ò+WÍ‚EÍ45Ûœ©FCaa!ÇG¿ôuuulذšššõŽ—ûZ¼½E”ÏùsŽîâÅ_ìÌï7ðG䉶ãd]MH1``¹œÕf“Í€œvÀÞ5 AHJ \  ²²2\àß°ûŸ'".§ “u àˆDGûí8Û! C›€Z­ñP‰*D•ÊIì’½¿ø¬YŽpê¡”"— îGÎiú=Clݺ•¹sçOÿþýB=! ЧPÇ%ãâ?&–Ô—vÅ×Í,YeàÑé)Î’@A€¹ï52åÿâùÓ­ÉädŠ<ñJWœKR¢ëÏ[©0”——û¥X»v-‚ øÔxCg© 7úà§Ÿ~bÒ¤I ÿî~ üÕO9üèê‹,Øìö¶R@»› ¼øÛÛjÿå×ÈÞ2HHHðy~`4ÃE$äÝÐ.ÉõýÑt­Ÿ´#'¥xÞ[ àú¿„(†Ÿ~e‹,HÈgrø·Ãø°'ìv;÷ÝwC‡eÉ’%¾BËÝ‚ç‚XZná­›¹b\4ÃN—CÿÕµVÞú ŽØ(øxy k7éÙ³¯AœVÂ8üvzõêÅ”)S˜>}:½{÷n —v4³ÙÌÒ¥K™9s&›6mòy|Wá¯_À‰Àjµòä“OúÔ? «ü'ðW?%–9AD…ñrÞ_áüçVV-ù?/w'òšá} ¨ÝàNð Ap@ê ÊRo®Üh’û /ÃYÐ*¹/þŠcTª°}<Ý}œhFnø2ø˜.´}-//çºë®ãŠ+®`Íš5-4݆J„¢Þj®½"­FÀf—xêå,ÕsÓ•± î¯æŽ‡jذÝÂ+¥’)GìvذÅÀu.§ä}ù‡ Â=÷ÜÃm·ÝFjjj§D ¶¶–7ß|“üã””t®KñV ôö|ºjÕ*–,YâëàÜÿ*{Ð1Â2'ˆ*ÑUÿKüçMèðpx¬@Ç„ +ó{˜`'ͨNr‡À}ÁøÐ]Ê1@¹ëweMk˜*N…*€®à0²Èé|à]yáwß}ǹçžËôéÓÙ¿?xzœ, />™éþµ¶Âºíf¦ÞÇo/Mä¡éŒ¬å¢1:.:O.]´X$–¯jâî'k¹æÒúji5C‹^&+111Œ7Ž¿þõ¯L˜0­VÛ!‘qèJJJ˜={6ï¼óŽÏ6Åžðô fÞ¿¡¡{î¹Ç×!vàMzBÿ]®óC ‡K¤¼rJÿ• »£RÀs³uènÔ x8ì‹DºÀJ Š‹%&&’••0 @EE¢ÓÀÕíÏ=ÿ/ºòÿ*•³%ðþ}û±Ù‚»»ô‚FàµP_4p˜¬8 ¹ë _ؼy3¯¿þ:±±±ôîÝ›¸¸¸ T 8N©V ´4YYöµ‘þ½5˜LŸýWO|¬Ày£cÑí,\ÔÈ‹o5óÜÉ\uY·˜þXó?næèEýuÄÅŠDGGS\\ÌàÁƒ1™L”••µ]Ë»>àÈ‘#üðÃN_FÓîXoãö÷ùîàwÞáwÞñuÈA` ]Hýô€{½YBFC¿þ}m€F@n–À /€äääNû^ø‡°©)`]x;C3²ïBpê8YÈ©€?wfñ@ €C@";ª;)yñW’—øOI”hëoR4#wDû5BB6Bš!ø^ÝÚ`·ÛYµj‹/&''‡Â õ¹iV´óä« ¼·´« îšœDl¬ÈósjYµÆÄœ§Ò=<†Ÿö˜¸íþj†i¸ëw |»ÁĶ]&Ɖmë(‹¦†ÊÀ©©©áøñãzõ; íÞ½›M›69+g|E¬<•ÿÁXü:Äo~ó_) ð°6ðW?¥q?]Ì:޾ýú8 €\‹¿£ @ÂnsD\Àn³ƒ)É)!Ž9<„àÀÆP\(R{xC+p2:öqGPÿ¸Ä+’2Z%¹¿FÔš°|D¡éŠÙh@^(æ³ øI˜9Â7ÞÈ¥—^Ê£>ʨQ£:Ý!ŸbcDn¾.™K/HàX……Ôd0ý‘ãDiÞ~!“Ül MvfÏ­gP_5Ï>šAL´HT”Ȫáîj¹¯€jµšÓN;ÂÂB¶lÙŠ+8~üx‡ãE‘úúzæÍ›ÇÀ¹îºëèÓÇ·uG0Ãÿ¯¼òŠO##ä…aðFpÊ"ð7p'PkÔíŒÒk»Û\-!!œ¼Ý¿#„÷çÉ¢pà[NR»N—ò_I,\¹YÝÚ>u¥Q‡e-ù{crËáË‘sÆ~Ï_}õçž{.wß}7»ví ZëÛ´CEa2KÜ:£Š¢¾ž{,ƒÜlùcüe¿‘­¿X¸çŽ$§yOÉa3Ñ:Øh‘ÿ~×Ìì×jøä?)“Ϙ˜Î=÷\|ðA®½öZ¹#›ñ‹¢È¾}û˜5kï¾û.µµµAy¯¾°qãF^yÅgàÊ!ú4‡fD§B>'hÔ—c*’ûJA_”þ²ßBÈp²sQëƒ}‘®”ùu^ ±º_YôíBN„= =þ‹ÜW`*rS¿g˜×_#Fðâ‹/:ëßÄŒ?¦’’ä Vü°ÑDï•Ó¨¦ÎÆòկץصÏÌ®}¾Yk`Ú#UìÞgr¾699™ &ððÃ3vìX¬Vk‡ãwè~øá{ì1Ö® ]”Ýd2ñàƒvvØGÈ®=è:B>i´ŽKºÔýÊ PÌ­òa.­ ã©Îã!ÀmȾÿ!ÃÉHìȉ€wFR"P7Ž›â_¡\u]È#àq¯©ƒ:ö'“6$”°o ë^Zü}akk+ýë_¹à‚ X´hQPLEÒRTŒKlŒûŸul´€Ù f‹|.ø¨ÃÇlÜ|uq±"3îHåß/d1gV6ÉI"ï.jB™Bwý&OžÌ<@QQfsÇ›hGG¶@ä_ýÅòåËùî»ï|RÌ ÍhNI„|NP«ÔŠÞ¡ðW¬÷΀ä*B AÆëÀ¢`_Ä'#¨FËú=wþ°=oLÇsÎÛÙ# ¼áÂè!¾Qü ,GÖ§ø…½{÷rà 7pã7²zõjL&Sç/ê&.¿0£Éν«âîÇŽ3‰ži·Æ3¼­ãà‹oÖòÙÊF~Ø §´Ü†FÞ´|jµš¢¢"¦M›ÆÔ©SIIIñê I§Ÿ~:§Ÿëøêêj¦NêërC• —UÂ=h›ûœ6*Î]”rƒæxJrK³ždøÙ‘2ä8Y Àà‚äáXæè¹âf¤”°(¡V÷D"?Ûÿ£ FB+W®ä¢‹.âþûïª> w†þ™Å€Þ*ã^}<… ωåûu-Ô5Ø8cŽÿ£çñë8´Ž?ONv¾Vuu"**ŠÑ£GóðÃsíµ×¶õkw… 4 W_}uPÊ ½áwÞéLs° ÙS½'ŽÐµR¨˜G=çWI±ø;Ib£Ù;ÿ-ÀÁ¾HG8Ù'ú2äœÞMð½$$$‘‘2@“ÉÔÖ Èá 8}T*E  ¨(l+E‘ÚÚZª«ý7\ $d‹Üø‡À{È~C‘ýüZý6oÞÌÂ… Ñétäåå‘”…31^Åèá1\pN,} µ”–[™|5cÏÔ1îìXújX÷?#O=Nv¦‚t¶ÍÞ†Eÿþý9r$‹… Š"_|1gŸ}vÀ߃7üòË/\y啾1ÿØ’ºxœ¯™™¤¤¦`S6²ÙÜšÙíîUrã HII!6¶ûUリªª`”–ã‘•…'sÀïÛûÝïÝ_* x¸¥·:p¯ Fù˜ÍÖíÔ‚ ˜ Œ^Fngíš››ùË_þÂe—]ÆÂ… ©¯¯ÖØOÇUÅð÷WêXöek78Ziwº*¡´ïU>äŸ dddpË-·ðÈ#0dÈ.¹ä’ _ÄsÏ=×ÙaŸ·=zÐ=„|NÐhT(sÿ®€·¹Ù‘jµ»ÇS#7°Kæ‰`àT ›™¿âdÿà•€ö?R¦”:› ‡œ8Ž÷"3ûÅtÁÍkÏž=Üzë­Üzë­¬^½£1xF`*ž¸7;nŒçß7óÞg¦ÝGn–;áô¶ó÷æç¯R©èß¿?wÝuW@Z°úƒï¾ûŽ ø:¤ xŠ.¤fzÐ!B¾V8S ”§ŽÊ)l›[í’;A‚@6#oZ«yÒÁÉdÔ~ÎDî-H >tIrñQgË‹>Àq„g)@˜ªz@÷± ¸ø ð$p~þ½­X±‚Ï?ÿœiÓ¦qûí·3xðà D‚¢t×LHä² ã±Ùec!ÑÇ'ïOf¢#çÀ@£¥¥…ûî»Ï×!rÅFOèÿ$…Z­qŸ•s©GŽ_ù3$ Éí¸ÂGÀÍÈÕlaÇ©pÀ\ ü™nŠ'¡Ã€¢ÂÅ{ º'p’ã `09çç׌$Iÿüç?9ÿüó™={6‡Úd-+úý¡ûF¨æÛÅ‹³mÛ6_‡ìæ„f4¿ „|NɤkbTF¼‡ÿ]s¬÷4AXÓV`:0‰YüáÔ#8jµWŸÈ‹© užK™ÇRÞTn Åsò×P)©=ÐC òbt.ð<]Èû566òè£2qâDÞ{ï½ ê:ºÕªò8O/å1Á&¥¥¥Üy§Ïª)3rÍÿñàŽäW…Ï ‚@»Í‘òÖr,þòî_rF[%ål¨ù»{7õ`Ø`íT% —h]\¬Îî¹ÛAÁH=¯á%ÿïñÚœ2¨Dî/p!°”.è~úé'&OžÌ­·ÞÊÊ•+1BÓÈ®³?OrÁõú—$‰¹sçv¦øX¼Qô ÁcN”PzÐnñw¥ÇÝ8¹‰ÒYÈ©ˆÃ©LXd¿ŽøóG‰É‰°EWyŠëR4Õ.2ÐH€3}ÐCNEì@Ö\ÜœÆïv+V¬àŠ+®àÞ{ïeÛ¶m^x Ï]¾ÎïƒÔÙÏ6oÞ̳Ï>ëëz`&!h¥ÚƒàBP†œëºR1¥Xüi‡ˆ:Pç<î?lÀ›@dÇЈ"8ðk ¼ "7[XŽÅÖÖn2P¹"§Àã¢.Ûöw6€(üš>¢_ìÈåi—Óõþ½Ðnç7ÞàÒK/åùçŸçÈ¿xí Cî÷z‹+¢Á$uuuÌœ9³³Ã>Öo=QtŸ="Î;—|¿"~uÙ‘»‡öBn]v•gø5®.ï#;·#—ºMk‹‹Å°üŽ x‹—º~êú§â[QÕ8ÅÑ‚¬Y¼[ðÛõ©ººš‡~˜‰'2þü wàóÌû‡28e6›yõÕWùüsŸ%ý‡€‰à×IаLB¢ zIºåP=Dme„5s¸c=ð#À}@ðBÜЧ;ø5ÍAF¹ÈµÛo &“‰ÖÖÖ€…ApåªPä°p‰½åÿ%$Dñd7kìŸ8†œ/¼øY8èvîÜÉþð&OžÌW_}TÿO„Š|ù嗼𠾱#/þC3¢_ÂB¨D•ˆ›úÏMhêL´'J’Dkk«·žåÈ彑#Ë/"çüO*üš €ÈÍBþ¤X,–ò@6iqˆY¢ÜRÎÜÿÚTª°|D=;¨ðap+' øüóÏ™0a÷Þ{/[·n º>ÀÁ"GeêÔ©´´øìýµÙ޹ÁAÈççÜç¦RîîÝÃÿ¸¥7\“É„Ùl¶¯"ïð“‘7öìBa@hÉf³í1˜ÍæÀ¥<"—Ä¥p¿ÉCe¬âe@=¬Èþ¿Aö±÷{’±Z­Ì›7Ë/¿œ§žzŠC‡kŒNx¦‰ºº:üq***|Ö„ìUøË=p ô@T)7ÿnû'y~”óªb¾uËtoî6›ÍFìvûÀÝÈ9þ†ÿ*‚†àߘÍf»Ñh Èâ/ŠŠ€‡Ê¿ÝߕǷa"¡©1ëAghBî~ð ]UUUñä“OrÍ5×ðöÛoSWW¬1 V«•9sæðÎ;ïtvèÀ÷!Ò¯!¯ªP©Tnå¸-þ®ªIÉîÍÙÊGÛFÐ|ê÷ ôïØÞÒÒ¢oii P@¡ðÌcyfÀ„É 0¸²òtÇ€G].?¦ mûöíüþ÷¿ç¶Ûn ©@wa·ÛY±b…?Í~¶³éñû6ÊB}A•Úáž )÷¿rnuÆYÇuçÑÒÒ‚^¯×#·”>åÐC¼ã놆†šÆÆÆ®Öz…ÓÐÂKˆ×SÎ*¡R©Âá°6Ôì_ØŽ¬ø?ä¯ß‹Þòå˹òÊ+™>}:[¶lñ·¬)lX·nS§NEž{;Dp]¨œèÁ #¤¥•޶é€{@YUVV¹mœ›ªîB’$©¯¯¯å]e#=À;Ìv»}¥Ñh´ëõú€¤¡©vRù‡no$ Ä9Ûïß0#ûü¹çÅ^¿_h6óÖ[o1qâDž~úiŽ=¬1v [·nåꫯ¦²Ò§§xŽžšÿPáp(/æŒ|*sܾ3ª*?áQ˜Ý¿Á`°Ûíö•@k(ߨÐC:ÆGõõõMõõõݾ‘”Éco ðò¼VòŽ€B}ÁtÍÀ¿‘ËŸ¥ »àòòržxâ ®¾újæÏŸ1ú»ÝÎêÕ«™8q"55¾eD ·ú)Œ¦5Z§.Ï“sNõœsÝ*N|Þnhh ¡¡¡ 9ívJ¢‡tŒššš~nllôVÚ%8|”w´g(Ëåºßè:®[×?|ê öà„Q†lhu °.è¶nÝÊwÜÁ¤I“øê«¯º}Ÿwv»U«V1eÊŽëÔGe?²{¢ÏºÀ!¢Üæ@¯×³páB®¿þzl÷#·TíéôZ4B­…N§ssEi3K.Zà¶ø;RmGàœ][[KCCC3ðÏмãð ‡øÆ’ºººŸ0 'žÿX– y†+  Õjƒù=± ”ëA@aþ \‰ljµßßšL&æÏŸÏÅ_Ìĉ™3g;vìzzàСCLŸ>É“'wfôPÜËcKPÕƒŽ° TÒê´ø,‘vL”Ž”¿3Ð~íêÃ`0ÐÐÐ@]]Ýn`qÞnØ–³“6I’ž®©©y/666)??¿Ë'pE$çê¹À·}×áž-Ä)€ ¡¼X‚‚Fà_À—À©@š?/¬««ã‹/¾à‹/¾@ ¸öÚk9çœs1b™™™!¤555|ýõ×Ìœ9“={üê”Z¼óßÔí‹÷àD²ß½ós[Еy~ÇÏùäþõ¯±k×. F£‘¨¨(´Z­ßU*6›ÒÒRV­ZÅÔ©Syíµ×¨®öë¾®E&2_teì=8v#7½ úŽ$''‹ääd¬66« ›ÍŠÕjÃfó|رÛlH’ ÛJ¦A$55•®Î× TUUÙªªªVO%”ú»òIDATþEz"þá‰ÊÊÊÑ:®wTTT—vä’$É-}ð¶Õï(Ó  ] GU}êÁìBö0x 8·«'q”E}òÉ'|òÉ'ˆ¢Hff&§Ÿ~:]tƒ "55•¸¸8¢¢¢ˆŽŽ¦µµÕNݳgëÖ­céÒ¥46vɱ·YÛ°‚À”w÷ {˜<ì‹hu:ïõʧœQ°·Í¯’‡eJW"f³™ªª**++K‘­¥Oyôÿ°ßb±Ì¬­­}I«Õ&åææv¹6¿£ì¿ó‡žO(žÓ…F !û\÷àÔD+²>`#²PðaäNf'»ÝNEE¬Zµ «]A@£‘ËV­V+’$uÇLëàFäI=ˆ ¼<@[{¦™¼é¦•i'@BÀµðûKìv;•••ÔÕÕ5Z,–gè‚¿ÆÉŒ ÿx§¾¾~I}}½±ººÚïË¡p(jW]zˆW·¼*4vÀoÑcük@r$à|ägÀT~ŽÅ¾µµ•ÖÖVl6[wÿUÈ=‹da?!躨ÅŽõÿ’k;å(tê$Éû&Ë$I¢ººšºº:S]]Ý2d_z€ÿ€»+++×ÔÕÕ™«««±ÛínêQ»ÝÞîáVØv7éŸRØB`lžöEzQ¨žÎCžÐ‰ ?ýäqMDîЃÈÃÓÈ©¥ ¡Ýœç)œV¦PTxÏ9ÚÛ£¦¦†ÚÚZseeåz`:Mȧz@× —$é÷¥¥¥›kjj,ž$ #(#ÞX­ó9(€Û냋'CÁ¾H"vàgà6ätÀ5Èi ¿dù†¹ãÚyÀLNQëÕSû€Y¡º˜äå_ŽïäùÒ1·Úq:­zTx{Øívª««©©©±”––n“$é6d‡Í_ z4]G™$I“ËÊÊÞ—$é ›Í¦KKKëP Ib[8K¹Ðû©ƒKvÒ³ûÿµÃŽl¬óYÛ#(âÿ·ww±UÞuÀ¿çpNK;ÚM-Œ!›¢‰n,ñ…mÎM0јE³ _nŒ1^j¼4^© ^x­ñ%z±/ÐÁÉ2ç…qq…]Í›Y °PZŠœô´=ÏãÅÓ–ÒB7 ‘Ï'9Éiûä´iNÎÿÿÿ=¿—dG’'’|8ÉÆUúÝeªáS?IÕmÎÂ{ø^’§S½OVÜÂA@s–´UYphšïX_xýÕfEQd||“ä£SSSw­_¿þŠ%'333éêîª2f.¥,é¸\À*j§J²ºcB^¼-S5Ûùk’Ÿ'Ùšä‘$ŸMuBHÒ›‹ žMÕbõI^Š…ÿvÓI²+ÉkIVÞ·®÷ǵú¥ýÕ{Tje¹;UƒŠkL5“j„çƒI¾‘*T °Z.¦ê+ñ¡TÑ€kÍùè$ùVRÛývn}–IîîïÏC}àG##'?vèСÕ_ýÆ4À[`|ü_/n}`Ëïk©=œdóü$Àú©€k²fÍš²^[óý½Ï>÷ËT‰W/%y<ËvNòr’Ÿ¥š¾' "7Áé$û’<“j Ó=I³ü¡óXªÞ¼~äÛ~p]£Ñx|ff&SÓÓK&öõõeË»î{õÝïyàé—ÿtГë°ê-æXÞŽÇvÕÕlö7›Í¢Ñhœhvujt5÷ØwàJezïMÕ˽oöë©T­]ÿœ;°™pÛ¸?ÉG’lJU-ÒH58˜dhñÅ_øòSLYû|§S윞ž,Ê"eQNÔëõ?ötwïß»wÿá›ùÇÜzÿ¥ü#OLxÒIEND®B`‚klog-2.3.3/img/play.svg0000644000015700001710000000022714542412415014600 0ustar jenkinsjenkinsklog-2.3.3/COPYING0000644000015700001710000010451614542412415013377 0ustar jenkinsjenkins 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 . klog-2.3.3/adifforfield.h0000644000015700001710000002307014542412415015126 0ustar jenkinsjenkins#ifndef ADIFFORFIELD_H #define ADIFFORFIELD_H /*************************************************************************** adifforfield.h - description ------------------- begin : oct 2021 copyright : (C) 2021 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include "klogdefinitions.h" #include "utilities.h" class ADIFForField: public QObject { Q_OBJECT // TODO: // Add checks for all the data (maybe adding the dataProxy to check helps // but may slow down the process as queries will be executed. public: ADIFForField(); QString getADIFForQSODate(const QString &_data, ExportMode _em = ModeADIF); QString getADIFForCall(const QString &_data); QString getADIFForRSTSent(const QString &_data); QString getADIFForRSTRcvd(const QString &_data); QString getADIFForBand(const QString &_data); QString getADIFForMode(const QString &_data); QString getADIFForSubMode(const QString &_data); QString getADIFForCQz(const QString &_data); QString getADIFForITUz(const QString &_data); QString getADIFForDXCC(const QString &_data); QString getADIFForAddress(const QString &_data); QString getADIFForAge(const QString &_data); QString getADIFForCNTY(const QString &_data); QString getADIFForComment(const QString &_data); QString getADIFForA_Index(const QString &_data); QString getADIFForAnt_az(const QString &_data); QString getADIFForAnt_el(const QString &_data); QString getADIFForAnt_path(const QString &_data); QString getADIFForARRL_sect(const QString &_data); QString getADIFForGridSquare(const QString &_data); QString getADIFForMyGridSquare(const QString &_data); QString getADIFForQSODateOff(const QString &_data, ExportMode _em = ModeADIF); QString getADIFForFreq(const QString &_data); QString getADIFForStationCallsign(const QString &_data); QString getADIFForBandRX(const QString &_data); QString getADIFForFreq_rx(const QString &_data); QString getADIFForQSLRDate(const QString &_data); QString getADIFForQSLSDate(const QString &_data); QString getADIFForQSLRcvd(const QString &_data); QString getADIFForQSLSent(const QString &_data); /* QString getADIFForLoTWRDate(const QString &_data); QString getADIFForLoTWSDate(const QString &_data); QString getADIFForLoTWQSLRcvd(const QString &_data); QString getADIFForLoTWQSLSent(const QString &_data); QString getADIFForHRDLogQSOUploadStatus(const QString &_data); QString getADIFForClubLogQSOUploadDate(const QString &_data); QString getADIFForClubLogQSOUploadStatus(const QString &_data); QString getADIFForHRDLogQSOUploadDate(const QString &_data); QString getADIFForHRDLogQSOUploadStatus(const QString &_data); QString getADIFForQRZCOMQSOUploadDate(const QString &_data); QString getADIFForQRZCOMQSOUploadStatus(const QString &_data); QString getADIFForAward_Submitted(const QString &_data); QString getADIFForAward_Granted(const QString &_data); QString getADIFForCheckContest(const QString &_data); QString getADIFForClass(const QString &_data); QString getADIFForCont(const QString &_data); QString getADIFForContactedOp(const QString &_data); QString getADIFForContestId(const QString &_data); QString getADIFForCountry(const QString &_data); QString getADIFForCreditSubmitted(const QString &_data); QString getADIFForCreditGranted(const QString &_data); QString getADIFForDark_doc(const QString &_data); QString getADIFForDistance(const QString &_data); QString getADIFForEmail(const QString &_data); QString getADIFForEQ_Call(const QString &_data); QString getADIFForEQSL_QSLRDate(const QString &_data); QString getADIFForEQSL_QSLSDate(const QString &_data); QString getADIFForEQSL_QSLRCVD(const QString &_data); QString getADIFForEQSL_QSLSent(const QString &_data); QString getADIFForFists(const QString &_data); QString getADIFForFist_cc(const QString &_data); QString getADIFForForce_init(const QString &_data); QString getADIFForGuest_op(const QString &_data); QString getADIFForIOTA(const QString &_data); QString getADIFForIOTAIslandId(const QString &_data); QString getADIFForMy_IOTA(const QString &_data); QString getADIFForMy_IOTAIslandId(const QString &_data); QString getADIFForK_Index(const QString &_data); QString getADIFForLat(const QString &_data); QString getADIFForLon(const QString &_data); QString getADIFForMaxBurst(const QString &_data); QString getADIFForMultiplier(const QString &_data); QString getADIFForMS_Shower(const QString &_data); QString getADIFForMy_Antenna(const QString &_data); QString getADIFForMy_City(const QString &_data); QString getADIFForMy_Cnty(const QString &_data); QString getADIFForMy_Country(const QString &_data); QString getADIFForMy_CQz(const QString &_data); QString getADIFForMy_DXCC(const QString &_data); QString getADIFForMy_Fists(const QString &_data); QString getADIFForMy_Ituz(const QString &_data); QString getADIFForMy_Lat(const QString &_data); QString getADIFForMy_Lon(const QString &_data); QString getADIFForMy_Name(const QString &_data); QString getADIFForMy_PostalCode(const QString &_data); QString getADIFForMy_Rig(const QString &_data); QString getADIFForSig(const QString &_data); QString getADIFForSig_info(const QString &_data); QString getADIFForMy_Sig(const QString &_data); QString getADIFForMy_Sig_info(const QString &_data); QString getADIFForMy_SotaRef(const QString &_data); QString getADIFForSotaRef(const QString &_data); QString getADIFForMy_State(const QString &_data); QString getADIFForMy_Street(const QString &_data); QString getADIFForMy_USACA_Counties(const QString &_data); QString getADIFForUSACA_Counties(const QString &_data); QString getADIFForMy_VUCC_Grids(const QString &_data); QString getADIFForVUCC_Grids(const QString &_data); QString getADIFForName(const QString &_data); QString getADIFForNotes(const QString &_data); QString getADIFForNr_Bursts(const QString &_data); QString getADIFForNr_pings(const QString &_data); QString getADIFForOperator(const QString &_data); QString getADIFForOwner_Callsign(const QString &_data); QString getADIFForPfx(const QString &_data); QString getADIFForPoints(const QString &_data); QString getADIFForPrecedence(const QString &_data); QString getADIFForProp_Mode(const QString &_data); QString getADIFForPublic_key(const QString &_data); QString getADIFForQSLMsg(const QString &_data); QString getADIFForQSLSentVia(const QString &_data); QString getADIFForQSLRecVia(const QString &_data); QString getADIFForQSLVia(const QString &_data); QString getADIFForQSO_Complete(const QString &_data); QString getADIFForQSO_Random(const QString &_data); QString getADIFForQTH(const QString &_data); QString getADIFForRegion(const QString &_data); QString getADIFForRig(const QString &_data); QString getADIFForRX_Pwr(const QString &_data); QString getADIFForTX_Pwr(const QString &_data); QString getADIFForSat_Mode(const QString &_data); QString getADIFForSfi(const QString &_data); QString getADIFForSilentKey(const QString &_data); QString getADIFForSKCC(const QString &_data); QString getADIFForSRx_String(const QString &_data); QString getADIFForSTx_String(const QString &_data); QString getADIFForSRx(const QString &_data); QString getADIFForSTx(const QString &_data); QString getADIFForState(const QString &_data); QString getADIFForSWL(const QString &_data); QString getADIFForUKSMG(const QString &_data); QString getADIFForVE_Prov(const QString &_data); QString getADIFForTenTen(const QString &_data); QString getADIFForWeb(const QString &_data); QString getADIFForTransmiterId(const QString &_data); QString getADIFForLogNumber(const QString &_data); */ private: bool showInvalidCallMessage(const QString &_call); QString getADIFPair(const QString &_field, const QString &_data); Utilities *util; }; #endif // ADIFFORFIELD_H klog-2.3.3/adifforfield.cpp0000644000015700001710000002766614542412415015500 0ustar jenkinsjenkins/*************************************************************************** adifforfield.cpp - description ------------------- begin : oct 2021 copyright : (C) 2021 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "adifforfield.h" ADIFForField::ADIFForField() { util = new Utilities; } QString ADIFForField::getADIFForQSODate(const QString &_data, ExportMode _em) { //qDebug() << Q_FUNC_INFO; if (_data.length ()<1) return QString(); QString aux, result; result.clear (); QDateTime tDateTime; tDateTime = util->getDateTimeFromSQLiteString(_data); if (tDateTime.isValid()) { aux = util->getADIFDateFromQDateTime(tDateTime); result = getADIFPair("QSO_DATE", aux); aux = util->getADIFTimeFromQDateTime(tDateTime); if (_em == ModeEQSL) { aux.chop(2); } //qDebug() << Q_FUNC_INFO << ": " << result; result = result + getADIFPair("TIME_ON", aux); } //qDebug() << Q_FUNC_INFO << ": " << result; return result; } QString ADIFForField::getADIFForCall(const QString &_data) { //qDebug() << Q_FUNC_INFO << ": " << _data; QString result; result.clear (); if (util->isValidCall(_data)) { result = getADIFPair("CALL", _data); } else { if (showInvalidCallMessage(_data)) { result = getADIFPair("CALL", _data); } } return result; } QString ADIFForField::getADIFForRSTSent(const QString &_data) { //qDebug() << Q_FUNC_INFO; return getADIFPair("RST_SENT", _data); } QString ADIFForField::getADIFForRSTRcvd(const QString &_data) { //qDebug() << Q_FUNC_INFO; return getADIFPair("RST_RCVD", _data); } QString ADIFForField::getADIFForBand(const QString &_data) { //qDebug() << Q_FUNC_INFO; return getADIFPair("BAND", _data); } QString ADIFForField::getADIFForMode(const QString &_data) { //qDebug() << Q_FUNC_INFO; //if ((aux.length()>1) && (dataProxy->getIdFromModeName(aux)>=0)) return getADIFPair("MODE", _data); } QString ADIFForField::getADIFForSubMode(const QString &_data) { //qDebug() << Q_FUNC_INFO; return getADIFPair("SUBMODE", _data); } QString ADIFForField::getADIFForCQz(const QString &_data) { //qDebug() << Q_FUNC_INFO; QString result; result.clear (); if ( (0 < _data.toInt()) && (_data.toInt() < CQZones+1) ) { return getADIFPair("CQZ", _data); } return result; } QString ADIFForField::getADIFForITUz(const QString &_data) { //qDebug() << Q_FUNC_INFO; QString result; result.clear (); if ( (0 < _data.toInt()) && (_data.toInt() < ITUZones+1) ) { return getADIFPair("ITUZ", _data); } return result; } QString ADIFForField::getADIFForDXCC(const QString &_data) { //qDebug() << Q_FUNC_INFO; QString result; result.clear (); if ( (0 < _data.toInt()) && (_data.toInt() < DXCCEntities+1) ) { return getADIFPair("DXCC", _data); } return result; } QString ADIFForField::getADIFForAddress(const QString &_data) { //qDebug() << Q_FUNC_INFO; return getADIFPair("ADDRESS", _data); } QString ADIFForField::getADIFForAge(const QString &_data) { //qDebug() << Q_FUNC_INFO; bool ok; float num = _data.toFloat(&ok); if (!ok) return QString(); if (!( (num>=0.0) && (num<=120.0) )) return QString(); return getADIFPair("AGE", _data); } QString ADIFForField::getADIFForCNTY(const QString &_data) { //qDebug() << Q_FUNC_INFO; return getADIFPair("CNTY", _data); } QString ADIFForField::getADIFForComment(const QString &_data) { //qDebug() << Q_FUNC_INFO; return getADIFPair("COMMENT", _data); } QString ADIFForField::getADIFForA_Index(const QString &_data) { //qDebug() << Q_FUNC_INFO; bool ok; float num = _data.toFloat(&ok); if (!ok) return QString(); if (!( (num>=0.0) && (num<=400.0) )) return QString(); return getADIFPair("A_INDEX", _data); } QString ADIFForField::getADIFForAnt_az(const QString &_data) { //qDebug() << Q_FUNC_INFO; //TODO: Normalize to 0-360 bool ok; float num = _data.toFloat(&ok); if (!ok) return QString(); return getADIFPair("ANT_AZ", QString::number(num)); } QString ADIFForField::getADIFForAnt_el(const QString &_data) { //qDebug() << Q_FUNC_INFO; //TODO: Normalize to -90 - 90 bool ok; float num = _data.toFloat(&ok); if (!ok) return QString(); if (!((-90.0 <= num) && (90.0>=num))) return QString(); return getADIFPair("ANT_EL", _data); } QString ADIFForField::getADIFForAnt_path(const QString &_data) { //qDebug() << Q_FUNC_INFO; QStringList validData; validData.clear (); validData << "G" << "O" << "S" << "L"; if (!validData.contains (_data)) return QString(); return getADIFPair("ANT_PATH", _data); } QString ADIFForField::getADIFForARRL_sect(const QString &_data) { //qDebug() << Q_FUNC_INFO; //TODO: Ensure the exported data is a valid ARRL SECT return getADIFPair("ARRL_SECT", _data); } QString ADIFForField::getADIFForGridSquare(const QString &_data) { //qDebug() << Q_FUNC_INFO; //TODO: Ensure the exported data is a valid ARRL SECT if (!util->isValidGrid (_data)) return QString(); return getADIFPair("GRIDSQUARE", _data); } QString ADIFForField::getADIFForMyGridSquare(const QString &_data) { //qDebug() << Q_FUNC_INFO; //TODO: Ensure the exported data is a valid ARRL SECT if (!util->isValidGrid (_data)) return QString(); return getADIFPair("MY_GRIDSQUARE", _data); } QString ADIFForField::getADIFForQSODateOff(const QString &_data, ExportMode _em) { //qDebug() << Q_FUNC_INFO; if (_data.length ()<1) return QString(); QString aux, result; result.clear (); QDateTime tDateTime; tDateTime = util->getDateTimeFromSQLiteString(_data); if (tDateTime.isValid()) { aux = util->getADIFDateFromQDateTime(tDateTime); result = getADIFPair("QSO_DATE_OFF", aux); aux = util->getADIFTimeFromQDateTime(tDateTime); if (_em == ModeEQSL) { aux.chop(2); } //qDebug() << Q_FUNC_INFO << ": " << result; result = result + getADIFPair("TIME_OFF", aux); } //qDebug() << Q_FUNC_INFO << ": " << result; return result; } QString ADIFForField::getADIFForFreq(const QString &_data) { //qDebug() << Q_FUNC_INFO; //TODO: Normalize to 0-360 bool ok; float num = _data.toFloat(&ok); if (!ok) return QString(); if (num<0) { return QString(); } return getADIFPair("FREQ", QString::number(num)); } QString ADIFForField::getADIFForStationCallsign(const QString &_data) { //qDebug() << Q_FUNC_INFO; QString result; result.clear (); if (util->isValidCall(_data)) { result = getADIFPair("STATION_CALLSIGN", _data); } else { if (showInvalidCallMessage(_data)) { result = getADIFPair("STATION_CALLSIGN", _data); } } return result; } QString ADIFForField::getADIFPair(const QString &_field, const QString &_data) { //qDebug() << Q_FUNC_INFO << ": " << _field << "/" << _data; int length = _data.length (); if (length<1) { return QString(); } if (_field.length ()<1) { return QString(); } return QString("<%1:%2>%3 ").arg(_field).arg(length).arg(_data); } bool ADIFForField::showInvalidCallMessage(const QString &_call){ QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - Invalid call detected")); QString aux = _call; if (aux.length()<1) { aux = QString(tr("An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported log file?")); } else { aux = QString(tr("An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log file?").arg(aux)); } msgBox.setText(aux); msgBox.setInformativeText(tr("Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. You can, however, edit the ADIF file once the export process is finished.")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked return true; case QMessageBox::No: // No Save was clicked return false; default: // should never be reached return false; } } QString ADIFForField::getADIFForBandRX(const QString &_data) { //qDebug() << Q_FUNC_INFO; return getADIFPair("BAND_RX", _data); } QString ADIFForField::getADIFForFreq_rx(const QString &_data) { //qDebug() << Q_FUNC_INFO; //TODO: Normalize to 0-360 bool ok; float num = _data.toFloat(&ok); if (!ok) return QString(); if (num<0) { return QString(); } return getADIFPair("FREQ_RX", QString::number(num)); } QString ADIFForField::getADIFForQSLRDate(const QString &_data) { //qDebug() << Q_FUNC_INFO; if (_data.length ()<1) return QString(); QString aux, result; result.clear (); QDate tDate; tDate = util->getDateFromSQliteString(_data); if (tDate.isValid()) { aux = util->getADIFDateFromQDate (tDate); result = getADIFPair("QSLRDATE", aux); } //qDebug() << Q_FUNC_INFO << ": " << result; return result; } QString ADIFForField::getADIFForQSLSDate(const QString &_data) { //qDebug() << Q_FUNC_INFO; if (_data.length ()<1) return QString(); QString aux, result; result.clear (); QDate tDate; tDate = util->getDateFromSQliteString(_data); if (tDate.isValid()) { aux = util->getADIFDateFromQDate (tDate); result = getADIFPair("QSLSDATE", aux); } //qDebug() << Q_FUNC_INFO << ": " << result; return result; } QString ADIFForField::getADIFForQSLRcvd(const QString &_data) { //qDebug() << Q_FUNC_INFO; if (!util->isValidQSL_Rcvd (_data, false)) return QString(); return getADIFPair("QSL_RCVD", _data); } QString ADIFForField::getADIFForQSLSent(const QString &_data) { if (!util->isValidQSL_Sent (_data)) return QString(); return getADIFPair("QSL_SENT", _data); } klog-2.3.3/world.cpp0000644000015700001710000007400314542412415014174 0ustar jenkinsjenkins/*************************************************************************** world.cpp - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "world.h" /* QHash worldPrefixes; To insert a (key, value) pair into the hash, you can use operator[](): hash["EA"] = 130; hash["EA6"] = 131; hash["EA8"] = 132; */ World::World(DataProxy_SQLite *dp, const QString &_parentFunction) { Q_UNUSED(_parentFunction); //qDebug() << Q_FUNC_INFO << " - Start"; //worldModel = new QSqlRelationalTableModel(this); //qDebug() << Q_FUNC_INFO << " - Start"; numberOfEntities = 0; progressBarPosition = 0; worldPrefixes.clear(); cqz = -1; ituz = -1; ret = false; continentId = -1; lat = 0.0; lon = 0.0; utc = 0.0; locator = new Locator(); created = false; dataProxy = dp; util = new Utilities(Q_FUNC_INFO); if (readWorld()) { //qDebug() << Q_FUNC_INFO << " - World TRUE"; } else { //qDebug() << Q_FUNC_INFO << " - World FALSE"; } //qDebug() << Q_FUNC_INFO << " - END"; } World::~World() { //qDebug() << "World::~World"; delete(locator); delete(util); } bool World::readWorld() { // Used to link a prefix with an Entity quickly, without quering the DB. //qDebug() << Q_FUNC_INFO << " - Start"; worldPrefixes.clear(); worldPrefixes = dataProxy->getWorldData(); if (worldPrefixes.size()>100) { //qDebug() << Q_FUNC_INFO << " - END true"; util->setLongPrefixes(dataProxy->getLongPrefixes()); util->setSpecialCalls(dataProxy->getSpecialCallsigns()); return true; } //qDebug() << Q_FUNC_INFO << " - END false"; return false; } bool World::recreate(const QString &_worldFile) { //qDebug() << "World::recreate: " << _worldFile; QSqlQuery query; if (query.exec("DELETE FROM entity")) { //qDebug() << "World::recreate: EMPTY entity" ; if (query.exec("DELETE FROM prefixesofentity")) { //qDebug() << "World::recreate: EMPTY prefixesofentity" ; return create(_worldFile); //if (create(_worldFile)) // { // return insertSpecialEntities (); // } } else {//TODO: Manage the query error //qDebug() << "World::recreate: FAILED TO EMPTY prefixesofentity" ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); return false; } } else {//TODO: Manage the query error //qDebug() << "World::recreate: FAILED TO EMPTY entity" ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); return false; } return false; } bool World::create(const QString &_worldFile) { //qDebug() << "World::create: " << _worldFile; //klogDir = _worldFile; //qDebug() << "World::create: 2 " << klogDir; if (readCTYCSV(_worldFile)) { util->setLongPrefixes(dataProxy->getLongPrefixes()); util->setSpecialCalls(dataProxy->getSpecialCallsigns()); created = true; //qDebug() << "World::create: TRUE" ; }else { created = false; //qDebug() << "World::create: FALSE" ; } if (created) { created = insertSpecialEntities(); } if (created) { //dataProxy->updateISONames(); if (dataProxy->updateISONames()) { //qDebug() << "World::create: updateISONames TRUE" ; } else { //qDebug() << "World::create: updateISONames FALSE" ; } } readWorld (); //qDebug() << "World::create: END" ; return created; } /* void World::createWorldModel() { worldModel->setTable("entity"); worldModel->setRelation(Entity_Continent, QSqlRelation("continent", "id", "shortname")); worldModel->setSort(Entity_Name, Qt::AscendingOrder); worldModel->setHeaderData(Entity_Name, Qt::Horizontal, tr("Entity")); worldModel->setHeaderData(Entity_Continent, Qt::Horizontal, tr("Continent")); worldModel->select(); } */ QStringList World::processLine(const QString &_line) { //qDebug() << "World::processLine: received: " << _line; //QString queryString; QStringList aa; QString line; line = (_line).simplified(); if ((line).count('\'')) // Replaces ' by _ //The error comes from "Cote d'Ivoire" that breaks the SQL { line.replace(QChar('\''), QChar('_')); } //qDebug() << "World::processLine: Received: " << line; //QSqlQuery query1; nullValue=-1; if ( (line.count(':') == 8 ) ) // First line of an Entity { //United States: 05: 08: NA: 43.00: 87.90: 5.0: K: //qDebug() << "World::processLine first: " << line; numberOfEntities++; list.clear(); list << line.split(':'); entityName = list[0]; cqz = list[1].toInt(); ituz = list[2].toInt(); continentName = (list[3]).simplified(); continentId=-1; lat = list[4].toDouble(); lon = list[5].toDouble(); utc = ((list[6]).simplified()).toDouble(); //utc = ((list[6]).simplified()).toInt(); prefix = list[7]; currentPrefix = prefix; continentId = dataProxy->getContinentIdFromContinentShortName(continentName); aa << entityName << QString::number(cqz) << QString::number(ituz) <getCQzFromEntity(currentEntity); _ituz = dataProxy->getITUzFromEntity(currentEntity); line = line.remove(';'); if (line.count(',') == 0) // Only one prefix in the final line { prefixAndZones = readZones(line, _cqz, _ituz); //aa.clear(); aa << prefixAndZones.at(0) << QString::number(currentEntity) << prefixAndZones.at(1) << prefixAndZones.at(2); //readZones returns a QStringList: prefix, CQz, ITUz //Returns QStringList: prefix << dxcc << cqz << ituz OR CurrentEntity as a number return aa; } else // More than just one prefix in the final line { //qDebug() << "World::processLineP Query (MORE one final)(line):" << line; _list.clear(); _list << line.split(','); aa.clear(); //queryString.clear(); for (int i = 0; i < _list.size(); ++i) { // PROCESS THE LINE //qDebug() << "World::processLineP LastLine prefixes" << _list.at(i); //readZones returns a QStringList: prefix, CQz, ITUz prefixAndZones = readZones(_list.at(i), _cqz, _ituz); //aa.clear(); aa << prefixAndZones.at(0) << QString::number(currentEntity) << prefixAndZones.at(1) << prefixAndZones.at(2); //return aa; } //qDebug() << "World::processLineP: END" <getCQzFromEntity(currentEntity); _ituz = dataProxy->getITUzFromEntity(currentEntity); if (line.endsWith(',')) { line.chop(1); } if ((line.split(',')).size() == 1) // Only one prefix in the middle line { // Not usual, added this check for sanity reasons only //qDebug() << "World::processLine Query: (only one middle) "; line = line.remove(','); prefixAndZones = readZones(line, _cqz, _ituz); aa.clear(); aa << prefixAndZones.at(0) << QString::number(currentEntity) << prefixAndZones.at(1) << prefixAndZones.at(2); return aa; } else { //qDebug() << "World::processLine Query: (MORE than one middle) "; list.clear(); list << line.split(','); //queryString.clear(); aa.clear(); for (int i = 0; i < list.size(); ++i) { // PROCESS THE LINE prefixAndZones = readZones(list[i], _cqz, _ituz); aa << prefixAndZones.at(0) << QString::number(currentEntity) << prefixAndZones.at(1) << prefixAndZones.at(2); //ret = query.exec(queryString); } } } //aa.clear(); return aa; } QStringList World::readZones (const QString &pref, const int _cq, const int _itu) { //Returns a QStringList: prefix, CQz, ITUz //qDebug() << "World::readZones: (" << pref << "/" << QString::number(_cq) <<"/" << QString::number(_itu)<< ")"; QStringList result; int cq = _cq; int itu = _itu; QString azone; QString aux = pref; if(aux.count('[')==1) // Check if has special CQz { //qDebug() << "World::readZones DETECTED [ !!!!"; azone = (aux.midRef(aux.indexOf('[')+1)).toString(); //qDebug() << "World::readZones (ITU)-1: " << aux << " right of " << QString::number(aux.indexOf('[')) << " = " << azone; itu = (azone.left(azone.indexOf(']'))).toInt(); //qDebug() << "World::readZones (ITU)-2: " << azone.left(azone.indexOf(']')); aux = aux.left(aux.indexOf('[')); //qDebug() << "World::readZones (ITU): " << pref << "/" << QString::number(itu) << "/" << aux; } if(aux.count('(')==1) // Check if has special CQz { //qDebug() << "World::readZones DETECTED ( !!!!"; azone = (aux.midRef(aux.indexOf('(')+1)).toString(); cq = (azone.left(azone.indexOf(')'))).toInt(); aux = aux.left(aux.indexOf('(')); //qDebug() << "World::readZones (CQ): " << pref << "/" << QString::number(cq) << "/" << aux; } //qDebug() << "World::readZones (Pref/CQ/ITU): " << pref << "= " << aux <<"/" << QString::number(cq) << "/" << QString::number(itu); result << aux << QString::number(cq) << QString::number(itu); //qDebug() << "World::readZones (Pref/CQ/ITU): " << result; return result; } int World::getPrefixId(const QString &_prefix) { //qDebug() << Q_FUNC_INFO << " - Start: " << _prefix << "/" << QString::number(worldPrefixes.value(_prefix, -2)); //This function receives the final prefix. if (_prefix.length() < 1) { return -1; } return worldPrefixes.value(_prefix, -2); } QString World::getQRZEntityName(const QString &_qrz) { //qDebug() << Q_FUNC_INFO << ": " << _qrz; if (_qrz.length() < 1 ) { return QString(); } int prefixIDNumber = getQRZARRLId(_qrz); return getEntityName(prefixIDNumber); } QString World::getEntityName(const int _entityN) { int prefixIDNumber = _entityN; if (prefixIDNumber<=0) { return QString(); } return dataProxy->getEntityNameFromId(prefixIDNumber); } int World::getQRZCqz(const QString &_qrz) { //qDebug() << "World::getQRZCqz: " << _qrz; if (_qrz.length() < 1 ) { return -1; } QString aux = util->getPrefixFromCall(_qrz); return dataProxy->getCQzFromPrefix(aux); } int World::getQRZItuz(const QString &_qrz) { //qDebug() << "World::getQRZItuz: " << _qrz; if (_qrz.length() < 1 ) { return -1; } QString aux = util->getPrefixFromCall(_qrz); return dataProxy->getITUzFromPrefix(aux); } int World::getEntityCqz(const int _enti) { if (_enti < 1 ) { return -1; } return dataProxy->getCQzFromEntity(_enti); } int World::getEntityItuz(const int _enti) { if (_enti < 1 ) { return -1; } return dataProxy->getITUzFromEntity(_enti); } int World::getQRZARRLId(const QString &_qrz) { //qDebug() << Q_FUNC_INFO << ": " << _qrz; if (_qrz.length() < 1 ) { return -1; } QString pref = util->getPrefixFromCall(_qrz); //qDebug() << Q_FUNC_INFO << ": prefix: " << pref; return getPrefixId(pref); } QString World::getQRZEntityMainPrefix(const QString &_qrz) { //qDebug() << Q_FUNC_INFO << ": " << _qrz; if (_qrz.length() < 1 ) { return ""; } int i = getQRZARRLId(_qrz); return getEntityMainPrefix(i); } QString World::getEntityMainPrefix(const int _entityN) { if (_entityN <= 0 ) { return QString(); //return tr("NONE"); } return dataProxy->getEntityMainPrefix(_entityN); } bool World::isNewCQz(const int _cqz) { return dataProxy->isNewCQz(_cqz); } bool World::isNewEntity(const int _entityN) { if (_entityN <= 0) { return false; } return dataProxy->isNewEntity(_entityN); } QString World::getQRZContinentShortName(const QString &_qrz) { //qDebug() << Q_FUNC_INFO << ": " << _qrz; return getContinentShortName (getQRZARRLId(_qrz)); } QString World::getContinentShortName(const int _enti) { //qDebug() << "World::getQRZContinentShortName: " << QString::number(_enti); if ( _enti < 0 ) { return "--"; } QString a = dataProxy->getContinentShortNameFromEntity(_enti); if (a.length()!=2) { return "--"; } else { return a; } } QString World::getQRZContinentNumber(const QString &_qrz) { //qDebug() << Q_FUNC_INFO << ": " << _qrz; int i = getQRZARRLId(_qrz); return QString::number(getContinentNumber(i)); } int World::getContinentNumber(const int _enti) { //qDebug() << "World::getQRZContinentNumber: " << QString::number(_enti); if (_enti <= 0) { return -1; } return dataProxy->getContinentIdFromEntity(_enti); } double World::getLongitude(const int _enti) { if (_enti <= 0) { return 0.0; } return dataProxy->getLongitudeFromEntity(_enti); } double World::getLatitude(const int _enti) { if (_enti <= 0) { return 0.0; } return dataProxy->getLatitudeFromEntity(_enti); } QString World::getQRZLocator(const QString &_qrz) { //qDebug() << Q_FUNC_INFO << " - Start: " << _qrz; if (_qrz.length() < 1) { return ""; } int i = getQRZARRLId (_qrz); //qDebug() << Q_FUNC_INFO << " - 2"; return locator->getLocator(getLongitude(i), getLatitude (i)); } QString World::getLocator(const int _entityN) { if (_entityN <= 0) { return ""; } return locator->getLocator(getLongitude(_entityN), getLatitude(_entityN)); } bool World::readCTYCSV(const QString &_worldFile) { //qDebug() << "World::readCTYCSV(): " << _worldFile; QString tq; tq.clear(); QString entityNumber; //entityNumber = "-1"; //QString fileName; qint64 beginingOfFile; int numberOfLines = 0; //int errorCode = -1; QFile file( _worldFile ); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << "World::readCTYCSV() File not found: END FALSE" << fileName; return false; } else { //qDebug() << "World::readCTYCSV() File found: " << fileName; } beginingOfFile = file.pos(); while (!file.atEnd()) { if ( (file.readLine()).contains(';') ) { numberOfEntities++; } numberOfLines++; } //qDebug() << "World::readCTYCSV() - numberOfEntities: " << QString::number(numberOfEntities); // The file is readed twice: 1: Main entity data; 2: prefixes. // Starts with main data: file.seek(beginingOfFile); progressBarPosition = 0; //QProgressDialog progress(tr("Reading cty.csv..."), tr("Abort reading"), 0, numberOfLines, this); QProgressDialog progress(tr("Reading cty.csv..."), tr("Abort reading"), 0, numberOfLines); progress.setWindowModality(Qt::ApplicationModal); numberOfEntities = 0; // Reset this variable to reuse it and assign the "dxcc" to the entities (temp solution) QSqlQuery query; // Entity information QSqlQuery queryP; // Prefixes information query.prepare("INSERT INTO entity (id, name, cqz, ituz, continent, latitude, longitude, utc, dxcc, mainprefix) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); queryP.prepare("INSERT INTO prefixesofentity (id, prefix, dxcc, cqz, ituz) VALUES (?, ?, ?, ?, ?)"); QSqlDatabase::database().transaction(); QStringList T9StringList; T9StringList.clear(); QStringList stringList, stringListPrefixes, stringListProcessedPrefix; int entN; //entN = -1; while (!file.atEnd()) { progress.setValue(progressBarPosition); progressBarPosition++; if (progress.wasCanceled()) break; stringList.clear(); stringListPrefixes.clear(); // // 9Y,Trinidad & Tobago,90,SA,9,11,10.38,61.28,4.0,9Y 9Z; // 5A,Libya,436,AF,34,38,27.20,-16.60,-2.0,5A; // MainPref / Name / dxcc / Cont / CQ / ITU / LAT / LON / -UTC / prefixes // 0 1 2 3 4 5 6 7 8 9 tq = file.readLine(); //qDebug() << "World::readCTYCSV(): Line: " << tq; tq = tq.simplified(); //qDebug() << "World::readCTYCSV(): Line simplified: " << tq; tq = tq.trimmed(); //qDebug() << "World::readCTYCSV(): Line trimmed: " << tq; tq.remove(QChar(';'), Qt::CaseInsensitive); //qDebug() << "World::readCTYCSV(): Line without ;: " << tq; stringList << tq.split(','); //qDebug() << "World::readCTYCSV(): Line stringList-0: " << stringList.at(0); if (( stringList.at(0)).contains(QChar('*'), Qt::CaseInsensitive)) { // This is a special Entity. Not really an ARRL Entity but interesting for the DXer. // From http://www.country-files.com/cty-dat-format // (A “*†preceding this prefix indicates that the country is on the DARC WAEDC list, and counts in CQ-sponsored contests, but not ARRL-sponsored contests). //entN = -1; entN = (stringList.at(2)).toInt() + 1000; while ( (dataProxy->getEntityMainPrefix(entN)).size()>0 ) { //qDebug() << "World::readCTYCSV() entN: " << QString::number(entN); //qDebug() << "World::readCTYCSV() dataProxy->getEntityMainPrefix: " << QString::number(entN); entN = entN + 1000; } entityNumber = QString::number(entN); } else { entityNumber = stringList.at(2); } //qDebug() << "World::readCTYCSV(): Line stringList Length: " << QString::number(stringList.length()); if (stringList.size()>=8 ) { //(id, name, cqz, ituz, continent, latitude, longitude, utc, dxcc, mainprefix) query.addBindValue(QVariant(QVariant::Int)); query.addBindValue(stringList.at(1)); // name query.addBindValue(stringList.at(4)); // CQ query.addBindValue(stringList.at(5)); // ITU query.addBindValue(stringList.at(3)); // Cont query.addBindValue(stringList.at(6)); // Lat query.addBindValue(stringList.at(7)); // Lon query.addBindValue(stringList.at(8)); // UTC //query.addBindValue(stringList.at(2)); // dxcc query.addBindValue(entityNumber); // dxcc query.addBindValue(stringList.at(0)); // Mainprefix //qDebug() << "World::readCTYCSV(): Entity name: " << stringList.at(1); //qDebug() << "World::readCTYCSV(): Entity cqz: " << stringList.at(4); //qDebug() << "World::readCTYCSV(): Entity ituz: " << stringList.at(5); //qDebug() << "World::readCTYCSV(): Entity cont: " << stringList.at(3); //qDebug() << "World::readCTYCSV(): Entity lat: " << stringList.at(6); //qDebug() << "World::readCTYCSV(): Entity lon: " << stringList.at(7); //qDebug() << "World::readCTYCSV(): Entity UTC: " << stringList.at(8); //qDebug() << "World::readCTYCSV(): Entity ARRL: " << stringList.at(2); //qDebug() << "World::readCTYCSV(): Entity Pref: " << stringList.at(0); if (query.exec()) { //qDebug() << "World::readCTYDAT(): Entity data added: " << stringList.at(1) ; } else if (query.lastError().nativeErrorCode() == QString::number(19)) { //qDebug() << "World::readCTYDAT(): Entity data added: error19: " << stringList.at(1) ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } else { //qDebug() << "World::readCTYDAT(): Entity data added: error else: " << stringList.at(1) ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //errorCode = query.lastError().nativeErrorCode(); //qDebug() << "World::readCTYCSV(): Entity data NOT added" ; //qDebug() << "World::readCTYCSV(): LastQuery: " << query.lastQuery() ; //qDebug() << "World::readCTYCSV(): LastError-data: " << query.lastError().databaseText() ; //qDebug() << "World::readCTYCSV(): LastError-driver: " << query.lastError().driverText() ; //qDebug() << "World::readCTYCSV(): LastError-n: " << QString::number(query.lastError().nativeErrorCode() ); } //qDebug() << "World::readCTYCSV(): Entity ADDED or NOT" ; if (stringList.size()>8) { tq = stringList.at(9); stringListPrefixes << tq.split(' '); tq = stringListPrefixes.last(); QString prefAux = QString(); for (int i = 0; i < stringListPrefixes.size(); ++i) { prefAux = stringListPrefixes.at(i); //queryP.prepare("INSERT INTO prefixesofentity (id, prefix, dxcc, cqz, ituz) VALUES (?, ?, ?, ?, ?)"); // 0 1 2 3 4 // (id, prefix, dxcc, cqz, ituz) //qDebug() << "World::readCTYCSV(): Prefix: " << stringListPrefixes.at(i); queryP.addBindValue(QVariant(QVariant::Int)); //readZones (const QString &pref, const int _cq, const int _itu) //Returns a QStringList: prefix, CQz, ITUz stringListProcessedPrefix.clear(); stringListProcessedPrefix << readZones(prefAux, (stringList.at(4)).toInt(), (stringList.at(5)).toInt()); queryP.addBindValue(stringListProcessedPrefix.at(0)); queryP.addBindValue(entityNumber); queryP.addBindValue(stringListProcessedPrefix.at(1)); queryP.addBindValue(stringListProcessedPrefix.at(2)); if (queryP.exec()) {// T9 is the former prefix of Bosnia and Herzegovina; it moved to E7 on 7 August 2007. // YZ and 4N belonged to Yugoslavia, along with 4O (which went to successor state Montenegro) // YT and YU (which went to successor state Serbia) //qDebug() << "World::readCTYCSV(): Prefix added: " << stringListPrefixes.at(i); } else if (queryP.lastError().nativeErrorCode() != QString::number(19)) { //errorCode = queryP.lastError().nativeErrorCode(); emit queryError(Q_FUNC_INFO, queryP.lastError().databaseText(), queryP.lastError().nativeErrorCode(), queryP.lastQuery()); //qDebug() << "World::readCTYCSV(): Prefix data NOT added" ; //qDebug() << "World::readCTYCSV(): Prefix LastQuery: " << query.lastQuery() ; //qDebug() << "World::readCTYCSV(): Prefix LastError-data: " << query.lastError().databaseText() ; //qDebug() << "World::readCTYCSV(): Prefix LastError-driver: " << query.lastError().driverText() ; //qDebug() << "World::readCTYCSV(): Prefix LastError-n: " << QString::number(query.lastError().nativeErrorCode() ); } } } } //qDebug() << "World::readCTYCSV() tq: " << tq; progress.setLabelText("Reading cty.csv ... \nNow reading " + currentPrefix + " data"); //qDebug() << "World::readCTYCSV() - progressBarPosition: " << QString::number(progressBarPosition); } QSqlDatabase::database().commit(); progress.setValue(numberOfLines); if (created) { dataProxy->updateISONames(); } //qDebug() << "World::readCTYCSV() END TRUE " ; return true; } /*QStringList World::getEntitiesNames() { //qDebug() << "World::getEntitiesNames" ; return dataProxy->getEntitiesNames(); } */ int World::getHowManyEntities() { return dataProxy->getHowManyEntities(); } bool World::insertSpecialEntities() { //https://en.wikipedia.org/wiki/Non-ITU_prefix //qDebug() << Q_FUNC_INFO; // T9 to E7 // 4N & YZ to 4O int entityID = dataProxy->getEntityIdFromMainPrefix("E7"); int cqz = dataProxy->getCQZFromId(entityID); int ituz = dataProxy->getITUzFromEntity(entityID); QString queryString = QString("INSERT INTO prefixesofentity (prefix, dxcc, cqz, ituz) VALUES ('%1', '%2', '%3', '%4') ").arg("T9").arg(entityID).arg(cqz).arg(ituz); QSqlQuery query; bool sqlOK = query.exec(queryString); if (!sqlOK) { query.finish(); //qDebug() << Q_FUNC_INFO << " : T9 not added "; return false; } entityID = dataProxy->getEntityIdFromMainPrefix("4O"); cqz = dataProxy->getCQzFromEntity(entityID); ituz = dataProxy->getITUzFromEntity(entityID); queryString = QString("INSERT INTO prefixesofentity (prefix, dxcc, cqz, ituz) VALUES ('%1', '%2', '%3', '%4') ").arg("4N").arg(entityID).arg(cqz).arg(ituz); sqlOK = query.exec(queryString); if (!sqlOK) { query.finish(); //qDebug() << Q_FUNC_INFO << " : 4N not added "; return false; } queryString = QString("INSERT INTO prefixesofentity (prefix, dxcc, cqz, ituz) VALUES ('%1', '%2', '%3', '%4') ").arg("YZ").arg(entityID).arg(cqz).arg(ituz); sqlOK = query.exec(queryString); if (!sqlOK) { query.finish(); //qDebug() << Q_FUNC_INFO << " : YZ not added "; return false; } return true; //qDebug() << Q_FUNC_INFO << " - END"; } bool World::hasSpecialEntities() { // Checks if T9 is added to the list of prefixes to validate if special prefixes have been added. //qDebug() << Q_FUNC_INFO; QString queryString = QString("SELECT dxcc from prefixesofentity WHERE prefix='T9'"); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { if ((query.value(0)).toInt()>1) { query.finish(); return true; } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } query.finish(); return false; } klog-2.3.3/logviewsortfilterproxymodel.cpp0000644000015700001710000002002314542412415020753 0ustar jenkinsjenkins/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** BSD License Usage ** Alternatively, you may use this file under the terms of the BSD license ** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of The Qt Company Ltd nor the names of its ** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "logviewsortfilterproxymodel.h" LogViewSortFilterProxyModel::LogViewSortFilterProxyModel(QObject *parent) : QSortFilterProxyModel(parent) { //setDynamicSortFilter(true); } bool LogViewSortFilterProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const { QVariant leftData = sourceModel()->data(left); QVariant rightData = sourceModel()->data(right); QString leftString = leftData.toString(); QString rightString = rightData.toString(); //qDebug() << "LogViewSortFilterProxyModel::lessThan (leftString): " << leftString << endl; //qDebug() << "LogViewSortFilterProxyModel::lessThan (rightString): " << rightString << endl; QDateTime leftDT = QDateTime::fromString((sourceModel()->data(left.siblingAtColumn(1))).toString() + (sourceModel()->data(left.siblingAtColumn(2))).toString(), "yyyy/MM/ddHH:mm:ss"); QDateTime rightDT = QDateTime::fromString((sourceModel()->data(right.siblingAtColumn(1))).toString() + (sourceModel()->data(right.siblingAtColumn(2))).toString(), "yyyy/MM/ddHH:mm:ss"); //qDebug() << "LogViewSortFilterProxyModel::lessThan - DateTime: " << leftDT.toString("yyyy-MM-dd / hh:mm:ss") << endl; //qDebug() << "LogViewSortFilterProxyModel::lessThan - Columns: " << (sourceModel()->data(left.siblingAtColumn(2))).toString() << endl; /* * if (leftData.type() == QVariant::String) { //qDebug() << "LogViewSortFilterProxyModel::lessThan - QString" << endl; } */ //qDebug() << "LogViewSortFilterProxyModel::lessThan - Left column: " << QString::number(left.column())<< endl; //qDebug() << "LogViewSortFilterProxyModel::lessThan - Right column: " << QString::number(right.column())<< endl; //qDebug() << "LogViewSortFilterProxyModel::lessThan - date: " << leftDT.toString("yyyy-MM-dd--hh:mm:ss") <<"<==>" << rightDT.toString("yyyy-MM-dd--hh:mm:ss") << endl; if (left.column() == 1) { //qDebug() << "LogViewSortFilterProxyModel::lessThan - left: " << (sourceModel()->data(left.siblingAtColumn(1))).toString() << endl; //QDate leftD = QDate::fromString((sourceModel()->data(left.siblingAtColumn(1))).toString(), "yyyy/MM/dd"); //QDate rightD = QDate::fromString((sourceModel()->data(right.siblingAtColumn(1))).toString(), "yyyy/MM/dd"); if (leftDT.date() == rightDT.date()) { //qDebug() << "LogViewSortFilterProxyModel::lessThan - SAME" << endl; if (leftDT.time() < rightDT.time()) { //qDebug() << "LogViewSortFilterProxyModel::lessThan - SAME - (time) TRUE - Left" << endl; } else { //qDebug() << "LogViewSortFilterProxyModel::lessThan - SAME - (time) FALSE - Right" << endl; } return QString::localeAwareCompare(leftDT.toString("hh:mm:ss"), rightDT.toString("hh:mm:ss")) < 0; //return leftDT.time() < rightDT.time(); } else { //qDebug() << "LogViewSortFilterProxyModel::lessThan - DIFFERENT: " << endl; //return leftD < rightD; if (leftDT.date() < rightDT.date()) { //qDebug() << "LogViewSortFilterProxyModel::lessThan - DIFFERENT - (date) TRUE - Left" << endl; } else { //qDebug() << "LogViewSortFilterProxyModel::lessThan - DIFFERENT - (date) FALSE - Right" << endl; } //return leftDT.date() < rightDT.date(); return QString::localeAwareCompare(leftString, rightString) < 0; } } else { //return leftData < rightData; //qDebug() << "LogViewSortFilterProxyModel::lessThan - No column 1: " << leftString << " / " << rightString << endl; return QString::localeAwareCompare(leftString, rightString) < 0; } /* if (rightData.type() == QVariant::DateTime) { //if (rightData.type() == QVariant::Time) { //qDebug() << "LogViewSortFilterProxyModel::lessThan - 1" << endl; return leftData.toDateTime() < rightData.toDateTime(); } else { QString leftString = leftData.toString(); QString rightString = rightData.toString(); if (left.column() == 1) { //qDebug() << "LogViewSortFilterProxyModel::lessThan - left Column == 1" << endl; //qDebug() << "LogViewSortFilterProxyModel::lessThan - leftData/rightData: " << leftString<< "/" << rightString << endl; if (leftD == rightD) { //qDebug() << "LogViewSortFilterProxyModel::lessThan - leftData == rightData: " << leftString<< "/" << rightString << endl; QString leftN = (sourceModel()->data(left.siblingAtColumn(2))).toString(); QString rightN = (sourceModel()->data(right.siblingAtColumn(2))).toString(); QTime lT = QTime::fromString(leftN, "hh:mm:ss"); QTime rT = QTime::fromString(rightN, "hh:mm:ss"); return lT < rT; } else { //qDebug() << "LogViewSortFilterProxyModel::lessThan - left != right" << endl; //qDebug() << "LogViewSortFilterProxyModel::lessThan - leftData != rightData: " << leftString<< "/" << rightString << endl; return leftD < rightD; } } //qDebug() << "LogViewSortFilterProxyModel::lessThan - 2: " << leftString << "/" << rightString << endl; return QDate::fromString(leftString, "yyyy/MM/dd") < QDate::fromString(rightString, "yyyy/MM/dd"); //return QString::localeAwareCompare(leftString, rightString) < 0; } */ } klog-2.3.3/updatesettings.h0000644000015700001710000000433014542412415015551 0ustar jenkinsjenkins#ifndef KLOG_UPDATESETTINGS_H #define KLOG_UPDATESETTINGS_H /*************************************************************************** updatesettings.h - description ------------------- begin : mar 2023 copyright : (C) 2023 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include //#include //#include //#include #include "utilities.h" #include "locator.h" class UpdateSettings : public QObject { Q_OBJECT public: UpdateSettings(); ~UpdateSettings(); bool updateFile(); private: bool processConfigLine(const QString &_line); bool findInFile(); bool renameFile(const QString &_oldName, const QString &_newName); }; #endif // UPDATESETTINGS_H klog-2.3.3/softwareupdate.h0000644000015700001710000000671314542412415015552 0ustar jenkinsjenkins#ifndef KLOG_SOFTWAREUPDATE_H #define KLOG_SOFTWAREUPDATE_H /*************************************************************************** softwareupdate.h - description ------------------- begin : feb 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include #include #include #include "utilities.h" #include "softwareupdatedialog.h" class QSslError; class SoftwareUpdate: public QObject { Q_OBJECT public: SoftwareUpdate(const QString &_klogVersion); ~SoftwareUpdate(); void addCall(const QString &_call); void needToUpdate(bool _showWithoutVersion=false); void setVersion(const QString &_klogVersion); private slots: void slotReadyRead(); //void slotError(int _p); //void slotSslErrors(QList _p); //void replyFinished(QNetworkReply *data); void slotDownloadFinished(QNetworkReply *reply); signals: void updateNeededSignal(const bool _q); // Will be TRUE if updated if needed and FALSE if we already have the latest version private: void connectToURL(const QString &_url); bool checkUpdates(QIODevice *data); void updateNeeded(const QString &_newVer); //void setTheURL(QString _url); void setHeader(); void findOS(const int _os); QString findMatch(QRegularExpression rx, const QString & fileExtension, const QStringList &data); Utilities *util; QString klogVersion, latestVersion, callsign; QString urld; QString OSString; int OSVersion; QUrl *url; //QNetworkAccessManager *manager; QNetworkRequest request; SoftwareUpdateDialog *updateDialog; //int result; //bool toUpdate; bool repositoryFound; // True when the versions have been checked to prevent multiple qmessagebox due to redirections bool messageShown; }; #endif // SOFTWAREUPDATE_H klog-2.3.3/downloadcty.h0000644000015700001710000000602514542412415015040 0ustar jenkinsjenkins#ifndef KLOG_DOWNLOADCTY_H #define KLOG_DOWNLOADCTY_H /*************************************************************************** downloadcty.h - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include "utilities.h" class QSslError; class DownLoadCTY : public QObject { Q_OBJECT public: explicit DownLoadCTY(const QString &_klogDir, const QString &_klogVersion); ~DownLoadCTY(); int download(); private: Utilities *util; //void setTarget(const QString& t); bool saveToDisk(const QString &filename, QIODevice *data); QString saveFileName(const QUrl &url); QNetworkAccessManager *manager; QNetworkRequest *request; //QString target; int result; // enum QNetworkReply::NetworkError QString klogDir; QString urld; QUrl *url; private slots: void slotDownloadFinished(QNetworkReply* reply); void slotDownloadProgress(qint64 received, qint64 total); void slotErrorManagement(QNetworkReply::NetworkError networkError); signals: void actionReturnDownload(const int _i); void done(bool _success); void actionShowProgres(qint64 received, qint64 total); void actionError(const int _i); void downloadStopped(); }; #endif // DOWNLOADCTY_H klog-2.3.3/charts/0000755000015700001710000000000014542412415013621 5ustar jenkinsjenkinsklog-2.3.3/charts/statsqsosperbandbarchartwidget.h0000644000015700001710000000466214542412415022315 0ustar jenkinsjenkins#ifndef KLOG_CHARTS_STATSQSOSPERBANDBARCHARTWIDGET_H #define KLOG_CHARTS_STATSQSOSPERBANDBARCHARTWIDGET_H /*************************************************************************** statsqsosperbandbarchatwidget.h - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "../dataproxy_sqlite.h" #include "../charts/statsgeneralchartwidget.h" class StatsQSOsPerBandBarChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsQSOsPerBandBarChartWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~StatsQSOsPerBandBarChartWidget(); void prepareChart(const int _log=-1); signals: public slots: private: void createUI(); DataProxy_SQLite *dataProxy; //QChart *chart; QChartView *chartView; }; #endif // QSOSPERBANDBARCHARTWIDGET_H klog-2.3.3/charts/statsqsospercontinentbarchartwidget.h0000644000015700001710000000472014542412415023405 0ustar jenkinsjenkins#ifndef KLOG_CHARTS_STATSQSOSPERCONTINENTBARCHARTWIDGET_H #define KLOG_CHARTS_STATSQSOSPERCONTINENTBARCHARTWIDGET_H /*************************************************************************** statsqsospercontinentbarchatwidget.h - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "../dataproxy_sqlite.h" #include "../charts/statsgeneralchartwidget.h" class StatsQSOsPerContinentBarChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsQSOsPerContinentBarChartWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~StatsQSOsPerContinentBarChartWidget(); void prepareChart(const int _log=-1); signals: public slots: private: void createUI(); DataProxy_SQLite *dataProxy; //QChart *chart; QChartView *chartView; }; #endif // QSOSPERBANDBARCHARTWIDGET_H klog-2.3.3/charts/statsentitiesperyearbarchartwidget.h0000644000015700001710000000471114542412415023203 0ustar jenkinsjenkins#ifndef KLOG_CHARTS_STATSENTITIESPERYEARBARCHARTWIDGET_H #define KLOG_CHARTS_STATSENTITIESPERYEARBARCHARTWIDGET_H /*************************************************************************** statsentitiesperyearbarchatwidget.h - description ------------------- begin : oct 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "../dataproxy_sqlite.h" #include "../charts/statsgeneralchartwidget.h" class StatsEntitiesPerYearBarChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsEntitiesPerYearBarChartWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~StatsEntitiesPerYearBarChartWidget(); void prepareChart(const int _log=-1); signals: public slots: private: void createUI(); DataProxy_SQLite *dataProxy; //QChart *chart; QChartView *chartView; }; #endif // QSOSPERYEARBARCHARTWIDGET_H klog-2.3.3/charts/statsgeneralchartwidget.h0000644000015700001710000000430114542412415020712 0ustar jenkinsjenkins#ifndef KLOG_CHARTS_STATSGENERALCHARTWIDGET_H #define KLOG_CHARTS_STATSGENERALCHARTWIDGET_H /*************************************************************************** statsgeneralchartwidget.h - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include "../dataproxy_sqlite.h" class StatsGeneralChartWidget : public QWidget { Q_OBJECT public: StatsGeneralChartWidget(); StatsGeneralChartWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); virtual void prepareChart(const int _log=-1); private: virtual void createUI(); }; #endif // GENERALCHARTWIDGET_H klog-2.3.3/charts/statsworkedsentpiechartwidget.h0000644000015700001710000000465414542412415022173 0ustar jenkinsjenkins#ifndef KLOG_CHARTS_STATSWORKEDSENTPIECHARTWIDGET_H #define KLOG_CHARTS_STATSWORKEDSENTPIECHARTWIDGET_H /*************************************************************************** statsworkedsentpiechatwidget.h - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "../dataproxy_sqlite.h" #include "../charts/statsgeneralchartwidget.h" class StatsWorkedSentPieChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsWorkedSentPieChartWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~StatsWorkedSentPieChartWidget(); void prepareChart(const int _log=-1); signals: public slots: private: void createUI(); DataProxy_SQLite *dataProxy; //QChart *chart; QChartView *chartView; }; #endif // QSOSPERBANDBARCHARTWIDGET_H klog-2.3.3/charts/statsgridsonsatswidget.cpp0000644000015700001710000001645214542412415021160 0ustar jenkinsjenkins/*************************************************************************** statsgridsonsatswidget.cpp - description ------------------- begin : dec 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "statsgridsonsatswidget.h" StatsGridsOnSatsWidget::StatsGridsOnSatsWidget(DataProxy_SQLite *dp, QWidget *parent) { Q_UNUSED(parent); #ifdef QT_DEBUG //qDebug() << "StatsGridsOnSatsWidget::StatsGridsOnSatsWidget: "; #else #endif dataProxy = dp; util = new Utilities(Q_FUNC_INFO); confirmedOnlyCheckBox = new QCheckBox; onlyLEOSatCheckBox = new QCheckBox; numberLabel = new QLabel; log = -1; createUI(); //prepareChart(); } StatsGridsOnSatsWidget::~StatsGridsOnSatsWidget() { delete(util); delete(dataProxy); } void StatsGridsOnSatsWidget::createUI() { confirmedOnlyCheckBox->setText(tr("Show confirmed only")); confirmedOnlyCheckBox->setChecked(false); onlyLEOSatCheckBox->setText(tr("Only LEO sats", "LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure.")); onlyLEOSatCheckBox->setChecked(false); tableWidget = new QTableWidget(this); tableWidget->setRowCount(0); tableWidget->setColumnCount(7); tableWidget->resizeRowsToContents(); //tableWidget->sortByColumn(4, Qt::AscendingOrder); //void QTableWidget::sortItems(int column, Qt::SortOrder order = Qt::AscendingOrder) tableWidget->horizontalHeader()->setStretchLastSection(true); QLabel *textLabel = new QLabel; textLabel->setText(tr("Number")); textLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter); numberLabel->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); numberLabel->setText(QString::number(0)); QHBoxLayout *labelLayout = new QHBoxLayout; labelLayout->addWidget(textLabel); labelLayout->addWidget(numberLabel); QHBoxLayout *checksLayout = new QHBoxLayout; checksLayout->addWidget(confirmedOnlyCheckBox); checksLayout->addWidget(onlyLEOSatCheckBox); checksLayout->addLayout(labelLayout); QVBoxLayout *layout = new QVBoxLayout; layout->addLayout(checksLayout); layout->addWidget(tableWidget); setLayout(layout); connect(confirmedOnlyCheckBox, SIGNAL(clicked()), this, SLOT(slotConfirmedClicked() ) ); connect(onlyLEOSatCheckBox, SIGNAL(clicked()), this, SLOT(slotConfirmedClicked() ) ); } void StatsGridsOnSatsWidget::prepareChart(const int _log) { //qDebug() << Q_FUNC_INFO << "Log = " << QString::number(_log); while(tableWidget->rowCount()>0) { tableWidget->removeRow(tableWidget->rowCount()-1); } log = _log; QList _qsos; _qsos.clear(); _qsos << dataProxy->getSatGridStats(log); tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem(tr("Callsign"))); tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem(tr("Date"))); tableWidget->setHorizontalHeaderItem(2, new QTableWidgetItem(tr("Band"))); tableWidget->setHorizontalHeaderItem(3, new QTableWidgetItem(tr("Mode"))); tableWidget->setHorizontalHeaderItem(4, new QTableWidgetItem(tr("Grid"))); tableWidget->setHorizontalHeaderItem(5, new QTableWidgetItem(tr("Satellite"))); tableWidget->setHorizontalHeaderItem(6, new QTableWidgetItem(tr("Confirmed"))); tableWidget->setStyleSheet("QHeaderView::section { background-color:cornflowerblue }"); //qDebug() << "StatsGridsOnSatsWidget::prepareChart: QSOs: " << QString::number(_qsos.length()); int number = 0; QStringList grids; grids.clear(); if (_qsos.length()>0) { for (int i = 0; i<_qsos.length(); i++) { bool confirmed = false; bool printThisOne = true; QString satName = _qsos.at(i)->getSatName(); QString qslStatus = QString(); if (_qsos.at(i)->getLoTWQSL_RCVD() == "Y") { qslStatus = "LoTW"; confirmed = true; } else if (_qsos.at(i)->getQSL_RCVD() == "Y") { qslStatus = "QSL"; confirmed = true; } else { qslStatus = QString(tr("No")); confirmed = false; } if (confirmedOnlyCheckBox->isChecked() && !confirmed) { printThisOne = false; } if ((onlyLEOSatCheckBox->isChecked()) && (satName == "QO-100") ) { printThisOne = false; } if (grids.contains((_qsos.at(i)->getGridSquare()).left(4))) { printThisOne = false; } if (printThisOne) { grids.append((_qsos.at(i)->getGridSquare()).left(4)); number++; tableWidget->insertRow(tableWidget->rowCount()); tableWidget->setItem(tableWidget->rowCount()-1, 0, new QTableWidgetItem((_qsos.at(i)->getCall())) ); tableWidget->setItem(tableWidget->rowCount()-1, 1, new QTableWidgetItem( util->getDateSQLiteStringFromDate(_qsos.at(i)->getDate()) ) ); tableWidget->setItem(tableWidget->rowCount()-1, 2, new QTableWidgetItem((_qsos.at(i)->getBand())) ); tableWidget->setItem(tableWidget->rowCount()-1, 3, new QTableWidgetItem((_qsos.at(i)->getMode())) ); tableWidget->setItem(tableWidget->rowCount()-1, 4, new QTableWidgetItem((_qsos.at(i)->getGridSquare()).left(4)) ); tableWidget->setItem(tableWidget->rowCount()-1, 5, new QTableWidgetItem(satName)); tableWidget->setItem(tableWidget->rowCount()-1, 6, new QTableWidgetItem(qslStatus) ); } } numberLabel->setText(QString::number(number)); } tableWidget->sortItems(4, Qt::AscendingOrder); } void StatsGridsOnSatsWidget::slotConfirmedClicked() { prepareChart(log); } klog-2.3.3/charts/statsqsospercontinentbarchartwidget.cpp0000644000015700001710000001127114542412415023737 0ustar jenkinsjenkins/*************************************************************************** statsqsospercontinentbarchatwidget.cpp - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "statsqsospercontinentbarchartwidget.h" StatsQSOsPerContinentBarChartWidget::StatsQSOsPerContinentBarChartWidget(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "StatsQSOsPerContinentBarChartWidget::StatsQSOsPerContinentBarChartWidget"; Q_UNUSED(parent); dataProxy = dp; chartView = new QChartView(); createUI(); //prepareChart(); } StatsQSOsPerContinentBarChartWidget::~StatsQSOsPerContinentBarChartWidget() { delete(dataProxy); } void StatsQSOsPerContinentBarChartWidget::createUI() { chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsQSOsPerContinentBarChartWidget::prepareChart(const int _log) { QChart *chart = new QChart(); chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); QString categoriesTitle; QString categoriesElem; QStringList categories; QBarSeries *series = new QBarSeries(); QBarCategoryAxis *axis = new QBarCategoryAxis(); QString aux; //int numberPerX = 0; chart->removeAllSeries(); categoriesTitle = QString(); categoriesElem = QString(); categories.clear(); axis->clear(); series->clear(); QBarSet *set0 = new QBarSet(tr("QSOs per continent")); //*set0->remove(0, set0->count()-1); qreal sum = 0; QProgressDialog progress(tr("Reading data ... "), tr("Abort reading"), 0, categories.count(), this); progress.setWindowModality(Qt::WindowModal); QStringList continents; continents.clear(); continents << dataProxy->getContinentShortNames(); categories.append(continents); categoriesElem = tr("Continents"); categoriesTitle = tr("QSOs per continent"); aux.clear(); for (int i = 0; i < categories.count(); i++ ) { *set0 << dataProxy->getQSOsWithContinent(categories.at(i), _log); //qDebug() << "BarChartStats::prepareChart SelectedGrapth-7: QSO/hour: " << categories.at(i) << " - " << QString::number(numberPerX); //numberPerX; //numberPerX = 0; aux = tr("Reading data ...") + "\n" + tr("Hours: ") + QString::number(i) + "/" + QString::number(categories.count()); progress.setLabelText(aux); progress.setValue(i); if ( progress.wasCanceled() ) { i = categories.count(); } //qDebug() << "BarChartStats::prepareChart CQz: " << QString::number((categories.at(i)).toInt()) << "/" << QString::number(numberPerX); } sum = set0->sum(); set0->setLabel(QString::number(sum)); series->append(set0); set0->setLabel(categoriesElem); chart->addSeries(series); chart->setTitle(categoriesTitle); axis->append(categories); //chart->createDefaultAxes(); //series->attachAxis(axis); chart->addAxis(axis, Qt::AlignBottom); chartView->setChart (chart); } klog-2.3.3/charts/statscqzperyearbarchartwidget.h0000644000015700001710000000464514542412415022162 0ustar jenkinsjenkins#ifndef KLOG_CHARTS_STATSCQZSPERYEARBARCHARTWIDGET_H #define KLOG_CHARTS_STATSCQZSPERYEARBARCHARTWIDGET_H /*************************************************************************** statscqzperyearbarchatwidget.h - description ------------------- begin : oct 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "../dataproxy_sqlite.h" #include "statsgeneralchartwidget.h" class StatsCQZPerYearBarChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsCQZPerYearBarChartWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~StatsCQZPerYearBarChartWidget(); void prepareChart(const int _log=-1); signals: public slots: private: void createUI(); DataProxy_SQLite *dataProxy; //QChart *chart; QChartView *chartView; }; #endif // QSOSPERYEARBARCHARTWIDGET_H klog-2.3.3/charts/statsworkedsentpiechartwidget.cpp0000644000015700001710000000727114542412415022524 0ustar jenkinsjenkins/*************************************************************************** statsworkedsentpiechatwidget.cpp - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "statsworkedsentpiechartwidget.h" StatsWorkedSentPieChartWidget::StatsWorkedSentPieChartWidget(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "StatsWorkedSentPieChartWidget::StatsWorkedSentPieChartWidget"; Q_UNUSED(parent); dataProxy = dp; //chart = new QChart(); chartView = new QChartView(); createUI(); //prepareChart(); } StatsWorkedSentPieChartWidget::~StatsWorkedSentPieChartWidget() { delete(dataProxy); } void StatsWorkedSentPieChartWidget::createUI() { chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsWorkedSentPieChartWidget::prepareChart(const int _log) { QChart *chart = new QChart(); chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); QPieSeries *series = new QPieSeries(); //PieSlice append(string label, real value) int qsos = dataProxy->getHowManyQSOInLog(_log); int confirmed = dataProxy->getHowManyQSLSentInLog(_log); //qDebug() << "QSOs: " << QString::number(qsos); //qDebug() << "Confirmed: " << QString::number(confirmed); //qDebug() << "Worked: " << QString::number(qsos - confirmed); series->append(tr("Worked - %1").arg(qsos), qsos); series->append(tr("Sent - %2").arg(confirmed), confirmed); QPieSlice *slice = series->slices().at(1); slice->setExploded(); slice->setLabelVisible(); slice->setPen(QPen(Qt::darkGreen, 2)); slice->setBrush(Qt::green); QPieSlice *slice1 = series->slices().at(0); slice1->setExploded(); slice1->setLabelVisible(); slice1->setPen(QPen(Qt::blue, 2)); slice1->setBrush(Qt::blue); chart->addSeries(series); chart->setTitle(tr("Worked / Sent status")); chart->legend()->hide(); chartView->setRenderHint(QPainter::Antialiasing); chartView->setChart (chart); } klog-2.3.3/charts/statsqsosperyearbarchartwidget.h0000644000015700001710000000466214542412415022351 0ustar jenkinsjenkins#ifndef KLOG_CHARTS_STATSQSOSPERYEARBARCHARTWIDGET_H #define KLOG_CHARTS_STATSQSOSPERYEARBARCHARTWIDGET_H /*************************************************************************** statsqsosperyearbarchatwidget.h - description ------------------- begin : oct 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "../dataproxy_sqlite.h" #include "../charts/statsgeneralchartwidget.h" class StatsQSOsPerYearBarChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsQSOsPerYearBarChartWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~StatsQSOsPerYearBarChartWidget(); void prepareChart(const int _log=-1); signals: public slots: private: void createUI(); DataProxy_SQLite *dataProxy; //QChart *chart; QChartView *chartView; }; #endif // QSOSPERYEARBARCHARTWIDGET_H klog-2.3.3/charts/statsfieldperbandwidget.h0000644000015700001710000000527214542412415020702 0ustar jenkinsjenkins#ifndef KLOG_CHARTS_STATSFIELDPERBANDWIDGET_H #define KLOG_CHARTS_STATSFIELDPERBANDWIDGET_H /*************************************************************************** statsfieldperbandwidget.h - description ------------------- begin : jul 2021 copyright : (C) 2021 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include #include "../dataproxy_sqlite.h" #include "../qso.h" #include "../utilities.h" #include "../charts/statsgeneralchartwidget.h" #include "../klogdefinitions.h" class StatsFieldPerBandWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsFieldPerBandWidget(DataProxy_SQLite *dp, ValidFieldsForStats _field, QWidget *parent = nullptr); ~StatsFieldPerBandWidget(); void prepareChart(const int _log=-1); signals: private slots: void slotConfirmedClicked(); void slotModeComboBoxChanged(); private: void createUI(); DataProxy_SQLite *dataProxy; QTableWidget *tableWidget; Utilities *util; ValidFieldsForStats selectedField; QComboBox *modeComboBox; QString modeInUse; int log; }; #endif // STATSFIELDPERBANDWIDGET_H klog-2.3.3/charts/statsqsosperyearbarchartwidget.cpp0000644000015700001710000001067214542412415022702 0ustar jenkinsjenkins/*************************************************************************** statsqsosperyearbarchatwidget.cpp - description ------------------- begin : oct 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "statsqsosperyearbarchartwidget.h" StatsQSOsPerYearBarChartWidget::StatsQSOsPerYearBarChartWidget(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "StatsQSOsPerYearBarChartWidget::StatsQSOsPerYearBarChartWidget"; Q_UNUSED(parent); dataProxy = dp; //chart = new QChart(); chartView = new QChartView(); createUI(); //prepareChart(); } StatsQSOsPerYearBarChartWidget::~StatsQSOsPerYearBarChartWidget() { delete(dataProxy); } void StatsQSOsPerYearBarChartWidget::createUI() { chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsQSOsPerYearBarChartWidget::prepareChart(const int _log) { QChart *chart = new QChart(); chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); QString categoriesElem = tr("QSOs"); QString categoriesTitle = tr("QSOs per year"); QStringList categories; QBarSeries *series = new QBarSeries(); QBarCategoryAxis *axis = new QBarCategoryAxis(); QString aux = QString(); //int numberPerX= 0; //chart->removeAllSeries(); categories.clear(); axis->clear(); series->clear(); QBarSet *set0 = new QBarSet(tr("QSOs")); //*set0->remove(0, set0->count()-1); qreal sum = 0; QProgressDialog progress(tr("Reading data ... "), tr("Abort reading"), 0, categories.count(), this); progress.setWindowModality(Qt::WindowModal); categories.append(dataProxy->getOperatingYears(_log)); for (int i = 0; i < categories.count();i++ ) { int numberPerX = dataProxy->getQSOonYear((categories.at(i)).toInt(), _log); //qDebug() << categories.at(i) + "-" + QString::number(numberPerX); *set0 << numberPerX; //numberPerX = 0; //qDebug() << "StatsQSOsPerYearBarChartWidget::prepareChart QSOs: " << QString::number((categories.at(i)).toInt()) << "/" << QString::number(numberPerX); aux = tr("Reading data ...") + "\n" + tr("QSO: %1/%2").arg(QString::number(i), QString::number(categories.count())); progress.setLabelText(aux); progress.setValue(i); if ( progress.wasCanceled() ) { i = categories.count(); } } sum = set0->sum(); set0->setLabel(QString::number(sum)); series->append(set0); set0->setLabel(categoriesElem); chart->addSeries(series); chart->setTitle(categoriesTitle); axis->append(categories); //chart->createDefaultAxes(); //series->attachAxis(axis); chart->addAxis(axis, Qt::AlignBottom); chartView->setChart (chart); //chart->setAxisX(axis, series); } klog-2.3.3/charts/statsqsospermodebarchartwidget.h0000644000015700001710000000466214542412415022335 0ustar jenkinsjenkins#ifndef KLOG_CHARTS_STATSQSOSPERMODEBARCHARTWIDGET_H #define KLOG_CHARTS_STATSQSOSPERMODEBARCHARTWIDGET_H /*************************************************************************** statsqsospermodebarchatwidget.h - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "../dataproxy_sqlite.h" #include "../charts/statsgeneralchartwidget.h" class StatsQSOsPerModeBarChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsQSOsPerModeBarChartWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~StatsQSOsPerModeBarChartWidget(); void prepareChart(const int _log=-1); signals: public slots: private: void createUI(); DataProxy_SQLite *dataProxy; //QChart *chart; QChartView *chartView; }; #endif // QSOSPERMODEBARCHARTWIDGET_H klog-2.3.3/charts/statsqsosperhourbarchartwidget.h0000644000015700001710000000466214542412415022366 0ustar jenkinsjenkins#ifndef KLOG_CHARTS_STATSQSOSPERHOURBARCHARTWIDGET_H #define KLOG_CHARTS_STATSQSOSPERHOURBARCHARTWIDGET_H /*************************************************************************** statsqsosperhourbarchatwidget.h - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "../dataproxy_sqlite.h" #include "../charts/statsgeneralchartwidget.h" class StatsQSOsPerHourBarChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsQSOsPerHourBarChartWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~StatsQSOsPerHourBarChartWidget(); void prepareChart(const int _log=-1); signals: public slots: private: void createUI(); DataProxy_SQLite *dataProxy; //QChart *chart; QChartView *chartView; }; #endif // QSOSPERBANDBARCHARTWIDGET_H klog-2.3.3/charts/statsfieldperbandwidget.cpp0000644000015700001710000001432114542412415021230 0ustar jenkinsjenkins/*************************************************************************** statsfieldperbandwidget.cpp - description ------------------- begin : jul 2021 copyright : (C) 2021 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "statsfieldperbandwidget.h" StatsFieldPerBandWidget::StatsFieldPerBandWidget(DataProxy_SQLite *dp, ValidFieldsForStats _field, QWidget *parent) { //qDebug() << "StatsFieldPerBandWidget::StatsFieldPerBandWidget"; Q_UNUSED(parent); dataProxy = dp; util = new Utilities(Q_FUNC_INFO); selectedField = _field; modeComboBox = new QComboBox; createUI(); //prepareChart(); } StatsFieldPerBandWidget::~StatsFieldPerBandWidget() { delete(util); delete(dataProxy); } void StatsFieldPerBandWidget::createUI() { modeInUse = "ALL"; log = -1; QString allString = tr("All"); modeComboBox->clear (); modeComboBox->addItem (allString); modeComboBox->addItems (dataProxy->getModesInLog (-1)); dataProxy->getModesInLog (-1); tableWidget = new QTableWidget(this); tableWidget->setRowCount(0); tableWidget->setColumnCount(3); tableWidget->resizeRowsToContents(); tableWidget->sortByColumn(0, Qt::AscendingOrder); tableWidget->horizontalHeader()->setStretchLastSection(true); QLabel *textLabel = new QLabel; textLabel->setText(tr("Mode: ")); textLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter); QHBoxLayout *labelLayout = new QHBoxLayout; labelLayout->addWidget(textLabel); labelLayout->addWidget(modeComboBox); QVBoxLayout *layout = new QVBoxLayout; layout->addLayout(labelLayout); layout->addWidget(tableWidget); setLayout(layout); connect(modeComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(slotModeComboBoxChanged() ) ) ; } void StatsFieldPerBandWidget::prepareChart(const int _log) { //qDebug() << Q_FUNC_INFO << "Log = " << QString::number(_log); while(tableWidget->rowCount()>0) { tableWidget->removeRow(tableWidget->rowCount()-1); } log = _log; tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem(tr("Band"))); tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem(tr("Worked"))); tableWidget->setHorizontalHeaderItem(2, new QTableWidgetItem(tr("Confirmed"))); tableWidget->setStyleSheet("QHeaderView::section { background-color:cornflowerblue }"); QStringList bands; bands << dataProxy->getBandsInLog (_log); QString aux; int gridsCount; foreach (aux, bands) { tableWidget->insertRow(tableWidget->rowCount()); tableWidget->setItem(tableWidget->rowCount()-1, 0, new QTableWidgetItem((aux)) ); QTableWidgetItem *item = tableWidget->item (tableWidget->rowCount()-1, 0); item->setTextAlignment( Qt::AlignCenter ); gridsCount = dataProxy->getFieldInBand (selectedField, aux, false, modeInUse, _log); tableWidget->setItem(tableWidget->rowCount()-1, 1, new QTableWidgetItem(QString::number(gridsCount)) ); item = tableWidget->item (tableWidget->rowCount()-1, 1); item->setTextAlignment( Qt::AlignCenter ); gridsCount = dataProxy->getFieldInBand (selectedField, aux, true, modeInUse, _log); tableWidget->setItem(tableWidget->rowCount()-1, 2, new QTableWidgetItem(QString::number(gridsCount)) ); item = tableWidget->item (tableWidget->rowCount()-1, 2); item->setTextAlignment( Qt::AlignCenter ); } // Now we add the "All" row. tableWidget->insertRow(tableWidget->rowCount()); tableWidget->setItem(tableWidget->rowCount()-1, 0, new QTableWidgetItem(tr("All")) ); QTableWidgetItem *item = tableWidget->item (tableWidget->rowCount()-1, 0); item->setTextAlignment( Qt::AlignCenter ); gridsCount = dataProxy->getFieldInBand (selectedField, "ALL", false, modeInUse, _log); tableWidget->setItem(tableWidget->rowCount()-1, 1, new QTableWidgetItem(QString::number(gridsCount)) ); item = tableWidget->item (tableWidget->rowCount()-1, 1); item->setTextAlignment( Qt::AlignCenter ); gridsCount = dataProxy->getFieldInBand (selectedField, "ALL", true, modeInUse, _log); tableWidget->setItem(tableWidget->rowCount()-1, 2, new QTableWidgetItem(QString::number(gridsCount)) ); item = tableWidget->item (tableWidget->rowCount()-1, 2); item->setTextAlignment( Qt::AlignCenter ); } void StatsFieldPerBandWidget::slotConfirmedClicked() { prepareChart(log); } void StatsFieldPerBandWidget::slotModeComboBoxChanged() { //qDebug() << Q_FUNC_INFO << ": " << modeComboBox->currentText() << "/" << QString::number(modeComboBox->currentIndex ()); if (modeComboBox->currentIndex ()==0) { modeInUse = "ALL"; } else { modeInUse = modeComboBox->currentText (); } prepareChart (log); } klog-2.3.3/charts/statsqsospermodebarchartwidget.cpp0000644000015700001710000001141414542412415022661 0ustar jenkinsjenkins/*************************************************************************** statsqsospermodebarchatwidget.cpp - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "statsqsospermodebarchartwidget.h" StatsQSOsPerModeBarChartWidget::StatsQSOsPerModeBarChartWidget(DataProxy_SQLite *dp, QWidget *parent) { Q_UNUSED(parent); #ifdef QT_DEBUG //qDebug() << "StatsQSOsPerModeBarChartWidget::StatsQSOsPerModeBarChartWidget"; #else #endif dataProxy = dp; //chart = new QChart(); chartView = new QChartView(); createUI(); //prepareChart(); } StatsQSOsPerModeBarChartWidget::~StatsQSOsPerModeBarChartWidget() { delete(dataProxy); } void StatsQSOsPerModeBarChartWidget::createUI() { chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsQSOsPerModeBarChartWidget::prepareChart(const int _log) { QChart *chart = new QChart(); chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); QString categoriesTitle; QString categoriesElem; QStringList categories; QBarSeries *series = new QBarSeries(); QBarCategoryAxis *axis = new QBarCategoryAxis(); QString aux; //int numberPerX = 0; chart->removeAllSeries(); //categoriesTitle = QString(); //categoriesElem = QString(); categories.clear(); axis->clear(); series->clear(); QBarSet *set0 = new QBarSet(tr("QSOs per mode")); //*set0->remove(0, set0->count()-1); qreal sum = 0; QProgressDialog progress(tr("Reading data ... "), tr("Abort reading"), 0, categories.count(), this); progress.setWindowModality(Qt::WindowModal); //qDebug() << "StatsQSOsPerModeBarChartWidget::prepareChart: SelectedGrapth-1: MODES "; categories.append(dataProxy->getModesInLog(_log)); categoriesElem = tr("Modes"); categoriesTitle = tr("QSOs per mode distribution"); aux.clear(); for (int i = 0; i < categories.count();i++ ) { *set0 << dataProxy->getQSOsInMode((categories.at(i)), _log); //qDebug() << categories.at(i) + "-" + QString::number(numberPerX); //*set0 << numberPerX; //numberPerX = 0; //qDebug() << "StatsQSOsPerModeBarChartWidget::prepareChart QSOs: " << QString::number((categories.at(i)).toInt()) << "/" << QString::number(numberPerX); aux = tr("Reading data ...") + "\n" + tr("Modes: ") + QString::number(i) + "/" + QString::number(categories.count()); //aux = tr("Reading data ...") + "\n" + tr("Modes: %1/%2").arg(QString::number(i)).arg(QString::number(categories.count())); progress.setLabelText(aux); progress.setValue(i); if ( progress.wasCanceled() ) { i = categories.count(); } } sum = set0->sum(); set0->setLabel(QString::number(sum)); series->append(set0); set0->setLabel(categoriesElem); chart->addSeries(series); chart->setTitle(categoriesTitle); axis->append(categories); //chart->createDefaultAxes(); //series->attachAxis(axis); chart->addAxis(axis, Qt::AlignBottom); chartView->setChart (chart); } klog-2.3.3/charts/statsentitiesperyearbarchartwidget.cpp0000644000015700001710000001133414542412415023535 0ustar jenkinsjenkins/*************************************************************************** statsentitiesperyearbarchatwidget.cpp - description ------------------- begin : oct 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "statsentitiesperyearbarchartwidget.h" StatsEntitiesPerYearBarChartWidget::StatsEntitiesPerYearBarChartWidget(DataProxy_SQLite *dp, QWidget *parent) { Q_UNUSED(parent); #ifdef QT_DEBUG //qDebug() << "StatsEntitiesPerYearBarChartWidget::StatsEntitiesPerYearBarChartWidget"; #else #endif dataProxy = dp; //chart = new QChart(); chartView = new QChartView(); createUI(); //prepareChart(); } StatsEntitiesPerYearBarChartWidget::~StatsEntitiesPerYearBarChartWidget() { delete(dataProxy); } void StatsEntitiesPerYearBarChartWidget::createUI() { chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsEntitiesPerYearBarChartWidget::prepareChart(const int _log) { QChart *chart = new QChart(); chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); QString categoriesTitle; QString categoriesElem; QStringList categories; QBarSeries *series = new QBarSeries(); QBarCategoryAxis *axis = new QBarCategoryAxis(); QString aux; //int numberPerX = 0; chart->removeAllSeries(); categoriesTitle = tr("DXCC Entities"); categoriesElem = tr("DXCC Entities"); categories.clear(); axis->clear(); series->clear(); QBarSet *set0 = new QBarSet(tr("Chart title")); //*set0->remove(0, set0->count()-1); //qreal sum = 0; QProgressDialog progress(tr("Reading data ... "), tr("Abort reading"), 0, categories.count(), this); progress.setWindowModality(Qt::WindowModal); //qDebug() << "StatsEntitiesPerYearBarChartWidget::prepareChart: SelectedGrapth-1: YEARS "; //qDebug() << "BarChartStats::prepareChart: SelectedGrapth-2: DXCC "; categories.append(dataProxy->getOperatingYears(_log)); //categoriesElem = tr("DXCC Entities"); //categoriesTitle = tr("DXCC Entities"); aux.clear(); //int numberPerX; for (int i = 0; i < categories.count();i++ ) { *set0 << dataProxy->getDXCConYear((categories.at(i)).toInt(), _log); //*set0 << numberPerX; //numberPerX = 0; aux = tr("Reading data ...") + "\n" + tr("Entities: ") + QString::number(i) + "/" + QString::number(categories.count()); progress.setLabelText(aux); progress.setValue(i); if ( progress.wasCanceled() ) { i = categories.count(); } //qDebug() << "BarChartStats::prepareChart DXCCs: " << QString::number((categories.at(i)).toInt()) << "/" << QString::number(numberPerX); } series->append(set0); set0->setLabel(categoriesElem); chart->addSeries(series); chart->setTitle(categoriesTitle); axis->append(categories); //chart->createDefaultAxes(); //series->attachAxis(axis); chart->addAxis(axis, Qt::AlignBottom); chartView->setChart (chart); } klog-2.3.3/charts/statsworkedconfirmedpiechartwidget.cpp0000644000015700001710000000747514542412415023527 0ustar jenkinsjenkins/*************************************************************************** statsworkedconfirmedpiechatwidget.cpp - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "statsworkedconfirmedpiechartwidget.h" StatsWorkedConfirmedPieChartWidget::StatsWorkedConfirmedPieChartWidget(DataProxy_SQLite *dp, QWidget *parent) { Q_UNUSED(parent); #ifdef QT_DEBUG //qDebug() << "StatsWorkedConfirmedPieChartWidget::StatsWorkedConfirmedPieChartWidget"; #else #endif dataProxy = dp; //chart = new QChart(); chartView = new QChartView(); createUI(); //prepareChart(); } StatsWorkedConfirmedPieChartWidget::~StatsWorkedConfirmedPieChartWidget() { delete(dataProxy); } void StatsWorkedConfirmedPieChartWidget::createUI() { chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsWorkedConfirmedPieChartWidget::prepareChart(const int _log) { QChart *chart = new QChart(); chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); QPieSeries *series = new QPieSeries(); //PieSlice append(string label, real value) int qsos = dataProxy->getHowManyQSOInLog(_log); int confirmed = dataProxy->getHowManyConfirmedQSLInLog(_log); //qDebug() << "QSOs: " << QString::number(qsos); //qDebug() << "Confirmed: " << QString::number(confirmed); //qDebug() << "Worked: " << QString::number(qsos - confirmed); series->append(tr("Worked, not confirmed - %1").arg(qsos-confirmed), qsos - confirmed); series->append(tr("Confirmed - %2").arg(confirmed), confirmed); QPieSlice *slice = series->slices().at(1); slice->setExploded(); slice->setLabelVisible(); slice->setPen(QPen(Qt::darkGreen, 2)); slice->setBrush(Qt::green); QPieSlice *slice1 = series->slices().at(0); slice1->setExploded(); slice1->setLabelVisible(); slice1->setPen(QPen(Qt::blue, 2)); slice1->setBrush(Qt::blue); chart->addSeries(series); chart->setTitle(tr("Worked / Confirmed status")); chart->legend()->hide(); chartView->setRenderHint(QPainter::Antialiasing); chartView->setChart (chart); } klog-2.3.3/charts/statsdxccsonsatswidget.cpp0000644000015700001710000001700514542412415021147 0ustar jenkinsjenkins/*************************************************************************** statsdxccsonsatswidget.cpp - description ------------------- begin : dec 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "statsdxccsonsatswidget.h" StatsDXCCOnSatsWidget::StatsDXCCOnSatsWidget(DataProxy_SQLite *dp, QWidget *parent) { Q_UNUSED(parent); #ifdef QT_DEBUG //qDebug() << "StatsDxccOnSatsWidget::StatsDxccOnSatsWidget"; #else #endif dataProxy = dp; util = new Utilities(Q_FUNC_INFO); confirmedOnlyCheckBox = new QCheckBox; onlyLEOSatCheckBox = new QCheckBox; numberLabel = new QLabel; log = -1; //chart = new QChart(); //chartView = new QChartView(chart); //chart->setTheme(QChart::ChartThemeQt); //chart->setTheme(QChart::ChartThemeBlueCerulean); createUI(); //prepareChart(); } void StatsDXCCOnSatsWidget::createUI() { confirmedOnlyCheckBox->setText(tr("Show confirmed only")); confirmedOnlyCheckBox->setChecked(false); onlyLEOSatCheckBox->setText(tr("Only LEO sats", "LEO means Low Earth Orbiting and it is a well known word for hams. Do not translate if not sure.")); onlyLEOSatCheckBox->setChecked(false); tableWidget = new QTableWidget(this); tableWidget->setRowCount(0); tableWidget->setColumnCount(7); tableWidget->resizeRowsToContents(); tableWidget->sortByColumn(2, Qt::AscendingOrder); tableWidget->horizontalHeader()->setStretchLastSection(true); //logView->sortByColumn(1); QLabel *textLabel = new QLabel; textLabel->setText(tr("Number")); textLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter); numberLabel->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); numberLabel->setText(QString::number(0)); QHBoxLayout *labelLayout = new QHBoxLayout; labelLayout->addWidget(textLabel); labelLayout->addWidget(numberLabel); QHBoxLayout *checksLayout = new QHBoxLayout; checksLayout->addWidget(confirmedOnlyCheckBox); checksLayout->addWidget(onlyLEOSatCheckBox); checksLayout->addLayout(labelLayout); QVBoxLayout *layout = new QVBoxLayout; layout->addLayout(checksLayout); layout->addWidget(tableWidget); setLayout(layout); connect(confirmedOnlyCheckBox, SIGNAL(clicked()), this, SLOT(slotConfirmedClicked() ) ); connect(onlyLEOSatCheckBox, SIGNAL(clicked()), this, SLOT(slotConfirmedClicked() ) ); } StatsDXCCOnSatsWidget::~StatsDXCCOnSatsWidget() { delete(util); } void StatsDXCCOnSatsWidget::prepareChart(const int _log) { //qDebug() << Q_FUNC_INFO << "Log = " << QString::number(_log); while(tableWidget->rowCount()>0) { tableWidget->removeRow(tableWidget->rowCount()-1); } log = _log; QList _qsos; _qsos.clear(); _qsos << dataProxy->getSatDXCCStats(log); tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem(tr("Callsign"))); tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem(tr("Date"))); tableWidget->setHorizontalHeaderItem(2, new QTableWidgetItem(tr("Band"))); tableWidget->setHorizontalHeaderItem(3, new QTableWidgetItem(tr("Mode"))); tableWidget->setHorizontalHeaderItem(4, new QTableWidgetItem(tr("DXCC"))); tableWidget->setHorizontalHeaderItem(5, new QTableWidgetItem(tr("Satellite"))); tableWidget->setHorizontalHeaderItem(6, new QTableWidgetItem(tr("Confirmed"))); tableWidget->setStyleSheet("QHeaderView::section { background-color:cornflowerblue }"); //qDebug() << "StatsDxccOnSatsWidget::prepareChart: QSOs: " << QString::number(_qsos.length()); int number = 0; QList entities; entities.clear(); if (_qsos.length()>0) { for (int i = 0; i<_qsos.length(); i++) { bool confirmed = false; bool printThisOne = true; QString satName = _qsos.at(i)->getSatName(); QString qslStatus = QString(); if (_qsos.at(i)->getLoTWQSL_RCVD() == "Y") { qslStatus = "LoTW"; confirmed = true; } else if (_qsos.at(i)->getQSL_RCVD() == "Y") { qslStatus = "QSL"; confirmed = true; } else { qslStatus = QString(tr("No")); confirmed = false; } if (confirmedOnlyCheckBox->isChecked() && !confirmed) { printThisOne = false; } if ((onlyLEOSatCheckBox->isChecked()) && (satName == "QO-100") ) { printThisOne = false; } if (entities.contains(_qsos.at(i)->getDXCC())) { printThisOne = false; } if (printThisOne) { //qDebug() << "StatsDxccOnSatsWidget::prepareChart: QSOs: printThisOne: " << (_qsos.at(i)->getCall()) ; entities.append(_qsos.at(i)->getDXCC()); number++; tableWidget->insertRow(tableWidget->rowCount()); tableWidget->setItem(tableWidget->rowCount()-1, 0, new QTableWidgetItem((_qsos.at(i)->getCall())) ); tableWidget->setItem(tableWidget->rowCount()-1, 1, new QTableWidgetItem( util->getDateSQLiteStringFromDate(_qsos.at(i)->getDate()) ) ); tableWidget->setItem(tableWidget->rowCount()-1, 2, new QTableWidgetItem((_qsos.at(i)->getBand())) ); tableWidget->setItem(tableWidget->rowCount()-1, 3, new QTableWidgetItem((_qsos.at(i)->getMode())) ); tableWidget->setItem(tableWidget->rowCount()-1, 4, new QTableWidgetItem((dataProxy->getEntityNameFromId(_qsos.at(i)->getDXCC()))) ); tableWidget->setItem(tableWidget->rowCount()-1, 5, new QTableWidgetItem(satName)); tableWidget->setItem(tableWidget->rowCount()-1, 6, new QTableWidgetItem(qslStatus) ); } } numberLabel->setText(QString::number(number)); } } void StatsDXCCOnSatsWidget::slotConfirmedClicked() { prepareChart(log); } klog-2.3.3/charts/statsworkedconfirmedpiechartwidget.h0000644000015700001710000000471214542412415023163 0ustar jenkinsjenkins#ifndef KLOG_CHARTS_STATSWORKEDCONFIRMEDPIECHARTWIDGET_H #define KLOG_CHARTS_STATSWORKEDCONFIRMEDPIECHARTWIDGET_H /*************************************************************************** statsworkedconfirmedpiechatwidget.h - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "../dataproxy_sqlite.h" #include "../charts/statsgeneralchartwidget.h" class StatsWorkedConfirmedPieChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsWorkedConfirmedPieChartWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~StatsWorkedConfirmedPieChartWidget(); void prepareChart(const int _log=-1); signals: public slots: private: void createUI(); DataProxy_SQLite *dataProxy; //QChart *chart; QChartView *chartView; }; #endif // QSOSPERBANDBARCHARTWIDGET_H klog-2.3.3/charts/statsgeneralchartwidget.cpp0000644000015700001710000000433314542412415021252 0ustar jenkinsjenkins/*************************************************************************** statsgeneralchartwidget.cpp - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "statsgeneralchartwidget.h" StatsGeneralChartWidget::StatsGeneralChartWidget() { //qDebug() << "StatsGeneralChartWidget::StatsGeneralChartWidget" ; } StatsGeneralChartWidget::StatsGeneralChartWidget(DataProxy_SQLite *dp, QWidget *parent) { Q_UNUSED(parent); Q_UNUSED(dp); //qDebug() << "StatsGeneralChartWidget::StatsGeneralChartWidget" ; } void StatsGeneralChartWidget::prepareChart(const int _log) { (void)_log; // prevent warning } void StatsGeneralChartWidget::createUI(){} klog-2.3.3/charts/statsqsosperdxccbarchartwidget.cpp0000644000015700001710000001573114542412415022664 0ustar jenkinsjenkins/*************************************************************************** statsqsosperdxccbarchatwidget.cpp - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "statsqsosperdxccbarchartwidget.h" StatsQSOsPerDXCCBarChartWidget::StatsQSOsPerDXCCBarChartWidget(DataProxy_SQLite *dp, QWidget *parent) { Q_UNUSED(parent); #ifdef QT_DEBUG //qDebug() << "StatsQSOsPerDXCCBarChartWidget::StatsQSOsPerDXCCBarChartWidget"; #else #endif dataProxy = dp; //chart = new QChart(); chartView = new QChartView(); createUI(); // prepareChart(); } StatsQSOsPerDXCCBarChartWidget::~StatsQSOsPerDXCCBarChartWidget() { delete(dataProxy); } void StatsQSOsPerDXCCBarChartWidget::createUI() { chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsQSOsPerDXCCBarChartWidget::prepareChart(const int _log) { QChart *chart = new QChart(); chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); QString categoriesTitle; QString categoriesElem; QStringList categories; QBarSeries *series = new QBarSeries(); QBarCategoryAxis *axis = new QBarCategoryAxis(); QString aux; //int numberPerX = 0; chart->removeAllSeries(); categoriesTitle = QString(); categoriesElem = QString(); categories.clear(); axis->clear(); series->clear(); QBarSet *set0 = new QBarSet(tr("QSOs per DXCC")); //*set0->remove(0, set0->count()-1); qreal sum = 0; QProgressDialog progress(tr("Reading data ... "), tr("Abort reading"), 0, categories.count(), this); progress.setWindowModality(Qt::WindowModal); aux = tr("Reading data...") ; progress.setLabelText(aux); progress.setValue(0); QStringList entities; entities.clear(); entities << dataProxy->getEntitiesIds(); //qDebug() << "StatsQSOsPerDXCCBarChartWidget::prepareChart: SelectedGrapth-1: YEARS "; QMap map; // key,value = number of QSO, dxcc //int qsos = -1; map.clear(); aux.clear(); QList> data; data.clear(); data << dataProxy->getTop10QSOPerDXCC(_log); //qDebug() << "StatsQSOsPerDXCCBarChartWidget::prepareChart: Length: " << QString::number(data.length()); foreach(QList pair, data) { map.insert(pair.at(0), pair.at(1)); //qDebug() << "StatsQSOsPerDXCCBarChartWidget::prepareChart:Pair(0): " << QString::number(pair.at(0)); //qDebug() << "StatsQSOsPerDXCCBarChartWidget::prepareChart:Pair(1): " << QString::number(pair.at(1)); categories.append(dataProxy->getEntityMainPrefix(pair.at(0)) + " (" + QString::number(pair.at(1)) + ")"); set0->append(pair.at(1)); //*set0 << pair.at(1); } /* for (int i = 0; i < entities.size(); ++i) { qsos = dataProxy->getQSOsWithDXCC((entities.at(i)).toInt(), _log); if (qsos>0) { //qDebug() << "Checking: " << dataProxy->getEntityNameFromId((entities.at(i)).toInt()) << " - " << entities.at(i) << " - QSOs: " << QString::number(qsos) ; if (map.size()<10) { //qDebug() << "Inserting: " << dataProxy->getEntityNameFromId((entities.at(i)).toInt()) << " - " << entities.at(i) << " - QSOs: " << QString::number(qsos) ; map.insert(qsos, (entities.at(i)).toInt()); } else { QMapIterator it(map); while (it.hasNext()) { it.next(); if (it.key()< qsos) { //qDebug() << "Removing: " << QString::number(it.key()) << " / " << QString::number(it.value()); //qDebug() << "Replacing by: " << entities.at(i) << " / " << QString::number(qsos) << " - " << dataProxy->getEntityNameFromId((entities.at(i)).toInt()); map.remove(it.key()); map.insert(qsos, (entities.at(i)).toInt()); it.toBack(); } } } } aux = tr("Reading data...") + "\n" + tr("Entity: ") + QString::number(i) + "/" + QString::number(entities.size()); progress.setLabelText(aux); progress.setValue(i); if ( progress.wasCanceled() ) { i = entities.size(); } //qDebug() << "End of for iteration"; } */ /* QMapIterator it(map); while (it.hasNext()) { it.next(); categories.append(dataProxy->getEntityMainPrefix(it.value())); //qDebug() << "While iteration: " << dataProxy->getEntityMainPrefix(it.value()); numberPerX = it.key(); *set0 << numberPerX; numberPerX = 0; //qDebug() << "End of while iteration"; } //qDebug() << "Out of while"; */ categoriesElem = tr("DXCC"); categoriesTitle = tr("Top ten DXCC per QSO"); sum = set0->sum(); set0->setLabel(QString::number(sum)); series->append(set0); set0->setLabel(categoriesElem); chart->addSeries(series); chart->setTitle(categoriesTitle); axis->append(categories); //chart->createDefaultAxes(); //series->attachAxis(axis); chart->addAxis(axis, Qt::AlignBottom); chartView->setChart (chart); } klog-2.3.3/charts/statsqsosperbandbarchartwidget.cpp0000644000015700001710000001132614542412415022643 0ustar jenkinsjenkins/*************************************************************************** statsqsosperbandbarchatwidget.cpp - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "statsqsosperbandbarchartwidget.h" StatsQSOsPerBandBarChartWidget::StatsQSOsPerBandBarChartWidget(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "StatsQSOsPerBandBarChartWidget::StatsQSOsPerBandBarChartWidget"; Q_UNUSED(parent); dataProxy = dp; chartView = new QChartView(); createUI(); //prepareChart(); } StatsQSOsPerBandBarChartWidget::~StatsQSOsPerBandBarChartWidget() { delete(dataProxy); } void StatsQSOsPerBandBarChartWidget::createUI() { chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsQSOsPerBandBarChartWidget::prepareChart(const int _log) { QChart *chart = new QChart(); chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); QString categoriesTitle; QString categoriesElem; QStringList categories; QBarSeries *series = new QBarSeries(); QBarCategoryAxis *axis = new QBarCategoryAxis(); QString aux; //int numberPerX = 0; chart->removeAllSeries(); //categoriesTitle = QString(); //categoriesElem = QString(); categories.clear(); axis->clear(); series->clear(); QBarSet *set0 = new QBarSet(tr("QSOs per band")); //*set0->remove(0, set0->count()-1); qreal sum = 0; QProgressDialog progress(tr("Reading data ... "), tr("Abort reading"), 0, categories.count(), this); progress.setWindowModality(Qt::WindowModal); //qDebug() << "StatsQSOsPerBandBarChartWidget::prepareChart: SelectedGrapth-1: YEARS "; categories.append(dataProxy->getBandsInLog(_log)); categoriesElem = tr("Bands"); categoriesTitle = tr("QSOs per band distribution"); aux.clear(); for (int i = 0; i < categories.count();i++ ) { *set0 << dataProxy->getQSOsInBand((categories.at(i)), _log); //qDebug() << categories.at(i) + "-" + QString::number(numberPerX); //*set0 << numberPerX; //numberPerX = 0; //qDebug() << "StatsQSOsPerBandBarChartWidget::prepareChart QSOs: " << QString::number((categories.at(i)).toInt()) << "/" << QString::number(numberPerX); aux = tr("Reading data ...") + "\n" + tr("Bands: ") + QString::number(i) + "/" + QString::number(categories.count()); //aux = tr("Reading data ...") + "\n" + tr("Bands: %1/%2").arg(QString::number(i)).arg(QString::number(categories.count())); progress.setLabelText(aux); progress.setValue(i); if ( progress.wasCanceled() ) { i = categories.count(); } } sum = set0->sum(); set0->setLabel(QString::number(sum)); series->append(set0); set0->setLabel(categoriesElem); chart->addSeries(series); chart->setTitle(categoriesTitle); axis->append(categories); //chart->createDefaultAxes(); //series->attachAxis(axis); chart->addAxis(axis, Qt::AlignBottom); chartView->setChart (chart); } klog-2.3.3/charts/statsdxccsonsatswidget.h0000644000015700001710000000513014542412415020610 0ustar jenkinsjenkins#ifndef CHARTS_KLOG_STATSDXCCSONSATSWIDGET_H #define CHARTS_KLOG_STATSDXCCSONSATSWIDGET_H /*************************************************************************** statsdxccsonsatswidget.h - description ------------------- begin : dec 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include #include "../dataproxy_sqlite.h" #include "../qso.h" #include "../utilities.h" #include "../charts/statsgeneralchartwidget.h" class StatsDXCCOnSatsWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsDXCCOnSatsWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~StatsDXCCOnSatsWidget(); void prepareChart(const int _log=-1) override; signals: private slots: void slotConfirmedClicked(); private: void createUI() override; DataProxy_SQLite *dataProxy; QTableWidget *tableWidget; Utilities *util; QCheckBox *confirmedOnlyCheckBox, *onlyLEOSatCheckBox; QLabel *numberLabel; int log; }; #endif // STATSGRIDSONSATSWIDGET_H klog-2.3.3/charts/statsqsospermonthbarchartwidget.cpp0000644000015700001710000001140714542412415023064 0ustar jenkinsjenkins/*************************************************************************** statsqsospermonthbarchatwidget.cpp - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "statsqsospermonthbarchartwidget.h" StatsQSOsPerMonthBarChartWidget::StatsQSOsPerMonthBarChartWidget(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "StatsQSOsPerMonthBarChartWidget::StatsQSOsPerMonthBarChartWidget"; Q_UNUSED(parent); dataProxy = dp; //chart = new QChart(); chartView = new QChartView(); createUI(); //prepareChart(); } StatsQSOsPerMonthBarChartWidget::~StatsQSOsPerMonthBarChartWidget() { delete(dataProxy); } void StatsQSOsPerMonthBarChartWidget::createUI() { chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsQSOsPerMonthBarChartWidget::prepareChart(const int _log) { QChart *chart = new QChart(); chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); QString categoriesTitle; QString categoriesElem; QStringList categories; QBarSeries *series = new QBarSeries(); QBarCategoryAxis *axis = new QBarCategoryAxis(); QString aux; //int numberPerX = 0; chart->removeAllSeries(); categoriesTitle = QString(); categoriesElem = QString(); categories.clear(); axis->clear(); series->clear(); QBarSet *set0 = new QBarSet(tr("QSOs per month")); //*set0->remove(0, set0->count()-1); qreal sum = 0; QProgressDialog progress(tr("Reading data ... "), tr("Abort reading"), 0, categories.count(), this); progress.setWindowModality(Qt::WindowModal); QStringList months; months.clear(); months << tr("Jan") << tr("Feb") << tr("Mar") << tr("Apr") << tr("May") << tr("Jun") << tr("Jul") << tr("Aug") << tr("Sep") << tr("Oct") << tr("Nov") << tr("Dec"); categories.append(months); categoriesElem = tr("Months"); categoriesTitle = tr("QSOs at Month"); aux.clear(); for (int i = 0; i < categories.count(); i++ ) { *set0 << dataProxy->getQSOsOnMonth(i+1, _log); //qDebug() << "BarChartStats::prepareChart SelectedGrapth-7: QSO/hour: " << categories.at(i) << " - " << QString::number(numberPerX); //*set0 << numberPerX; //numberPerX = 0; aux = tr("Reading data ...") + "\n" + tr("Months: ") + QString::number(i) + "/" + QString::number(categories.count()); progress.setLabelText(aux); progress.setValue(i); if ( progress.wasCanceled() ) { i = categories.count(); } //qDebug() << "BarChartStats::prepareChart CQz: " << QString::number((categories.at(i)).toInt()) << "/" << QString::number(numberPerX); } sum = set0->sum(); set0->setLabel(QString::number(sum)); series->append(set0); set0->setLabel(categoriesElem); chart->addSeries(series); chart->setTitle(categoriesTitle); axis->append(categories); //chart->createDefaultAxes(); //series->attachAxis(axis); chart->addAxis(axis, Qt::AlignBottom); chartView->setChart (chart); } klog-2.3.3/charts/statsgridsonsatswidget.h0000644000015700001710000000511114542412415020613 0ustar jenkinsjenkins#ifndef KLOG_CHARTS_STATSGRIDSONSATSWIDGET_H #define KLOG_CHARTS_STATSGRIDSONSATSWIDGET_H /*************************************************************************** statsgridsonsatswidget.h - description ------------------- begin : dec 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include #include "../dataproxy_sqlite.h" #include "../qso.h" #include "../utilities.h" #include "../charts/statsgeneralchartwidget.h" class StatsGridsOnSatsWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsGridsOnSatsWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~StatsGridsOnSatsWidget(); void prepareChart(const int _log=-1); signals: private slots: void slotConfirmedClicked(); private: void createUI(); DataProxy_SQLite *dataProxy; QTableWidget *tableWidget; Utilities *util; QCheckBox *confirmedOnlyCheckBox, *onlyLEOSatCheckBox; QLabel *numberLabel; int log; }; #endif // STATSGRIDSONSATSWIDGET_H klog-2.3.3/charts/statsqsosperhourbarchartwidget.cpp0000644000015700001710000001147014542412415022714 0ustar jenkinsjenkins/*************************************************************************** statsqsosperhourbarchatwidget.cpp - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "statsqsosperhourbarchartwidget.h" StatsQSOsPerHourBarChartWidget::StatsQSOsPerHourBarChartWidget(DataProxy_SQLite *dp, QWidget *parent) { Q_UNUSED(parent); #ifdef QT_DEBUG //qDebug() << "StatsDxccOnSatsWidget::StatsDxccOnSatsWidget"; #else #endif dataProxy = dp; //chart = new QChart(); chartView = new QChartView(); createUI(); //prepareChart(); } StatsQSOsPerHourBarChartWidget::~StatsQSOsPerHourBarChartWidget() { delete(dataProxy); } void StatsQSOsPerHourBarChartWidget::createUI() { chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsQSOsPerHourBarChartWidget::prepareChart(const int _log) { QChart *chart = new QChart(); chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); QString categoriesTitle; QString categoriesElem; QStringList categories; QBarSeries *series = new QBarSeries(); QBarCategoryAxis *axis = new QBarCategoryAxis(); QString aux; //int numberPerX = 0; chart->removeAllSeries(); categoriesTitle = QString(); categoriesElem = QString(); categories.clear(); axis->clear(); series->clear(); QBarSet *set0 = new QBarSet(tr("QSOs per hour")); //*set0->remove(0, set0->count()-1); qreal sum = 0; QProgressDialog progress(tr("Reading data ... "), tr("Abort reading"), 0, categories.count(), this); progress.setWindowModality(Qt::WindowModal); QStringList hours; hours.clear(); hours << "00" << "01" << "02" << "03" << "04" << "05" << "06" << "07" << "08" << "09" << "10" << "11" << "12" << "13" << "14" << "15" << "16" << "17" << "18" << "19" << "20" << "21" << "22" << "23"; categories.append(hours); categoriesElem = tr("Hours"); categoriesTitle = tr("QSOs at hour"); aux.clear(); for (int i = 0; i < categories.count(); i++ ) { *set0 << dataProxy->getQSOsAtHour((categories.at(i)).toInt(), _log); //qDebug() << "BarChartStats::prepareChart SelectedGrapth-7: QSO/hour: " << categories.at(i) << " - " << QString::number(numberPerX); //*set0 << numberPerX; //numberPerX = 0; aux = tr("Reading data ...") + "\n" + tr("Hours: ") + QString::number(i) + "/" + QString::number(categories.count()); progress.setLabelText(aux); progress.setValue(i); if ( progress.wasCanceled() ) { i = categories.count(); } //qDebug() << "BarChartStats::prepareChart CQz: " << QString::number((categories.at(i)).toInt()) << "/" << QString::number(numberPerX); } sum = set0->sum(); set0->setLabel(QString::number(sum)); series->append(set0); set0->setLabel(categoriesElem); chart->addSeries(series); chart->setTitle(categoriesTitle); axis->append(categories); //chart->createDefaultAxes(); //series->attachAxis(axis); chart->addAxis(axis, Qt::AlignBottom); chartView->setChart (chart); } klog-2.3.3/charts/statssentconfirmedpiechartwidget.h0000644000015700001710000000467614542412415022652 0ustar jenkinsjenkins#ifndef KLOG_CHARTS_STATSSENTCONFIRMEDPIECHARTWIDGET_H #define KLOG_CHARTS_STATSSENTCONFIRMEDPIECHARTWIDGET_H /*************************************************************************** statssentconfirmedpiechatwidget.h - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "../dataproxy_sqlite.h" #include "../charts/statsgeneralchartwidget.h" class StatsSentConfirmedPieChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsSentConfirmedPieChartWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~StatsSentConfirmedPieChartWidget(); void prepareChart(const int _log=-1); signals: public slots: private: void createUI(); DataProxy_SQLite *dataProxy; //QChart *chart; QChartView *chartView; }; #endif // QSOSPERBANDBARCHARTWIDGET_H klog-2.3.3/charts/statsqsospermonthbarchartwidget.h0000644000015700001710000000467114542412415022536 0ustar jenkinsjenkins#ifndef KLOG_CHARTS_STATSQSOSPERMONTHBARCHARTWIDGET_H #define KLOG_CHARTS_STATSQSOSPERMONTHBARCHARTWIDGET_H /*************************************************************************** statsqsospermonthbarchatwidget.h - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "../dataproxy_sqlite.h" #include "../charts/statsgeneralchartwidget.h" class StatsQSOsPerMonthBarChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsQSOsPerMonthBarChartWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~StatsQSOsPerMonthBarChartWidget(); void prepareChart(const int _log=-1); signals: public slots: private: void createUI(); DataProxy_SQLite *dataProxy; //QChart *chart; QChartView *chartView; }; #endif // QSOSPERMONTHBARCHARTWIDGET_H klog-2.3.3/charts/statsqsosperdxccbarchartwidget.h0000644000015700001710000000465014542412415022327 0ustar jenkinsjenkins#ifndef KLOG_CHARTS_STATSQSOSPERDXCCBARCHARTWIDGET_H #define KLOG_CHARTS_STATSQSOSPERDXCCBARCHARTWIDGET_H /*************************************************************************** statsqsosperdxccbarchatwidget.h - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "../dataproxy_sqlite.h" #include "statsgeneralchartwidget.h" class StatsQSOsPerDXCCBarChartWidget : public StatsGeneralChartWidget { Q_OBJECT public: StatsQSOsPerDXCCBarChartWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~StatsQSOsPerDXCCBarChartWidget(); void prepareChart(const int _log=-1); signals: public slots: private: void createUI(); DataProxy_SQLite *dataProxy; //QChart *chart; QChartView *chartView; }; #endif // QSOSPERBANDBARCHARTWIDGET_H klog-2.3.3/charts/statscqzperyearbarchartwidget.cpp0000644000015700001710000001113714542412415022507 0ustar jenkinsjenkins/*************************************************************************** statscqzperyearbarchatwidget.cpp - description ------------------- begin : oct 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "statscqzperyearbarchartwidget.h" StatsCQZPerYearBarChartWidget::StatsCQZPerYearBarChartWidget(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "StatsCQZPerYearBarChartWidget::StatsCQZPerYearBarChartWidget"; Q_UNUSED(parent); dataProxy = dp; //chart = new QChart(); chartView = new QChartView(); createUI(); //prepareChart(); } void StatsCQZPerYearBarChartWidget::createUI() { chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } StatsCQZPerYearBarChartWidget::~StatsCQZPerYearBarChartWidget() { delete(dataProxy); } void StatsCQZPerYearBarChartWidget::prepareChart(const int _log) { QChart *chart = new QChart(); chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); QString categoriesTitle; QString categoriesElem; QStringList categories; QBarSeries *series = new QBarSeries(); QBarCategoryAxis *axis = new QBarCategoryAxis(); QString aux; //int numberPerX = 0; chart->removeAllSeries(); categories.clear(); axis->clear(); series->clear(); QBarSet *set0 = new QBarSet(tr("CQ Zones per year")); //*set0->remove(0, set0->count()-1); qreal sum = 0; QProgressDialog progress(tr("Reading data ... "), tr("Abort reading"), 0, categories.count(), this); progress.setWindowModality(Qt::WindowModal); //qDebug() << "StatsCQZPerYearBarChartWidget::prepareChart: SelectedGrapth-1: YEARS "; categories.append(dataProxy->getOperatingYears(_log)); categoriesElem = tr("CQ zones"); categoriesTitle = tr("CQ zones per year"); aux.clear(); for (int i = 0; i < categories.count();i++ ) { *set0 << dataProxy->getCQzonYear((categories.at(i)).toInt(), _log); //numberPerX = dataProxy->getQSOonYear((categories.at(i)).toInt(), -1); //qDebug() << categories.at(i) + "-" + QString::number(numberPerX); //*set0 << numberPerX; //qDebug() << "StatsCQZPerYearBarChartWidget::prepareChart QSOs: " << QString::number((categories.at(i)).toInt()) << "/" << QString::number(numberPerX); aux = tr("Reading data ...") + "\n" + tr("Years: %1/%2").arg(QString::number(i), QString::number(categories.count())); progress.setLabelText(aux); progress.setValue(i); if ( progress.wasCanceled() ) { i = categories.count(); } } sum = set0->sum(); set0->setLabel(QString::number(sum)); series->append(set0); set0->setLabel(categoriesElem); chart->addSeries(series); chart->setTitle(categoriesTitle); axis->append(categories); //chart->createDefaultAxes(); //series->attachAxis(axis); chart->addAxis(axis, Qt::AlignBottom); chartView->setChart (chart); } klog-2.3.3/charts/statssentconfirmedpiechartwidget.cpp0000644000015700001710000000714614542412415023200 0ustar jenkinsjenkins/*************************************************************************** statssentconfirmedpiechatwidget.cpp - description ------------------- begin : nov 2018 copyright : (C) 2018 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "statssentconfirmedpiechartwidget.h" StatsSentConfirmedPieChartWidget::StatsSentConfirmedPieChartWidget(DataProxy_SQLite *dp, QWidget *parent) { //qDebug() << "StatsSentConfirmedPieChartWidget::StatsSentConfirmedPieChartWidget"; Q_UNUSED(parent); dataProxy = dp; //chart = new QChart(); chartView = new QChartView(); createUI(); //prepareChart(); } StatsSentConfirmedPieChartWidget::~StatsSentConfirmedPieChartWidget() { delete(dataProxy); } void StatsSentConfirmedPieChartWidget::createUI() { chartView->setRenderHint(QPainter::Antialiasing); QVBoxLayout *graphLayout = new QVBoxLayout; graphLayout->addWidget(chartView); setLayout(graphLayout); } void StatsSentConfirmedPieChartWidget::prepareChart(const int _log) { QChart *chart = new QChart(); chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); QPieSeries *series = new QPieSeries(); //PieSlice append(string label, real value) int sent = dataProxy->getHowManyQSLSentInLog(_log); int confirmed = dataProxy->getHowManyConfirmedQSLInLog(_log); //qDebug() << "Confirmed: " << QString::number(confirmed); series->append(tr("Sent - %1").arg(sent), sent); series->append(tr("Confirmed - %2").arg(confirmed), confirmed); QPieSlice *slice = series->slices().at(1); slice->setExploded(); slice->setLabelVisible(); slice->setPen(QPen(Qt::darkGreen, 2)); slice->setBrush(Qt::green); QPieSlice *slice1 = series->slices().at(0); slice1->setExploded(); slice1->setLabelVisible(); slice1->setPen(QPen(Qt::blue, 2)); slice1->setBrush(Qt::blue); chart->addSeries(series); chart->setTitle(tr("Sent / Confirmed status")); chart->legend()->hide(); chartView->setRenderHint(QPainter::Antialiasing); chartView->setChart (chart); } klog-2.3.3/utilities.h0000644000015700001710000002160714542412415014527 0ustar jenkinsjenkins#ifndef KLOG_UTILITIES_H #define KLOG_UTILITIES_H /*************************************************************************** utilities.h - description ------------------- begin : jun 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ /* This class implements general use utilities that can be used from any other class Anything that is not directly related with a class itself and could be used from different classes should be here. This classs hould not need to query the DB neither the DataProxy Class */ #include #include #include #include #include #include #include #include "locator.h" #include "klogdefinitions.h" //#include "dataproxy_sqlite.h" class Utilities : public QObject { Q_OBJECT friend class tst_Utilities; public: Utilities(const QString &_parentName); ~Utilities(); //void setDarkMode(const QString &_dm); //bool isDarkMode(); void setCallValidation(const bool _b); void setLongPrefixes (const QStringList &_p); void setSpecialCalls (const QStringList &_p); int getProgresStepForDialog(int totalSteps); bool trueOrFalse(const QString &_s); // reads a String and return true if s.upper()== TRUE :-) QChar boolToCharToSQLite(const bool _b); QString boolToQString(const bool _b); QString checkAndFixASCIIinADIF(const QString &_data); QString getAgent(const QString &_klogversion); QString getGlobalAgent(const QString &_klogversion); //QOperatingSystemVersion getOS(); //Devel or debug functions - Not adding any feature to the user void printQString(const QStringList &_qs); QString getKLogDBFile(); QString getKLogDBBackupFile(); bool QStringToBool(const QString &_s); //QString getKLogDatabaseFile(const QString &_file); bool fileExists(const QString &_fileName); QString getTQSLsFileName(); QString getTQSLsPath(); // Depending on the OS where are usually installed the executables QString getHomeDir(); QString getCfgFile(); QString getCTYFile(); QString getDebugLogFile(); QString getSaveSpotsLogFile(); QString getBackupADIFile(); QString getClubLogFile(); QString getEQSLFile(); QString getLoTWAdifFile(); QString getClearSQLi(QString _s); void setVersion(const QString &_v); QString getVersion(); double getVersionDouble(); QDate getDefaultDate(); QString getDefaultRST(const QString &_m); QStringList getDefaultLogFields(); int getNormalizedDXCCValue(const int _dxcc); // Validations bool isValidDate(const QDate _d); bool isValidDateTime(const QString &_d); bool isValidCall(const QString &_c, bool _force=false); bool isSameFreq(const double fr1, const double fr2); bool isValidBandId(const int _b); bool isValidModeId(const int _m); bool isValidFreq(const QString &_b); bool isValidGrid(const QString &_b); bool isValidVUCCGrids(const QString &_b); bool isValidRST(const QString &_b); bool isValidPower(const QString &_b); bool isValidComment(const QString &_b); bool isValidName(const QString &_b); bool isValidADIFField(const QString &_b); bool isValidQSL_Rcvd(const QString &c); bool isValidQSL_Sent(const QString &c); bool isValidUpload_Status(const QString &c); bool isValidFISTS(const QString &c); bool isValidTimeFromString(const QString &_s); bool isValidDateFromString(const QString &_s); bool isValidDateTimeFromString(const QString &_s); bool isValidDXCC(const int _d); bool isValidAntPath(const QString &_s); bool isValidARRLSect(const QString &_s); bool isValidContinent(const QString &_s); bool isValidPropMode(const QString &_s); QStringList getValidADIFFieldAndData(const QString &_b); //QString getADIFField(const QString &_fieldName, const QString &_data); QString getMainCallFromComplexCall(const QString &_complexCall); // F from F/EA4K/p, EA4K from EA4K/p or EA4K from EA4K QString getAValidCall (const QString &_wrongCall); QString getPrefixFromCall(const QString &_c, bool withAreaNumber = false); bool isAOneLetterPrefix(const QChar &_c); // Write DATE/TIME to DB QString getDateTimeSQLiteStringFromDateTime(const QDateTime &_d); QString getDateSQLiteStringFromDate(const QDate &_d); // Read from DB QDateTime getDateTimeFromSQLiteString(const QString &_s); QTime getTimeFromSQLiteString(const QString &_s); QDate getDateFromSQliteString(const QString &_s); // Translate the LOG table fields into human readable QString getLogColumnName(const QString &_column); // Creates the ADIF DATE & TIME formats QString getADIFDateFromQDateTime(const QDateTime &_d); // Will produce the ADIF DATE format: "YYYYMMDD" QString getADIFDateFromQDate(const QDate &_d); // Will produce the ADIF DATE format: "YYYYMMDD" QString getADIFTimeFromQDateTime(const QDateTime &_d); // Will produce the ADIF TIME format: "HHMMSS" // Parse Date & Time from ADIF QDate getDateFromADIFDateString(const QString &_s); // Expects an ADIF DATE format string: "YYYYMMDD" QTime getTimeFromADIFTimeString(const QString &_s); // Expects and ADIF TIME format String "HHMMSS" or "HHMM" // Parse date fromLoTW QDate getDateFromLoTWQSLDateString(const QString &_s); // Creates the Cabrillo DATE & TIME (http://wwrof.org/cabrillo/) QString getCabrilloDateFromQDate(const QDate &_d); // Will produce the Cabrillo DATE format: "YYYY-MM-DD" QString getCabrilloTimeFromQDateTime(const QDateTime &_d); // Will produce the Cabrillo TIME format: "HHMM" QString getOnlineServiceName(OnLineProvider _service); bool isValidDistance(const double _d); bool isValidSponsor(const QString &_s); QString debugLevelToString(DebugLogLevel _l); DebugLogLevel stringToDebugLevel(const QString &_s); bool isValidLogLevel(const QString &_s); QStringList getDebugLevels(); void setLogLevel(DebugLogLevel _l); void openQrzcom(const QString _call); void printCommandHelp(); //QPalette getPalete(bool _ok); signals: void debugLog (QString _func, QString _msg, DebugLogLevel _level); private: void init(); void InitializeHash(); void setLogColumnNames(); // Creates the map of column Names (should be called from init() ) bool processConfigLine(const QString &_line); QString getKLogDefaultDatabaseFile(); //bool isCountrySuffix (const QString &_c); bool isAValidOperatingSuffix (const QString &_c); bool isAPrefix(const QString &_c); // Returns true if it is the country prefix or it includes the area number bool isAKnownPrefix(const QString &_c); bool isAKnownCall(const QString &_c); bool isValidSimpleCall(const QString &_c); //QPair getCallParts(const QString &_c); void setARRLSect(); void setContinent(); void setSponsorsList(); QString getCheckedComplexCall(const QString &_c); void logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level); //bool darkMode; QString dbPath; QString softwareVersion; QString parentName; // The class that instanciated this object. QStringList ARRL_sects, continent, sponsorsList, logLevels; DebugLogLevel logLevel; QStringList longPrefixes, specialCalls; QMap columnNames; bool validateCalls; QHash ADIFHash; // Name, type }; #endif // UTILITIES_H klog-2.3.3/mainwindow.cpp0000644000015700001710000104361514542412415015227 0ustar jenkinsjenkins/*************************************************************************** mainwindow.cpp - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include "global.h" #include #include #include #include #include //#include "database.h" #include "mainwindow.h" void MainWindow::showNotWar() { logEvent(Q_FUNC_INFO, "Start", Debug); /* #include #if QT_VERSION >= 0x050000 #include #else #include #endif */ //qDebug() << QT_VERSION_STR; int callDXCC = world->getQRZARRLId(mainQRZ); int EURusId = 54; // ADIF code Eu Russia int ASRusId = 15; // ADIF code As Russia int KaRusId = 126; // Kaliningrad int UkrId = 288; // UKraine QMessageBox msgBox; msgBox.setIcon(QMessageBox::Critical); msgBox.setWindowTitle(tr("KLog - Stop the war in Ukraine!")); QString aux; aux.clear(); #if defined(Q_OS_OSX) aux = tr("KLog - Stop the war in Ukraine!\n\n"); #endif //qDebug() << "DXCC: " << QString::number(callDXCC); if ((callDXCC == EURusId) || (callDXCC == ASRusId) || (callDXCC == KaRusId)) { //qDebug() << "RUSSIA"; aux = aux + QString(tr("You are using a Russian call (%1).\n\nYou can probably help to stop the Russian war, people are dying.\n\nPlease call your leaders to stop the war.")).arg(mainQRZ); } else if (callDXCC == UkrId) { //qDebug() << "UKRAINE"; aux = aux + tr("You are using an Ukranian call.\n\nPlease take care and protect yourself and your family. \n\nThe KLog developers wish you the best of luck in this very difficult moment."); } else { //qDebug() << "Other"; aux = aux + tr("People are dying in the war of Russia against Ukraine.\n\nYou can help to stop the Russian war against Ukraine.\n\nPlease show your disagreement to your leaders, or in your social network to stop the war."); } msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); logEvent(Q_FUNC_INFO, "END", Debug); } MainWindow::MainWindow(const QString &tversion) { //qDebug() << Q_FUNC_INFO << ": " << " Ver: " << tversion << QTime::currentTime().toString("hh:mm:ss") ; //logEvent(Q_FUNC_INFO, "Start: " + _klogDir + "/" + tversion, Debug); showKLogLogWidget = new ShowKLogLogWidget; showErrorDialog = new ShowErrorDialog(); UDPLogServer = new UDPServer(); util = new Utilities(Q_FUNC_INFO); qso = new QSO; backupQSO = new QSO; softwareVersion = tversion; logLevel = Info; sendQSLByDefault = true; // This must be before reading the config dupeSlotInSeconds = 15; needToEnd = false; upAndRunning = false; // To define some actions that can only be run when starting the software QRZCOMAutoCheckAct = new QAction(tr("Always check the current callsign in QRZ.com"), this); //qDebug() << "MainWindow::MainWindow: Debug File: "<< util->getDebugLogFile() ; //qDebug() << Q_FUNC_INFO << ": BEFORE HAMLIB " << QTime::currentTime().toString("hh:mm:ss") ; hamlib = new HamLibClass(); //qDebug() << Q_FUNC_INFO << ": AFTER HAMLIB " << QTime::currentTime().toString("hh:mm:ss") ; dataProxy = new DataProxy_SQLite(Q_FUNC_INFO, softwareVersion); lotwUtilities = new LoTWUtilities(util->getHomeDir (), softwareVersion, Q_FUNC_INFO, dataProxy); eqslUtilities = new eQSLUtilities(Q_FUNC_INFO); mapWindow = new MapWindowWidget(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": Before DXCCStatusWidget " << QTime::currentTime().toString("hh:mm:ss") ; dxccStatusWidget = new DXCCStatusWidget(dataProxy, Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << ": After DXCCStatusWidget " << QTime::currentTime().toString("hh:mm:ss") ; elogClublog = new eLogClubLog(); //qDebug() << Q_FUNC_INFO << ": 00082: " << QTime::currentTime().toString("hh:mm:ss") ; elogQRZcom = new eLogQrzLog(dataProxy, Q_FUNC_INFO, softwareVersion); //qDebug() << Q_FUNC_INFO << ": 00083: " << QTime::currentTime().toString("hh:mm:ss") ; updateSatsData = new UpdateSatsData(dataProxy); //qDebug() << Q_FUNC_INFO << ": 00084: " << QTime::currentTime().toString("hh:mm:ss") ; statsWidget = new StatisticsWidget(dataProxy); //qDebug() << Q_FUNC_INFO << ": 00085: " << QTime::currentTime().toString("hh:mm:ss") ; infoLabel1 = new QLabel(tr("Status bar ...")); infoLabel2 = new QLabel(tr("DX Entity")); //qDebug() << "MainWindow::MainWindow: 00086" << QTime::currentTime().toString("hh:mm:ss") ; logWindow = new LogWindow(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": 00087: " << QTime::currentTime().toString("hh:mm:ss") ; searchWidget = new SearchWidget(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": 00087.1: " << QTime::currentTime().toString("hh:mm:ss") ; //advancedSearchWidget = new AdvancedSearchWidget(dataProxy, this); //qDebug() << "MainWindow::MainWindow: 00087.2" << QTime::currentTime().toString("hh:mm:ss") ; infoWidget = new InfoWidget(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": 00088: " << QTime::currentTime().toString("hh:mm:ss") ; awardsWidget = new AwardsWidget(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": 0009: " << QTime::currentTime().toString("hh:mm:ss") ; aboutDialog = new AboutDialog(softwareVersion); tipsDialog = new TipsDialog(); downloadcty = new DownLoadCTY(util->getHomeDir (), softwareVersion); statusBarMessage = tr("Starting KLog"); //qDebug() << Q_FUNC_INFO << ": 40: " << QTime::currentTime().toString("hh:mm:ss") ; world = new World(dataProxy, Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << ": 50: " << QTime::currentTime().toString("hh:mm:ss") ; //qDebug() << Q_FUNC_INFO << ": 51: " << QTime::currentTime().toString("hh:mm:ss") ; setupDialog = new SetupDialog(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": satTabWidget to be created " ; satTabWidget = new MainWindowSatTab(dataProxy); //qDebug() << Q_FUNC_INFO << ": 52: " << QTime::currentTime().toString("hh:mm:ss") ; QSOTabWidget = new MainWindowInputQSO(dataProxy); //qDebug() << Q_FUNC_INFO << ": 53: " << QTime::currentTime().toString("hh:mm:ss") ; myDataTabWidget = new MainWindowMyDataTab(dataProxy); //qDebug() << Q_FUNC_INFO << ": 54: " << QTime::currentTime().toString("hh:mm:ss") ; commentTabWidget = new MainWindowInputComment(); //qDebug() << Q_FUNC_INFO << ": 55: " << QTime::currentTime().toString("hh:mm:ss") ; othersTabWidget = new MainWindowInputOthers(dataProxy); //qDebug() << Q_FUNC_INFO << ": 56: " << QTime::currentTime().toString("hh:mm:ss") ; eQSLTabWidget = new MainWindowInputEQSL(dataProxy); //qDebug() << Q_FUNC_INFO << ": 57: " << QTime::currentTime().toString("hh:mm:ss") ; QSLTabWidget = new MainWindowInputQSL(dataProxy); //qDebug() << Q_FUNC_INFO << ": 58: " << QTime::currentTime().toString("hh:mm:ss") ; mainQSOEntryWidget = new MainQSOEntryWidget(dataProxy); //qDebug() << Q_FUNC_INFO << ": locator to be created 59" << QTime::currentTime().toString("hh:mm:ss") ; locator = new Locator(); mainWidget = new QWidget(this); //qDebug() << Q_FUNC_INFO << ": 60 " << QTime::currentTime().toString("hh:mm:ss") ; dateTime = new QDateTime(); dateTimeTemp = new QDateTime(); // UI DX infoLabel2 = new QLabel(tr("DX Entity")); loggWinAct = new QAction(tr("&Log Window"), this); //qDebug() << Q_FUNC_INFO << ": dxclusterwidget to be created " << QTime::currentTime().toString("hh:mm:ss") ; //dxClusterWidget = new DXClusterWidget(dataProxy, dxclusterServerToConnect , dxclusterServerPort, this); dxClusterWidget = new DXClusterWidget(dataProxy, this); //qDebug() << Q_FUNC_INFO << ": Awards to be created " << QTime::currentTime().toString("hh:mm:ss") ; awards = new Awards(dataProxy, Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << ": Awards created " << QTime::currentTime().toString("hh:mm:ss") ; // if (needToEnd) { exit(0); } //qDebug() << Q_FUNC_INFO << ": Software update to be created " << QTime::currentTime().toString("hh:mm:ss") ; softUpdate = new SoftwareUpdate(softwareVersion); //qDebug() << Q_FUNC_INFO << ": FileManager to be created " << QTime::currentTime().toString("hh:mm:ss") ; filemanager = new FileManager(dataProxy); //qDebug() << Q_FUNC_INFO << ": FileAwardManager to be created " << QTime::currentTime().toString("hh:mm:ss") ; fileAwardManager = new FileAwardManager(dataProxy, Q_FUNC_INFO); lotwCallTQSL = new QAction(tr("Upload queued QSOs to LoTW"), this); //qDebug() << Q_FUNC_INFO << ": AdifLoTWExportWidget to be created " << QTime::currentTime().toString("hh:mm:ss") ; adifLoTWExportWidget = new AdifLoTWExportWidget(dataProxy, Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << ": ShowAdifImportWidget to be created " << QTime::currentTime().toString("hh:mm:ss") ; showAdifImportWidget = new ShowAdifImportWidget(dataProxy, Q_FUNC_INFO); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << ": END " << QTime::currentTime().toString("hh:mm:ss") ; } MainWindow::~MainWindow() { logEvent(Q_FUNC_INFO, "Start", Debug); if (hamlibActive) { hamlib->stop(); } delete(showErrorDialog); delete(lotwUtilities); delete(eqslUtilities); delete(elogQRZcom); delete(elogClublog); delete(downloadcty); delete(world); delete(locator); delete(qso); delete(backupQSO); delete(dateTime); delete(dateTimeTemp); delete(awards); delete(softUpdate); delete(filemanager); delete(fileAwardManager); delete(util); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::saveWindowsSize() { //qDebug() << Q_FUNC_INFO ; logEvent(Q_FUNC_INFO, "Start", Debug); windowSize = this->size(); //int height = windowSize.height(); //int width = windowSize.width(); QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.setValue ("MainWindowSize", windowSize); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainWindow::windowsSizeAndPosition: END" ; } void MainWindow::setWindowSize(const QSize &_size) { logEvent(Q_FUNC_INFO, "Start", Debug); //QSize size; //size.setHeight(_height); //size.setWidth(_width); if (_size.isValid ()) { this->resize(_size); } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::init() { //qDebug() << Q_FUNC_INFO << " - Start - " << (QTime::currentTime()).toString("HH:mm:ss") ; logLevel = Debug; logEvent(Q_FUNC_INFO, "Start", Debug); if (!QDir::setCurrent ( util->getHomeDir () )){ QDir d1(util->getHomeDir ()); if (d1.mkdir(util->getHomeDir ())) { if (!QDir::setCurrent ( util->getHomeDir () )) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - KLog folder not found")); QString aux = tr("It was not possible to define the KLog folder. Some functions may not work properly!"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } } } QFile debugFile(util->getDebugLogFile()); if (!debugFile.open(QIODevice::WriteOnly | QIODevice::Text)) /* Flawfinder: ignore */ { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - File not open")); QString aux = tr("It was not possible to open the debug file for writing. No debug log will be saved!"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } else { debugFile.close(); logEvent(Q_FUNC_INFO, "KLog started!", Debug); } //qDebug() << Q_FUNC_INFO << " - 00" ; util->setLongPrefixes(dataProxy->getLongPrefixes()); util->setSpecialCalls(dataProxy->getSpecialCallsigns()); //qDebug() << Q_FUNC_INFO << " - 000" ; setupDialog->init(softwareVersion, 0, configured); //qDebug() << Q_FUNC_INFO << " - 01" ; filemanager->init(); manualMode = false; qrzAutoChanging = false; QRZCOMAutoCheckAct->setCheckable(true); QRZCOMAutoCheckAct->setChecked(false); logEvents = true; hamlib->initClass(); util->setCallValidation (true); infoLabel1T = QString(); infoLabel2T = QString(); qso->clear(); //Default band/modes bands << "10M" << "15M" << "20M" << "40M" << "80M" << "160M"; modes << "SSB" << "CW"; //qDebug() << Q_FUNC_INFO << " - 00" << (QTime::currentTime()).toString("HH:mm:ss") ; hamlibActive = false; hamlibModeNotADIFSupported = false; hamlibChangingMode = false; yearChangedDuringModification = false; readingTheUI = false; itIsANewversion = false; setCleaning(false); //qDebug() << Q_FUNC_INFO << " - 10" ; dxClusterWidget->init(); infoTimeout = 2000; // default timeout defaultADIFLogFile = "klog.adi"; InValidCharsInPrevCall = false; checkNewVersions = true; reportInfo = false; configured = false; noMoreErrorShown = false; noMoreModeErrorShown = false; qslingNeeded = false; // When clicking on Find QSO to QSL manageMode = false; txFreqBeingAutoChanged = false; //rxFreqBeingChanged = false; updatingBands = false; selectedYear = 0; defaultMode = 1; defaultBand = 1; //qDebug() << Q_FUNC_INFO << " - 20" << (QTime::currentTime()).toString("HH:mm:ss") ; currentMode = 1; currentModeShown = currentMode; currentBand = 1; currentBandShown = currentBand; currentLog = 1; operatorQRZ = ""; stationCallsign = ""; mainQRZ = ""; dxLocator =""; UDPServerStart = false; // By default the UDP server is started //qDebug() << Q_FUNC_INFO << " - 30" << (QTime::currentTime()).toString("HH:mm:ss") ; currentEntity = -1; // To optimize the calls to different world methods if the entity does not change. Used in slotQRZTextChanged previousEntity = -1;// To optimize the calls to different world methods if the entity does not change. completeWithPrevious=false; completedWithPreviousQTH=false; completedWithPreviousLocator=false; completedWithPreviousName=false; completedWithPreviousIOTA=false; completedWithPreviousQSLVia=false; alwaysADIF=false; useDefaultLogFileName=false; needToSave=false; qrzSmallModDontCalculate=false; imperialSystem=false; sendQSLWhenRec = true; manageDxMarathon = false; dxClusterShowHF=true; dxClusterShowVHF=true; dxClusterShowWARC=true; dxClusterShowWorked=true; dxClusterShowConfirmed=true; dxClusterShowAnn=true; dxClusterShowWWV=true; dxClusterShowWCY=true; dxclusterSendSpotsToMap = false; keepSatPage = false; //qDebug() << Q_FUNC_INFO << " - 40" << (QTime::currentTime()).toString("HH:mm:ss") ; clublogActive = false; clublogRealTime = false; eQSLActive = false; qrzcomActive = false; lotwActive = false; qrzcomSubscriber = false; callingUpdate = false; // to control whether the update is mannually launched or at the begining setModifying(false); //qDebug() << Q_FUNC_INFO << " - 50" << (QTime::currentTime()).toString("HH:mm:ss") ; selectedYear = (dateTime->currentDateTime()).date().year(); loggWinAct->setShortcut(Qt::CTRL + Qt::Key_L); palRed.setColor(QPalette::Text, Qt::red); palBlack.setColor(QPalette::Text, Qt::black); clublogAnswer = -1; defaultColor.setNamedColor("slategrey"); neededColor.setNamedColor("yellow"); workedColor.setNamedColor("blue"); confirmedColor.setNamedColor("red"); newOneColor.setNamedColor("green"); //qDebug() << Q_FUNC_INFO << " - 60" << (QTime::currentTime()).toString("HH:mm:ss") ; bool existingData = QFile::exists(util->getKLogDBFile()); //qDebug() << Q_FUNC_INFO << " - 60.1" ; ctyDatFile = util->getCTYFile(); //qDebug() << Q_FUNC_INFO << " - 60.2" ; if (!existingData) { //qDebug() << Q_FUNC_INFO << " - 61" ; world->create(ctyDatFile); //qDebug() << Q_FUNC_INFO << " - 62" ; } else if (!world->hasSpecialEntities()) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - CTY.dat update")); msgBox.setText(tr("KLog needs to update the Entities database.")); msgBox.setDetailedText(tr("You can update the entities database in Tools->Update cty.csv")); msgBox.setInformativeText(tr("Do you want to update now?")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes : slotUpdateCTYDAT(); break; default: break; } //qDebug() << Q_FUNC_INFO << " - 69" << (QTime::currentTime()).toString("HH:mm:ss") ; } //qDebug() << Q_FUNC_INFO << " - 70" << (QTime::currentTime()).toString("HH:mm:ss") ; //qDebug() << Q_FUNC_INFO << " - Reading config file" ; if (util->fileExists (util->getCfgFile ())) { UpdateSettings settingsUpdate; if (settingsUpdate.updateFile ()) { UpdateSettings settingsUpdate; if (settingsUpdate.updateFile ()) { //configured = loadSettings (); } configured = loadSettings (); } } QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.setValue ("Version", softwareVersion); mapWindow->init(); //qDebug() << Q_FUNC_INFO << " - 71" << (QTime::currentTime()).toString("HH:mm:ss") ; logWindow->createlogPanel(currentLog); //qDebug() << Q_FUNC_INFO << " - 72" << (QTime::currentTime()).toString("HH:mm:ss") ; awards->setManageModes(manageMode); //qDebug() << Q_FUNC_INFO << " - 73" << (QTime::currentTime()).toString("HH:mm:ss") ; if (dataProxy->getNumberOfManagedLogs()<1) { //qDebug() << Q_FUNC_INFO << " - 73.1" << (QTime::currentTime()).toString("HH:mm:ss") ; openSetup(6); //qDebug() << Q_FUNC_INFO << " - 73.2" << (QTime::currentTime()).toString("HH:mm:ss") ; } //qDebug() << Q_FUNC_INFO << " - 74" << (QTime::currentTime()).toString("HH:mm:ss") ; //qDebug() << Q_FUNC_INFO << " - 75" << (QTime::currentTime()).toString("HH:mm:ss") ; awardsWidget->fillOperatingYears(); awardsWidget->showAwards(); awardsWidget->setManageDXMarathon(manageDxMarathon); dxClusterWidget->setCurrentLog(currentLog); //qDebug() << Q_FUNC_INFO << " - 80" << (QTime::currentTime()).toString("HH:mm:ss") ; //qDebug() << "MainWindow::Init: calling Software update ..." << (QTime::currentTime()).toString("HH:mm:ss") ; if (checkNewVersions) {//reportInfo if (reportInfo) { softUpdate->addCall(stationCallsign); } softUpdate->needToUpdate(); } //qDebug() << Q_FUNC_INFO << " - 90" << (QTime::currentTime()).toString("HH:mm:ss") ; currentBandShown = dataProxy->getIdFromBandName(mainQSOEntryWidget->getBand()); //qDebug() << Q_FUNC_INFO << " - 91" << (QTime::currentTime()).toString("HH:mm:ss") ; currentModeShown = dataProxy->getIdFromModeName(mainQSOEntryWidget->getMode()); //qDebug() << Q_FUNC_INFO << " - 92" << (QTime::currentTime()).toString("HH:mm:ss") ; currentBand = currentBandShown; currentMode = currentModeShown; timerInfoBars = new QTimer(this); //qDebug() << Q_FUNC_INFO << " - Calling createUI" << (QTime::currentTime()).toString("HH:mm:ss") ; createUI(); //qDebug() << Q_FUNC_INFO << " - Calling slotClearButtonClicked" << (QTime::currentTime()).toString("HH:mm:ss") ; //qDebug() << Q_FUNC_INFO << " - 100"; slotClearButtonClicked(Q_FUNC_INFO); //qDebug() << Q_FUNC_INFO << " - 110"; infoWidget->showInfo(-1); //qDebug() << Q_FUNC_INFO << " - 120"; //lotwTQSLpath = util->getTQSLsPath() + util->getTQSLsFileName(); world->readWorld (); upAndRunning = true; mainQSOEntryWidget->setUpAndRunning(upAndRunning); //qDebug() << Q_FUNC_INFO << " - 130"; applySettings (); //qDebug() << Q_FUNC_INFO << " - END" << (QTime::currentTime()).toString("HH:mm:ss") ; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::createActionsCommon(){ // Functional widgets connections //TODO: Reimplement the possibility to enter a QSO with enter inthe following widgets: //connect(qslViaLineEdit, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); logEvent(Q_FUNC_INFO, "Start", Debug); connect(util, SIGNAL(debugLog(QString, QString, DebugLogLevel)), this, SLOT(slotCaptureDebugLogs(QString, QString, DebugLogLevel))); //qDebug() << Q_FUNC_INFO << " - Connecting QSO"; connect(qso, SIGNAL(debugLog(QString, QString, DebugLogLevel)), this, SLOT(slotCaptureDebugLogs(QString, QString, DebugLogLevel))); //qDebug() << Q_FUNC_INFO << " - Connected QSO"; connect(QSOTabWidget, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); connect(QSOTabWidget, SIGNAL(dxLocatorChanged(QString)), this, SLOT(slotLocatorTextChanged(QString) ) ); connect(myDataTabWidget, SIGNAL(myLocChangedSignal(QString)), this, SLOT(slotMyLocatorTextChanged(QString) ) ); connect(myDataTabWidget, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); connect(myDataTabWidget, SIGNAL(debugLog(QString, QString, DebugLogLevel)), this, SLOT(slotCaptureDebugLogs(QString, QString, DebugLogLevel)) ); connect(QSOTabWidget, SIGNAL(rxFreqChanged(double)), this, SLOT(slotFreqRXChanged(double) )) ; connect(QSOTabWidget, SIGNAL(txFreqChanged(double)), this, SLOT(slotFreqTXChanged(double) )) ; connect(QSOTabWidget, SIGNAL(handOverFocusSignal()), this, SLOT(slotTakeOverFocusToMainQSOInput() )); connect(loggWinAct, SIGNAL(triggered()), this, SLOT(slotLogWinShow())); //Buttons Actions connect(mainQSOEntryWidget, SIGNAL(handOverFocusSignal()), this, SLOT(slotTakeOverFocusToQSOTabWidget())); connect(mainQSOEntryWidget, SIGNAL(currentQRZSignal(QString)), this, SLOT(slotQRZTextChanged(QString))); connect(mainQSOEntryWidget, SIGNAL(debugLog(QString, QString, DebugLogLevel)), this, SLOT(slotCaptureDebugLogs(QString, QString, DebugLogLevel)) ); connect(mainQSOEntryWidget, SIGNAL(showInfoLabel(QString)), this, SLOT(slotShowInfoLabel(QString)) ); connect(mainQSOEntryWidget, SIGNAL(clearForNextQSOSignal(QString)), this, SLOT(slotClearButtonClicked(QString)) ); connect(mainQSOEntryWidget, SIGNAL(OKClicked()), this, SLOT(slotQRZReturnPressed() ) ); connect(mainQSOEntryWidget, SIGNAL(bandChanged(QString)), this, SLOT(slotBandChanged(QString) ) ); connect(mainQSOEntryWidget, SIGNAL(modeChanged(QString)), this, SLOT(slotModeChanged(QString) ) ); connect(mainQSOEntryWidget, SIGNAL(validBands(QStringList)), this, SLOT(slotValidBandsReceived(QStringList) ) ); connect(mainQSOEntryWidget, SIGNAL(manualModeSignal(bool)), this, SLOT(slotManualMode(bool) ) ); // LOGVIEW connect(logWindow, SIGNAL(actionQSODoubleClicked ( int ) ), this, SLOT(slotDoubleClickLog( const int ) ) ); connect(logWindow, SIGNAL(actionDeleteQSO ( int ) ), this, SLOT(slotQSODelete(int) ) ); connect(logWindow, SIGNAL(deleteTheseQSOs ( QList ) ), this, SLOT(slotQSOsDelete(QList) ) ); connect(logWindow, SIGNAL(exportToADIFTheseQSOs ( QList ) ), this, SLOT(slotQSOsExportToADIF(QList) ) ); connect(logWindow, SIGNAL(updateAwards() ), this, SLOT(slotShowAwards() ) ); connect(logWindow, SIGNAL(queryError(QString, QString, QString, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, QString, QString)) ); //CLUSTER connect(dxClusterWidget, SIGNAL(dxspotclicked(QStringList)), this, SLOT(slotAnalyzeDxClusterSignal(QStringList) ) ); connect(dxClusterWidget, SIGNAL(dxspotArrived(QString, QString, double)), this, SLOT(slotDXClusterSpotArrived(QString, QString, double) ) ); // CLUBLOG connect (elogClublog, SIGNAL (showMessage(QString)), this, SLOT (slotElogClubLogShowMessage(QString))); connect (elogClublog, SIGNAL (actionReturnDownload(int, int)), this, SLOT (slotElogClubLogProcessAnswer(int, int))); connect (elogClublog, SIGNAL (disableClubLogAction(bool)), this, SLOT (slotElogClubLogDisable(bool))); connect (elogClublog, SIGNAL (signalFileUploaded(QNetworkReply::NetworkError, QList)), this, SLOT (slotElogClubLogFileUploaded(QNetworkReply::NetworkError, QList))); connect (eqslUtilities, SIGNAL (showMessage(QString)), this, SLOT (slotElogClubLogShowMessage(QString))); connect (eqslUtilities, SIGNAL (signalFileUploaded(QNetworkReply::NetworkError, QList)), this, SLOT (slotElogEQSLFileUploaded(QNetworkReply::NetworkError, QList))); // QRZCOM connect (elogQRZcom, SIGNAL (showMessage(QString)), this, SLOT (slotElogQRZCOMShowMessage(QString))); connect (elogQRZcom, SIGNAL (dataFoundSignal(QString, QString)), this, SLOT (slotElogQRZCOMFoundData(QString, QString))); connect (elogQRZcom, SIGNAL (signalLogUploaded(QNetworkReply::NetworkError, QList)), this, SLOT (slotElogQRZCOMLogUploaded(QNetworkReply::NetworkError, QList))); //connect (elogQRZcom, SIGNAL (disableQRZAction(bool)), this, SLOT (slotElogQRZCOMDisable(bool))); connect(world, SIGNAL(queryError(QString, QString, QString, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, QString, QString)) ); // QSL TAB connect(QSLTabWidget, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed()) ); // SEARCH TAB connect(searchWidget, SIGNAL(actionQSODoubleClicked ( int ) ), this, SLOT(slotDoubleClickLog( const int ) ) ); connect(searchWidget, SIGNAL(updateAwards() ), this, SLOT(slotShowAwards() ) ); connect(searchWidget, SIGNAL(logRefresh() ), this, SLOT(slotLogRefresh() ) ); connect(searchWidget, SIGNAL(toStatusBar(QString) ), this, SLOT(slotUpdateStatusBar(QString) ) ); connect(searchWidget, SIGNAL(requestBeingShown() ), this, SLOT(slotShowSearchWidget() ) ); connect(searchWidget, SIGNAL(actionQSODelete( int ) ), this, SLOT(slotQSODelete(int) ) ); connect(searchWidget, SIGNAL(queryError(QString, QString, QString, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, QString, QString)) ); connect(awards, SIGNAL(queryError(QString, QString, QString, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, QString, QString)) ); connect(awards, SIGNAL(awardDXCCUpdated()), this, SLOT(slotRefreshDXCCWidget()) ); connect(awardsWidget, SIGNAL(debugLog(QString, QString, DebugLogLevel)), this, SLOT(slotCaptureDebugLogs(QString, QString, DebugLogLevel)) ); connect(awardsWidget, SIGNAL(requireCurrentLogSignal()), this, SLOT(slotAwardsWidgetSetLog()) ); connect(awardsWidget, SIGNAL(requireCurrentYearSignal()), this, SLOT(slotAwardsWidgetSetYear()) ); //DXCCWIDGET TAB //connect(dxccStatusWidget, SIGNAL(showQso(int)), this, SLOT(slotShowQSOFromDXCCWidget(int) ) ); connect(dxccStatusWidget, SIGNAL(debugLog(QString, QString, DebugLogLevel)), this, SLOT(slotCaptureDebugLogs(QString, QString, DebugLogLevel)) ); connect(dxccStatusWidget, SIGNAL(showQsos(QList)), this, SLOT(slotShowQSOsFromDXCCWidget(QList) ) ); connect(dxccStatusWidget, SIGNAL(fillInQSOSignal()), this, SLOT(fillQSOData()) ); //connect(dxccStatusWidget, SIGNAL(updateAwards()), this, SLOT(slotShowAwards() ) ); connect(filemanager, SIGNAL(queryError(QString, QString, QString, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, QString, QString)) ); connect(filemanager, SIGNAL(addQSOToList(QStringList)), this, SLOT(slotReceiveQSOListToShowFromFile(QStringList)) ); //connect(scoreeWinAct, SIGNAL(triggered()), this, SLOT(slotScoreWinShow())); // UDPLogServer - WSJT-x connect(UDPLogServer, SIGNAL(status_update(int, QString, double, QString, QString, QString, QString, QString, QString)), this, SLOT(slotWSJXstatusFromUDPServer(int, QString, double, QString, QString, QString, QString, QString, QString) ) ); connect(UDPLogServer, SIGNAL( logged_qso(QString, QString, QString, double, QString, QString, QString, QString, QString, QString, QString, QString, QDateTime, QDateTime, QString, QString, QString)), this, SLOT(slotWSJTXloggedQSO (QString, QString, QString, double, QString, QString, QString, QString, QString, QString, QString, QString, QDateTime, QDateTime, QString, QString, QString) ) ); connect(UDPLogServer, SIGNAL(clearSignal(QString)), this, SLOT(slotClearButtonClicked(QString) ) ); connect(this, SIGNAL(queryError(QString, QString, QString, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, QString, QString)) ); connect(setupDialog, SIGNAL(debugLog(QString, QString, DebugLogLevel)), this, SLOT(slotCaptureDebugLogs(QString, QString, DebugLogLevel)) ); connect(setupDialog, SIGNAL(queryError(QString, QString, QString, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, QString, QString)) ); connect(setupDialog, SIGNAL(exitSignal(int)), this, SLOT(slotExitFromSlotDialog(int)) ); //connect(setupDialog, SIGNAL(qrzcomAuto(bool)), this, SLOT(slotElogQRZCOMAutoCheckFromSetup(bool)) ); connect(setupDialog, SIGNAL(finished(int)), this, SLOT(slotSetupDialogFinished(int)) ); connect(tipsDialog, SIGNAL(debugLog(QString, QString, DebugLogLevel)), this, SLOT(slotCaptureDebugLogs(QString, QString, DebugLogLevel)) ); connect(tipsDialog, SIGNAL(findQSL2QSOSignal()), this, SLOT(slotSearchToolNeededQSLToSend()) ); connect(tipsDialog, SIGNAL(fillInDXCCSignal()), this, SLOT(slotFillEmptyDXCCInTheLog()) ); connect(tipsDialog, SIGNAL(fillInQSOSignal()), this, SLOT(fillQSOData()) ); connect(tipsDialog, SIGNAL(fileExportToPrintSignal()), this, SLOT(slotRQSLExport()) ); connect(tipsDialog, SIGNAL(fileOpenKLogFolderSignal()), this, SLOT(slotOpenKLogFolder())); connect(tipsDialog, SIGNAL(toolSendPendingQSLSignal()), this, SLOT(slotToolSearchRequestedQSLToSend())); connect(tipsDialog, SIGNAL(toolRecPendingQSLSignal()), this, SLOT(slotToolSearchNeededQSLPendingToReceive())); connect(tipsDialog, SIGNAL(toolRecRecPendingQSLSignal()), this, SLOT(slotToolSearchNeededQSLRequested())); connect(tipsDialog, SIGNAL(toolsUploadLoTWSignal()), this, SLOT(slotLoTWExport())); // SATELLITES TAB //connect(satTabWidget, SIGNAL(newBandsToBeAdded(QStringList)), this, SLOT(slotDefineNewBands(QStringList)) ); connect(satTabWidget, SIGNAL(satTxFreqChanged(double)), this, SLOT(slotFreqTXChangedFromSat(double) ) ); //connect(satTabWidget, SIGNAL(satRxFreqChanged(double)), this, SLOT(slotFreqRXChanged(double) ) ); //connect(satTabWidget, SIGNAL(dxLocatorChanged(QString)), this, SLOT(slotUpdateLocator(QString)) ); connect(satTabWidget, SIGNAL(setPropModeSat(QString,bool)), this, SLOT(slotSetPropModeFromSat(QString,bool)) ) ; connect(satTabWidget, SIGNAL(satTXFreqNeeded(double)), this, SLOT(slotFreqTXChanged(double))); connect(satTabWidget, SIGNAL(satRXFreqNeeded(double)), this, SLOT(slotFreqRXChanged(double))); //connect(satTabWidget, SIGNAL (satBandTXChanged(QString)), this, SLOT (slotSatBandTXComboBoxChanged(QString))); connect(satTabWidget, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed()) ); connect(othersTabWidget, SIGNAL(debugLog(QString, QString, DebugLogLevel)), this, SLOT(slotCaptureDebugLogs(QString, QString, DebugLogLevel)) ); connect(othersTabWidget, SIGNAL(setPropMode(QString)), this, SLOT(slotSetPropModeFromOther(QString)) ) ; connect(downloadcty, SIGNAL(done(bool)), this, SLOT(slotWorldReload(bool)) ); connect(timerInfoBars, SIGNAL(timeout()), this, SLOT(slotTimeOutInfoBars()) ); connect(hamlib, SIGNAL(freqChanged(double)), this, SLOT(slotHamlibTXFreqChanged(double)) ); connect(hamlib, SIGNAL(modeChanged(QString)), this, SLOT(slotHamlibModeChanged(QString)) ); connect(lotwUtilities, SIGNAL(actionProcessLoTWDownloadedFile(QString)), this, SLOT(slotLoTWDownloadedFileProcess(QString)) ); connect(adifLoTWExportWidget, SIGNAL(qsosToSend(QString, QList, ExportMode)), this, SLOT(slotADIFExportSelection(QString, QList, ExportMode)) ); connect(dataProxy, SIGNAL(queryError(QString, QString, QString, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, QString, QString)) ); connect(dataProxy, SIGNAL(debugLog(QString, QString, DebugLogLevel)), this, SLOT(slotCaptureDebugLogs(QString, QString, DebugLogLevel)) ); connect(showKLogLogWidget, SIGNAL(newLogLevel(DebugLogLevel)), this, SLOT(slotNewLogLevel(DebugLogLevel)) ); //connect(this, SIGNAL(focusC), this, SLOT(slotTimeOutInfoBars()) ); // Following calls answer calls from the QSO to receive information. connect (qso, SIGNAL(getBandSignal(double)), this, SLOT(slotQSO_SetBand(double))); connect (qso, SIGNAL(getModeSignal(QString)), this, SLOT(slotQSO_SetMode(QString))); connect(qso, SIGNAL(queryError(QString, QString, QString, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, QString, QString)) ); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotQSO_SetBand(const double _fr) { qso->setBand (dataProxy->getBandNameFromFreq (_fr)); } void MainWindow::slotQSO_SetMode(const QString _submode) { qso->setMode (dataProxy->getNameFromSubMode (_submode)); } void MainWindow::recommendBackupIfNeeded() { logEvent(Q_FUNC_INFO, "Start", Debug); if (dataProxy->getHowManyQSOInLog(-1)<1) { logEvent(Q_FUNC_INFO, "END-1", Debug); return; } QDateTime lastBackupDate; lastBackupDate = QDateTime(); lastBackupDate = filemanager->getDateTimeOfLastBackup(); //qDebug() << Q_FUNC_INFO << " - lastDate: " << util->getDateTimeSQLiteStringFromDateTime(lastBackupDate) << (QTime::currentTime()).toString(" HH:mm:ss") ; bool backupNeeded = false; QString msg; if (lastBackupDate == QDateTime()) { backupNeeded = true; msg = tr("You seem to have never backed up or exported your log to ADIF."); } else if (lastBackupDate.addMonths(1) < QDateTime::currentDateTime()) { //qDebug() << Q_FUNC_INFO << " - More than a month" << (QTime::currentTime()).toString(" HH:mm:ss") ; backupNeeded = true; msg = tr("Your latest backup seems older than one month."); } if (backupNeeded) { //qDebug() << Q_FUNC_INFO << " - We need to backup" << (QTime::currentTime()).toString(" HH:mm:ss") ; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); //msg = msg + tr("Do you want to backup your logs now?"); //msgBox.setText(msg); msgBox.setWindowTitle(tr("Log backup recommended!")); msgBox.setText(msg); msgBox.setInformativeText(tr("Regular backups prevent data loss and are good operator practice.\n" "Once exported, copy your ADIF file to a safe place such as a USB drive, cloud drive or other offsite computer.\n\n" "KLog will remind you to backup on a monthly basis.\n\n")); msgBox.addButton(QMessageBox::Yes); msgBox.addButton(QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: QString filename = util->getBackupADIFile(); //qDebug() << Q_FUNC_INFO << " - Backup to: " << filename << (QTime::currentTime()).toString(" HH:mm:ss") ; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - Backup")); if (filemanager->adifLogExport(filename, 0)) // 0 will save ALL the logs) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("Backup completed successfully")); msgBox.setInformativeText(tr("KLog will remind you again in approximately one month.")); } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("Backup failed.")); msgBox.setInformativeText(tr("Periodic data backups are recommended to prevent data loss and corruption of your log.")); } msgBox.exec(); break; } } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::checkIfNewVersion() { //qDebug() << Q_FUNC_INFO << " - " << util->getVersion(); logEvent(Q_FUNC_INFO, "Start", Debug); //itIsANewversion = true; if (itIsANewversion) { if (util->getVersion() == "2.2") { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog - New version detected!")); msgBox.setText(tr("This version of KLog requires that the DXCC database is updated.")); msgBox.setInformativeText(tr("The database will be updated.")); msgBox.exec(); slotWorldReload(true); } QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog - New version detected!")); msgBox.setText(tr("It seems that you are running this version of KLog for the first time.")); msgBox.setInformativeText(tr("The setup will now open to allow you to change your settings.")); msgBox.exec(); openSetup(0); } //qDebug() << Q_FUNC_INFO << " - END" ; } void MainWindow::createStatusBar() { logEvent(Q_FUNC_INFO, "Start", Debug); statusBar()->showMessage(tr("Ready")); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotShowMap() { Coordinate center = locator->getLocatorCoordinate(world->getQRZLocator(stationCallsign)); mapWindow->setCenter(center); QSize size = this->size(); //qDebug() << Q_FUNC_INFO << QString(" - Size: %1x%2").arg(size.width()).arg(size.height()); size = size/2; //qDebug() << Q_FUNC_INFO << QString(" - Size: %1x%2").arg(size.width()).arg(size.height()); mapWindow->resize(size); mapWindow->show(); //QStringList a; //a.clear(); //a << dataProxy->getFilteredLocators("All", "All", "All", "All"); //a << locator->getAll(); //foreach (QString ai, a) //{ // mapWindow->addMarker (locator->getLocatorCoordinate (ai)); //} //mapWindow->addLocators(a, QColor(0, 0, 255, 127)); } void MainWindow::setMainWindowTitle() { QString aux = dataProxy->getCommentsFromLog(currentLog); int numberOfQSOs = dataProxy->getHowManyQSOInLog (currentLog); //qDebug() << Q_FUNC_INFO << " - (comment): " << aux ; QString msg; if (mainQRZ == stationCallsign) { msg = QString(tr("KLog-%1 - Logbook of %2 - QSOs: %3" )).arg(softwareVersion).arg(stationCallsign).arg(numberOfQSOs); } else { msg = QString(tr("KLog-%1 - Logbook of %2 - Station Callsign: %3 - QSOs: %4" )).arg(softwareVersion).arg(mainQRZ).arg(stationCallsign).arg(numberOfQSOs); } if (aux.length ()>0) { setWindowTitle(QString("%1 - %2").arg(msg).arg(aux)); } else { setWindowTitle(msg); } } void MainWindow::createUI() { //qDebug() << Q_FUNC_INFO << " - Start"; logEvent(Q_FUNC_INFO, "Start", Debug); createStatusBar(); setWindowTitle(tr("KLog")); createUIDX(); createActionsCommon(); createMenusCommon(); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << " - END" ; } void MainWindow::slotTimeOutInfoBars() { logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << " - - Start" ; slotShowInfoLabel(infoLabel1T); //slotShowInfoLabel(infoLabel2T); //infoLabel1->setText(infoLabel1T); infoLabel2->setText(infoLabel2T); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::setModeFromFreq() { //TODO: define frequency ranges for the different modes if (hamlibActive && !manualMode) { if (QSOTabWidget->getTXFreq () >= dataProxy->getLowLimitBandFromBandName("20M")) { hamlib->setMode("USB"); } else { hamlib->setMode("LSB"); } if (!hamlibChangingMode) { hamlib->setMode(mainQSOEntryWidget->getMode()); } } } void MainWindow::slotBandChanged (const QString &_b) { //qDebug() << Q_FUNC_INFO << " - " << _b ; logEvent(Q_FUNC_INFO, "Start", Debug); if ((!upAndRunning) || (_b.length()<2)) { //qDebug() << Q_FUNC_INFO << " - !upAndRunning or band short" ; return; } if (updatingBands) { //qDebug() << "MainWindow::slotBandChanged: updating Bands" ; logEvent(Q_FUNC_INFO, "END-1", Debug); return; } bool isFRinBand = dataProxy->isThisFreqInBand(_b, QString::number(QSOTabWidget->getTXFreq ())); if ((isFRinBand) && (QSOTabWidget->getTXFreq () >0 )) { // No change in txFreq //qDebug() << "MainWindow::slotBandChanged: isFRinBand and Freq >0" ; logEvent(Q_FUNC_INFO, "END-2", Debug); return; } currentBandShown = dataProxy->getIdFromBandName(_b); currentModeShown = dataProxy->getIdFromModeName(mainQSOEntryWidget->getMode()); currentBand = currentBandShown; currentMode = currentModeShown; if ((!isFRinBand) || (QSOTabWidget->getTXFreq()<=0)) { //qDebug() << "MainWindow::slotBandChanged: Freq is not in band or empty" ; //qDebug() << "MainWindow::slotBandChanged: Band: " << mainQSOEntryWidget->getBand() ; //qDebug() << "MainWindow::slotBandChanged: Freq: " << QString::number(QSOTabWidget->getTXFreq()) ; double txFr = (dataProxy->getFreqFromBandId(currentBandShown)).toDouble(); //qDebug() << "MainWindow::slotBandChanged: New Freq: " << QString::number(txFr) ; slotFreqTXChanged (txFr); //if (!dataProxy->isThisFreqInBand(_b, QString::number(rxFreqSpinBox->value ()))) //{ // rxFreqSpinBox->setvalue (QSOTabWidget->getTXFreq()); //} } //qDebug() << "MainWindow::slotBandChanged: Checking to update Freq - DONE" ; QStringList _qs; //for the showStatusOfDXCC(const QStringList _qs) _qs.clear(); _qs << QString::number(currentEntity) << QString::number(currentBandShown) << QString::number(currentModeShown) << QString::number(currentLog); //qDebug() << "MainWindow:: - calling showStatusOfDXCC-02 " ; if (currentEntity>0) { showStatusOfDXCC(_qs); } logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainWindow::slotBandChanged: END" ; } void MainWindow::slotModeChanged (const QString &_m) { logEvent(Q_FUNC_INFO, "Start", Debug); if (!upAndRunning) { return; } //qDebug() << "MainWindow::slotModeChanged: " << _m ; currentBandShown = dataProxy->getIdFromBandName(mainQSOEntryWidget->getBand()); //qDebug() << "MainWindow::slotModeComboBoxChanged: currentBandShown2: " << QString::number(currentBandShown) ; currentModeShown = dataProxy->getIdFromModeName(_m); currentBand = currentBandShown; currentMode = currentModeShown; QStringList _qs; //for the showStatusOfDXCC(const QStringList _qs) _qs.clear(); //qDebug() << "MainWindow:: - calling showStatusOfDXCC-01 " ; _qs << QString::number(currentEntity) << QString::number(currentBandShown) << QString::number(currentModeShown) << QString::number(currentLog); showStatusOfDXCC(_qs); if (!modify) { QSOTabWidget->setRSTToMode(mainQSOEntryWidget->getMode(), readingTheUI); } //QString _modeSeen = mainQSOEntryWidget->getMode(); if (hamlibActive && !manualMode) { hamlib->setMode (mainQSOEntryWidget->getMode()); } /* if (_modeSeen == "SSB") { setModeFromFreq(); } */ logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << " - " << mainQSOEntryWidget->getMode() ; } void MainWindow::slotQRZReturnPressed() { logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << " - Start" ; if (mainQSOEntryWidget->getQrz().length()<=0) { //qDebug() << Q_FUNC_INFO << " - no QRZ" ; return; } readingTheUI = true; if (!readQSOFromUI ()) {return;} //qDebug() << Q_FUNC_INFO << ": " << QString("Modifying QSO %1").arg(modifyingQSO); bool addedOK = qso->toDB (modifyingQSO); if (addedOK) { qso->clear(); actionsJustAfterAddingOneQSO(); } // Just to prepare or some tasks before reading DATA from UI yearChangedDuringModification = false; readingTheUI = false; QString lastLocator = dataProxy->getLocatorFromId(dataProxy->getLastQSOid()); //qDebug() << Q_FUNC_INFO << ": Locator: " << lastLocator; mapWindow->addLocator(lastLocator, workedColor); //qDebug() << Q_FUNC_INFO << "Just before cleaning"; slotClearButtonClicked(Q_FUNC_INFO); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::actionsJustAfterAddingOneQSO() { //qDebug() << Q_FUNC_INFO << " - Start" ; logEvent(Q_FUNC_INFO, "Start", Debug); int lastId = -1; needToSave = true; if (modify) { //qDebug() << Q_FUNC_INFO << " - Modifying! " ; needToSave = true; if(modifyingQSO>0) { awards->setAwards(modifyingQSO); if (yearChangedDuringModification) { awardsWidget->fillOperatingYears(); yearChangedDuringModification = false; } if ((clublogActive) && (clublogRealTime)) { //qDebug() << Q_FUNC_INFO << " - (Modifiying ClubLog) Lastid: "<< QString::number(lastId) ; // Delete QSO in CLubLog elogClublog->deleteQSO(clublogPrevQSO); // Add modified QSO in ClubLog elogClublog->sendQSO(dataProxy->getClubLogRealTimeFromId(modifyingQSO)); } else { //qDebug() << Q_FUNC_INFO << " - (No ClubLog) Lastid: "<< QString::number(lastId) ; } awards->setAwards(modifyingQSO); //Update the DXCC award status } // CHECK WHAT WAS THE QSOID to add the awards, if needed } else { //qDebug() << Q_FUNC_INFO << " - Not Modifying " ; lastId = dataProxy->getLastQSOid(); if (lastId>=0) { //qDebug() << Q_FUNC_INFO << " - Lastid: "<< QString::number(lastId) ; awards->setAwards(lastId); //Update the DXCC award status // Send to CLUBLOG if enabled if ((clublogActive) && (clublogRealTime)) { //qDebug() << Q_FUNC_INFO << " - (Sending ClubLog) Lastid: "<< QString::number(lastId) ; elogClublog->sendQSO(dataProxy->getClubLogRealTimeFromId(lastId)); } else { //qDebug() << Q_FUNC_INFO << " - (No ClubLog) Lastid: "<< QString::number(lastId) ; } // } else { //qDebug() << Q_FUNC_INFO << " - Lastid < 0 "<< QString::number(lastId) ; } //awards->setAwards(lastId); } logWindow->refresh(); dxccStatusWidget->refresh(); searchWidget->refresh(); awardsWidget->showAwards (); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << " - END" ; } bool MainWindow::readQSOFromUI() { //qDebug() << Q_FUNC_INFO << " - Start" ; logEvent(Q_FUNC_INFO, "Start", Debug); qso->clear (); QString tqrz = (mainQSOEntryWidget->getQrz()).toUpper(); if (!util->isValidCall(tqrz)) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - Not valid call")); QString aux = QString(tr("The callsign %1 is not a valid call. Do you really want to add this callsign to the log?") ).arg(tqrz); msgBox.setText(aux); msgBox.setInformativeText(tr("Adding non-valid calls to the log may create problems when applying for awards, exporting ADIF files to other systems or applications.")); msgBox.setStandardButtons(QMessageBox::Yes|QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Ok was clicked break; case QMessageBox::No: qso->clear (); return false; default: // should never be reached break; } } qso->setCall (tqrz); qso->setBand(mainQSOEntryWidget->getBand()); qso->setMode(dataProxy->getNameFromSubMode (mainQSOEntryWidget->getMode())); qso->setSubmode (mainQSOEntryWidget->getMode()); //qso->setDate (tdate); qso->setLogId (currentLog); qso->setDateTimeOn (mainQSOEntryWidget->getDateTime()); qso->setRSTTX (QSOTabWidget->getRSTTX ()); qso->setRSTRX (QSOTabWidget->getRSTRX ()); int dxcc = world->getQRZARRLId(tqrz); //int dxcc2 = getDXCCFromComboBox(); int dxcc2 = world->getQRZARRLId(othersTabWidget->getEntityPrefix()); dxcc = util->getNormalizedDXCCValue (dxcc); dxcc2 = util->getNormalizedDXCCValue (dxcc2); if (dxcc!=dxcc2) { QString dxccn1 = world->getEntityName(dxcc); dxccn1 = dxccn1 + " - " + world->getEntityMainPrefix(dxcc); QString dxccn2 = world->getEntityName(dxcc2); dxccn2 = dxccn2 + " - " + world->getEntityMainPrefix(dxcc2); QPushButton *button2 = new QPushButton(this); QPushButton *button1 = new QPushButton(this); button1->setText(world->getEntityMainPrefix(dxcc)); button2->setText(world->getEntityMainPrefix(dxcc2)); int ret; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - Select correct entity")); msgBox.setText( tr("You have selected an entity:") + "\n\n"+"- "+dxccn2+"\n\n"+tr("that is different from the KLog proposed entity:") + "\n\n"+ "- "+dxccn1+"\n\n" +tr("Click on the prefix of the correct entity or Cancel to edit the QSO again.")); msgBox.addButton(button2, QMessageBox::AcceptRole); msgBox.addButton(button1, QMessageBox::ActionRole); msgBox.addButton(QMessageBox::Cancel); ret = msgBox.exec(); if (ret == QMessageBox::AcceptRole) { dxcc = dxcc2; } else if (ret == QMessageBox::Cancel) { logEvent(Q_FUNC_INFO, "END-2", Debug); qso->clear (); return false; } } qso->setContinent (dataProxy->getContinentShortNameFromEntity(dxcc)); int cqz = world->getEntityCqz(dxcc); int ituz = world->getEntityItuz(dxcc); qso->setName (QSOTabWidget->getName()); qso->setDistance (infoWidget->getDistance ()); qso->setGridSquare (QSOTabWidget->getDXLocator()); qso->setMyGridSquare (myDataTabWidget->getMyLocator()); qso->setFreqTX (QSOTabWidget->getTXFreq()); qso->setFreqRX (QSOTabWidget->getRXFreq()); qso->setBandRX (dataProxy->getBandNameFromFreq (QSOTabWidget->getRXFreq ())); qso->setQTH (QSOTabWidget->getQTH()); qso->setOperatorCallsign (myDataTabWidget->getOperator()); qso->setStationCallsign (myDataTabWidget->getStationCallsign()); qso->setMyRig (myDataTabWidget->getMyRig()); qso->setMyAntenna (myDataTabWidget->getMyAntenna()); qso->setMySOTA_REF (myDataTabWidget->getMySOTA()); qso->setMyVUCCGrids (myDataTabWidget->getMyVUCCGrids ()); qso->setComment (commentTabWidget->getComment()); qso->setQSLMsg (QSLTabWidget->getQSLMsg()); qso->setDXCC (dxcc); qso->setCQZone (cqz); qso->setItuZone (ituz); qso->setQSLVia (QSLTabWidget->getQSLVia()); qso->setTXPwr (myDataTabWidget->getMyPower()); qso->setRXPwr (QSOTabWidget->getRXPwr ()); qso->setSOTA_REF (othersTabWidget->getSOTA()); qso->setAge (othersTabWidget->getAge()); qso->setVUCCGrids (othersTabWidget->getVUCCGrids ()); qso->setIOTA (othersTabWidget->getIOTA()); qso->setSatName (satTabWidget->getSatName()); qso->setSatMode (satTabWidget->getSatMode()); keepSatPage = satTabWidget->getRepeatThis(); qso->setPropMode (othersTabWidget->getPropModeFromComboBox()); qso->setClubLogStatus (eQSLTabWidget->getClubLogStatus()); //Y, N, M qso->setClubLogDate(eQSLTabWidget->getClubLogDate()); qso->setEQSLQSL_SENT (eQSLTabWidget->getEQSLSenStatus()); qso->setEQSLQSLSDate (eQSLTabWidget->getEQSLSenDate()); qso->setEQSLQSL_RCVD (eQSLTabWidget->getEQSLRecStatus()); qso->setEQSLQSLRDate (eQSLTabWidget->getEQSLRecDate()); qso->setLoTWQSL_SENT (eQSLTabWidget->getLOTWSenStatus()); qso->setLoTWQSLSDate (eQSLTabWidget->getLOTWSenDate()); qso->setLoTWQSL_SENT (eQSLTabWidget->getLOTWRecStatus()); qso->setLoTWQSLRDate (eQSLTabWidget->getLOTWRecDate()); qso->setQSL_SENT (QSLTabWidget->getQSLSenStatus()); qso->setQSLSenVia (QSLTabWidget->getSentVia()); qso->setQSLSDate (QSLTabWidget->getQSLSenDate()); qso->setQSL_RCVD (QSLTabWidget->getQSLRecStatus()); qso->setQSLRecVia (QSLTabWidget->getRecVia()); qso->setQSLRDate (QSLTabWidget->getQSLRecDate()); //qDebug() << Q_FUNC_INFO << " - END" ; logEvent(Q_FUNC_INFO, "END", Debug); return true; } void MainWindow::slotOKButtonClicked(){ logEvent(Q_FUNC_INFO, "Start", Debug); slotQRZReturnPressed(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotQSOsExportToADIF(QList _id) { logEvent(Q_FUNC_INFO, "Start: " + QString::number(_id.length ()), Debug); if (_id.length()<1) { return; // NO QSO TO EXPORT } //qDebug() << Q_FUNC_INFO << " - xxy"; QString fileName = QFileDialog::getSaveFileName(this, tr("Save ADIF File"), util->getHomeDir(), "ADIF (*.adi *.adif)"); //qDebug() << Q_FUNC_INFO << fileName ; if ((!fileName.endsWith(".adi")) && ( !fileName.endsWith(".adif") )) { //qDebug() << "MainWindow::slotQSOsExportToADIF: Adding the .adi to the file" << fileName ; fileName = fileName + ".adi"; } //qDebug() << "MainWindow::slotQSOsExportToADIF-1: " << fileName ; filemanager->adifQSOsExport(fileName, _id); //qDebug() << "MainWindow::slotQSOsExportToADIF-3" ; showNumberOfSavedQSO(fileName, _id.count()); //qDebug() << "MainWindow::slotQSOsExportToADIF - END" ; } void MainWindow::slotQRZcomUpload(QList _id) { logEvent(Q_FUNC_INFO, "Start: " + QString::number(_id.length ()), Debug); elogQRZcom->sendQSOs(_id); //qDebug() << "MainWindow::slotQRZcomUpload - END" ; } void MainWindow::slotQSOsDelete(QList _id) { //qDebug() << "MainWindow::slotQSOsDelete " << QString::number(_id.length()) ; //foreach(int i, _id) //{ // //qDebug() << "MainWindow::slotQSOsDelete " << QString::number(i) ; //} QString message = QString(tr("You have requested to delete several QSOs ")); QMessageBox msgBox; msgBox.setIcon(QMessageBox::Question); msgBox.setText(message); msgBox.setDetailedText(tr("This operation shall remove definitely all the selected QSO and associated data and you will not be able to recover it again.")); msgBox.setInformativeText(tr("Are you sure?")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes : foreach (int i, _id) { QStringList qsoToDelete; qsoToDelete.clear(); qsoToDelete << dataProxy->getClubLogRealTimeFromId(i); if(dataProxy->deleteQSO(i)) { //qDebug() << "MainWindow::slotQSODelete: Just removed from log, now I will try to remove from ClubLog, if needed" ; if (clublogActive && clublogRealTime) { //qDebug() << "MainWindow::slotQSODelete: Removing from ClubLog" ; elogClublog->deleteQSO(qsoToDelete); } else { //qDebug() << "MainWindow::slotQSODelete: NOT emoving from ClubLog" ; } } } dxccStatusWidget->refresh(); logWindow->refresh(); slotShowAwards(); break; case QMessageBox::No : break; } } void MainWindow::slotQSODelete(const int _id) { logEvent(Q_FUNC_INFO, "Start: " + QString::number(_id), Debug); //qDebug() << "MainWindow::slotQSODelete " << QString::number(_id) ; int QSOid = _id; //int x = -1; QString _qrz = dataProxy->getCallFromId(QSOid); if (_qrz.length()>=3) { QString message = QString(tr("You have requested to delete the QSO with: %1").arg(_qrz)); QMessageBox msgBox; msgBox.setIcon(QMessageBox::Question); msgBox.setText(message); msgBox.setInformativeText(tr("Are you sure?")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes : { QStringList qsoToDelete; qsoToDelete.clear(); qsoToDelete << dataProxy->getClubLogRealTimeFromId(QSOid); if(dataProxy->deleteQSO(QSOid)) { //qDebug() << "MainWindow::slotQSODelete: Just removed from log, now I will try to remove from ClubLog, if needed" ; if (clublogActive && clublogRealTime) { //qDebug() << "MainWindow::slotQSODelete: Removing from ClubLog" ; elogClublog->deleteQSO(qsoToDelete); } else { //qDebug() << "MainWindow::slotQSODelete: NOT emoving from ClubLog" ; } dxccStatusWidget->refresh(); logWindow->refresh(); searchWidget->refresh(); slotShowAwards(); //emit updateSearchText(); } else { //TODO: The QSO could not be removed... } } break; case QMessageBox::No : // No was clicked break; default: // should never be reached break; } } else { // TODO: The QSO to be removed was not found in the log } //qDebug() << "MainWindow::slotQSODelete END " ; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotShowSearchWidget() { logEvent(Q_FUNC_INFO, "Start", Debug); dxUpRightTab->setCurrentIndex(dxUpRightTab->indexOf(searchWidget)); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotLogRefresh() { logEvent(Q_FUNC_INFO, "Start", Debug); logWindow->refresh(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotElogClubLogDisable(const bool _b) { //qDebug() << Q_FUNC_INFO; logEvent(Q_FUNC_INFO, "Start", Debug); clublogActive = !_b; //setupDialog->setClubLogActive(clublogActive); QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("ClubLog"); settings.setValue ("ClubLogActive", _b); settings.endGroup(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotElogClubLogFileUploaded (QNetworkReply::NetworkError _error, QList _qsos) { logEvent(Q_FUNC_INFO, "Start: " + QString::number(_error) + "/" + QString::number(_qsos.length ()), Debug); QMessageBox msgBox; if (_error != QNetworkReply::NoError) { msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - ClubLog error")); msgBox.setText(tr("The ClubLog upload process has finished with an error and the log was possibly not uploaded.")); msgBox.setDetailedText(tr("Please check your credentials, your Internet connection and your Clublog account. The received error code was: %1").arg(_error)); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); return; } QString fileName = util->getClubLogFile(); if (QFile::exists(fileName)) { //qDebug() << "MainWindow::slotElogClubLogFileUploaded file exist" ; } else { //qDebug() << "MainWindow::slotElogClubLogFileUploaded file DOES NOT exist" ; } msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - ClubLog")); msgBox.setText(tr("Do you want to mark as Uploaded all the QSOs uploaded to ClubLog?") ); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No ); msgBox.setDefaultButton(QMessageBox::Yes); int i = msgBox.exec(); if (i == QMessageBox::Yes) { bool uploadedToClubLog = dataProxy->clublogSentQSOs(_qsos); slotLogRefresh(); // TODO: Check if QSOS where sent if (!uploadedToClubLog) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - ClubLog")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("There was an error while updating to Yes the ClubLog QSO upload information.")); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } } if (!deleteAlwaysAdiFile) { msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - ClubLog")); msgBox.setText(tr("The ClubLog upload process has finished and KLog created a file (%1) in your KLog folder.\n\nDo you want KLog to remove that file?").arg(fileName)); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No ); msgBox.setDefaultButton(QMessageBox::Yes); i = msgBox.exec(); if (i == QMessageBox::Yes) { if (QFile::remove(fileName)) { msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog - ClubLog")); msgBox.setText(tr("The file has been removed.")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); //qDebug() << "MainWindow::slotElogClubLogFileUploaded - FILE REMOVED: " << fileName ; } else { msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog - ClubLog")); msgBox.setText(tr("The file has not been removed.")); msgBox.setDetailedText(tr("It seems that there was something that prevented KLog from removing the file\nYou can remove it manually.")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); //qDebug() << "MainWindow::slotElogClubLogFileUploaded - FILE NOT REMOVED: " << fileName ; } //i = msgBox.exec(); } } else { QFile::remove(fileName); } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotElogClubLogShowMessage(const QString &_s) { logEvent(Q_FUNC_INFO, "Start", Debug); slotUpdateStatusBar(_s); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotElogClubLogProcessAnswer(const int _i, const int _qID) { logEvent(Q_FUNC_INFO, "Start: " + QString::number(_i) + "/" + QString::number(_qID), Debug); clublogAnswer = _i; if (clublogAnswer == 0) // NO ERROR { dataProxy->setClubLogSent(_qID, "Y", eQSLTabWidget->getClubLogDate()); } else { dataProxy->setClubLogSent(_qID, "M", eQSLTabWidget->getClubLogDate()); } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotElogEQSLFileUploaded (QNetworkReply::NetworkError _error, QList _qsos) { logEvent(Q_FUNC_INFO, "Start: " + QString::number(_error) , Debug); QMessageBox msgBox; if (_error != QNetworkReply::NoError) { msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - eQSL error")); msgBox.setText(tr("The eQSL upload process has finished with an error and the log was possibly not uploaded.")); msgBox.setDetailedText(tr("Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1").arg(_error)); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); return; } QString fileName = util->getEQSLFile(); if (QFile::exists(fileName)) { //qDebug() << "MainWindow::slotElogEQSLFileUploaded file exist" << fileName ; } else { //qDebug() << "MainWindow::slotElogEQSLFileUploaded file DOES NOT exist" ; } msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - eQSL")); msgBox.setText(tr("Do you want to mark as Uploaded all the QSOs uploaded to eQSL?") ); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No ); msgBox.setDefaultButton(QMessageBox::Yes); int i = msgBox.exec(); if (i == QMessageBox::Yes) { bool uploadedToeQSL = dataProxy->eQSLSentQSOs(_qsos); slotLogRefresh(); // TODO: Check if QSOS where sent if (!uploadedToeQSL) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - eQSL")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("There was an error while updating to Yes the eQSL QSO upload information.")); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } } if (!deleteAlwaysAdiFile) { msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - eQSL")); msgBox.setText(tr("The eQSL upload process has finished and KLog created a file (%1) in your KLog folder.\n\nDo you want KLog to remove that file?").arg(fileName)); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No ); msgBox.setDefaultButton(QMessageBox::Yes); i = msgBox.exec(); if (i == QMessageBox::Yes) { if (QFile::remove(fileName)) { msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog - eQSL")); msgBox.setText(tr("The file has been removed.")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); //qDebug() << "MainWindow::slotElogEQSLFileUploaded - FILE REMOVED: " << fileName ; } else { msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog - eQSL")); msgBox.setText(tr("The file has not been removed.")); msgBox.setDetailedText(tr("It seems that there was something that prevented KLog from removing the file\nYou can remove it manually.")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); //qDebug() << "MainWindow::slotElogEQSLFileUploaded - FILE NOT REMOVED: " << fileName ; } //i = msgBox.exec(); } } else { QFile::remove(fileName); } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotElogQRZCOMDisable(const bool _b) { //qDebug() << Q_FUNC_INFO; logEvent(Q_FUNC_INFO, "Start", Debug); if ((_b) && (elogQRZcom->getSubscription ())) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - QRZ.com warning")); msgBox.setText(tr("QRZ.com has returned a non-subcribed error and queries to QRZ.com will be disabled.")); msgBox.setDetailedText(tr("Please check your QRZ.com subcription or credentials.")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); qrzcomActive = false; QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("QRZcom"); settings.setValue ("QRZcomActive", false); settings.endGroup (); } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotElogQRZCOMLogUploaded (QNetworkReply::NetworkError _error, QList _qsos) { //qDebug() << "MainWindow::slotElogQRZCOMLogUploaded: " << QString::number(_error) ; logEvent(Q_FUNC_INFO, "Start: " + QString::number(_error) , Debug); QMessageBox msgBox; if (_error != QNetworkReply::NoError) { msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - QRZ.com error")); msgBox.setText(tr("The QRZ.com upload process has finished with an error and the log was possibly not uploaded.")); msgBox.setDetailedText(tr("Please check your credentials, your Internet connection and your eQSL account. The received error code was: %1").arg(_error)); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); return; } QString fileName = util->getEQSLFile(); if (QFile::exists(fileName)) { //qDebug() << "MainWindow::slotElogQRZCOMLogUploaded file exist" ; } else { //qDebug() << "MainWindow::slotElogEQSLFileUploaded file DOES NOT exist" ; } msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - QRZ.com")); msgBox.setText(tr("Do you want to mark as Uploaded all the QSOs uploaded to QRZ.com?") ); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No ); msgBox.setDefaultButton(QMessageBox::Yes); int i = msgBox.exec(); if (i == QMessageBox::Yes) { bool uploadedToeQSL = dataProxy->QRZCOMSentQSOs(_qsos); slotLogRefresh(); // TODO: Check if QSOS where sent if (!uploadedToeQSL) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - QRZ.com")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("There was an error while updating to Yes the QRZ.com QSO upload information.")); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } } msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog - QRZ.com")); msgBox.setText(tr("The QRZ.com upload process has finished successfully")); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); //qDebug() << "MainWindow::slotElogEQSLFileUploaded - END" ; } void MainWindow::slotElogQRZCOMShowMessage(const QString &_s) { //qDebug() << "MainWindow::slotElogQRZCOMShowMessage: " << _s ; logEvent(Q_FUNC_INFO, "Start", Debug); slotUpdateStatusBar(_s); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::cleanQRZCOMreceivedDataFromUI() { //qDebug() << Q_FUNC_INFO; if (!modify) { QSOTabWidget->cleanQRZCOM(true); } completedWithPreviousName = false; completedWithPreviousName = false; completedWithPreviousLocator = false; } void MainWindow::slotElogQRZCOMFoundData(const QString &_t, const QString & _d) { //qDebug() << Q_FUNC_INFO << ": " << _t << "/" << _d ; if (_t == "name") { if (QSOTabWidget->getName().length()<1) { qrzAutoChanging = true; QSOTabWidget->setName(_d); qrzAutoChanging = false; } } else if (_t == "grid") { //qDebug() << Q_FUNC_INFO << " Grid found: " << _d; if ((QSOTabWidget->getDXLocator()).length()<1) { qrzAutoChanging = true; QSOTabWidget->setDXLocator(_d); qrzAutoChanging = false; } else { //qDebug() << Q_FUNC_INFO << " There was already a Grid: " << QSOTabWidget->getDXLocator(); } } else if (_t == "qth") { if (QSOTabWidget->getQTH().length()<1) { qrzAutoChanging = true; QSOTabWidget->setQTH(_d); qrzAutoChanging = false; } } else if (_t == "qslmgr") { //QSLTabWidget->setQSLVia(_d); } else if (_t == "error") { //qDebug() << Q_FUNC_INFO << " ERROR" << _t << "/" << _d ; if (_d.contains("Not found: ")) { cleanQRZCOMreceivedDataFromUI(); //qDebug() << Q_FUNC_INFO << ": call Not found" ; slotUpdateStatusBar(tr("Call not found in QRZ.com")); return; } QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - QRZ.com error")); QString aux = QString(tr("KLog has received an error from QRZ.com.") ); msgBox.setText(aux); msgBox.setDetailedText(_d); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } else { //qDebug() << Q_FUNC_INFO << ": QRZ value not recognized" ; } } void MainWindow::slotElogQRZCOMCheckThisCall() { //qDebug() << Q_FUNC_INFO ; if (qrzcomActive) { elogQRZcom->checkQRZ(mainQSOEntryWidget->getQrz()); } else { showMessageToEnableTheOnlineService(QRZ) ; } //qDebug() << Q_FUNC_INFO << " - END" ; } void MainWindow::showMessageToEnableTheOnlineService(const OnLineProvider _service) { QString aux = util->getOnlineServiceName(_service); QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - %1").arg(aux)); msgBox.setText(tr("You need to activate the %1 service in the eLog preferences.").arg(aux) ); msgBox.exec(); } void MainWindow::slotElogQRZCOMAutoCheck() { //qDebug() << Q_FUNC_INFO << ": " << util->boolToQString(QRZCOMAutoCheckAct->isChecked()) ; if (!qrzcomActive) { showMessageToEnableTheOnlineService(QRZ); return; } QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("QRZcom"); settings.setValue ("QRZcomAuto", false); settings.endGroup (); //qDebug() << Q_FUNC_INFO << " - END" ; } void MainWindow::slotExitFromSlotDialog(const int exitID) { //qDebug() << "MainWindow::slotExitFromSlotDialog: " << QString::number(exitID) ; logEvent(Q_FUNC_INFO, "Start", Debug); if (exitID == 2) { needToEnd = true; exitQuestion(); } //qDebug() << "MainWindow::slotExitFromSlotDialog: END " ; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotFileClose() { logEvent(Q_FUNC_INFO, "Start", Debug); exitQuestion(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::exitQuestion() { logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << "MainWindow::exitQuestion" ; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - Exit")); QString aux = QString(tr("Do you really want to exit KLog?") ); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes|QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Ok was clicked logEvent(Q_FUNC_INFO, "Exiting KLog!", Debug); //maybeSave(); saveWindowsSize(); close(); exit(0); default: // should never be reached break; } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotQRZTextChanged(QString _qrz) { //qDebug()<< Q_FUNC_INFO << ": " << _qrz ; logEvent(Q_FUNC_INFO, QString("Start: %1").arg(_qrz), Debug); if (_qrz.length()<1) { infoLabel1->clear(); infoLabel2->clear(); slotClearButtonClicked(Q_FUNC_INFO); logEvent(Q_FUNC_INFO, "END-Empty", Devel); return; } if (cleaning) { //qDebug()<< Q_FUNC_INFO << ": Cleaning" ; logEvent(Q_FUNC_INFO, "END-Cleaning", Devel); return; } if (modify) { logEvent(Q_FUNC_INFO, "END-Modify", Devel); return; } //qDebug()<< Q_FUNC_INFO << ": checking for modify or length<1" ; if (qrzSmallModDontCalculate) //if ((modify) || ((qrzLineEdit->text()).length() < 1) || (qrzSmallModDontCalculate)) { //qDebug()<< Q_FUNC_INFO << ": MODIFY or Lenght < 1" ; qrzSmallModDontCalculate=false; logEvent(Q_FUNC_INFO, "END-Small QRZ, don't calculate", Devel); return; } //qDebug()<< Q_FUNC_INFO << ": running ..." ; qrzSmallModDontCalculate = true; // A kind of flag to prevent multiple calls to this method. //int i; int dx_CQz = -1; int dxE_CQz = -1; int dx_ITUz = -1; int dxE_ITUz = -1; cleanQRZCOMreceivedDataFromUI(); //qDebug()<< Q_FUNC_INFO << ": currentQRZ: " <<_qrz ; //QString pref = util->getPrefixFromCall(_qrz); //logEvent(Q_FUNC_INFO, QString("Call/Prefix: %1/%2").arg(_qrz).arg(pref), Devel); //currentEntity = world->getQRZARRLId(pref); //validar por que no puedo tirar o usar el prefijo directamente currentEntity = world->getQRZARRLId(_qrz); /* if (pref.length ()>0) { currentEntity = world->getQRZARRLId(pref); } else { currentEntity = world->getQRZARRLId(_qrz); } */ logEvent(Q_FUNC_INFO, QString("Entity: %1").arg(currentEntity), Devel); othersTabWidget->setEntity(currentEntity); dxE_CQz = world->getEntityCqz(currentEntity); dx_CQz = world->getQRZCqz(_qrz); dx_ITUz = world->getQRZItuz(_qrz); dxE_ITUz = world->getEntityItuz(currentEntity); //qDebug()<< Q_FUNC_INFO << ": CQ: " << QString::number(dx_CQz) ; //qDebug()<< Q_FUNC_INFO << ": CQe: " << QString::number(dxE_CQz) ; //qDebug()<< Q_FUNC_INFO << ": ITU: " << QString::number(dx_ITUz) ; //qDebug()<< Q_FUNC_INFO << ": ITUe: " << QString::number(dxE_ITUz) ; if (dx_CQz == dxE_CQz) { dx_CQz = dxE_CQz; } if (dx_ITUz == dxE_ITUz) { dx_ITUz = dxE_ITUz; } QStringList _qs; //for the showStatusOfDXCC(const QStringList _qs) _qs.clear(); _qs << QString::number(currentEntity) << QString::number(currentBand) << QString::number(currentMode) << QString::number(currentLog); //qDebug()<< Q_FUNC_INFO << ": currentEntity: " << QString::number(currentEntity) ; if ( locator->isValidLocator(QSOTabWidget->getDXLocator())) { dxLocator = QSOTabWidget->getDXLocator(); } else { dxLocator = world->getLocator(currentEntity); } //qDebug()<< Q_FUNC_INFO << ": Going to check the DXCC" ; //qDebug()<< Q_FUNC_INFO << ": current/previous" << QString::number(currentEntity) << "/" << QString::number(previousEntity) ; if ( (currentEntity != previousEntity) || ((infoLabel2->text()).length() < 1) || (InValidCharsInPrevCall) || (dx_CQz != dxE_CQz) || (dx_ITUz != dxE_ITUz)) { //qDebug()<< Q_FUNC_INFO << ": currentEntity=" << QString::number(currentEntity) << "/previousEntity=" << QString::number(previousEntity) ; previousEntity = currentEntity; InValidCharsInPrevCall = false; //slotShowInfoLabel(world->getEntityName(currentEntity), 2); infoLabel2->setText(world->getEntityName(currentEntity)); infoWidget->showEntityInfo(currentEntity, dx_CQz, dx_ITUz); infoWidget->showDistanceAndBearing(myDataTabWidget->getMyLocator(), dxLocator); //qDebug()<< Q_FUNC_INFO << ": calling showStatusOfDXCC-03 " ; showStatusOfDXCC(_qs); showDXMarathonNeeded(currentEntity, dx_CQz, mainQSOEntryWidget->getDate().year(), currentLog); othersTabWidget->setIOTAContinentFromEntity(currentEntity); } else if ((dx_CQz == dxE_CQz) || (dx_ITUz = dxE_ITUz)) { //qDebug()<< Q_FUNC_INFO << ": 000" ; //slotShowInfoLabel(world->getEntityName(currentEntity), 2); infoLabel2->setText(world->getEntityName(currentEntity)); infoWidget->showEntityInfo(currentEntity, dx_CQz, dx_ITUz); } else { //qDebug()<< Q_FUNC_INFO << ": Default: else" ; } qrzSmallModDontCalculate = false; // If the text has not been modified in this method //qDebug()<< Q_FUNC_INFO << ": cursorP at the end : " ; if (completeWithPrevious) { completeWithPreviousQSO(_qrz); } if (!modify) { searchWidget->setCallToSearch(_qrz); //qDebug() << Q_FUNC_INFO << " qrz.length>2: " << _qrz; //qDebug() << Q_FUNC_INFO << " qrzcomActive: " << util->boolToQString (qrzcomActive); //qDebug() << Q_FUNC_INFO << " QRZCOMAutoCheckAct: " << util->boolToQString (QRZCOMAutoCheckAct->isChecked()); if (qrzcomActive && QRZCOMAutoCheckAct->isChecked() && (_qrz.length ()>2)) { //qDebug()<< Q_FUNC_INFO << ": Checking QRZ.com"; elogQRZcom->checkQRZ(_qrz); } else { //qDebug()<< Q_FUNC_INFO << ": NOT checking QRZ.com"; } } //qrzAutoChanging = false; logEvent(Q_FUNC_INFO, "END", Debug); //qDebug()<< Q_FUNC_INFO << ": END" ; } void MainWindow::setCleaning(const bool _c) { logEvent(Q_FUNC_INFO, "Start", Debug); cleaning = _c; mainQSOEntryWidget->setCleaning(cleaning); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotClearButtonClicked(const QString &_func) { //qDebug() << Q_FUNC_INFO << " - Start: " << _func ; logEvent(Q_FUNC_INFO, "Start", Debug); Q_UNUSED(_func); bool needToRecover = modify; setCleaning(true); yearChangedDuringModification = false; setModifying(false); currentEntity = -1; dateTimeTemp = dateTime; modifyingQSO = -1; QSOTabWidget->setRSTToMode(mainQSOEntryWidget->getMode(), readingTheUI); //qDebug() << Q_FUNC_INFO << " - 10" ; if (currentBand < 0) { currentBand = defaultBand; } if (currentMode < 0) { currentMode = defaultMode; //qDebug() << Q_FUNC_INFO << " 12b - currentMode: " << QString::number(currentMode) ; } //qDebug() << Q_FUNC_INFO << " - 20" ; clublogAnswer = -1; clublogPrevQSO.clear(); //qDebug() << Q_FUNC_INFO << " - 11" ; setCleaning(false); //qDebug() << Q_FUNC_INFO << " - 25" ; //qDebug() << Q_FUNC_INFO << " Log: " << QString::number(currentLog) ; setMainWindowTitle(); //qDebug() << Q_FUNC_INFO << " - 27" ; if (needToRecover) { //qDebug() << Q_FUNC_INFO << " - 28" ; //qDebug() << Q_FUNC_INFO << ": Recovening the previous status..."; restoreCurrentQSO(true); } else { //qDebug() << Q_FUNC_INFO << " - 40" ; clearUIDX(); statusBar()->clearMessage(); //qDebug() << Q_FUNC_INFO << ": NOT recovening the previous status..."; } //qDebug() << Q_FUNC_INFO << " - currentMode = " << QString::number(currentMode) ; logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << " - END" ; } void MainWindow::clearUIDX(bool _full) { //qDebug() << Q_FUNC_INFO << " - Start" ; logEvent(Q_FUNC_INFO, "Start", Debug); mainQSOEntryWidget->clear(); QSOTabWidget->clear(); commentTabWidget->clear(_full); infoLabel1->clear(); infoLabel2->clear(); QSOTabWidget->clear(); eQSLTabWidget->clear(); QSLTabWidget->clear(); othersTabWidget->clear(_full); infoWidget->clear(); satTabWidget->clear(_full); myDataTabWidget->clear(_full); completedWithPreviousName = false; completedWithPreviousQTH = false; completedWithPreviousLocator = false; //qDebug() << Q_FUNC_INFO << " deciding wether to change or not the Freq: " << QString::number(QSOTabWidget->getTXFreq()) ; if (QSOTabWidget->getTXFreq()<=0) { //qDebug() << Q_FUNC_INFO << " Setting TX Freq from: " << QString::number(QSOTabWidget->getTXFreq()) ; QSOTabWidget->setTXFreq((dataProxy->getFreqFromBandId(dataProxy->getIdFromBandName(mainQSOEntryWidget->getBand()))).toDouble()); //qDebug() << Q_FUNC_INFO << " Setting TX Freq to: " << QString::number(QSOTabWidget->getTXFreq()) ; QSOTabWidget->setRXFreq(QSOTabWidget->getTXFreq()); } logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << " - END" ; } void MainWindow::slotRefreshDXCCWidget() { logEvent(Q_FUNC_INFO, "Start", Debug); dxccStatusWidget->slotRefreshButtonClicked(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::closeEvent(QCloseEvent *event) { //qDebug() << Q_FUNC_INFO ; logEvent(Q_FUNC_INFO, "Start", Debug); saveWindowsSize(); if (maybeSave()) { //qDebug() << Q_FUNC_INFO << " saving needed" ; dataProxy->unMarkAllQSO(); dataProxy->compressDB(); event->accept(); } else { //qDebug() << Q_FUNC_INFO << " not saving needed" ; event->ignore(); } //qDebug() << Q_FUNC_INFO << " - END" ; logEvent(Q_FUNC_INFO, "END", Debug); } bool MainWindow::maybeSave() { //qDebug() << Q_FUNC_INFO ; logEvent(Q_FUNC_INFO, "Start", Debug); QString str = tr("The logfile has been modified.") + "\n" + tr("Do you want to save your changes?"); if (alwaysADIF) { //qDebug() << Q_FUNC_INFO << "- Saving" ; if (needToSave) { QMessageBox::StandardButton ret; ret = QMessageBox::warning(this, "KLog", str, QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel); if (ret == QMessageBox::Save) { if (useDefaultLogFileName) { logEvent(Q_FUNC_INFO, "END-1", Debug); //qDebug() << Q_FUNC_INFO << " - Use default file name" ; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - ADIF export")); msgBox.setInformativeText(tr("It is important to export to ADIF and save a copy as a backup.")); if (filemanager->adifLogExport(defaultADIFLogFile, currentLog)) // 0 will save ALL the logs) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("Saving the log was done successfully.")); msgBox.exec(); //qDebug() << Q_FUNC_INFO << " - Log exported" ; return true; } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("The ADIF export was not properly done.")); msgBox.exec(); //qDebug() << Q_FUNC_INFO << " - ERROR Log not exported" ; return false; } } else { logEvent(Q_FUNC_INFO, "END-2", Debug); //qDebug() << Q_FUNC_INFO << " - Going to import??" ; slotADIFImport(); return true; //return saveFileAs(); } } else if (ret == QMessageBox::Cancel) { logEvent(Q_FUNC_INFO, "END-3", Debug); //qDebug() << Q_FUNC_INFO << "- Cancel" ; return false; } } else { //qDebug() << Q_FUNC_INFO << " - Not needing to save" ; } } else { //qDebug() << Q_FUNC_INFO << "- Not Checking if needed to save" ; } logEvent(Q_FUNC_INFO, "END", Debug); return true; } void MainWindow::slotAWAImport() { //qDebug() << Q_FUNC_INFO ; fileAwardManager->importNewAwardFile(); //qDebug() << Q_FUNC_INFO << " - END" ; } void MainWindow::createMenusCommon() { //qDebug() << Q_FUNC_INFO ; logEvent(Q_FUNC_INFO, "Start", Debug); fileMenu = menuBar()->addMenu(tr("&File")); //awardAddAct = new QAction(tr("Import Award definition file ..."), this); //fileMenu->addAction(awardAddAct); //connect(awardAddAct , SIGNAL(triggered()), this, SLOT(slotAWAImport())); //awardAddAct ->setToolTip(tr("Import an Award file.")); //TestAct = new QAction(tr("TEST: Advanced search ..."), this); //fileMenu->addAction(TestAct); //connect(TestAct, SIGNAL(triggered()), this, SLOT(slotTest())); ADIFImport = new QAction(tr("&Import from ADIF ..."), this); fileMenu->addAction(ADIFImport); connect(ADIFImport, SIGNAL(triggered()), this, SLOT(slotADIFImport())); ADIFImport->setToolTip(tr("Import an ADIF file into the current log.")); //LoTWImport = new QAction(tr("&Import from LoTW ..."), this); //fileMenu->addAction(LoTWImport); //connect(LoTWImport, SIGNAL(triggered()), this, SLOT(slotLoTWImport())); //LoTWImport->setToolTip(tr("Import an LoTW file into the current log")); fileMenu->addSeparator(); //fileMenu->addSeparator(); ADIFExport = new QAction(tr("Export to ADIF ..."), this); fileMenu->addAction(ADIFExport); //ADIFExport->setMenuRole(QAction::ApplicationSpecificRole); connect(ADIFExport, SIGNAL(triggered()), this, SLOT(slotADIFExport())); ADIFExport->setToolTip(tr("Export the current log to an ADIF logfile.")); ADIFExportAll = new QAction(tr("Export all logs to ADIF ..."), this); fileMenu->addAction(ADIFExportAll); //ADIFExport->setMenuRole(QAction::ApplicationSpecificRole); connect(ADIFExportAll, SIGNAL(triggered()), this, SLOT(slotADIFExportAll())); ADIFExportAll->setToolTip(tr("Export ALL the QSOs into one ADIF file, merging QSOs from all the logs.")); fileMenu->addSeparator(); printLogAct = new QAction(tr("&Print Log ..."), this); fileMenu->addAction(printLogAct); printLogAct->setShortcut(Qt::CTRL + Qt::Key_P); printLogAct->setToolTip(tr("Print your log.")); connect(printLogAct, SIGNAL(triggered()), this, SLOT(slotFilePrint())); fileMenu->addSeparator(); klogFolderAct = new QAction(tr("KLog folder"), this); fileMenu->addAction(klogFolderAct); printLogAct->setToolTip(tr("Opens the data folder of KLog.")); connect(klogFolderAct, SIGNAL(triggered()), this, SLOT(slotOpenKLogFolder())); fileMenu->addSeparator(); setupAct = new QAction(tr("Settings ..."), this); fileMenu->addAction(setupAct); //setupAct->setMenuRole(QAction::PreferencesRole); connect(setupAct, SIGNAL(triggered()), this, SLOT(slotSetup())); fileMenu->addSeparator(); exitAct = new QAction(tr("E&xit"), this); fileMenu->addAction(exitAct); //exitAct->setMenuRole(QAction::QuitRole); exitAct->setShortcut(Qt::CTRL + Qt::Key_X); //connect(exitAct, SIGNAL(triggered()), this, SLOT(close())); connect(exitAct, SIGNAL(triggered()), this, SLOT(slotFileClose())); toolMenu = menuBar()->addMenu(tr("&Tools")); fillQsoAct = new QAction(tr("Fill in QSO data"), this); toolMenu->addAction(fillQsoAct); //fillQsoAct->setMenuRole(QAction::ApplicationSpecificRole); connect(fillQsoAct, SIGNAL(triggered()), this, SLOT(fillQSOData())); fillQsoAct->setToolTip(tr("Go through the log reusing previous QSOs to fill missing information in other QSOs.")); toolMenu->addSeparator(); qslToolMenu = toolMenu->addMenu(tr("QSL tools ...")); findQSO2QSLAct = new QAction(tr("Find QSO to QSL"), this); qslToolMenu->addAction(findQSO2QSLAct); connect(findQSO2QSLAct, SIGNAL(triggered()), this, SLOT(slotSearchToolNeededQSLToSend())); findQSO2QSLAct->setToolTip(tr("Shows QSOs for which you should send your QSL and request the DX QSL.")); findRequestedQSLAct = new QAction(tr("Find My-QSLs pending to send"), this); qslToolMenu->addAction(findRequestedQSLAct); //findQSO2QSLAct->setMenuRole(QAction::ApplicationSpecificRole); connect(findRequestedQSLAct, SIGNAL(triggered()), this, SLOT(slotToolSearchRequestedQSLToSend())); findRequestedQSLAct->setToolTip(tr("Shows the QSOs with pending requests to send QSLs. You should keep this queue empty!")); findQSLPendingToReceiveAct = new QAction(tr("Find DX-QSLs pending to receive"), this); qslToolMenu->addAction(findQSLPendingToReceiveAct); connect(findQSLPendingToReceiveAct, SIGNAL(triggered()), this, SLOT(slotToolSearchNeededQSLPendingToReceive())); findQSLPendingToReceiveAct->setToolTip(tr("Shows DX-QSLs for which requests or QSLs have been sent with no answer.")); findQSLDXRequestedAct = new QAction(tr("Find requested pending to receive"), this); qslToolMenu->addAction(findQSLDXRequestedAct); connect(findQSLDXRequestedAct, SIGNAL(triggered()), this, SLOT(slotToolSearchNeededQSLRequested())); findQSLDXRequestedAct->setToolTip(tr("Shows the DX-QSLs that have been requested.")); toolMenu->addSeparator(); lotwToolMenu = toolMenu->addMenu(tr("LoTW tools ...")); lotwMarkSentQueuedThisLogAct = new QAction(tr("Queue all QSOs from this log to be sent"), this); lotwToolMenu->addAction(lotwMarkSentQueuedThisLogAct); connect(lotwMarkSentQueuedThisLogAct, SIGNAL(triggered()), this, SLOT(slotToolLoTWMarkAllQueuedThisLog())); lotwMarkSentQueuedThisLogAct->setToolTip(tr("Mark all non-sent QSOs in this log as queued to be uploaded.")); lotwMarkSentQueuedAct = new QAction(tr("Queue all QSLs to be sent"), this); lotwToolMenu ->addAction(lotwMarkSentQueuedAct); connect(lotwMarkSentQueuedAct, SIGNAL(triggered()), this, SLOT(slotToolLoTWMarkAllQueued())); lotwMarkSentQueuedAct->setToolTip(tr("Put all the non-sent QSOs in the queue to be uploaded.")); lotwToolMenu->addSeparator(); lotwMarkSentYesThisLogAct = new QAction(tr("Mark all queued QSOs from this log as sent"), this); lotwToolMenu->addAction(lotwMarkSentYesThisLogAct); connect(lotwMarkSentYesThisLogAct, SIGNAL(triggered()), this, SLOT(slotToolLoTWMarkAllYesThisLog())); lotwMarkSentYesThisLogAct->setToolTip(tr("Mark all queued QSOs in this log as sent to LoTW.")); lotwMarkSentYesAct = new QAction(tr("Mark all queued QSOs as sent"), this); lotwToolMenu ->addAction(lotwMarkSentYesAct); connect(lotwMarkSentYesAct, SIGNAL(triggered()), this, SLOT(slotToolLoTWMarkAllYes())); lotwMarkSentYesAct->setToolTip(tr("Mark all queued QSOs as sent to LoTW.")); lotwToolMenu->addSeparator(); lotwToolMenu ->addAction(lotwCallTQSL); connect(lotwCallTQSL, SIGNAL(triggered()), this, SLOT(slotLoTWExport())); lotwCallTQSL->setToolTip("Sends the log to LoTW calling TQSL. You will be able to select the Station Callsign and start and end dates."); lotwToolMenu->addSeparator(); lotwUpdateFromLoTWAct = new QAction(tr("Download from LoTW ..."), this); lotwToolMenu ->addAction(lotwUpdateFromLoTWAct); connect(lotwUpdateFromLoTWAct, SIGNAL(triggered()), this, SLOT(slotLoTWDownload())); lotwUpdateFromLoTWAct->setToolTip("Updates your LoTW status from LoTW."); lotwFullDownloadFromLoTWAct = new QAction(tr("Download the full log from LoTW ..."), this); lotwToolMenu ->addAction(lotwFullDownloadFromLoTWAct); connect(lotwFullDownloadFromLoTWAct, SIGNAL(triggered()), this, SLOT(slotLoTWFullDownload())); toolMenu->addSeparator(); clublogToolMenu = toolMenu->addMenu(tr("ClubLog tools ...")); clublogLogModifyCurrentLogAct = new QAction(tr("Queue all the QSOs to be uploaded"), this); clublogToolMenu->addAction(clublogLogModifyCurrentLogAct); connect(clublogLogModifyCurrentLogAct, SIGNAL(triggered()), this, SLOT( slotElogClubLogModifyCurrentLog())); clublogLogModifyCurrentLogAct->setToolTip("Mark as modified all the QSO so they can be uploaded again to CLubLog."); clublogLogUploadAct = new QAction(tr("Upload the queued QSOs to ClubLog ..."), this); clublogToolMenu->addAction(clublogLogUploadAct); connect(clublogLogUploadAct, SIGNAL(triggered()), this, SLOT(slotClubLogLogUpload())); clublogLogUploadAct->setToolTip("Uploads your log to ClubLog. Please ensure that you have created log for that callsign before uploading."); toolMenu->addSeparator(); eQSLToolMenu = toolMenu->addMenu(tr("eQSL tools ...")); eqslLogModifyCurrentLogAct = new QAction(tr("Queue all the QSOs to be uploaded"), this); eQSLToolMenu->addAction(eqslLogModifyCurrentLogAct); connect(eqslLogModifyCurrentLogAct, SIGNAL(triggered()), this, SLOT( slotElogEQSLModifyCurrentLog())); eqslLogModifyCurrentLogAct->setToolTip("Mark as modified all the QSO so they can be uploaded again to eQSL."); eqslUploadAct = new QAction(tr("Upload the queued QSOs to eQSL.cc ..."), this); eQSLToolMenu->addAction(eqslUploadAct); connect(eqslUploadAct, SIGNAL(triggered()), this, SLOT(sloteQSLLogUpload())); eqslUploadAct->setToolTip("Uploads your log to eQSL.cc."); toolMenu->addSeparator(); QRZCOMToolMenu = toolMenu->addMenu(tr("QRZ.com tools ...")); QRZCOMCheckThisCallAct = new QAction(tr("Check the current callsign in QRZ.com"), this); QRZCOMLogModifyCurrentLogAct = new QAction(tr("Queue all the QSO to be uploaded"), this); QRZCOMLogUploadAct = new QAction(tr("Upload the queued QSOs to QRZ.com ..."), this); QRZCOMToolMenu->addAction(QRZCOMCheckThisCallAct); connect(QRZCOMCheckThisCallAct, SIGNAL(triggered()), this, SLOT( slotElogQRZCOMCheckThisCall())); QRZCOMCheckThisCallAct->setToolTip("Checks the current callsign in QRZ.com."); QRZCOMAutoCheckAct->setText(tr("Check always the current callsign in QRZ.com")); QRZCOMToolMenu->addAction(QRZCOMAutoCheckAct); connect(QRZCOMAutoCheckAct, SIGNAL(triggered()), this, SLOT( slotElogQRZCOMAutoCheck())); QRZCOMAutoCheckAct->setToolTip("Checks always the current callsign in QRZ.com"); QRZCOMToolMenu->addSeparator(); QRZCOMToolMenu->addAction(QRZCOMLogModifyCurrentLogAct); connect(QRZCOMLogModifyCurrentLogAct, SIGNAL(triggered()), this, SLOT( slotElogQRZCOMModifyCurrentLog())); QRZCOMLogModifyCurrentLogAct->setToolTip("Mark as modified all the QSO so they can be uploaded again to QRZ.com."); QRZCOMToolMenu->addAction(QRZCOMLogUploadAct); connect(QRZCOMLogUploadAct, SIGNAL(triggered()), this, SLOT(slotQRZCOMLogUpload())); QRZCOMLogUploadAct->setToolTip("Uploads your log to QRZ.com. Please ensure that you have created log and the API-KEY configured in the setup for that callsign before uploading."); toolMenu->addSeparator(); downloadCTYAct = new QAction (tr("Update cty.csv"), this); toolMenu->addAction(downloadCTYAct); //downloadCTYAct->setMenuRole(QAction::ApplicationSpecificRole); connect(downloadCTYAct, SIGNAL(triggered()), this, SLOT(slotUpdateCTYDAT())); downloadCTYAct->setToolTip(tr("For updated DX-Entity data, update cty.csv.")); downloadSATSAct = new QAction (tr("Update Satellite Data"), this); toolMenu->addAction(downloadSATSAct); connect(downloadSATSAct, SIGNAL(triggered()), this, SLOT(slotUpdateSATSDAT())); downloadSATSAct->setToolTip(tr("For updated DX-Entity data, update cty.csv.")); toolMenu->addSeparator(); showStatsAct = new QAction (tr("Stats"), this); toolMenu->addAction(showStatsAct); connect(showStatsAct, SIGNAL(triggered()), this, SLOT(slotShowStats())); showStatsAct->setToolTip(tr("Show the statistics of your radio activity.")); showMapAct = new QAction (tr("Show Map"), this); toolMenu->addAction(showMapAct); connect(showMapAct, SIGNAL(triggered()), this, SLOT(slotShowMap())); showMapAct->setToolTip(tr("Show the statistics of your radio activity.")); //qDebug() << "MainWindow::createMenusCommon before" ; //toolMenu->addSeparator(); //showRotatorAct = new QAction (tr("Rotator"), this); //toolMenu->addAction(showRotatorAct); //connect(showRotatorAct, SIGNAL(triggered()), this, SLOT(slotRotatorShow())); //showRotatorAct->setToolTip(tr("Show the rotator controller.")); //qDebug() << "MainWindow::createMenusCommon after" ; //showWorldMapAct = new QAction(tr("CQ zones world map"), this); //toolMenu->addAction(showWorldMapAct); //connect(showWorldMapAct, SIGNAL(triggered()), this, SLOT(slotWorldMapShow())); //showWorldMapAct->setToolTip(tr("Show a world map with your radio activity.")); //toolMenu->addSeparator(); //setupMenu = menuBar()->addMenu(tr("Setup")); //TODO: To be added once the help dialog has been implemented helpMenu = menuBar()->addMenu(tr("&Help")); helpMenu->addSeparator(); helpAct= new QAction(tr("Online manual (F1) ..."), this); helpMenu->addAction(helpAct); //helpAct->setMenuRole(QAction::ApplicationSpecificRole); connect(helpAct, SIGNAL(triggered()), this, SLOT(slotOpenWiki())); tipsAct = new QAction(tr("&Tips ..."), this); helpMenu->addAction(tipsAct); //tipsAct->setMenuRole(QAction::ApplicationSpecificRole); connect(tipsAct, SIGNAL(triggered()), this, SLOT(slotTipsAction())); helpMenu->addSeparator(); debugAct = new QAction(tr("&Debug ..."), this); helpMenu->addAction(debugAct); //debugAct->setMenuRole(QAction::ApplicationSpecificRole); connect(debugAct, SIGNAL(triggered()), this, SLOT(slotDebugAction())); aboutAct = new QAction(tr("&About ..."), this); helpMenu->addAction(aboutAct); //aboutAct->setMenuRole(QAction::AboutRole); connect(aboutAct, SIGNAL(triggered()), this, SLOT(slotHelpAboutAction())); //connect(aboutAct, SIGNAL(triggered()), this, SLOT(slotLoTWTest()) ); #if defined(Q_OS_MACOS) // It seems that on MAC if I try to show both, only the last one (or Qt) is shown #else // I can define the setMenuRole but then no standard locations are used on macOS aboutQtAct = new QAction(tr("About Qt ..."), this); helpMenu->addAction(aboutQtAct); //aboutQtAct->setMenuRole(QAction::AboutQtRole); connect(aboutQtAct, SIGNAL(triggered()), this, SLOT(slotAboutQt())); logEvent(Q_FUNC_INFO, "END", Debug); #endif helpMenu->addSeparator(); updateAct = new QAction(tr("Check updates ..."), this); helpMenu->addAction(updateAct); //updateAct->setMenuRole(QAction::ApplicationSpecificRole); connect(updateAct, SIGNAL(triggered()), this, SLOT(slotHelpCheckUpdatesAction())); } void MainWindow::slotDebugAction() { logEvent(Q_FUNC_INFO, "Start", Debug); showKLogLogWidget->show(); logEvent(Q_FUNC_INFO, "END", Debug); } /* void MainWindow::slotTest() { logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO ; //showKLogLogWidget->setWindowModality(false); showKLogLogWidget->show(); //advancedSearchWidget->show(); //qDebug() << Q_FUNC_INFO << " - END "; logEvent(Q_FUNC_INFO, "END", Debug); } */ void MainWindow::slotSearchToolNeededQSLToSend() { logEvent(Q_FUNC_INFO, "Start", Debug); slotShowSearchWidget(); searchWidget->searchToolNeededQSLToSend(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotToolSearchRequestedQSLToSend() { logEvent(Q_FUNC_INFO, "Start", Debug); searchWidget->slotToolSearchRequestedQSLToSend(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotToolSearchNeededQSLPendingToReceive() { logEvent(Q_FUNC_INFO, "Start", Debug); searchWidget->slotToolSearchNeededQSLPendingToReceive(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotToolSearchNeededQSLRequested() { logEvent(Q_FUNC_INFO, "Start", Debug); searchWidget->slotToolSearchNeededQSLRequested(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotToolLoTWMarkAllQueuedThisLog() { //qDebug() << "Q_FUNC_INFO ; logEvent(Q_FUNC_INFO, "Start", Debug); //QString tdate = util->getDateSQLiteStringFromDate(mainQSOEntryWidget->getDate()); QMessageBox msgConfirm; msgConfirm.setIcon(QMessageBox::Question); msgConfirm.setWindowTitle(tr("KLog - LoTW")); msgConfirm.setText(tr("Do you really want to mark ALL the QSOs of this log to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW.")); msgConfirm.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgConfirm.setDefaultButton(QMessageBox::No); int i = msgConfirm.exec(); if (i == QMessageBox::Yes) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - LoTW")); if(dataProxy->lotwSentQueue(mainQSOEntryWidget->getDate(), currentLog)) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("All pending QSOs of this log has been marked as queued for LoTW!") + "\n\n" + tr("Now you can upload them to LoTW.")); } else { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("There was a problem to mark all pending QSOs of this log as queued for LoTW!") ); } msgBox.exec(); logEvent(Q_FUNC_INFO, "END", Debug); } } /* void MainWindow::slotLoTWTest() { //qDebug() << "MainWindow::slotLoTWTest: " ; slotLoTWDownloadedFileProcess("lotwimport.adi"); //qDebug() << "MainWindow::slotLoTWTest - END" ; } */ void MainWindow::slotLoTWDownloadedFileProcess(const QString &_fn) { logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << _fn ; QList a; a.clear(); a.append(filemanager->adifLoTWReadLog2(_fn, currentLog)); QString aux; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - LoTW")); if (a.length()>0) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("Your log has been updated with the LoTW downloaded QSOs.")); aux = QString(tr("KLog has updated %1 QSOs from LoTW.")).arg(a.length()); msgBox.setInformativeText(aux); msgBox.exec(); logWindow->refresh(); dxccStatusWidget->refresh(); //TODO: Add the QSOs to the widget and show showAdifImportWidget->show(); } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("Your log has not been updated.")); aux = QString(tr("No QSO was updated with the data coming from LoTW. This may be because of errors in the logfile or simply because your log was already updated.")); msgBox.setInformativeText(aux); msgBox.exec(); } //filemanager->adifLoTWReadLog(_fn); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotToolLoTWMarkAllQueued() { //qDebug() << Q_FUNC_INFO ; logEvent(Q_FUNC_INFO, "Start", Debug); //QString tdate = util->getDateSQLiteStringFromDate(mainQSOEntryWidget->getDate()); QMessageBox msgConfirm; msgConfirm.setIcon(QMessageBox::Question); msgConfirm.setWindowTitle(tr("KLog - LoTW")); msgConfirm.setText(tr("Do you really want to mark ALL pending QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading these QSOs to LoTW.")); msgConfirm.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgConfirm.setDefaultButton(QMessageBox::No); int i = msgConfirm.exec(); if (i == QMessageBox::Yes) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - LoTW")); if (dataProxy->lotwSentQueue(mainQSOEntryWidget->getDate(), -1)) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("All pending QSOs has been marked as queued for LoTW!") + "\n\n" + tr("Now you can upload them to LoTW.")); } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("There was a problem to mark all pending QSOs as queued for LoTW!") ); } msgBox.exec(); logEvent(Q_FUNC_INFO, "END", Debug); } } bool MainWindow::callTQSL(const QString &_filename, const QString &_call) { //https://lotw.arrl.org/lotw-help/cmdline/ logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << lotwTQSLpath ; QStringList arguments; arguments.clear(); //arguments << "--action=compliant" << QString("-c %1").arg(_call) << "-d" << "-u" << "-x" << _filename; arguments << QString("-c %1").arg(_call) << "-u" << _filename; int ok = -1; QString msg; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - TQSL")); if (!QFile::exists(lotwTQSLpath)) { msg = tr("TQSL is not installed or KLog can't find it. Please check the configuration."); ok = 6; // A positive value here will return false, an error below. } else { ok = QProcess::execute(lotwTQSLpath, arguments); //qDebug() << Q_FUNC_INFO << " -ok: " << QString::number(ok) ; switch (ok) { case 0: // success: all qsos submitted were signed and saved or signed and uploaded //qDebug() << Q_FUNC_INFO << ": 0" ; //msg = tr("All the QSOs were signed and uploaded with no error."); //msg = tr("TQSL finished with no error."); //msgBox.setIcon(QMessageBox::Information); break; case 1: // cancelled by user //qDebug() << Q_FUNC_INFO << ": 1" ; msg = tr("Error #1: The process was cancelled by the user or TQSL was not configured. No QSOs were uploaded."); break; case 2: // rejected by LoTW //qDebug() << Q_FUNC_INFO << ": 2" ; msg = tr("Error #2: Upload was rejected by LoTW, please check your data."); break; case 3: // unexpected response from TQSL server //qDebug() << Q_FUNC_INFO << "L: 3" ; msg = tr("Error #3: The TQSL server returned an unexpected response."); break; case 4: // TQSL error //qDebug() << Q_FUNC_INFO << ": 4" ; msg = tr("Error #4: There was a TQSL error."); break; case 5: // TQSLlib error //qDebug() << Q_FUNC_INFO << ": 5" ; msg = tr("Error #5: There was a TQSLLib error."); break; case 6: // unable to open input file //qDebug() << Q_FUNC_INFO << ": 6" ; msg = tr("Error #6: It was not possible to open the input file."); break; case 7: // unable to open output file //qDebug() << Q_FUNC_INFO << "L: 7" ; msg = tr("Error #7: It was not possible to open the ouput file."); break; case 8: // No QSOs were processed since some QSOs were duplicates or out of date range //qDebug() << Q_FUNC_INFO << ": 8" ; msg = tr("Error #8: No QSOs were processed since some QSOs were duplicates or out of date range."); break; case 9: // Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range //qDebug() << Q_FUNC_INFO << ": 9" ; msg = tr("Error #9: Some QSOs were processed, and some QSOs were ignored because they were duplicates or out of date range."); break; case 10: // command syntax error //qDebug() << Q_FUNC_INFO << ": 10" ; msg = tr("Error #10: Command syntax error. KLog sent a bad syntax command."); break; case 11: // LoTW Connection error (no network or LoTW is unreachable) //qDebug() << Q_FUNC_INFO << ": 11" ; msg = tr("Error #11: LoTW Connection error (no network or LoTW is unreachable)."); break; default: msg = tr("Error #00: Unexpected error. Please contact the development team."); return false; // should never be reached } } if (ok>0) { msgBox.setText(msg); msgBox.exec(); return false; } else { return true; } //logEvent(Q_FUNC_INFO, "END", Debug); } QString MainWindow::selectStationCallsign() { logEvent(Q_FUNC_INFO, "Start", Debug); QString stationCallToUse = QString(); QStringList stationCallSigns; stationCallSigns.clear(); stationCallSigns << "NONE"; stationCallSigns << dataProxy->getStationCallSignsFromLog(-1); //bool callsignTyped = false; if (stationCallSigns.length()>1) { QString msg = QString(tr("The log that you have selected contains more than just one station callsign.") + "\n\n" + tr("Please select the station callsign you want to mark as sent to LoTW:")); bool ok; stationCallToUse = QInputDialog::getItem(this, tr("Station Callsign:"), msg, stationCallSigns, 0, false, &ok); if (ok && util->isValidCall(stationCallToUse)) //if (ok && !stationCallToUse.isEmpty()) { logEvent(Q_FUNC_INFO, "END-1", Debug); return stationCallToUse; } else { stationCallToUse = (QInputDialog::getText(this, tr("Define Station Callsign"), tr("You have selected no callsign. KLog will complete the QSOs without a station callsign defined and those with the callsign you are entering here.") + "\n\n" + tr("Enter the station callsign to use for this log or leave it empty for QSO without station callsign defined:"), QLineEdit::Normal, "", &ok)).toUpper(); if (ok) { //callsignTyped = true; if (util->isValidCall(stationCallToUse)) { logEvent(Q_FUNC_INFO, "END-2", Debug); return stationCallToUse; } } else { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - No station selected")); QString aux = QString(tr("No station callsign has been selected and therefore no log will be marked") ); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Ok: // Ok was clicked //return ; break; default: // should never be reached break; } } } } logEvent(Q_FUNC_INFO, "END", Debug); return QString(); } void MainWindow::slotToolLoTWMarkAllYesThisLog() { //qDebug() << Q_FUNC_INFO ; //QString tdate = util->getDateSQLiteStringFromDate(mainQSOEntryWidget->getDate()); QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - LoTW")); logEvent(Q_FUNC_INFO, "Start", Debug); if(dataProxy->lotwSentYes(mainQSOEntryWidget->getDate(), currentLog, "ALL")) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("All queued QSOs of this log has been marked as sent to LoTW!") ); } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("There was a problem to mark all queued QSOs of this log as sent to LoTW!") ); } msgBox.exec(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotToolLoTWMarkAllYes() { //qDebug() << Q_FUNC_INFO ; logEvent(Q_FUNC_INFO, "Start", Debug); QString stationCallToUse = selectStationCallsign(); //QString tdate = util->getDateSQLiteStringFromDate(mainQSOEntryWidget->getDate()); QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - LoTW")); if (dataProxy->lotwSentYes(mainQSOEntryWidget->getDate(), -1, stationCallToUse)) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("All queued QSOs has been marked as sent to LoTW!") ); } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("There was a problem to mark all queued QSOs as sent to LoTW!") ); } msgBox.exec(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotReceiveQSOListToShowFromFile(QStringList _qs) { //qDebug() << Q_FUNC_INFO << QString::number(_qs.length()) ; logEvent(Q_FUNC_INFO, "Start", Debug); // Receiving: modifiedQSOList << _call << _date + "-" +_time << _band << _mode << _qslrdate; // Must send QRZ-DX, Date-Time(yyyyMMdd-hhmmss), Band, Mode if (_qs.length()!=4) { //qDebug() << Q_FUNC_INFO << " - NO valid qso list received - length: " << QString::number(_qs.length()) ; return; } if (!util->isValidCall(_qs.at(0))) { //qDebug() << Q_FUNC_INFO << " - NO valid QRZ received - " << _qs.at(0) ; return; } if (dataProxy->getIdFromBandName(_qs.at(2))<0) { //qDebug() << Q_FUNC_INFO << " - NO valid BAND received"<< _qs.at(2) ; return; } if (dataProxy->getIdFromModeName(_qs.at(3))<0) { //qDebug() << Q_FUNC_INFO << " - NO valid Mode received" << _qs.at(3); return; } if (!util->isValidDateTimeFromString(_qs.at(1))) { //qDebug() << Q_FUNC_INFO << " No valid date" ; return; } //qDebug() << Q_FUNC_INFO << " ALL OK" ; //QStringList qsoToSend; //qsoToSend.clear(); //qsoToSend << _qs.at(0) << _qs.at(1) << _qs.at(2) << _qs.at(3); showAdifImportWidget->addQSOToTheList(_qs); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotAboutQt() { //qDebug() << Q_FUNC_INFO ; logEvent(Q_FUNC_INFO, "Start", Debug); QMessageBox::aboutQt(this,tr("About ...")); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotHelpAboutAction() { //qDebug() << Q_FUNC_INFO ; // QMessageBox::about(this, tr("About KLog"), // tr("KLog " // "Find the last release at https://jaime.robles.es/klog.")); logEvent(Q_FUNC_INFO, "Start", Debug); aboutDialog->exec(); logEvent(Q_FUNC_INFO, "END", Debug); //helpAboutDialog->exec(); } void MainWindow::slotTipsAction() { //qDebug() << Q_FUNC_INFO ; logEvent(Q_FUNC_INFO, "Start", Debug); tipsDialog->exec(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotHelpCheckUpdatesAction() { //qDebug() << Q_FUNC_INFO ; logEvent(Q_FUNC_INFO, "Start", Debug); callingUpdate = true; softUpdate->addCall(stationCallsign); softUpdate->needToUpdate(true); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotShowSoftUpdateResults(const bool _b) { //qDebug() << Q_FUNC_INFO ; logEvent(Q_FUNC_INFO, "Start", Debug); if (_b == true) { //qDebug() << Q_FUNC_INFO << " _b = TRUE " ; } else { //qDebug() << Q_FUNC_INFO << " _b = FALSE " ; } if (callingUpdate == true) { if (_b == false) { //qDebug() << Q_FUNC_INFO << " UPDATE NOT NEEDED" ; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog - Update checking result")); msgBox.setText(tr("Congratulations!") + "\n\n" + tr("You already have the latest version.")); msgBox.exec(); } else { //qDebug() << Q_FUNC_INFO << ": UPDATE NEEDED" ; } } callingUpdate = false; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotLogWinShow() { //qDebug() << Q_FUNC_INFO ; logEvent(Q_FUNC_INFO, "Start", Debug); if (!(logWindow->isVisible()) ) { logWinAct->setChecked ( true ); logWindow->show(); }else { logWinAct->setChecked ( false ); logWindow->hide(); } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotSetup(const int _page) { //qDebug() << Q_FUNC_INFO << QString::number(_page) ; logEvent(Q_FUNC_INFO, "Start", Debug); configured = false; //qDebug() << Q_FUNC_INFO << " - 010" ; backupCurrentQSO(); //qDebug() << Q_FUNC_INFO << " - 020" ; openSetup(_page); //qDebug() << Q_FUNC_INFO << " - END" ; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::openSetup(const int _page) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_page) ; logEvent(Q_FUNC_INFO, "Start", Debug); //int result = -1; //qDebug() << Q_FUNC_INFO << " - 000 - " << (QTime::currentTime()).toString("HH:mm:ss"); hamlib->stop(); //qDebug() << Q_FUNC_INFO << " - 001 - " << (QTime::currentTime()).toString("HH:mm:ss"); if (!needToEnd) { //qDebug() << Q_FUNC_INFO << " - 010 - " << (QTime::currentTime()).toString("HH:mm:ss"); logEvent(Q_FUNC_INFO, "Just before setData", Devel); //qDebug() << "MainWindow::openSetup - Just before setupDialog->exec-1" ; if (upAndRunning) { //qDebug() << Q_FUNC_INFO << " - 011 - " << (QTime::currentTime()).toString("HH:mm:ss"); setupDialog->setData(softwareVersion, _page, !configured); //qDebug() << Q_FUNC_INFO << " - 012 - " << (QTime::currentTime()).toString("HH:mm:ss"); } else { //qDebug() << Q_FUNC_INFO << " - 013 - " << (QTime::currentTime()).toString("HH:mm:ss"); setupDialog->setData(softwareVersion, 0, !configured); //qDebug() << Q_FUNC_INFO << " - 014 - " << (QTime::currentTime()).toString("HH:mm:ss"); } if ( (!configured) || (itIsANewversion) ) { //qDebug() << Q_FUNC_INFO << " - 015 - " << (QTime::currentTime()).toString("HH:mm:ss"); logEvent(Q_FUNC_INFO, "Just before SetupDialog->exec", Devel); itIsANewversion = false; //setupDialog->exec(); setupDialog->setModal(true); //qDebug() << Q_FUNC_INFO << " - 016 - " << (QTime::currentTime()).toString("HH:mm:ss"); setupDialog->show(); //qDebug() << Q_FUNC_INFO << " - 017 - " << (QTime::currentTime()).toString("HH:mm:ss"); // move part of this code to slotSetupDialogFinished logEvent(Q_FUNC_INFO, "Just after setupDialog->show", Devel); //qDebug() << "MainWindow::openSetup - Just after setupDialog->show" ; } else { //qDebug() << Q_FUNC_INFO << " - 020 - " << (QTime::currentTime()).toString("HH:mm:ss"); logEvent(Q_FUNC_INFO, "No setupDialog->exec needed", Devel); //qDebug() << "MainWindow::openSetup - No setupDialog->show needed" ; } } //qDebug() << Q_FUNC_INFO << " - 050 - " << (QTime::currentTime()).toString("HH:mm:ss"); //qDebug() << Q_FUNC_INFO << " - END"; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotSetupDialogFinished (const int _s) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_s) << " - " << (QTime::currentTime()).toString ("HH:mm:ss"); if (needToEnd) { logEvent(Q_FUNC_INFO, "END-1", Debug); return; } //bool restoreQSOConfig = false; if (_s == QDialog::Accepted) { //qDebug() << Q_FUNC_INFO << " - QDialog::Accepted - " << (QTime::currentTime()).toString ("HH:mm:ss"); logEvent(Q_FUNC_INFO, "Just before loadSettings", Debug); //readConfigData(); configured = loadSettings (); applySettings (); //qDebug() << Q_FUNC_INFO << " - 010 - " << (QTime::currentTime()).toString ("HH:mm:ss"); reconfigureDXMarathonUI(manageDxMarathon); logEvent(Q_FUNC_INFO, "Just after loadSettings", Debug); //qDebug() << "MainWindow::slotSetupDialogFinished: logmodel to be created-2" ; logEvent(Q_FUNC_INFO, "logmodel to be created-2", Debug); //qDebug() << Q_FUNC_INFO << " - 011 - " << (QTime::currentTime()).toString ("HH:mm:ss"); logWindow->createlogPanel(currentLog); //qDebug() << Q_FUNC_INFO << " - 012 - " << (QTime::currentTime()).toString ("HH:mm:ss"); logEvent(Q_FUNC_INFO, "logmodel has been created-2", Debug); defineStationCallsign(stationCallsign); //qDebug() << Q_FUNC_INFO << " - 013 - " << (QTime::currentTime()).toString ("HH:mm:ss"); logEvent(Q_FUNC_INFO, "before db->reConnect", Debug); //qDebug() << "MainWindow::openSetup: before db->reConnect" ; dataProxy->reconnectDB(); //qDebug() << Q_FUNC_INFO << " - 014 - " << (QTime::currentTime()).toString ("HH:mm:ss"); logEvent(Q_FUNC_INFO, "after db->reConnect", Debug); //qDebug() << "MainWindow::openSetup: after db->reConnect" ; } else { //qDebug() << Q_FUNC_INFO << " - !QDialog::Accepted"; //qDebug() << Q_FUNC_INFO << " - 019 - " << (QTime::currentTime()).toString ("HH:mm:ss"); } //qDebug() << Q_FUNC_INFO << " - 020 - " << (QTime::currentTime()).toString ("HH:mm:ss"); if (qso->getBackup()) { //qDebug() << (QTime::currentTime()).toString ("HH:mm:ss") << Q_FUNC_INFO << " - 021 - "; //qDebug() << Q_FUNC_INFO << ": Restoring..." ; restoreCurrentQSO (QDialog::Accepted); //qDebug() << (QTime::currentTime()).toString ("HH:mm:ss") << Q_FUNC_INFO << " - 022 - " ; } else { //qDebug() << "MainWindow::slotSetupDialogFinished: NO Restoring qso->.." ; //qDebug()<< (QTime::currentTime()).toString ("HH:mm:ss") << Q_FUNC_INFO << " - 023 - "; } //qDebug() << (QTime::currentTime()).toString ("HH:mm:ss") << Q_FUNC_INFO << " - 030 - " ; hamlibActive = setHamlib(hamlibActive); //qDebug() << (QTime::currentTime()).toString ("HH:mm:ss") << Q_FUNC_INFO << " - END"; logEvent(Q_FUNC_INFO, "END", Debug); } bool MainWindow::slotOpenKLogFolder() { //qDebug() << "MainWindow::slotOpenKLogFolder: " << util->getHomeDir() ; logEvent(Q_FUNC_INFO, "Start", Debug); QString _aux = "" ; QString _text = tr("You can find the KLog data folder here: ") + _aux; QMessageBox::information(this, tr("KLog"), _text, QMessageBox::Ok, QMessageBox::Ok); //qDebug() << "MainWindow::slotOpenKLogFolder: END" ; logEvent(Q_FUNC_INFO, "END", Debug); return true; } void MainWindow::slotUpdateStatusBar(const QString &statusm) { //qDebug() << "MainWindow::slotUpdateStatusBar: " << statusm ; logEvent(Q_FUNC_INFO, "Start", Debug); statusBar()->showMessage(statusm, 2000); logEvent(Q_FUNC_INFO, "END", Debug); } //bool MainWindow::readCtyFile() //{ // logEvent(Q_FUNC_INFO, "Start", Debug); // logEvent(Q_FUNC_INFO, "END", Debug); // return false; //} void MainWindow::slotDoubleClickLog(const int _qsoID) { //qDebug() << Q_FUNC_INFO << ": QSOid: " << QString::number(_qsoID) ; logEvent(Q_FUNC_INFO, "Start", Debug); //int row = _qsoID.row(); //qsoToEdit((logModel->index(row, 0)).data(0).toInt()); qsoToEdit(_qsoID); logEvent(Q_FUNC_INFO, "END", Debug); //TODO: To be added to the logWindow and create an action that emist the QSO id to be edited } bool MainWindow::setUDPServer(const bool _b) { //qDebug() << Q_FUNC_INFO << ": upAndRunning: " << util->boolToQString (upAndRunning) ; //qDebug() << Q_FUNC_INFO << ": " << util->boolToQString (_b) ; QString errorMSG, aux; if (_b) { //qDebug() << Q_FUNC_INFO << ": Starting the server" ; if (!UDPLogServer->isStarted()) { //qDebug() << Q_FUNC_INFO << ": Server is not started, starting..."; if (!UDPLogServer->start()) { //qDebug() << Q_FUNC_INFO << ": Server could not be started, exiting..."; errorMSG = tr("start"); aux = tr("UDP Server error\nThe UDP server failed to %1.", "start or stop").arg(errorMSG); showErrorDialog->setText(aux); showErrorDialog->exec(); return false; } else { //qDebug() << Q_FUNC_INFO << ": UDP Log server started!" << QTime::currentTime().toString("hh:mm:ss") ; } return true; } else { return true; //qDebug() << Q_FUNC_INFO << ": UDP Log server already started no need to restart!" << QTime::currentTime().toString("hh:mm:ss") ; } } else { //qDebug() << Q_FUNC_INFO << ": UDPServerStart FALSE" << QTime::currentTime().toString("hh:mm:ss") ; if (UDPLogServer->isStarted()) { //qDebug() << Q_FUNC_INFO << ": Server is startted and should be Disabled"; if (!UDPLogServer->stop()) { //qDebug() << Q_FUNC_INFO << ": Server should be disabled and I can't stop it"; errorMSG = tr("stop"); aux = tr("UDP Server error\nThe UDP server failed to %1.", "start or stop").arg(errorMSG); showErrorDialog->setText(aux); showErrorDialog->exec(); return UDPLogServer->isStarted (); } else { //qDebug() << Q_FUNC_INFO << ": UDP Log server stopped!" << QTime::currentTime().toString("hh:mm:ss") ; return false; } } else { //qDebug() << Q_FUNC_INFO << ": UDP Log server already stopped no need to restop!" ; return false; } } //qDebug() << Q_FUNC_INFO << ": It should not reach this, default to false"; return false; } bool MainWindow::setHamlib(const bool _b) { //qDebug() << (QTime::currentTime()).toString ("HH:mm:ss - ") << Q_FUNC_INFO << ": " << util->boolToQString (_b) ; if (!upAndRunning) { //qDebug() << (QTime::currentTime()).toString ("HH:mm:ss - ") << Q_FUNC_INFO << ": Hamlib upAndRunning FALSE"; return false; } if (_b) { //qDebug() << (QTime::currentTime()).toString ("HH:mm:ss - ") << Q_FUNC_INFO << ": Hamlib active"; hamlib->init(true); //qDebug() << (QTime::currentTime()).toString ("HH:mm:ss - ") << Q_FUNC_INFO << ": After Hamlib active"; return hamlib->readRadio(true); // Forcing the radio update } else { //qDebug() << (QTime::currentTime()).toString ("HH:mm:ss - ") << Q_FUNC_INFO << ": Hamlib NOT active"; hamlib->init(false); //qDebug() << (QTime::currentTime()).toString ("HH:mm:ss - ") << Q_FUNC_INFO << ": After Hamlib NOT active"; return false; } } void MainWindow::showEvent(QShowEvent *event) { //qDebug() << Q_FUNC_INFO ; (void)event; setWindowSize(windowSize); } void MainWindow::keyPressEvent(QKeyEvent *event){ //qDebug() << "MainWindow::keyPressEvent: " ; logEvent(Q_FUNC_INFO, "Start", Debug); switch (event->key()) { case Qt::Key_Return: // ENTER PRESSED slotQRZReturnPressed(); //qDebug() << "MainWindow::keyPressEvent: RETURN" ; break; case Qt::Key_Enter: // ENTER PRESSED //qDebug() << "MainWindow::keyPressEvent: ENTER" ; slotQRZReturnPressed(); break; case Qt::Key_F1: slotOpenWiki(); break; case Qt::Key_F4: //qDebug << "MainWindow::keyPressEvent: F4" ; mainQSOEntryWidget->toggleRealTime (); break; default: //QFrame::keyPressEvent(event); break; } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotOpenWiki() { logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO ; QDesktopServices::openUrl(QUrl("https://github.com/ea4k/klog/wiki/")); logEvent(Q_FUNC_INFO, "END", Debug); } bool MainWindow::applySettings() { //qDebug() << Q_FUNC_INFO << " - Start"; if ((useDefaultLogFileName) && (defaultADIFLogFile.length()>0)) { useDefaultLogFileName = true; } else { useDefaultLogFileName = false; } checkIfNewBandOrMode (); infoWidget->setImperialSystem(imperialSystem); infoLabel2->setText(world->getEntityName(currentEntity)); infoWidget->showEntityInfo(currentEntity); searchWidget->setColors(newOneColor.name(), neededColor.name(), workedColor.name(), confirmedColor.name(), defaultColor.name()); awards->setColors (newOneColor.name(), neededColor.name(), workedColor.name(), confirmedColor.name(), defaultColor.name()); mapWindow->setColors (workedColor, confirmedColor, defaultColor); dxClusterWidget->setColors (newOneColor.name(), neededColor.name(), workedColor.name(), confirmedColor.name(), defaultColor.name()); dxClusterWidget->setDXClusterSpotConfig(dxClusterShowHF, dxClusterShowVHF, dxClusterShowWARC, dxClusterShowWorked, dxClusterShowConfirmed, dxClusterShowAnn, dxClusterShowWWV, dxClusterShowWCY ); setMainWindowTitle(); dxClusterWidget->setMyQRZ(stationCallsign); elogClublog->setDefaultCallsign (stationCallsign); if (qrzcomActive) { //elogQRZcom->setCredentials(qrzcomUser, qrzcomPass); elogQRZcom->login(); } util->setVersion(softwareVersion); searchWidget->setVersion(softwareVersion); searchWidget->setCurrentLog(currentLog); infoWidget->setCurrentLog(currentLog); infoWidget->setColors(newOneColor.name(), neededColor.name(), workedColor.name(), confirmedColor.name(), defaultColor.name()); satTabWidget->refreshData(); adifLoTWExportWidget->setLogNumber (currentLog); //setWindowSize (windowSize); if (upAndRunning) { startServices(); } //qDebug() << Q_FUNC_INFO << " - END"; logEvent(Q_FUNC_INFO, "END", Debug); return true; } void MainWindow::startServices() { //qDebug() << QTime::currentTime().toString("hh:mm:ss - ") ; logEvent(Q_FUNC_INFO, "Start", Debug); hamlibActive = setHamlib(hamlibActive); setUDPServer(UDPServerStart); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::checkIfNewBandOrMode() {//Checks the log to see if there is a QSO with a band/mode //that is not currently selected as active //qDebug() << "MainWindow::checkIfNewBandOrMode - START " << QTime::currentTime().toString("hh:mm:ss") ; logEvent(Q_FUNC_INFO, "Start", Debug); QString currentBand = mainQSOEntryWidget->getBand(); QString currentMode = mainQSOEntryWidget->getMode(); setupDialog->checkIfNewBandOrMode(); // Update the Setup dialog with new bands or modes //qDebug() << "MainWindow::checkIfNewBandOrMode - 1 " << QTime::currentTime().toString("hh:mm:ss") ; QStringList bandsInLog = dataProxy->getBandsInLog(currentLog); //qDebug() << "MainWindow::checkIfNewBandOrMode - 2 " << QTime::currentTime().toString("hh:mm:ss") ; QStringList modesInLog = dataProxy->getModesInLog(currentLog); //qDebug() << "MainWindow::checkIfNewBandOrMode - 3 " << QTime::currentTime().toString("hh:mm:ss") ; QStringList qsTemp; qsTemp.clear(); //qDebug() << "MainWindow::checkIfNewBandOrMode - 3.1 " << QTime::currentTime().toString("hh:mm:ss") ; bands << bandsInLog; bands.removeDuplicates(); //qDebug() << "MainWindow::checkIfNewBandOrMode - 3.2 " << QTime::currentTime().toString("hh:mm:ss") ; qsTemp << dataProxy->sortBandNamesBottonUp(bands); //qDebug() << "MainWindow::checkIfNewBandOrMode - 3.3 " << QTime::currentTime().toString("hh:mm:ss") ; bands.clear(); bands = qsTemp; modes << modesInLog; modes.removeDuplicates(); modes.sort(); //qDebug() << "MainWindow::checkIfNewBandOrMode - bands -" << QString::number(bands.length()) << " - " << QTime::currentTime().toString("hh:mm:ss") ; mainQSOEntryWidget->setBands(bands); satTabWidget->addBands(bands); mapWindow->setBands(bands); //qDebug() << "MainWindow::checkIfNewBandOrMode - modes -" << QString::number(modes.length()) << " - " << QTime::currentTime().toString("hh:mm:ss") ; mainQSOEntryWidget->setModes(modes); mapWindow->setModes(modes); //qDebug() << "MainWindow::checkIfNewBandOrMode - setting bands" << QTime::currentTime().toString("hh:mm:ss") ; logEvent(Q_FUNC_INFO, "Setting bands", Debug); dxccStatusWidget->setBands(Q_FUNC_INFO, bands, true); //qDebug() << "MainWindow::checkIfNewBandOrMode - currentBand: " << currentBand << QTime::currentTime().toString("hh:mm:ss") ; if (bands.contains(currentBand)) { mainQSOEntryWidget->setBand(currentBand); } else { selectDefaultBand(); } //qDebug() << "MainWindow::checkIfNewBandOrMode-99 " << QTime::currentTime().toString("hh:mm:ss") ; if (modes.contains(currentMode)) { mainQSOEntryWidget->setMode(currentMode); } else { selectDefaultMode(); } logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainWindow::checkIfNewBandOrMode END " << QTime::currentTime().toString("hh:mm:ss") ; } void MainWindow::selectDefaultBand() { //qDebug() << "MainWindow::selectDefaultBand" ; logEvent(Q_FUNC_INFO, "Start", Debug); if (!upAndRunning) { return; } QString aux; aux = QString(); defaultBand = dataProxy->getMostUsedBand(currentLog); if (defaultBand<1) { defaultBand = dataProxy->getIdFromBandName(mainQSOEntryWidget->getBand(0)); //defaultBand = dataProxy->getIdFromBandName(bandComboBox->itemText(1)); } aux = dataProxy->getNameFromBandId(defaultBand); mainQSOEntryWidget->setBand(aux); //bandComboBox->setCurrentIndex(bandComboBox->findText(aux)); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainWindow::selectDefaultBand_END" ; } void MainWindow::selectDefaultMode() { //qDebug() << "MainWindow::selectDefaultMode" ; logEvent(Q_FUNC_INFO, "Start", Debug); if (!upAndRunning) { return; } //int aux = 1; defaultMode = dataProxy->getMostUsedMode(currentLog); //qDebug() << "MainWindow::selectDefaultMode: " << QString::number(defaultMode) ; if (defaultMode < 1) { defaultMode = dataProxy->getSubModeIdFromSubMode(mainQSOEntryWidget->getBand(0)); //defaultMode = dataProxy->getSubModeIdFromSubMode((modeComboBox->itemText(0))); //qDebug() << "MainWindow::selectDefaultMode2: " << QString::number(defaultMode) ; //qDebug() << "MainWindow::selectDefaultMode2S: " ; } //aux = dataProxy->getNameFromSubModeId(defaultMode); mainQSOEntryWidget->setMode(dataProxy->getNameFromSubModeId(defaultMode)); //modeComboBox->setCurrentIndex(modeComboBox->findText(dataProxy->getNameFromSubModeId(defaultMode))); //qDebug() << "MainWindow::selectDefaultMode3: " << QString::number(defaultMode) ; logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainWindow::selectDefaultMode-END" ; } void MainWindow::readActiveBands (const QStringList actives) { // Checks a "10m, 12m" QString, checks if they are valid bands and import to the //qDebug() << Q_FUNC_INFO << " - Start"; logEvent(Q_FUNC_INFO, "Start", Debug); foreach (QString aux, actives) { //qDebug() << Q_FUNC_INFO << ": " << aux; } bool atLeastOne = false; QString aux; bands.clear(); QStringList __bands; __bands.clear(); __bands = actives; __bands << dataProxy->getBandsInLog(currentLog); __bands.removeDuplicates(); bands = __bands; for (int i = 0; i < __bands.size() ; i++) { if (dataProxy->getIdFromBandName(__bands.at(i)) > 0) { if (!atLeastOne) { atLeastOne = true; } aux = __bands.at(i); if (aux.length()>0) { //qDebug() << Q_FUNC_INFO << ": " << aux; bands << aux; } } } bands.removeDuplicates(); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainWindow::readActiveBands - END" ; } void MainWindow::readActiveModes (const QStringList actives) { //qDebug() << Q_FUNC_INFO << " - Start"; logEvent(Q_FUNC_INFO, "Start", Debug); QString aux; aux.clear(); QStringList __modes; __modes.clear(); __modes = actives; __modes << dataProxy->getModesInLog(currentLog); __modes.removeDuplicates(); modes.clear(); for (int i = 0; i < __modes.size() ; i++) { //qDebug() << "MainWindow::readActiveModes: checking: " << __modes.at(i) ; if (dataProxy->getIdFromModeName(__modes.at(i)) > 0) { //qDebug() << "MainWindow::readActiveModes: checking-exist: " << __modes.at(i) ; aux = __modes.at(i); if (aux.length()>0) { //qDebug() << "MainWindow::readActiveModes: adding: " << aux ; modes << aux; } } } modes.removeDuplicates(); modes.sort(); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainWindow::readActiveModes - END" ; } void MainWindow::createUIDX() { // //qDebug() << "MainWindow::createUIDX ; logEvent(Q_FUNC_INFO, "Start", Debug); infoLabel1->setToolTip(tr("Status of the DX entity.")); //qDebug() << "MainWindow::createUIDX-13" ; infoLabel2->setToolTip(tr("Name of the DX entity.")); //qDebug() << "MainWindow::createUIDX-14" ; dxUpLeftInputFrame = new QFrame; dxUpLeftTab = new QTabWidget; dxUpRightTab = new QTabWidget; dxBottonTab = new QTabWidget; dxUpLeftTab->setTabPosition(QTabWidget::North); dxUpRightTab->setTabPosition(QTabWidget::South); //qDebug() << "MainWindow::createUIDX-30" ; QHBoxLayout *dxUpLeftInputFrameLayout = new QHBoxLayout; dxUpLeftInputFrameLayout->addWidget (mainQSOEntryWidget); //dxUpLeftInputFrameLayout->setSizeConstraint(QLayout::SetFixedSize); dxUpLeftInputFrame->setLayout (dxUpLeftInputFrameLayout); dxUpLeftTab->addTab (QSOTabWidget, tr("QSO")); dxUpLeftTab->addTab(QSLTabWidget, tr("QSL")); dxUpLeftTab->addTab(eQSLTabWidget, tr("eQSL")); dxUpLeftTab->addTab(commentTabWidget, tr("Comment")); //othersTabWidget->setEntitiesList(world->getEntitiesNames()); othersTabWidget->setEntitiesList(dataProxy->getEntitiesNames()); dxUpLeftTab->addTab(othersTabWidget, tr("Others")); dxUpLeftTab->addTab(myDataTabWidget, tr("My Data")); dxUpLeftTab->addTab(satTabWidget, tr("Satellite")); //qDebug() << "MainWindow::createUIDX-90" ; QSplitter *upLeftSplitter = new QSplitter (this); upLeftSplitter->addWidget(dxUpLeftInputFrame); //upLeftSplitter->addWidget(mainQSOEntryWidget); upLeftSplitter->addWidget(dxUpLeftTab); upLeftSplitter->setOrientation(Qt::Vertical); QVBoxLayout *dxUpRightFixLayout = new QVBoxLayout; dxUpRightFixLayout->addWidget(infoLabel1); dxUpRightFixLayout->addWidget(infoLabel2); infoLabel1->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); infoLabel2->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); dxUpRightTab->addTab(infoWidget, tr("Info")); //qDebug() << "MainWindow::createUIDX-100" ; reconfigureDXMarathonUI(manageDxMarathon); //qDebug() << "MainWindow::createUIDX-122" ; dxUpRightTab->addTab(awardsWidget, tr("Awards")); dxUpRightTab->addTab(searchWidget, tr("Search")); dxBottonTab->addTab(logWindow, tr("Log")); dxBottonTab->addTab(dxClusterWidget, tr("DX-Cluster")); dxBottonTab->addTab(dxccStatusWidget, tr("DXCC")); QVBoxLayout *dxUpRightLayout = new QVBoxLayout; dxUpRightLayout->addLayout(dxUpRightFixLayout); dxUpRightLayout->addWidget(dxUpRightTab); QWidget *upRightWidget = new QWidget; upRightWidget->setLayout(dxUpRightLayout); QSplitter *upSplitter = new QSplitter (this); upSplitter->addWidget(upLeftSplitter); upSplitter->addWidget(upRightWidget); QSplitter *splitter = new QSplitter(this); splitter->addWidget(upSplitter); splitter->addWidget(dxBottonTab); splitter->setOrientation(Qt::Vertical); QHBoxLayout *mLayout = new QHBoxLayout; mLayout->addWidget(splitter); //mLayout->setSizeConstraint(QLayout::SetFixedSize); mainWidget->setLayout(mLayout); //qDebug() << "MainWindow::createUIDX - OS DETECTION" ; #ifdef Q_OS_WIN //qDebug() << "MainWindow::createUIDX - WINDOWS DETECTED!" ; dxUpLeftInputFrame->setFrameShadow(QFrame::Raised); dxUpLeftInputFrame->setFrameStyle(QFrame::StyledPanel); #else //qDebug() << "MainWindow::createUIDX - NO WINDOWS DETECTED!" ; dxUpLeftInputFrame->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); infoLabel1->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); infoLabel2->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); #endif setCentralWidget(mainWidget); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainWindow::createUIDX-END" ; } void MainWindow::slotADIFExport() { //qDebug() << "MainWindow::slotADIFExport - Start" ; adifLoTWExportWidget->setExportMode(ModeADIF); adifLoTWExportWidget->show(); //filemanager->adifLogExport(fileName, currentLog); //qDebug() << "MainWindow::slotADIFExport -END " ; } void MainWindow::showNumberOfSavedQSO(const QString &_fn, const int _n) { //qDebug() << "MainWindow::showNumberOfSavedQSO: " << _fn << "/" << QString::number(_n) ; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog - ADIF export")); if (_n <= 0) { // TODO: Check if errors should be managed. msgBox.setText(tr("No QSOs have been exported to ADIF.") ); } else { QString msg = QString(tr("KLog has exported %1 QSOs to the ADIF file: %2")).arg(QString::number(_n)).arg(_fn); msgBox.setText(msg); } msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); //qDebug() << "MainWindow::showNumberOfSavedQSO - END" ; } /* void MainWindow::fileExportADIF(const QString &_st, const QString &_grid, const QDate &_startDate, const QDate &_endDate) { //qDebug() << Q_FUNC_INFO << ": " << _st ; QString fileName = QFileDialog::getSaveFileName(this, tr("Save ADIF File"), util->getHomeDir(), "ADIF (*.adi *.adif)"); QList qsos = filemanager->adifLogExportReturnList(fileName, _st, _grid, _startDate, _endDate, currentLog, ModeADIF); showNumberOfSavedQSO(fileName, qsos.count()); //qDebug() << Q_FUNC_INFO << " - END"; } */ void MainWindow::fileExportADIF2(const QString &_call, QList _qsos) { //qDebug() << Q_FUNC_INFO ; QString fileName = QFileDialog::getSaveFileName(this, tr("Save ADIF File"), util->getHomeDir(), "ADIF (*.adi *.adif)"); QList qsos = filemanager->adifLogExportReturnList2(fileName, _call, _qsos, ModeADIF, currentLog); showNumberOfSavedQSO(fileName, qsos.count()); //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindow::slotADIFExportAll() { //qDebug() << Q_FUNC_INFO << " - Start"; logEvent(Q_FUNC_INFO, "Start", Debug); QString _callToUse = "ALL"; QList _qsos; _qsos.clear(); _qsos.append(-1); //Code to specify to export ALL QSOs; QString fileName = QFileDialog::getSaveFileName(this, tr("Save ADIF File"), util->getHomeDir(), "ADIF (*.adi *.adif)"); QList qsos = filemanager->adifLogExportReturnList2(fileName, _callToUse, _qsos, ModeADIF, currentLog); showNumberOfSavedQSO(fileName, qsos.count()); //qDebug() << "MainWindow::slotADIFExportAll-1: " << fileName ; //QList qsos = filemanager->adifLogExportReturnList(fileName, _callToUse, QString(), dataProxy->getFirstQSODateFromCall(_callToUse), dataProxy->getLastQSODateFromCall(_callToUse), -1, ModeADIF); //qDebug() << "MainWindow::slotADIFExportAll-3" ; //showNumberOfSavedQSO(fileName, qsos.count()); //filemanager->adifLogExport(fileName, 0); logEvent(Q_FUNC_INFO, "END", Debug); } /* void MainWindow::fileExportLoTW(const QString &_st, const QString &_grid, const QDate &_startDate, const QDate &_endDate) { //qDebug() << "MainWindow::fileExportLoTW - Start: " << _st << "/" << _grid <<_startDate.toString("yyyyMMdd") <<"/" << _endDate.toString("yyyyMMdd") ; QMessageBox msgBox; if (!util->isValidCall(_st)) { //qDebug() << "MainWindow::fileExportLoTW - no valid call" ; if (_st == "ALL") { msgBox.setWindowTitle(tr("KLog - LoTW")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("You need to select one station callsign to be able to send your log to LoTW.")); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } return; } if ((!_startDate.isValid()) || (!_endDate.isValid())) { //qDebug() << "MainWindow::fileExportLoTW - no valid date" ; return; } //QString fileName = "klog-lotw-upload.adi"; QString fileName = util->getLoTWAdifFile(); QList qsos = filemanager->adifLogExportReturnList(fileName, _st, _grid, _startDate, _endDate, currentLog, ModeLotW); if (qsos.count() <= 0) { // TODO: Check if errors should be managed. //qDebug() << "MainWindow::fileExportLoTW NO QSOs" ; return; } //qDebug() << "MainWindow::fileExportLoTW - 50" ; bool uploadedToLoTW = callTQSL(fileName, _st); //bool uploadedToLoTW = true; //qDebug() << "MainWindow::fileExportLoTW - 51" ; int i ; if (uploadedToLoTW) { msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - LoTW")); msgBox.setText(tr("TQSL finished with no error.\n\nDo you want to mark as Sent all the QSOs uploaded to LoTW?") ); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No ); msgBox.setDefaultButton(QMessageBox::Yes); int i = msgBox.exec(); if (i == QMessageBox::Yes) { uploadedToLoTW = dataProxy->lotwSentQSOs(qsos); slotLogRefresh(); if (!uploadedToLoTW) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - LoTW")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("There was an error while updating to Yes the LoTW QSL sent information.")); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } } } if (!deleteAlwaysAdiFile){ msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - LoTW")); msgBox.setText(tr("The LoTW upload process has finished and KLog created a file (%1) in your KLog folder.\n\nDo you want KLog to remove that file?").arg(fileName)); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No ); msgBox.setDefaultButton(QMessageBox::Yes); i = msgBox.exec(); if (i == QMessageBox::Yes) { if (QFile::remove(fileName)) { msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog - LoTW")); msgBox.setText(tr("The file has been removed.")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); } } }else{ QFile::remove(fileName); } } */ void MainWindow::fileExportLoTW2(const QString &_call, QList _qsos) { //qDebug() << Q_FUNC_INFO << " - Start"; //qDebug() << Q_FUNC_INFO << QString(" - Start: %1 / QSOs: %2" ).arg(_call).arg(_qsos.length ()); if (_qsos.length ()<1) { //TODO SHOW MESSAGE Asking for at least one QSO and exit } QMessageBox msgBox; if (!util->isValidCall(_call)) { //qDebug() << Q_FUNC_INFO << " - no valid call" ; if (_call == "ALL") { msgBox.setWindowTitle(tr("KLog - LoTW")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("You need to select one station callsign to be able to send your log to LoTW.")); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } return; } QString fileName = util->getLoTWAdifFile(); QList qsos = filemanager->adifLogExportReturnList2(fileName, _call, _qsos, ModeLotW, currentLog); if (qsos.count() <= 0) { // TODO: Check if errors should be managed. //qDebug() << Q_FUNC_INFO << " - NO QSOs" ; return; } //qDebug() << Q_FUNC_INFO << " - 50" ; bool uploadedToLoTW = callTQSL(fileName, _call); //qDebug() << Q_FUNC_INFO << " - 51" ; int i ; if (uploadedToLoTW) { msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - LoTW")); msgBox.setText(tr("TQSL finished with no error.\n\nDo you want to mark as Sent all the QSOs uploaded to LoTW?") ); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No ); msgBox.setDefaultButton(QMessageBox::Yes); int i = msgBox.exec(); if (i == QMessageBox::Yes) { uploadedToLoTW = dataProxy->lotwSentQSOs(qsos); slotLogRefresh(); if (!uploadedToLoTW) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - LoTW")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("There was an error while updating to Yes the LoTW QSL sent information.")); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } } } if (!deleteAlwaysAdiFile) { msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - LoTW")); msgBox.setText(tr("The LoTW upload process has finished and KLog created a file (%1) in your KLog folder.\n\nDo you want KLog to remove that file?").arg(fileName)); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No ); msgBox.setDefaultButton(QMessageBox::Yes); i = msgBox.exec(); if (i == QMessageBox::Yes) { if (QFile::remove(fileName)) { msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog - LoTW")); msgBox.setText(tr("The file has been removed.")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); } } } else { QFile::remove(fileName); } //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindow::fileExportClubLog2(const QString &_call, QList _qsos) { //qDebug() << Q_FUNC_INFO << QString(" - Start: %1 / QSOs: %2" ).arg(_call).arg(_qsos.length ()); QMessageBox msgBox; if (!util->isValidCall(_call)) { //qDebug() << Q_FUNC_INFO << " - no valid call" ; if (_call == "ALL") { msgBox.setWindowTitle(tr("KLog - ClubLog")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("You need to select one station callsign to be able to send your log to ClubLog.")); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } return; } QString fileName = util->getClubLogFile(); QList qsos = filemanager->adifLogExportReturnList2(fileName, _call, _qsos, ModeClubLog, currentLog); if (qsos.count() <= 0) { // TODO: Check if errors should be managed. //qDebug() << Q_FUNC_INFO << " - NO QSOs" ; msgBox.setWindowTitle(tr("KLog - ClubLog")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("The selection you have done does not include any QSO")); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); return; } msgBox.setWindowTitle(tr("KLog - ClubLog")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("Do you want to add this QSOs to your ClubLog existing log?")); msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::No); msgBox.setDetailedText(tr("If you don't agree, this upload will overwrite your current ClubLog existing log.")); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); bool overwrite = false; switch (ret) { case QMessageBox::Ok: // General ADIF overwrite = false; break; case QMessageBox::No: // ClubLog overwrite = true; break; } //qDebug() << Q_FUNC_INFO << " - 50" ; elogClublog->sendLogFile(fileName, _qsos, overwrite); logWindow->refresh(); //qDebug() << Q_FUNC_INFO << " - END " ; } /* void MainWindow::fileExportClubLog(const QString &_st, const QDate &_startDate, const QDate &_endDate) { //qDebug() << Q_FUNC_INFO << "- Start: " << _st << "/" <<_startDate.toString("yyyyMMdd") <<"/" << _endDate.toString("yyyyMMdd") ; QMessageBox msgBox; if (!util->isValidCall(_st)) { //qDebug() << Q_FUNC_INFO << " - no valid call" ; if (_st == "ALL") { msgBox.setWindowTitle(tr("KLog - ClubLog")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("You need to select one station callsign to be able to send your log to ClubLog.")); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } return; } if ((!_startDate.isValid()) || (!_endDate.isValid())) { //qDebug() << Q_FUNC_INFO << " - no valid date" ; return; } //QString fileName = "klog-clublog-upload.adi"; QString fileName = util->getClubLogFile(); QList qsos = filemanager->adifLogExportReturnList(fileName, _st, QString(), _startDate, _endDate, currentLog, ModeClubLog); if (qsos.count() <= 0) { // TODO: Check if errors should be managed. //qDebug() << Q_FUNC_INFO << " NO QSOs" ; return; } msgBox.setWindowTitle(tr("KLog - ClubLog")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("Do you want to add this QSOs to your ClubLog existing log?")); msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::No); msgBox.setDetailedText(tr("If you don't agree, this upload will overwrite your current ClubLog existing log.")); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); bool overwrite = false; switch (ret) { case QMessageBox::Ok: // General ADIF overwrite = false; break; case QMessageBox::No: // ClubLog overwrite = true; break; } //qDebug() << Q_FUNC_INFO << " - 50" ; elogClublog->sendLogFile(fileName, qsos, overwrite); logWindow->refresh(); //qDebug() << Q_FUNC_INFO << " -END " ; } */ /* void MainWindow::fileExportEQSL(const QString &_st, const QDate &_startDate, const QDate &_endDate) { //qDebug() << Q_FUNC_INFO << " - Start: " << _st << "/" <<_startDate.toString("yyyyMMdd") <<"/" << _endDate.toString("yyyyMMdd") ; QMessageBox msgBox; if (!util->isValidCall(_st)) { //qDebug() << Q_FUNC_INFO << "- no valid call" ; if (_st == "ALL") { msgBox.setWindowTitle(tr("KLog - eQSL")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("You need to select one station callsign to be able to send your log to eQSL.cc.")); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } return; } if ((!_startDate.isValid()) || (!_endDate.isValid())) { //qDebug() << Q_FUNC_INFO << "- no valid date" ; return; } //QString fileName = "klog-eqsl-upload.adi"; QString fileName = util->getEQSLFile(); QList qsos = filemanager->adifLogExportReturnList(fileName, _st, QString(), _startDate, _endDate, currentLog, ModeEQSL); if (qsos.count() <= 0) { // TODO: Check if errors should be managed. //qDebug() << Q_FUNC_INFO << "NO QSOs" ; return; } eqslUtilities->sendLogFile(fileName, qsos); logWindow->refresh(); //qDebug() << Q_FUNC_INFO << "-END " ; } */ void MainWindow::fileExportEQSL2(const QString &_call, QList _qsos) { //qDebug() << Q_FUNC_INFO << QString(" - Start: QSOs: %2" ).arg(_qsos.length ()); //QString fileName = "klog-eqsl-upload.adi"; QString fileName = util->getEQSLFile(); QList qsos = filemanager->adifLogExportReturnList2(fileName, _call, _qsos, ModeEQSL, currentLog); if (qsos.count() <= 0) { // TODO: Check if errors should be managed. //qDebug() << Q_FUNC_INFO << " - NO QSOs" ; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - ClubLog")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("The selection you have done does not include any QSO.")); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); return; } eqslUtilities->sendLogFile(fileName, _qsos); logWindow->refresh(); //qDebug() << Q_FUNC_INFO << "-END " ; } void MainWindow::slotADIFExportSelection(const QString &_call, QList _qsos, ExportMode _eM) { //qDebug() << Q_FUNC_INFO << QString(" - Start: %1 / QSOs: %2" ).arg(_call).arg(_qsos.length ()); //qDebug() << Q_FUNC_INFO << " - Trigered by signal: selection"; switch (_eM) { case ModeADIF: // General ADIF fileExportADIF2(_call, _qsos); break; case ModeLotW: // LoTW //qDebug() << Q_FUNC_INFO << " - LoTW" ; fileExportLoTW2(_call, _qsos); break; case ModeClubLog: // ClubLog //qDebug() << Q_FUNC_INFO << " - ClubLog" ; fileExportClubLog2(_call, _qsos); break; case ModeEQSL: // General eQSL //qDebug() << Q_FUNC_INFO << " - eQSL" ; fileExportEQSL2(_call, _qsos); break; case ModeQRZ: // General eQSL //qDebug() << Q_FUNC_INFO << " - QRZ.com" ; elogQRZcom->sendQSOs(_qsos); break; } logWindow->refresh(); //qDebug() << Q_FUNC_INFO << " - END " ; } void MainWindow::slotLoTWExport() { // 1.- Selec call // 2.- Select file and export (fixed filename?) // 3.- Call tqsl with the filename // 4.- Ask for the user to remove or not the file //qDebug() << "MainWindow::slotLoTWExport - Start" ; // bool emptyCall = false; if (!lotwActive) { showMessageToEnableTheOnlineService(LoTW); return; } adifLoTWExportWidget->setExportMode(ModeLotW); adifLoTWExportWidget->show(); //qDebug() << "MainWindow::slotLoTWExport- END" ; } void MainWindow::slotLoTWDownload() { //qDebug() << "MainWindow::slotDownUpload - Start" ; logEvent(Q_FUNC_INFO, "Start", Debug); QStringList calls; calls << dataProxy->getStationCallSignsFromLog(-1); bool ok; QString callToUse = QInputDialog::getItem(this, tr("KLog - Select the Station Callsign."), tr("Select the Station Callsign to use when quering LoTW:"), calls, 0, false, &ok); //qDebug() << "MainWindow::slotDownUpload: " << callToUse ; if (ok && !callToUse.isEmpty()) { lotwUtilities->setStationCallSign(callToUse); } else { logEvent(Q_FUNC_INFO, "END-1", Debug); return; } if (!lotwUtilities->getIsReady()) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - LoTW")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("Please check the LoTW setup")); msgBox.setInformativeText(tr("You have not defined a LoTW user or a proper Station Callsign.\nOpen the LoTW tab in the Setup and configure your LoTW connection.")); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); logEvent(Q_FUNC_INFO, "END-2", Debug); return; } lotwUtilities->download(); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainWindow::slotDownUpload - END" ; } void MainWindow::slotLoTWFullDownload() { //qDebug() << "MainWindow::slotLoTWFullDownload - Start" ; logEvent(Q_FUNC_INFO, "Start", Debug); QStringList calls; calls << dataProxy->getStationCallSignsFromLog(-1); bool ok; QString callToUse = QInputDialog::getItem(this, tr("KLog - Select the Station Callsign."), tr("Select the Station Callsign to use when quering LoTW:"), calls, 0, false, &ok); //qDebug() << "MainWindow::slotLoTWFullDownload: " << callToUse ; if (ok && !callToUse.isEmpty()) { lotwUtilities->setStationCallSign(callToUse); } else { logEvent(Q_FUNC_INFO, "END-1", Debug); return; } if (!lotwUtilities->getIsReady()) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - LoTW")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("Please check the LoTW setup")); msgBox.setInformativeText(tr("You have not defined a LoTW user or a proper Station Callsign.\nOpen the LoTW tab in the Setup and configure your LoTW connection.")); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); logEvent(Q_FUNC_INFO, "END-2", Debug); return; } lotwUtilities->fullDownload(); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainWindow::slotLoTWFullDownload - END" ; } void MainWindow::slotElogClubLogModifyCurrentLog() { QMessageBox msgConfirm; msgConfirm.setIcon(QMessageBox::Question); msgConfirm.setWindowTitle(tr("KLog - ClubLog")); msgConfirm.setText(tr("Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1").arg(tr("ClubLog"))); msgConfirm.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgConfirm.setDefaultButton(QMessageBox::No); int i = msgConfirm.exec(); if (i == QMessageBox::Yes) { QMessageBox msgBox; if (dataProxy->clublogModifyFullLog(currentLog)) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("The log is ready to be uploaded to ClubLog.")); msgBox.setDetailedText(tr("All the QSOs in this log has been marked as Modified in the ClubLog status field")); } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("KLog could not mark the full log to be sent to ClubLog")); msgBox.setDetailedText(tr("Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers.")); } msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } } void MainWindow::slotElogEQSLModifyCurrentLog() { QMessageBox msgConfirm; msgConfirm.setIcon(QMessageBox::Question); msgConfirm.setWindowTitle(tr("KLog - eQSL")); msgConfirm.setText(tr("Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1").arg(tr("eQSL"))); msgConfirm.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgConfirm.setDefaultButton(QMessageBox::No); int i = msgConfirm.exec(); if (i == QMessageBox::Yes) { QMessageBox msgBox; if (dataProxy->eQSLModifyFullLog(currentLog)) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("The log is ready to be uploaded to eQSL.cc.")); msgBox.setDetailedText(tr("All the QSOs in this log has been marked as Modified in the eQSL.cc status field")); } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("KLog could not mark the full log to be sent to eQSL")); msgBox.setDetailedText(tr("Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers.")); } msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } } void MainWindow::slotElogQRZCOMModifyCurrentLog() { QMessageBox msgConfirm; msgConfirm.setIcon(QMessageBox::Question); msgConfirm.setWindowTitle(tr("KLog - QRZ.COM")); msgConfirm.setText(tr("Do you really want to mark ALL your QSOs to be UPLOADED? Must be done ONLY IF THIS IS YOUR FIRST TIME uploading QSOs to %1").arg(tr("QRZ.COM"))); msgConfirm.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgConfirm.setDefaultButton(QMessageBox::No); int i = msgConfirm.exec(); if (i == QMessageBox::Yes) { QMessageBox msgBox; if (dataProxy->QRZCOMModifyFullLog(currentLog)) { msgBox.setIcon(QMessageBox::Information); msgBox.setText(tr("The log is ready to be uploaded to QRZ.com.")); msgBox.setDetailedText(tr("All the QSOs in this log has been marked as Modified in the QRZ.com status field")); } else { msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("KLog could not mark the full log to be sent to QRZ.com")); msgBox.setDetailedText(tr("Something prevented KLog from marking the QSOs as modified. Restart KLog and try again before contacting the KLog developers.")); } msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } } void MainWindow::slotClubLogLogUpload() { logEvent(Q_FUNC_INFO, "Start", Debug); if (!clublogActive) { showMessageToEnableTheOnlineService(ClubLog); return; } adifLoTWExportWidget->setExportMode(ModeClubLog); adifLoTWExportWidget->show(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::sloteQSLLogUpload() { logEvent(Q_FUNC_INFO, "Start", Debug); if (!eQSLActive) { showMessageToEnableTheOnlineService(eQSL) ; return; } adifLoTWExportWidget->setExportMode(ModeEQSL); adifLoTWExportWidget->show(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotQRZCOMLogUpload() { logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO ; if (!qrzcomActive) { showMessageToEnableTheOnlineService(QRZ) ; //qDebug() << Q_FUNC_INFO << " - END" ; return; } if (!qrzcomSubscriber) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - QRZ.com")); msgBox.setText(tr("To upload QSOs you need a qrz.com subscription. If you have one, go to Setup->QRZ.com tab to enable it.") ); msgBox.exec(); //qDebug() << Q_FUNC_INFO << " - END" ; return; } if (!elogQRZcom->hasLogBookKey()) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - QRZ.com")); msgBox.setText(tr("You need to define a proper API Key for your QRZ.com logbook in the eLog preferences.") ); msgBox.exec(); //qDebug() << Q_FUNC_INFO << " - END" ; return; } adifLoTWExportWidget->setExportMode(ModeQRZ); adifLoTWExportWidget->show(); //qDebug() << Q_FUNC_INFO << " - END" ; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotRQSLExport() { logEvent(Q_FUNC_INFO, "Start", Debug); QString fileName = QFileDialog::getSaveFileName(this, tr("Save ADIF File"), util->getHomeDir(), "ADIF (*.adi *.adif)"); filemanager->adifReqQSLExport(fileName); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotADIFImport(){ //qDebug() << "MainWindow::slotADIFImport " ; logEvent(Q_FUNC_INFO, "Start", Debug); QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), util->getHomeDir(), "ADIF (*.adi *.adif)"); if (!fileName.isNull()) { //qDebug() << "MainWindow::slotADIFImport -1" ; //filemanager->adifReadLog(fileName, currentLog); filemanager->adifReadLog2(fileName, currentLog); updateQSLRecAndSent(); //qDebug() << "MainWindow::slotADIFImport -2" ; //dxccStatusWidget->refresh(); logWindow->refresh(); //qDebug() << "MainWindow::slotADIFImport -3"; checkIfNewBandOrMode(); //qDebug() << "MainWindow::slotADIFImport -4" ; //operatingYearsComboBox->addItems(dataProxy->getOperatingYears(currentLog)); awardsWidget->fillOperatingYears(); //qDebug() << "MainWindow::slotADIFImport-DX-1" ; slotShowAwards(); awardsWidget->showAwards(); //qDebug() << "MainWindow::slotADIFImport-DX-1-end" ; //qDebug() << "MainWindow::slotADIFImport-7" ; } logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainWindow::slotADIFImport-END" ; } void MainWindow::qsoToEdit (const int _qso) { //qDebug() << Q_FUNC_INFO << QString::number(_qso) ; logEvent(Q_FUNC_INFO, "Start", Debug); if (!modify) { backupCurrentQSO (); } clearUIDX(true); readingTheUI = true; int nameCol; QString aux1; double testValueDouble; // Variable just to test if the value is in the appropriate range setModifying(true); modifyingQSO = _qso; //TODO: Optimize the following query. Maybe the * is not needed. QString stringQuery = QString("SELECT * FROM log WHERE id ='%1' AND lognumber='%2'").arg(_qso).arg(currentLog); //qDebug() << Q_FUNC_INFO << " - " << stringQuery ; QSqlQuery query(stringQuery); bool sqlOK = query.exec(); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } query.next(); if (query.isValid()) { if ((clublogActive) && (clublogRealTime)) { clublogPrevQSO = dataProxy->getClubLogRealTimeFromId(_qso); } QSqlRecord rec = query.record(); manualMode = true; // We stop hamlib & wsjtx receiving data while editing a QSO mainQSOEntryWidget->setManualMode (manualMode); // ADD THE DATA THAT IS PRESENT IN ALL THE MODES // ** Start of SAT data // ** BAND / MODE / Locator shoule be executed after SAT or may be removed //qDebug() << Q_FUNC_INFO << " - SATELLITE - Start" ; //qDebug() << Q_FUNC_INFO << " - SATELLITE - satName" ; satTabWidget->setFillingToEdit(true); nameCol = rec.indexOf("sat_name"); aux1 = (query.value (nameCol)).toString(); //qDebug() << Q_FUNC_INFO << " - SatName: " << aux1; if (aux1.length()>0) { satTabWidget->setSatName(aux1); } else { satTabWidget->clear(); } //qDebug() << Q_FUNC_INFO << " - Start SATELLITE - satMode" ; nameCol = rec.indexOf("sat_mode"); aux1 = (query.value (nameCol)).toString(); if (aux1.length()>1) { satTabWidget->setSatMode(aux1); } else { satTabWidget->setSatMode("-CLEAR-"); } //qDebug() << Q_FUNC_INFO << " - SATELLITE - end" ; // END of SAT data //QString currentQrz = dataProxy->getCallFromId(modifyingQSO); nameCol = rec.indexOf("call"); aux1 = (query.value (nameCol)).toString(); //qDebug() << Q_FUNC_INFO << " - calling setQRZ-1" ; mainQSOEntryWidget->setQRZ(aux1); QString currentQrz = aux1; currentEntity = world->getQRZARRLId(currentQrz); //qDebug() << Q_FUNC_INFO << " - currentEntity " << QString::number(currentEntity) ; nameCol = rec.indexOf("qso_date"); aux1 = (query.value (nameCol)).toString(); //qDebug() << Q_FUNC_INFO << " - date: " << aux1 ; mainQSOEntryWidget->setDateTime(util->getDateTimeFromSQLiteString(aux1)); //mainQSOEntryWidget->setDate(QDate::fromString(aux1, "yyyy/MM/dd")); dateTimeTemp->setDate(util->getDateFromSQliteString(aux1)); //qDebug() << Q_FUNC_INFO << " - bandid" ; nameCol = rec.indexOf("bandid"); aux1 = (query.value (nameCol)).toString(); stringQuery = QString("SELECT name FROM band WHERE id ='%1'").arg(aux1); QSqlQuery queryAux(stringQuery); sqlOK = queryAux.exec(); if (!sqlOK) { emit queryError(Q_FUNC_INFO, queryAux.lastError().databaseText(), queryAux.lastError().nativeErrorCode(), queryAux.lastQuery()); } queryAux.next(); if (queryAux.isValid()) { aux1 = (queryAux.value (0)).toString(); //qDebug() << Q_FUNC_INFO << " - bandid-1 " << aux1 ; //qDebug() << Q_FUNC_INFO << " - Changing from: " << mainQSOEntryWidget->getBand() ; mainQSOEntryWidget->setBand(aux1); //bandComboBox->setCurrentIndex(bandComboBox->findText(aux1, Qt::MatchCaseSensitive)); //qDebug() << Q_FUNC_INFO << " - Changing to: " << mainQSOEntryWidget->getBand() ; } else { //qDebug() << Q_FUNC_INFO << " - bandid-NO " ; mainQSOEntryWidget->setBand(dataProxy->getNameFromBandId(defaultBand)); //bandComboBox->setCurrentIndex(bandComboBox->findText(dataProxy->getNameFromBandId(defaultBand), Qt::MatchCaseSensitive)); //bandComboBox->setCurrentIndex(defaultBand); } //qDebug() << Q_FUNC_INFO << " - modeid" ; nameCol = rec.indexOf("modeid"); aux1 = (query.value (nameCol)).toString(); //qDebug() << Q_FUNC_INFO << " - (aux1)-1: " << aux1 ; aux1 = dataProxy->getNameFromSubModeId(aux1.toInt()); //qDebug() << Q_FUNC_INFO << " - RST" ; QSOTabWidget->setRSTToMode(aux1, readingTheUI); if (mainQSOEntryWidget->isModeExisting(aux1)) { mainQSOEntryWidget->setMode(aux1); } else { mainQSOEntryWidget->setMode(dataProxy->getNameFromSubModeId(defaultMode)); } stringQuery = QString("SELECT submode FROM mode WHERE id ='%1'").arg(aux1); sqlOK = queryAux.exec(stringQuery); //qDebug() << Q_FUNC_INFO << " - After ALL Mode actions" ; nameCol = rec.indexOf("rst_sent"); aux1 = (query.value (nameCol)).toString(); QSOTabWidget->setRSTTX (aux1); //qDebug() << Q_FUNC_INFO << " - RST_SENT: " << aux1 ; nameCol = rec.indexOf("rst_rcvd"); aux1 = (query.value (nameCol)).toString(); QSOTabWidget->setRSTRX (aux1); //qDebug() << Q_FUNC_INFO << " - before switch" ; nameCol = rec.indexOf("qsl_via"); aux1 = (query.value (nameCol)).toString(); QSLTabWidget->setQSLVia(aux1); nameCol = rec.indexOf("qslmsg"); aux1 = (query.value (nameCol)).toString(); QSLTabWidget->setQSLMsg(aux1); //qslmsgTextEdit->setText(aux1); nameCol = rec.indexOf("comment"); aux1 = (query.value (nameCol)).toString(); if (aux1.length()>0) { commentTabWidget->setData(aux1); //commentLineEdit->setText(aux1); } else { commentTabWidget->clear(); //commentLineEdit->clear(); } nameCol = rec.indexOf("name"); aux1 = (query.value (nameCol)).toString(); //qDebug() << Q_FUNC_INFO << " - NAME: " << aux1 ; if (aux1.length()>0) { QSOTabWidget->setName (aux1); } else { QSOTabWidget->clearName (); } nameCol = rec.indexOf("qth"); aux1 = (query.value (nameCol)).toString(); QSOTabWidget->setQTH (aux1); nameCol = rec.indexOf("gridsquare"); aux1 = (query.value (nameCol)).toString(); //qDebug() << Q_FUNC_INFO << " - GRIDSQUARE: " << aux1 ; QSOTabWidget->setDXLocator(aux1); nameCol = rec.indexOf("operator"); aux1 = (query.value (nameCol)).toString(); //qDebug() << Q_FUNC_INFO << " - OPERATOR: " << aux1 ; myDataTabWidget->setOperator(aux1); nameCol = rec.indexOf("station_callsign"); aux1 = (query.value (nameCol)).toString(); //qDebug() << Q_FUNC_INFO << " - STATIONQRZ: " << aux1 ; myDataTabWidget->setStationCallsign(aux1); nameCol = rec.indexOf("my_gridsquare"); aux1 = (query.value (nameCol)).toString(); myDataTabWidget->setMyLocator(aux1); nameCol = rec.indexOf("my_vucc_grids"); aux1 = (query.value (nameCol)).toString(); myDataTabWidget->setMyVUCCGrids(aux1); nameCol = rec.indexOf("my_rig"); aux1 = (query.value (nameCol)).toString(); if (!aux1.isEmpty ()) { myDataTabWidget->setMyRig (aux1); } nameCol = rec.indexOf("my_antenna"); aux1 = (query.value (nameCol)).toString(); if (!aux1.isEmpty ()) { myDataTabWidget->setMyAntenna (aux1); } nameCol = rec.indexOf("my_sota_ref"); aux1 = (query.value (nameCol)).toString(); if (!aux1.isEmpty ()) { myDataTabWidget->setMySOTA (aux1); } nameCol = rec.indexOf("tx_pwr"); myDataTabWidget->setMyPower((query.value (nameCol)).toDouble()); nameCol = rec.indexOf("rx_pwr"); aux1 = (query.value (nameCol)).toString(); testValueDouble = aux1.toDouble(); if (testValueDouble >=0) { QSOTabWidget->setRXPwr(testValueDouble); } else { QSOTabWidget->setRXPwr(0.0); } //qDebug() << Q_FUNC_INFO << " - freq" ; nameCol = rec.indexOf("freq"); aux1 = (query.value (nameCol)).toString(); QSOTabWidget->setTXFreq (aux1.toDouble ()); //qDebug() << Q_FUNC_INFO << " - freq_rx" ; nameCol = rec.indexOf("freq_rx"); aux1 = (query.value (nameCol)).toString(); QSOTabWidget->setRXFreq (aux1.toDouble ()); //QSL SENT //qDebug() << Q_FUNC_INFO << " - qsl_sent" ; nameCol = rec.indexOf("qsl_sent"); aux1 = (query.value (nameCol)).toString(); QSLTabWidget->setQSLSenStatus(aux1); //TODO: Depending on the Value a date should or not exist. // This code may be importing dates when they should not exist. nameCol = rec.indexOf("qslsdate"); aux1 = (query.value (nameCol)).toString(); if (util->getDateFromSQliteString(aux1).isValid() ) //if ( (QDate::fromString(aux1, "yyyy/MM/dd")).isValid() ) { QSLTabWidget->setQSLSenDate(util->getDateFromSQliteString(aux1)); } nameCol = rec.indexOf("qsl_sent_via"); aux1 = (query.value (nameCol)).toString(); QSLTabWidget->setQSLSenVia(aux1); //QSL RECEPTION // tr("Y-Yes") << tr("N-No") << tr("R-Requested") << tr("I-Ignore") << tr("V-Verified"); // tr("B-Bureau") << tr("D-Direct") << tr("E-Electronic") << tr("M-Manager"); //QSLRDATE: (only valid if QSL_RCVD is Y, I, or V) nameCol = rec.indexOf("qsl_rcvd"); aux1 = (query.value (nameCol)).toString(); QSLTabWidget->setQSLRecStatus(aux1); //TODO: Depending on the Value a date should or not exist. // This code may be importing dates when they should not exist. nameCol = rec.indexOf("qslrdate"); aux1 = (query.value (nameCol)).toString(); if (util->getDateFromSQliteString(aux1).isValid() ) { QSLTabWidget->setQSLRecDate(util->getDateFromSQliteString(aux1)); } nameCol = rec.indexOf("qsl_rcvd_via"); aux1 = (query.value (nameCol)).toString(); QSLTabWidget->setQSLRecVia(aux1); //TODO: BUG: When something is selected while modifying the QSL is deleted??? //CLUBLOG nameCol = rec.indexOf("clublog_qso_upload_status"); aux1 = (query.value (nameCol)).toString(); eQSLTabWidget->setClubLogStatus(aux1.toUpper()); //TODO: Depending on the Value a date should or not exist. // This code may be importing dates when they should not exist. nameCol = rec.indexOf("clublog_qso_upload_date"); aux1 = (query.value (nameCol)).toString(); if (util->getDateFromSQliteString(aux1).isValid() ) { eQSLTabWidget->setClubLogDate(util->getDateFromSQliteString(aux1)); } //CLUBLOG //EQSL_QSL_SENT: {Y, N, R, Q, I} // tr("Y-Yes") << tr("N-No") << tr("R-Requested") << tr("Q-Queued") << tr("I-Ignore"); //EQSL_QSLSDATE (only valid if EQSL_SENT is Y, Q, or I) nameCol = rec.indexOf("eqsl_qsl_sent"); aux1 = (query.value (nameCol)).toString(); eQSLTabWidget->setEQSLSenStatus(aux1.toUpper()); //TODO: Depending on the Value a date should or not exist. // This code may be importing dates when they should not exist. nameCol = rec.indexOf("eqsl_qslsdate"); aux1 = (query.value (nameCol)).toString(); if (util->getDateFromSQliteString(aux1).isValid() ) { eQSLTabWidget->setEQSLSenDate(util->getDateFromSQliteString(aux1)); } //E-QSL RECEPTION // tr("Y-Yes") << tr("N-No") << tr("R-Requested") << tr("I-Ignore") << tr("V-Verified"); // EQSL_QSL_RCVD: {Y, N, R, I, V} // EQSL_QSLRDATE: (only valid if EQSL_RCVD is Y, I, or V) nameCol = rec.indexOf("eqsl_qsl_rcvd"); aux1 = (query.value (nameCol)).toString(); eQSLTabWidget->setEQSLRecStatus(aux1.toUpper()); //TODO: Depending on the Value a date should or not exist. // This code may be importing dates when they should not exist. nameCol = rec.indexOf("eqsl_qslrdate"); aux1 = (query.value (nameCol)).toString(); if (util->isValidDateFromString(aux1)) { eQSLTabWidget->setEQSLRecDate(util->getDateFromSQliteString(aux1)); } //LOTW_QSL_SENT: {Y, N, R, Q, I} // tr("Y-Yes") << tr("N-No") << tr("R-Requested") << tr("Q-Queued") << tr("I-Ignore"); //LOTW_QSLSDATE (only valid if LOTW_SENT is Y, Q, or I) nameCol = rec.indexOf("lotw_qsl_sent"); aux1 = (query.value (nameCol)).toString(); eQSLTabWidget->setLOTWSenStatus(aux1.toUpper()); //qDebug() << Q_FUNC_INFO << " LoTW Sent Status: " << aux1 ; //TODO: Depending on the Value a date should or not exist. // This code may be importing dates when they should not exist. nameCol = rec.indexOf("lotw_qslsdate"); aux1 = (query.value (nameCol)).toString(); if ( util->isValidDateFromString(aux1) ) { eQSLTabWidget->setLOTWSenDate(util->getDateFromSQliteString(aux1)); } //E-QSL RECEPTION // tr("Y-Yes") << tr("N-No") << tr("R-Requested") << tr("I-Ignore") << tr("V-Verified"); // lotw_QSL_RCVD: {Y, N, R, I, V} // lotw_QSLRDATE: (only valid if lotw_RCVD is Y, I, or V) nameCol = rec.indexOf("lotw_qsl_rcvd"); aux1 = (query.value (nameCol)).toString(); eQSLTabWidget->setLOTWRecStatus(aux1.toUpper()); //TODO: Depending on the Value a date should or not exist. // This code may be importing dates when they should not exist. nameCol = rec.indexOf("lotw_qslrdate"); aux1 = (query.value (nameCol)).toString(); if ( util->isValidDateFromString(aux1) ) { eQSLTabWidget->setLOTWRecDate(util->getDateFromSQliteString(aux1)); } //QRZCOM nameCol = rec.indexOf("qrzcom_qso_upload_status"); aux1 = (query.value (nameCol)).toString(); eQSLTabWidget->setQRZCOMStatus(aux1.toUpper()); //TODO: Depending on the Value a date should or not exist. // This code may be importing dates when they should not exist. nameCol = rec.indexOf("qrzcom_qso_upload_date"); aux1 = (query.value (nameCol)).toString(); if (util->getDateFromSQliteString(aux1).isValid() ) { eQSLTabWidget->setQRZCOMDate(util->getDateFromSQliteString(aux1)); } //QRZCOM // OTHERS TAB nameCol = rec.indexOf("sota_ref"); aux1 = (query.value (nameCol)).toString(); if (!aux1.isEmpty ()) { othersTabWidget->setSOTA (aux1); } nameCol = rec.indexOf("age"); aux1 = (query.value (nameCol)).toString(); if (aux1.toDouble ()>0) { othersTabWidget->setAge (aux1.toDouble ()); } nameCol = rec.indexOf("distance"); aux1 = (query.value (nameCol)).toString(); if (aux1.toDouble ()>0) { othersTabWidget->setDistance(aux1.toDouble ()); } nameCol = rec.indexOf("vucc_grids"); aux1 = (query.value (nameCol)).toString(); //qDebug() << Q_FUNC_INFO << " - VUCC_GRIDS: " << aux1; if (util->isValidVUCCGrids (aux1)) { othersTabWidget->setVUCCGrids (aux1); } //qDebug() << Q_FUNC_INFO << " - just before IOTA" ; nameCol = rec.indexOf("iota"); aux1 = (query.value (nameCol)).toString(); aux1 = awards->checkIfValidIOTA(aux1); othersTabWidget->setIOTA(aux1); //qDebug() << Q_FUNC_INFO << " - in default - 100: " << QString::number(currentEntity) ; nameCol = rec.indexOf("dxcc"); aux1 = (query.value (nameCol)).toString(); //qDebug() << Q_FUNC_INFO << " - Checking DXCC: " << aux1 << " - " << world->getEntityName(aux1.toInt()) ; if (aux1.toInt()>=1) { if (aux1.toInt() != util->getNormalizedDXCCValue (currentEntity)) { currentEntity = aux1.toInt(); } //qDebug() << Q_FUNC_INFO << " - in default - 101: " << QString::number(currentEntity) ; } else { currentEntity = world->getQRZARRLId(currentQrz); //qDebug() << Q_FUNC_INFO << " - in default - 103: " << QString::number(currentEntity) ; } //qDebug() << Q_FUNC_INFO << " - in default - 104: " << QString::number(currentEntity) ; nameCol = rec.indexOf("prop_mode"); aux1 = (query.value (nameCol)).toString(); othersTabWidget->setPropMode(aux1, false); infoLabel2->setText(world->getEntityName(currentEntity)); infoWidget->showEntityInfo(currentEntity); //qDebug() << Q_FUNC_INFO << " - " << QString::number(currentEntity) ; othersTabWidget->setEntity(currentEntity); //qDebug() << Q_FUNC_INFO << " - in default - 101" ; QStringList _qs; //for the showStatusOfDXCC(const QStringList _qs) _qs.clear(); //TODO: The band sometimes fails here. Check _qs << QString::number(currentEntity) << QString::number(dataProxy->getIdFromBandName(mainQSOEntryWidget->getBand())) << QString::number(dataProxy->getIdFromBandName(mainQSOEntryWidget->getMode())) << QString::number(currentLog); //qDebug() << Q_FUNC_INFO << " - in default - 104" ; //qDebug() << Q_FUNC_INFO << " - calling showStatusOfDXCC-05 " ; showStatusOfDXCC(_qs); //qDebug() << Q_FUNC_INFO << " - in default - 106" ; } //Closes the next.isValid //qDebug() << Q_FUNC_INFO << " - in default - END" ; readingTheUI = false; satTabWidget->setFillingToEdit(false); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::setModifying(const bool _m) { logEvent(Q_FUNC_INFO, "Start", Debug); modify = _m; QSOTabWidget->setModifying (modify); mainQSOEntryWidget->setModify(modify); satTabWidget->setModifying(modify); myDataTabWidget->setModify (modify); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotLocatorTextChanged(const QString &_loc) {//TO BE REMOVED ONCE InfoWidget is FINISHED - At least modified //qDebug() << "MainWindow::slotLocatorTextChanged: " << _loc; logEvent(Q_FUNC_INFO, "Start", Debug); if ( locator->isValidLocator(_loc) ) { infoWidget->showDistanceAndBearing(myDataTabWidget->getMyLocator(), _loc); } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotMyLocatorTextChanged(const QString &_loc) { //qDebug() << "MainWindowMy::slotMyLocatorTextChanged: " <<_loc ; logEvent(Q_FUNC_INFO, "Start", Debug); if ( locator->isValidLocator(_loc)) { dxccStatusWidget->setMyLocator(_loc); slotLocatorTextChanged(QSOTabWidget->getDXLocator()); } else { logEvent(Q_FUNC_INFO, "END-2", Debug); return; } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::showStatusOfDXCC(const QStringList _qs) { //qDebug() << "MainWindow::showStatusOfDXC: Entity: " << _qs.at(0) << "/ Bandid :" << _qs.at(1) << "/Modeid: " << _qs.at(2) ; logEvent(Q_FUNC_INFO, "Start", Debug); // Receives: QStringList _qs; //_qs << Entity << BandId << ModeId << lognumber; // Check if new one, needed, worked, confirmed // Print the infoLabel1 // Print/Color the band boxes/labels /* 0 - New One 1 - Needed 2 - Worked 3 - Confirmed */ if ((_qs.length() != 4) || (_qs.at(1) == "-1")) // is the qs valid? { infoWidget->clear(); slotShowInfoLabel("--"); //infoLabel1->setText("--"); logEvent(Q_FUNC_INFO, "END-1", Debug); //qDebug() << "MainWindow::showStatusOfDXCC -- END" ; return; } // Set the status bar with the appropriate message int status = awards->getDXStatus (_qs); QString message = QString(); //qDebug() << "MainWindow::showStatusOfDXC: " << QString::number(status) ; message = awards->getDXStatusString(status); slotShowInfoLabel(message); //infoLabel1->setText(message); //infoWidget->showInfo((_qs.at(0)).toInt(), (_qs.at(1)).toInt(), (_qs.at(2)).toInt(), (_qs.at(3)).toInt() ); infoWidget->showInfo((_qs.at(0)).toInt()); //qDebug() << "MainWindow::showStatusOfDXC: -END" ; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::showDXMarathonNeeded(const int _dxcc, const int _cqz, const int _year, const int _log) { //qDebug() << "MainWindow::showDXMarathonNeeded" ; logEvent(Q_FUNC_INFO, "Start", Debug); if ((_dxcc<=0) || (_cqz<=0) || (!manageDxMarathon)) { logEvent(Q_FUNC_INFO, "END-1", Debug); return; } if ( awards->isDXMarathonNeed(_dxcc, _cqz, _year, _log)) { slotShowInfoLabel(infoLabel1->text()+ tr(" - Needed for DXMarathon")); //infoLabel1->setText(infoLabel1->text()+ tr(" - Needed for DXMarathon")); } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotShowAwards() { //To be called from the logWindow & searchWidget //qDebug() << "MainWindow::slotShowAwards" ; logEvent(Q_FUNC_INFO, "Start", Debug); awards->recalculateAwards(); //qDebug() << "MainWindow::slotShowAwards-1"; //logWindow->refresh(); //qDebug() << "MainWindow::slotShowAwards-2"; awardsWidget->showAwards(); //qDebug() << "MainWindow::slotShowAwards-3" ; //dxccStatusWidget->refresh(); setMainWindowTitle(); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainWindow::slotShowAwards-END" ; } void MainWindow::fillQSOData() { // Updates all QSO with the dxcc, CQZ, ... if empty. //qDebug() << "MainWindow::fillQSOData" ; logEvent(Q_FUNC_INFO, "Start", Debug); //QString stringQuery = QString("SELECT call, bandid, modeid, qso_date, lognumber, id, cqz, ituz, dxcc, cont FROM log WHERE ((dxcc<1) OR (cqz<1) OR (ituz<1) OR (dxcc IS NULL) OR (cqz IS NULL) OR (ituz IS NULL)) AND lognumber='%1'").arg(currentLog); QString stringQuery = QString("SELECT call, bandid, modeid, qso_date, lognumber, id, cqz, ituz, dxcc, cont FROM log WHERE ((dxcc<1) OR (cqz<1) OR (ituz<1) OR (dxcc IS NULL) OR (cqz IS NULL) OR (ituz IS NULL))"); QSqlQuery query; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); return; } QSqlQuery query1; QSqlRecord rec = query.record(); int nameCol; QString aux, queryString; QString _call, _bandid, _modeid, _tdate, _ttime, _lognumber, _id, aux1, updateString;//, _confirmed; bool toModify = false; bool noMoreQso = false; int numberOfQsos = 0; int i = 0; int _dxcc = 0; numberOfQsos = dataProxy->getHowManyQSOInLog(currentLog); //int progressBarPosition = 0; QProgressDialog progress(tr("Filling QSOs ..."), tr("Abort filling"), 0, numberOfQsos, this); progress.setWindowModality(Qt::WindowModal); while ( (query.next()) && (!noMoreQso) ) { if (query.isValid()) { i++; toModify = false; nameCol = rec.indexOf("call"); if ( (query.value (nameCol)).isValid() ) { _call = (query.value (nameCol)).toString(); } nameCol = rec.indexOf("bandid"); if ( (query.value (nameCol)).isValid() ) { _bandid = (query.value (nameCol)).toString(); } nameCol = rec.indexOf("modeid"); if ( (query.value (nameCol)).isValid() ) { _modeid = (query.value (nameCol)).toString(); } nameCol = rec.indexOf("qso_date"); if ( (query.value (nameCol)).isValid() ) { _tdate = (query.value (nameCol)).toString(); } //nameCol = rec.indexOf("lognumber"); //if ( (query.value (nameCol)).isValid() ) //{ // _lognumber = (query.value (nameCol)).toString(); //} //nameCol = rec.indexOf("confirmed"); //if ( (query.value (nameCol)).isValid() ) //{ // _confirmed = (query.value (nameCol)).toString(); //} nameCol = rec.indexOf("id"); if ( (query.value (nameCol)).isValid() ) { _id = (query.value (nameCol)).toString(); } //qDebug() << "MainWindow::fillQSOData: ID: " << _id ; //TODO: Prepare this query updateString = "UPDATE log SET call = '" + _call + "', bandid = '" + _bandid + "', modeid = '" + _modeid + "', qso_date = '" + _tdate + "'" ;// + "', confirmed = '" + _confirmed + "'"; nameCol = rec.indexOf("cqz"); if (( (query.value (nameCol)).toString()).length() < 1 ) { aux1 = QString::number(world->getQRZCqz(_call)); updateString = updateString + ", cqz='" + aux1 + "'"; toModify = true; } nameCol = rec.indexOf("ituz"); if (( (query.value (nameCol)).toString()).length() < 1 ) { aux1 = QString::number( world->getQRZItuz(_call) ); updateString = updateString + ", ituz='" + aux1 + "'"; toModify = true; } //qDebug() << "MainWindow::fillQSOData: DXCC" ; nameCol = rec.indexOf("dxcc"); _dxcc = (query.value (nameCol)).toInt(); //qDebug() << "MainWindow::fillQSOData: DXCC: " << QString::number(_dxcc) ; if (_dxcc < 1) { aux1 = QString::number(world->getQRZARRLId(_call) ); //qDebug() << "MainWindow::fillQSOData: DXCC proposed: " << aux1 ; updateString = updateString + ", dxcc='" + aux1 + "'"; toModify = true; _dxcc = aux1.toInt(); } else { //qDebug() << "MainWindow::fillQSOData: DXCC already existed" ; } nameCol = rec.indexOf("cont"); if (( (query.value (nameCol)).toString()).length() < 2 ) { aux1 = world->getContinentShortName(_dxcc); //aux1 = QString::number( world->getQRZItuz(_call) ); updateString = updateString + ", ituz='" + aux1 + "'"; toModify = true; } _dxcc = -1; //qDebug() << "MainWindow::fillQSOData1: " << updateString ; if (toModify) { updateString = updateString + " WHERE id = " + "'" + _id + "'"; //qDebug() << "MainWindow::fillQSOData2: " << updateString ; sqlOK = query1.exec(updateString); if (sqlOK) { //qDebug() << "MainWindow::fillQSOData: sqlOK=True" ; } else { emit queryError(Q_FUNC_INFO, query1.lastError().databaseText(), query1.lastError().nativeErrorCode(), query1.lastQuery()); //qDebug() << "MainWindow::fillQSOData: sqlOK=False" ; } } else { updateString.clear(); } aux = tr("Filling DXCC, CQz, ITUz, Continent in QSOs...\n QSO: ") + QString::number(i) + "/" + QString::number(numberOfQsos); progress.setLabelText(aux); progress.setValue (i); if ( progress.wasCanceled() ) { //qDebug() << "MainWindow::fillQSOData3: " ; noMoreQso = true; } } // Closes the next.isValid } // Closes the While logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotFillEmptyDXCCInTheLog() { logEvent(Q_FUNC_INFO, "Start", Debug); dataProxy->fillEmptyDXCCInTheLog(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotUpdateCTYDAT() { //qDebug() << "MainWindow::slotUpdateCTYDAT" ; logEvent(Q_FUNC_INFO, "Start", Debug); downloadcty->download(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotUpdateSATSDAT() { //qDebug() << "MainWindow::slotUpdateSATSDAT" ; logEvent(Q_FUNC_INFO, "Start", Debug); updateSatsData->readSatDataFile(); satTabWidget->refreshData(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotShowStats() { logEvent(Q_FUNC_INFO, "Start", Debug); statsWidget->show(); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotWorldReload(const bool _b) { //qDebug() << "MainWindow::slotWorldReload" ; //TODO: world.recreate returns a boolean, so it is possible to manage the errors logEvent(Q_FUNC_INFO, "Start", Debug); if (_b) { world->recreate(ctyDatFile); } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotFilePrint() { //qDebug() << "MainWindow::slotFilePrint" ; logEvent(Q_FUNC_INFO, "Start", Debug); QPrinter printer; QString aux; QSqlQuery query, query1; int row = 0; int _numberOfQsos = 0; bool cancelPrinting = false; bool sqlOK; _numberOfQsos = dataProxy->getHowManyQSOInLog(currentLog); int step = util->getProgresStepForDialog(_numberOfQsos); QTextDocument *doc = new QTextDocument; QTextCursor cursor(doc); QTextTable *textTable = cursor.insertTable(1, 9); QTextBlockFormat centerAlignment; centerAlignment.setAlignment(Qt::AlignCenter); QTextTableFormat tableFormat; tableFormat.setHeaderRowCount(1); tableFormat.setCellPadding(5); tableFormat.setAlignment(Qt::AlignCenter); textTable->setFormat(tableFormat); //The first row is the header cursor = textTable->cellAt(row, 0).firstCursorPosition(); cursor.setBlockFormat(centerAlignment); cursor.insertText(tr("Number")); cursor = textTable->cellAt(row, 1).firstCursorPosition(); cursor.insertText(tr("Date/Time")); cursor = textTable->cellAt(row, 2).firstCursorPosition(); cursor.insertText(tr("Callsign")); cursor = textTable->cellAt(row, 3).firstCursorPosition(); cursor.insertText(tr("RSTtx")); cursor = textTable->cellAt(row, 4).firstCursorPosition(); cursor.insertText(tr("RSTrx")); cursor = textTable->cellAt(row, 5).firstCursorPosition(); cursor.insertText(tr("Band")); cursor = textTable->cellAt(row, 6).firstCursorPosition(); cursor.insertText(tr("Mode")); cursor = textTable->cellAt(row, 7).firstCursorPosition(); cursor.insertText(tr("Comment")); int nameCol = 0; //int qsoPerPage = 25; //int maxPages = (int)(Klog::number / qsoPerPage)+1; // To print just 10 QSO per page //int printedSoFar = 0; //int page = 1; printer.setPageOrientation(QPageLayout::Landscape); // For testing, the log will be printed landscape. printer.setDocName(stationCallsign+"-log"); QPrintDialog printDialog(&printer, this); printDialog.setWindowTitle(tr("Print Log")); if (printDialog.exec() == QDialog::Accepted) { int _qsos = 0; QProgressDialog progress(tr("Printing the log ..."), tr("Abort printing"), 0, _numberOfQsos, this); progress.setMaximum(_numberOfQsos); progress.setWindowModality(Qt::WindowModal); QString stringQuery = QString("SELECT id, qso_date, call, rst_sent, rst_rcvd, bandid, modeid, comment FROM log WHERE lognumber='%1'").arg(currentLog); sqlOK = query.exec(stringQuery); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); logEvent(Q_FUNC_INFO, "END-1", Debug); return; //TODO: Print a message showing an error and exit. } QSqlRecord rec = query.record(); aux = tr("Printing the log...\n QSO: ") + QString::number(_qsos) + "/" + QString::number(_numberOfQsos); progress.setLabelText(aux); progress.setValue (_qsos); while ((query.next()) && (!cancelPrinting)) { if (query.isValid()) { textTable->appendRows(1); row++; _qsos++; //qDebug() << "MainWindow::slotFilePrint: QSO: " << QString::number(_qsos) << " - Step: " << QString::number(step) << " - Div: " << QString::number(_qsos % step); if (( (_qsos % step )== 0) ) { // To update the speed I will only show the progress once each X QSOs aux = tr("Printing the log...\n QSO: ") + QString::number(_qsos) + "/" + QString::number(_numberOfQsos); progress.setLabelText(aux); progress.setValue (_qsos); } nameCol = rec.indexOf("id"); cursor = textTable->cellAt(row, 0).firstCursorPosition(); cursor.insertText((query.value (nameCol)).toString()); nameCol = rec.indexOf("qso_date"); cursor = textTable->cellAt(row, 1).firstCursorPosition(); cursor.insertText((query.value (nameCol)).toString()); nameCol = rec.indexOf("call"); cursor = textTable->cellAt(row, 2).firstCursorPosition(); cursor.insertText((query.value (nameCol)).toString()); nameCol = rec.indexOf("rst_sent"); cursor = textTable->cellAt(row, 3).firstCursorPosition(); cursor.insertText((query.value (nameCol)).toString()); nameCol = rec.indexOf("rst_rcvd"); cursor = textTable->cellAt(row, 4).firstCursorPosition(); cursor.insertText((query.value (nameCol)).toString()); nameCol = rec.indexOf("bandid"); aux = (query.value (nameCol)).toString(); stringQuery = QString("SELECT name FROM band WHERE id='%1'").arg(aux); sqlOK = query1.exec(stringQuery); if (sqlOK) { query1.next(); if (query1.isValid()) { cursor = textTable->cellAt(row, 5).firstCursorPosition(); cursor.insertText((query1.value (0)).toString()); } } else { emit queryError(Q_FUNC_INFO, query1.lastError().databaseText(), query1.lastError().nativeErrorCode(), query1.lastQuery()); } //qDebug() << "MainWindow::slotFilePrint: Band: " << aux ; nameCol = rec.indexOf("modeid"); //qDebug() << "MainWindow::slotFilePrint: nameCol: " << QString::number(nameCol) ; aux = (query.value (nameCol)).toString(); //qDebug() << "MainWindow::slotFilePrint: Mode1: " << aux ; aux = dataProxy->getNameFromSubModeId(aux.toInt()); //qDebug() << "MainWindow::slotFilePrint: Mode2: " << aux ; if (aux.length()>1) { cursor = textTable->cellAt(row, 6).firstCursorPosition(); cursor.insertText(aux); } else { //qDebug() << "MainWindow::slotFilePrint: ERROR: " << aux ; } nameCol = rec.indexOf("comment"); aux = (query.value (nameCol)).toString(); if ((aux.length())>0) { cursor = textTable->cellAt(row, 7).firstCursorPosition(); cursor.insertText(aux); } } if ( progress.wasCanceled() ) { cancelPrinting = true; } } progress.setValue (_numberOfQsos); if (!cancelPrinting) { doc->print(&printer); } } logEvent(Q_FUNC_INFO, "END", Debug); } //DX-CLUSTER - DXCLUSTER void MainWindow::slotAnalyzeDxClusterSignal(QStringList ql) { //qDebug() << "MainWindow::slotAnalyzeDxClusterSignal: 1: " << ql.at(0) <<"/1: " << ql.at(1) << "/2: " << ql.at(2) ; logEvent(Q_FUNC_INFO, "Start", Debug); QStringList qls; int _entity = world->getQRZARRLId(ql.at(0)); qls.clear(); QString _mode = "-1"; if (!manageMode) { _mode = "-1"; } if (ql.length()==3) { if ((ql.at(2)) == "double") { clusterSpotToLog(ql.at(0), ql.at(1)); } else if ((ql.at(2)) == "selected") { //slotShowInfoLabel(world->getEntityName(_entity), 2); infoLabel2->setText(world->getEntityName(_entity)); infoWidget->showEntityInfo( _entity ); // Becareful, he Frecuency arrives in KHz instead of bandid!! // db.getBandFromFreq expects a MHz! //(ql.at(1)).toDouble() qls << QString::number(_entity) << QString::number(dataProxy->getBandIdFromFreq((ql.at(1).toDouble()/1000))) << _mode << QString::number(currentLog); // We use a mode = -1 because we don't know the mode info from the DXCluster spot // TODO: Check if we can know the mode and replace the "-1" in previous sentence //qls << QRZ << BandId << ModeId << lognumber; showStatusOfDXCC(qls); } } //else //{ // Signal was not properly emited //} logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotDXClusterSpotArrived(const QString _dxCall, const QString _dxGrid, const double _freq) { //qDebug() << Q_FUNC_INFO << ": " << _dxCall; (void)_dxCall; (void)_freq; if (!dxclusterSendSpotsToMap) { return; } logEvent(Q_FUNC_INFO, "Start", Debug); Coordinate coord = locator->getLocatorCoordinate (_dxGrid); //qDebug() << Q_FUNC_INFO << QString(" %1: Locator: %2 - (lat/lon)=>(%3/%4)").arg(_dxCall).arg(_dxGrid).arg(coord.lat).arg(coord.lon); //qDebug() << "Lat: " << QString::number(coord.lat) << " - Lon: " << QString::number(coord.lon); mapWindow->addMarker(coord, _dxGrid); logEvent(Q_FUNC_INFO, "END", Debug); } //void MainWindow::clusterSpotToLog(const QStringList _qs) void MainWindow::clusterSpotToLog(const QString &_call, const QString &_freq) { logEvent(Q_FUNC_INFO, "Start", Debug); QString _aux; double _freqN = (_freq.toDouble()) / 1000; //qDebug() << Q_FUNC_INFO << " - calling setQRZ-2" ; mainQSOEntryWidget->setQRZ(_call); QSOTabWidget->setTXFreq (_freqN); //freqQLCDNumber->display(_freqN); _aux = QString::number(_freqN); //qDebug() << "MainWindow::clusterSpotToLog - Freq: " << _aux ; int _bandi = dataProxy->getBandIdFromFreq(_aux.toDouble()); //qDebug() << "MainWindow::clusterSpotToLog - Bandi: " << QString::number(_bandi) ; _aux = QString::number(_bandi); _aux = QString("SELECT name FROM band WHERE id ='%1'").arg(_aux); //qDebug() << "MainWindow::clusterSpotToLog - Band: " << _aux ; QSqlQuery query(_aux); query.next(); if (query.isValid()) { _aux = (query.value (0)).toString(); mainQSOEntryWidget->setBand(_aux); //bandComboBox->setCurrentIndex(bandComboBox->findText(_aux, Qt::MatchCaseSensitive)); } else { mainQSOEntryWidget->setBand(dataProxy->getNameFromBandId(defaultBand)); //bandComboBox->setCurrentIndex(bandComboBox->findText(dataProxy->getNameFromBandId(defaultBand), Qt::MatchCaseSensitive)); //bandComboBox->setCurrentIndex(defaultBand); } //qDebug() << "MainWindow::clusterSpotToLog - END " ; logEvent(Q_FUNC_INFO, "END", Debug); } //DX-CLUSTER - DXCLUSTER void MainWindow::updateQSLRecAndSent() { //qDebug() << "MainWindow::updateQSLRecAndSent " ; logEvent(Q_FUNC_INFO, "Start", Debug); // Checks the log to fill all the qsl_rcvd and qsl_sent QSqlQuery query, query1; QString queryString, aux, idT; //int nameCol=0; //queryString = QString("SELECT id, qsl_rcvd, qsl_sent FROM log WHERE lognumber='%1'").arg(currentLog); //queryString = QString("SELECT id, qsl_rcvd, qsl_sent FROM log WHERE qsl_rcvd !='Y' AND qsl_rcvd !='N' AND qsl_rcvd !='R' AND qsl_rcvd !='I' AND qsl_rcvd !='V' AND lognumber='%1'").arg(currentLog); //queryString = QString("SELECT id, qsl_rcvd, qsl_sent FROM log WHERE qsl_rcvd ='' OR qsl_rcvd IS NULL OR qsl_sent ='' AND lognumber='%1'").arg(currentLog); queryString = QString("UPDATE log SET qsl_rcvd='N' WHERE qsl_rcvd ='' AND lognumber='%1'").arg(currentLog); bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } queryString = QString("UPDATE log SET qsl_sent='N' WHERE qsl_sent ='' AND lognumber='%1'").arg(currentLog); sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainWindow::updateQSLRecAndSent - END" ; } void MainWindow::defineStationCallsign(const QString &_call) { //qDebug() << "MainWindow::defineStationCallsign (currentLog): " << QString::number(currentLog) ; logEvent(Q_FUNC_INFO, "Start", Debug); if (util->isValidCall (_call)) { stationCallsign = _call; } else { // If no call is detected, qwe try to find it from the log QString logQRZ; logQRZ = dataProxy->getStationCallSignFromLog(currentLog); //qDebug() << "MainWindow::defineStationCallsign (logQrz): " << logQRZ ; if (util->isValidCall(logQRZ)) { //qDebug() << "MainWindow::defineStationCallsign TRUE " ; stationCallsign = logQRZ; } } //qDebug() << "MainWindow::defineStationCallsign: " << stationCallsign ; filemanager->setStationCallSign(stationCallsign); //qDebug() << "MainWindow::defineStationCallsign: AFTER" ; myDataTabWidget->setData(stationCallsign, operatorQRZ, myDataTabWidget->getMyLocator()); dxccStatusWidget->setMyLocator(myDataTabWidget->getMyLocator()); searchWidget->setStationCallsign(stationCallsign); if (lotwActive) { lotwUtilities->setStationCallSign(stationCallsign); } adifLoTWExportWidget->setDefaultStationCallsign(stationCallsign); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainWindow::defineStationCallsign: " << stationCallsign << " - END" ; } void MainWindow::slotSetPropModeFromSat(const QString &_p, bool _keep) { //qDebug() << Q_FUNC_INFO << ": " << _p ; logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << ": _keep" << util->boolToQString(_keep) ; othersTabWidget->setPropMode(_p, _keep); QSOTabWidget->setPropModeFromSat(_p); logEvent(Q_FUNC_INFO, "END", Debug); //int indexC = propModeComboBox->findText(" - " + _p + " - ", Qt::MatchContains); //propModeComboBox->setCurrentIndex(indexC); } void MainWindow::slotSetPropModeFromOther(const QString &_p) { //qDebug() << Q_FUNC_INFO << ": " << _p; if (_p!="SAT") { //qDebug() << Q_FUNC_INFO << ": Is NOT SAT propagation mode"; satTabWidget->setNoSat(); } } void MainWindow::completeWithPreviousQSO(const QString &_call) { //qDebug() << "MainWindow::completeWithPreviousQSO" ; //This function completes: Name, QTH, Locator, Entity, Iota logEvent(Q_FUNC_INFO, "Start", Debug); if ((!completeWithPrevious) || (_call.length()<=0) || (dataProxy->isWorkedB4(_call, -1)<=0)) //if ( (_call.length()<=0) || (dataProxy->isWorkedB4(_call, -1)<=0)) { //qDebug() << "MainWindow::completeWithPreviousQSO NOT completing..." ; if (completedWithPreviousName) { QSOTabWidget->clearName(); completedWithPreviousName = false; } if (completedWithPreviousQTH) { QSOTabWidget->clearQTH(); completedWithPreviousQTH = false; } if (completedWithPreviousLocator) { QSOTabWidget->clearDXLocator(); completedWithPreviousLocator = false; } if (completedWithPreviousIOTA) { othersTabWidget->clearIOTA(); completedWithPreviousIOTA = false; } if (completedWithPreviousQSLVia) { QSLTabWidget->setQSLVia(""); completedWithPreviousQSLVia = false; } logEvent(Q_FUNC_INFO, "END-1", Debug); return; } //qDebug() << "MainWindow::completeWithPreviousQSO completing..." ; QString aux = QString(); aux = dataProxy->getNameFromQRZ(_call); //qDebug() << "MainWindow::completeWithPreviousQSO aux: " << aux ; //qDebug() << "MainWindow::completeWithPreviousQSO nameLineEdit: " << QSOTabWidget->getName() ; //qDebug() << "MainWindow::completeWithPreviousQSO aux length: " << QString::number(aux.length()) ; //qDebug() << "MainWindow::completeWithPreviousQSO nameL length: " << QString::number((QSOTabWidget->getName()).length()) ; if ((aux.length()>=0) && (QSOTabWidget->getName().length()<=0) ) { //qDebug() << "MainWindow::completeWithPreviousQSO name: 1" ; QSOTabWidget->setName(aux); QSOTabWidget->setPaletteRightName (true); completedWithPreviousName = true; } else if (completedWithPreviousName && (aux != QSOTabWidget->getName())) { //qDebug() << "MainWindow::completeWithPreviousQSO name: 2" ; completedWithPreviousName = false; QSOTabWidget->setPaletteRightName (false); } else { //qDebug() << "MainWindow::completeWithPreviousQSO name: 3" ; } aux = dataProxy->getQTHFromQRZ(_call); if ((aux.length()>=0) && (QSOTabWidget->getQTH().length()<=0) ) { QSOTabWidget->setPaletteRightQTH (true); completedWithPreviousQTH = true; QSOTabWidget->setQTH(aux); } else if (completedWithPreviousQTH && (aux != QSOTabWidget->getQTH())) { completedWithPreviousQTH = false; QSOTabWidget->setPaletteRightQTH (false); } aux = dataProxy->getLocatorFromQRZ(_call); if ((aux.length()>=0) && ((QSOTabWidget->getDXLocator()).length()<=0) ) { QSOTabWidget->setPaletteRightDXLocator (true); QSOTabWidget->setDXLocator(aux); completedWithPreviousLocator=true; } else if (completedWithPreviousLocator && (aux != QSOTabWidget->getDXLocator())) { completedWithPreviousLocator = false; QSOTabWidget->setPaletteRightDXLocator(false); } aux = dataProxy->getIOTAFromQRZ(_call); //othersTabWidget->setIOTA(aux); if ((aux.length()>=0) && (othersTabWidget->isIOTAModified()) ) { aux = awards->checkIfValidIOTA(aux); if ((aux.length())==6) { othersTabWidget->setIOTA(aux); //TODO: Decide if it is better this way or like in : void MainWindowInputQSL::setQSLVia(const QString &_qs, QColor qColor) //QStringList values = aux.split("-", QT_SKIP); //iotaContinentComboBox->setCurrentIndex( iotaContinentComboBox->findText(values.at(0) ) ); //iotaNumberLineEdit->setPalette(palRed); //iotaNumberLineEdit->setText(values.at(1)); completedWithPreviousIOTA=true; } else if (completedWithPreviousIOTA && (aux != othersTabWidget->getIOTA())) { othersTabWidget->clearIOTA(); completedWithPreviousIOTA = false; } } else if (completedWithPreviousIOTA ) { othersTabWidget->clearIOTA(); completedWithPreviousIOTA = false; } aux = dataProxy->getQSLViaFromQRZ(_call); if ((aux.length()>=0) && ((QSLTabWidget->getQSLVia()).length()<=0) ) { QSLTabWidget->setQSLVia(aux, Qt::red); completedWithPreviousQSLVia=true; } else if (completedWithPreviousQSLVia && (aux != QSLTabWidget->getQSLVia())) { QSLTabWidget->setQSLVia(""); } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotValidBandsReceived(const QStringList &_b) { logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO ; dxccStatusWidget->setBands(Q_FUNC_INFO, _b, true); satTabWidget->addBands(_b); mapWindow->setBands(_b); //qDebug() << Q_FUNC_INFO << " - END" ; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotFreqRXChanged(const double _fr) { logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << ": " << QString::number(_fr); if (!upAndRunning) { //qDebug() << Q_FUNC_INFO << " - not running" ; return; } int bandId = dataProxy->getBandIdFromFreq(_fr); if (bandId < 1) { //qDebug() << Q_FUNC_INFO << " - wrong band" ; return; } // The following line is needed to ensure that the band of the freqRX is included // in the list of available bands and include it if it is not. mainQSOEntryWidget->setFreq (_fr, true); QSOTabWidget->setRXFreq (_fr); satTabWidget->setDownLinkFreq(_fr); //qDebug() << Q_FUNC_INFO << " - END"; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotFreqTXChangedFromSat(const double _fr) { logEvent(Q_FUNC_INFO, "Start", Debug); if (!upAndRunning) { //qDebug() << Q_FUNC_INFO << " - END-1"; return; } if (dataProxy->isThisFreqInBand (mainQSOEntryWidget->getBand (), QString::number(_fr))) { //qDebug() << Q_FUNC_INFO << " - END-2"; return; } slotFreqTXChanged (_fr); //qDebug() << Q_FUNC_INFO << " - END"; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotFreqTXChanged(const double _fr) { logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << ": " << QString::number(_fr); if (!upAndRunning) { //qDebug() << Q_FUNC_INFO << " - END-1"; return; } //qDebug() << Q_FUNC_INFO << " - 10"; QSOTabWidget->setTXFreq (_fr); //qDebug() << Q_FUNC_INFO << " - 11"; mainQSOEntryWidget->setFreq (_fr); //qDebug() << Q_FUNC_INFO << " - calling setUpLinkFreq"; satTabWidget->setUpLinkFreq(_fr); if (hamlibActive && !manualMode) { hamlib->setFreq(_fr); } //qDebug() << Q_FUNC_INFO << " - Freq: " << QString::number (_fr); if (_fr<10.0) { //qDebug() << Q_FUNC_INFO << " - Lower and mode: " << mainQSOEntryWidget->getMode (); if (mainQSOEntryWidget->getMode() == "USB") { //qDebug() << Q_FUNC_INFO << " - We need to change"; mainQSOEntryWidget->setMode ("LSB"); } } else { //qDebug() << Q_FUNC_INFO << " - Higher and mode: " << mainQSOEntryWidget->getMode (); if (mainQSOEntryWidget->getMode() == "LSB") { //qDebug() << Q_FUNC_INFO << " - We need to change"; mainQSOEntryWidget->setMode ("USB"); } } logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindow::slotShowQSOsFromDXCCWidget(QList _qsos) { //qDebug() << "MainWindow::slotShowQSOsFromDXCCWidget" ; logEvent(Q_FUNC_INFO, "Start", Debug); slotShowSearchWidget(); searchWidget->showQSOs(_qsos); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotWSJTXloggedQSO (const QString &_dxcall, const QString &_mode, const QString &_band, const double _freq, const QString &_mygrid, const QString &_dxgrid, const QString &_rstTX, const QString &_rstRX, const QString &_comment, const QString &_stationcallsign, const QString &_name, const QString &_opCall, const QDateTime &_datetime, const QDateTime &_datetime_off, const QString &_exchangeTX, const QString &_exchangeRX, const QString &_mypwr) { //qDebug() << "MainWindow::slotWSJTX-loggedQSO" ; //logEvent(Q_FUNC_INFO, "Start", Debug); bool logTheQso = false; QString opCall = stationCallsign; if (util->isValidCall(_opCall)) { opCall = _opCall.toUpper(); } double pwr = _mypwr.toDouble(); if (pwr<=0.0) { pwr = myDataTabWidget->getMyPower (); } if (!_datetime.isValid() || !_datetime_off.isValid()) { //qDebug() << Q_FUNC_INFO << " DATES NOT VALID " ; return ; } //qDebug() << Q_FUNC_INFO << " dxcall: " << _dxcall ; //qDebug() << Q_FUNC_INFO << " freq: " << QString::number(_freq/1000000) ; //qDebug() << Q_FUNC_INFO << " freq no div: " << QString::number(_freq) ; //qDebug() << Q_FUNC_INFO << " mode: " << _mode ; //qDebug() << Q_FUNC_INFO << " band: " << _band ; //qDebug() << Q_FUNC_INFO << " my_grid: " << _mygrid ; //qDebug() << Q_FUNC_INFO << " dx_grid: " << _dxgrid ; //qDebug() << Q_FUNC_INFO << " comment: " << _comment ; //qDebug() << Q_FUNC_INFO << " StationCall: " << _stationcallsign ; //qDebug() << Q_FUNC_INFO << " _opCall: " << _opCall ; //qDebug() << Q_FUNC_INFO << " opCall: " << opCall ; //qDebug() << Q_FUNC_INFO << " time_on: " << util->getDateTimeSQLiteStringFromDateTime(_datetime) ; //qDebug() << Q_FUNC_INFO << " time_off: " << util->getDateTimeSQLiteStringFromDateTime(_datetime_off) ; //qDebug() << Q_FUNC_INFO << " report_sent: " << _rstTX ; //qDebug() << Q_FUNC_INFO << " report_rec: " << _rstRX ; //qDebug() << Q_FUNC_INFO << " exchange_sent: " << _exchangeTX ; //qDebug() << Q_FUNC_INFO << " exchange_rec: " << _exchangeRX ; //qDebug() << Q_FUNC_INFO << " MY_PWR: " << _mypwr ; if (wsjtxAutoLog) { // Log automatically, without confirmation logTheQso = true; //qDebug() << Q_FUNC_INFO << " LogTheQSO = true" ; } else { // Ask for confirmation before logging //qDebug() << Q_FUNC_INFO << " LogTheQSO = false - we ask for confirmation" ; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog - QSO received")); msgBox.setTextFormat(Qt::RichText); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No ); msgBox.setDefaultButton(QMessageBox::Yes); QString aux; aux = tr("The following QSO data has been received from WSJT-X to be logged:") + "\n\n" + "
    " + "
  • " + "" + tr("Callsign") + ": " + "" + _dxcall.toUpper() + "
  • " + "
  • " + "" + tr("Freq") + ": " + "" + QString::number(_freq) + "
  • " + "
  • " + "" + tr("Mode") + ": " + "" + _mode.toUpper() + "
  • " + "
  • " + //"" + tr("Time On") + ": " + "" + (QDateTime::fromString(_time_on, "yyyyMMddhhmmss")).toString("yyyy/MM/dd - hh:mm:ss") + "" + tr("Time On") + ": " + "" + util->getDateTimeSQLiteStringFromDateTime(_datetime) + "
  • " + "
  • " + //"" + tr("Time Off") + ": " + "" + (QDateTime::fromString(_time_off, "yyyyMMddhhmmss")).toString("yyyy/MM/dd - hh:mm:ss") + "" + tr("Time Off") + ": " + "" + util->getDateTimeSQLiteStringFromDateTime(_datetime_off) + "
  • " + "
  • " + "" + tr("RST TX") + ": " + "" + _rstTX + " - " + tr("RST RX") + ": " + "" + _rstRX + "
  • " + "
  • " + "" + tr("Comment") + ": " + "" + _comment + "
  • " + "
  • " + "" + tr("DX-Grid") + ": " + "" + _dxgrid.toUpper() + "
  • " + "
  • " + "" + tr("Local-Grid") + ": " + "" + _mygrid.toUpper() + "
  • " + "
  • " + "" + tr("Station Callsign") + ": " + "" + _stationcallsign.toUpper() + "
  • " + "
  • " + "" + tr("Operator Callsign") + ": " + "" + opCall.toUpper() + "
  • " + "
" ; msgBox.setText(aux); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: logTheQso = true; break; case QMessageBox::No: logTheQso = false; break; default: // should never be reached logTheQso = false; break; } } //bool saveThisQSO = true; if (logTheQso) { //qDebug() << Q_FUNC_INFO << " QSO must be logged" ; bool qsoLogged = false; int dxcc = world->getQRZARRLId(_dxcall); dxcc = util->getNormalizedDXCCValue (dxcc); QString _myLoc = _mygrid; if (!(locator->isValidLocator(_myLoc))) { _myLoc = myDataTabWidget->getMyLocator(); } if ((dataProxy->isThisQSODuplicated(Q_FUNC_INFO, _dxcall, _datetime, dataProxy->getBandIdFromFreq(_freq), dataProxy->getIdFromModeName(_mode), dupeSlotInSeconds)).length()>1) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - WSJTX Dupe QSO")); msgBox.setIcon(QMessageBox::Warning); QString aux = tr("This QSO seems to be duplicated. Do you want to save or discard it?"); msgBox.setText(aux); msgBox.setDetailedText(tr("Duplicated QSOs have to match another existing QSO with the same call, band, mode, date and time, taking into account the period that can be defined in the settings.")); msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard ); msgBox.setDefaultButton(QMessageBox::Save); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Save: logEvent(Q_FUNC_INFO, "END-1", Debug); break; case QMessageBox::Discard: logEvent(Q_FUNC_INFO, "END-1", Debug); return; //No more error shown // break; default: // should never be reached logEvent(Q_FUNC_INFO, "END-3", Debug); return; // The user wants to keepseeing errors //break; } } qsoLogged = dataProxy->addQSOFromWSJTX(_dxcall, _mode, _band, _freq, _myLoc, _dxgrid, _rstTX, _rstRX, _exchangeRX, _exchangeTX, _comment, _stationcallsign, _name, opCall, _datetime, _datetime_off, pwr, dxcc, currentLog, sendQSLByDefault); if (qsoLogged) { //qDebug() << Q_FUNC_INFO << " Logged QSO OK: " << _dxcall ; actionsJustAfterAddingOneQSO(); infoLabel1T = infoLabel1->text(); infoLabel2T = infoLabel2->text(); slotShowInfoLabel(tr("QSO logged from WSJT-X:")); //slotShowInfoLabel(_dxcall + " - " + dataProxy->getBandNameFromFreq(_freq) + "/" + _mode, 2); //infoLabel1->setText(tr("QSO logged from WSJT-X:")); infoLabel2->setText(_dxcall + " - " + dataProxy->getBandNameFromFreq(_freq) + "/" + _mode); //timerInfoBars->start(infoTimeout); //actionsJustAfterAddingOneQSO(); //qDebug() << Q_FUNC_INFO; slotClearButtonClicked(Q_FUNC_INFO); //UDPLogServer->start(); if (clublogActive && clublogRealTime) { elogClublog->sendQSO(dataProxy->getClubLogRealTimeFromId(dataProxy->getLastQSOid())); } } else { //qDebug() << Q_FUNC_INFO << " Logged QSO NOK: " << _dxcall ; } } else { //qDebug() << Q_FUNC_INFO << " QSO must NOT be logged ... ending" ; } logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << " - END" ; } bool MainWindow::checkIfNewMode(const QString &_mode) { //qDebug() << "MainWindow::checkIfNewMode: " << _mode ; logEvent(Q_FUNC_INFO, "Start", Debug); if (dataProxy->getSubModeIdFromSubMode(_mode)<0) {// The mode is not existing; it is not an accepted mode for KLog // TODO: Show an error to the user //qDebug() << "MainWindow::checkIfNewMode: Mode not valid! - " << _mode ; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - Non-supported mode")); msgBox.setIcon(QMessageBox::Warning); QString aux = tr("A new mode not supported by KLog has been received from an external program or radio:") + "(" + _mode + ")\n\n" + tr("If the received mode is correct, please contact KLog development team and request support for that mode") + "\n\n" + tr("Do you want to keep receiving these alerts? (disabling these alerts will prevent non-valid modes being detected)"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No ); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: logEvent(Q_FUNC_INFO, "END-1", Debug); return false; // The user wants to keepseeing errors //break; case QMessageBox::No: logEvent(Q_FUNC_INFO, "END-1", Debug); return true; //No more error shown // break; default: // should never be reached logEvent(Q_FUNC_INFO, "END-3", Debug); return false; // The user wants to keepseeing errors //break; } } else { //noMoreModeErrorShown = false; //TODO: Add the new mode to the list of active modes //qDebug() << "MainWindow::checkIfNewMode: VALID NEW MODE: Adding... - " << _mode ; addNewValidMode(_mode); } logEvent(Q_FUNC_INFO, "END", Debug); return false; } void MainWindow::slotWSJXstatusFromUDPServer(const int _type, const QString &_dxcall, const double _freq, const QString &_mode, const QString &_report, const QString &_de_call, const QString &_de_grid, const QString &_dx_grid, const QString &_sub_mode) { logEvent(Q_FUNC_INFO, "Start", Debug); (void)_sub_mode; if (manualMode) { return; } if (modify) { logEvent(Q_FUNC_INFO, "END-1", Debug); return; } //qDebug() << Q_FUNC_INFO << " type: " << QString::number(_type) ; //qDebug() << Q_FUNC_INFO << " dxcall: " << _dxcall ; //qDebug() << Q_FUNC_INFO << " freq: " << QString::number(_freq/1000000) ; //qDebug() << Q_FUNC_INFO << " mode: " << _mode ; //qDebug() << Q_FUNC_INFO << " report: " << _report ; //qDebug() << Q_FUNC_INFO << " de_call: " << _de_call ; //qDebug() << Q_FUNC_INFO << " _de_grid: " << _de_grid ; //qDebug() << Q_FUNC_INFO << " dx_grid: " << _dx_grid ; //qDebug() << Q_FUNC_INFO << " sub_mode: " << _sub_mode ; if ((!mainQSOEntryWidget->isModeExisting(_mode)) && (!noMoreModeErrorShown)) { noMoreModeErrorShown = checkIfNewMode(_mode); } switch (_type) { case 0: //qDebug() << "MainWindow::slotStatusFromUDPServer: - type = " << QString::number(_type) << " - OUT/IN - Heartbeat" ; break; case 1: //qDebug() << "MainWindow::slotStatusFromUDPServer: - type = " << QString::number(_type) << " - OUT - Status" ; //qDebug() << Q_FUNC_INFO << " - calling setQRZ-3" ; mainQSOEntryWidget->setQRZ(_dxcall); if ((!noMoreModeErrorShown) && (dataProxy->getSubModeIdFromSubMode(_mode)>0) ) { mainQSOEntryWidget->setMode(_mode); //modeComboBox->setCurrentIndex(modeComboBox->findText(_mode, Qt::MatchCaseSensitive)); } //qDebug() << "MainWindow::slotWSJXstatusFromUDPServer updating txFreqSpinBox" << QString::number(_freq) ; QSOTabWidget->setTXFreq (_freq); QSOTabWidget->setRXFreq (_freq); if (_dx_grid.length()>0) { slotUpdateLocator(_dx_grid); } QSOTabWidget->setRSTTX (_report); myDataTabWidget->setMyLocator(_de_grid); myDataTabWidget->setStationCallsign(_de_call.toUpper()); //TODO: Check what to do with _de_call -> Check if _de_call == station callsign and update if needed. //TODO: Check what to do with _de_grid -> Check if _de_grid == My Grid and update if needed. //TODO: Check what to do with _submode. //bandComboBox->setCurrentIndex(bandComboBox->findText(, Qt::MatchCaseSensitive)); break; default: //NO //qDebug() << "MainWindow::slotStatusFromUDPServer: - type = " << QString::number(_type) << " - ERROR on Type" ; break; } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::addNewValidMode(const QString &_mode) { //qDebug() << "MainWindow::addNewMode: " << _mode ; logEvent(Q_FUNC_INFO, "Start", Debug); QStringList _newM; _newM.clear(); _newM << _mode; _newM << mainQSOEntryWidget->getModes(); readActiveModes (_newM); mainQSOEntryWidget->setModes(modes); mapWindow->setModes(modes); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << "MainWindow::addNewValidMode: END" ; } void MainWindow::slotClearNoMorErrorShown() { logEvent(Q_FUNC_INFO, "Start", Debug); noMoreErrorShown = false; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotQueryErrorManagement(QString functionFailed, QString errorCodeS, QString nativeError, QString queryFailed) { //qDebug() << "MainWindow::slotQueryErrorManagement: Function: " << functionFailed ; //qDebug() << "MainWindow::slotQueryErrorManagement: Error: " << functionFailed << " - " << errorCodeS; logEvent(Q_FUNC_INFO, "Start", Debug); if (noMoreErrorShown) { logEvent(Q_FUNC_INFO, "END-1", Debug); return; } QString aux; bool showDebug = true; if (nativeError.toInt() == 19) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); if (functionFailed == "bool QSO::toDB(int)") { msgBox.setWindowTitle(tr("KLog - QSO Dupe")); msgBox.setText(tr("A dupe QSO has been detected in the file and will not be added to the log.")); msgBox.setInformativeText(tr("Please check the QSO information file and ensure it is properly added.") ); showDebug = false; } else if (functionFailed == "virtual bool DataProxy_SQLite::addSatellite(QString, QString, QString, QString, QString)") { msgBox.setWindowTitle(tr("KLog - Duplicated satellite")); msgBox.setText(tr("A duplicated satellite has been detected in the file and will not be imported.")); msgBox.setInformativeText(tr("Please check the satellite information file and ensure it is properly populated.") + "\n" + tr("Now you will see a more detailed error that can be used for debugging...")); } msgBox.exec(); } if (showDebug) { // TODO: An error on DB has been detected. // KLog should suggest to export ALL the data to an ADIF file to prevent any log lose aux = "
" + tr("An unexpected error ocurred!!") + "

" + tr("If the problem persists, please contact the developers") + "(klog@groups.io)" + tr("for analysis:") + "
"; QString errorMSG = "
    " "
  • " + tr("Error in function") + ": " + functionFailed + "
  • " + "
  • " + tr("Native Error") +": " + nativeError + "
  • " + "
  • " + tr("Error text") + ": " + errorCodeS + "
  • " + "
  • " + tr("Failed query") + ": " + queryFailed + "
  • " + "

" + "" + tr("Recommendation:") + "" + tr("Periodically export your data to ADIF to prevent a potential data loss.") + "
"; showErrorDialog->setText(aux + errorMSG); //showErrorDialog->setModal(true); showErrorDialog->exec(); } QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - Show errors")); msgBox.setIcon(QMessageBox::Question); aux = tr("Do you want to keep showing errors?"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::No | QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Ok: break; case QMessageBox::No: noMoreErrorShown = true; break; default: // should never be reached break; } logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotDefineNewBands (const QStringList _bands) { //qDebug() << "MainWindow::defineNewBands: " ; logEvent(Q_FUNC_INFO, "Start", Debug); QStringList qsTemp; qsTemp.clear(); //qsTemp << _bands; //qsTemp.removeDuplicates(); qsTemp << dataProxy->sortBandNamesBottonUp(_bands); qsTemp.removeDuplicates(); bands.clear(); bands = qsTemp; mainQSOEntryWidget->setBands(bands); mapWindow->setBands(bands); satTabWidget->addBands(bands); //qDebug() << "MainWindow::defineNewBands - END" ; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotHamlibTXFreqChanged(const double _f) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_f) ; logEvent(Q_FUNC_INFO, "Start", Debug); if (manualMode) { return; } if (upAndRunning) { if (!util->isSameFreq (_f, QSOTabWidget->getTXFreq ())) { //qDebug() << Q_FUNC_INFO << ": Updating the freq... " ; QSOTabWidget->setTXFreq (_f); } else { //qDebug() << "MainWindow::slotHamlibTXFreqChanged - Not updating Freq" ; } } else { //qDebug() << "MainWindow::slotHamlibTXFreqChanged - Not Up&Running" ; } //qDebug() << "MainWindow::slotHamlibTXFreqChanged - END " ; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotHamlibModeChanged(const QString &_m) { logEvent(Q_FUNC_INFO, "Start", Debug); if (manualMode) { return; } if (_m.length()<2) { logEvent(Q_FUNC_INFO, "END-1", Debug); return; } if ((mainQSOEntryWidget->getMode()).toUpper() == _m.toUpper()) { return; } hamlibChangingMode = true; if (checkIfNewMode(_m)) { hamlibChangingMode = false; logEvent(Q_FUNC_INFO, "END-2", Debug); return; } if (mainQSOEntryWidget->isModeExisting(_m)) { //qDebug() << "slotHamlibModeChanged: Mode in the Combobox: " ; mainQSOEntryWidget->setMode(_m); //modeComboBox->setCurrentIndex(modeComboBox->findText(_m, Qt::MatchCaseSensitive)); } else { //qDebug() << "MainWindow::slotHamlibModeChanged: Mode not found in combobox" << _m ; } hamlibChangingMode = false; logEvent(Q_FUNC_INFO, "END", Debug); } /* void MainWindow::slotRotatorShow() { rotatorWidget->show(); } */ void MainWindow::slotUpdateLocator(QString _loc) { logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << "MainWindow::slotUpdateLocator: " << _loc; QSOTabWidget->setDXLocator (_loc); //qDebug() << "MainWindow::slotUpdateLocator - END" ; logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::reconfigureDXMarathonUI(const bool _dxM) { logEvent(Q_FUNC_INFO, "Start", Debug); dxClusterWidget->setDXMarathon(_dxM); awardsWidget->setManageDXMarathon(_dxM); //awardsWidget->reconfigureDXMarathonUI(_dxM); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotShowInfoLabel(const QString &_m) { infoLabel1->setText(_m); } void MainWindow::slotAwardsWidgetSetLog() { awardsWidget->setLog(currentLog); } void MainWindow::slotAwardsWidgetSetYear() { awardsWidget->setYear(selectedYear); } void MainWindow::slotManualMode(bool _enable) { //qDebug() << Q_FUNC_INFO << ": " << util->boolToQString (_enable); manualMode = _enable; if ((manualMode) && (hamlibActive)) { hamlib->readRadio(true); } } void MainWindow::backupCurrentQSO() { // This function reads the full UI and stores it in a QSO logEvent(Q_FUNC_INFO, "Start", Debug); backupQSO->clear (); logEvent(Q_FUNC_INFO, "- 001", Devel); backupQSO->setBackup (true); logEvent(Q_FUNC_INFO, "- 002", Devel); backupQSO->setModifying (mainQSOEntryWidget->getModifying()); logEvent(Q_FUNC_INFO, "- 003", Devel); backupQSO->setRealTime (mainQSOEntryWidget->getRealTime()); logEvent(Q_FUNC_INFO, "- 004", Devel); backupQSO->setManualMode (mainQSOEntryWidget->getManualMode()); logEvent(Q_FUNC_INFO, "- 005", Devel); backupQSO->setLogId (currentLog); logEvent(Q_FUNC_INFO, "- 010", Devel); // MainQSOEntryWidget backupQSO->setCall (mainQSOEntryWidget->getQrz ()); logEvent(Q_FUNC_INFO, "- 011", Devel); backupQSO->setBand (mainQSOEntryWidget->getBand ()); logEvent(Q_FUNC_INFO, "- 012", Devel); backupQSO->setSubmode (mainQSOEntryWidget->getMode ()); backupQSO->setMode (dataProxy->getNameFromSubMode (mainQSOEntryWidget->getMode())); dataProxy->getNameFromSubMode (mainQSOEntryWidget->getMode()); //qDebug() << Q_FUNC_INFO << " - 013"; backupQSO->setDateTimeOn (mainQSOEntryWidget->getDateTime ()); logEvent(Q_FUNC_INFO, "- 020", Devel); // MainWindowInputQSO backupQSO->setRSTTX (QSOTabWidget->getRSTTX ()); backupQSO->setRSTRX (QSOTabWidget->getRSTRX ()); backupQSO->setFreqTX (QSOTabWidget->getTXFreq ()); backupQSO->setFreqRX (QSOTabWidget->getRXFreq ()); backupQSO->setGridSquare (QSOTabWidget->getDXLocator ()); backupQSO->setName (QSOTabWidget->getName ()); backupQSO->setQTH(QSOTabWidget->getQTH ()); backupQSO->setRXPwr(QSOTabWidget->getRXPwr ()); logEvent(Q_FUNC_INFO, "- 030", Devel); // MainWindowInputQSL backupQSO->setQSL_SENT (QSLTabWidget->getQSLSenStatus ()); backupQSO->setQSL_RCVD (QSLTabWidget->getQSLRecStatus ()); backupQSO->setQSLRDate (QSLTabWidget->getQSLRecDate ()); backupQSO->setQSLSDate (QSLTabWidget->getQSLSenDate ()); backupQSO->setQSLSenVia (QSLTabWidget->getSentVia ()); backupQSO->setQSLRecVia (QSLTabWidget->getRecVia ()); backupQSO->setQSLVia (QSLTabWidget->getQSLVia ()); backupQSO->setQSLMsg (QSLTabWidget->getQSLMsg ()); logEvent(Q_FUNC_INFO, "- 040", Devel); // MainWindowInputEQSL backupQSO->setClubLogStatus (eQSLTabWidget->getClubLogStatus ()); backupQSO->setClubLogDate (eQSLTabWidget->getClubLogDate ()); backupQSO->setEQSLQSL_SENT (eQSLTabWidget->getEQSLSenStatus ()); backupQSO->setEQSLQSLSDate (eQSLTabWidget->getEQSLSenDate ()); backupQSO->setEQSLQSL_RCVD (eQSLTabWidget->getEQSLRecStatus ()); backupQSO->setEQSLQSLRDate (eQSLTabWidget->getEQSLRecDate ()); backupQSO->setLoTWQSL_SENT (eQSLTabWidget->getLOTWSenStatus ()); backupQSO->setLoTWQSLSDate (eQSLTabWidget->getLOTWSenDate ()); backupQSO->setLoTWQSL_RCVD (eQSLTabWidget->getLOTWRecStatus ()); backupQSO->setLoTWQSLRDate (eQSLTabWidget->getLOTWRecDate ()); backupQSO->setClubLogStatus (eQSLTabWidget->getClubLogStatus ()); backupQSO->setClubLogDate (eQSLTabWidget->getClubLogDate ()); logEvent(Q_FUNC_INFO, "- 050", Devel); // MainWindowInputComment backupQSO->setComment (commentTabWidget->getComment ()); logEvent(Q_FUNC_INFO, "- 054", Devel); backupQSO->setKeepComment (commentTabWidget->getKeep ()); logEvent(Q_FUNC_INFO, "- 055", Devel); // MainWindowInputOthers backupQSO->setDXCC (othersTabWidget->getEntity ()); logEvent(Q_FUNC_INFO, "- 056", Devel); backupQSO->setIOTA (othersTabWidget->getIOTA ()); logEvent(Q_FUNC_INFO, "- 057", Devel); backupQSO->setPropMode (othersTabWidget->getPropModeFromComboBox()); logEvent(Q_FUNC_INFO, "- 058", Devel); backupQSO->setKeepOthers (othersTabWidget->getKeep ()); logEvent(Q_FUNC_INFO, "- 059", Devel); backupQSO->setVUCCGrids (othersTabWidget->getVUCCGrids ()); logEvent(Q_FUNC_INFO, "- 060", Devel); // MainWindowMyDataTab backupQSO->setTXPwr (myDataTabWidget->getMyPower()); logEvent(Q_FUNC_INFO, "- 061", Devel); backupQSO->setOperatorCallsign (myDataTabWidget->getOperator ()); logEvent(Q_FUNC_INFO, "- 062", Devel); backupQSO->setStationCallsign (myDataTabWidget->getStationCallsign ()); logEvent(Q_FUNC_INFO, "- 063", Devel); backupQSO->setMySOTA_REF (myDataTabWidget->getMySOTA ()); logEvent(Q_FUNC_INFO, "- 064", Devel); backupQSO->setMyRig (myDataTabWidget->getMyRig()); logEvent(Q_FUNC_INFO, "- 065", Devel); backupQSO->setMyAntenna (myDataTabWidget->getMyAntenna ()); logEvent(Q_FUNC_INFO, "- 066", Devel); backupQSO->setMyVUCCGrids (myDataTabWidget->getMyVUCCGrids ()); logEvent(Q_FUNC_INFO, "- 067", Devel); backupQSO->setMyGridSquare (myDataTabWidget->getMyLocator ()); logEvent(Q_FUNC_INFO, "- 068", Devel); backupQSO->setKeepMyData (myDataTabWidget->getKeep ()); logEvent(Q_FUNC_INFO, "- 070", Devel); //MainWindowSatTab backupQSO->setSatName (satTabWidget->getSatName ()); logEvent(Q_FUNC_INFO, "- 071", Devel); backupQSO->setSatMode (satTabWidget->getSatMode ()); backupQSO->setKeepSatTab (satTabWidget->getKeep ()); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << ": Realtime: " << util->boolToQString (backupQSO->getRealTime ()); } void MainWindow::restoreCurrentQSO(const bool restoreConfig) { // This function restores a QSO that was backed up to the UI. // MainQSOEntryWidget //qDebug() << Q_FUNC_INFO << ": " << util->boolToQString (restoreConfig); clearUIDX(); if (backupQSO->getModifying()) { mainQSOEntryWidget->setModify(true); } //qDebug() << Q_FUNC_INFO << " - calling setQRZ-4" ; mainQSOEntryWidget->setQRZ(backupQSO->getCall ()); mainQSOEntryWidget->setBand (backupQSO->getBand ()); mainQSOEntryWidget->setMode (backupQSO->getMode ()); mainQSOEntryWidget->setDateTime (backupQSO->getDateTimeOn ()); //qDebug() << Q_FUNC_INFO << ": restoring config: " << util->boolToQString (restoreConfig); if (restoreConfig) { mainQSOEntryWidget->setRealTime (backupQSO->getRealTime()); manualMode = backupQSO->getManualMode(); //qDebug() << Q_FUNC_INFO << ": manualMode: " << util->boolToQString (manualMode); mainQSOEntryWidget->setManualMode (manualMode); } // MainWindowInputQSO QSOTabWidget->setRSTRX (backupQSO->getRSTRX ()); QSOTabWidget->setRSTTX (backupQSO->getRSTTX ()); QSOTabWidget->setTXFreq (backupQSO->getFreqTX ()); QSOTabWidget->setRXFreq (backupQSO->getFreqRX ()); QSOTabWidget->setDXLocator (backupQSO->getGridSquare ()); QSOTabWidget->setName (backupQSO->getName ()); QSOTabWidget->setQTH (backupQSO->getQTH ()); QSOTabWidget->setRXPwr (backupQSO->getRXPwr ()); // MainWindowInputQSL QSLTabWidget->setQSLSenStatus (backupQSO->getQSL_SENT ()); QSLTabWidget->setQSLRecStatus (backupQSO->getQSL_RCVD ()); QSLTabWidget->setQSLRecDate (backupQSO->getQSLRDate ()); QSLTabWidget->setQSLSenDate (backupQSO->getQSLSDate ()); QSLTabWidget->setQSLSenVia (backupQSO->getQSLSentVia()); QSLTabWidget->setQSLRecVia (backupQSO->getQSLRecVia()); QSLTabWidget->setQSLVia (backupQSO->getQSLVia ()); QSLTabWidget->setQSLMsg (backupQSO->getQSLMsg ()); // MainWindowInputEQSL eQSLTabWidget->setClubLogStatus (backupQSO->getClubLogStatus ()); eQSLTabWidget->setClubLogDate (backupQSO->getClubLogDate ()); eQSLTabWidget->setEQSLSenStatus (backupQSO->getEQSLQSL_SENT ()); eQSLTabWidget->setEQSLSenDate (backupQSO->getEQSLQSLSDate ()); eQSLTabWidget->setEQSLRecStatus (backupQSO->getEQSLQSL_RCVD ()); eQSLTabWidget->setEQSLRecDate (backupQSO->getEQSLQSLRDate ()); eQSLTabWidget->setLOTWSenStatus (backupQSO->getLoTWQSL_SENT ()); eQSLTabWidget->setLOTWSenDate (backupQSO->getLoTWQSLSDate ()); eQSLTabWidget->setLOTWRecStatus (backupQSO->getLoTWQSL_RCVD ()); eQSLTabWidget->setLOTWRecDate (backupQSO->getLoTWQSLRDate ()); eQSLTabWidget->setQRZCOMStatus (backupQSO->getQRZCOMStatus ()); eQSLTabWidget->setQRZCOMDate (backupQSO->getQRZCOMDate ()); // MainWindowInputComment commentTabWidget->setData (backupQSO->getComment ()); commentTabWidget->setKeep (backupQSO->getKeepComment ()); // MainWindowInputOthers othersTabWidget->setVUCCGrids (backupQSO->getVUCCGrids ()); othersTabWidget->setSOTA (backupQSO->getSOTA_REF ()); othersTabWidget->setAge(backupQSO->getAge ()); othersTabWidget->setDistance(backupQSO->getDistance()); othersTabWidget->setEntity (backupQSO->getDXCC ()); othersTabWidget->setIOTA (backupQSO->getIOTA ()); othersTabWidget->setPropMode (backupQSO->getPropMode ()); othersTabWidget->setKeep (backupQSO->getKeepOthers ()); // MainWindowMyDataTab if (backupQSO->getLogId () == currentLog) { myDataTabWidget->setStationCallsign (backupQSO->getStationCallsign()); } else { myDataTabWidget->setStationCallsign (stationCallsign); } myDataTabWidget->setMyPower (backupQSO->getTXPwr ()); myDataTabWidget->setOperator (backupQSO->getOperatorCallsign()); myDataTabWidget->setMyLocator (backupQSO->getMyGridSquare ()); myDataTabWidget->setKeep (backupQSO->getKeepMyData ()); myDataTabWidget->setMyRig (backupQSO->getMyRig ()); myDataTabWidget->setMyAntenna (backupQSO->getMyAntenna ()); myDataTabWidget->setMySOTA (backupQSO->getMySOTA_REF ()); myDataTabWidget->setMyVUCCGrids (backupQSO->getMyVUCCGrids ()); //MainWindowSatTab satTabWidget->setSatName (backupQSO->getSatName ()); satTabWidget->setSatMode (backupQSO->getSatMode ()); satTabWidget->setKeep (backupQSO->getKeepSatTab ()); backupQSO->setBackup (false); backupQSO->clear(); //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindow::setLogLevel(const DebugLogLevel _sev) { //qDebug() << Q_FUNC_INFO << ": " << util->debugLevelToString(_sev); logEvent(Q_FUNC_INFO, "Start", Debug); logLevel = _sev; showKLogLogWidget->setLogLevel(logLevel); //setupDialog->setLogLevel(logLevel); QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("Misc"); settings.setValue ("DebugLog",util->debugLevelToString (logLevel)); settings.endGroup (); tipsDialog->setLogLevel(logLevel); dataProxy->setLogLevel(logLevel); mainQSOEntryWidget->setLogLevel(logLevel); util->setLogLevel(logLevel); qso->setLogLevel(logLevel); othersTabWidget->setLogLevel(logLevel); logEvent(Q_FUNC_INFO, "END", Debug); } void MainWindow::slotTakeOverFocusToQSOTabWidget() { //qDebug() << Q_FUNC_INFO; dxUpLeftTab->setCurrentIndex (0); QSOTabWidget->raise (); QSOTabWidget->setFocus (); } void MainWindow::slotTakeOverFocusToMainQSOInput() { //qDebug() << Q_FUNC_INFO; mainQSOEntryWidget->raise(); mainQSOEntryWidget->setFocus (); mainQSOEntryWidget->setFocusToOK (); } void MainWindow::slotCaptureDebugLogs(const QString &_func, const QString &_msg, DebugLogLevel _level) { //qDebug() << Q_FUNC_INFO << _func << "/" << _msg << "/" << QString::number(_level); logEvent(_func, _msg, _level); } void MainWindow::slotNewLogLevel(DebugLogLevel l) { //qDebug() << Q_FUNC_INFO; setLogLevel(l); QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("Misc"); settings.setValue ("DebugLog", util->debugLevelToString(l)); settings.endGroup (); } bool MainWindow::loadSettings() { logEvent(Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << " - Start"; QSettings settings(util->getCfgFile (), QSettings::IniFormat); //qDebug() << Q_FUNC_INFO << " - 10 - General"; QString value = settings.value ("Version").toString (); if (softwareVersion!=value) { //qDebug() << Q_FUNC_INFO << " - It seems it is a new version "; //qDebug() << Q_FUNC_INFO << QString("softwareversion: %1 / version: %2").arg(softwareVersion).arg(value); itIsANewversion = true; } selectTheLog(currentLog = settings.value ("SelectedLog").toInt()); setWindowSize (settings.value ("MainWindowSize").toSize ()); //qDebug() << Q_FUNC_INFO << " - 20 - user"; settings.beginGroup ("UserData"); value = settings.value ("CallSign").toString (); if (util->isValidCall(value)) { mainQRZ = value; } value = settings.value ("StationLocator").toString (); if ( locator->isValidLocator(value) ) { myDataTabWidget->setMyLocator(value.toUpper()); adifLoTWExportWidget->setDefaultMyGrid(value.toUpper()); } settings.endGroup (); myDataTabWidget->loadSettings (); //qDebug() << Q_FUNC_INFO << " - 30 - modes"; settings.beginGroup ("BandMode"); QStringList listAux; listAux.clear(); listAux << "SSB" << "CW"; readActiveModes (settings.value("Modes", listAux ).toStringList ()); //qDebug() << Q_FUNC_INFO << " - 31 - bands"; listAux.clear(); listAux << "10M" << "15M" << "20M" << "40M" << "80M" << "160M"; readActiveBands (settings.value("Bands", listAux).toStringList ()); settings.endGroup (); //qDebug() << Q_FUNC_INFO << " - 40 - logview"; logWindow->setColumns(settings.value ("LogViewFields").toStringList ()); //qDebug() << Q_FUNC_INFO << " - 41 - logs"; //qDebug() << Q_FUNC_INFO << " - 50 - dxcluster"; settings.beginGroup ("DXCluster"); dxClusterWidget->setSaveSpots(settings.value ("DXClusterSave", false).toBool ()); dxClusterShowHF = settings.value ("DXClusterShowHF", true).toBool (); dxClusterShowVHF = settings.value ("DXClusterShowVHF", true).toBool (); dxClusterShowWARC = settings.value ("DXClusterShowWARC", true).toBool (); dxClusterShowWorked = settings.value ("DXClusterShowWorked", true).toBool (); dxClusterShowConfirmed = settings.value ("DXClusterShowConfirmed", true).toBool (); dxClusterShowAnn = settings.value ("DXClusterShowAnn", true).toBool (); dxClusterShowWWV = settings.value ("DXClusterShowWWV", true).toBool (); dxClusterShowWCY = settings.value ("DXClusterShowWCY", true).toBool (); dxclusterSendSpotsToMap = settings.value ("DXClusterSendToMap", true).toBool (); dxClusterWidget->loadSettings (); settings.endGroup (); //qDebug() << Q_FUNC_INFO << " - 60 - colors"; settings.beginGroup ("Colors"); newOneColor.setNamedColor(settings.value ("NewOneColor", "#FF0000").toString ()); neededColor.setNamedColor(settings.value ("NeededColor","#FF8C00").toString ()); workedColor.setNamedColor(settings.value ("WorkedColor", "#FFD700").toString ()); confirmedColor.setNamedColor(settings.value ("ConfirmedColor", "#32CD32").toString ()); defaultColor.setNamedColor(settings.value ("DefaultColor", "#00BFFF").toString ()); settings.endGroup (); setupDialog->loadDarkMode (); //qDebug() << Q_FUNC_INFO << " - 70 - misc"; settings.beginGroup ("Misc"); mainQSOEntryWidget->setRealTime (settings.value ("RealTime", true).toBool ()); mainQSOEntryWidget->setShowSeconds (settings.value ("ShowSeconds", false).toBool ()); useDefaultLogFileName = (settings.value ("UseDefaultName", true).toBool ()); imperialSystem = (settings.value ("ImperialSystem", false).toBool ()); sendQSLWhenRec = (settings.value ("SendQSLWhenRec", true).toBool ()); manageDxMarathon = (settings.value ("ManageDXMarathon", false).toBool ()); awardsWidget->setManageDXMarathon (manageDxMarathon); searchWidget->setShowCallInSearch(settings.value ("ShowCallsignInSearch", true).toBool ()); checkNewVersions = settings.value ("CheckNewVersions", true).toBool (); reportInfo = false; alwaysADIF = settings.value ("AlwaysADIF", true).toBool (); setLogLevel(util->stringToDebugLevel(settings.value ("DebugLog").toString ())); mainQSOEntryWidget->setUTC(settings.value ("UTCTime", true).toBool ()); sendQSLByDefault = settings.value ("SendEQSLByDefault", true).toBool (); eQSLTabWidget->setQueueSentByDefault(sendQSLByDefault); dupeSlotInSeconds = settings.value ("DuplicatedQSOSlot", 300).toInt (); filemanager->setDuplicatedQSOSlot(dupeSlotInSeconds); mainQSOEntryWidget->setDuplicatedQSOSlot(dupeSlotInSeconds); completeWithPrevious = settings.value ("CompleteWithPrevious", true).toBool (); defaultADIFLogFile = settings.value ("DefaultADIFFile").toString (); deleteAlwaysAdiFile = settings.value ("DeleteAlwaysAdiFile", true).toBool (); util->setCallValidation(settings.value ("CheckValidCalls", true).toBool ()); mainQSOEntryWidget->setCallValidation(settings.value ("CheckValidCalls", true).toBool ()); filemanager->setCallValidation(settings.value ("CheckValidCalls", true).toBool ()); adifLoTWExportWidget->setCallValidation(settings.value ("CheckValidCalls", true).toBool ()); settings.endGroup (); //qDebug() << Q_FUNC_INFO << " - 90 - elog"; settings.beginGroup ("ClubLog"); clublogActive = settings.value ("ClubLogActive", false).toBool (); //setupDialog->setClubLogActive(clublogActive); clublogRealTime = settings.value ("ClubLogRealTime", false).toBool (); settings.endGroup (); elogClublog->loadSettings (); settings.beginGroup ("QRZcom"); qrzcomActive = settings.value ("QRZcomActive", false).toBool (); //setupDialog->setQRZCOMAutoCheckActive(QRZCOMAutoCheckAct->isChecked()); qrzcomSubscriber = settings.value ("QRZcomSubscriber", false).toBool (); elogQRZcom->setSubcription (qrzcomSubscriber); QRZCOMAutoCheckAct->setChecked(settings.value ("QRZcomSubscriber", false).toBool ()); //setupDialog->setQRZCOMAutoCheckActive(settings.value ("QRZcomSubscriber", false).toBool ()); elogQRZcom->setUser (settings.value ("QRZcomUser").toString ()); elogQRZcom->setPassword (settings.value ("QRZcomPass").toString ()); elogQRZcom->setLogBookKey(settings.value ("QRZcomLogBookKey").toString ()); settings.endGroup (); settings.beginGroup ("eQSL"); eQSLActive = settings.value ("eQSLActive", false).toBool (); eqslUtilities->setUser(settings.value ("eQSLCall").toString ()); eqslUtilities->setPass(settings.value ("eQSLPass").toString ()); settings.endGroup (); settings.beginGroup ("LoTW"); lotwActive = settings.value ("LoTWActive", false).toBool (); lotwTQSLpath = settings.value ("LoTWPath").toString (); lotwUtilities->setUser(settings.value ("LoTWUser").toString ()); lotwUtilities->setPass(settings.value ("LoTWPass").toString ()); settings.endGroup (); //qDebug() << Q_FUNC_INFO << " - 50 - UDPServer"; UDPLogServer->loadSettings (); settings.beginGroup ("UDPServer"); UDPServerStart = settings.value ("UDPServer", false).toBool (); //qDebug() << Q_FUNC_INFO << "UDPServer = " << util->boolToQString (UDPServerStart); //UDPLogServer->setNetworkInterface(settings.value ("UDPNetworkInterface").toString ()); //UDPLogServer->setPort(settings.value ("UDPServerPort", 2237).toInt ()); infoTimeout = settings.value ("InfoTimeOut", 2000).toInt (); //UDPLogServer->setLogging(settings.value ("LogFromWSJTX", false).toBool ()); //UDPLogServer->setRealTimeUpdate(settings.value ("RealTimeFromWSJTX", false).toBool ()); wsjtxAutoLog = settings.value ("LogAutoFromWSJTX", false).toBool (); settings.endGroup (); //qDebug() << Q_FUNC_INFO << " - 110 - Sats"; //qDebug() << Q_FUNC_INFO << " - 120 - HamLib"; settings.beginGroup ("HamLib"); hamlib->loadSettings (); hamlibActive = settings.value ("HamlibActive").toBool (); settings.endGroup (); logEvent(Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << " - END"; return true; } void MainWindow::selectTheLog(const int _i) { //qDebug() << Q_FUNC_INFO; currentLog = _i; if (!dataProxy->doesThisLogExist(currentLog)) { int _howManyQSOMax = -1; // NUmber of QSO of the log with more QSO int _howManyQSOMaxT = 0; // Number of QSO in ine specific log int _logWithMoreQSOs = -1; QStringList logs = QStringList(); logs << dataProxy->getListOfManagedLogs(); for (int i = 0;igetHowManyQSOInLog(i); if (_howManyQSOMax < _howManyQSOMaxT) { _howManyQSOMax = _howManyQSOMaxT; _logWithMoreQSOs = (logs.at(i)).toInt(); } } if (_logWithMoreQSOs>0) { currentLog = _logWithMoreQSOs; QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.setValue ("SelectedLog", currentLog); } else { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Critical); QString aux = tr("It seems that there are no QSOs in the database.") + "\n\n" + tr("If you are sure that the database contains QSOs and KLog is not able to find them, please contact the developers (see About KLog) for help."); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Ok: break; default: // should never be reached break; } } } stationCallsign = dataProxy->getStationCallSignFromLog (currentLog); defineStationCallsign (stationCallsign); dxClusterWidget->setCurrentLog(currentLog); dxccStatusWidget->setCurrentLog(currentLog); } void MainWindow::logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level) { //This function is the only one not logging the activity //qDebug() << Q_FUNC_INFO << "_level: " << _func << "/" << _msg << "/" << util->debugLevelToString(_level); //qDebug() << Q_FUNC_INFO << "upAndRunning: " << util->boolToQString(upAndRunning); showKLogLogWidget->add(_func, _msg, _level); return; if (!upAndRunning) { showKLogLogWidget->add(_func, _msg, None); return; } if (logLevel<=_level) showKLogLogWidget->add(_func, _msg, _level); } klog-2.3.3/gpl-3.0-standalone.html0000644000015700001710000011022114542412415016426 0ustar jenkinsjenkins GNU General Public License v3.0 - GNU Project - Free Software Foundation (FSF)

GNU GENERAL PUBLIC LICENSE

Version 3, 29 June 2007

Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/>

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.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the 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 <http://www.gnu.org/licenses/>.

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:

    <program>  Copyright (C) <year>  <name of author>
    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 <http://www.gnu.org/licenses/>.

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 <http://www.gnu.org/philosophy/why-not-lgpl.html>.

klog-2.3.3/awardswidget.h0000644000015700001710000000720714542412415015201 0ustar jenkinsjenkins#ifndef KLOG_AWARDSWIDGET_H #define KLOG_AWARDSWIDGET_H /*************************************************************************** awardswidget.h - description ------------------- begin : nov 2019 copyright : (C) 2019 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the search widget // #include #include #include "dataproxy_sqlite.h" #include "awards.h" //#include "world.h" //#include "utilities.h" //#include "filemanager.h" class AwardsWidget : public QWidget { Q_OBJECT public: explicit AwardsWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~AwardsWidget(); void setManageDXMarathon(const bool _dx); void setLog(const int _log); void setYear(const int _year); void fillOperatingYears(); void showAwards(); void clear(); private slots: void slotRecalculateAwardsButtonClicked(); void slotOperatingYearComboBoxChanged(); signals: //void actionQSODoubleClicked(const int _qsoid); void debugLog (QString _func, QString _msg, DebugLogLevel _level); void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution //void recalculateAwardsSignal(); void requireCurrentLogSignal(); void requireCurrentYearSignal(); private: void createUI(); void setToolTips(); void showDXMarathon(const int _year); void checkIfValidLog(); void reconfigureDXMarathonUI(const bool _dxM); QLCDNumber *dxccConfirmedQLCDNumber, *dxccWorkedQLCDNumber, *wazConfirmedQLCDNumber, *wazWorkedQLCDNumber, *localConfirmedQLCDNumber, *localWorkedQLCDNumber, *qsoConfirmedQLCDNumber, *qsoWorkedQLCDNumber, *yearlyQSOLCDNumber, *yearlyDXCCQLCDNumber, *yearlyCQQLCDNumber, *yearlyScoreQLCDNumber; QLabel *yearlyLabelN, *yearlyScoreLabelN; QPushButton *recalculateAwardsButton; QComboBox *operatingYearsComboBox; DataProxy_SQLite *dataProxy; bool manageDXMarathon; int selectedYear; int currentLog; DebugLogLevel logLevel; Awards *awards; }; #endif // AWARDSWIDGET_H klog-2.3.3/softwareupdate.cpp0000644000015700001710000002762314542412415016110 0ustar jenkinsjenkins/*************************************************************************** softwareupdate.cpp - description ------------------- begin : feb 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "softwareupdate.h" SoftwareUpdate::SoftwareUpdate(const QString &_klogVersion) : QObject(nullptr) { //qDebug() << "SoftwareUpdate::SoftwareUpdate(): " << _klogVersion; util = new Utilities(Q_FUNC_INFO); updateDialog = new SoftwareUpdateDialog(); latestVersion = "0.0"; repositoryFound = false; url = new QUrl; setVersion(_klogVersion); callsign = QString(); OSString = QString(); messageShown = false; OSVersion = QOperatingSystemVersion::currentType(); //qDebug() << "SoftwareUpdate::SoftwareUpdate OSVersion:: " << QString::number(OSVersion) ; findOS(QOperatingSystemVersion::currentType()); setHeader(); //qDebug() << "SoftwareUpdate::SoftwareUpdate(): - END" ; } void SoftwareUpdate::findOS(const int _os) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_os) ; switch (_os) { case QOperatingSystemVersion::MacOS: OSString = QString("osx"); break; case QOperatingSystemVersion::Windows: OSString = QString("win"); break; case QOperatingSystemVersion::Unknown: OSString = QString(); break; default: // should never be reached break; } //qDebug() << Q_FUNC_INFO << " - END"; } SoftwareUpdate::~SoftwareUpdate() { delete(updateDialog); delete(util); delete(url); } void SoftwareUpdate::setVersion(const QString &_klogVersion) { //qDebug() << Q_FUNC_INFO << ": " << _klogVersion; klogVersion = _klogVersion; latestVersion = klogVersion; setHeader(); //qDebug() << "SoftwareUpdate::setVersion: END " ; } void SoftwareUpdate::slotReadyRead() { //qDebug() << "SoftwareUpdate::slotReadyRead: "; } void SoftwareUpdate::slotDownloadFinished(QNetworkReply *reply) { //qDebug() << Q_FUNC_INFO << " - Start "; QUrl url = reply->url(); if (url.toString().length()< QString("https://api.github.com/repos/ea4k/klog/releases/latest").length()) { //qDebug() << Q_FUNC_INFO << ": URL too short" ; return; } QVariant redirectionTarget = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); if (reply->error()) { //qDebug() << Q_FUNC_INFO << ": reply error: " << QString::number(reply->error()) ; } else if (!redirectionTarget.isNull()) { repositoryFound = false; QUrl newUrl = url.resolved(redirectionTarget.toUrl()); //qDebug() << "SoftwareUpdate::slotDownloadFinished: Redirect: " << newUrl.toString(); url = newUrl; reply->deleteLater(); connectToURL(url.toString()); //qDebug() << "SoftwareUpdate::slotDownloadFinished - end After connect"; return; } else { //qDebug() << "SoftwareUpdate::slotDownloadFinished: no redirection" ; if (checkUpdates(reply)) { //qDebug() << "SoftwareUpdate::slotDownloadFinished checkupdates true" ; if (repositoryFound) { //qDebug() << "SoftwareUpdate::slotDownloadFinished repository found" ; if(latestVersion>klogVersion) { //qDebug() << "SoftwareUpdate::slotDownloadFinished checkupdates should update!" ; updateDialog->setVersion(latestVersion, true); } updateDialog->show(); latestVersion = klogVersion; repositoryFound = false; } } else { if (repositoryFound && messageShown) { //qDebug() << "SoftwareUpdate::slotDownloadFinished checkupdates false!" ; updateDialog->setVersion(latestVersion, false); updateDialog->show(); } //qDebug() << "SoftwareUpdate::slotDownloadFinished: checkupdates false" ; } } reply->deleteLater(); //qDebug() << "SoftwareUpdate::slotDownloadFinished end" ; } bool SoftwareUpdate::checkUpdates(QIODevice *data) { // Checks if there is a new version in the repository //qDebug() << "SoftwareUpdate::checkUpdates: " << QString::number(data->size()); QString line, release; QStringList stringList, klogStringList; QRegularExpression rx; QString filterString; QString fileExtension; switch (OSVersion) { case QOperatingSystemVersion::Unknown: //qDebug() << "MainWindow::checkUpdates - Unknown" ; rx.setPattern("klog-(\\d+)(\\.\\d+)?(\\.\\d+)?(\\.\\d+)?(-RC\\d+)?.tar.gz"); filterString = QString("klog"); fileExtension = QString(".tar.gz"); break; case QOperatingSystemVersion::Windows: //qDebug() << "MainWindow::checkUpdates - Windows" ; rx.setPattern("KLog-(\\d+)(\\.\\d+)?(\\.\\d+)?(\\.\\d+)?(-RC\\d+)?-windows-installer.exe"); filterString = QString("KLog"); fileExtension = QString("-windows-installer.exe"); break; case QOperatingSystemVersion::MacOS: rx.setPattern("KLog-(\\d+)(\\.\\d+)?(\\.\\d+)?(\\.\\d+)?(-RC\\d+)?.dmg"); filterString = QString("KLog"); fileExtension = QString(".dmg"); //qDebug() << "MainWindow::checkUpdates - macOS" ; break; default: rx.setPattern("klog-(\\d+)(\\.\\d+)?(\\.\\d+)?(\\.\\d+)?(-RC\\d+)?.tar.gz"); filterString = QString("klog"); fileExtension = QString(".tar.gz"); // should never be reached break; } //qDebug() << "SoftwareUpdate::checkUpdates: Before entering the while"<< QT_ENDL; while (!data->atEnd()) { //qDebug() << "SoftwareUpdate::checkUpdates: In the while"<< QT_ENDL; stringList.clear(); klogStringList.clear(); line.clear(); line = data->readLine(); //qDebug() << "SoftwareUpdate::checkUpdates: line: " << line; if ((line.contains("browser_download_url")) || (line.contains("tarball_url"))) { //qDebug() << "SoftwareUpdate::checkUpdates: line contains browser_download_url or tarball_url "; repositoryFound = true; stringList << line.split(",", QT_SKIP); klogStringList << stringList.filter(filterString); release = findMatch (rx, fileExtension, klogStringList); if (release.length ()>0) { updateNeeded(release); } //qDebug() << "SoftwareUpdate::checkUpdates: " << line; } } //qDebug() << "SoftwareUpdate::checkUpdates:Latest/Actual: " << latestVersion << "/" << klogVersion; if (latestVersion > klogVersion) { emit updateNeededSignal (true); //qDebug() << "SoftwareUpdate::checkUpdates: signal true"; return true; } else { //qDebug() << "SoftwareUpdate::checkUpdates: signal alse 1"; return false; } } QString SoftwareUpdate::findMatch(QRegularExpression rx, const QString &fileExtension, const QStringList &data) { QString release = QString(); foreach (QString str, data) { //qDebug() << "SoftwareUpdate::findMatch klog: " << str; //qDebug() << "SoftwareUpdate::findMatch klog - chopped: " << str; if (rx.match(str).hasMatch()) { //qDebug() << "SoftwareUpdate::findMatch: MATCH: " << str; release = str.section("-",1); //qDebug() << "SoftwareUpdate::findMatch: MATCH-1: " << str; release = release.section(fileExtension, 0, 0); //qDebug() << "SoftwareUpdate::findMatch: MATCH-2: " << str; return release; } else { //qDebug() << "SoftwareUpdate::findMatch: DOES NOT MATCH: " << str; } } return release; } void SoftwareUpdate::updateNeeded(const QString &_newVer) { //qDebug() << "SoftwareUpdate::updateNeeded: new: " << _newVer ; //qDebug() << "SoftwareUpdate::updateNeeded: cur: " << latestVersion ; if (latestVersion< _newVer) { latestVersion = _newVer; } //qDebug() << "SoftwareUpdate::updateNeeded - KLogVersion/latestVersion/newver: "<< klogVersion <<"/"<< latestVersion << "/"<<_newVer ; } void SoftwareUpdate::needToUpdate(bool _showWithoutVersion) { // This is used to connect to the main server URL. // If _showWithoutVersion is false: We are checking for new versions at KLog start: No message should be shown if no new version is found. // If _showWithoutVersion is true: The user is manually asking to check. A message should is shown if no new version is found. //qDebug() << "SoftwareUpdate::needToUpdate (current version: " << klogVersion << ")" ; messageShown = _showWithoutVersion; setVersion(klogVersion); //setTheURL("http://download.klog.xyz"); connectToURL("https://api.github.com/repos/ea4k/klog/releases/latest"); //qDebug() << "SoftwareUpdate::neededToUpdate - END"; } void SoftwareUpdate::connectToURL(const QString &_url) { // This is where the connection takes place.... so first connection may be the main URL but it launches connection after redirections //qDebug() << "SoftwareUpdate::connectToURL: " << _url; QNetworkAccessManager *manager = new QNetworkAccessManager(this); manager->get(QNetworkRequest(QUrl(_url))); QNetworkReply *reply = manager->get(request); connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead())); connect(manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(slotDownloadFinished(QNetworkReply*))); //qDebug() << "SoftwareUpdate::conectToURL - END"; } void SoftwareUpdate::setHeader() { //qDebug() << Q_FUNC_INFO; QString ver = util->getAgent(klogVersion); //qDebug() << "SoftwareUpdate::setHeader - ver: " << ver; if (callsign.length()>2) { ver = ver + "-" + callsign; } QByteArray str; str.clear(); str.append(ver.toUtf8 ()); //qDebug() << "SoftwareUpdate::setHeader: " << str; request.setRawHeader("User-Agent", str); //qDebug() << "SoftwareUpdate::setHeader - END" ; } void SoftwareUpdate::addCall(const QString &_call) { //qDebug() << "SoftwareUpdate::addCall: " << _call; if (_call.length()>2) { //callsign = _call; setHeader(); } //qDebug() << "SoftwareUpdate::addCall - END"; } klog-2.3.3/aboutdialog.h0000644000015700001710000000413514542412415015003 0ustar jenkinsjenkins#ifndef KLOG_ABOUTDIALOG_H #define KLOG_ABOUTDIALOG_H /*************************************************************************** aboutdialog.h - description ------------------- begin : feb 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ class QEvent; #include #include class AboutDialog : public QDialog { Q_OBJECT public: explicit AboutDialog(const QString &tversion, QWidget *parent = nullptr); ~AboutDialog(); bool event(QEvent *event); private: QTabWidget *tabw; QWidget *tab1, *tab2, *tab3, *tab4; }; #endif // ABOUTDIALOG_H klog-2.3.3/statisticswidget.h0000644000015700001710000000770414542412415016114 0ustar jenkinsjenkins#ifndef KLOG_STATISTICSWIDGET_H #define KLOG_STATISTICSWIDGET_H /*************************************************************************** statisticswidget.h - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles user : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include "dataproxy_sqlite.h" #include "charts/statsgeneralchartwidget.h" #include "charts/statsqsosperyearbarchartwidget.h" #include "charts/statsqsosperbandbarchartwidget.h" #include "charts/statsqsospermodebarchartwidget.h" #include "charts/statsentitiesperyearbarchartwidget.h" #include "charts/statscqzperyearbarchartwidget.h" #include "charts/statsqsosperdxccbarchartwidget.h" #include "charts/statsqsospercontinentbarchartwidget.h" #include "charts/statsqsosperhourbarchartwidget.h" #include "charts/statsqsospermonthbarchartwidget.h" #include "charts/statsworkedconfirmedpiechartwidget.h" #include "charts/statsworkedsentpiechartwidget.h" #include "charts/statssentconfirmedpiechartwidget.h" #include "charts/statsgridsonsatswidget.h" #include "charts/statsdxccsonsatswidget.h" #include "charts/statsfieldperbandwidget.h" class StatisticsWidget : public QWidget { Q_OBJECT public: explicit StatisticsWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~StatisticsWidget(); void clear(); protected: void closeEvent(QCloseEvent *event); void showEvent(QShowEvent *event); private slots: void slotChartComboBoxChanged(); void slotLogComboBoxChanged(); private: void createUI(); void fillLogCombo(); void updateChart(); // void paintQSOperOtherBarChart(const int _i); QStackedWidget *stackedWidget; StatsQSOsPerYearBarChartWidget *w1; StatsEntitiesPerYearBarChartWidget *w2; StatsCQZPerYearBarChartWidget *w3; StatsQSOsPerBandBarChartWidget *w4; StatsQSOsPerModeBarChartWidget *w5; StatsQSOsPerDXCCBarChartWidget *w6; StatsQSOsPerContinentBarChartWidget *w7; StatsQSOsPerHourBarChartWidget *w8; StatsQSOsPerMonthBarChartWidget *w9; StatsWorkedConfirmedPieChartWidget *w10; StatsWorkedSentPieChartWidget *w11; StatsSentConfirmedPieChartWidget *w12; StatsGridsOnSatsWidget *w13; StatsDXCCOnSatsWidget *w14; StatsFieldPerBandWidget *w15; StatsFieldPerBandWidget *w16; DataProxy_SQLite *dataProxy; QComboBox *statisticToShowComboBox, *logComboBox; QStringList statisticsToShowList; }; #endif // STATISTICSWIDGET_H klog-2.3.3/statisticswidget.cpp0000644000015700001710000002460514542412415016446 0ustar jenkinsjenkins/*************************************************************************** statisticswidget.cpp - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles user : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "statisticswidget.h" StatisticsWidget::StatisticsWidget(DataProxy_SQLite *dp, QWidget *parent): QWidget(parent) { //qDebug() << Q_FUNC_INFO << "Start"; dataProxy = dp; statisticToShowComboBox = new QComboBox(); logComboBox = new QComboBox(); stackedWidget = new QStackedWidget ; w1 = new StatsQSOsPerYearBarChartWidget(dataProxy, this); w2 = new StatsEntitiesPerYearBarChartWidget(dataProxy, this); w3 = new StatsCQZPerYearBarChartWidget(dataProxy, this); w4 = new StatsQSOsPerBandBarChartWidget(dataProxy, nullptr); w5 = new StatsQSOsPerModeBarChartWidget(dataProxy, nullptr); w6 = new StatsQSOsPerDXCCBarChartWidget(dataProxy, nullptr); w7 = new StatsQSOsPerContinentBarChartWidget(dataProxy, nullptr); w8 = new StatsQSOsPerHourBarChartWidget(dataProxy, nullptr); w9 = new StatsQSOsPerMonthBarChartWidget(dataProxy, nullptr); w10 = new StatsWorkedConfirmedPieChartWidget(dataProxy, nullptr); w11 = new StatsWorkedSentPieChartWidget(dataProxy, nullptr); w12 = new StatsSentConfirmedPieChartWidget(dataProxy, nullptr); w13 = new StatsGridsOnSatsWidget(dataProxy, nullptr); w14 = new StatsDXCCOnSatsWidget(dataProxy, nullptr); w15= new StatsFieldPerBandWidget(dataProxy, GridSquare, nullptr); w16 = new StatsFieldPerBandWidget(dataProxy, DXCC, nullptr);; statisticsToShowList.clear(); createUI(); connect(statisticToShowComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotChartComboBoxChanged() ) ) ; connect(logComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotLogComboBoxChanged() ) ) ; //qDebug() << Q_FUNC_INFO << "END"; } StatisticsWidget::~StatisticsWidget() { //qDebug() << Q_FUNC_INFO << "Start-END"; } void StatisticsWidget::clear() { //qDebug() << Q_FUNC_INFO << "Start-END"; //qDebug() << "StatisticsWidget::clear()"; } void StatisticsWidget::closeEvent(QCloseEvent *event) { //qDebug() << "StatisticsWidget::closeEvent"; //barChartStats->clear(); //qDebug() << Q_FUNC_INFO << "Start-END"; event->accept(); //qDebug() << Q_FUNC_INFO << "END"; } void StatisticsWidget::showEvent(QShowEvent *event) { //qDebug() << "StatisticsWidget::showEvent"; //qDebug() << Q_FUNC_INFO << "Start"; fillLogCombo(); event->accept(); //qDebug() << Q_FUNC_INFO << "END"; } void StatisticsWidget::slotChartComboBoxChanged() { //qDebug() << "StatisticsWidget::slotChartComboBoxChanged: " << statisticToShowComboBox->currentText() ; //qDebug() << Q_FUNC_INFO << "Start"; updateChart(); statisticToShowComboBox->setFocus(); //qDebug() << Q_FUNC_INFO << "END"; } void StatisticsWidget::slotLogComboBoxChanged() { //qDebug() << Q_FUNC_INFO << "Start"; updateChart(); logComboBox->setFocus(); //qDebug() << Q_FUNC_INFO << "END"; } void StatisticsWidget::updateChart() { //qDebug() << Q_FUNC_INFO << "Start"; QString text = statisticToShowComboBox->currentText(); text.truncate(2); //qDebug() << Q_FUNC_INFO << " - 010"; int log = ((logComboBox->currentText()).section('-', 0, 0)).toInt(); //qDebug() << Q_FUNC_INFO << " - 011"; //qDebug() << Q_FUNC_INFO << " Text : " << logComboBox->currentText(); //qDebug() << Q_FUNC_INFO << " Log : " << QString::number(log); //barChartStats->prepareChart(text.toInt(), log); switch (text.toInt()) { case 1: { //qDebug() << Q_FUNC_INFO << "10"; w1->prepareChart (log); //qDebug() << Q_FUNC_INFO << "11"; stackedWidget->setCurrentWidget (w1); //qDebug() << Q_FUNC_INFO << "12"; } break; case 2: { //qDebug() << Q_FUNC_INFO << "20"; w2->prepareChart (log); stackedWidget->setCurrentWidget (w2); } break; case 3: { //qDebug() << Q_FUNC_INFO << "30"; w3->prepareChart (log); stackedWidget->setCurrentWidget (w3); } break; case 4: { //qDebug() << Q_FUNC_INFO << "40"; w4->prepareChart (log); stackedWidget->setCurrentWidget (w4); } break; case 5: { //qDebug() << Q_FUNC_INFO << "50"; w5->prepareChart (log); stackedWidget->setCurrentWidget (w5); } break; case 6: { //qDebug() << Q_FUNC_INFO << "60"; w6->prepareChart (log); stackedWidget->setCurrentWidget (w6); } break; case 7: { // How many QSO per Continent //qDebug() << Q_FUNC_INFO << "70"; w7->prepareChart (log); stackedWidget->setCurrentWidget (w7); } break; case 8: { //qDebug() << Q_FUNC_INFO << "80"; w8->prepareChart (log); stackedWidget->setCurrentWidget (w8); } break; case 9: { //qDebug() << Q_FUNC_INFO << "90"; w9->prepareChart (log); stackedWidget->setCurrentWidget (w9); } break; case 10: { //qDebug() << Q_FUNC_INFO << "100"; w10->prepareChart (log); stackedWidget->setCurrentWidget (w10); } break; case 11: { //qDebug() << Q_FUNC_INFO << "110"; w11->prepareChart (log); stackedWidget->setCurrentWidget (w11); } break; case 12: { //qDebug() << Q_FUNC_INFO << "120"; w12->prepareChart (log); stackedWidget->setCurrentWidget (w12); } break; case 13: { //qDebug() << Q_FUNC_INFO << "130"; w13->prepareChart (log); stackedWidget->setCurrentWidget (w13); } break; case 14: { //qDebug() << Q_FUNC_INFO << "140"; w14->prepareChart (log); stackedWidget->setCurrentWidget (w14); } break; case 15: { //qDebug() << Q_FUNC_INFO << "150"; w15->prepareChart (log); stackedWidget->setCurrentWidget (w15); //genchart = new StatsFieldPerBandWidget(dataProxy, GridSquare, nullptr); } break; case 16: { //qDebug() << Q_FUNC_INFO << "160"; w16->prepareChart (log); stackedWidget->setCurrentWidget (w16); //genchart = new StatsFieldPerBandWidget(dataProxy, DXCC, nullptr); } break; } //qDebug() << Q_FUNC_INFO << "END"; } void StatisticsWidget::createUI() { //qDebug() << Q_FUNC_INFO << "Start"; stackedWidget->addWidget(w1); stackedWidget->addWidget(w2); stackedWidget->addWidget(w3); stackedWidget->addWidget(w4); stackedWidget->addWidget(w5); stackedWidget->addWidget(w6); stackedWidget->addWidget(w7); stackedWidget->addWidget(w8); stackedWidget->addWidget(w9); stackedWidget->addWidget(w10); stackedWidget->addWidget(w11); stackedWidget->addWidget(w12); stackedWidget->addWidget(w13); stackedWidget->addWidget(w14); stackedWidget->addWidget(w15); stackedWidget->addWidget(w16); statisticsToShowList << "01-" + tr("QSO per year"); statisticsToShowList << "02-" + tr("DXCC per year"); statisticsToShowList << "03-" + tr("CQ zones per year"); statisticsToShowList << "04-" + tr("QSO per band"); statisticsToShowList << "05-" + tr("QSO per mode"); statisticsToShowList << "06-" + tr("QSO per DXCC"); statisticsToShowList << "07-" + tr("QSO per Continent"); statisticsToShowList << "08-" + tr("QSO per hour"); statisticsToShowList << "09-" + tr("QSO per month"); statisticsToShowList << "10-" + tr("Worked / Confirmed status"); statisticsToShowList << "11-" + tr("Worked / Sent status"); statisticsToShowList << "12-" + tr("Sent / Confirmed status"); statisticsToShowList << "13-" + tr("Satellite grid status"); statisticsToShowList << "14-" + tr("Satellite DXCC status"); statisticsToShowList << "15-" + tr("Grids per band status"); statisticsToShowList << "16-" + tr("DXCC per band status"); statisticToShowComboBox->addItems(statisticsToShowList); fillLogCombo(); QHBoxLayout *hLayout = new QHBoxLayout; hLayout->addWidget(statisticToShowComboBox); hLayout->addWidget(logComboBox); QVBoxLayout *layout = new QVBoxLayout; layout->addLayout(hLayout); layout->addWidget(stackedWidget); setLayout(layout); resize(420,300); //qDebug() << Q_FUNC_INFO << "END"; } void StatisticsWidget::fillLogCombo() { //qDebug() << Q_FUNC_INFO << "Start"; QStringList ids; ids.clear(); ids << dataProxy->getListOfManagedLogs(); QStringList logs; logs.clear(); for (int i = 0; i < ids.size(); ++i) { //cout << fonts.at(i).toLocal8Bit().constData(); logs<< ids.at(i) + "-" + dataProxy->getLogDateFromLog((ids.at(i)).toInt()) + "-" + dataProxy->getStationCallSignFromLog((ids.at(i)).toInt()); } logComboBox->clear(); logComboBox->addItems(logs); //qDebug() << Q_FUNC_INFO << "END"; } klog-2.3.3/udpserver.h0000644000015700001710000001120014542412415014517 0ustar jenkinsjenkins#ifndef KLOG_UDPSERVER_H #define KLOG_UDPSERVER_H /*************************************************************************** udpserver.h - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles user : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "utilities.h" enum Type { Heartbeat, Status, Decode, Clear, Reply, QSOLogged, Close, Replay, HaltTx, FreeText, WSPRDecode, Location, LoggedADIF, HighlightCallsign, SwitchConfiguration, Configure, maximum_message_type_ // ONLY add new message types // immediately before here }; class UDPServer : public QObject { Q_OBJECT public: explicit UDPServer(QObject *parent = nullptr); ~UDPServer(); bool start(); bool stop(); bool isStarted(); //void setAddress(const QString &_address); void setPort(const int _port); void setNetworkInterface(const QString &_t); void loadSettings(); private: void readPendingDatagrams(); void parse(const QByteArray &msg); void adifParse(QByteArray &msg); void leaveMultiCastGroup(); void joinMultiCastGroup(); bool startNow(quint16 _port, QHostAddress const& _multicast_group_address); QNetworkInterface networkInterface; QUdpSocket *socketServer; QHostAddress groupAddress; //QString address; int port; bool logging, realtime; bool haveNetworkInterface; Utilities *util; #if QT_VERSION >= 0x050400 static quint32 constexpr schema_number {3}; #elif QT_VERSION >= 0x050200 static quint32 constexpr schema_number {2}; #else // Schema 1 (Qt_5_0) is broken #error "Qt version 5.2 or greater required" #endif signals: void status_update (const int _type, const QString &_dxcall, const double _freq, const QString &_mode, const QString report, const QString de_call, const QString de_grid, const QString dx_grid, const QString sub_mode); //void logged_qso (const int _type, const QString &_dxcall, const double _freq, const QString &_mode, // const QString &_dx_grid, const QString &_time_off, const QString &_report_sent, const QString &_report_rec, // const QString &_tx_power, const QString &_comments, const QString &_name, const QString &_time_on, const QString &_de_call, const QString &_de_grid); void logged_qso (const QString &_dxcall, const QString &_mode, const QString &_band, const double _freq, const QString &_mygrid, const QString &_dxgrid, const QString &rstTX, const QString &rstRX, const QString &comment, const QString &stationcallsign, const QString &name, const QString &_operator, const QDateTime datetime, const QDateTime datetime_off, const QString &_exchangeTX, const QString &_exchangeRX, const QString &_txpwr); void clearSignal(QString _func); private slots: void slotReadPendingDatagrams(); }; #endif // UDPSERVER_H klog-2.3.3/showerrordialog.h0000644000015700001710000000426114542412415015723 0ustar jenkinsjenkins#ifndef KLOG_SHOWERRORDIALOG_H #define KLOG_SHOWERRORDIALOG_H /*************************************************************************** showerrordialog.h - description ------------------- begin : oct 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include class ShowErrorDialog: public QDialog { Q_OBJECT public: ShowErrorDialog(); ~ShowErrorDialog(); void setText(const QString txt); private slots: void slotAcceptButtonClicked(); private: void keyPressEvent(QKeyEvent *event); QTextBrowser *textBrowser; QString text; QLabel *txtLabel; }; #endif // SHOWERRORDIALOG_H klog-2.3.3/aboutdialog.cpp0000644000015700001710000002740614542412415015344 0ustar jenkinsjenkins /*************************************************************************** aboutdialog.cpp - description ------------------- begin : feb 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "aboutdialog.h" #include #include #include #include #include #include AboutDialog::AboutDialog(const QString &tversion, QWidget *parent) : QDialog(parent) { //qDebug() << "AboutDialog::AboutDialog"; QPixmap pixmap(":/img/klog_256x256.png"); setWindowTitle(tr("About KLog")); setWindowFlags(windowFlags() & Qt::WindowContextHelpButtonHint); QGridLayout *layout = new QGridLayout(this); layout->setSizeConstraint(QLayout::SetFixedSize); const QString br = QLatin1String("
"); const QString description = "

KLog " + tversion + "

" +tr("By") + " EA4K - 2002-2023


" + tr("KLog is a free logbook for hamradio operators.") +"

" + tr("Please be aware that this is a development release and it may contain many bugs.
Backup your data before using this software!") + "


" + tr("Since 0.6.2, KLog has been fully rewritten to provide a cross-platform application that runs on all major operating systems (GNU/Linux, macOS and Windows) and to support new functionality.") + "

" + tr("Please provide your review in KLog's eHam review page:") + "
" + "https://www.eham.net/reviews/detail/3118

" + tr("Find more information and the latest release at") + "
https://www.klog.xyz

" + tr("Author") + ": Jaime Robles, EA4K
jaime@robles.es"; QLabel *copyRightLabel = new QLabel(description); copyRightLabel->setWordWrap(true); copyRightLabel->setOpenExternalLinks(true); copyRightLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); QPushButton *closeButton = buttonBox->button(QDialogButtonBox::Close); buttonBox->addButton(closeButton, QDialogButtonBox::ButtonRole(QDialogButtonBox::RejectRole | QDialogButtonBox::AcceptRole)); connect(buttonBox , &QDialogButtonBox::rejected, this, &QDialog::reject); QLabel *logoLabel = new QLabel; logoLabel->setPixmap(pixmap); QLabel *logoLabel2 = new QLabel; logoLabel2->setPixmap(pixmap); QLabel *logoLabel3 = new QLabel; logoLabel3->setPixmap(pixmap); QLabel *logoLabel4 = new QLabel; logoLabel4->setPixmap(pixmap); QString author1 = QString("Jaime Robles") + QString("EA4K") + "(2002-" + tr("today") +") " +tr("Main developer") + ""; QString author2 = QString("Juan Carlos Reig") + QString("EA5WA") + "(2021-" + tr("today") + ")"; QString author3 = QString("Ladislav Foldyna") + QString("OK1MLG") + "(2021)"; QString author4 = QString("Akihiro Koda") + QString("JL3OXR") + "(2016-2017)"; QString author5 = QString("Andrew Goldie") + QString("ZL2ACG") + "(2009-2010)"; QString authorText = tr("KLog is developed by a very small team and you are invited to join!") + "

" + tr("If you want to provide support you are welcome to join the KLog mailing list!") + "

" + tr("You can also help us by sending bug reports or small code contributions, ideas or whatever you think may improve KLog."); QString authors = "

" + tr("Authors") + "


" + authorText + "
" + author1 + author2 + author3 + author4 + author5 + "
"; QString translator_ca = QString("Catalan") + QString("Josep Ma. Ferrer") + QString("KDE Catalan translation team"); QString translator_hr = QString("Croatian") + QString("Kristijan Conkas") + QString("M0NKC"); QString translator_cs = QString("Czech") + QString("Ladislav Foldyna") + QString("OK1MLG"); QString translator_fi = QString("Finnish") + QString("Kristjan Lorents") + QString("Finnish Debian translation team"); QString translator_fr = QString("French") + QString("Christophe Lefebvre") + QString("F4HWL"); QString translator_da = QString("Danish") + QString("Joe Hansen") + QString("Danish Debian translation team"); QString translator_de = QString("German") + QString("Burhard Lück") + QString("KDE German translation team"); QString translator_it = QString("Italian") + QString("Simona Pisano") + QString("IU5HIU"); QString translator_ja = QString("Japanese") + QString("Nick and Akihiro Koda") + QString("JJ1TGT and JL3OXR"); QString translator_pl = QString("Polish") + QString("Piotr Ludwig") + QString("LA7RRA"); QString translator_es = QString("Spanish") + QString("Jaime Robles") + QString("EA4K"); QString translator_uk = QString("Ukrainian") + QString("Mykola Papirovsky and Volodymyr Karpenko") + QString("UR6QV and UR3QJW"); QString translator_lv = QString("Latvian") + QString("Arnis Armans") + QString("YL3GBC"); QString translatorsText = tr("Translators bring KLog into your language. They are really an important part of the KLog development team.") + "

" + tr("If KLog is still not in your language and you want to help us, you are welcome to contact us through the KLog mailing list!"); QString translators = "

" + tr("Translators") + "


" + translatorsText + "
" + translator_ca + translator_hr + translator_cs + translator_fi + translator_fr + translator_da + translator_lv + translator_de + translator_it + translator_ja + translator_pl + translator_es + translator_uk + "
"; QLabel *authorsLabel = new QLabel(authors); authorsLabel->setWordWrap(true); authorsLabel->setOpenExternalLinks(true); authorsLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); QLabel *translatorsLabel = new QLabel(translators); translatorsLabel->setWordWrap(true); translatorsLabel->setOpenExternalLinks(true); translatorsLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); QString privacy = "

" + tr("Privacy advisory") + "


" + tr("KLog developers have included a feature that reports some user data to the KLog server with the sole purpose of identifying the number of installed versions, to focus development in one direction or another taking into account users' needs.") + "

" + tr("At present, the data that is provided is the following:") + "
  • " + tr("Callsign") + "
  • " + tr("KLog version") + "
  • " + tr("Operating system") + "


" + tr("Be aware that you can enable/disable this feature from the Misc tab in the Setup page.") + ""; QLabel *privacyLabel = new QLabel(privacy); privacyLabel->setAlignment(Qt::AlignJustify); privacyLabel->setWordWrap(true); privacyLabel->setOpenExternalLinks(true); privacyLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); tab1 = new QWidget; tab2 = new QWidget; tab3 = new QWidget; tab4 = new QWidget; QGridLayout *layout1 = new QGridLayout; layout1->addWidget(logoLabel , 0, 0, 1, 1); layout1->addWidget(copyRightLabel, 0, 1, 4, 4); tab1->setLayout(layout1); QGridLayout *layout2 = new QGridLayout; layout2->addWidget(logoLabel2 , 0, 0, 1, 1); layout2->addWidget(authorsLabel, 0, 1, 4, 4); tab2->setLayout(layout2); QGridLayout *layout3 = new QGridLayout; layout3->addWidget(logoLabel3 , 0, 0, 1, 1); layout3->addWidget(translatorsLabel, 0, 1, 4, 4); tab3->setLayout(layout3); QGridLayout *layout4 = new QGridLayout; layout4->addWidget(logoLabel4 , 0, 0, 1, 1); layout4->addWidget(privacyLabel, 0, 1, 4, 4); tab4->setLayout(layout4); tabw = new QTabWidget; tabw->addTab(tab1, tr("KLog")); tabw->addTab(tab2, tr("Authors")); tabw->addTab(tab3, tr("Translators")); tabw->addTab(tab4, tr("Privacy")); layout->addWidget(tabw); layout->addWidget(buttonBox, 1, 0, Qt::AlignRight); setLayout(layout); //qDebug() << "AboutDialog::AboutDialog - END"; } AboutDialog::~AboutDialog() { } bool AboutDialog::event(QEvent *event) { if (event->type() == QEvent::ShortcutOverride) { QKeyEvent *ke = static_cast(event); if (ke->key() == Qt::Key_Escape && !ke->modifiers()) { ke->accept(); return true; } } return QDialog::event(event); } klog-2.3.3/dataproxy_sqlite.cpp0000644000015700001710000122025714542412415016446 0ustar jenkinsjenkins/*************************************************************************** dataproxy_sqlite.cpp - description ------------------- begin : sept 2014 copyright : (C) 2014 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "dataproxy_sqlite.h" //#include DataProxy_SQLite::DataProxy_SQLite(const QString &_parentFunction, const QString &_softVersion) { #ifdef QT_DEBUG //qDebug() << Q_FUNC_INFO << _softVersion << _parentFunction; #else //qDebug() << Q_FUNC_INFO << "Running a release build"; #endif (void)_parentFunction; //qDebug() << "DataProxy_SQLite::DataProxy_SQLite" << _softVersion << _parentFunction; logLevel = None; //qDebug() << "DataProxy_SQLite::DataProxy_SQLite 1"; util = new Utilities(Q_FUNC_INFO); util->setVersion(_softVersion); util->setCallValidation(false); util->setLongPrefixes(getLongPrefixes()); util->setSpecialCalls(getSpecialCallsigns()); qso = new QSO; db = new DataBase(Q_FUNC_INFO, _softVersion, util->getKLogDBFile()); dbCreated = db->createConnection(Q_FUNC_INFO); //dbCreated = db->createBandModeMaps(); //qDebug() << "DataProxy_SQLite::DataProxy_SQLite - END"; searching = false; executionN = 0; connect(db, SIGNAL(debugLog(QString, QString, DebugLogLevel)), this, SLOT(slotCaptureDebugLogs(QString, QString, DebugLogLevel)) ); logEvent (Q_FUNC_INFO, "END", Debug); } DataProxy_SQLite::~DataProxy_SQLite() { logEvent (Q_FUNC_INFO, "Start", Debug); delete(util); delete(qso); logEvent (Q_FUNC_INFO, "END", Debug); } int DataProxy_SQLite::getHowManyQSOPerPropMode(const QString &_p, const int _logn) { logEvent(Q_FUNC_INFO, "Start", Debug); QSqlQuery query; QString queryString; bool sqlOK; if (_logn < 0) { queryString = "SELECT COUNT(DISTINCT id) FROM log WHERE prop_mode=:prop_mode"; if (!query.prepare(queryString)) {return 0;} query.bindValue(":prop_mode", _p); } else { queryString = "SELECT COUNT(DISTINCT id) FROM log WHERE lognumber=:lognumber AND prop_mode=:prop_mode"; if (!query.prepare(queryString)) {return 0;} query.bindValue(":lognumber", _logn); query.bindValue(":prop_mode", _p); } sqlOK = query.exec(); if (sqlOK && query.next() && query.isValid()) { int v = query.value(0).toInt(); query.finish(); logEvent(Q_FUNC_INFO, "END-1", Debug); return v; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); logEvent(Q_FUNC_INFO, "END-2", Debug); return 0; } } QString DataProxy_SQLite::getSoftVersion() { //SELECT MAX (softversion) FROM softwarecontrolç logEvent (Q_FUNC_INFO, "Start", Debug); QSqlQuery query; QString stQuery = QString("SELECT MAX (softversion) FROM softwarecontrol"); if (query.exec(stQuery)) { query.next(); if (query.isValid()) { QString v = (query.value(0)).toString(); query.finish(); //qDebug() << "DataProxy_SQLite::getSoftVersion: DATA: " << v; if (v.length()<1) { //The following is not a query error but if the softwareversion value is lower than 0 or empty queryError(Q_FUNC_INFO, tr("Software version in DB is null"), "-1", tr("Query didn't failed")); // To alert about any failed query execution } logEvent (Q_FUNC_INFO, "END-1", Debug); return v; } else { query.finish(); logEvent (Q_FUNC_INFO, "END-2", Debug); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); logEvent (Q_FUNC_INFO, "END-3", Debug); return QString(); } //logEvent (Q_FUNC_INFO, "END", Debug); } QString DataProxy_SQLite::getDBVersion() { //SELECT MAX (dbversion) FROM softwarecontrol logEvent (Q_FUNC_INFO, "Start", Debug); QSqlQuery query; QString stQuery = QString("SELECT MAX (dbversion) FROM softwarecontrol"); if (query.exec(stQuery)) { query.next(); if (query.isValid()) { QString v = (query.value(0)).toString(); query.finish(); logEvent (Q_FUNC_INFO, "END-1", Debug); return v; } else { query.finish(); logEvent (Q_FUNC_INFO, "END-2", Debug); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); logEvent (Q_FUNC_INFO, "END-3", Debug); return QString(); } } bool DataProxy_SQLite::reconnectDB() { logEvent (Q_FUNC_INFO, "Start-End", Debug); return db->reConnect(util->getKLogDBFile()); } void DataProxy_SQLite::createLogModel() { logEvent (Q_FUNC_INFO, "Start-END **** EMPTY FUNCTION", Debug); } void DataProxy_SQLite::createLogPanel(){ logEvent (Q_FUNC_INFO, "Start-END **** EMPTY FUNCTION", Debug); } int DataProxy_SQLite::getIdFromModeName(const QString& _modeName) { logEvent (Q_FUNC_INFO, "Start", Debug); if (_modeName.length()<2) { logEvent (Q_FUNC_INFO, "END-1", Debug); return -4; } logEvent (Q_FUNC_INFO, "END", Debug); return db->getModeIDFromName2(_modeName); } int DataProxy_SQLite::getSubModeIdFromSubMode(const QString &_subModeName) { logEvent (Q_FUNC_INFO, "Start", Debug); if (_subModeName.length()<2) { logEvent (Q_FUNC_INFO, "END-1", Debug); return -3; } QSqlQuery query; QString stQuery = QString("SELECT id FROM mode WHERE submode='%1'").arg(_subModeName.toUpper()); if (query.exec(stQuery)) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); logEvent (Q_FUNC_INFO, "END-2", Debug); return v; } else { query.finish(); logEvent (Q_FUNC_INFO, "END-1", Debug); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); logEvent (Q_FUNC_INFO, "END-4", Debug); return -2; } logEvent (Q_FUNC_INFO, "END-3", Debug); return -3; } int DataProxy_SQLite::getModeIdFromSubModeId(const int _sm) { logEvent (Q_FUNC_INFO, "Start-End", Debug); return getIdFromModeName(getNameFromSubMode(getSubModeFromId(_sm))); } void DataProxy_SQLite::setCallValidation(const bool _v) { util->setCallValidation(_v); } bool DataProxy_SQLite::isModeDeprecated (const QString &_sm) { logEvent (Q_FUNC_INFO, "Start", Debug); if (_sm.length()<2) { logEvent (Q_FUNC_INFO, "END-1", Debug); return -3; } QSqlQuery query; QString stQuery = QString("SELECT deprecated FROM mode WHERE submode='%1'").arg(_sm); if (query.exec(stQuery)) { query.next(); if (query.isValid()) { if ( (query.value(0)).toInt() == 1 ) { query.finish(); logEvent (Q_FUNC_INFO, "END-2", Debug); return true; } else { query.finish(); logEvent (Q_FUNC_INFO, "END-3", Debug); return false; } } else { query.finish(); logEvent (Q_FUNC_INFO, "END-4", Debug); return false; // In case we can't check, we don't state it as deprecated } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); logEvent (Q_FUNC_INFO, "END-5", Debug); return false; // In case we can't check, we don't state it as deprecated } logEvent (Q_FUNC_INFO, "END", Debug); return false; } int DataProxy_SQLite::getIdFromBandName(const QString& _bandName) { logEvent (Q_FUNC_INFO, "Start", Debug); if (_bandName.length()<1) { logEvent (Q_FUNC_INFO, "END-1", Debug); return -4; } logEvent (Q_FUNC_INFO, "END", Debug); return db->getBandIDFromName2(_bandName); } QString DataProxy_SQLite::getNameFromBandId (const int _id) { logEvent (Q_FUNC_INFO, "Start-END", Debug); return db->getBandNameFromID2(_id); } QString DataProxy_SQLite::getNameFromModeId (const int _id) { logEvent (Q_FUNC_INFO, "Start-End", Debug); return db->getModeNameFromNumber(_id); } QString DataProxy_SQLite::getNameFromSubModeId (const int _id) { logEvent (Q_FUNC_INFO, "Start-End", Debug); return db->getSubModeNameFromID2(_id); /* QSqlQuery query; QString queryString = QString("SELECT submode, name, deprecated FROM mode WHERE id='%1'").arg(_id); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { if ( (query.value(2)).toInt()<0 ) { // DEPRECATED VALUE, return the MODE return (query.value(1)).toString(); } else { return (query.value(0)).toString(); } } else { return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); return QString(); } */ } QString DataProxy_SQLite::getSubModeFromId (const int _id) { logEvent (Q_FUNC_INFO, "Start", Debug); QSqlQuery query; QString queryString = QString("SELECT submode FROM mode WHERE id='%1'").arg(_id); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { QString v = (query.value(0)).toString(); query.finish(); logEvent (Q_FUNC_INFO, "END-1", Debug); return v; } else { query.finish(); logEvent (Q_FUNC_INFO, "END-2", Debug); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); logEvent (Q_FUNC_INFO, "END-3", Debug); return QString(); } //logEvent (Q_FUNC_INFO, "END", Debug); } QString DataProxy_SQLite::getNameFromSubMode (const QString &_sm) { logEvent (Q_FUNC_INFO, "Start", Debug); QSqlQuery query; QString queryString = QString("SELECT name FROM mode WHERE submode='%1'").arg(_sm.toUpper()); //QString queryString = QString("SELECT name, deprecated FROM mode WHERE submode='%1'").arg(_sm.toUpper()); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { QString v = (query.value(0)).toString(); query.finish(); logEvent (Q_FUNC_INFO, "END-1", Debug); return v; } else { query.finish(); logEvent (Q_FUNC_INFO, "END-2", Debug); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); logEvent (Q_FUNC_INFO, "END-3", Debug); return QString(); } } QString DataProxy_SQLite::getFreqFromBandId(const int _id) { logEvent (Q_FUNC_INFO, "Start-End", Debug); return db->getFreqFromBandId(_id); } int DataProxy_SQLite::getBandIdFromFreq(const double _n) { //Freq should be in MHz logEvent (Q_FUNC_INFO, "Start", Debug); bool sqlOk = false; QString queryString = QString("SELECT id FROM band WHERE lower <= '%1' and upper >= '%2'").arg(_n).arg(_n); QSqlQuery query(queryString); sqlOk = query.exec(); //qDebug() << "DataProxy_SQLite::getBandIdFromFreq: Query: " << query.lastQuery(); if (sqlOk) { //qDebug() << "DataProxy_SQLite::getBandIdFromFreq: Query OK"; query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); logEvent (Q_FUNC_INFO, "END-1", Debug); return v; } else { query.finish(); logEvent (Q_FUNC_INFO, "END-2", Debug); return -1; } } else { //qDebug() << "DataProxy_SQLite::getBandIdFromFreq: Query NOK"; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); logEvent (Q_FUNC_INFO, "END-3", Debug); return -2; } } QString DataProxy_SQLite::getBandNameFromFreq(const double _n) { logEvent (Q_FUNC_INFO, "Start-END", Debug); return getNameFromBandId(getBandIdFromFreq(_n)); } double DataProxy_SQLite::getLowLimitBandFromBandName(const QString &_sm) { logEvent (Q_FUNC_INFO, "Start", Debug); if (_sm.length ()<2) { logEvent (Q_FUNC_INFO, "END-1", Debug); return -1.0; } QSqlQuery query; QString queryString = QString("SELECT lower FROM band WHERE name='%1' OR name='%2'").arg(_sm).arg(_sm.toUpper()); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { double fr = (query.value(0)).toDouble(); query.finish(); if ( fr < 0 ) { logEvent (Q_FUNC_INFO, "END-2", Debug); return -1.0; } else { //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandName(value found): " << QString::number(fr); logEvent (Q_FUNC_INFO, "END-2", Debug); return fr; } } else { //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandName: -1.0-2"; query.finish(); logEvent (Q_FUNC_INFO, "END-3", Debug); return -1.0; } //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandName: -1.0-3"; } else { //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandName: SQL Error"; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); logEvent (Q_FUNC_INFO, "END-4", Debug); return -1.0; } } double DataProxy_SQLite::getLowLimitBandFromBandId(const int _sm) { //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandId"; QSqlQuery query; QString queryString = QString("SELECT lower FROM band WHERE id='%1'").arg(_sm); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { if ( (query.value(1)).toDouble()<0 ) { //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandId: -1.0-1"; query.finish(); return -1.0; } else { //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandId: " << QString::number((query.value(0)).toDouble()); double v = (query.value(0)).toDouble(); query.finish(); return v; } } else { //qDebug() << "DataProxy_SQLite::getLowLimitBandFromBandId: -1.0-2"; query.finish(); return -1.0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1.0; } } double DataProxy_SQLite::getUpperLimitBandFromBandName(const QString &_sm) { //qDebug() << Q_FUNC_INFO << ": " << _sm; if (_sm.length ()<2) { return -1.0; } QSqlQuery query; QString queryString = QString("SELECT upper FROM band WHERE name='%1' OR name='%2'").arg(_sm).arg(_sm.toUpper()); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { if ( (query.value(0)).toDouble()<0 ) { //qDebug() << Q_FUNC_INFO << ": -1.0-1"; query.finish(); return -1.0; } else { //qDebug() << Q_FUNC_INFO << ": (else): " << QString::number((query.value(0)).toDouble()); double v = (query.value(0)).toDouble(); query.finish(); return v; } } else { //qDebug() << Q_FUNC_INFO << ": -1.0-2"; query.finish(); return -1.0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1.0; } } bool DataProxy_SQLite::isThisFreqInBand(const QString &_band, const QString &_fr) { return db->isThisFreqInBand(_band, _fr); } QStringList DataProxy_SQLite::getFields() { //qDebug() << Q_FUNC_INFO; QStringList fields; fields.clear(); QSqlQuery q; QSqlRecord localRecord = q.driver()->record("log"); for (int var = 0; var < localRecord.count(); ++var) { QString fieldName = localRecord.fieldName(var); fields << fieldName; //qDebug() << fieldName; } /* QString LogWindow::getColumnName(int col) { return logModel->record().fieldName(col); } */ return fields; } QStringList DataProxy_SQLite::getBands() { //qDebug() << "DataProxy_SQLite::getBands - DEPRECATED please use getBandNames - TODO: Remove this function and change the calls"; return getBandNames(); /* QStringList bands = QStringList(); QSqlQuery query("SELECT name FROM band"); while (query.next()) { if (query.isValid()){ bands << query.value(0).toString(); } } //return bands; return sortBandNamesBottonUp(bands); */ } QStringList DataProxy_SQLite::getBandNames() { //qDebug() << "DataProxy_SQLite::getBandNames"; QStringList bands = QStringList(); QSqlQuery query; QString queryString; bool sqlOK; queryString = QString("SELECT DISTINCT name FROM band"); sqlOK = query.exec(queryString); if (sqlOK) { while(query.next()) { if (query.isValid()) { queryString = (query.value(0)).toString(); //qDebug() << "DataProxy_SQLite::getBandNames: " << queryString; bands.append(queryString); } else { query.finish(); return QStringList(); } } query.finish(); return sortBandNamesBottonUp(bands); //return bands; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QStringList(); } } QStringList DataProxy_SQLite::getModes() { QStringList modes = QStringList(); QSqlQuery query("SELECT submode FROM mode ORDER BY submode"); while (query.next()) { if (query.isValid()){ modes << query.value(0).toString(); } } query.finish(); modes.sort(); return modes; } QStringList DataProxy_SQLite::sortBandNamesBottonUp(const QStringList _qs) { //Receives a list of band names, sorts it from the lower band to the upper band and returns //qDebug() << "DataProxy_SQLite::sortBandNamesBottonUp: " << QString::number(_qs.length()); if (_qs.length()<2) { return _qs; } QMap map; map.clear(); QStringList qs; qs.clear(); //qDebug() << "DataProxy_SQLite::sortBandNamesBottonUp-00"; for (int j=0; j<_qs.count(); j++) { map.insert(getLowLimitBandFromBandName(_qs.at(j)), _qs.at(j)); } //qDebug() << "DataProxy_SQLite::sortBandNamesBottonUp-10"; QMap::const_iterator i = map.constBegin(); //qDebug() << "DataProxy_SQLite::sortBandNamesBottonUp-20"; while (i != map.constEnd()) { qs << i.value(); ++i; } //qDebug() << "DataProxy_SQLite::sortBandNamesBottonUp - END -lengh = " << QString::number(qs.length()); qs.removeDuplicates(); return qs; } QStringList DataProxy_SQLite::getBandIDs() { //qDebug() << "DataProxy_SQLite::getBandIDs"; QStringList bands = QStringList(); QSqlQuery query("SELECT id FROM band"); while (query.next()) { if (query.isValid()){ bands << query.value(0).toString(); } } query.finish(); return sortBandIdBottonUp(bands); } QStringList DataProxy_SQLite::sortBandIdBottonUp(const QStringList _qs) { //Receives a list of band id, sorts it from the lower band to the upper band and returns QMap map; QStringList qs; qs.clear(); for (int j=0; j<_qs.count(); j++) { map.insert(getLowLimitBandFromBandId(_qs.at(j).toInt()), _qs.at(j)); } QMap::const_iterator i = map.constBegin(); while (i != map.constEnd()) { qs << i.value(); ++i; } return qs; } QStringList DataProxy_SQLite::getModesIDs() { QStringList modes = QStringList(); QSqlQuery query("SELECT id FROM mode"); while (query.next()) { if (query.isValid()){ modes << query.value(0).toString(); } } query.finish(); return modes; } QStringList DataProxy_SQLite::getBandsInLog(const int _log) { //qDebug() << "DataProxy_SQLite::getBandsInLog: "; QStringList bands = QStringList(); QString queryString = QString(); if (_log <= 0) { queryString = QString("SELECT DISTINCT band.name FROM log, band WHERE band.id = log.bandid ORDER BY band.id DESC"); } else { queryString = QString("SELECT DISTINCT band.name FROM log, band WHERE band.id = log.bandid AND log.lognumber='%1' ORDER BY band.id DESC").arg(_log); } QSqlQuery query(queryString); while (query.next()) { if (query.isValid()){ bands << query.value(0).toString(); } } query.finish(); return sortBandNamesBottonUp(bands); //return bands; } QStringList DataProxy_SQLite::getModesInLog(const int _log) { //qDebug() << "DataProxy_SQLite::getModesInLog: "; QStringList modes = QStringList(); QString queryString = QString(); if (_log <=0 ) { queryString = QString("SELECT mode.id, mode.submode, COUNT (mode.submode) FROM log, mode WHERE mode.id = log.modeid GROUP BY mode.submode ORDER BY count (mode.submode) DESC"); } else { queryString = QString("SELECT mode.id, mode.submode, COUNT (mode.submode) FROM log, mode WHERE mode.id = log.modeid AND log.lognumber='%1' GROUP BY mode.submode ORDER BY count (mode.submode) DESC").arg(_log); } QSqlQuery query(queryString); while (query.next()) { if (query.isValid()){ modes << query.value(1).toString(); } } query.finish(); //qDebug() << "DataProxy_SQLite::getModesInLog: " << modes.join(" - "); modes.sort(); return modes; } int DataProxy_SQLite::getMostUsedBand(const int _log) { //qDebug() << "DataProxy_SQLite::getMostUsedBand: "; QString queryString = QString(); if (_log <=0 ) { queryString = QString("SELECT band.id, band.name, COUNT (band.name) FROM log, band WHERE band.id = log.bandid GROUP BY band.id ORDER BY count (band.id) DESC LIMIT 1"); } else { queryString = QString("SELECT band.id, band.name, COUNT (band.name) FROM log, band WHERE band.id = log.bandid AND log.lognumber='%1' GROUP BY band.id ORDER BY count (band.id) DESC LIMIT 1").arg(_log); } QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { if (query.next()) { if (query.isValid()) { int v = query.value(0).toInt(); query.finish(); //qDebug() << "DataProxy_SQLite::getMostUsedBand-OK: " << QString::number(v)<< QT_ENDL; return v; } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "DataProxy_SQLite::getMostUsedBand-ERROR-1: "; return -1; } //qDebug() << "DataProxy_SQLite::getMostUsedBand-ERROR-2: "; return -2; } int DataProxy_SQLite::getMostUsedMode(const int _log) { //qDebug() << "DataProxy_SQLite::getMostUsedMode: "; QString queryString = QString(); if (_log <=0 ) { queryString = QString("SELECT mode.id, mode.submode, COUNT (mode.submode) FROM log, mode WHERE mode.id = log.modeid GROUP BY mode.submode ORDER BY count (mode.submode) DESC LIMIT 1"); } else { queryString = QString("SELECT mode.id, mode.submode, COUNT (mode.submode) FROM log, mode WHERE mode.id = log.modeid AND log.lognumber='%1' GROUP BY mode.submode ORDER BY count (mode.submode) DESC LIMIT 1").arg(_log); } QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { if (query.next()) { if (query.isValid()) { int v = query.value(0).toInt(); query.finish(); return v; } } query.finish(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } return -2; } int DataProxy_SQLite::getLastQSOid() { //qDebug() << "DataProxy_SQLite::getLastQSOid"; QSqlQuery query; bool sqlOK = query.exec("SELECT MAX(id) from log"); if (sqlOK) { query.next(); if (query.isValid()) { int v = query.value(0).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } } QDate DataProxy_SQLite::getFirstQSODateFromCall (const QString &_call) { //qDebug() << Q_FUNC_INFO << ": " << _call; QSqlQuery query; QString stringQuery; QDate _date; if (util->isValidCall(_call, true)) { stringQuery = QString("SELECT qso_date from log where station_callsign='%1' ORDER BY qso_date ASC LIMIT 1").arg(_call); } else if (_call == "NOT") { stringQuery = QString("SELECT qso_date from log where ((station_callsign IS NULL) OR (station_callsign='')) ORDER BY qso_date ASC LIMIT 1"); } else { // ALL stringQuery = QString("SELECT qso_date from log where 1 ORDER BY qso_date ASC LIMIT 1"); } bool sqlOK = query.exec(stringQuery); //qDebug() << Q_FUNC_INFO << ": " << query.lastQuery(); if (sqlOK) { query.next(); if (query.isValid()) { _date = util->getDateFromSQliteString((query.value(0)).toString()); //_date = QDate::fromString((query.value(0)).toString(), "yyyy-MM-dd"); //stringQuery = query.value(0).toString(); query.finish(); if (_date.isValid()) { //qDebug() << Q_FUNC_INFO << ": END OK" ; return _date; } else { //qDebug() << Q_FUNC_INFO << ": END-1 " ; return QDate(); } } else { query.finish(); //qDebug() << Q_FUNC_INFO << ": END-2" ; return QDate(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << Q_FUNC_INFO << ": END-3" ; return QDate(); } } QDate DataProxy_SQLite::getLastQSODateFromCall (const QString &_call) { //qDebug() << Q_FUNC_INFO << ": " << _call; QSqlQuery query; QString stringQuery; QDate _date; if (util->isValidCall(_call, true)) { stringQuery = QString("SELECT qso_date from log where station_callsign='%1' ORDER BY qso_date DESC LIMIT 1").arg(_call); } else if (_call == "NOT") { stringQuery = QString("SELECT qso_date from log where ((station_callsign IS NULL) OR (station_callsign='')) ORDER BY qso_date DESC LIMIT 1"); } else { // ALL stringQuery = QString("SELECT qso_date from log where 1 ORDER BY qso_date DESC LIMIT 1"); } bool sqlOK = query.exec(stringQuery); if (sqlOK) { query.next(); if (query.isValid()) { _date = util->getDateFromSQliteString((query.value(0)).toString()); //_date = QDate::fromString((query.value(0)).toString(), "yyyy-MM-dd"); //stringQuery = query.value(0).toString(); query.finish(); if (_date.isValid()) { //qDebug() << Q_FUNC_INFO << ": OK"; return _date; } else { //qDebug() << Q_FUNC_INFO << ": END-1"; return QDate(); } } else { query.finish(); //qDebug() << Q_FUNC_INFO << ": END-2"; return QDate(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << Q_FUNC_INFO << ": END-3"; return QDate(); } } bool DataProxy_SQLite::clearLog() { //qDebug() << "DataProxy_SQLite::clearLog"; //int errorCode = 0; QSqlQuery query; bool sqlOK = query.exec("DELETE FROM log"); if (sqlOK) { //qDebug() << "DataProxy_SQLite::clearLog: Log deleted!"; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::clearLog: Log deleted FAILED"; //errorCode = query.lastError().nativeErrorCode(); //qDebug() << "DataProxy_SQLite::clearLog: LastQuery: " << query.lastQuery() ; //qDebug() << "DataProxy_SQLite::clearLog: LastError-data: " << query.lastError().databaseText() ; //qDebug() << "DataProxy_SQLite::clearLog: LastError-driver: " << query.lastError().driverText() ; //qDebug() << "DataProxy_SQLite::clearLog: LastError-n: " << QString::number(query.lastError().nativeErrorCode() ); } query.finish(); sqlOK = query.exec("DELETE FROM awarddxcc"); if (sqlOK) { //qDebug() << "DataProxy_SQLite::clearLog: Awarddxcc deleted!"; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::clearLog: Awarddxcc deletedFAILED"; //qDebug() << "DataProxy_SQLite::clearLog - query error: " << QString::number(query.lastError().nativeErrorCode()); //qDebug() << "DataProxy_SQLite::clearLog: LastQuery: " << query.lastQuery() ; //qDebug() << "DataProxy_SQLite::clearLog: LastError-data: " << query.lastError().databaseText() ; //qDebug() << "DataProxy_SQLite::clearLog: LastError-driver: " << query.lastError().driverText() ; //qDebug() << "DataProxy_SQLite::clearLog: LastError-n: " << QString::number(query.lastError().nativeErrorCode() ); } query.finish(); if (query.exec("DELETE FROM awardwaz")) { //qDebug() << "DataProxy_SQLite::clearLog: Awardwaz deleted!"; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::clearLog: Awardwaz deleted FAILED"; //errorCode = query.lastError().nativeErrorCode(); //qDebug() << "DataProxy_SQLite::clearLog - query error: " << QString::number(query.lastError().nativeErrorCode()); //qDebug() << "DataProxy_SQLite::clearLog: LastQuery: " << query.lastQuery() ; //qDebug() << "DataProxy_SQLite::clearLog: LastError-data: " << query.lastError().databaseText() ; //qDebug() << "DataProxy_SQLite::clearLog: LastError-driver: " << query.lastError().driverText() ; //qDebug() << "DataProxy_SQLite::clearLog: LastError-n: " << QString::number(query.lastError().nativeErrorCode() ); } query.finish(); //query.clear(); if (query.isActive()) { //qDebug() << "DataProxy_SQLite::clearLog: Query Active!"; query.finish(); return false; } else { query.prepare("VACUUM;"); //qDebug() << "DataProxy_SQLite::clearLog: Query Not Active!"; if (query.exec()) { //qDebug() << "DataProxy_SQLite::clearLog: VACUUM OK!"; query.finish(); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::clearLog: VACUUM FAILED"; //errorCode = query.lastError().nativeErrorCode(); //qDebug() << "DataProxy_SQLite::clearLog - query error: " << QString::number(query.lastError().nativeErrorCode()); //qDebug() << "DataProxy_SQLite::clearLog: LastQuery: " << query.lastQuery() ; //qDebug() << "DataProxy_SQLite::clearLog: LastError-data: " << query.lastError().databaseText() ; //qDebug() << "DataProxy_SQLite::clearLog: LastError-driver: " << query.lastError().driverText() ; //qDebug() << "DataProxy_SQLite::clearLog: LastError-n: " << QString::number(query.lastError().nativeErrorCode() ); } } query.finish(); return false; } bool DataProxy_SQLite::qslSentViaDirect(const int _qsoId, const QDate &_updateDate) { //qDebug() << "DataProxy_SQLite::qslSentViaDirect"; QSqlQuery query; QString queryString; queryString = QString("UPDATE log SET qsl_sent = 'Y', qsl_sent_via = 'D', qslsdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); //qDebug() << "DataProxy_SQLite::qslSentViaDirect: " << queryString; bool sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } return false; } bool DataProxy_SQLite::qslSentViaBureau(const int _qsoId, const QDate &_updateDate) { //qDebug() << "DataProxy_SQLite::qslSentViaBureau"; QSqlQuery query; QString queryString; queryString = QString("UPDATE log SET qsl_sent = 'Y', qsl_sent_via = 'B', qslsdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); bool sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { //qDebug() << "DataProxy_SQLite::qslSentViaBureau - OK"; return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::qslSentViaBureau - NOK"; } return false; } bool DataProxy_SQLite::qslRecViaBureau(const int _qsoId, const QDate &_updateDate) { //qDebug() << "DataProxy_SQLite::" << QString::number (_qsoId) << "/" << _updateDate; QSqlQuery query; QString queryString; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'B', qslrdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); bool sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { //qDebug() << "DataProxy_SQLite:: TRUE"; //setDXCCAwardStatus(_qsoId); //setWAZAwardStatus(_qsoId); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } //qDebug() << "DataProxy_SQLite:: FALSE"; return false; } bool DataProxy_SQLite::qslRecViaBureau(const int _qsoId, const QDate &_updateDate, const bool _queueSentQSL) { //qDebug() << "DataProxy_SQLite::qslRecViaBureau: " << _updateDate; QSqlQuery query; QString queryString; //bool requestQSL = false; bool sqlOK; if (_queueSentQSL) { queryString = QString("SELECT qsl_sent FROM log WHERE id = '%1'").arg(_qsoId); sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { queryString = (query.value(0)).toString(); if ((queryString == "Y") || (queryString == "R")) { // NO ACTION REQUIRED, QSL IS ALREADY SENT //qDebug() << "DataProxy_SQLite::qslRecViaBureau: QSL already requested"; //requestQSL = false; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'B', qslrdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); } else { //qDebug() << "DataProxy_SQLite::qslRecViaBureau: Request QSL-1"; //requestQSL = true; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'B', qsl_sent='R', qslrdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); } } else { //qDebug() << "DataProxy_SQLite::qslRecViaBureau: Request QSL-2"; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'B', qsl_sent='R', qslrdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); //requestQSL = true; } } else { //qDebug() << "DataProxy_SQLite::qslRecViaBureau: Request QSL-3"; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'B', qsl_sent='R', qslrdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); //requestQSL = true; } } else { //requestQSL = false; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'B', qslrdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); } query.finish(); sqlOK = query.exec(queryString); //queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'B', qslrdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); if (sqlOK) { //qDebug() << "DataProxy_SQLite::qslRecViaBureau TRUE"; query.finish(); //setDXCCAwardStatus(_qsoId); //setWAZAwardStatus(_qsoId); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } //qDebug() << "DataProxy_SQLite::qslRecViaBureau FALSE"; query.finish(); return false; } bool DataProxy_SQLite::qslRecViaDirect(const int _qsoId, const QDate &_updateDate) { //qDebug() << "DataProxy_SQLite::qslRecViaDirect"; QSqlQuery query; QString queryString; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'D', qslrdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.finish(); //setDXCCAwardStatus(_qsoId); //setWAZAwardStatus(_qsoId); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } query.finish(); return false; } bool DataProxy_SQLite::qslRecViaDirect(const int _qsoId, const QDate &_updateDate, const bool _queueSentQSL) { //qDebug() << "DataProxy_SQLite::qslRecViaDirect: " << _updateDate; QSqlQuery query; QString queryString; bool sqlOK; if (_queueSentQSL) { queryString = QString("SELECT qsl_sent FROM log WHERE id = '%1'").arg(_qsoId); sqlOK = query.exec(queryString); if(sqlOK) { query.next(); if (query.isValid()) { queryString = (query.value(0)).toString(); if ((queryString == "Y") || (queryString == "R")) { // NO ACTION REQUIRED, QSL IS ALREADY SENT //qDebug() << "DataProxy_SQLite::qslRecViaDirect: QSL already requested"; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'D', qslrdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); } else { //qDebug() << "DataProxy_SQLite::qslRecViaDirect: Request QSL-1"; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'D', qsl_sent='R', qslrdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); } } else { //qDebug() << "DataProxy_SQLite::qslRecViaDirect: Request QSL-2"; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'D', qsl_sent='R', qslrdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::qslRecViaDirect: Request QSL-3"; queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'D', qsl_sent='R', qslrdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); } } else { queryString = QString("UPDATE log SET qsl_rcvd = 'Y', qsl_rcvd_via = 'D', qslrdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); } query.finish(); sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << "DataProxy_SQLite::qslRecViaDirect TRUE"; query.finish(); //setDXCCAwardStatus(_qsoId); //setWAZAwardStatus(_qsoId); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } //qDebug() << "DataProxy_SQLite::qslRecViaDirect FALSE"; query.finish(); return false; } bool DataProxy_SQLite::qslSentAsRequested(const int _qsoId, const QDate &_updateDate) { //TODO: Add some protection to the data before modifying //qDebug() << "DataProxy_SQLite::qslSentAsRequested"; QSqlQuery query; QString queryString; queryString = QString("UPDATE log SET qsl_sent = 'R', qslsdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); //qDebug() << "DataProxy_SQLite::qslSentAsRequested: " << queryString; bool sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << "DataProxy_SQLite::qslSentAsRequested"; query.finish(); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } query.finish(); return false; } bool DataProxy_SQLite::qslRecAsRequested(const int _qsoId, const QDate &_updateDate) { //TODO: Add some protection to the data before modifying //qDebug() << "DataProxy_SQLite::qslRecAsRequested"; QSqlQuery query; QString queryString; queryString = QString("UPDATE log SET qsl_rcvd = 'R', qslsdate = '%1' WHERE id = '%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); //qDebug() << "DataProxy_SQLite::qslRecAsRequested: " << queryString; bool sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << "DataProxy_SQLite::qslRecAsRequested OK"; query.finish(); return true; } else { //qDebug() << "DataProxy_SQLite::qslRecAsRequested NOK"; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } query.finish(); return false; } bool DataProxy_SQLite::setClubLogSent(const int _qsoId, const QString &_st, const QDate &_updateDate) { // Updates the QSO with the ClubLog status & date QSqlQuery query; QString queryString; queryString = QString("UPDATE log SET clublog_qso_upload_status = '%1', clublog_qso_upload_date = '%2' WHERE id = '%3'").arg(_st).arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); //qDebug() << "DataProxy_SQLite::setClubLogSent: " << queryString; bool sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << "DataProxy_SQLite::setClubLogSent - TRUE"; query.finish(); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } //qDebug() << "DataProxy_SQLite::setClubLogSent - FALSE"; query.finish(); return false; } bool DataProxy_SQLite::setLoTWQSLRec (const int _qsoId, const QString &_st, const QDate &_updateDate) { QSqlQuery query; QString queryString; if (!util->isValidQSL_Rcvd(_st)) { return false; } if (!_updateDate.isValid()) { return false; } queryString = QString("UPDATE log SET lotw_qsl_rcvd = '%1', lotw_qslrdate = '%2' WHERE id = '%3'").arg(_st).arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_qsoId); //qDebug() << "DataProxy_SQLite::setLoTWQSLRec: " << queryString; bool sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << "DataProxy_SQLite::setLoTWQSLRec - TRUE"; query.finish(); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } //qDebug() << "DataProxy_SQLite::setLoTWQSLRec - FALSE"; query.finish(); return false; } bool DataProxy_SQLite::isQSOConfirmed(const int _qsoId, const bool _checkPaper, const bool _checkLoTW) { // Returns true if the QSO has been confirmed via paper and/or LoTW QSqlQuery query; QString queryString; queryString = QString("SELECT qsl_rcvd, lotw_qsl_rcvd FROM log WHERE id = '%1'").arg(_qsoId); if (!query.exec(queryString)) { return false; } if (!query.next ()) { return false; } if (!query.isValid ()) { return false; } QString paperQSL = (query.value(0)).toString(); QString lotwQSL = (query.value(1)).toString(); query.finish(); if (_checkPaper && _checkLoTW) { return ((paperQSL == "Y") || (lotwQSL == "Y")); } else if (_checkPaper && !_checkLoTW) { return (paperQSL == "Y"); } else if (!_checkPaper && _checkLoTW) { return (lotwQSL == "Y"); } else { return false; } } bool DataProxy_SQLite::isQSLReceived(const int _qsoId) { //qDebug() << "DataProxy_SQLite::isQSLReceived" << QString::number(_qsoId); QSqlQuery query; QString queryString; queryString = QString("SELECT qsl_rcvd FROM log WHERE id = '%1'").arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { queryString = (query.value(0)).toString(); query.finish(); if (queryString == "Y") { //qDebug() << "DataProxy_SQLitew::isQSLReceived: " << QString::number(_qsoId) << "QSL Received"; return true; } else { //qDebug() << "DataProxy_SQLite::isQSLReceived: " << QString::number(_qsoId) << "QSL NOT Received-1"; return false; } } else { //qDebug() << "DataProxy_SQLite::isQSLReceived: " << QString::number(_qsoId) << "QSL NOT Received-2"; query.finish(); return false; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); } return false; } bool DataProxy_SQLite::isQSLSent(const int _qsoId) { //qDebug() << "DataProxy_SQLite::isQSLSent: " << QString::number(_qsoId); QSqlQuery query; QString queryString; queryString = QString("SELECT qsl_sent FROM log WHERE id = '%1'").arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { queryString = (query.value(0)).toString(); query.finish(); if (queryString == "Y") { //qDebug() << "DataProxy_SQLite::isQSLSent: " << QString::number(_qsoId) << "QSL Sent"; return true; } else { //qDebug() << "DataProxy_SQLite::isQSLSent: " << QString::number(_qsoId) << "QSL NOT Sent-1"; return false; } } else { //qDebug() << "DataProxy_SQLite::isQSLSent: " << QString::number(_qsoId) << "QSL NOT Sent-2"; return false; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } //return false; } int DataProxy_SQLite::getBandFromId(const int _qsoId) { QSqlQuery query; QString queryString = QString("SELECT bandid FROM log WHERE id='%1'").arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); } return -1; } int DataProxy_SQLite::getModeFromId(const int _qsoId) { QSqlQuery query; QString queryString = QString("SELECT modeid FROM log WHERE id='%1'").arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); } return -1; } int DataProxy_SQLite::getDXCCFromId(const int _qsoId) { QSqlQuery query; QString queryString = QString("SELECT dxcc FROM log WHERE id='%1'").arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); } return -1; } int DataProxy_SQLite::getCQZFromId(const int _qsoId) { QSqlQuery query; QString queryString = QString("SELECT cqz FROM log WHERE id='%1'").arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); } return -1; } QList DataProxy_SQLite::getBandModeDXCCCQZlogIDFromId(const int _qsoId) { QList result; result.clear(); QSqlQuery query; QString queryString = QString("SELECT bandid, modeid, dxcc, cqz, lognumber FROM log WHERE id='%1'").arg(_qsoId); if (!query.exec(queryString)) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish (); return result; } if (!query.next ()) { query.finish (); return result; } if (!query.isValid ()) { query.finish (); return result; } QSqlRecord rec = query.record(); int nameCol = rec.indexOf("bandid"); int v = (query.value(nameCol)).toInt(); if (v<1) { return result; } result.append (v); nameCol = rec.indexOf("modeid"); v = (query.value(nameCol)).toInt(); v = (query.value(nameCol)).toInt(); if (v<1) { result.clear(); return result; } result.append (v); nameCol = rec.indexOf("dxcc"); v = (query.value(nameCol)).toInt(); v = (query.value(nameCol)).toInt(); if (v<1) { result.clear(); return result; } result.append (v); nameCol = rec.indexOf("cqz"); v = (query.value(nameCol)).toInt(); v = (query.value(nameCol)).toInt(); if (v<1) { result.clear(); return result; } result.append (v); nameCol = rec.indexOf("lognumber"); v = (query.value(nameCol)).toInt(); v = (query.value(nameCol)).toInt(); if (v<1) { result.clear(); return result; } result.append (v); query.finish (); return result; } QString DataProxy_SQLite::getCallFromId(const int _qsoId) { //qDebug() << "DataProxy_SQLite::getCallFromId"; QSqlQuery query; QString queryString = QString("SELECT call FROM log WHERE id='%1'").arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { QString v = (query.value(0)).toString(); query.finish(); return v; } else { query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); } return QString(); } QStringList DataProxy_SQLite::getClubLogRealTimeFromId(const int _qsoId) { //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: " << QString::number(_qsoId); /* Return a QStringList with 16 fields with these data: QSO_DATE, TIME_ON, QSLRDATE, QSLSDATE, CALL, OPERATOR, MODE, BAND, BAND_RX, FREQ, QSL_RCVD, LOTW_QSL_RCVD, QSL_SENT, DXCC, PROP_MODE, CREDIT_GRANTED */ QSqlQuery query; int nameCol = -1; QStringList dataC = QStringList(); //QString aux1 = QString(); //QString aux2 = QString(); //QString call = QString(); // IMPORTANT: band_rx is not always present, and if it is not present, the query with INNER JOIN will fail. // To fix that we will do two queries, one to check if I have all the data and if not another one with a reduced scope. QString queryString = QString("SELECT band_rx FROM log WHERE id='%1'").arg(_qsoId); bool sqlOk = query.exec(queryString); bool haveBandRX = false; if (sqlOk) { //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: sqlOK -1"; if (query.next()) { //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: qsl next -1"; if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: sql valid -1"; QSqlRecord rec = query.record(); nameCol = rec.indexOf("band_rx"); QString aux = (query.value(nameCol)).toString(); if (aux.length()<1) { // We DON'T have a band_rx available query.finish(); //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: without BAND-RX"; queryString = QString("SELECT qso_date, qslrdate, qslsdate, call, station_callsign, operator, M.name, B.name, freq, qsl_rcvd, lotw_qsl_rcvd, qsl_sent, dxcc, prop_mode, credit_granted FROM log INNER JOIN band as B ON bandid = B.id INNER JOIN mode as M ON modeid = M.id WHERE log.id='%1'").arg(_qsoId); } else { haveBandRX = true; queryString = QString("SELECT qso_date, qslrdate, qslsdate, call, station_callsign, operator, M.name, B.name, R.name, freq, qsl_rcvd, lotw_qsl_rcvd, qsl_sent, dxcc, prop_mode, credit_granted FROM log INNER JOIN band as B ON bandid = B.id INNER JOIN band as R ON band_rx = R.id INNER JOIN mode as M ON modeid = M.id WHERE log.id='%1'").arg(_qsoId); } } else { // We have a band_rx available query.finish(); //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: NO VALID"; return QStringList(); } } else { query.finish(); //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: ERROR-1"; return QStringList(); } } else { query.finish(); //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: ERROR-2"; return QStringList(); } sqlOk = query.exec(queryString); dataC << QString::number(_qsoId); //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: lastQuery: " << query.lastQuery(); if (sqlOk) { //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId sqlOK-1"; if (query.next()) { //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId query next = OK"; if (query.isValid()) { QSqlRecord rec = query.record(); //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId query valid = OK"; QString aux; nameCol = rec.indexOf("qso_date"); aux = util->getADIFDateFromQDateTime(util->getDateTimeFromSQLiteString((query.value(nameCol)).toString())); if (aux.length()<1) { query.finish(); //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: ERROR-3: " << aux; return QStringList(); } dataC << aux; aux = util->getADIFTimeFromQDateTime(util->getDateTimeFromSQLiteString((query.value(nameCol)).toString())); if (aux.length()<1) { query.finish(); //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: ERROR-4: " << aux; return QStringList(); } //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId Time_on: " << aux; dataC << aux; //dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("qslrdate"); dataC << util->getADIFDateFromQDate( util->getDateFromSQliteString((query.value(nameCol)).toString()) ); //dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("qslsdate"); dataC << util->getADIFDateFromQDate( util->getDateFromSQliteString((query.value(nameCol)).toString()) ); //dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("call"); if (aux.length()<1) { query.finish(); //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: ERROR-5: " << aux; return QStringList(); } QString call = (query.value(nameCol)).toString(); dataC << call; nameCol = rec.indexOf("operator"); dataC << (query.value(nameCol)).toString(); //nameCol = rec.indexOf("M.name"); //MODE //TODO: Fix this to get the proper column aux = (query.value(6)).toString(); if (aux.length()<1) { query.finish(); //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: ERROR-6: " << aux; return QStringList(); } dataC << aux; //nameCol = rec.indexOf("B.name"); // BAND aux = (query.value(7)).toString(); if (aux.length()<1) { query.finish(); //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: ERROR-7: " << aux; return QStringList(); } dataC << aux; if (haveBandRX) { dataC << (query.value(8)).toString(); } else { dataC << ""; } //nameCol = rec.indexOf("R.name"); //BAND_RX //TODO: Fix this to get the proper column (use an index instead of a number) nameCol = rec.indexOf("freq"); dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("qsl_rcvd"); dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("lotw_qsl_rcvd"); dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("qsl_sent"); dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("dxcc"); dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("prop_mode"); dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("credit_granted"); dataC << (query.value(nameCol)).toString(); nameCol = rec.indexOf("station_callsign"); QString aux2 = (query.value(nameCol)).toString(); if (util->isValidCall(aux2)) { dataC << aux2; } else { dataC << call; } //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: RETURNING ... OK"; query.finish(); return dataC; } else { //NO VALID //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId NO VALID NOT OK"; query.finish(); return QStringList(); } } } else { //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId NOT sqlOK"; //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: 2 LastQuery: " << query.lastQuery() ; //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: 2 LastError-data: " << query.lastError().databaseText() ; //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: 2 LastError-driver: " << query.lastError().driverText() ; //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: 2 LastError-n: " << QString::number(query.lastError().nativeErrorCode() ); emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QStringList(); } //qDebug() << "DataProxy_SQLite::getClubLogRealTimeFromId: ERROR-10"; return QStringList(); } QString DataProxy_SQLite::getNameFromQRZ(const QString &_call) { if (_call.length() <= 0) { //qDebug() << "DataProxy_SQLite::getNameFromQRZ return 0"; return QString(); } QSqlQuery query; QString queryString = QString("SELECT name FROM log WHERE call='%0'").arg(_call); bool sqlOk = query.exec(queryString); if (sqlOk) { while (query.next()) { if (query.isValid()) { if (((query.value(0)).toString()).length()>0) { //qDebug() << "DataProxy_SQLite::getNameFromQRZ: " << (query.value(0)).toString(); QString v = (query.value(0)).toString(); query.finish(); return v; } } } query.finish(); //qDebug() << "DataProxy_SQLite::getNameFromQRZ: NO NAME" ; return QString(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } } QString DataProxy_SQLite::getQTHFromQRZ(const QString &_call) { if (_call.length() <= 0) { return QString(); } QSqlQuery query; QString queryString = QString("SELECT qth FROM log WHERE call='%0'").arg(_call); bool sqlOk = query.exec(queryString); if (sqlOk) { while (query.next()) { if (query.isValid()) { if (((query.value(0)).toString()).length()>0) { QString v = (query.value(0)).toString(); query.finish(); return v; } } } query.finish(); return QString(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } } QString DataProxy_SQLite::getLocatorFromQRZ(const QString &_call) { if (_call.length() <= 0) { return QString(); } QSqlQuery query; QString queryString = QString("SELECT gridsquare FROM log WHERE call='%0'").arg(_call); bool sqlOk = query.exec(queryString); if (sqlOk) { while (query.next()) { if (query.isValid()) { if (((query.value(0)).toString()).length()>0) { QString v = (query.value(0)).toString(); query.finish(); return v; } } } query.finish(); return QString(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } } QString DataProxy_SQLite::getLocatorFromId (const int _id) { if (_id <= 0) { return QString(); } QSqlQuery query; QString queryString = QString("SELECT gridsquare FROM log WHERE id='%0'").arg(_id); bool sqlOk = query.exec(queryString); if (sqlOk) { while (query.next()) { if (query.isValid()) { if (((query.value(0)).toString()).length()>0) { QString v = (query.value(0)).toString(); query.finish(); return v; } } } query.finish(); return QString(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } } QString DataProxy_SQLite::getIOTAFromQRZ(const QString &_call) { if (_call.length() <= 0) { return QString(); } QSqlQuery query; QString queryString = QString("SELECT iota FROM log WHERE call='%0'").arg(_call); bool sqlOk = query.exec(queryString); if (sqlOk) { while (query.next()) { if (query.isValid()) { if (((query.value(0)).toString()).length()>0) { QString v = (query.value(0)).toString(); query.finish(); return v; } } } query.finish(); return QString(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } } QString DataProxy_SQLite::getQSLViaFromQRZ(const QString &_call) { if (_call.length() <= 0) { return QString(); } QSqlQuery query; QString queryString = QString("SELECT DISTINCT qsl_via FROM log WHERE call='%0'").arg(_call); bool sqlOk = query.exec(queryString); if (sqlOk) { while (query.next()) { if (query.isValid()) { if (((query.value(0)).toString()).length()>0) { QString v = (query.value(0)).toString(); query.finish(); return v; } } } query.finish(); return QString();; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } } QStringList DataProxy_SQLite::getFilteredLocators(const QString &_band, const QString &_mode, const QString &_prop, const QString &_sat, bool _confirmed) { //qDebug() << Q_FUNC_INFO << ": " << _band; //qDebug() << Q_FUNC_INFO << ": " << _mode; //qDebug() << Q_FUNC_INFO << ": " << _prop; //qDebug() << Q_FUNC_INFO << ": " << _sat; QStringList grids = QStringList(); QSqlQuery query; QString queryString; QString bandString = QString(); int bandId = getIdFromBandName(_band); if (util->isValidBandId(bandId)) { bandString = QString("bandid = '%1'").arg(bandId); } else { bandString = QString("bandid <> ''"); } QString modeString = QString(); int modeId = getIdFromModeName(_mode); if (util->isValidModeId(modeId)) { modeString = QString("AND modeid = '%1'").arg(modeId); } else { modeString = QString("AND modeid <> '' "); } QString propString = QString(); QString satsString = QString(); if (isValidPropMode(_prop)) { propString = QString("AND prop_mode = '%1'").arg(_prop); if (_prop == "SAT") { //qDebug() << Q_FUNC_INFO << ": SAT: " << _sat; if (getDBSatId(_sat)>0) { satsString = QString("AND sat_name = '%1'").arg(_sat); } else { satsString = QString("AND sat_name <> 'x'"); } } else { satsString = QString("AND sat_name = ''"); } } else { propString = QString("AND prop_mode <> 'x'"); satsString = QString("AND sat_name = ''"); } QString confirmedString = QString(); if (_confirmed) { confirmedString = QString("AND ((qsl_rcvd = 'Y') OR (lotw_qsl_rcvd = 'Y'))"); } else { confirmedString = QString("AND qsl_rcvd <> 'x' "); } queryString = QString("SELECT DISTINCT gridsquare from log WHERE %1 %2 %3 %4 %5 ORDER BY id ASC").arg(bandString).arg(modeString).arg(propString).arg(satsString).arg(confirmedString); bool sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << Q_FUNC_INFO << queryString ; while(query.next()) { if (query.isValid()) { queryString = (query.value(0)).toString(); grids.append(queryString); if (grids.contains ("IN99")) { //qDebug() << Q_FUNC_INFO << ": " << queryString ; } } else { query.finish(); return QStringList(); } } query.finish(); grids.sort(); return grids; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QStringList(); } } bool DataProxy_SQLite::updateAwardDXCC() { //qDebug() << "DataProxy_SQLite::updateAwardDXCC"; fillEmptyDXCCInTheLog(); return db->updateAwardDXCCTable(); //qDebug() << "DataProxy_SQLite::updateAwardDXCC-END"; } bool DataProxy_SQLite::updateAwardWAZ() { //qDebug() << "DataProxy_SQLite::updateAwardWAZ"; return db->updateAwardWAZTable(); } bool DataProxy_SQLite::QRZCOMModifyFullLog(const int _currentLog) { //qDebug() << " DataProxy_SQLite::QRZCOMModifyFullLog" << QString::number(_currentLog); if (!doesThisLogExist(_currentLog)) { return false; } QString queryString; bool sqlOK; QSqlQuery query; queryString = QString("UPDATE log SET qrzcom_qso_upload_status = 'M', qrzcom_qso_upload_date = '%1'").arg(util->getDateSQLiteStringFromDate(QDate::currentDate())); sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { //qDebug() << " DataProxy_SQLite::QRZCOMModifyFullLog: END TRUE"; return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << " DataProxy_SQLite::QRZCOMModifyFullLog: END FALSE: " << query.lastError().databaseText() ; return false; } //qDebug() << " DataProxy_SQLite::QRZCOMModifyFullLog: END TRUE" ; //return false; } bool DataProxy_SQLite::QRZCOMSentQSOs(const QList &_qsos) { //qDebug() << " DataProxy_SQLite::QRZCOMSentQSOs" << QString::number(_qsos.count()); if (_qsos.count() < 1) { return true; } QString queryString; bool sqlOK; QSqlQuery query; for (int i = 0; i< _qsos.count(); i++) { //qDebug() << " DataProxy_SQLite::QRZCOMLSentQSOs: updating QSO: " << QString::number(_qsos.at(i)); queryString = QString("UPDATE log SET qrzcom_qso_upload_status = 'Y', qrzcom_qso_upload_date = '%1' WHERE id='%2'").arg(util->getDateSQLiteStringFromDate(QDate::currentDate())).arg(QString::number(_qsos.at(i))); sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { //qDebug() << " DataProxy_SQLite::QRZCOMSentQSOs: exec: " << query.lastQuery(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << " DataProxy_SQLite::QRZCOMSentQSOs: END FALSE" ; return false; } } //qDebug() << " DataProxy_SQLite::QRZCOMSentQSOs: END TRUE" ; return true; } bool DataProxy_SQLite::clublogSentQSOs(const QList &_qsos) { //qDebug() << " DataProxy_SQLite::clublogSentQSOs" << QString::number(_qsos.count()); if (_qsos.count() < 1) { return true; } QString queryString; bool sqlOK; QSqlQuery query; for (int i = 0; i< _qsos.count(); i++) { //qDebug() << " DataProxy_SQLite::lotwSentQSOs: updating QSO: " << QString::number(_qsos.at(i)); queryString = QString("UPDATE log SET clublog_qso_upload_status = 'Y', clublog_qso_upload_date = '%1' WHERE id='%2'").arg(util->getDateSQLiteStringFromDate(QDate::currentDate())).arg(QString::number(_qsos.at(i))); sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { //qDebug() << " DataProxy_SQLite::clublogSentQSOs: exec: " << query.lastQuery(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << " DataProxy_SQLite::clublogSentQSOs: END FALSE" ; return false; } } //qDebug() << " DataProxy_SQLite::clublogSentQSOs: END TRUE" ; return true; } bool DataProxy_SQLite::clublogModifyFullLog(const int _currentLog) { //qDebug() << " DataProxy_SQLite::clublogModifyFullLog" << QString::number(_currentLog); if (!doesThisLogExist(_currentLog)) { return false; } QString queryString; bool sqlOK; QSqlQuery query; queryString = QString("UPDATE log SET clublog_qso_upload_status = 'M', clublog_qso_upload_date = '%1'").arg(util->getDateSQLiteStringFromDate(QDate::currentDate())); sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << " DataProxy_SQLite::clublogModifyFullLog: END FALSE" ; return false; } //qDebug() << " DataProxy_SQLite::clublogModifyFullLog: END TRUE" ; //return false; } bool DataProxy_SQLite::eQSLModifyFullLog(const int _currentLog) { //qDebug() << " DataProxy_SQLite::eQSLModifyFullLog" << QString::number(_currentLog); if (!doesThisLogExist(_currentLog)) { return false; } QString queryString; bool sqlOK; QSqlQuery query; queryString = QString("UPDATE log SET eqsl_qsl_sent = 'Q', eqsl_qslsdate = '%1'").arg(util->getDateSQLiteStringFromDate(QDate::currentDate())); sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { //qDebug() << " DataProxy_SQLite::eQSLModifyFullLog: END TRUE"; return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << " DataProxy_SQLite::eQSLModifyFullLog: END FALSE: " << query.lastError().databaseText() ; return false; } //qDebug() << " DataProxy_SQLite::eQSLModifyFullLog: END TRUE" ; } bool DataProxy_SQLite::eQSLSentQSOs(const QList &_qsos) { //qDebug() << " DataProxy_SQLite::eQSLSentQSOs" << QString::number(_qsos.count()); if (_qsos.count() < 1) { return true; } QString queryString; bool sqlOK; QSqlQuery query; for (int i = 0; i< _qsos.count(); i++) { //qDebug() << " DataProxy_SQLite::eQSLSentQSOs: updating QSO: " << QString::number(_qsos.at(i)); queryString = QString("UPDATE log SET eqsl_qsl_sent = 'Y', eqsl_qslsdate = '%1' WHERE id='%2'").arg(util->getDateSQLiteStringFromDate(QDate::currentDate())).arg(QString::number(_qsos.at(i))); sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { //qDebug() << " DataProxy_SQLite::eQSLSentQSOs: exec: " << query.lastQuery(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << " DataProxy_SQLite::eQSLSentQSOs: END FALSE" ; return false; } } //qDebug() << " DataProxy_SQLite::eQSLSentQSOs: END TRUE" ; return true; } bool DataProxy_SQLite::addQSOFromWSJTX (const QString &_dxcall, const QString &_mode, const QString &_band, const double _freq, const QString &_mygrid, const QString &_dxgrid, const QString &_rstTX, const QString &_rstRX, const QString &_sRX, const QString &_sTX, const QString &_comment, const QString &_stationcallsign, const QString &_name, const QString &_operator, const QDateTime &_datetime, const QDateTime &_datetime_off, const double txpower, const int _dxcc, const int _logNumber, bool _sendQSL) { //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: " << _dxcall; //void MainWindow::slotWSJTXloggedQSO(const int _type, const QString &_dxcall, const quint64 _freq, const QString &_mode, // const QString &_dx_grid, const QString &_time_off, const QString &_report_sent, const QString &_report_rec, // const QString &_tx_power, const QString &_comments, const QString &_name, const QString &_time_on) //_qso format: Date/TimeOn/call/bandid/modeid/freq/dxgrid/timeOff/rsttx/rstrx/txpower/comments/name /* Mandatory data: "qso_date VARCHAR(10) NOT NULL, " "call VARCHAR(40) NOT NULL, " "bandid INTEGER NOT NULL, " "modeid INTEGER NOT NULL, " */ QString stringFields = QString(); QString stringData = QString(); QString stringQuery = QString(); QSqlQuery query; if (util->isValidCall(_dxcall)) { stringFields = "call, "; stringData = "'" + _dxcall + "', "; } else { //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: Error: call"; return false; } if (_datetime.isValid()) { //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: time-on: " << _datetime; stringFields = stringFields + "qso_date, "; QDateTime _dateTime; //_dateTime.setDate(QDate::currentDate()); //_dateTime.setTime(QTime::fromString(_time_on, "yyyyMMddhhmmss")); //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: time-on: " << _datetime; //stringData = stringData + "'" + QDateTime::fromString(_time_on, "yyyyMMddhhmmss").toString("yyyy-MM-dd") + "', '" + QDateTime::fromString(_time_on, "yyyyMMddhhmmss").toString("hh:mm:ss") + "', "; stringData = stringData + "'" + util->getDateTimeSQLiteStringFromDateTime(_datetime) + "', "; //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: time-on: " << stringData; } else { //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: Error: time-on_ " << _datetime; return false; } QString band = getBandNameFromFreq(_freq); if (band != _band) { //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: Error: FREQ / BAND inconsistency " << _band << "/" << QString::number(_freq); } if (band.length()>0) { stringFields = stringFields + "bandid, " ; stringData = stringData + "'" + QString::number(getBandIdFromFreq(_freq)) + "', "; stringFields = stringFields + "band_rx, " ; stringData = stringData + "'" + QString::number(getBandIdFromFreq(_freq)) + "', "; stringFields = stringFields + "freq, " ; stringData = stringData + "'" + QString::number(_freq) + "', "; // EA5WA fix to add the freq RX into the log stringFields = stringFields + "freq_rx, " ; stringData = stringData + "'" + QString::number(_freq) + "', "; } else { //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: Error: band"; emit queryError(Q_FUNC_INFO, "Incorrect band: " + _band, "-1000", "No query error"); return false; } int _modeid = getSubModeIdFromSubMode(_mode); //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: mode: " << _mode; //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: modeid: " << QString::number(_modeid); if (util->isValidModeId(_modeid)) { stringFields = stringFields + "modeid, "; stringData = stringData + "'" + QString::number(_modeid) + "', "; } else { //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: Error: mode"; emit queryError(Q_FUNC_INFO, "Incorrect mode: " + _mode, "-1000", "No query error"); return false; } if (_datetime_off.isValid()) { stringFields = stringFields + "qso_date_off, "; stringData = stringData + "'" + util->getDateTimeSQLiteStringFromDateTime(_datetime_off) + "', "; } if (util->isValidRST(_rstTX)) { stringFields = stringFields + "rst_sent, "; stringData = stringData + "'" + _rstTX + "', "; } if (util->isValidRST(_rstRX)) { stringFields = stringFields + "rst_rcvd, "; stringData = stringData + "'" + _rstRX + "', "; } if (_sTX.length()>0) { stringFields = stringFields + "stx_string, "; stringData = stringData + "'" + _sTX + "', "; } if (_sRX.length()>0) { stringFields = stringFields + "srx_string, "; stringData = stringData + "'" + _sRX + "', "; } if (_comment.length()>0) { stringFields = stringFields + "comment, "; stringData = stringData + "'" + _comment + "', "; } if (_name.length()>0) { stringFields = stringFields + "name, "; stringData = stringData + "'" + _name + "', "; } if (util->isValidGrid(_dxgrid)) { stringFields = stringFields + "gridsquare, "; stringData = stringData + "'" + _dxgrid + "', "; } if (util->isValidGrid(_mygrid)) { stringFields = stringFields + "my_gridsquare, "; stringData = stringData + "'" + _mygrid + "', "; } if (util->isValidPower(QString::number(txpower))) { stringFields = stringFields + "tx_pwr, "; stringData = stringData + "'" + QString::number(txpower) + "', "; } if (util->isValidCall(_operator)) { stringFields = stringFields + "operator, "; stringData = stringData + "'" + _operator + "', "; } if (util->isValidCall(_stationcallsign)) { stringFields = stringFields + "station_callsign, "; stringData = stringData + "'" + _stationcallsign + "', "; } if (_dxcc>0) { stringFields = stringFields + "dxcc, "; stringData = stringData + "'" + QString::number(_dxcc) + "', "; int _cqz, _ituz; _cqz = getCQzFromEntity(_dxcc); _ituz = getITUzFromEntity(_dxcc); if (_cqz >0) { stringFields = stringFields + "cqz, "; stringData = stringData + "'" + QString::number(_cqz) + "', "; } if (_ituz >0) { stringFields = stringFields + "ituz, "; stringData = stringData + "'" + QString::number(_ituz) + "', "; } } if (_sendQSL) { stringFields = stringFields + "qsl_via, "; stringData = stringData + "'B', "; stringFields = stringFields + "lotw_qsl_sent, "; stringData = stringData + "'Q', "; stringFields = stringFields + "eqsl_qsl_sent, "; stringData = stringData + "'Q', "; stringFields = stringFields + "hrdlog_qso_upload_status, "; stringData = stringData + "'M', "; stringFields = stringFields + "clublog_qso_upload_status, "; stringData = stringData + "'M', "; stringFields = stringFields + "qrzcom_qso_upload_status, "; stringData = stringData + "'M', "; } stringFields = stringFields + "lognumber"; stringData = stringData + "'" + QString::number(_logNumber) + "'"; stringQuery = "INSERT INTO log (" + stringFields + ") values (" + stringData +")" ; //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: Query: " << stringQuery; bool sqlOK = query.exec(stringQuery); //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: LastQuery: " << query.lastQuery(); if (sqlOK) { query.finish(); //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: SQL OK"; return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "DataProxy_SQLite::addQSOFromWSJTX: Error: SQL "; return false; } } int DataProxy_SQLite::addQSOFromLoTW(const QString &_call, const QDateTime _datetime, const QString &_mode, const QString &_band, const double _freq, const QDate _qslrdate, const QString &_stationcallsign, const int _logn) { //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: " << _call; /* Mandatory data: "qso_date VARCHAR(10) NOT NULL, " "call VARCHAR(40) NOT NULL, " "bandid INTEGER NOT NULL, " "modeid INTEGER NOT NULL, " "lognumber" */ QString stringFields = QString(); QString stringData = QString(); QString stringQuery = QString(); //getITUzFromEntity() QSqlQuery query; if (util->isValidCall(_call)) { stringFields = "call, "; stringData = "'" + _call + "', "; } else { //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: Error: call"; return -1; } if (_datetime.isValid()) { //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: time-on: " << _datetime; stringFields = stringFields + "qso_date, "; QDateTime _dateTime; stringData = stringData + "'" + util->getDateTimeSQLiteStringFromDateTime(_datetime) + "', "; //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: time-on: " << stringData; } else { //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: Error: time-on_ " << _datetime; return -2; } QString band = getBandNameFromFreq(_freq); if (band != _band) { //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: Error: FREQ / BAND inconsistency " << _band << "/" << QString::number(_freq); } if (band.length()>0) { stringFields = stringFields + "bandid, " ; stringData = stringData + "'" + QString::number(getBandIdFromFreq(_freq)) + "', "; stringFields = stringFields + "freq, " ; stringData = stringData + "'" + QString::number(_freq) + "', "; } else { //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: Error: band"; emit queryError(Q_FUNC_INFO, "Incorrect band: " + _band, "-1000", "No query error"); return -3; } int _modeid = getSubModeIdFromSubMode(_mode); if (util->isValidModeId(_modeid)) { stringFields = stringFields + "modeid, "; stringData = stringData + "'" + QString::number(_modeid) + "', "; QString rst = util->getDefaultRST(_mode); if (rst.length()>0) { stringFields = stringFields + "rst_sent, "; stringData = stringData + "'" + rst + "', "; stringFields = stringFields + "rst_rcvd, "; stringData = stringData + "'" + rst + "', "; } } else { //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: Error: mode"; emit queryError(Q_FUNC_INFO, "Incorrect mode: " + _mode, "-1000", "No query error"); return -4; } if (_qslrdate.isValid()) { stringFields = stringFields + "lotw_qslrdate, "; stringData = stringData + "'" + util->getDateSQLiteStringFromDate(_qslrdate) + "', "; stringFields = stringFields + "lotw_qsl_rcvd, "; stringData = stringData + "'Y', "; stringFields = stringFields + "lotw_qsl_sent, "; stringData = stringData + "'Q', "; } if (util->isValidCall(_stationcallsign)) { stringFields = stringFields + "station_callsign, "; stringData = stringData + "'" + _stationcallsign + "', "; } int _dxcc = getDXCCFromPrefix(_call); if (_dxcc>0) { stringFields = stringFields + "dxcc, "; stringData = stringData + "'" + QString::number(_dxcc) + "', "; int _cqz, _ituz; _cqz = getCQzFromEntity(_dxcc); _ituz = getITUzFromEntity(_dxcc); if (_cqz >0) { stringFields = stringFields + "cqz, "; stringData = stringData + "'" + QString::number(_cqz) + "', "; } if (_ituz >0) { stringFields = stringFields + "ituz, "; stringData = stringData + "'" + QString::number(_ituz) + "', "; } } stringFields = stringFields + "lognumber"; stringData = stringData + "'" + QString::number(_logn) + "'"; stringQuery = "INSERT INTO log (" + stringFields + ") values (" + stringData +")" ; //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: Query: " << stringQuery; bool sqlOK = query.exec(stringQuery); //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: LastQuery: " << query.lastQuery(); if (sqlOK) { //query.finish(); if (query.exec("SELECT MAX(id) FROM log")) { if (query.next()) { if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: NOT VALID"; } } else { //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: QUERY EXEC NOT NEXT"; } } else { //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: NOT OK: " << query.lastError().databaseText(); //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: NOT OK: " << QString::number(query.lastError().nativeErrorCode()); } //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: SQL OK"; return -5; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "DataProxy_SQLite::addQSOFromLoTW: Error: SQL "; return -100; } } bool DataProxy_SQLite::deleteQSO(const int _qsoId) { //qDebug() << "DataProxy_SQLite::deleteQSO"; QSqlQuery query; QString queryString = QString("DELETE FROM log WHERE id='%1'").arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.finish(); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } } int DataProxy_SQLite::isWorkedB4(const QString &_qrz, const int _currentLog) { //qDebug() << "DataProxy_SQLite::isWorkedB4"; //Returns the QSO id QSqlQuery query; QString queryString; if (_currentLog < 0) { queryString = QString("SELECT id FROM log WHERE call='%1'").arg(_qrz); } else { queryString = QString("SELECT id FROM log WHERE call='%1' AND lognumber='%2'").arg(_qrz).arg(_currentLog); } bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } } QList DataProxy_SQLite::isThisQSODuplicated(const QString &_callingFunc, const QString &_qrz, const QDateTime &_dateTime, const int _band, const int _mode, const int _secs) //QList DataProxy_SQLite::isThisQSODuplicated(const QString &_qrz, const QDateTime &_dateTime, const int _band, const int _mode) { //qDebug() << Q_FUNC_INFO << ": " << _callingFunc; (void)_callingFunc; QSqlQuery query; QString queryString; QList dupeQsos; dupeQsos.clear(); int validityPeriod = _secs * 60; QString initTime = util->getDateTimeSQLiteStringFromDateTime(_dateTime.addSecs(-validityPeriod)); QString endTime = util->getDateTimeSQLiteStringFromDateTime(_dateTime.addSecs(validityPeriod)); //yyyy-MM-dd hh:mm:ss // We will match +-15min queryString = QString("SELECT id, qso_date FROM log WHERE call='%1' AND bandid='%2' AND modeid='%3' AND qso_date>='%4' AND qso_date<='%5'").arg(_qrz).arg(_band).arg(_mode).arg(initTime).arg(endTime); bool sqlOK = query.exec(queryString); if (sqlOK) { while (query.next()) { if (query.isValid()) { int dupeQSO = (query.value(0)).toInt(); if (dupeQSO>0) { dupeQsos.append(dupeQSO); } } else { //qDebug() << "DataProxy_SQLite::isThisQSODuplicated - not valid" ; } } return dupeQsos; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return dupeQsos; } } int DataProxy_SQLite::getDuplicatedQSOId(const QString &_qrz, const QDateTime &_datetime, const int _band, const int _mode) { //qDebug() << "DataProxy_SQLite::isThisQSODuplicated"; QSqlQuery query; QString queryString; QString datetime = util->getDateTimeSQLiteStringFromDateTime(_datetime); queryString = QString("SELECT id FROM log WHERE call='%1' AND qso_date='%2' AND bandid='%4' AND modeid='%5'").arg(_qrz).arg(datetime).arg(_band).arg(_mode); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int qsoId = (query.value(0)).toInt(); if (qsoId) { query.finish(); return qsoId; } else { query.finish(); return -1; } } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } //return -1; } bool DataProxy_SQLite::isDXCCConfirmed(const int _dxcc, const int _currentLog) { //qDebug() << "DataProxy_SQLite::isDXCCConfirmed: " << QString::number(_dxcc) << "/" << QString::number(_currentLog); QString queryString = QString("SELECT confirmed from awarddxcc WHERE dxcc='%1' AND lognumber='%2'").arg(_dxcc).arg(_currentLog); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { if ( (query.value(0)).toInt() == 1) { //qDebug() << "DataProxy_SQLite::isDXCCConfrmed: TRUE"; query.finish(); return true; } else { //qDebug() << "DataProxy_SQLite::isDXCCConfrmed: FALSE1"; query.finish(); return false; } } else { //qDebug() << "DataProxy_SQLite::isDXCCConfrmed: FALSE2"; query.finish(); return false; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::isDXCCConfrmed: FALSE3"; query.finish(); return false; } } bool DataProxy_SQLite::isHF(const int _band) {// 160M is considered as HF if ( (_band>=getIdFromBandName("10M")) && (_band<=getIdFromBandName("160M")) ) { //qDebug() << "DataProxy_SQLite::isHF: TRUE"; return true; } else { //qDebug() << "DataProxy_SQLite::isHF: FALSE"; return false; } } bool DataProxy_SQLite::isWARC(const int _band) { if ( (_band==getIdFromBandName("12M")) || (_band==getIdFromBandName("17M")) || ((_band==getIdFromBandName("30M")) ) ) { //qDebug() << "DataProxy_SQLite::isWARC: tRUE"; return true; } else { //qDebug() << "DataProxy_SQLite::isWARC: FALSE"; return false; } } bool DataProxy_SQLite::isVHF(const int _band) { if (_band<=getIdFromBandName("6M")) { //qDebug() << "DataProxy_SQLite::isVHF: TRUE"; return true; } else { //qDebug() << "DataProxy_SQLite::isVHF: FALSE"; return false; } } bool DataProxy_SQLite::isUHF(const int _band) { if (_band<=getIdFromBandName("70CM")) { //qDebug() << "DataProxy_SQLite::isUHF: TRUE"; return true; } else { //qDebug() << "DataProxy_SQLite::isUHF: FALSE"; return false; } } QStringList DataProxy_SQLite::getOperatingYears(const int _currentLog) { //qDebug() << "DataProxy_SQLite::getYearsOperating: " << QString::number(_currentLog); QStringList years = QStringList(); //QStringList yearsSorted = QStringList(); QSqlQuery query; QString queryString; if (_currentLog<0) { queryString = QString("SELECT DISTINCT (substr (qso_date, 0, 5)) FROM log ORDER BY 'qso_date'"); } else { queryString = QString("SELECT DISTINCT (substr (qso_date, 0, 5)) FROM log WHERE lognumber='%0' ORDER BY 'qso_date'").arg(_currentLog); } //QString year = QString(); //qDebug() << "DataProxy_SQLite::getYearsOperating: -1"; bool sqlOk = query.exec(queryString); if (!sqlOk) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); return years; } //qDebug() << "DataProxy_SQLite::getYearsOperating: sqlOk = true"; while (query.next()) { if (query.isValid()) { //QString year = (query.value(0)).toString(); //qDebug() << "DataProxy_SQLite::getYearsOperating: year=" << year; years << (query.value(0)).toString(); //year.clear(); } } //qDebug() << "DataProxy_SQLite::getYearsOperating: END OK - " << QString::number(years.size())<< QT_ENDL; query.finish(); if (years.length()>0) { years.sort(); } return years; } void DataProxy_SQLite::compressDB() { db->compress(); } bool DataProxy_SQLite::unMarkAllQSO() { return db->unMarkAllQSO(); } bool DataProxy_SQLite::lotwSentQueue(const QDate &_updateDate, const int _currentLog) {// Mark LOTW QSL SENT as Q (Queued) // If currentLog <0 ALL the QSO of the log will be queued //qDebug() << "DataProxy_SQLite::lotwSentQueue: Date:" << _updateDate << " /" << QString::number(_currentLog); QString queryString; if (_currentLog<1) { queryString = QString("UPDATE log SET lotw_qsl_sent = 'Q', lotw_qslsdate = '%1' WHERE lotw_qsl_sent != 'Y' AND lotw_qsl_sent != 'N' AND lotw_qsl_sent != 'R' AND lotw_qsl_sent != 'I' AND lotw_qsl_sent != 'Q' OR lotw_qsl_sent IS NULL").arg(util->getDateSQLiteStringFromDate(_updateDate)); } else { queryString = QString("UPDATE log SET lotw_qsl_sent = 'Q', lotw_qslsdate = '%1' WHERE lognumber = '%2' AND lotw_qsl_sent != 'Y' AND lotw_qsl_sent != 'N' AND lotw_qsl_sent != 'R' AND lotw_qsl_sent != 'I' AND lotw_qsl_sent != 'Q' OR lotw_qsl_sent IS NULL").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_currentLog); } QSqlQuery query; bool sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } return false; } bool DataProxy_SQLite::lotwSentYes(const QDate &_updateDate, const int _currentLog, const QString &_station) {// Mark LOTW QSL SENT as Q (Queued) // If currentLog <0 ALL the QSO of the log will be queued //qDebug() << "DataProxy_SQLite::lotwSentQueue: " << QString::number(_currentLog); QString queryString; if (_currentLog<1) { if (_station == "ALL") { queryString = QString("UPDATE log SET lotw_qsl_sent = 'Y', lotw_qslsdate = '%1' WHERE lotw_qsl_sent == 'Q'"); } else { queryString = QString("UPDATE log SET lotw_qsl_sent = 'Y', lotw_qslsdate = '%1' WHERE lotw_qsl_sent == 'Q' AND station_callsign='%2'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_station); } } else { if (_station == "ALL") { queryString = QString("UPDATE log SET lotw_qsl_sent = 'Y', lotw_qslsdate = '%1' WHERE lognumber = '%2' AND lotw_qsl_sent == 'Q'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_currentLog); } else { queryString = QString("UPDATE log SET lotw_qsl_sent = 'Y', lotw_qslsdate = '%1' WHERE lognumber = '%2' AND lotw_qsl_sent == 'Q' AND station_callsign='%3'").arg(util->getDateSQLiteStringFromDate(_updateDate)).arg(_currentLog).arg(_station); } } QSqlQuery query; bool sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } return false; } bool DataProxy_SQLite::lotwSentQSOs(const QList &_qsos) { //qDebug() << " DataProxy_SQLite::lotwSentQSOs" << QString::number(_qsos.count()); if (_qsos.count() < 1) { return true; } QString queryString; bool sqlOK; QSqlQuery query; for (int i = 0; i< _qsos.count(); i++) { //qDebug() << " DataProxy_SQLite::lotwSentQSOs: updating QSO: " << QString::number(_qsos.at(i)); //queryString = QString("UPDATE log SET lotw_qsl_sent = 'Y', lotw_qslsdate = '%1' WHERE id='%2'").arg((QDate::currentDate()).toString("yyyy-MM-dd")).arg(QString::number(_qsos.at(i))); queryString = QString("UPDATE log SET lotw_qsl_sent = 'Y', lotw_qslsdate = '%1' WHERE id='%2'").arg(util->getDateSQLiteStringFromDate(QDate::currentDate())).arg(QString::number(_qsos.at(i))); sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { //qDebug() << " DataProxy_SQLite::lotwSentQSOs: exec: " << query.lastQuery(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << " DataProxy_SQLite::lotwSentQSOs: END FALSE" ; return false; } } //qDebug() << " DataProxy_SQLite::lotwSentQSOs: END TRUE" ; return true; } int DataProxy_SQLite::lotwUpdateQSLReception (const QString &_call, const QDateTime &_dateTime, const QString &_band, const QString &_mode, const QDate &_qslrdate) { //Returns the QSO id updated or -1 if none was updated. //qDebug() << " DataProxy_SQLite::lotwUpdateQSLReception: " << _call << "/" << util->getDateTimeSQLiteStringFromDateTime(_dateTime) << "/" <<_band <<"/"<<_mode << "/" << util->getADIFDateFromQDate(_qslrdate) << endl ; int bandid = getIdFromBandName(_band); int modeid = getIdFromModeName(_mode); QString qso_date; qso_date = util->getDateTimeSQLiteStringFromDateTime(_dateTime); QString queryString; //queryString = QString("SELECT id, lotw_qsl_rcvd FROM log WHERE call='%1' AND qso_date='%2' AND bandid='%4' AND modeid='%5'").arg(_call).arg(qso_date).arg(bandid).arg(modeid); queryString = QString("SELECT id, lotw_qsl_rcvd FROM log WHERE call='%1' AND qso_date='%2' AND bandid='%4' AND modeid='%5'").arg(_call).arg(qso_date).arg(bandid).arg(modeid); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int id = (query.value(0)).toInt(); QString _lotwQSLReceived = (query.value(1).toString()); if (( id > 0) && (_lotwQSLReceived!="Y")) { query.finish(); //QString qslsdate = (QDate::fromString(_qslsdate, "yyyyMMdd")).toString("yyyy-MM-dd"); //QString qslrdate = (QDate::fromString(_qslrdate, "yyyyMMdd")).toString("yyyy-MM-dd"); queryString = QString("UPDATE log SET lotw_qsl_rcvd = 'Y', lotw_qslrdate = '%1' WHERE id='%2'").arg(util->getDateSQLiteStringFromDate(_qslrdate)).arg(QString::number(id)); sqlOK = query.exec(queryString); query.finish(); if (sqlOK) { //qDebug() << "DataProxy_SQLite::lotwUpdateQSLReception: Modified Id: " << QString::number(id); return id; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::lotwUpdateQSLReception: SQL ERROR"; return -4; } } else { //qDebug() << "DataProxy_SQLite::lotwUpdateQSLReception ID Not found"; query.finish(); return -5; } } else if (query.lastError().nativeErrorCode() == -1) { //qDebug() << "DataProxy_SQLite::lotwUpdateQSLReception QSO not found " << query.lastQuery(); return -1; } else { //qDebug() << "DataProxy_SQLite::lotwUpdateQSLReception Unknown error " << query.lastQuery(); //qDebug() << "DataProxy_SQLite::lotwUpdateQSLReception Error: " << query.lastError().databaseText(); //qDebug() << "DataProxy_SQLite::lotwUpdateQSLReception Error: " << QString::number(query.lastError().nativeErrorCode()); query.finish(); return -3; } } else { //qDebug() << "DataProxy_SQLite::lotwUpdateQSLReception Query error: " << query.lastQuery(); emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } query.finish(); return -100; } QList DataProxy_SQLite::getQSOsListLoTWToSend(const QString &_stationCallsign, const QString &_myGrid, const QDate &_startDate, const QDate &_endDate, bool _justQueued, int _logN) { //qDebug() << "DataProxy_SQLite::getQSOsListLoTWToSend Call/Start/end: " << _stationCallsign << _myGrid << _startDate.toString("yyyyMMdd") << "/" << _endDate.toString("yyyyMMdd"); QList qsoList; qsoList.clear(); QDate tmpDate; QString aux = QString(); QStringList qs; qs.clear(); QString queryString; QString _queryST_string; if (util->isValidCall(_stationCallsign, true)) { _queryST_string = QString("station_callsign='%1'").arg(_stationCallsign); } else if (_stationCallsign == "ALL") { _queryST_string = QString("((station_callsign!='ALL') OR (station_callsign IS NULL) OR (station_callsign=''))"); } else { _queryST_string = QString("((station_callsign='') OR (station_callsign IS NULL))"); } QString _queryGrid_string; if (util->isValidGrid (_myGrid)) { _queryGrid_string = QString("my_gridsquare='%1'").arg(_myGrid); } else if (_myGrid == "ALL") { _queryGrid_string = QString("(my_gridsquare!='ALL' OR my_gridsquare IS NULL OR my_gridsquare='')"); } else { _queryGrid_string = QString("(my_gridsquare='' OR my_gridsquare IS NULL)"); } QString _query_justQueued; if (_justQueued) { //qDebug() << "DataProxy_SQLite::getQSOsListLoTWToSend justQueued TRUE"; _query_justQueued = QString("lotw_qsl_sent='Q'"); } else { //qDebug() << "DataProxy_SQLite::getQSOsListLoTWToSend justQueued FALSE"; _query_justQueued = QString("lotw_qsl_sent!='1'"); } QString _query_logNumber; if (doesThisLogExist (_logN)) { _query_logNumber = QString(" AND lognumber='%1'").arg(_logN); } else { _query_logNumber.clear (); } QString _queryDateFrom = QString(" date(qso_date)>=date('%1')").arg(_startDate.toString ("yyyy-MM-dd")); QString _queryDateTo = QString(" date(qso_date)<=date('%1')").arg(_endDate.toString ("yyyy-MM-dd")); queryString = QString("SELECT id, qso_date FROM log WHERE %1 AND %2 AND %3 %4 AND %5 AND %6").arg(_queryST_string).arg(_queryGrid_string).arg(_query_justQueued).arg(_query_logNumber).arg(_queryDateFrom).arg(_queryDateTo); QSqlQuery query; bool sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getQSOsListLoTWToSend Query: " << query.lastQuery() ; if (sqlOK) { // //qDebug() << "DataProxy_SQLite::getQSOsListLoTWToSend Query: " << query.lastQuery(); while ( (query.next())) { if (query.isValid()) { aux.clear(); aux = (query.value(1)).toString() ; tmpDate = util->getDateFromSQliteString(aux); //qDebug() << "DataProxy_SQLite::getQSOsListLoTWToSend QSO Date: " << aux << "/" << tmpDate.toString("yyyy-MM-dd"); //tmpDate = QDate::fromString(aux, "yyyy-MM-dd"); if ((_startDate<=tmpDate) && _endDate>=tmpDate) { qsoList.append((query.value(0)).toInt()); } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); qsoList.clear(); return qsoList; } query.finish(); qs.sort(); return qsoList; } QStringList DataProxy_SQLite::getGridsToBeSent(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, const ExportMode _em, bool _justModified, int _logN) { //qDebug() << Q_FUNC_INFO << " - Start"; QStringList grids; grids.clear (); QString aux = QString(); QStringList qs; qs.clear(); QString queryString; QString _queryST_string; if (util->isValidCall(_stationCallsign, true)) { //qDebug() << Q_FUNC_INFO << " - Valid Call: " << _stationCallsign; _queryST_string = QString("station_callsign='%1'").arg(_stationCallsign); } else if (_stationCallsign == "ALL") { //qDebug() << Q_FUNC_INFO << " - ALL Calls"; _queryST_string = QString("((station_callsign!='ALL') OR (station_callsign IS NULL) OR (station_callsign=''))"); } else { //qDebug() << Q_FUNC_INFO << " - Else calls"; _queryST_string = QString("((station_callsign='') OR (station_callsign IS NULL))"); } QString _query_justQueued; if ((_justModified) && (_em == ModeLotW)) { _query_justQueued = QString("lotw_qsl_sent='Q'"); } else { _query_justQueued = QString("((lotw_qsl_sent!='1') OR (lotw_qsl_sent IS NULL))"); } QString _query_logNumber; if (doesThisLogExist (_logN)) { _query_logNumber = QString(" AND lognumber='%1'").arg(_logN); } else { _query_logNumber.clear (); } queryString = QString("SELECT DISTINCT my_gridsquare FROM log WHERE %1 AND ((my_gridsquare<>'') OR (my_gridsquare IS NOT NULL)) AND qso_date>='%2' AND qso_date<='%3' AND %4").arg(_queryST_string).arg(util->getDateSQLiteStringFromDate(_startDate)).arg(util->getDateSQLiteStringFromDate(_endDate.addDays (1))).arg(_query_justQueued); QSqlQuery query; bool sqlOK = query.exec(queryString); //qDebug() << Q_FUNC_INFO << ": " << query.lastQuery (); if (sqlOK) { while ( (query.next())) { if (query.isValid()) { aux.clear(); aux = (query.value(0)).toString(); if (aux.length()>1) { grids.append ((query.value(0)).toString()); } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); grids.sort (); //qDebug() << Q_FUNC_INFO << " - END-1"; return grids; } query.finish(); grids.sort(); //qDebug() << Q_FUNC_INFO << " - END"; return grids; } QList DataProxy_SQLite::getQSOsListClubLogToSent(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, bool _justModified, int _logN) { //qDebug() << "DataProxy_SQLite::getQSOsListClubLogToSent Call/Start/end: " << _stationCallsign << _startDate.toString("yyyyMMdd") << "/" << _endDate.toString("yyyyMMdd"); QList qsoList; qsoList.clear(); QDate tmpDate; QString aux = QString(); QStringList qs; qs.clear(); QString queryString; QString _queryST_string; if (util->isValidCall(_stationCallsign, true)) { _queryST_string = QString("station_callsign='%1'").arg(_stationCallsign); } else if (_stationCallsign == "ALL") { _queryST_string = QString("((station_callsign!='ALL') OR (station_callsign IS NULL) OR (station_callsign=''))"); } else { _queryST_string = QString("(station_callsign='' OR station_callsign IS NULL)"); } QString _query_justModified; if (_justModified) { //qDebug() << "DataProxy_SQLite::getQSOsListClubLogToSent justQueued TRUE"; _query_justModified = QString("clublog_qso_upload_status='M'"); } else { //qDebug() << "DataProxy_SQLite::getQSOsListClubLogToSent justQueued FALSE"; _query_justModified = QString("clublog_qso_upload_status!='M'"); } //qDebug() << "DataProxy_SQLite::getQSOsListClubLogToSent logN: " << QString::number(_logN); QString _query_logNumber; if (doesThisLogExist (_logN)) { //qDebug() << "DataProxy_SQLite::getQSOsListClubLogToSent log DOES exist"; _query_logNumber = QString(" AND lognumber='%1'").arg(_logN); } else { //qDebug() << "DataProxy_SQLite::getQSOsListClubLogToSent log DOES NOT exist"; _query_logNumber.clear (); } QString _queryDateFrom = QString(" date(qso_date)>=date('%1')").arg(_startDate.toString ("yyyy-MM-dd")); QString _queryDateTo = QString(" date(qso_date)<=date('%1')").arg(_endDate.toString ("yyyy-MM-dd")); queryString = QString("SELECT id, qso_date FROM log WHERE %1 AND %2 %3 AND %4 AND %5").arg(_queryST_string).arg(_query_justModified).arg(_query_logNumber).arg(_queryDateFrom).arg(_queryDateTo); QSqlQuery query; bool sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getQSOsListClubLogToSent Query: " << query.lastQuery(); if (sqlOK) { // //qDebug() << "DataProxy_SQLite::getQSOsListClubLogToSent Query: " << query.lastQuery(); while ( (query.next())) { if (query.isValid()) { aux.clear(); aux = (query.value(1)).toString() ; tmpDate = util->getDateFromSQliteString(aux); //qDebug() << "DataProxy_SQLite::getQSOsListClubLogToSent QSO Date: " << aux << "/" << tmpDate.toString("yyyy-MM-dd"); //tmpDate = QDate::fromString(aux, "yyyy-MM-dd"); if ((_startDate<=tmpDate) && _endDate>=tmpDate) { //qDebug() << "DataProxy_SQLite::getQSOsListClubLogToSent Adding: " << QString::number((query.value(0)).toInt()); qsoList.append((query.value(0)).toInt()); } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); qsoList.clear(); return qsoList; } query.finish(); qs.sort(); //qDebug() << "DataProxy_SQLite::getQSOsListClubLogToSent Returning: #" << QString::number(qsoList.length()); return qsoList; } QList DataProxy_SQLite::getQSOsListEQSLToSent(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, bool _justModified, int _logN) { //qDebug() << "DataProxy_SQLite::getQSOsListEQSLToSent Call/Start/end: " << _stationCallsign << _startDate.toString("yyyyMMdd") << "/" << _endDate.toString("yyyyMMdd"); QList qsoList; qsoList.clear(); QDate tmpDate; QString aux = QString(); QStringList qs; qs.clear(); QString queryString; QString _queryST_string; if (util->isValidCall(_stationCallsign, true)) { _queryST_string = QString("station_callsign='%1'").arg(_stationCallsign); } else if (_stationCallsign == "ALL") { _queryST_string = QString("((station_callsign!='ALL') OR (station_callsign IS NULL) OR (station_callsign=''))"); } else { _queryST_string = QString("(station_callsign='' OR station_callsign IS NULL)"); } QString _query_justModified; if (_justModified) { //qDebug() << "DataProxy_SQLite::getQSOsListEQSLToSent justQueued TRUE"; _query_justModified = QString("eqsl_qsl_sent='Q'"); } else { //qDebug() << "DataProxy_SQLite::getQSOsListEQSLToSent justQueued FALSE"; _query_justModified = QString("eqsl_qsl_sent!='M'"); } QString _query_logNumber; if (doesThisLogExist (_logN)) { _query_logNumber = QString(" AND lognumber='%1'").arg(_logN); } else { _query_logNumber.clear (); } QString _queryDateFrom = QString(" date(qso_date)>=date('%1')").arg(_startDate.toString ("yyyy-MM-dd")); QString _queryDateTo = QString(" date(qso_date)<=date('%1')").arg(_endDate.toString ("yyyy-MM-dd")); queryString = QString("SELECT id, qso_date FROM log WHERE %1 AND %2 %3 AND %4 AND %5").arg(_queryST_string).arg(_query_justModified).arg(_query_logNumber).arg(_queryDateFrom).arg(_queryDateTo); QSqlQuery query; bool sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getQSOsListEQSLToSent Query: " << query.lastQuery(); if (sqlOK) { // //qDebug() << "DataProxy_SQLite::getQSOsListEQSLToSent Query: " << query.lastQuery(); while ( (query.next())) { if (query.isValid()) { aux.clear(); aux = (query.value(1)).toString() ; tmpDate = util->getDateFromSQliteString(aux); //qDebug() << "DataProxy_SQLite::getQSOsListEQSLToSent QSO Date: " << aux << "/" << tmpDate.toString("yyyy-MM-dd"); //tmpDate = QDate::fromString(aux, "yyyy-MM-dd"); if ((_startDate<=tmpDate) && _endDate>=tmpDate) { qsoList.append((query.value(0)).toInt()); } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); qsoList.clear(); return qsoList; } query.finish(); qs.sort(); return qsoList; } QList DataProxy_SQLite::getQSOsListQRZCOMToSent(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, bool _justModified, int _logN) { //qDebug() << "DataProxy_SQLite::QList getQSOsListQRZCOMToSent(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, bool _justModified=true); Call/Start/end: " << _stationCallsign << _startDate.toString("yyyyMMdd") << "/" << _endDate.toString("yyyyMMdd"); QList qsoList; qsoList.clear(); QDate tmpDate; QString aux = QString(); QStringList qs; qs.clear(); QString queryString; QString _queryST_string; if (util->isValidCall(_stationCallsign, true)) { _queryST_string = QString("station_callsign='%1'").arg(_stationCallsign); } else if (_stationCallsign == "ALL") { _queryST_string = QString("((station_callsign!='ALL') OR (station_callsign IS NULL) OR (station_callsign=''))"); } else { _queryST_string = QString("(station_callsign='' OR station_callsign IS NULL)"); } QString _query_justModified; if (_justModified) { //qDebug() << "DataProxy_SQLite::getQSOsListQRZCOMToSent justQueued TRUE"; _query_justModified = QString("qrzcom_qso_upload_status='M'"); } else { //qDebug() << "DataProxy_SQLite::getQSOsListQRZCOMToSent justQueued FALSE"; _query_justModified = QString("qrzcom_qso_upload_status!='-'"); } QString _query_logNumber; if (doesThisLogExist (_logN)) { _query_logNumber = QString(" AND lognumber='%1'").arg(_logN); } else { _query_logNumber.clear (); } QString _queryDateFrom = QString(" date(qso_date)>=date('%1')").arg(_startDate.toString ("yyyy-MM-dd")); QString _queryDateTo = QString(" date(qso_date)<=date('%1')").arg(_endDate.toString ("yyyy-MM-dd")); queryString = QString("SELECT id, qso_date FROM log WHERE %1 AND %2 %3 AND %4 AND %5").arg(_queryST_string).arg(_query_justModified).arg(_query_logNumber).arg(_queryDateFrom).arg(_queryDateTo); QSqlQuery query; bool sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getQSOsListQRZCOMToSent Query: " << query.lastQuery(); if (sqlOK) { // //qDebug() << "DataProxy_SQLite::getQSOsListQRZCOMToSent Query: " << query.lastQuery(); while ( (query.next())) { if (query.isValid()) { aux.clear(); aux = (query.value(1)).toString() ; tmpDate = util->getDateFromSQliteString(aux); //qDebug() << "DataProxy_SQLite::getQSOsListQRZCOMToSent QSO Date: " << aux << "/" << tmpDate.toString("yyyy-MM-dd"); //tmpDate = QDate::fromString(aux, "yyyy-MM-dd"); if ((_startDate<=tmpDate) && _endDate>=tmpDate) { qsoList.append((query.value(0)).toInt()); } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); qsoList.clear(); return qsoList; } query.finish(); qs.sort(); return qsoList; } QList DataProxy_SQLite::getQSOsListToBeExported(const QString &_stationCallsign, const QString &_grid, const QDate &_startDate, const QDate &_endDate, int _logN) { //qDebug() << Q_FUNC_INFO << QString("Call: %1, Grid: %2, StartDate: %3, EndDate: %4").arg(_stationCallsign).arg(_grid).arg(_startDate.toString("yyyyMMdd")).arg(_endDate.toString("yyyyMMdd")); QList qsoList; qsoList.clear(); QDate tmpDate; QString aux = QString(); QStringList qs; qs.clear(); QString queryString; QString _queryST_string; if (util->isValidCall(_stationCallsign, true)) { //qDebug() << Q_FUNC_INFO << ": Valid call"; _queryST_string = QString("station_callsign='%1'").arg(_stationCallsign); } else if (_stationCallsign == "ALL") { //qDebug() << Q_FUNC_INFO << ": ALL"; _queryST_string = QString("((station_callsign!='ALL') OR (station_callsign IS NULL) OR (station_callsign=''))"); } else { //qDebug() << Q_FUNC_INFO << ": Non defined or empty"; _queryST_string = QString("(station_callsign='' OR station_callsign IS NULL)"); } QString _queryGrid_String; if (util->isValidGrid (_grid)) { _queryGrid_String = QString("AND my_gridsquare='%1'").arg(_grid); } else if (_grid == "ALL") { //_queryGrid_String = QString(); _queryGrid_String = QString("AND ((my_gridsquare!='ALL') OR (my_gridsquare IS NULL) OR (my_gridsquare=''))"); } else { // NO GRID _queryGrid_String = QString("AND (my_gridsquare='' OR my_gridsquare IS NULL)"); } QString _query_logNumber; if (doesThisLogExist (_logN)) { _query_logNumber = QString(" AND lognumber='%1'").arg(_logN); } else { _query_logNumber.clear (); } QString _queryDateFrom = QString(" date(qso_date)>=date('%1')").arg(_startDate.toString ("yyyy-MM-dd")); QString _queryDateTo = QString(" date(qso_date)<=date('%1')").arg(_endDate.toString ("yyyy-MM-dd")); queryString = QString("SELECT id, qso_date FROM log WHERE %1 %2 %3 AND %4 AND %5 ").arg(_queryST_string).arg(_queryGrid_String).arg(_query_logNumber).arg(_queryDateFrom).arg(_queryDateTo);; QSqlQuery query; bool sqlOK = query.exec(queryString); //qDebug() << Q_FUNC_INFO << ": Query: " << query.lastQuery(); if (sqlOK) { // //qDebug() << Q_FUNC_INFO << ": Query: " << query.lastQuery(); while ( (query.next())) { if (query.isValid()) { aux.clear(); aux = (query.value(1)).toString() ; tmpDate = util->getDateFromSQliteString(aux); //qDebug() << Q_FUNC_INFO << ": QSO Date: " << aux << "/" << tmpDate.toString("yyyy-MM-dd"); //tmpDate = QDate::fromString(aux, "yyyy-MM-dd"); if ((_startDate<=tmpDate) && _endDate>=tmpDate) { qsoList.append((query.value(0)).toInt()); } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); qsoList.clear(); return qsoList; } query.finish(); qs.sort(); return qsoList; } QList DataProxy_SQLite::getQSOsAll() { QString queryString = QString("SELECT id FROM log") ; QSqlQuery query; QList qsoList; qsoList.clear(); bool sqlOK = query.exec(queryString); //qDebug() << Q_FUNC_INFO << ": Query: " << query.lastQuery(); if (sqlOK) { while ( (query.next())) { if (query.isValid()) { qsoList.append((query.value(0)).toInt()); } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); qsoList.clear(); return qsoList; } query.finish(); return qsoList; } QList DataProxy_SQLite::getQSOsListeQSLNotSent(const QString &_stationCallsign, const QDate &_startDate, const QDate &_endDate, bool _justQueued) { //qDebug() << "DataProxy_SQLite::getQSOsListeQSLNotSent Call/Start/end: " << _stationCallsign << _startDate.toString("yyyyMMdd") << "/" << _endDate.toString("yyyyMMdd"); QList qsoList; qsoList.clear(); QDate tmpDate; QString aux = QString(); QStringList qs; qs.clear(); QString queryString; QString _queryST_string; if (util->isValidCall(_stationCallsign, true)) { _queryST_string = QString("station_callsign='%1'").arg(_stationCallsign); } else if (_stationCallsign == "ALL") { _queryST_string = QString("((station_callsign!='ALL') OR (station_callsign IS NULL) OR (station_callsign=''))"); } else { _queryST_string = QString("((station_callsign='') OR (station_callsign IS NULL))"); } QString _query_justQueued; if (_justQueued) { //qDebug() << "DataProxy_SQLite::getQSOsListeQSLNotSent justQueued TRUE"; _query_justQueued = QString("eqsl_qsl_sent='Q'"); } else { //qDebug() << "DataProxy_SQLite::getQSOsListeQSLNotSent justQueued FALSE"; _query_justQueued = QString("eqsl_qsl_sent!='1'"); } /* Modify accordingly to add log number support QString _query_logNumber; if (doesThisLogExist (_logN)) { _query_logNumber = QString(" AND lognumber='%1'").arg(_logN); } else { _query_logNumber.clear (); } queryString = QString("SELECT id, qso_date FROM log WHERE %1 AND %2 '%3'").arg(_queryST_string).arg(_query_justQueued).arg(_logN); */ queryString = QString("SELECT id, qso_date FROM log WHERE ") + _queryST_string + " AND " + _query_justQueued; QSqlQuery query; bool sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getQSOsListeQSLNotSent Query: " << query.lastQuery(); if (sqlOK) { // //qDebug() << "DataProxy_SQLite::getQSOsListeQSLNotSent Query: " << query.lastQuery(); while ( (query.next())) { if (query.isValid()) { aux.clear(); aux = (query.value(1)).toString() ; tmpDate = util->getDateFromSQliteString(aux); //qDebug() << "DataProxy_SQLite: QSO Date: " << aux << "/" << tmpDate.toString("yyyy-MM-dd"); //tmpDate = QDate::fromString(aux, "yyyy-MM-dd"); if ((_startDate<=tmpDate) && _endDate>=tmpDate) { qsoList.append((query.value(0)).toInt()); } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); qsoList.clear(); return qsoList; } query.finish(); qs.sort(); return qsoList; } QStringList DataProxy_SQLite::getQSODetailsForLoTWDownload(const int _id) { //Returns QRZ << date+time << Band (txt) << mode (txt) //qDebug() << "DataProxy_SQLite::getQSODetailsForLoTWDownload" << QString::number(_id); QStringList result; result.clear(); //getNameFromBandId QSqlQuery query; //QString queryString = QString("SELECT call, qso_date, my_gridsquare, bandid, modeid FROM log WHERE id='%0'").arg(_id); QString queryString = QString("SELECT call, qso_date, my_gridsquare, band.name, mode.name FROM log JOIN band ON log.bandid=band.id JOIN mode on log.modeid=mode.id WHERE log.id='%0'").arg(_id); bool sqlOk = query.exec(queryString); if (sqlOk) { if (query.next()) { if (query.isValid()) { QString call = query.value(0).toString(); QString date = query.value(1).toString(); //QString date = util->getDateTimeFromSQLiteString(query.value(1).toString()); QString myGrid = query.value(2).toString(); QString bandid = query.value(3).toString(); QString modeid = query.value(4).toString(); query.finish(); //qDebug() << "DataProxy_SQLite::getQSODetailsForLoTWDownload - date: " << date; //qDebug() << "DataProxy_SQLite::getQSODetailsForLoTWDownload - time: " << time; //getDateTimeSQLiteStringFromDateTime //QString dateTime = (QDateTime::fromString(date, "yyyy-MM-dd hh:mm:ss")).toString("yyyy-MM-dd hh:mm"); QString dateTime = (util->getDateTimeFromSQLiteString(date)).toString("yyyy-MM-dd hh:mm"); //bandid = getNameFromBandId(bandid.toInt()); //modeid = getNameFromModeId(modeid.toInt()); result.append(call); result.append(dateTime); result.append (myGrid); result.append(bandid); result.append(modeid); //qDebug() << "DataProxy_SQLite::getQSODetailsForLoTWDownload - END: call: " << call; return result; } //qDebug() << "DataProxy_SQLite::getQSODetailsForLoTWDownload - END: no valid " ; } query.finish(); //qDebug() << "DataProxy_SQLite::getQSODetailsForLoTWDownload - END: no next " ; return result; } else { //qDebug() << "DataProxy_SQLite::getQSODetailsForLoTWDownload - END: SQL NOK " ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return result; } } int DataProxy_SQLite::getQSOonYear(const int _year, const int _logNumber) { //qDebug() << "DataProxy_SQLite::getQSOonYear: " << QString::number(_year) << "/" << QString::number(_logNumber); QSqlQuery query; QString queryString; bool sqlOK; if (_logNumber < 0) { queryString = QString("SELECT COUNT (DISTINCT id) FROM log WHERE qso_date LIKE '%1%'").arg(_year); } else { queryString = QString("SELECT COUNT (DISTINCT id) FROM log where lognumber='%1' AND qso_date LIKE '%2%'").arg(_logNumber).arg(_year); } sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getQSOonYear: queryString: " << queryString; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getQSOonYear: " << QString::number((query.value(0)).toInt()); int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getQSOonYear: 0"; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getDXCConYear: Query error"; query.finish(); return 0; } } int DataProxy_SQLite::getDXCConYear(const int _year, const int _logNumber) { //qDebug() << "DataProxy_SQLite::getDXCConYear: " << QString::number(_year) << "/" << QString::number(_logNumber); QSqlQuery query; QString queryString; bool sqlOK; if (_logNumber < 0) { queryString = QString("SELECT COUNT (DISTINCT dxcc) FROM log WHERE dxcc>'0' AND qso_date LIKE '%1%'").arg(_year); } else { queryString = QString("SELECT COUNT (DISTINCT dxcc) FROM log WHERE dxcc>'0' AND lognumber='%1' AND qso_date LIKE '%2%'").arg(_logNumber).arg(_year); } sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getDXCConYear: queryString: " << queryString; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getDXCConYear: " << QString::number((query.value(0)).toInt()); int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getDXCConYear: 0"; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getDXCConYear: Query error"; query.finish(); return 0; } } int DataProxy_SQLite::getCQzonYear(const int _year, const int _logNumber) { //qDebug() << "DataProxy_SQLite::getCQzonYear: " << QString::number(_year); QSqlQuery query; QString queryString; bool sqlOK; if (_logNumber < 0) { queryString = QString("SELECT COUNT (DISTINCT cqz) FROM log where qso_date LIKE '%1%' AND cqz>'0' AND cqz < '41'").arg(_year); } else { queryString = QString("SELECT COUNT (DISTINCT cqz) FROM log where lognumber='%1' AND cqz>'0' AND cqz<'41' AND qso_date LIKE '%2%'").arg(_logNumber).arg(_year); } sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getCQzonYear: queryString: " << queryString; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getCQzonYear: " << QString::number((query.value(0)).toInt()); int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getCQzonYear: 0"; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getCQzonYear: Query error"; query.finish(); return 0; } } int DataProxy_SQLite::getQSOsWithDXCC(const int _dxcc, const int _logNumber) { //qDebug() << "DataProxy_SQLite::getQSOsWithDXCC: " << QString::number(_dxcc); QSqlQuery query; QString queryString; bool sqlOK; if (_logNumber < 0) { //queryString = QString("SELECT COUNT (DISTINCT id) FROM log where dxcc LIKE '%1'").arg(_dxcc); queryString = QString("SELECT COUNT (DISTINCT id) FROM log where dxcc = '%1'").arg(_dxcc); } else { //queryString = QString("SELECT COUNT (DISTINCT id) FROM log where lognumber='%1' AND dxcc LIKE '%2'").arg(_logNumber).arg(_dxcc); queryString = QString("SELECT COUNT (DISTINCT id) FROM log where lognumber='%1' AND dxcc = '%2'").arg(_logNumber).arg(_dxcc); } sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getQSOsWithDXCC: queryString: " << queryString; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getQSOsWithDXCC: " << QString::number((query.value(0)).toInt()); int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getQSOsWithDXCC: 0"; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getQSOsWithDXCC: Query error"; query.finish(); return 0; } } int DataProxy_SQLite::getQSOsAtHour(const int _hour, const int _log) { //qDebug() << "DataProxy_SQLite::getQSOsAtHour: " << QString::number(_hour); QSqlQuery query; QString queryString; bool sqlOK; QString aux = QString(); if (_hour < 10) { aux = "0" + QString::number(_hour); } else { aux = QString::number(_hour); } if (_log < 0) { queryString = QString("SELECT COUNT(DISTINCT id) FROM log WHERE qso_date LIKE '% %1:%'").arg(aux); } else { queryString = QString("SELECT COUNT(DISTINCT id) FROM log WHERE lognumber='%1' AND qso_date LIKE '% %2:%'").arg(_log).arg(aux); } sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getQSOsAtHour: queryString: " << queryString; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getQSOsAtHour: " << QString::number((query.value(0)).toInt()); int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getQSOsAtHour: 0"; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getQSOsAtHour: Query error"; query.finish(); return 0; } } int DataProxy_SQLite::getQSOsAtHourOnBand(const int _hour, const int _band, const int _log) { //qDebug() << "DataProxy_SQLite::getQSOsAtHourOnBand: " << QString::number(_hour); QSqlQuery query; QString queryString; bool sqlOK; QString aux = QString(); if (_hour < 10) { aux = "0" + QString::number(_hour); } else { aux = QString::number(_hour); } if (_log < 0) { queryString = QString("SELECT COUNT(DISTINCT id) FROM log WHERE bandid='%1' AND qso_date LIKE '% %2:%'").arg(_band).arg(aux); } else { queryString = QString("SELECT COUNT(DISTINCT id) FROM log WHERE lognumber='%1' AND bandid='%2' AND qso_date LIKE '% %3:%' ").arg(_log).arg(_band).arg(aux); } sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getQSOsAtHourOnBand: queryString: " << queryString; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getQSOsAtHourOnBand: " << QString::number((query.value(0)).toInt()); int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getQSOsAtHourOnBand: 0"; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getQSOsAtHourOnBandç: Query error"; query.finish(); return 0; } } int DataProxy_SQLite::getQSOsOnMonth(const int _month, const int _log) { //qDebug() << "DataProxy_SQLite::getgetQSOsOnMonth: " << QString::number(_month); QSqlQuery query; QString queryString; bool sqlOK; QString aux = QString(); if (_month < 10) { aux = "0" + QString::number(_month); } else { aux = QString::number(_month); } if (_log < 0) { queryString = QString("SELECT COUNT(DISTINCT id) FROM log WHERE qso_date LIKE '%-%1-%'").arg(aux); } else { queryString = QString("SELECT COUNT(DISTINCT id) FROM log WHERE lognumber='%1' AND qso_date LIKE '%-%2-%'").arg(_log).arg(aux); } sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getQSOsAtHour: queryString: " << queryString; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getQSOsAtHour: " << QString::number((query.value(0)).toInt()); int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getQSOsAtHour: 0"; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getQSOsAtHour: Query error"; query.finish(); return 0; } } bool DataProxy_SQLite::updateQSONumberPerLog() { //qDebug() << Q_FUNC_INFO; QSqlQuery query; QString queryString; bool sqlOK; QList _logsInLogs; _logsInLogs.clear(); queryString = QString("SELECT id FROM logs"); sqlOK = query.exec(queryString); if (sqlOK) { while(query.next()) { if (query.isValid()) { if ( (query.value(0)).toInt() >= 1) { _logsInLogs.append((query.value(0)).toInt()); } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << Q_FUNC_INFO << " - TRUE2"; query.finish(); return false; } query.finish(); foreach(int i, _logsInLogs) { int _qsos = getHowManyQSOInLog(i); if (_qsos>0) { queryString = QString("UPDATE logs set logtypen = '%1' WHERE id = '%2'").arg(_qsos).arg(i); sqlOK = query.exec(queryString); if (!sqlOK) { query.finish(); return false; } query.finish(); } } return true; } bool DataProxy_SQLite::newDXMarathon(const int _dxcc, const int _cq, const int _year, const int _logNumber) { //qDebug() << "DataProxy_SQLite::newDXMarathon"; QSqlQuery query; QString queryString; bool sqlOK; bool existingDXCC = false; bool existingCQz = false; queryString = QString("SELECT dxcc, cqz FROM log WHERE (lognumber='%1' AND qso_date LIKE'%%2%') AND (dxcc ='%3' OR cqz ='%4')").arg(_logNumber).arg(_year).arg(_dxcc).arg(_cq); sqlOK = query.exec(queryString); if (sqlOK) { while(query.next()) { if (query.isValid()) { if ( (query.value(0)).toInt() == _dxcc) { //qDebug() << "DataProxy_SQLite::newDXMarathon - Existing DXCC"; existingDXCC = true; } if ( (query.value(1)).toInt() == _cq) { //qDebug() << "DataProxy_SQLite::newDXMarathon - Existing CQz"; existingCQz = true; } } } if (existingDXCC && existingCQz) { //qDebug() << "DataProxy_SQLite::newDXMarathon - FALSE"; query.finish(); return false; } else { //qDebug() << "DataProxy_SQLite::newDXMarathon - TRUE1"; query.finish(); return true; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::newDXMarathon - TRUE2"; query.finish(); return true; // It is an error inthe query but Work First Worry Later, let us work that QSO. } } QStringList DataProxy_SQLite::getContestNames() { //qDebug() << "DataProxy_SQLite::getContestNames() " ; QStringList contests = QStringList(); QSqlQuery query; QString queryString; bool sqlOK; queryString = QString("SELECT DISTINCT name from supportedcontests ORDER BY id ASC"); sqlOK = query.exec(queryString); if (sqlOK) { while(query.next()) { if (query.isValid()) { queryString = (query.value(0)).toString(); //qDebug() << "DataProxy_SQLite::getContestNames: " << queryString ; contests.append(queryString); } else { query.finish(); return QStringList(); } } query.finish(); contests.sort(); return contests; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QStringList(); } //return QStringList(); } QStringList DataProxy_SQLite::getContestCat(const int _catn) { QStringList contests = QStringList(); QSqlQuery query; QString queryString; bool sqlOK; switch (_catn) { case 1: queryString = QString("SELECT DISTINCT name from contestcatoperator ORDER BY id ASC"); break; case 2: queryString = QString("SELECT DISTINCT name from contestcatassisted ORDER BY id ASC"); break; case 3: queryString = QString("SELECT DISTINCT name from contestcatpower ORDER BY id ASC"); break; case 4: queryString = QString("SELECT DISTINCT name from contestcatband ORDER BY id ASC"); break; case 5: queryString = QString("SELECT DISTINCT name from contestcatoverlay ORDER BY id ASC"); break; case 6: queryString = QString("SELECT DISTINCT name from contestcatmode ORDER BY id ASC"); break; default: return QStringList(); //break; } sqlOK = query.exec(queryString); if (sqlOK) { while(query.next()) { if (query.isValid()) { queryString = (query.value(0)).toString(); contests.append(queryString); } else { query.finish(); return QStringList(); } } query.finish(); return contests; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QStringList(); } } QStringList DataProxy_SQLite::getContestOverlays() { //qDebug() << "DataProxy_SQLite::getContestOverlays: "<< QT_ENDL; QStringList contests = QStringList(); QSqlQuery query; QString queryString; bool sqlOK; queryString = QString("SELECT DISTINCT name from contestcatoverlay ORDER BY id ASC"); sqlOK = query.exec(queryString); if (sqlOK) { while(query.next()) { if (query.isValid()) { queryString = (query.value(0)).toString(); //qDebug() << "DataProxy_SQLite::getContestOverlays: " << queryString ; contests.append(queryString); } else { query.finish(); return QStringList(); } } query.finish(); return contests; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QStringList(); } } bool DataProxy_SQLite::isValidPropMode(const QString &_prop) { QSqlQuery query; QString queryString = QString("SELECT shortname FROM prop_mode_enumeration WHERE shortname='%1'").arg(_prop); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { query.finish(); return true; } } return false; } QStringList DataProxy_SQLite::getPropModeList() { //qDebug() << "DataProxy_SQLite::getPropModeLists" ; QString aux = QString(); QStringList qs; qs.clear(); QString queryString = QString("SELECT id, shortname, name FROM prop_mode_enumeration ORDER BY name"); QSqlQuery query; bool sqlOK = query.exec(queryString); QString num; if (sqlOK) { QString translatedValue = QString(); QString valueToTranslate = QString(); while ( (query.next())) { if (query.isValid()) { valueToTranslate = (query.value(2)).toString(); if (valueToTranslate == "Aircraft Scatter") { translatedValue = tr("Aircraft Scatter", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "Aurora") { translatedValue = tr("Aurora"); } else if(valueToTranslate == "Aurora-E") { translatedValue = tr("Aurora-E"); } else if(valueToTranslate == "Back scatter") { translatedValue = tr("Back scatter", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "Earth-Moon-Earth") { translatedValue = tr("Earth-Moon-Earth"); } else if(valueToTranslate == "Sporadic E") { translatedValue = tr("Sporadic E"); } else if(valueToTranslate == "Field Aligned Irregularities") { translatedValue = tr("Field Aligned Irregularities", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "F2 Reflection") { translatedValue = tr("F2 Reflection", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "Internet-assisted") { translatedValue = tr("Internet-assisted"); } else if(valueToTranslate == "Ionoscatter") { translatedValue = tr("Ionoscatter", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "Meteor scatter") { translatedValue = tr("Meteor scatter", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "Terrestrial or atmospheric repeater or transponder") { translatedValue = tr("Terrestrial or atmospheric repeater or transponder"); } else if(valueToTranslate == "Rain scatter") { translatedValue = tr("Rain scatter", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "Satellite") { translatedValue = tr("Satellite"); } else if(valueToTranslate == "Trans-equatorial") { translatedValue = tr("Trans-equatorial", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "Tropospheric ducting") { translatedValue = tr("Tropospheric ducting", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "") { translatedValue = tr(""); } else { translatedValue = valueToTranslate; } aux.clear(); num = (query.value(0)).toString(); if (num.toInt() <= 9) { num = "0" + num; } aux = num + " - " + (query.value(1)).toString() + " - " + translatedValue; qs << aux; } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QStringList(); } query.finish(); qs.sort(); return qs; } bool DataProxy_SQLite::clearSatList() { QSqlQuery query; bool sqlOK = query.exec("DELETE FROM satellites"); if (sqlOK) { query.finish(); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } } bool DataProxy_SQLite::addSatellite(const QString &_arrlId, const QString &_name, const QString &_downLink, const QString &_upLink, const QString &_mode, int id) { //qDebug() << "DataProxy_SQLite::addSatellite: " << QString::number(id) ; QSqlQuery query; QString queryString; if (id>0) { queryString = QString("UPDATE satellites set satarrlid = '%1', satname = '%2', uplink = '%3', downlink = '%4', satmode = '%5' WHERE id = '%6'").arg(_arrlId).arg(_name).arg(_upLink).arg(_downLink).arg(_mode).arg(id); } else { queryString = QString("INSERT INTO satellites (satarrlid, satname, uplink, downlink, satmode) VALUES ('%1', '%2', '%3', '%4', '%5')").arg(_arrlId).arg(_name).arg(_upLink).arg(_downLink).arg(_mode); } bool sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::addSatellite - query: " << query.lastQuery(); if (sqlOK) { //qDebug() << "DataProxy_SQLite::addSatellite - TRUE" ; //qDebug() << "DataProxy_SQLite::addSatellite - TRUE - ERROR: " << QString::number(query.lastError().nativeErrorCode()); query.finish(); return true; } else { //qDebug() << "DataProxy_SQLite::addSatellite - FALSE" ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } } int DataProxy_SQLite::getDBSatId(const QString &_arrlId) { //qDebug() << "DataProxy_SQLite::getDBSatId: " << _arrlId; int aux = -1; QString queryString = QString("SELECT id FROM satellites WHERE satarrlid='%1'").arg(_arrlId); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { aux = query.value(0).toInt(); } else { //qDebug() << "DataProxy_SQLite::getDBSatId: query not valid" ; query.finish(); } } else { //qDebug() << Q_FUNC_INFO << ": query failed: " << query.lastQuery() ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); } //qDebug() << ":: final: " << aux ; query.finish(); return aux; } QStringList DataProxy_SQLite::getSatellitesList() { //qDebug() << "DataProxy_SQLite::getSatellitesList" ; QString aux = QString(); QStringList qs; qs.clear(); QString queryString = QString("SELECT satarrlid, satname FROM satellites"); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { while ( (query.next())) { if (query.isValid()) { aux.clear(); aux = (query.value(0)).toString() + " - " + (query.value(1)).toString(); qs << aux; } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QStringList(); } query.finish(); qs.sort(); return qs; } QString DataProxy_SQLite::getSatelliteUplink(const QString &_sat, int _pair) { //qDebug() << "DataProxy_SQLite::getSatelliteUplink: " << _sat; QString aux = QString(); //QString aux2 = QString(); //double fr1, fr2, fr; QString queryString = QString("SELECT uplink FROM satellites WHERE satarrlid='%1'").arg(_sat); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { aux = query.value(0).toString(); aux = QString::number(getFreqFromRange(aux, _pair)); } else { //qDebug() << "DataProxy_SQLite::getSatelliteUplink: query not valid" ; query.finish(); return QString(); } } else { //qDebug() << "DataProxy_SQLite::getSatelliteUplink: query failed: " << query.lastQuery() ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getSatelliteUplink: final: " << aux; query.finish(); return aux; } QString DataProxy_SQLite::getSatelliteDownlink(const QString &_sat, int _pair) { //qDebug() << "DataProxy_SQLite::getSatelliteDownlink: " << _sat; QString aux = QString(); //QString aux2 = QString(); //double fr1, fr2, fr; QString queryString = QString("SELECT downlink FROM satellites WHERE satarrlid='%1'").arg(_sat); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { aux = query.value(0).toString(); aux = QString::number(getFreqFromRange(aux,_pair)); } else { //qDebug() << "DataProxy_SQLite::getSatelliteDownlink: query not valid" ; query.finish(); return QString(); } } else { //qDebug() << "DataProxy_SQLite::getSatelliteDownlink: query failed: " << query.lastQuery() ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getSatelliteDownlink: final: " << aux; query.finish(); return aux; } QString DataProxy_SQLite::getSatelliteMode(const QString &_sat) { QString aux = QString(); QString queryString = QString("SELECT satmode FROM satellites WHERE satarrlid='%1'").arg(_sat); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { aux = query.value(0).toString(); query.finish(); if (aux.contains(',')) { // Potentially somethink like: SSB,CW // We select the first one aux = aux.section(',', 0, 0); // We select the first package } } else { //qDebug() << "DataProxy_SQLite::getSatelliteMode: query not valid" ; query.finish(); return QString(); } } else { //qDebug() << "DataProxy_SQLite::getSatelliteMode: query failed: " << query.lastQuery() ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getSatelliteMode: final: " << aux; return aux; } QString DataProxy_SQLite::getSatelliteFullUplink(const QString &_sat) { //qDebug() << "DataProxy_SQLite::getSatelliteFullUplink: " << _sat; QString aux = QString(); QString queryString = QString("SELECT uplink FROM satellites WHERE satarrlid='%1'").arg(_sat); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { aux = query.value(0).toString(); } else { //qDebug() << "DataProxy_SQLite::getSatelliteFullUplink: query not valid" ; query.finish(); return QString(); } } else { //qDebug() << "DataProxy_SQLite::getSatelliteFullUplink: query failed: " << query.lastQuery() ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getSatelliteFullUplink: final: " << aux; query.finish(); return aux; } QString DataProxy_SQLite::getSatelliteFullDownlink(const QString &_sat) { //qDebug() << "DataProxy_SQLite::getSatelliteFullDownlink: " << _sat; QString aux = QString(); //QString aux2 = QString(); //double fr1, fr2, fr; QString queryString = QString("SELECT downlink FROM satellites WHERE satarrlid='%1'").arg(_sat); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { aux = query.value(0).toString(); } else { //qDebug() << "DataProxy_SQLite::getSatelliteFullDownlink: query not valid" ; query.finish(); return QString(); } } else { //qDebug() << "DataProxy_SQLite::getSatelliteFullDownlink: query failed: " << query.lastQuery() ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getSatelliteFullDownlink: final: " << aux; query.finish(); return aux; } QString DataProxy_SQLite::getSatelliteFullMode(const QString &_sat) { QString aux = QString(); QString queryString = QString("SELECT satmode FROM satellites WHERE satarrlid='%1'").arg(_sat); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { aux = query.value(0).toString(); query.finish(); } else { //qDebug() << "DataProxy_SQLite::getSatelliteMode: query not valid" ; query.finish(); return QString(); } } else { //qDebug() << "DataProxy_SQLite::getSatelliteMode: query failed: " << query.lastQuery() ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getSatelliteMode: final: " << aux; return aux; } QString DataProxy_SQLite::getSatelliteName(const QString &_sat) { //qDebug() << "DataProxy_SQLite::getSatelliteName: " << _sat; QString aux = QString(); QString queryString = QString("SELECT satname FROM satellites WHERE satarrlid='%1'").arg(_sat); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { aux = query.value(0).toString(); } else { //qDebug() << "DataProxy_SQLite::getSatelliteName: query not valid" ; query.finish(); return QString(); } } else { //qDebug() << "DataProxy_SQLite::getSatelliteName: query failed: " << query.lastQuery() ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getSatelliteName: final: " << aux; query.finish(); return aux; } QString DataProxy_SQLite::getSateliteArrlIdFromId(const int _id) { QString aux = QString(); QString queryString = QString("SELECT satarrlid FROM satellites WHERE id='%1'").arg(_id); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { aux = query.value(0).toString(); query.finish(); } else { //qDebug() << "DataProxy_SQLite::getSateliteArrlIdFromId: query not valid" ; query.finish(); return QString(); } } else { //qDebug() << "DataProxy_SQLite::getSateliteArrlIdFromId: query failed: " << query.lastQuery() ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getSateliteArrlIdFromId: final: " << aux; return aux; } double DataProxy_SQLite::getFreqFromRange(QString _fr, int _pair) { //May even receive: 145.900-146.00 and should return the mid in the range (145.950) //qDebug() << "DataProxy_SQLite::getFreqFromRange: " << _fr; QString fr1, fr2, aux; double f1, f2; fr1.clear(); fr2.clear(); f1 = 0.0; f2 = 0.0; aux.clear(); aux = _fr; if (aux.contains(',')) { // Potentially somethink like: 435.030-435.456,146.180 if((_pair<0) || (_pair>1)) { _pair = 0; } //qDebug() << "DataProxy_SQLite::getFreqFromRange: has several freqs: " << aux; aux = aux.section(',', _pair, _pair); // We select the selected package } if (aux.contains('-')) // Potentially somethink like: 435.030-435.456 { //qDebug() << "DataProxy_SQLite::getFreqFromRange: has several freqs: " << aux; fr2 = aux.section('-', 1, 1); // We select the second freq fr1 = aux.section('-', 0, 0); // We select the first freq //qDebug() << "DataProxy_SQLite::getFreqFromRange: fr1: " << fr1; //qDebug() << "DataProxy_SQLite::getFreqFromRange: fr2: " << fr2; f1 = fr1.toDouble(); f2 = fr2.toDouble(); //qDebug() << "DataProxy_SQLite::getFreqFromRange: f1: " << QString::number(f1); //qDebug() << "DataProxy_SQLite::getFreqFromRange: f2: " << QString::number(f2); f1 = (f2 + f1)/2; //qDebug() << "DataProxy_SQLite::getFreqFromRange: f1 after calc: " << QString::number(f1); } else { // It is only one freq 145.950 so this is what must be returned f1 = aux.toDouble(); } //qDebug() << "DataProxy_SQLite::getFreqFromRange: Return: " << QString::number(f1); return f1; } QStringList DataProxy_SQLite::getQSLRcvdList() { //qDebug() << "DataProxy_SQLite::getQSLRcvdList" ; QString aux = QString(); QStringList qs; qs.clear(); QString queryString = QString("SELECT shortname, name FROM qsl_rec_status"); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { QString translatedValue = QString(); QString valueToTranslate = QString(); while ( (query.next())) { if (query.isValid()) { valueToTranslate = (query.value(1)).toString(); if (valueToTranslate == "Yes") { translatedValue = tr("Yes"); } else if(valueToTranslate == "No") { translatedValue = tr("No"); } else if(valueToTranslate == "Requested") { translatedValue = tr("Requested"); } else if(valueToTranslate == "Ignore/Invalid") { translatedValue = tr("Ignore/Invalid"); } else if(valueToTranslate == "Validated") { translatedValue = tr("Validated"); } else { translatedValue = valueToTranslate; } aux.clear(); aux = (query.value(0)).toString() + " - " + translatedValue; qs << aux; } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QStringList(); } query.finish(); return qs; } QStringList DataProxy_SQLite::getQSLSentList() { //qDebug() << "DataProxy_SQLite::getQSLSentList" ; QString aux = QString(); QStringList qs; qs.clear(); QString queryString = QString("SELECT shortname, name FROM qsl_sent_status"); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { QString translatedValue = QString(); QString valueToTranslate = QString(); while ( (query.next())) { if (query.isValid()) { valueToTranslate = (query.value(1)).toString(); if (valueToTranslate == "Yes") { translatedValue = tr("Yes"); } else if(valueToTranslate == "No") { translatedValue = tr("No"); } else if(valueToTranslate == "Requested") { translatedValue = tr("Requested"); } else if(valueToTranslate == "Queued") { translatedValue = tr("Queued"); } else if(valueToTranslate == "Ignore/Invalid") { translatedValue = tr("Ignore/Invalid"); } else { translatedValue = valueToTranslate; } aux.clear(); aux = (query.value(0)).toString() + " - " + translatedValue; qs << aux; } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QStringList(); } query.finish(); return qs; } QStringList DataProxy_SQLite::getClubLogStatusList() { //qDebug() << "DataProxy_SQLite::getClubLogStatusList" ; QString aux = QString(); QStringList qs; qs.clear(); QString queryString = QString("SELECT shortname, name FROM clublog_status"); QSqlQuery query; bool sqlOK = query.exec(queryString); QString translatedValue = QString(); QString valueToTranslate = QString(); if (sqlOK) { while ( (query.next())) { if (query.isValid()) { valueToTranslate = (query.value(1)).toString(); if (valueToTranslate == "Uploaded") { translatedValue = tr("Uploaded"); } else if(valueToTranslate == "Do not upload") { translatedValue = tr("Do not upload"); } else if(valueToTranslate == "Modified") { translatedValue = tr("Modified"); } else { translatedValue = valueToTranslate; } aux.clear(); aux = (query.value(0)).toString() + " - " + translatedValue; qs << aux; } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QStringList(); } query.finish(); return qs; } QStringList DataProxy_SQLite::getQSLViaList() { //qDebug() << "DataProxy_SQLite::getQSLViaList" ; QString aux = QString(); QStringList qs; qs.clear(); QString queryString = QString("SELECT shortname, name FROM qsl_via_enumeration"); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { QString translatedValue = QString(); QString valueToTranslate = QString(); while ( (query.next())) { if (query.isValid()) { valueToTranslate = (query.value(1)).toString(); if (valueToTranslate == "Bureau") { translatedValue = tr("Bureau", "Common term in hamradio, do not translate if not sure"); } else if(valueToTranslate == "Direct") { translatedValue = tr("Direct"); } else if(valueToTranslate == "Electronic") { translatedValue = tr("Electronic"); } else if(valueToTranslate == "Manager") { translatedValue = tr("Manager", "Common term in hamradio, do not translate if not sure"); } else { translatedValue = valueToTranslate; } aux.clear(); aux = (query.value(0)).toString() + " - " + translatedValue; qs << aux; } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QStringList(); } query.finish(); return qs; } bool DataProxy_SQLite::haveAtLeastOneLog() { //qDebug() << "DataProxy_SQLite::haveAtLeastOneLog()"; QSqlQuery query; bool sqlOK = query.exec("SELECT COUNT(id) from logs"); if (sqlOK) { query.next(); if (query.isValid()) { if((query.value(0)).toInt()>0) { query.finish(); return true; } else { query.finish(); return false; } } else { query.finish(); return false; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } //return false; } QStringList DataProxy_SQLite::getColumnNamesFromTableLog() { //qDebug() << "DataProxy_SQLite::getColumnNamesFromTableLog"; return getColumnNamesFromTable("log"); } QStringList DataProxy_SQLite::getColumnNamesFromTable(const QString &_tableName) { //qDebug() << "DataProxy_SQLite::getColumnNamesFromTable"; return db->getColumnNamesFromTable(_tableName); } bool DataProxy_SQLite::setDXCCAwardStatus(const int _qsoId) { // If the band/mode/log is already confirmed: Return true // If the band/mode/log is already worked and status worked: Return true // If the band/mode/log is already worked and status confirmed: Update and Return true // If not worked: Add and Return true //qDebug() << "DataProxy_SQLite::setDXCCAwardStatus: " << QString::number(_qsoId); if (_qsoId <= 0) { //qDebug() << "DataProxy_SQLite::setDXCCAwardStatus: QSOid <=0 " << QString::number(_qsoId); return false; } QList values; values.clear(); values << getBandModeDXCCCQZlogIDFromId(_qsoId); if (values.length ()!=5) { return false; } // bandid, modeid, dxcc, cqz, lognumber int _dxcc = values.at(2); //int _dxcc = getDXCCFromId(_qsoId); if (_dxcc <= 0) { //qDebug() << "DataProxy_SQLite::setDXCCAwardStatus: DXCC <= 0: DXCC: " << QString::number(_dxcc) << " - " << QString::number(_qsoId); return false; } int _band = values.at(0); //int _band = getBandFromId(_qsoId); if (_band <= 0) { //qDebug() << "DataProxy_SQLite::setDXCCAwardStatus: Band <= 0: BAND: " << QString::number(_band) << " - " << QString::number(_qsoId); return false; } int _mode = values.at(1); //int _mode = getModeFromId(_qsoId); if (_mode <= 0) { //qDebug() << "DataProxy_SQLite::setDXCCAwardStatus: Mode <= 0: Mode: " << QString::number(_mode) << " - " << QString::number(_qsoId); return false; } int _log = values.at(4); //int _log = getLogNumberFromQSOId(_qsoId); if (_log <= 0) { //qDebug() << "DataProxy_SQLite::setDXCCAwardStatus: Log <= 0: Log: " << QString::number(_log) << " - " << QString::number(_qsoId); return false; } // If the band/mode/log is already confirmed: Return true QSqlQuery query; // awarddxcc id dxcc band mode confirmed qsoid lognumber // If the band/mode/log is already confirmed: Return true // If the band/mode/log is already worked and status worked: Return true // If the band/mode/log is already worked and status confirmed: Update and Return true // If not worked: Add and Return true QString queryString = QString("SELECT id, confirmed, qsoid FROM awarddxcc WHERE band='%1' AND mode='%2' AND dxcc='%3'").arg(_band).arg(_mode).arg(_dxcc); bool sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::setDXCCAwardStatus: Queryexec-1: " << queryString; queryString.clear(); if (sqlOK) { QSqlRecord rec = query.record(); query.next(); //int nameCol = -1; if (query.isValid()) { int nameCol = rec.indexOf("id"); int __id = (query.value(nameCol)).toInt(); nameCol = rec.indexOf("confirmed"); QString __confirmed = (query.value(nameCol)).toString(); if (__confirmed == "1") { // #1 - If the band/mode/log is already confirmed: Return true query.finish(); return true; } else if (__confirmed == "0") { if (!isQSOConfirmed(_qsoId, true, true)) //if (!isQSLReceived((_qsoId))) {// #2 - If the band/mode/log is already worked and status worked: Return true query.finish(); return true; } else { // #3 - If the band/mode/log is already worked and status confirmed: Update and Return true nameCol = rec.indexOf("qsoid"); //int __qsoid = (query.value(nameCol)).toInt(); queryString = QString("UPDATE awarddxcc SET confirmed = '1', qsoid = '%1' WHERE id = '%2'").arg(_qsoId).arg(__id); } } else { // This case should not happen? query.finish(); return true; } query.finish(); // #1 - If the band/mode/log is already confirmed: Return true // #2 - If the band/mode/log is already worked and status worked: Return true // #3 - If the band/mode/log is already worked and status confirmed: Update and Return true // #4 - If not worked: Add and Return true } else { //#4 - If not worked: Add and Return true query.finish(); // awarddxcc id dxcc band mode confirmed qsoid lognumber queryString = QString("INSERT INTO awarddxcc (dxcc, band, mode, confirmed, qsoid, lognumber) values('%1','%2','%3','0', '%4', '%5')").arg(_dxcc).arg(_band).arg(_mode).arg(_qsoId).arg(_log); } if (queryString.length()>5) { if (query.exec(queryString)) { //qDebug() << "DataProxy_SQLite::setDXCCAwardStatus: Queryexec-2: " << queryString; query.finish(); return true; } else { if(query.lastError().nativeErrorCode()!=QString::number(19)) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } query.finish(); return true; } bool DataProxy_SQLite::setWAZAwardStatus(const int _qsoId) { // If the band/mode/log is already confirmed: Return true // If the band/mode/log is already worked and status worked: Return true // If the band/mode/log is already worked and status confirmed: Update and Return true // If not worked: Add and Return true //qDebug() << "DataProxy_SQLite::setDXCCAwardStatus: " << QString::number(_qsoId); if (_qsoId <= 0) { return false; } QList values; values.clear(); values << getBandModeDXCCCQZlogIDFromId(_qsoId); if (values.length ()!=5) { return false; } // bandid, modeid, dxcc, cqz, lognumber int _cqz = values.at(3); //int _cqz = getCQZFromId(_qsoId); if (_cqz <= 0) { return false; } //int _band = getBandFromId(_qsoId); int _band = values.at(0); if (_band <= 0) { return false; } //int _mode = getModeFromId(_qsoId); int _mode = values.at(1); if (_mode <= 0) { return false; } //int _log = getLogNumberFromQSOId(_qsoId); int _log = values.at(4); if (_log <= 0) { return false; } // If the band/mode/log is already confirmed: Return true QSqlQuery query; // awarddxcc id dxcc band mode confirmed qsoid lognumber // If the band/mode/log is already confirmed: Return true // If the band/mode/log is already worked and status worked: Return true // If the band/mode/log is already worked and status confirmed: Update and Return true // If not worked: Add and Return true QString queryString = QString("SELECT id, confirmed, qsoid FROM awardwaz WHERE band='%1' AND mode='%2' AND cqz='%3'").arg(_band).arg(_mode).arg(_cqz); bool sqlOK = query.exec(queryString); queryString.clear(); if (sqlOK) { QSqlRecord rec = query.record(); query.next(); int nameCol = -1; if (query.isValid()) { nameCol = rec.indexOf("id"); int __id = (query.value(nameCol)).toInt(); nameCol = rec.indexOf("confirmed"); QString __confirmed = (query.value(nameCol)).toString(); if (__confirmed == "1") { // #1 - If the band/mode/log is already confirmed: Return true query.finish(); return true; } else if (__confirmed == "0") { if (!isQSOConfirmed(_qsoId, true, true)) //if (!isQSLReceived((_qsoId))) {// #2 - If the band/mode/log is already worked and status worked: Return true query.finish(); return true; } else { // #3 - If the band/mode/log is already worked and status confirmed: Update and Return true nameCol = rec.indexOf("qsoid"); //int __qsoid = (query.value(nameCol)).toInt(); queryString = QString("UPDATE awardwaz SET confirmed = '1', qsoid = '%1' WHERE id = '%2'").arg(_qsoId).arg(__id); } } else { // This case should not happen? query.finish(); return true; } query.finish(); // #1 - If the band/mode/log is already confirmed: Return true // #2 - If the band/mode/log is already worked and status worked: Return true // #3 - If the band/mode/log is already worked and status confirmed: Update and Return true // #4 - If not worked: Add and Return true } else { //#4 - If not worked: Add and Return true query.finish(); // awarddxcc id dxcc band mode confirmed qsoid lognumber queryString = QString("INSERT INTO awardwaz (cqz, band, mode, confirmed, qsoid, lognumber) values('%1','%2','%3','0', '%4', '%5')").arg(_cqz).arg(_band).arg(_mode).arg(_qsoId).arg(_log); } if (queryString.length()>5) { if (query.exec(queryString)) { query.finish(); return true; } else { if(query.lastError().nativeErrorCode()!=QString::number(19)) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } query.finish(); return true; } bool DataProxy_SQLite::addDXCCEntitySubdivision(const QString &_name, const QString &_short, const QString &_pref, const QString &_group, const int _regId, const int _dxcc, const int _cq, const int _itu, const QDate &_startDate, const QDate &_endDate, const bool _deleted) { //qDebug() << "DataProxy_SQLite::addDXCCEntitySubdivision: length: " << _name; // id / name / shortname / prefix / regionalgroup / regionalid / dxcc / cqz / ituz / start_date / end_date / deleted QString queryString; QSqlQuery query; bool sqlOK = false; //qDebug() << "DataProxy_SQLite::addRegionalAward: Importing: " << _regionalAward.getRegionalAwardRefName(i) ; queryString = QString("INSERT INTO primary_subdivisions (name, shortname, prefix, regionalgroup, " "regionalid, dxcc, cqz, ituz, start_date, end_date, deleted) " "values ('%1','%2','%3', '%4','%5','%6', '%7','%8', '%9', '%10','%11')") .arg(_name).arg(_short).arg(_pref).arg(_group).arg(_regId).arg(_dxcc) .arg(_cq).arg(_itu).arg(util->getDateSQLiteStringFromDate(_startDate)) .arg(util->getDateSQLiteStringFromDate(_endDate)).arg(util->boolToCharToSQLite(_deleted)); sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << "DataProxy_SQLite::addRegionalAward: " << query.lastQuery(); query.finish(); } else { //qDebug() << "DataProxy_SQLite::addRegionalAward: ERROR "; //qDebug() << "DataProxy_SQLite::addRegionalAward: - query error: " << QString::number(query.lastError().nativeErrorCode()); //qDebug() << "DataProxy_SQLite::addRegionalAward: LastQuery: " << query.lastQuery() ; //qDebug() << "DataProxy_SQLite::addRegionalAward: LastError-data: " << query.lastError().databaseText() ; //qDebug() << "DataProxy_SQLite::addRegionalAward: LastError-driver: " << query.lastError().driverText() ; //qDebug() << "DataProxy_SQLite::addRegionalAward: LastError-n: " << QString::number(query.lastError().nativeErrorCode() ); emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } //qDebug() << "DataProxy_SQLite::addDXCCEntitySubdivision: END" ; return true; } int DataProxy_SQLite::getNumberOfManagedLogs() { //qDebug() << "DataProxy_SQLite::getNumberOfManagedLogs"; QSqlQuery query; bool sqlOK = query.exec("SELECT COUNT (*) from logs"); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } //return -1; } int DataProxy_SQLite::getMaxLogNumber() { QSqlQuery query; QString queryString = QString("SELECT MAX(id) FROM logs"); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } //return -1; } QStringList DataProxy_SQLite::getListOfManagedLogs() { //This function returns the list of log IDs that are being managed //qDebug() << "DataProxy_SQLite::getListOfManagedLogs"; QSqlQuery query; QStringList qs; qs.clear(); QString queryString = QString("SELECT id FROM logs"); bool sqlOK = query.exec(queryString); if (sqlOK) { while (query.next()) { if (query.isValid()) { qs << (query.value(0)).toString(); //qDebug() << "DataProxy_SQLite::getListOfManagedLogs: " << (query.value(0)).toString() ; } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); qs.clear(); } query.finish(); return qs; } QString DataProxy_SQLite::getStationCallSignFromLog(const int _log) { //qDebug() << "DataProxy_SQLite::getStationCallSignFromLog: " << QString::number(_log)<< QT_ENDL; QSqlQuery query; QString queryString = QString("SELECT stationcall FROM logs WHERE id='%1'").arg(_log); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getStationCallSignFromLog: " << (query.value(0)).toString(); QString v = (query.value(0)).toString(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getStationCallSignFromLog: Not valid"; query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getStationCallSignFromLog: query failed"; query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getStationCallSignFromLog: END"; //return QString(); } QStringList DataProxy_SQLite::getStationCallSignsFromLog(const int _log) { //qDebug() << "DataProxy_SQLite::getStationCallSignsFromLog"; QStringList calls = QStringList(); QSqlQuery query; QString queryString; bool sqlOK; if (doesThisLogExist(_log)) { queryString = QString("SELECT DISTINCT station_callsign FROM log WHERE lognumber='%1'").arg(_log); } else { queryString = QString("SELECT DISTINCT station_callsign FROM log"); } sqlOK = query.exec(queryString); if (sqlOK) { while(query.next()) { if (query.isValid()) { queryString = (query.value(0)).toString(); if (queryString.length()>2) { calls.append(queryString); } //qDebug() << "DataProxy_SQLite::getStationCallSignsFromLog: " << queryString; } else { query.finish(); //qDebug() << "DataProxy_SQLite::getStationCallSignsFromLog-END-1 - fail"; return QStringList(); } } query.finish(); calls.removeDuplicates(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "DataProxy_SQLite::getStationCallSignsFromLog-END-2 - fail"; return QStringList(); } calls.sort(); //qDebug() << "DataProxy_SQLite::getStationCallSignsFromLog-END"; return calls; } QStringList DataProxy_SQLite::getStationCallSignsFromLogWithLoTWPendingToSend(const int _log) { //qDebug() << Q_FUNC_INFO; QString queryString; if (doesThisLogExist(_log)) { queryString = QString("SELECT DISTINCT station_callsign FROM log WHERE lotw_qsl_sent='Q' AND lognumber='%1'").arg(_log); } else { queryString = QString("SELECT DISTINCT station_callsign FROM log WHERE lotw_qsl_sent='Q'"); } QSqlQuery query; bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); // //qDebug() << Q_FUNC_INFO << "END-2 - fail"; return QStringList(); } QStringList calls = QStringList(); while(query.next()) { if (query.isValid()) { queryString = (query.value(0)).toString(); if (queryString.length()>2) { calls.append(queryString); } //qDebug() << Q_FUNC_INFO << ": " << queryString; } else { query.finish(); //qDebug() << Q_FUNC_INFO << ": END-1 - fail"; return QStringList(); } } query.finish(); calls.removeDuplicates(); calls.sort(); //qDebug() << Q_FUNC_INFO << ": END"; return calls; } QString DataProxy_SQLite::getOperatorsFromLog(const int _log) { //qDebug() << "DataProxy_SQLite::getOperatorsFromLog: " << QString::number(_log)<< QT_ENDL; QSqlQuery query; QString queryString = QString("SELECT operators FROM logs WHERE id='%1'").arg(_log); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getOperatorsFromLog: " << (query.value(0)).toString(); QString v = (query.value(0)).toString(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getOperatorsFromLog: Not valid"; query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getOperatorsFromLog: query failed"; query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getOperatorsFromLog: END"; //return QString(); } QString DataProxy_SQLite::getCommentsFromLog(const int _log) { //qDebug() << "DataProxy_SQLite::getLogDateFromLog: " << QString::number(_log)<< QT_ENDL; QSqlQuery query; QString queryString = QString("SELECT comment FROM logs WHERE id='%1'").arg(_log); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getCommentsFromLog: " << (query.value(0)).toString(); QString v = (query.value(0)).toString(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getCommentsFromLog: Not valid"; query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getLogDateFromLog: query failed"; query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getCommentsFromLog: END"; //return QString(); } QString DataProxy_SQLite::getLogDateFromLog(const int _log) { //qDebug() << "DataProxy_SQLite::getLogDateFromLog: " << QString::number(_log)<< QT_ENDL; QSqlQuery query; QString queryString = QString("SELECT logdate FROM logs WHERE id='%1'").arg(_log); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getLogDateFromLog: " << (query.value(0)).toString(); QString v = (query.value(0)).toString(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getLogDateFromLog: Not valid"; query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getLogDateFromLog: query failed"; query.finish(); return QString(); } //qDebug() << "DataProxy_SQLite::getLogDateFromLog: END"; //return QString(); } int DataProxy_SQLite::getLogNumberFromQSOId(const int _qsoId) { QSqlQuery query; QString queryString = QString("SELECT lognumber FROM log WHERE id='%1'").arg(_qsoId); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } } bool DataProxy_SQLite::fillEmptyDXCCInTheLog() { //qDebug() << "DataProxy_SQLite::fillEmptyDXCCInTheLog" ; QSqlQuery query; QSqlQuery query2; QString queryString = QString("SELECT COUNT (id) FROM log WHERE dxcc IS NULL OR dxcc<'1' OR cont IS NULL"); bool sqlOK = query.exec(queryString); int qsos = -1; if (sqlOK) { //QSqlDatabase::database().commit(); query.next(); qsos = (query.value(0)).toInt(); query.finish(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } if (qsos < 1) { return true; } int step = util->getProgresStepForDialog(qsos); QProgressDialog progress(QObject::tr("Updating information..."), QObject::tr("Abort updating"), 0, qsos); progress.setMaximum(qsos); progress.setWindowModality(Qt::WindowModal); queryString = QString("SELECT id, call FROM log WHERE dxcc IS NULL OR dxcc<1 OR cont IS NULL"); sqlOK = query.exec(queryString); if (sqlOK) { int nameCol = -1; QSqlRecord rec = query.record(); QString _call = QString(); QString _id = QString(); QString _dxcc = QString(); QString _aux = QString(); QString _continent = QString(); int j = 0; while (query.next()) { if (query.isValid()) { nameCol = rec.indexOf("id"); _id = (query.value(nameCol)).toString(); nameCol = rec.indexOf("call"); _call = (query.value(nameCol)).toString(); _dxcc = QString::number(getPrefixId(_call)); _continent = getContinentShortNameFromEntity(_dxcc.toInt()); //qDebug() << "DataBase::fillEmptyDXCCInTheLog: DXCC: " << _dxcc; //qDebug() << "DataBase::fillEmptyDXCCInTheLog: Cont: " << _continent; // UPDATE THE ID WITH THE DXCC queryString = QString("UPDATE log SET dxcc = '%1', cont = '%2' WHERE id = '%3'").arg(_dxcc).arg(_continent).arg(_id); sqlOK = query2.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query2.lastError().databaseText(), query2.lastError().nativeErrorCode(), query2.lastQuery()); query2.finish(); return false; } query2.finish(); if (( (j % step )== 0) ) { // To update the speed I will only show the progress once each X QSOs _aux = QObject::tr("Updating DXCC and Continent information...") + "\n" + QObject::tr("QSO: ") + QString::number(j) + "/" + QString::number(qsos); //_aux = "Updating ..."; progress.setLabelText(_aux); progress.setValue(j); } if ( progress.wasCanceled() ) { //qDebug() << "DataBase::fillEmptyDXCCInTheLog: progress canceled"; query.finish(); return true; } j++; } } progress.setValue(qsos); QMessageBox msgBox; msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog DXCC")); msgBox.setText(tr("All QSOs have been updated with a DXCC and the Continent.") ); msgBox.exec(); } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } query.finish(); return true; } int DataProxy_SQLite::getHowManyQSOInLog(const int _log) { QString queryString = QString(); QSqlQuery query = QSqlQuery(); if (_log < 0) { queryString = QString("SELECT count(id) FROM log"); } else { queryString = QString("SELECT count(id) FROM log WHERE lognumber='%1'").arg(_log); } bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return 0; } } int DataProxy_SQLite::getHowManyConfirmedQSLInLog(const int _log) { if (!doesThisLogExist(_log) && (_log>0)) { return 0; } QString queryString = QString(); QSqlQuery query; if (_log < 0) { queryString = QString("SELECT count(id) FROM log WHERE (qsl_rcvd='Y' OR lotw_qsl_rcvd='Y')"); } else { queryString = QString("SELECT count(id) FROM log WHERE (qsl_rcvd='Y' OR lotw_qsl_rcvd='Y') AND lognumber='%1'").arg(_log); } bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return 0; } } int DataProxy_SQLite::getHowManyQSLSentInLog(const int _log) { if (!doesThisLogExist(_log) && (_log>0)) { return 0; } QString queryString = QString(); QSqlQuery query; if (_log < 0) { queryString = QString("SELECT count(id) FROM log WHERE qsl_sent='Y'"); } else { queryString = QString("SELECT count(id) FROM log WHERE qsl_sent='Y' AND lognumber='%1'").arg(_log); } bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return 0; } } int DataProxy_SQLite::getQSOsWithContinent(const QString &_cont, const int _logNumber) { //qDebug() << "DataProxy_SQLite::getQSOsWithContinent: " << _cont; QSqlQuery query; QString queryString; bool sqlOK; if (_logNumber < 0) { queryString = QString("SELECT COUNT (DISTINCT id) FROM log where cont = '%1'").arg(_cont); } else { //queryString = QString("SELECT COUNT (DISTINCT id) FROM log where lognumber='%1' AND cont LIKE '%2'").arg(_logNumber).arg(_cont); queryString = QString("SELECT COUNT (DISTINCT id) FROM log where lognumber='%1' AND cont='%2'").arg(_logNumber).arg(_cont); } sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::getQSOsWithContinent: queryString: " << queryString; if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getQSOsWithContinent: " << QString::number((query.value(0)).toInt()); int v = (query.value(0)).toInt(); query.finish(); return v; } else { //qDebug() << "DataProxy_SQLite::getQSOsWithContinent: 0"; query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getQSOsWithContinent: Query error"; query.finish(); return 0; } } int DataProxy_SQLite::getQSOsInBand(const QString &_band, const int _log) { if (!doesThisLogExist(_log) && (_log>0)) { return 0; } int bandId = getIdFromBandName(_band); if ( bandId < 0) { return 0; } QString queryString = QString(); QSqlQuery query; if (_log < 0) { queryString = QString("SELECT count(id) FROM log WHERE bandid='%1'").arg(bandId); } else { queryString = QString("SELECT count(id) FROM log WHERE bandid='%1' AND lognumber='%2'").arg(bandId).arg(_log); } bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return 0; } } int DataProxy_SQLite::getQSOsInMode(const QString &_mode, const int _log) { if (!doesThisLogExist(_log) && (_log>0)) { return 0; } int modeId = getIdFromModeName(_mode); if ( modeId < 0) { return 0; } QString queryString = QString(); QSqlQuery query; if (_log < 0) { queryString = QString("SELECT count(id) FROM log WHERE modeid='%1'").arg(modeId); } else { queryString = QString("SELECT count(id) FROM log WHERE modeid='%1' AND lognumber='%2'").arg(modeId).arg(_log); } bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return 0; } } int DataProxy_SQLite::getDXCCInBand(const int _bandid, const bool _confirmed, const int _log) { //(SELECT COUNT (DISTINCT dxcc) from log inner join band on log.bandid = band.id where band.name="80M") Q_UNUSED(_bandid); if (!doesThisLogExist(_log) && (_log>0)) { return 0; } QChar _confirmedChar = 'N'; if (_confirmed) { _confirmedChar = 'Y'; } QString queryString; QSqlQuery query; if (_log < 0) { queryString = QString("SELECT COUNT (DISTINCT dxcc) from log where band.id=:bandid AND (qsl_rcvd=:confirmed OR lotw_qsl_rcvd=:confirmed)"); } else { queryString = QString("SELECT COUNT (DISTINCT dxcc) from log where band.id=:bandid AND log.id=:log AND (qsl_rcvd=:confirmed OR lotw_qsl_rcvd=:confirmed)"); } if (!query.prepare (queryString)) { return 0; } query.bindValue (":confirmed", _confirmedChar); query.bindValue (":log", _log); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return 0; } } QList> DataProxy_SQLite::getTop10QSOPerDXCC(const int _log) { //qDebug() << Q_FUNC_INFO << " : " << QString::number(_log); QList> result; result.clear(); QSqlQuery query; QString queryString; if (_log <0) { queryString = "SELECT log.dxcc, COUNT(log.dxcc) FROM log GROUP BY log.dxcc ORDER BY COUNT(log.dxcc) DESC LIMIT 10"; } else { queryString = QString("select log.dxcc, count(log.dxcc) from log WHERE log.lognumber = '%1' group by log.dxcc ORDER BY count(log.dxcc) DESC limit 10").arg(_log); } bool sqlOK = query.exec(queryString); if (sqlOK) { QList temp; while (query.next()) { if (query.isValid()) { temp.clear(); temp.append(query.value(0).toInt()); temp.append(query.value(1).toInt()); result.append(temp); //_id = (query.value(nameCol)).toString(); } } return result; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return result; } //qDebug() << Q_FUNC_INFO << " - END" ; //return result; } bool DataProxy_SQLite::addNewLog (const QStringList _qs) { //qDebug() << "DataProxy_SQLite::addNewLog: " << _qs.at(2) << "/" << _qs.at(5) << "/" << _qs.at(6); //qDebug() << "DataProxy_SQLite::addNewLog: Size: " << QString::number(_qs.size()); // newLogq << dateString << stationCallsign << operators << comment << QString::number(selectedLog) << _qs.at(4) ; (last field is 1 or 0 editing) if (_qs.size()!=6) { //qDebug() << "DataProxy_SQLite::addNewLog: != 6" ; return false; } //qDebug() << "DataProxy_SQLite::addNewLog: Has the appropriate length" ; QString aux = QString(); QString _dateString = _qs.at(0); QString _stationCallsign = _qs.at(1); QString _operators = _qs.at(2); QString _comment = _qs.at(3); QString id = _qs.at(4); QString editing = _qs.at(5); QString queryString; QSqlQuery query; bool sqlOK; if (editing == "1") { // We are editing //qDebug() << "DataProxy_SQLite::addNewLog: We are editing!"; //queryString = QString("UPDATE logs SET logdate = '%1', stationcall = '%2', operators = '%3', comment = '%4', logtype = '%5', logtypen = '%6' WHERE id = '%7'").arg(_dateString).arg(_stationCallsign).arg(_operators).arg(_comment).arg(_typeContest).arg(_typeContestN).arg(id); queryString = QString("UPDATE logs SET logdate = '%1', stationcall = '%2', operators = '%3', comment = '%4' WHERE id = '%5'").arg(_dateString).arg(_stationCallsign).arg(_operators).arg(_comment).arg(id); sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << "DataProxy_SQLite::addNewLog: Editing OK!"; query.finish(); return true; } else { //qDebug() << "DataProxy_SQLite::addNewLog: Editing NOK!"; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } //return false; } //qDebug() << "DataProxy_SQLite::addNewLog: We are adding a new log"; // First we check if the log is already there queryString = QString("SELECT id FROM logs WHERE logdate='%1' AND stationcall='%2' AND operators = '%3' AND comment = '%4'").arg(_dateString).arg(_stationCallsign).arg(_operators).arg(_comment); //"logs" //"id, logdate, stationcall, comment, logtype" //qDebug() << "DataProxy_SQLite::addNewLog query1: " << queryString; sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { //qDebug() << "DataProxy_SQLite::addNewLog query error: " << queryString; // It seems that the log is already existing! return false; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } //Now we add the new log queryString = QString("INSERT INTO logs (logdate, stationcall, operators, comment) values('%1','%2','%3','%4')").arg(_dateString).arg(_stationCallsign).arg(_operators).arg(_comment); //qDebug() << "DataProxy_SQLite::addNewLog query1: " << queryString; sqlOK = query.exec(queryString); if (sqlOK) { query.finish(); return true; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } //return false; } bool DataProxy_SQLite::doesThisLogExist(const int _log) { //qDebug() << "DataProxy_SQLite::doesThisLogExist: " << QString::number(_log); //qDebug() << "DataProxy_SQLite::doesThisLogExist - Name:" << db->getDBName(); QSqlQuery query; QString queryString = QString("SELECT id FROM logs WHERE id='%1'").arg(_log); bool sqlOK = query.exec(queryString); //qDebug() << "DataProxy_SQLite::doesThisLogExist: query: " << query.lastQuery() ; if (sqlOK) { if (query.next()) { if (query.isValid()) { query.finish(); //qDebug() << "DataProxy_SQLite::doesThisLogExist: END TRUE" ; return true; } else { query.finish(); //qDebug() << "DataProxy_SQLite::doesThisLogExist: END FALSE 1" ; return false; } } else { query.finish(); //qDebug() << "DataProxy_SQLite::doesThisLogExist: END FALSE 2" ; return false; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "DataProxy_SQLite::doesThisLogExist: END FALSE 3" ; return false; } //qDebug() << "DataProxy_SQLite::doesThisLogExist: END FALSE 4" ; //return false; } int DataProxy_SQLite::getContinentIdFromContinentShortName(const QString &_n) { if (_n.length()!=2) { return -3; } QSqlQuery query; QString queryString = QString("SELECT id FROM continent WHERE shortname=='%1'").arg(_n); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -2; } } QString DataProxy_SQLite::getContinentShortNameFromEntity(const int _n) { QSqlQuery query; QString queryString= QString("SELECT continent FROM entity WHERE dxcc='%1'").arg(_n); //QString queryString= QString("SELECT continent.shortname FROM entity JOIN continent ON entity.continent=continent.shortname WHERE dxcc='%1'").arg(_n); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { queryString = (query.value(0)).toString(); query.finish(); return queryString; } else { query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } } int DataProxy_SQLite::getContinentIdFromEntity(const int _n) { QSqlQuery query; QString queryString = QString("SELECT continent.id FROM entity JOIN continent ON entity.continent=continent.shortname WHERE dxcc='%1'").arg(_n); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -2; } } QStringList DataProxy_SQLite::getContinentShortNames() { QSqlQuery query; QStringList continents; continents.clear(); QString queryString = QString("SELECT shortname FROM continent"); bool sqlOK = query.exec(queryString); if (sqlOK) { while (query.next()) { if (query.isValid()) { continents << query.value(0).toString(); } } query.finish(); continents.sort(); return continents; } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QStringList(); } //return QStringList(); } bool DataProxy_SQLite::isValidContinentShortName(const QString &_n) { QString queryString = QString("SELECT id FROM continent WHERE shortname ='%1'").arg(_n); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { if (query.next()) { if (query.isValid()) { query.finish(); return true; } else { query.finish(); return false; } } else { query.finish(); return false; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } } bool DataProxy_SQLite::isValidDXCC(const int _e) { QString queryString = QString("SELECT id FROM entity WHERE dxcc ='%1'").arg(_e); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { if (query.next()) { if (query.isValid()) { if (query.value(0).toInt()==1) query.finish(); return true; } else { query.finish(); return false; } } else { query.finish(); return false; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } } QStringList DataProxy_SQLite::filterValidFields(const QStringList &_fields) { //qDebug() << Q_FUNC_INFO << ": Length: " << QString::number(_fields.length()); QStringList validFields; validFields.clear(); validFields << getFields(); QString aux; //foreach(aux, validFields) //{ // //qDebug() << Q_FUNC_INFO << ": validFields: " << aux; //} foreach(aux, _fields) { //qDebug() << Q_FUNC_INFO << ": _fields: " << aux; } QStringList returningFields; returningFields.clear(); QString field; foreach (field, _fields) { //qDebug() << Q_FUNC_INFO << ": Field:-1: " << field; field = field.trimmed(); if (field.endsWith(';')) { field.chop(1); } //qDebug() << Q_FUNC_INFO << ": Field:-2: " << field; if (validFields.contains(field)) { returningFields << field; } } if (returningFields.isEmpty()) { returningFields << util->getDefaultLogFields(); } return returningFields; } int DataProxy_SQLite::getITUzFromPrefix(const QString &_p) { QSqlQuery query; //QString queryString = QString("SELECT ituz FROM prefixesofentity WHERE prefix LIKE '%1'").arg(_p); QString queryString = QString("SELECT ituz FROM prefixesofentity WHERE prefix = '%1'").arg(_p); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -2; } } int DataProxy_SQLite::getCQzFromPrefix(const QString &_p) { QSqlQuery query; //QString queryString = QString("SELECT cqz FROM prefixesofentity WHERE prefix LIKE '%1'").arg(_p); QString queryString = QString("SELECT cqz FROM prefixesofentity WHERE prefix = '%1'").arg(_p); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -2; } } int DataProxy_SQLite::getCQzFromEntity(const int _n) { QSqlQuery query; QString queryString = QString("SELECT cqz FROM entity WHERE dxcc='%1'").arg(_n); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -2; } } int DataProxy_SQLite::getITUzFromEntity(const int _n) { QSqlQuery query; QString queryString = QString("SELECT ituz FROM entity WHERE dxcc='%1'").arg(_n); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -2; } } QString DataProxy_SQLite::getEntityNameFromId(const int _n) { //qDebug() << "DataProxy_SQLite::getEntityNameFromId: " << QString::number(_n); QSqlQuery query; QString queryString = QString("SELECT name FROM entity WHERE dxcc='%1'").arg(_n); QString motherEntName = QString(); bool sqlOK; if (_n > 1000) { QString aux = (QString::number(_n)).right(3); QString queryString2 = QString("SELECT name FROM entity WHERE dxcc='%1'").arg(aux); sqlOK = query.exec(queryString2); if (sqlOK) { if (query.next()) { if (query.isValid()) { motherEntName = (query.value(0)).toString(); } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } } query.finish(); sqlOK = query.exec(queryString); if (sqlOK) { if (query.next()) { if (query.isValid()) { if (_n>1000) { motherEntName = (query.value(0)).toString() + " (" + motherEntName + ")"; } else { motherEntName = (query.value(0)).toString(); } query.finish(); return motherEntName; } else { query.finish(); return QString(); } } else { query.finish(); return QString(); } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } //return QString(); } int DataProxy_SQLite::getEntityIdFromName(const QString &_e) { //qDebug() << "DataProxy_SQLite::getEntityIdFromName:" << _e; int id = -1; QString queryString; QSqlQuery query; queryString = QString("SELECT dxcc FROM entity WHERE name='%1'").arg(_e); //queryString = "SELECT prefix FROM prefixesofentity WHERE dxcc=='" + QString::number(i) +"'"; bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return id; } else { query.next(); if (query.isValid()) { id = (query.value(0)).toInt(); query.finish(); return id; } else { query.finish(); return -1; } } } QStringList DataProxy_SQLite::getEntiNameISOAndPrefixFromId(const int _dxcc) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_dxcc); if (_dxcc <= 0 ) { return QStringList(); } bool sqlOK; QString queryString; QSqlQuery query; QString motherEntName = QString(); if (_dxcc > 1000) { QString aux = (QString::number(_dxcc)).right(3); QString queryString2 = QString("SELECT name FROM entity WHERE dxcc='%1'").arg(aux); sqlOK = query.exec(queryString2); if (sqlOK) { if (query.next()) { if (query.isValid()) { motherEntName = (query.value(0)).toString(); if (motherEntName.length ()<1) { return QStringList(); } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish (); return QStringList(); } } query.finish (); QStringList result; result.clear(); queryString = QString("SELECT mainprefix, name, isoname FROM entity WHERE dxcc='%1'").arg(_dxcc); sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QStringList(); } else { query.next(); if (query.isValid()) { //queryString = (query.value(0)).toString(); QString prefix = (query.value(0)).toString(); QString name = (query.value(1)).toString(); QString isoName = (query.value(2)).toString(); query.finish(); if (prefix.length ()<1) { return QStringList(); } if (name.length ()<1) { return QStringList(); } if ((_dxcc>1000) && (motherEntName.length ()>2)) { name = name + "(" + motherEntName + ")"; } if (isoName.length ()<2) { return QStringList(); } result << prefix << name << isoName; return result; } else { query.finish(); return QStringList(); } } } QString DataProxy_SQLite::getEntityMainPrefix(const int _entityN) { //qDebug() << "DataProxy_SQLite::getEntityMainPrefix:" << QString::number(_entityN); if (_entityN <= 0 ) { return QString(); } QString queryString; QSqlQuery query; queryString = QString("SELECT mainprefix FROM entity WHERE dxcc='%1'").arg(_entityN); bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } else { query.next(); if (query.isValid()) { queryString = (query.value(0)).toString(); query.finish(); return queryString; } else { query.finish(); return QString(); } } //return QString(); } int DataProxy_SQLite::getEntityIdFromMainPrefix(const QString &_e) { //qDebug() << "DataProxy_SQLite::getEntityIdFromMainPrefix:" << _e; int id = -1; QString queryString; QSqlQuery query; queryString = QString("SELECT dxcc FROM entity WHERE mainprefix='%1'").arg(_e); bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return id; } else { query.next(); if (query.isValid()) { id = (query.value(0)).toInt(); query.finish(); return id; } else { query.finish(); return -1; } } } int DataProxy_SQLite::getDXCCFromPrefix(const QString &_p) { //qDebug() << "DataProxy_SQLite::getDXCCFromPrefix - " << Q_FUNC_INFO << "-" << _p << "-"; QSqlQuery query; QString queryString = QString("SELECT dxcc FROM prefixesofentity WHERE prefix='%1'").arg(_p); bool sqlOK = query.exec(queryString); if (sqlOK) { //qDebug() << "DataProxy_SQLite::getDXCCFromPrefix: query OK: query: " << queryString; if (query.next()) { if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); //qDebug() << "DataProxy_SQLite::getDXCCFromPrefix: return 0: " << QString::number(v) ; return v; } else { query.finish(); //qDebug() << "DataProxy_SQLite::getDXCCFromPrefix: return -1: "; return -1; } } else { query.finish(); //qDebug() << "DataProxy_SQLite::getDXCCFromPrefix: return -2: "; return -2; } } else { //qDebug() << "DataProxy_SQLite::getDXCCFromPrefix: query NOK: query: " << queryString; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << "DataProxy_SQLite::getDXCCFromPrefix: return -3: "; return -3; } //return -4; } bool DataProxy_SQLite::isNewCQz(int _c) { QSqlQuery query; QString queryString = QString("SELECT id FROM log WHERE cqz='%1'").arg(_c); //queryString = "SELECT id FROM log WHERE cqz=='" + QString::number(_cqz) +"'"; bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } else { query.next(); return query.isValid(); } } bool DataProxy_SQLite::isNewEntity(int _e) { if (_e <= 0) { return false; } //QString queryString; QSqlQuery query; QString queryString = QString("SELECT id FROM log WHERE dxcc='%1'").arg(_e); //queryString = "SELECT id FROM log WHERE dxcc=='" + QString::number(_entityN) +"'"; bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return false; } else { query.next(); if (query.isValid()) { query.finish(); return true; } else { query.finish(); return false; } } //return false; } double DataProxy_SQLite::getLongitudeFromEntity(const int _e) { QString queryString = QString("SELECT longitude FROM entity WHERE dxcc='%1'").arg(_e); QSqlQuery query; bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return 0.0; } else { query.next(); if ( !(query.isValid()) ) { query.finish(); return 0.0; } else { double v = (query.value(0)).toDouble(); query.finish(); return -v; } } } double DataProxy_SQLite::getLatitudeFromEntity(const int _e) { QString queryString = QString("SELECT latitude FROM entity WHERE dxcc='%1'").arg(_e); QSqlQuery query; bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return 0.0; } else { query.next(); if ( !(query.isValid()) ) { query.finish(); return 0.0; } else { double v = (query.value(0)).toDouble(); query.finish(); return v; } } } QString DataProxy_SQLite::getEntityPrefixes(const int _enti) { if (_enti<=0) { return QString(); } QString result; result = QString(); QString queryString; QSqlQuery query; int i = _enti; queryString = "SELECT prefix FROM prefixesofentity WHERE dxcc=='" + QString::number(i) +"'"; bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return QString(); } else { while ( (query.next())) { if (query.isValid()) { result = result + ", " + (query.value(0)).toString(); } } if (result.length() < 1) { return result; } else { result = result.remove(0,2); query.finish(); return result; } } } QStringList DataProxy_SQLite::getSpecialCallsigns() { //qDebug() << Q_FUNC_INFO; QString aux = QString(); QStringList qs; qs.clear(); QString queryString = QString("SELECT prefix from prefixesofentity WHERE prefix like '=%'"); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { while ( (query.next())) { if (query.isValid()) { //aux.clear(); aux = (query.value(0)).toString(); aux = aux.remove(0,1); qs << aux; } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } query.finish(); qs.sort(); //qDebug() << Q_FUNC_INFO << ": count: " << QString::number(qs.count()); return qs; } QHash DataProxy_SQLite::getWorldData() { //qDebug() << Q_FUNC_INFO << "Start"; QHash world; world.clear(); QString queryString; QSqlQuery query; QString pref; queryString = "SELECT prefix, dxcc FROM prefixesofentity"; bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); //qDebug() << Q_FUNC_INFO << "END-FAIL1"; return world; } else { while ( (query.next())) { if (query.isValid()) { //qDebug() << Q_FUNC_INFO << QString("Pref/Ent = %1/%2").arg((query.value(0)).toString()).arg((query.value(1)).toInt()); pref = (query.value(0)).toString(); if (pref.startsWith('=')) { pref.remove(0,1); } world.insert(pref, (query.value(1)).toInt()); } else { query.finish(); world.clear(); //qDebug() << Q_FUNC_INFO << "END-FAIL"; return world; } } } query.finish(); //qDebug() << Q_FUNC_INFO << "END"; //qDebug() << Q_FUNC_INFO << ": count: " << QString::number(world.count()); return world; } QStringList DataProxy_SQLite::getLongPrefixes() {//select prefix FROM prefixesofentity WHERE (length(prefix)>2) AND (length(prefix)<6) AND (prefix NOT LIKE '%/%') //qDebug() << Q_FUNC_INFO; QString aux = QString(); QStringList qs; qs.clear(); QString queryString = QString("SELECT prefix from prefixesofentity WHERE prefix NOT like '=%'"); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { while ( (query.next())) { if (query.isValid()) { aux.clear(); aux = (query.value(0)).toString(); qs << aux; } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } query.finish(); qs.sort(); //foreach(aux, qs) //{ // //qDebug() << aux; //} return qs; } QStringList DataProxy_SQLite::getEntitiesNames() { //qDebug() << "DataProxy_SQLite::getEntitiesNames" ; QString aux = QString(); QStringList qs; qs.clear(); QString queryString = QString("SELECT mainprefix, name, dxcc FROM entity"); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { while ( (query.next())) { if (query.isValid()) { if (query.value(2).toInt()<1000) { aux.clear(); aux = (query.value(0)).toString() + "-" + (query.value(1)).toString()+" ("+(query.value(2)).toString()+")"; //result = result + ", " + (query.value(0)).toString(); qs << aux; } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } query.finish(); qs.sort(); return qs; } QStringList DataProxy_SQLite::getEntitiesIds() { QString aux = QString(); QStringList qs; qs.clear(); QString queryString = QString("SELECT dxcc FROM entity"); QSqlQuery query; bool sqlOK = query.exec(queryString); if (sqlOK) { while ( (query.next())) { if (query.isValid()) { if (query.value(0).toInt()>0) { aux.clear(); aux = (query.value(0)).toString(); qs << aux; } } } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } query.finish(); qs.sort(); return qs; } int DataProxy_SQLite::getHowManyEntities() { QSqlQuery query; QString queryString = QString("SELECT count(id) FROM entity"); bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); query.finish(); return v; } else { query.finish(); return 0; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return 0; } } int DataProxy_SQLite::getMaxEntityID(bool limit) { //SELECT MAX (dxcc) FROM entity WHERE dxcc<1000 QSqlQuery query; QString queryString; if (limit) { queryString = QString("SELECT MAX (dxcc) FROM entity WHERE dxcc<1000"); } else { queryString = QString("SELECT MAX (dxcc) FROM entity"); } bool sqlOK = query.exec(queryString); if (sqlOK) { query.next(); if (query.isValid()) { int v = (query.value(0)).toInt(); query.finish(); return v; } else { query.finish(); return -1; } } else { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return -1; } } bool DataProxy_SQLite::updateISONames() { //qDebug() << "DataProxy_SQLite::updateISONames" ; return db->updateTheEntityTableISONames(); } QString DataProxy_SQLite::getISOName(const int _n) { //qDebug() << "DataProxy_SQLite::getISONames: " << QString::number(_n) ; if (_n <= 0 ) { //qDebug() << "DataProxy_SQLite::getISONames: NOT KNOWN - UN"; return "un"; // When no flag is known, we return the UN flag } int n = _n; if (_n<1000) { n = _n; } else if (_n>=2000) { n = _n - 2000; } else { n = _n - 1000; } QString queryString, aux; QSqlQuery query; aux.clear(); queryString = QString("SELECT isoname FROM entity WHERE dxcc='%1'").arg(n); bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); //qDebug() << "DataProxy_SQLite::getISOName: Query error - UN" ; query.finish(); return "un"; // When no flag is known, we return the UN flag } else { query.next(); if (query.isValid()){ //qDebug() << "DataProxy_SQLite::getISOName: " << "N: " << QString::number(_n) << "- ISO Name: " << (query.value(0)).toString(); aux = (query.value(0)).toString(); query.finish(); if (aux.length()>1) { return aux; } else { return "un"; // When no flag is known, we return the UN flag } } else { //qDebug() << "DataProxy_SQLite::getISOName: NO ISO Name: " ; query.finish(); return "un"; // When no flag is known, we return the UN flag } } } int DataProxy_SQLite::getPrefixId(const QString &_qrz) { //qDebug() << "DataProxy_SQLite::getPrefixId: -" << _qrz <<"-"; //TODO: Instead of going from long to short, identify prefixes from the begining: // character(may be number) + number QString aux = util->getMainCallFromComplexCall((_qrz).toUpper()); if (!util->isValidCall(aux)) //if (_qrz.length() < 1) { return -1; } int entityID = 0; //QString aux = changeSlashAndFindPrefix((_qrz).toUpper()); while ((entityID <= 0) && (aux.length()>=1) ) { entityID = getDXCCFromPrefix(aux); //qDebug() << "DataProxy_SQLite::getPrefixId: in the while" << aux << " = " << QString::number(entityID); if (entityID<=0) { aux.chop(1); } } //qDebug() << "DataProxy_SQLite::getPrefixId: " << _qrz << QString::number(entityID); return entityID; } /* QString DataProxy_SQLite::changeSlashAndFindPrefix(const QString &_qrz) { //qDebug() << "DataProxy_SQLite::changeSlashAndFindPrefix: -" << _qrz <<"-"; int iaux1, iaux2; QString aux = _qrz.toUpper(); if ((aux).count('\\')) // Replaces \ by / to ease operation. { aux.replace(QChar('\\'), QChar('/')); } else { return aux; } if (aux.count('/')) // / found! Checking different options { if (aux.endsWith("/") ) { // We look for calls ending in slash "/" or "\" aux.remove(aux.length()-1,1); } iaux1 = aux.indexOf('/'); //qDebug() << "DataProxy_SQLite::changeSlashAndFindPrefix: Slash found at: " << QString::number(iaux1); iaux2 = (aux.length())- iaux1; // iaux2 is the length of the second part if (iaux2 < 0){ iaux2 = -iaux2; } if ( iaux1 < iaux2 ) { //Like in F/EA0K, we can simply take the first part as the prefix aux = aux.left(iaux1); } else { aux = aux.right(iaux2 -1); } } return aux; } */ void DataProxy_SQLite::setLogLevel (const DebugLogLevel _l) { logEvent (Q_FUNC_INFO, "Start", Debug); logLevel = _l; db->setLogLevel(logLevel); logEvent (Q_FUNC_INFO, "END", Debug); } void DataProxy_SQLite::logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level) { if (logLevel<=_level) emit debugLog (_func, _msg, _level); } QString DataProxy_SQLite::getADIFQSO(const int _qsoId) { QString ADIFqso; ADIFqso.clear(); //qDebug() << "DataProxy_SQLite::getADIFQSO: " << QString::number(_qsoId); int nameCol; QString aux; bool propsat = false; // Reset the QSO in case it is a Satellite QSO QSqlQuery query; QString queryString = QString("SELECT * FROM log WHERE id='%1'").arg(_qsoId); bool sqlOk = query.exec(queryString); if (sqlOk) { if (query.next()) { if (query.isValid()) { //qDebug() << "DataProxy_SQLite::getADIFQSO: Query OK: " << query.lastQuery(); } else { //qDebug() << "DataProxy_SQLite::getADIFQSO: Query isValid FAILED: " << query.lastQuery(); query.finish(); return QString(); } } else { //qDebug() << "DataProxy_SQLite::getADIFQSO: Query NEXT FAILED: " << query.lastQuery(); query.finish(); return QString(); } } else { //qDebug() << "DataProxy_SQLite::getADIFQSO: Query FAILED: " << query.lastQuery(); query.finish(); return QString(); } QSqlRecord rec = query.record(); nameCol = rec.indexOf("call"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); //qDebug() << "DataProxy_SQLite::getADIFQSO: " << QString::number(nameCol) << "/" << aux1; if (util->isValidCall(aux)) { ADIFqso.append("" + aux + " "); } else { if (showInvalidCallMessage(aux)) { ADIFqso.append("" + aux + " "); } } } nameCol = rec.indexOf("qso_date"); QDateTime tDateTime; if (nameCol>=0) { aux = (query.value(nameCol)).toString(); tDateTime = util->getDateTimeFromSQLiteString(aux); if (tDateTime.isValid()) { aux = util->getADIFDateFromQDateTime(tDateTime); ADIFqso.append("" + aux + " "); aux = util->getADIFTimeFromQDateTime(tDateTime); //aux.chop(2); ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("bandid"); QString bandst = QString(); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); aux = getNameFromBandId(aux.toInt()); if (getIdFromBandName(aux)>=0) { bandst = aux; } } nameCol = rec.indexOf("freq"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); double freqTX = aux.toDouble(); if (freqTX > 0.0) { //TODO: Check if the Band is correctly defined. BAND Wins and freq is lost if not correct if (getBandIdFromFreq(freqTX) != getIdFromBandName(bandst)) { bandst = getBandNameFromFreq(freqTX); } ADIFqso.append("" + aux + " "); } if (getIdFromBandName(bandst)>0) { ADIFqso.append("" + bandst + " "); } } // Now the BAND RX nameCol = rec.indexOf("band_rx"); QString bandrxst = QString(); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); aux = getNameFromBandId(aux.toInt()); if (getIdFromBandName(aux)>=0) { bandrxst = aux; } } nameCol = rec.indexOf("freq_rx"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); double freqRX = aux.toDouble(); if (freqRX > 0.0) { //TODO: Check if the Band is correctly defined. BAND Wins and freq is lost if not correct if (getBandIdFromFreq(freqRX) != getIdFromBandName(bandrxst)) { bandrxst = getBandNameFromFreq(freqRX); } ADIFqso.append("" + aux + " "); } if (getIdFromBandName(bandrxst)>0) { ADIFqso.append("" + bandrxst + " "); } // END of Band RX } nameCol = rec.indexOf("modeid"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); // get SubModeId to check if it is the same or not from modeid QString aux2 = getSubModeFromId(aux.toInt()); //aux = db->getModeNameFromID2(aux.toInt()); aux = getNameFromSubMode(aux2); if ((aux.length()>1) && (getIdFromModeName(aux)>=0)) { ADIFqso.append("" + aux + " "); } if ((aux != aux2) && (aux.length()>1) && (getSubModeIdFromSubMode(aux2)>=0) ) { ADIFqso.append("" + aux2 + " "); } } nameCol = rec.indexOf("prop_mode"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>1) { ADIFqso.append("" + aux + " "); if (aux == "SAT") { propsat = true; } } //qDebug() << "DataProxy_SQLite::getADIFQSO: PROP_MODE" ; } nameCol = rec.indexOf("sat_name"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); if (!propsat) { ADIFqso.append("SAT "); propsat = false; } } //qDebug() << "DataProxy_SQLite::getADIFQSO: SAT_NAME" ; } nameCol = rec.indexOf("gridsquare"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_gridsquare"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("station_callsign"); if ((nameCol>=0) ) { aux = (query.value(nameCol)).toString(); //qDebug() << "DataProxy_SQLite::getADIFQSO: StationCallSign: " << aux ; if ((util->isValidCall(aux))) { // User selected one station callsign from the log ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("qso_date_off"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); tDateTime = util->getDateTimeFromSQLiteString(aux); if (tDateTime.isValid()) { aux = util->getADIFDateFromQDateTime(tDateTime); ADIFqso.append("" + aux + " "); aux = util->getADIFTimeFromQDateTime(tDateTime); ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("srx"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("srx_string"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("stx"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("stx_string"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } //qDebug() << "DataProxy_SQLite::getADIFQSO - 100"; nameCol = rec.indexOf("cqz"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())>0) && (0 < aux.toInt()) && (aux.toInt() < CQZones+1) ) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("ituz"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())>0) && (0 < aux.toInt()) && (aux.toInt() < ITUZones+1) ) { ADIFqso.append("" + aux + " "); } //qDebug() << "DataProxy_SQLite::getADIFQSO: DXCC - Now..." ; } nameCol = rec.indexOf("dxcc"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); //qDebug() << "DataProxy_SQLite::getADIFQSO: DXCC " << aux; } //qDebug() << "DataProxy_SQLite::getADIFQSO: DXCC - Exported!" ; } nameCol = rec.indexOf("address"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("age"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("cnty"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("comment"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } //qDebug() << "DataProxy_SQLite::getADIFQSO - 200"; } nameCol = rec.indexOf("a_index"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("ant_az"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("ant_el"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("ant_path"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("arrl_sect"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("checkcontest"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } //qDebug() << "DataProxy_SQLite::getADIFQSO - 30"; nameCol = rec.indexOf("class"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("cont"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("contacted_op"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (util->isValidCall(aux)) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("contest_id"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("country"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("credit_submitted"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("credit_granted"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("distance"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("darc_dok"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("eq_call"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (util->isValidCall(aux)) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("email"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { if (aux.contains("@") && (aux.contains("."))) { ADIFqso.append("" + aux + " "); } } } nameCol = rec.indexOf("eqsl_qslrdate"); QDate date; if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("eqsl_qslsdate"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("eqsl_qsl_rcvd"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())==1) && (aux!="N") ) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("eqsl_qsl_sent"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())==1) && (aux!="N") ) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("fists"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("fists_cc"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("force_init"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("hrdlog_qso_upload_date"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("hrdlog_qso_upload_status"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( util->isValidUpload_Status(aux)) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_antenna"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_dxcc"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_fists"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("iota"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); //qDebug() << "DataProxy_SQLite::getADIFQSO (IOTA): " << aux; if (((aux.length())>=4) && ((aux.length())<=6)) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("iota_island_id"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); //qDebug() << "DataProxy_SQLite::getADIFQSO (IOTA_ID): " << aux; if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_iota"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (((aux.length())>=4) && ((aux.length())<=6)) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_iota_island_id"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("k_index"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_itu_zone"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("lat"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("lon"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_lat"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_lon"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("lotw_qslrdate"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("lotw_qslsdate"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("lotw_qsl_rcvd"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())==1) && (aux!="N") ) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("lotw_qsl_sent"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())==1) && (aux!="N") ) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("clublog_qso_upload_date"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("clublog_qso_upload_status"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())==1) && ((aux=="Y") || (aux=="N") || (aux=="M")) ) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("qrzcom_qso_upload_date"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("qrzcom_qso_upload_status"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( util->isValidUpload_Status(aux)) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("max_bursts"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("ms_shower"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_city"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_cnty"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_country"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_cq_zone"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.toInt()>0) && (aux.toInt()<41)) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_name"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("name"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("operator"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (util->isValidCall(aux)) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("owner_callsign"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (util->isValidCall(aux)) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_postal_code"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_rig"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_sig"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_sota_ref"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_postal_code"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_state"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_street"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("notes"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { aux.replace("\n", "---"); ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("nr_bursts"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("nr_pings"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("pfx"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("precedence"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("public_key"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("qslmsg"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("qslrdate"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("qslsdate"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("qsl_rcvd"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (((aux.length())==1) && (aux!="N") ) { ADIFqso.append("" + aux + " "); nameCol = rec.indexOf("qsl_rcvd_via"); aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())==1) { ADIFqso.append("" + aux + " "); } } } nameCol = rec.indexOf("qsl_sent"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (((aux.length())==1) && (aux!="N") ) { ADIFqso.append("" + aux + " "); nameCol = rec.indexOf("qsl_sent_via"); aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())==1) { ADIFqso.append("" + aux + " "); } } } nameCol = rec.indexOf("qsl_via"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("qso_complete"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("qso_random"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("qth"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("rst_sent"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("rst_rcvd"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("region"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("rig"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("rx_pwr"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (((aux.length())>0) && (aux.toDouble()>0) ) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("tx_pwr"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())>0) && (aux.toDouble()>0)) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("sat_mode"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("sfi"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("sig"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("sig_info"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("silent_key"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("skcc"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("sota_ref"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("state"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("swl"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("ten_ten"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("ten_ten"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("uksmg"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("ve_prov"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_usaca_counties"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("usaca_counties"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("vucc_grids"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("my_vucc_grids"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("web"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ ADIFqso.append("" + aux + " "); } } nameCol = rec.indexOf("lognumber"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { ADIFqso.append("" + aux + " "); } } ADIFqso.append(""); return ADIFqso; } bool DataProxy_SQLite::showInvalidCallMessage(const QString &_call){ QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - Invalid call detected")); QString aux = _call; if (aux.length()<1) { aux = QString(tr("An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported ADIF record?")); } else { aux = QString(tr("An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log?").arg(aux)); } msgBox.setText(aux); msgBox.setInformativeText(tr("Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid.")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked return true; case QMessageBox::No: // No Save was clicked return false; default: // should never be reached return false; } } QList DataProxy_SQLite::getSatDXCCStats(int _log) { //qDebug() << Q_FUNC_INFO << ": log = " << QString::number(_log); QList _qsos; QString stringQuery; if (doesThisLogExist(_log)) { //qDebug() << Q_FUNC_INFO << ": log exists " ; stringQuery = QString("SELECT call, qso_date, band.name, mode.name, entity.name, log.dxcc, lotw_qsl_rcvd, qsl_rcvd, sat_name from log, entity, band, mode where log.dxcc <>'' AND sat_name <>'' AND log.dxcc=entity.dxcc AND log.bandid=band.id AND log.modeid=mode.id AND lognumber='%1' ORDER BY entity.name").arg(_log); } else { //qDebug() << Q_FUNC_INFO << ": log does not exist " ; stringQuery = QString("SELECT call, qso_date, band.name, mode.submode, entity.name, log.dxcc, lotw_qsl_rcvd, qsl_rcvd, sat_name from log, entity, band, mode where log.dxcc <>'' AND sat_name <>'' AND log.dxcc=entity.dxcc AND log.bandid=band.id AND log.modeid=mode.id ORDER BY entity.name"); } QSqlQuery query; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { //qDebug() << Q_FUNC_INFO << ": Query NOK"; //qDebug() << Q_FUNC_INFO << ": " << query.lastError().databaseText(); //qDebug() << Q_FUNC_INFO << ": " << query.lastQuery(); emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return _qsos; } else { while(query.next()) { if (query.isValid()) { int nameCol; QSO *_qso = new QSO; _qso->clear(); QSqlRecord rec = query.record(); nameCol = rec.indexOf("call"); _qso->setCall((query.value(nameCol)).toString()); nameCol = rec.indexOf("qso_date"); _qso->setDateTimeOn (util->getDateTimeFromSQLiteString((query.value(nameCol)).toString())); nameCol = rec.indexOf("bandid"); //qDebug() << "DataProxy_SQLite::getGridStats: bandid" << QString::number((query.value(nameCol)).toInt()); _qso->setBand(query.value(nameCol).toString()); //nameCol = rec.indexOf("modeid"); //qDebug() << Q_FUNC_INFO << ": modeid" << QString::number((query.value(nameCol)).toInt()); _qso->setMode(getNameFromSubMode (query.value(3).toString())); _qso->setSubmode(query.value(3).toString()); nameCol = rec.indexOf("sat_name"); _qso->setSatName((query.value(nameCol)).toString()); nameCol = rec.indexOf("log.dxcc"); _qso->setDXCC((query.value(nameCol)).toInt()); nameCol = rec.indexOf("lotw_qsl_rcvd"); _qso->setLoTWQSL_RCVD((query.value(nameCol)).toString()); nameCol = rec.indexOf("qsl_rcvd"); _qso->setQSL_RCVD((query.value(nameCol)).toString()); _qsos.append(_qso); } else { _qsos.clear(); query.finish(); return _qsos; } } } //qDebug() << Q_FUNC_INFO << "- END"; return _qsos; } QList DataProxy_SQLite::getGridStats(int _log) { //qDebug() << Q_FUNC_INFO << ": log = " << QString::number(_log); QList _qsos; QString stringQuery; if (doesThisLogExist(_log)) { //qDebug() << Q_FUNC_INFO << ":: log exists " ; stringQuery = QString("SELECT call, substr(gridsquare, 1, 4), bandid, modeid, lotw_qsl_rcvd, qsl_rcvd from log where gridsquare <>'' AND lognumber='%1'").arg(_log); } else { //qDebug() << Q_FUNC_INFO << ": log does not exist " ; stringQuery = QString("SELECT call, substr(gridsquare, 1, 4), bandid, modeid, lotw_qsl_rcvd, qsl_rcvd from log where gridsquare <>''"); } QSqlQuery query; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { //qDebug() << Q_FUNC_INFO << ": Query NOK"; //qDebug() << Q_FUNC_INFO << ": " << query.lastError().databaseText(); //qDebug() << Q_FUNC_INFO << ": " << query.lastQuery(); emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return _qsos; } else { while(query.next()) { if (query.isValid()) {// call, substr(gridsquare, 1, 4), bandid, modeid, lotw_qsl_rcvd, qsl_rcvd int nameCol; QSO *_qso = new QSO; _qso->clear(); QSqlRecord rec = query.record(); nameCol = rec.indexOf("call"); _qso->setCall((query.value(nameCol)).toString()); nameCol = rec.indexOf("substr(gridsquare, 1, 4)"); _qso->setGridSquare((query.value(nameCol)).toString()); nameCol = rec.indexOf("bandid"); //qDebug() << Q_FUNC_INFO << ": bandid" << QString::number((query.value(nameCol)).toInt()); _qso->setBand(getNameFromBandId((query.value(nameCol)).toInt())); nameCol = rec.indexOf("modeid"); //qDebug() << Q_FUNC_INFO << ": modeid" << QString::number((query.value(nameCol)).toInt()); _qso->setMode(getNameFromModeId((query.value(nameCol)).toInt())); _qso->setSubmode (getSubModeFromId ((query.value(nameCol)).toInt())); nameCol = rec.indexOf("lotw_qsl_rcvd"); _qso->setLoTWQSL_RCVD((query.value(nameCol)).toString()); nameCol = rec.indexOf("qsl_rcvd"); _qso->setQSL_RCVD((query.value(nameCol)).toString()); _qsos.append(_qso); //qDebug() << Q_FUNC_INFO << ": call: " << _call; //qDebug() << Q_FUNC_INFO << ": band: " << _band; //qDebug() << Q_FUNC_INFO << ": mode: " << _mode; } else { _qsos.clear(); query.finish(); return _qsos; } } //qDebug() << "DataProxy_SQLite::addQSO: Query OK"; } //qDebug() << "DataProxy_SQLite::getGridStats - END"; return _qsos; } QList DataProxy_SQLite::getSatGridStats(int _log) { //qDebug() << "DataProxy_SQLite::getGridStats: log = " << QString::number(_log); QList _qsos; QString stringQuery; if (doesThisLogExist(_log)) { //qDebug() << "DataProxy_SQLite::getGridStats: log exists " ; stringQuery = QString("SELECT call, qso_date, bandid, modeid, substr(gridsquare, 1, 4), lotw_qsl_rcvd, qsl_rcvd, sat_name from log where gridsquare <>'' AND sat_name <>'' AND lognumber='%1'").arg(_log); } else { //qDebug() << "DataProxy_SQLite::getGridStats: log does not exist " ; stringQuery = QString("SELECT call, qso_date, bandid, modeid, substr(gridsquare, 1, 4), lotw_qsl_rcvd, qsl_rcvd, sat_name from log where gridsquare <>'' AND sat_name <>''"); } QSqlQuery query; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { //qDebug() << "DataProxy_SQLite::getGridStats: Query NOK"; //qDebug() << "DataProxy_SQLite::getGridStats: " << query.lastError().databaseText(); //qDebug() << "DataProxy_SQLite::getGridStats: " << query.lastQuery(); emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return _qsos; } else { while(query.next()) { if (query.isValid()) { int nameCol; QSO *_qso = new QSO; _qso->clear(); QSqlRecord rec = query.record(); nameCol = rec.indexOf("call"); _qso->setCall((query.value(nameCol)).toString()); nameCol = rec.indexOf("qso_date"); _qso->setDateTimeOn (util->getDateTimeFromSQLiteString((query.value(nameCol)).toString())); nameCol = rec.indexOf("bandid"); //qDebug() << "DataProxy_SQLite::getGridStats: bandid" << QString::number((query.value(nameCol)).toInt()); _qso->setBand(getNameFromBandId((query.value(nameCol)).toInt())); nameCol = rec.indexOf("modeid"); //qDebug() << "DataProxy_SQLite::getGridStats: modeid" << QString::number((query.value(nameCol)).toInt()); _qso->setMode(getNameFromModeId((query.value(nameCol)).toInt())); _qso->setSubmode(getSubModeFromId((query.value(nameCol)).toInt())); nameCol = rec.indexOf("sat_name"); _qso->setSatName((query.value(nameCol)).toString()); nameCol = rec.indexOf("substr(gridsquare, 1, 4)"); _qso->setGridSquare((query.value(nameCol)).toString()); nameCol = rec.indexOf("lotw_qsl_rcvd"); _qso->setLoTWQSL_RCVD((query.value(nameCol)).toString()); nameCol = rec.indexOf("qsl_rcvd"); _qso->setQSL_RCVD((query.value(nameCol)).toString()); _qsos.append(_qso); //qDebug() << "DataProxy_SQLite::getGridStats: call: " << _call; //qDebug() << "DataProxy_SQLite::getGridStats: band: " << _band; //qDebug() << "DataProxy_SQLite::getGridStats: mode: " << _mode; } else { _qsos.clear(); query.finish(); return _qsos; } } //qDebug() << "DataProxy_SQLite::addQSO: Query OK"; } //qDebug() << "DataProxy_SQLite::getGridStats - END"; return _qsos; } int DataProxy_SQLite::getFieldInBand(ValidFieldsForStats _field, const QString &_band, bool confirmedOnly, QString _mode, int _log) { //qDebug() << Q_FUNC_INFO << ": " << _band << "/" << _mode << "/" << QString::number(_log) ; if ((!doesThisLogExist(_log)) && !(_log == -1)) { //qDebug() << Q_FUNC_INFO << ": Exit no log"; return 0; } int bandId = getIdFromBandName (_band); QString bandString = QString(); if (!(_band.toUpper () == "ALL")) { if (bandId<1) { //qDebug() << Q_FUNC_INFO << ": Exit band"; return 0; } bandString = QString(" AND bandid='%1'").arg(bandId); } QString field = QString(); QString specialField = QString(); switch (_field) { case DXCC: field = "dxcc"; specialField = field + " <>'' AND dxcc<1000 AND dxcc>0"; break; case GridSquare: field = "gridsquare"; specialField = field + " <>''"; break; } QString stringQuery; QSqlQuery query; QString modeString = QString(); int modeId = getIdFromModeName(_mode); if (_mode.toUpper() == "ALL") { //qDebug() << Q_FUNC_INFO << ": ALL Modes" ; } else if (util->isValidModeId(modeId)) { //qDebug() << Q_FUNC_INFO << ": Valid Mode" ; modeString = QString(" AND modeid='%1' ").arg(modeId); } else { //qDebug() << Q_FUNC_INFO << ": Mode not valid!" ; return 0; } QString logString = QString(); if (!(_log == -1)) { logString = QString(" AND lognumber='%1'").arg(_log); } QString confirmedString = QString(); if (confirmedOnly) { confirmedString = QString(" AND (lotw_qsl_rcvd='Y' OR qsl_rcvd='Y')"); } stringQuery = QString("SELECT COUNT (DISTINCT %1) from log WHERE %2 %3 %4 %5 %6").arg(field).arg(specialField).arg(modeString).arg(bandString).arg(confirmedString).arg(logString); //qDebug() << Q_FUNC_INFO << " : Query: " << stringQuery; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { //qDebug() << Q_FUNC_INFO << " : Query NOK"; //qDebug() << Q_FUNC_INFO << " : " << query.lastError().databaseText(); //qDebug() << Q_FUNC_INFO << " : " << query.lastQuery(); emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); query.finish(); return 0; } else { query.next(); if (query.isValid()) { //qDebug() << Q_FUNC_INFO << " : " << QString::number((query.value(0)).toInt()); int v = (query.value(0)).toInt(); query.finish(); return v; } } query.finish(); return 0; } int DataProxy_SQLite::addQSOQuery(const QSqlQuery &_q) { QSqlQuery query = _q; if (query.exec ()) { //qDebug() << Q_FUNC_INFO << " - QSO Added!"; return 1; } else { //qDebug() << Q_FUNC_INFO << " - QSO NOT Added!"; //qDebug() << Q_FUNC_INFO << " - Error: " << query.lastError ().databaseText (); //qDebug() << Q_FUNC_INFO << " - Error text: " << query.lastError ().text (); //qDebug() << Q_FUNC_INFO << " - Error query: " << query.lastQuery (); return -1; } } int DataProxy_SQLite::addQSO(QSO &_qso) {//TODO: Check if I can simply remove this function //qDebug() << "DataProxy_SQLite::addQSO: " << _qso.getCall(); qso = &_qso; //qDebug() << "DataProxy_SQLite::addQSO: " << qso->getCall(); QString stringQuery = QString("INSERT INTO log (qso_date, call) VALUES (:qso_date, :call)"); QSqlQuery query; query.prepare(stringQuery); query.bindValue (":qso_date", qso->getDate ()); /* queryString = "SELECT COUNT(DISTINCT id) FROM log WHERE prop_mode=:prop_mode"; if (!query.prepare(queryString)) {return 0;} query.bindValue(":prop_mode", _p); */ //stringQuery = "INSERT INTO log (" + stringFields + ") values (" + stringData +")" ; bool havePropMode = false; bool haveRSTRX = false; bool haveRSTTX = false; QString stringFields, stringData; stringFields.clear(); stringData.clear(); //qDebug() << "DataProxy_SQLite::addQSO: QDateTime: " << util->getDateTimeSQLiteStringFromDateTime(qso->getDateTimeOn()) ; if (qso->getDateTimeOn().isValid()) { stringFields.append("qso_date, "); stringData = stringData + "'" + util->getDateTimeSQLiteStringFromDateTime(qso->getDateTimeOn()) + "', "; } else { //qDebug() << "DataProxy_SQLite::addQSO: END-1"; return -1; } if (util->isValidCall(qso->getCall())) { stringFields.append("call, "); stringData = stringData + "'" + qso->getCall() + "', "; } else { //qDebug() << "DataProxy_SQLite::addQSO: END-2"; return -2; } //qDebug() << "DataProxy_SQLite::addQSO: Band: " << qso->getBand(); if (util->isValidBandId(getIdFromBandName(qso->getBand()))) { stringFields.append("bandid, "); stringData = stringData + "'" + QString::number(getIdFromBandName(qso->getBand())) + "', "; } else { //qDebug() << "DataProxy_SQLite::addQSO: END-3"; return -3; } if (util->isValidModeId(getIdFromModeName(qso->getMode()))) { stringFields.append("modeid, "); stringData = stringData + "'" + QString::number(getIdFromModeName(qso->getMode())) + "', "; } else { //qDebug() << "DataProxy_SQLite::addQSO: END-4"; return -4; } if (util->isValidBandId(getIdFromBandName(qso->getBandRX()))) { stringFields.append("band_rx, "); stringData = stringData + "'" + QString::number(getIdFromBandName(qso->getBandRX())) + "', "; } if (qso->getFreqTX () > 0) { stringFields.append("freq, "); stringData = stringData + "'" + QString::number(qso->getFreqTX()) + "', "; } if (qso->getFreqRX() > 0) { stringFields.append("freq_rx, "); stringData = stringData + "'" + QString::number(qso->getFreqRX()) + "', "; } if (util->isValidCall(qso->getStationCallsign())) { stringFields.append("station_callsign, "); stringData = stringData + "'" + qso->getStationCallsign() + "', "; } if (qso->getQSLRDate().isValid()) { stringFields.append("qslrdate, "); stringData = stringData + "'" + util->getDateSQLiteStringFromDate(qso->getQSLRDate()) + "', "; } //qDebug() << "DataProxy_SQLite::addQSO: getQSL_RCVD: " << qso->getQSL_RCVD(); if (util->isValidQSL_Rcvd(qso->getQSL_RCVD())) { //qDebug() << "DataProxy_SQLite::addQSO: getQSL_RCVD: VALID " ; stringFields.append("qsl_rcvd, "); stringData = stringData + "'" + qso->getQSL_RCVD() + "', "; } else { //qDebug() << "DataProxy_SQLite::addQSO: getQSL_RCVD: NOT valid" ; } //qDebug() << "DataProxy_SQLite::addQSO: LOTW_QSL_RCVD: " << qso->getLoTWQSL_RCVD() ; if (util->isValidQSL_Rcvd(qso->getLoTWQSL_RCVD())) { //qDebug() << "DataProxy_SQLite::addQSO: LOTW_QSL_RCVD - VALID" ; stringFields.append("lotw_qsl_rcvd, "); stringData = stringData + "'" + qso->getLoTWQSL_RCVD() + "', "; } else { //qDebug() << "DataProxy_SQLite::addQSO: LOTW_QSL_RCVD - NOT valid" ; } //qDebug() << "DataProxy_SQLite::addQSO: LOTW_QSL_RCVD - END" ; if (qso->getLoTWQSLRDate().isValid()) { stringFields.append("lotw_qslrdate, "); stringData = stringData + "'" + util->getDateSQLiteStringFromDate(qso->getLoTWQSLRDate()) + "', "; } if (util->isValidQSL_Sent (qso->getLoTWQSL_SENT ())) { stringFields.append("lotw_qsl_sent, "); stringData = stringData + "'" + qso->getLoTWQSL_SENT ()+ "', "; } if (qso->getLoTWQSLSDate().isValid()) { stringFields.append("lotw_qslsdate, "); stringData = stringData + "'" + util->getDateSQLiteStringFromDate(qso->getLoTWQSLSDate()) + "', "; } if ( getSatelliteName(qso->getSatName()).length()>0 ) { stringFields.append("sat_name, "); stringData = stringData + "'" + qso->getSatName() + "', "; if (!havePropMode) { havePropMode = true; stringFields.append("prop_mode, "); stringData = stringData + "'SAT', "; } } if ( !havePropMode && (qso->getPropMode().length()>0) ) { stringFields.append("prop_mode, "); stringData = stringData + "'" + qso->getPropMode() + "', "; havePropMode = true; } if (!haveRSTRX) { stringFields.append("rst_rcvd, "); stringData = stringData + "'" + util->getDefaultRST(qso->getMode())+ "', "; } if (!haveRSTTX) { stringFields.append("rst_sent, "); stringData = stringData + "'" + util->getDefaultRST(qso->getMode())+ "', "; } if (qso->getLogId()>0) { stringFields.append("lognumber"); stringData = stringData + QString::number(qso->getLogId()); } else { //qDebug() << "DataProxy_SQLite::addQSO: No LogNumber"; return -2; } stringQuery = "INSERT INTO log (" + stringFields + ") values (" + stringData +")" ; bool sqlOK = query.exec(stringQuery); if (!sqlOK) { //qDebug() << "DataProxy_SQLite::addQSO: Query NOK"; //qDebug() << "DataProxy_SQLite::addQSO: " << query.lastError().databaseText(); //qDebug() << "DataProxy_SQLite::addQSO: " << query.lastQuery(); emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); return -1; } else { //qDebug() << "DataProxy_SQLite::addQSO: Query OK"; } //qDebug() << "DataProxy_SQLite::addQSO: " << stringQuery; return getLastQSOid(); //return 1; } void DataProxy_SQLite::slotCaptureDebugLogs(const QString &_func, const QString &_msg, DebugLogLevel _l) { logEvent(_func, _msg, _l); } klog-2.3.3/awarddxmarathon.h0000644000015700001710000000444414542412415015700 0ustar jenkinsjenkins#ifndef KLOG_AWARDDXMARATHON_H #define KLOG_AWARDDXMARATHON_H /*************************************************************************** awarddxmarathon.h - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "dataproxy_sqlite.h" class DXMarathon { public: DXMarathon(DataProxy_SQLite *dp); int getDXMarathonQSO(const int _year, const int _logNumber); int getDXMarathonDXCC(const int _year, const int _logNumber); int getDXMarathonCQ(const int _year, const int _logNumber); int getDXMarathonScore(const int _year, const int _logNumber); bool neededForDXMarathon(const int _dxcc, const int _cq, const int _year, const int _logNumber); private: DataProxy_SQLite *dataProxy; }; #endif // AWARDDXMARATHON_H klog-2.3.3/searchmodel.cpp0000644000015700001710000001655514542412415015343 0ustar jenkinsjenkins/*************************************************************************** searchmodel.cpp - description ------------------- begin : sep 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "searchmodel.h" SearchModel::SearchModel(DataProxy_SQLite *dp, QObject *parent):QSqlRelationalTableModel(parent) { //qDebug() << "SearchModel::SearchModel " ; dataProxy = dp; stationCallsignInHeader = true; setTable("log"); setEditStrategy(QSqlTableModel::OnFieldChange); dxcc = -1; bandid = -1; modeid = -1; logn = -1; award = new Awards(dataProxy, Q_FUNC_INFO); //qDebug() << "SearchModel::SearchModel: Rows obtained: " << QString::number(rowCount()) ; //qDebug() << "SearchModel::SearchModel - END" ; } SearchModel::~SearchModel() { delete(dataProxy); delete(award); } void SearchModel::setDXCCColumn(const int _i) { dxcc = _i; } void SearchModel::setBandIdColumn(const int _i) { bandid = _i; } void SearchModel::setModeIdColumn(const int _i) { modeid = _i; } void SearchModel::setLogNColumn(const int _i) { logn = _i; } void SearchModel::createSearchModel(const int _i) { /* Log_Id = 0, Log_Name = 1, Log_BandId = 2, Log_ModeId = 3, Log_DateId = 4, Log_TimeId = 5 setRelation ( int column, const QSqlRelation & relation ) model->setTable("employee"); model->setRelation(2, QSqlRelation("city", "id", "name")); The setRelation() call specifies that column 2 in table employee is a foreign key that maps with field id of table city, and that the view should present the city's name field to the user. */ /* This should be coherent with the treeview */ //qDebug() << "SearchModel::createSearchModel: log: " << QString::number(_i); //QString contestMode = dataProxy->getLogTypeOfUserLog(_i); QString stringQuery = QString("lognumber='%1'").arg(_i); QSqlQuery query(stringQuery); setFilter(stringQuery); //setColumnsToDX(); select(); } void SearchModel::setStationCallsignInHeader(const bool _s) { stationCallsignInHeader = _s; } /* void SearchModel::setColumnsToDX() { //qDebug() << "SearchModel::setColumnsToDX" ; QSqlQuery q; //QString stringQuery = QString("SELECT call, qso_date, bandid, modeid, qsl_sent, qsl_rcvd, station_callsign, id FROM log LIMIT 1"); QString stringQuery = QString("SELECT * FROM log _dateLIMIT 1"); QSqlRecord rec; // = q.record(); int nameCol; bool sqlOK = q.exec(stringQuery); if (!sqlOK) { emit queryError(Q_FUNC_INFO, q.lastError().databaseText(), q.lastError().nativeErrorCode(), q.lastQuery()); } q.next(); rec = q.record(); // Number of columns //qDebug() << "SearchModel::createSearchModel - query: " << q.lastQuery(); //qDebug() << "SearchModel::createSearchModel - columns: " << QString::number(rec.count()); nameCol = rec.indexOf("bandid"); setRelation(nameCol, QSqlRelation("band", "id", "name")); nameCol = rec.indexOf("modeid"); setRelation(nameCol, QSqlRelation("mode", "id", "submode")); nameCol = rec.indexOf("qso_date"); setHeaderData(nameCol, Qt::Horizontal, tr("Date/Time")); nameCol = rec.indexOf("call"); setHeaderData(nameCol, Qt::Horizontal,tr("Call")); nameCol = rec.indexOf("bandid"); setHeaderData(nameCol, Qt::Horizontal, tr("Band")); nameCol = rec.indexOf("modeid"); setHeaderData(nameCol, Qt::Horizontal, tr("Mode")); nameCol = rec.indexOf("qsl_sent"); setHeaderData(nameCol, Qt::Horizontal, tr("QSL Sent")); nameCol = rec.indexOf("qsl_rcvd"); setHeaderData(nameCol, Qt::Horizontal, tr("QSL Rcvd")); if (stationCallsignInHeader) { nameCol = rec.indexOf("station_callsign"); setHeaderData(nameCol, Qt::Horizontal, tr("Station Callsign")); } nameCol = rec.indexOf("id"); //setHeaderData(nameCol, Qt::Horizontal, tr("ID")); setSort(nameCol, Qt::AscendingOrder); } */ void SearchModel::setFilterString(const QString &_st) { //qDebug() << "SearchModel::setFilterString: " << _st; setFilter(_st); select(); //qDebug() << "SearchModel::setFilterString: SelectStatement: " << selectStatement (); } void SearchModel::update() { select(); } void SearchModel::setColors (const QString &_newOne, const QString &_needed, const QString &_worked, const QString &_confirmed, const QString &_default) { //qDebug() << "DXClusterWidget::setColors: " << _newOne << "/" << _needed << "/" << _worked << "/" << _confirmed << "/" << _default; // Just to pass the colors to the awards class award->setColors(_newOne, _needed, _worked, _confirmed, _default); } QVariant SearchModel::data( const QModelIndex &index, int role ) const { if ( index.isValid() && role == Qt::ForegroundRole ) { if ( index.column() == 2 ) { //QString _qrz = data(index, Qt::DisplayRole).toString(); //From Search QSO to QSL: q << _call << bandid << _mode << QString::number(currentLog); QString _dxcc = index.siblingAtColumn(dxcc).data().toString(); QString _bandid = index.siblingAtColumn(bandid).data().toString(); QString _modeid = index.siblingAtColumn(modeid).data().toString(); QString _log = index.siblingAtColumn(logn).data().toString(); QStringList qs; qs.clear(); qs << _dxcc << QString::number(dataProxy->getIdFromBandName(_bandid)) << "-1" << _log ; //spotBand = QString::number(world->getBandIdFromFreq( dxFrequency ) ); //qs << QString::number(dxEntity) << spotBand << "-1" << QString::number(currentLog) ; return QVariant( award->getQRZDXStatusColor(qs) ); // return QVariant( QColor( Qt::red ) ); } return QVariant( QColor( Qt::black ) ); } return QSqlRelationalTableModel::data( index, role ); } klog-2.3.3/searchwidget.h0000644000015700001710000001500514542412415015160 0ustar jenkinsjenkins#ifndef KLOG_SEARCHWIDGET_H #define KLOG_SEARCHWIDGET_H /*************************************************************************** searchwidget.h - description ------------------- begin : jul 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the search widget // #include #include #include "dataproxy_sqlite.h" #include "awards.h" #include "world.h" #include "utilities.h" #include "filemanager.h" #include "searchwindow.h" class SearchWidget : public QWidget { Q_OBJECT public: explicit SearchWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~SearchWidget(); void setCurrentLog(const int _log); //void setColors (const QString &_newOne, const QString &_needed, const QString &_worked, const QString &_confirmed, const QString &_default); void setVersion (const QString &_version); // Defines the KLog version to be written in the exported logs void setShowCallInSearch(const bool _sh); void clear(); void showQSO(const int _q); void showQSOs(QList qsoIdList); void setStationCallsign(const QString &_st); void setCallToSearch (const QString &_st); void searchToolNeededQSLToSend(); void setColors (const QString &_newOne, const QString &_needed, const QString &_worked, const QString &_confirmed, const QString &_default); void refresh(); public slots: void slotSearchBoxTextChanged(); void slotToolSearchRequestedQSLToSend(); void slotToolSearchNeededQSLPendingToReceive(); void slotToolSearchNeededQSLRequested(); private slots: //void slotDoubleClickSearch( QTreeWidgetItem* item, int); // Double click on a QSO in the search box void slotSearchExportButtonClicked(); void slotSearchBoxSelectAllButtonClicked(); void slotSearchClearButtonClicked(); void slotSearchBoxSelectionChanged(); void slotSearchBoxReSearchButtonClicked(); //void slotRightButtonSearch(const QPoint& pos); //void showMenuRightButtonSearchCreateActions(); //void rightButtonSearchMenu(const int trow); void slotQsoDeleteFromSearch(const int _qsoId); //void slotQSLSentViaBureauFromSearch(); void slotQSLSentViaDirectFromSearch(); void slotQSLSentViaDirectMarkDXReqFromSearch(); //void slotQSLSentViaBureuMarkDXReqFromSearch(); void slotQSLRecViaDirectFromSearch(); void slotQSLRecViaBureauFromSearch(); //void slotQSLRecViaDirectMarkReqFromSearch(); //void slotQSLRecViaBureauMarkReqFromSearch(); //void slotQSLSentMarkAsRequested(); //void slotQSLRecMarkAsRequested(); void slotQSOToEditFromSearch(const int _qsoId); //void qslRecViaBureauMarkReq(const int _qsoId); // void qslRecViaDirectMarkReq(const int _qsoId); void slotStationCallsignChanged(); void slotQCheckboxToggled(); void slotStartDelayInputTimer(); void slotDelayInputTimedOut(); void slotRequestFocus(); signals: void actionQSODoubleClicked(const int _qsoid); void updateAwards(); void logRefresh(); void toStatusBar(const QString statusm); void requestBeingShown(); void actionQSODelete(const int _qsoid); void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution private: void createUI(); void setNeedingQSL(bool const _q); void selectStationCallSign(); void fillStationCallsignComboBox(); void setModelFilter(); // The following function is adding a line to the search list //void addQSOToSearchList(const QString &_call, const QString &_dateTime, const QString &_band, const QString &_mode, const QString &_qslrx, const QString &_qsltx, const QString &_stationcallsign, const QString &_id, const QColor _color); bool fillTheList(const QString &_query); // void addQSOToTheList(const int _id); QString callFilter, stationCallsignFilter, currentLogFilter; QLineEdit *searchBoxLineEdit; QPushButton *searchBoxClearButton, *searchBoxExportButton, *searchBoxSelectAllButton, *searchBoxReSearchButton; QCheckBox *searchAllQCheckbox; //QTreeWidget *searchResultsTreeWidget; QComboBox *stationCallsignComboBox; SearchWindow *searchWindow; bool qslingNeeded; bool searchSelectAllClicked, stationCallSignShownInSearch; int currentLog; QString mainStationCallsign; QString lastSearch; DataProxy_SQLite *dataProxy; Awards *awards; World *world; Utilities *util; FileManager *filemanager; QAction *delQSOFromSearchAct; QAction *qsoToEditFromSearchAct; QAction *qslSentViaBureauFromSearchAct; QAction *qslSentViaDirectFromSearchAct; QAction *qslSentViaDirectMarkRcvReqFromSearchAct; QAction *qslSentViaBureauMarkRcvReqFromSearchAct; QAction *qslRecViaBureauFromSearchAct; QAction *qslRecViaDirectFromSearchAct; //QAction *qslRecViaBureauMarkReqFromSearchAct; //QAction *qslRecViaDirectMarkReqFromSearchAct; QAction *qslSentRequestedAct; QAction *qslRecRequestedAct; QTimer *delayInputTimer; }; #endif // SEARCHWIDGET_H klog-2.3.3/filemanager.cpp0000644000015700001710000060611314542412415015322 0ustar jenkinsjenkins/*************************************************************************** filemanager.cpp - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "filemanager.h" //#include FileManager::FileManager(DataProxy_SQLite *dp) //FileManager::FileManager(const QString &_klogDir, const QString &_softVersion, DataBase _db) { //qDebug() << "FileManager::FileManager()-3: Dir(2)" << _klogDir; dataProxy = dp; util = new Utilities(Q_FUNC_INFO); util->setLongPrefixes(dataProxy->getLongPrefixes()); util->setSpecialCalls(dataProxy->getSpecialCallsigns()); util->setCallValidation(false); db = new DataBase(Q_FUNC_INFO, klogVersion, util->getKLogDBFile()); world = new World(dataProxy, Q_FUNC_INFO); awards = new Awards(dataProxy, Q_FUNC_INFO); //qDebug() << "FileManager::FileManager()-3: Dir(2) - END" ; } FileManager::~FileManager() { delete(db); delete(awards); delete(world); } void FileManager::init() { //util->setLongPrefixes(dataProxy->getLongPrefixes()); //util->setSpecialCalls(dataProxy->getSpecialCallsigns()); klogVersion = dataProxy->getSoftVersion(); klogDir = util->getHomeDir(); defaultStationCallsign = QString(); //constrid = 1; //constrid = 2; ignoreUnknownAlways = false; usePreviousStationCallsignAnswerAlways = false; duplicatedQSOSlotInSecs = 15; sendEQSLByDefault = false; dbCreated = false; rstTXDefault = false; rstRXDefault = false; noMoreQso = false; hashLogs.clear(); util->setVersion(klogVersion); } void FileManager::setDuplicatedQSOSlot (const int _secs) { if (_secs >= 0) { duplicatedQSOSlotInSecs = _secs; } } bool FileManager::checkADIFValidFormat(const QStringList &_qs) { QStringList qs = _qs; if (qs.size()!= 2) { //qDebug() << "FileManager::checkADIFValidFormat-0 (not two) "; return false; } QString q0 = qs.at(0); QString q1 = qs.at(1); //qDebug() << "FileManager::checkADIFValidFormat: " << qs.at(0); //qDebug() << "FileManager::checkADIFValidFormat: " << qs.at(1); int len = 0; int i = (qs.at(0)).count(":"); if (i == 2) { // DATE:8:D / 20141020 len = (q0.section(':', 1, 1)).toInt(); } else if (i == 1) { // DATE:8 / 20141020 len = (q0.section(':', 1, 1)).toInt(); } else { //qDebug() << "FileManager::checkADIFValidFormat-1 "; return false; } //i = (qs.at(0)).indexOf(":"); //i = (qs.at(0)).length() - i -1; //qDebug() << "i = " << QString::number(i) << "/" << qs.at(0); //len = ( (qs.at(0)).right(i)).toInt(); //qDebug() << "len = " << QString::number(len); if ( (q1).length() != len ) { //qDebug() << "FileManager::checkADIFValidFormat-2: " << (qs.at(1)) << " - " << QString::number((qs.at(1)).length()) << "/" << QString::number(len); return false; } if (len <= 0) { //qDebug() << "FileManager::checkADIFValidFormat-3 "; return false; } //qDebug() << "FileManager::checkADIFValidFormat-4 (true)"; return true; } bool FileManager::adifLogExport(const QString& _fileName, const int _logN) { //qDebug() << "FileManager::adifLogExport" << _fileName; return adifLogExportToFile(_fileName, _logN, false, false, false); } void FileManager::showError (const QString &_txt) { //qDebug() << Q_FUNC_INFO << ": " << _txt; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - Error")); msgBox.setIcon(QMessageBox::Warning); QString aux = QString(_txt ); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.exec(); } void FileManager::setSendQSLByDefault (const bool _send) { sendEQSLByDefault = _send; } QList FileManager::adifLogExportReturnList(const QString& _fileName, const QString &_callsign, const QString &_grid, const QDate &_startDate, const QDate &_endDate, const int _logN, const ExportMode _em) { //qDebug() << Q_FUNC_INFO << ": Start)" << _fileName << "/" << _callsign << "/ " << _grid; QList qsos; qsos.clear(); if ((!util->isValidCall(_callsign)) && (_callsign != "ALL") && (_callsign !="NOT")) { showError(tr("The selected callsign (%1) is not valid, please check it again to export the log.").arg(_callsign)); return qsos; } noMoreQso = false; if (_logN != -1) { // We will export data from ALL logs. if (!dataProxy->doesThisLogExist(_logN)) { //qDebug() << Q_FUNC_INFO << ": The log does not exist"; showError(tr("The selected log does not exist, please check it again.")); return qsos; } } QString queryStringCount; QString queryString; QString _queryStation; QString _queryGrid; if (_callsign == "NOT") { //qDebug() << Q_FUNC_INFO << ": else: " << _callsign; _queryStation = QString(" ((station_callsign ='') OR (station_callsign IS NULL))"); } else if (_callsign == "ALL") { //qDebug() << Q_FUNC_INFO << ": ALL: " << _callsign; _queryStation = QString(" station_callsign !='ALL'"); } else { //qDebug() << Q_FUNC_INFO << ": ValidCall: " << _callsign; _queryStation = QString(" station_callsign ='%1'").arg(_callsign); } //qDebug() << Q_FUNC_INFO << ": _queryStation: " << _queryStation; if (util->isValidGrid(_grid)) { _queryGrid = QString(" AND my_gridsquare = '%1'").arg(_grid); } else if (_grid == "NOT") { _queryGrid = QString(" AND (my_gridsquare = '' OR my_gridsquare IS NULL)"); } else { _queryGrid = QString(); } QString _queryDateFrom; if (_startDate.isValid()) { _queryDateFrom = QString(" AND qso_date >= '%1'").arg(util->getDateSQLiteStringFromDate(_startDate)); } else { _queryDateFrom = QString(" AND qso_date != '1'"); } QString _queryDateTo; if (_endDate.isValid()) { _queryDateTo = QString(" AND qso_date <= '%1'").arg(util->getDateSQLiteStringFromDate(_endDate.addDays(1))); } else { _queryDateTo = QString(); } QString _queryLog; if (_logN == -1) { _queryLog = QString(" AND logNumber = '%1'").arg(_logN); } else { _queryLog = QString(); } QFile file(_fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) /* Flawfinder: ignore */ { showError(tr("The file %1 can't be opened.").arg(_fileName)); return qsos; } QSqlQuery query; if (_em == ModeLotW) { //qDebug() << Q_FUNC_INFO << ": Exporting for LoTW"; // LoTW Required fields: call sign, UTC Date, UTC time, Mode, Band // LoTW Optional fields: RX band, Frecuency TX, frecuency RX, Propagation mode, Satellite queryStringCount = QString("SELECT COUNT (id) FROM log WHERE") + _queryStation + _queryGrid + QString(" AND lotw_qsl_sent='Q'") + _queryDateFrom + _queryDateTo; queryString = QString("SELECT id, call, freq, bandid, band_rx, freq_rx, modeid, gridsquare, my_gridsquare, qso_date, prop_mode, sat_name, station_callsign FROM log WHERE") + _queryStation + QString(" AND lotw_qsl_sent='Q'") + _queryDateFrom + _queryDateTo; } else if (_em == ModeClubLog) { //qDebug() << Q_FUNC_INFO << ": Exporting for ClubLog"; queryStringCount = QString("SELECT COUNT (id) FROM log WHERE") + _queryStation + QString(" AND clublog_qso_upload_status='M'") + _queryDateFrom + _queryDateTo; queryString = QString("SELECT id, call, rst_sent, rst_rcvd, freq, bandid, band_rx, modeid, qso_date, qsl_rcvd, qslrdate, qslsdate, prop_mode, operator, station_callsign, dxcc, qsl_sent, lotw_qsl_rcvd, credit_granted, notes, qso_date_off FROM log WHERE") + _queryStation + QString(" AND clublog_qso_upload_status='M'") + _queryDateFrom + _queryDateTo; } else if (_em == ModeEQSL) { //qDebug() << Q_FUNC_INFO << ": Exporting for eQSL"; queryStringCount = QString("SELECT COUNT (id) FROM log WHERE") + _queryStation + QString(" AND eqsl_qsl_sent='Q'") + _queryDateFrom + _queryDateTo; queryString = QString("SELECT id, call, rst_sent, freq, bandid, modeid, qso_date, prop_mode, operator, station_callsign, sat_name, my_cnty, my_gridsquare, my_lat, my_lon FROM log WHERE") + _queryStation + QString(" AND eqsl_qsl_sent='Q'") + _queryDateFrom + _queryDateTo; } else { //qDebug() << Q_FUNC_INFO << ": Exporting normal ADIF"; if (_callsign == "ALL") { queryStringCount = QString("SELECT COUNT (id) FROM log"); queryString = QString("SELECT * FROM log"); } else if (_callsign == "NOT") { queryStringCount = QString("SELECT COUNT (id) FROM log WHERE ") + _queryStation + _queryDateFrom + _queryDateTo + _queryLog; queryString = QString("SELECT * FROM log WHERE ") + _queryStation + _queryDateFrom + _queryDateTo + _queryLog; } else { queryStringCount = QString("SELECT COUNT (id) FROM log WHERE") + _queryStation + _queryDateFrom + _queryDateTo + _queryLog; queryString = QString("SELECT * FROM log WHERE") + _queryStation + _queryDateFrom + _queryDateTo + _queryLog; } } //qDebug() << Q_FUNC_INFO << ": Query Count: " << queryStringCount; //qDebug() << Q_FUNC_INFO << ": Query data: " << queryString; int numberOfQsos = dataProxy->getHowManyQSOInLog(_logN); int i = 0; bool sqlOK = query.exec(queryStringCount); //qDebug() << Q_FUNC_INFO << ": " << query.lastQuery(); if (!sqlOK) { //qDebug() << Q_FUNC_INFO << ": Query Error" ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); return qsos; } else { query.next(); if (query.isValid()) { i = (query.value(0)).toInt(); if (i>0) { numberOfQsos = i; query.finish(); } else if (i == 0) { showError(tr("There are no QSOs pending to be exported with that station callsign.")); return qsos; } } } QTextStream out(&file); int step = util->getProgresStepForDialog(numberOfQsos); //qDebug() << Q_FUNC_INFO << ": " << QString::number(step); QProgressDialog progress(tr("Writing ADIF file..."), tr("Abort writing"), 0, numberOfQsos, this); progress.setMaximum(numberOfQsos); progress.setWindowModality(Qt::WindowModal); progress.setValue(0); progress.setWindowTitle(tr("Export")); progress.setAutoClose(true); writeADIFHeader(out, _em, numberOfQsos); i = 0; sqlOK = query.exec(queryString); //qDebug() << Q_FUNC_INFO << ": " << query.lastQuery(); if (!sqlOK) { //qDebug() << Q_FUNC_INFO << ": Query Error" ; emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); return qsos; } QSqlRecord rec = query.record(); int nameCol; //qDebug() << Q_FUNC_INFO << ": Entering the While..." ; while ( (query.next()) && (!noMoreQso) ) { //qDebug() << Q_FUNC_INFO << ": Start of While" ; if (query.isValid()) { nameCol = rec.indexOf("id"); qsos.append((query.value(nameCol)).toInt()); writeQuery(query, out, _em, false, false, _logN); // JustMarked = false, onlyRequested = false i++; //qDebug() << Q_FUNC_INFO << ": Start of isValid" ; } // END of if (query.isValid()) else { //qDebug() << Q_FUNC_INFO << ": Querty NOT isValid" ; } //qDebug() << Q_FUNC_INFO << ": Checking if cancelled" ; if (( (i % step ) == 0) ) { // To update the speed I will only show the progress once each X QSOs //qDebug() << Q_FUNC_INFO << ": ******************************** UPDATING THE MESSAGE! " << QString::number(i) ; QString aux = tr("Exporting ADIF file...\n QSO: %1 / %2 ").arg(i).arg(numberOfQsos); progress.setLabelText(aux); progress.setValue(i); //qDebug() << Q_FUNC_INFO << ": ******************************** UPDATING THE MESSAGE: " << aux ; } if ( progress.wasCanceled() ) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - User cancelled")); QString aux = QString(tr("You have canceled the file export. The file will be removed and no data will be exported.") + "\n" + tr("Do you still want to cancel?")); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked noMoreQso = true; qsos.clear(); progress.setValue(numberOfQsos); return qsos; case QMessageBox::No: // No Save was clicked break; default: // should never be reached break; } } } // END OF WHILE //qDebug() << Q_FUNC_INFO << ": End: " << QString::number(qsos.count()); progress.setValue(numberOfQsos); return qsos; } QList FileManager::adifLogExportReturnList2(const QString& _fileName, const QString &_callsign, QList _qsos, const ExportMode _em, const int _logN) { Q_UNUSED(_logN); //qDebug() << Q_FUNC_INFO << " - Start"; //qDebug() << Q_FUNC_INFO << " - QSOs: " << QString::number(_qsos.length ()); //qDebug() << Q_FUNC_INFO << ": Start)" << _fileName << "/" << _callsign << "/ " << _grid; QList qsos; qsos.clear(); if ((!util->isValidCall(_callsign)) && (_callsign != "ALL") && (_callsign !="NOT")) { showError(tr("The selected callsign (%1) is not valid, please check it again to export the log.").arg(_callsign)); return qsos; } QString queryString; if (_em == ModeLotW) { queryString = QString("call, freq, bandid, band_rx, freq_rx, modeid, gridsquare, my_gridsquare, qso_date, prop_mode, sat_name, station_callsign"); } else if (_em == ModeClubLog) { queryString = QString("call, rst_sent, rst_rcvd, freq, bandid, band_rx, modeid, qso_date, qsl_rcvd, qslrdate, qslsdate, prop_mode, operator, station_callsign, dxcc, qsl_sent, lotw_qsl_rcvd, credit_granted, notes, qso_date_off"); } else if (_em == ModeEQSL) { queryString = QString("call, rst_sent, freq, bandid, modeid, submode, qso_date, prop_mode, operator, station_callsign, sat_name, my_cnty, my_gridsquare, my_lat, my_lon, qslmsg, sat_mode, sat_name"); } else { // THis is ModeADIF and ModeQRZ we will upload ALL the ADIF files queryString = QString("*"); } if (adifQSOsExport2(_fileName, queryString, _qsos, _em)) { return _qsos; } else { return qsos; } //qDebug() << Q_FUNC_INFO << " - END"; return qsos; } bool FileManager::adifQSOsExport(const QString& _fileName, QList _qsos) { //qDebug() << "FileManager::adifQSOsExport: " << _fileName; int numberOfQSOs = _qsos.length(); if (numberOfQSOs<1) { //TODO: Warn the user NO QSOS TO EXPORT //qDebug() << "FileManager::adifQSOsExport: No QSOs received to be exported"; } noMoreQso = false; //qDebug() << "FileManager::adifQSOsExport - 01"; QFile file(_fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) /* Flawfinder: ignore */ return false; //qDebug() << "FileManager::adifQSOsExport - 02"; QTextStream out(&file); QSqlQuery query; //qDebug() << "FileManager::adifQSOsExport - 10"; QString numbers = QString(); foreach (int i, _qsos) { //qDebug() << "FileManager::adifQSOsExport - query: " << QString("id = '%1'").arg(i) ; numbers = numbers + QString::number(i) ; if (i != _qsos.last()) { numbers = numbers + ", "; } } QString queryString = QString("SELECT * FROM log WHERE id IN (%1)").arg(numbers); //qDebug() << "FileManager::adifQSOsExport: writing the header"; writeADIFHeader(out, ModeADIF, _qsos.length()); //qDebug() << "FileManager::adifQSOsExport: writing the body"; bool sqlOK = query.exec(queryString); if (!sqlOK) { //qDebug() << "FileManager::adifQSOsExport: query error: " << query.lastQuery(); emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } //qDebug() << "FileManager::adifQSOsExport: query: " << query.lastQuery(); QProgressDialog progress(tr("Writing ADIF file..."), tr("Abort writing"), 0, numberOfQSOs, this); progress.setMaximum(numberOfQSOs); progress.setWindowModality(Qt::ApplicationModal); progress.setWindowTitle(tr("Export progress")); int currentQso = 0; int step = util->getProgresStepForDialog(numberOfQSOs); while ( (query.next()) && (!noMoreQso) ) { //qDebug() << "FileManager::adifLogExportToFile - Just in the While"; if (query.isValid()) { //qDebug() << "FileManager::adifLogExportToFile - Query is Valid"; writeQuery(query, out, ModeADIF, false, false, -1); } // Closes the isValid else { //qDebug() << "FileManager::adifLogExportToFile - Query is NOT Valid"; } //qDebug() << "FileManager::adifLogExportToFile - before showing progress: " << QString::number(currentQso); currentQso++; if (( (currentQso % step ) == 0) ) { // To update the speed I will only show the progress once each X QSOs //qDebug() << "FileManager::adifLogExportToFile - Showing progress: " ; QString aux1 = tr("Writing ADIF file...\n QSO: ") + QString::number(currentQso) + "/" + QString::number(numberOfQSOs); progress.setLabelText(aux1); progress.setValue(currentQso); } //qDebug() << "FileManager::adifLogExportToFile - after showing progress (current%Step): " << QString::number(currentQso%step); if ( progress.wasCanceled() ) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - User cancelled")); QString aux = QString(tr("You have canceled the file export. The file will be removed and no data will be exported.") + "\n" + tr("Do you still want to cancel?")); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked noMoreQso = true; break; case QMessageBox::No: // No Save was clicked break; default: // should never be reached break; } } } //qDebug() << "FileManager::adifQSOsExport - END"; return true; } bool FileManager::adifQSOsExport2(const QString& _fileName, const QString& _fields, QList _qsos, ExportMode _em) { // The fields are the database fields that are to be selected in the query //qDebug() << Q_FUNC_INFO << " - Start"; int numberOfQSOs = _qsos.length(); if (numberOfQSOs<1) { //TODO: Warn the user NO QSOS TO EXPORT //qDebug() << Q_FUNC_INFO << " - No QSOs received to be exported"; } QString fields = _fields; if (_fields.length ()<1) { fields = "*"; } bool exportAll = false; if ((_qsos.at(0) == -1) && (_qsos.size() == 1)) { numberOfQSOs = dataProxy->getHowManyQSOInLog(-1); exportAll = true; } noMoreQso = false; //qDebug() << Q_FUNC_INFO << " - 01"; QFile file(_fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) /* Flawfinder: ignore */ return false; //qDebug() << Q_FUNC_INFO << " - 02"; QTextStream out(&file); QSqlQuery query; //qDebug() << Q_FUNC_INFO << " - 10"; QString numbers = QString(); foreach (int i, _qsos) { //qDebug() << Q_FUNC_INFO << " - query: " << QString("id = '%1'").arg(i) ; numbers = numbers + QString::number(i) ; if (i != _qsos.last()) { numbers = numbers + ", "; } } QString queryString; if (exportAll) { queryString = QString("SELECT %1 FROM log").arg(fields); } else { queryString = QString("SELECT %1 FROM log WHERE id IN (%2)").arg(fields).arg(numbers); } //qDebug() << Q_FUNC_INFO << " - writing the header"; writeADIFHeader(out, _em, numberOfQSOs); //qDebug() << Q_FUNC_INFO << " - writing the body"; bool sqlOK = query.exec(queryString); if (!sqlOK) { //qDebug() << Q_FUNC_INFO << " -query error: " << query.lastQuery(); emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } //qDebug() << Q_FUNC_INFO << " - query: " << query.lastQuery(); QProgressDialog progress(tr("Writing ADIF file..."), tr("Abort writing"), 0, numberOfQSOs, this); progress.setMaximum(numberOfQSOs); progress.setWindowModality(Qt::ApplicationModal); progress.setWindowTitle(tr("Export progress")); int currentQso = 0; int step = util->getProgresStepForDialog(numberOfQSOs); while ( (query.next()) && (!noMoreQso) ) { //qDebug() << Q_FUNC_INFO << " - Just in the While"; if (query.isValid()) { //qDebug() << Q_FUNC_INFO << " - Query is Valid"; writeQuery(query, out, ModeADIF, false, false, -1); } // Closes the isValid else { //qDebug() << Q_FUNC_INFO << " - Query is NOT Valid"; } //qDebug() << Q_FUNC_INFO << " - before showing progress: " << QString::number(currentQso); currentQso++; if (( (currentQso % step ) == 0) ) { // To update the speed I will only show the progress once each X QSOs //qDebug() << Q_FUNC_INFO << " - Showing progress: " ; QString aux1 = tr("Writing ADIF file...\n QSO: ") + QString::number(currentQso) + "/" + QString::number(numberOfQSOs); progress.setLabelText(aux1); progress.setValue(currentQso); } //qDebug() << Q_FUNC_INFO << " - after showing progress (current%Step): " << QString::number(currentQso%step); if ( progress.wasCanceled() ) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - User cancelled")); QString aux = QString(tr("You have canceled the file export. The file will be removed and no data will be exported.") + "\n" + tr("Do you still want to cancel?")); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked noMoreQso = true; break; case QMessageBox::No: // No Save was clicked break; default: // should never be reached break; } } } //qDebug() << Q_FUNC_INFO << " - END"; return true; } void FileManager::setCallValidation (const bool _b) { //util->setCallValidation(_b); util->setCallValidation(_b); dataProxy->setCallValidation(_b); } bool FileManager::adifLogExportToFile(const QString& _fileName, const int _logN, bool justMarked, bool _qslRequested , bool _lotw) { //adifLogExportToFile(const QString& _fileName, const int _logN=0, bool justMarked = false, bool _qslRequested = false, bool _lotw=false); // If _logN = 0, then we will export ALL the logs. //qDebug() << Q_FUNC_INFO << _fileName; Q_UNUSED(_lotw); bool exportJustMarkedQSO = justMarked; //bool marked = false; bool exportOnlyQSLRequested = _qslRequested; //bool haveMode = false; noMoreQso = false; //qDebug() << Q_FUNC_INFO << " - 10"; QFile file(_fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) /* Flawfinder: ignore */ return false; //qDebug() << Q_FUNC_INFO << " - 11"; QTextStream out(&file); QString aux1, aux2, queryString, bandst, bandrxst; // bandst & bandrxst are to check if the band is properly defined //int nameCol = 0; QSqlQuery query1; int numberOfQsos = 0; int currentQso = 0; noMoreQso = false; int step = 1; //bool propsat=false; // Just to check if we have added the prop_mode needed by LOTW when SAT QSO //bool bandOK = false; // Just to check if the band is properly defined bool exportAll = false; if (_logN <=0) { exportAll = true; } else { exportAll = false; } bandst = QString(); bandrxst = QString(); //qDebug() << Q_FUNC_INFO << " - 20"; if (exportJustMarkedQSO) { //TODO: Count the marked QSO and adjust the numberOfQsos numberOfQsos = 0; QSqlQuery query; if (exportAll) { queryString = QString("SELECT COUNT(id) marked FROM log"); } else { queryString = QString("SELECT COUNT(id) FROM log WHERE lognumber='%1'").arg(_logN); } bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } if (query.next()) { if (query.isValid()) { numberOfQsos = query.value(0).toInt(); } } //qDebug() << "FileManager::adifLogExportToFile - numberOfQsos = " << QString::number(numberOfQsos)<< QT_ENDL; } else { if (exportAll) { aux1 = "SELECT count(id) FROM log"; } else { aux1 = QString("SELECT count(id) FROM log WHERE lognumber='%1'").arg(_logN); } bool sqlOK = query1.exec(aux1); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query1.lastError().databaseText(), query1.lastError().nativeErrorCode(), query1.lastQuery()); } query1.next(); if (query1.isValid()) { numberOfQsos = (query1.value(0)).toInt(); } //qDebug() << "FileManager::adifLogExportToFile - numberOfQsos = " << QString::number(numberOfQsos)<< QT_ENDL; } //qDebug() << Q_FUNC_INFO << " - 30"; //qDebug() << "FileManager::adifLogExportToFile - end get numberOfQsos = " << QString::number(numberOfQsos); step = util->getProgresStepForDialog(numberOfQsos); //qDebug() << Q_FUNC_INFO << " - 31"; //qDebug() << "FileManager::adifLogExportToFile END - Steps = " << QString::number(step); //step = getProgresStepForDialog(numberOfQsos); writeADIFHeader(out, ModeADIF, numberOfQsos); //qDebug() << Q_FUNC_INFO << " - 32"; if (exportAll) { if (justMarked) { queryString = QString("SELECT * FROM log WHERE marked='X'"); } else { queryString = QString("SELECT * FROM log"); } } else { if (justMarked) { queryString = QString("SELECT * FROM log WHERE marked='X' AND lognumber='%1'").arg(_logN); } else { queryString = QString("SELECT * FROM log WHERE lognumber='%1'").arg(_logN); } } //qDebug() << Q_FUNC_INFO << " - 40"; QSqlQuery query; bool sqlOK = query.exec(queryString); if (!sqlOK) { emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } //qDebug() << Q_FUNC_INFO << " - 41"; QProgressDialog progress(tr("Writing ADIF file..."), tr("Abort writing"), 0, numberOfQsos, this); progress.setMaximum(numberOfQsos); progress.setWindowModality(Qt::ApplicationModal); progress.setWindowTitle(tr("Export progress")); QSqlRecord rec = query.record(); QDateTime date; //qDebug() << Q_FUNC_INFO << " - 50"; while ( (query.next()) && (!noMoreQso) ) { //qDebug() << Q_FUNC_INFO << " - 50.1"; if (query.isValid()) { writeQuery(query, out, ModeADIF, exportJustMarkedQSO, exportOnlyQSLRequested, _logN); //qDebug() << Q_FUNC_INFO << " - 50.2"; } // Closes the isValid //qDebug() << "FileManager::adifLogExportToFile - before showing progress: " << QString::number(currentQso); currentQso++; if (( (currentQso % step )== 0) ) { // To update the speed I will only show the progress once each X QSOs //qDebug() << "FileManager::adifLogExportToFile - Showing progress: " ; aux1 = tr("Writing ADIF file...\n QSO: ") + QString::number(currentQso) + "/" + QString::number(numberOfQsos); progress.setLabelText(aux1); progress.setValue(currentQso); //qDebug() << Q_FUNC_INFO << " - 50.3"; } //qDebug() << "FileManager::adifLogExportToFile - after showing progress (current%Step): " << QString::number(currentQso%step); if ( progress.wasCanceled() ) { //qDebug() << Q_FUNC_INFO << " - 50.7"; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - User cancelled")); QString aux = QString(tr("You have canceled the file export. The file will be removed and no data will be exported.") + "\n" + tr("Do you still want to cancel?")); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked noMoreQso = true; break; case QMessageBox::No: // No Save was clicked break; default: // should never be reached break; } } } //Closes the While //qDebug() << Q_FUNC_INFO << " - 60"; //qDebug() << "FileManager::adifLogExportToFile - after the While"; progress.setValue(numberOfQsos); //qDebug() << Q_FUNC_INFO << " - 70"; if (noMoreQso) { //TODO: Remove the file (_fileName) //qDebug() << "FileManager::adifLogExportToFile - noMoreQSO = true"; file.remove(); //qDebug() << Q_FUNC_INFO << " - 70.1"; return false; } else { //qDebug() << "FileManager::adifLogExportToFile - noMoreQSO = false"; //qDebug() << Q_FUNC_INFO << " - 70.2"; return writeBackupDate(); } //qDebug() << Q_FUNC_INFO << " - END"; } bool FileManager::printQs(const QStringList &_line) //bool FileManager::printQs(const QString &_q, const QStringList _line) { QStringList qs = _line; for (int i = 0; i FileManager::adifLoTWReadLog2(const QString& fileName, const int logN) { //qDebug() << Q_FUNC_INFO << " - " << fileName; //QSO qso(Q_FUNC_INFO); QString stationCallSign; stationCallSign.clear(); bool addNewQSOs = false; bool askedToAddNewQSOs = false; QList _qsos; _qsos.clear(); if (!dataProxy->doesThisLogExist(logN)) { //qDebug() << Q_FUNC_INFO << " - : ERROR: The log does not exist: " << QString::number(logN); return _qsos; } //qDebug() << Q_FUNC_INFO << " - - 10" ; //QString fn = "blotw.adi"; QFile file( fileName ); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << Q_FUNC_INFO << " - File not found" << fileName; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - File not opened")); QString aux = QString(tr("It was not possible to open the file %1 for reading.") ).arg(fileName); msgBox.setText(tr("KLog was not able to read the LoTW file")); msgBox.setInformativeText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.exec(); return _qsos; } //qDebug() << Q_FUNC_INFO << " - - 20" ; int numberOfQsos = 0; QString line = QString(); bool hasEOH = false; //qDebug() << Q_FUNC_INFO << " - - 30" ; qint64 pos = file.pos(); //while ( !file.atEnd() && !hasEOH ) while ( !file.atEnd() ) { line = (file.readLine()).toUpper(); if (line.contains("OWNCALL:")) { stationCallSign = (line.section(": ", 1, 1)).simplified(); if (!util->isValidCall(stationCallSign)) { stationCallSign = QString(); } } //qDebug() << Q_FUNC_INFO << " - - line-1: " << line ; numberOfQsos = numberOfQsos + line.count("EOR>"); if ((line.count("")>0) && (!hasEOH)) { //qDebug() << Q_FUNC_INFO << " - - line-1: EOH FOUND!" ; hasEOH = true; pos = file.pos(); } } file.seek(pos); int step = util->getProgresStepForDialog(numberOfQsos); QProgressDialog progress(tr("Processing LoTW ADIF file..."), tr("Abort processing"), 0, numberOfQsos, this); progress.setMaximum(numberOfQsos); progress.setWindowModality(Qt::WindowModal); progress.setValue(0); progress.setWindowTitle(tr("LoTW reading")); progress.setAutoClose(true); //qDebug() << Q_FUNC_INFO << " - - After header while" ; noMoreQso = false; QStringList fields; QSO qso; qso.clear(); int i = 0; while (!file.atEnd() && !noMoreQso) { fields.clear(); line = (file.readLine()).toUpper(); if (line.contains("")) { noMoreQso = true; } fields << line.split("<", QT_SKIP); foreach(QString a, fields) { //qDebug() << Q_FUNC_INFO << " - - Fields: " << a ; QString fullField = "<" + a.trimmed(); if (fullField.contains("")) { if (qso.isValid()) { //qDebug() << Q_FUNC_INFO << " - VALID QSO: "; qso.setLogId(logN); if ((util->isValidCall(stationCallSign)) && (stationCallSign.length ()>0)) { QString aux = QString("%2").arg(QString::number(stationCallSign.length())).arg(stationCallSign); qso.setData(aux); } QList dupeQsos; dupeQsos.clear(); int mode; if (qso.getSubmode().isEmpty()) { mode = dataProxy->getIdFromModeName(qso.getMode()); } else { mode = dataProxy->getSubModeIdFromSubMode(qso.getSubmode()); } dupeQsos << dataProxy->isThisQSODuplicated(Q_FUNC_INFO, qso.getCall(), qso.getDateTimeOn(), dataProxy->getIdFromBandName(qso.getBand()), mode, duplicatedQSOSlotInSecs); if ((dupeQsos.length()<1) && (!askedToAddNewQSOs) ) { askedToAddNewQSOs = true; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - Add new QSOs?")); QString aux = QString(tr("Do you want to add non existing QSOs to your local log?")); msgBox.setText(aux); msgBox.setDetailedText(tr("There are some QSOs in the LoTW log that are not in your local log.")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: addNewQSOs = true; break; case QMessageBox::No: addNewQSOs = false; break; default: // should never be reached break; } } if ((dupeQsos.length()<1) && (addNewQSOs)) { //qDebug() << Q_FUNC_INFO << " - - New QSO ... adding ..." ; qso.setDefaultEQSLSentServices (sendEQSLByDefault); int lastId = dataProxy->addQSO(qso); if (lastId>0) { _qsos.append(lastId); //qDebug() << Q_FUNC_INFO << " - - New QSO ... added ..." ; } } else { //qDebug() << Q_FUNC_INFO << " - - EXisting QSO or not adding, Updating LoTW QSL status to: " << qso.getLoTWQSL_RCVD() ; if (dataProxy->setLoTWQSLRec (dupeQsos.at(0), qso.getLoTWQSL_RCVD(), qso.getLoTWQSLRDate())) { _qsos.append(dupeQsos.at(0)); //qDebug() << Q_FUNC_INFO << " - : Modified QSO: " << QString::number(dupeQsos.at(0)); } } i++; qso.clear(); } } else { qso.setData(fullField); //qDebug() << Q_FUNC_INFO << ": - " << fullField; if (fullField.contains ("getDXCCFromPrefix (qso.getCall ()); //qDebug() << Q_FUNC_INFO << ": DXCC: " << QString::number(_dxcc); if (util->isValidDXCC (_dxcc)) { //qDebug() << Q_FUNC_INFO << ": - Adding a DXCC" ; qso.setDXCC (_dxcc); } } } } if (( (i % step ) == 0) ) { // To update the speed I will only show the progress once each X QSOs //qDebug() << Q_FUNC_INFO << " - : ******************************** UPDATING THE MESSAGE! " << QString::number(i) ; QString aux = tr("Processing LoTW ADIF file......\n QSO: %1 / %2 ").arg(i).arg(numberOfQsos); progress.setLabelText(aux); progress.setValue(i); //qDebug() << Q_FUNC_INFO << " - : ******************************** UPDATING THE MESSAGE: " << aux ; } if ( progress.wasCanceled() ) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - User cancelled")); QString aux = QString(tr("You have canceled the LoTW processing. The process will be stopped and your log may not be completely updated.") + "\n" + tr("Do you still want to cancel?")); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked noMoreQso = true; _qsos.clear(); progress.setValue(numberOfQsos); return _qsos; //return qsos; case QMessageBox::No: // No Save was clicked break; default: // should never be reached break; } } } //qDebug() << Q_FUNC_INFO << " - - END: " << QString::number(_qsos.length ()); return _qsos; } QList FileManager::adifLoTWReadLog(const QString& tfileName, const int logN) { //qDebug() << Q_FUNC_INFO << tfileName; QString fileName = tfileName; QList readed; //QElapsedTimer time1 = QTime::currentTime(); readed.clear(); if (!dataProxy->doesThisLogExist(logN)) { //qDebug() << Q_FUNC_INFO << " - ERROR: The log does not exist: " << QString::number(logN); return readed; } QFile file( fileName ); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << Q_FUNC_INFO << " - File not found" << fileName; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - File not opened")); QString aux = QString(tr("It was not possible to open the file %1 for reading.") ).arg(fileName); msgBox.setText(tr("KLog was not able to read the LoTW file")); msgBox.setInformativeText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.exec(); return readed; } //qso->clear(); QStringList fields, qsToPass; QStringList modifiedQSOList; // This is to emit it so after reading the full file, it is possible to show a qtable showing the QSOs that have been modified. modifiedQSOList.clear(); bool hasEOH = false; int numberOfQsos = 0; int i = 0; //int numberOfQsosLoWTHeader = 0; QString line = QString(); QString auxString = QString(); QString aux = QString(); qint64 pos; //Position in the file bool inHeader = true; pos = file.pos(); fields.clear(); qsToPass.clear(); QDateTime _dateTime; bool alwaysAdd = false; bool alwaysIgnore = false; QString stationCallsign = QString(); //int step = 1; while ( !file.atEnd() ) { line = (file.readLine()).toUpper(); numberOfQsos = numberOfQsos + line.count("EOR>"); if ((line.count("")>0) && (!hasEOH)) { hasEOH = true; } } int step = util->getProgresStepForDialog(numberOfQsos); //847 //qDebug() << Q_FUNC_INFO << " - QSOs found: " << QString::number(numberOfQsos); //qDebug() << Q_FUNC_INFO << " - STEP: " << QString::number(step); QProgressDialog progress(tr("Reading LoTW file..."), tr("Abort reading"), 0, numberOfQsos, this); progress.setWindowModality(Qt::ApplicationModal); progress.setVisible(true); progress.setValue(0); progress.setMaximum(numberOfQsos); //step = util->getProgresStepForDialog(numberOfQsos); file.seek(pos); /* Optional header information may be included before the actual data in the file. To include optional header info, the first character of the file must be something other than <. Any amount of header info of any value except may be included. The header info must be terminated with . Any number of characters of any value except < may follow . The first < after is the start of the first field of the first data record in the file. */ //qDebug() << Q_FUNC_INFO << " - Going to read the HEADER"; //Read HEADER line = file.readLine().trimmed().toUpper(); //qDebug() << Q_FUNC_INFO << line; if ( (!(line.startsWith('<'))) && (inHeader) ) { // The file has a header if (line.contains("")) // To check if the first line contains the EOR but not alone in the line. { inHeader = false; } line.clear(); // We should finish the if with real data in "line" or a clear one. while ( inHeader && hasEOH) { line = file.readLine().trimmed().toUpper(); if (line.contains("OWNCALL:")) { stationCallsign = line.section(": ", 1, 1); if (!util->isValidCall(stationCallsign)) { stationCallsign = QString(); } } if (line.contains("")) { inHeader = false; line.clear(); //TODO: Maybe this clearing deletes a line that may have data... } } pos = file.pos(); } else if (!(line.startsWith('<'))) { // The file does not have any header. // Reading the first QSO... /* Cases: 1.- One big line with several QSO 2.- One QSO uses several lines. - THIS IS USUALLY THE CASE FOR LOTW 3.- Last line of one QSO includes data of the next one */ inHeader = true; while (inHeader) { pos = file.pos(); line = file.readLine().trimmed().toUpper(); if ( (line.startsWith('<')) ) { inHeader = false; line.clear(); //TODO: Maybe this clearing deletes a line that may have data... } } } file.seek(pos); //START reading QSO data... //qDebug() << Q_FUNC_INFO << " - QSO data reading started..." ; QDate _tdate; noMoreQso = false; //time1.start(); while (!noMoreQso ) { if (!file.atEnd()) { line.clear(); line.append(file.readLine().trimmed().toUpper()); if (line.contains("")) { noMoreQso = true; } //line.append(file.readLine().toUpper()); // TODO: Check if we should remove extra spaces,tabs and so on... //qDebug() << Q_FUNC_INFO << " -line:" << line; fields << line.split("<", QT_SKIP); qsToPass.clear(); auxString.clear(); foreach (aux, fields) { aux = aux.trimmed(); if ( (aux.contains('>')) && (auxString.length() > 0) ) { qsToPass.last() = qsToPass.last() + auxString; //qDebug() << Q_FUNC_INFO << " - Modified in qsToPass: " << qsToPass.last(); //qsToPass << aux.trimmed(); //qDebug() << Q_FUNC_INFO << " - Added to qsToPass: " << aux.trimmed(); auxString.clear(); } else if (( aux.contains('>')) && (auxString.length() <= 0) ) { qsToPass << aux.trimmed(); } else { auxString = auxString + "-" + aux.trimmed(); //qDebug() << Q_FUNC_INFO << " - auxString: " << auxString; } //qDebug() << Q_FUNC_INFO << " - fields: " << aux; } if (auxString.length()>0) { //qDebug() << Q_FUNC_INFO << " - auxString2: " << auxString; qsToPass.last() = qsToPass.last() + auxString.trimmed(); } //qDebug() << Q_FUNC_INFO << " - END fields"; //qDebug() << Q_FUNC_INFO << " - Mod: " << qsToPass.join("/"); //qDebug() << Q_FUNC_INFO << " - END2 fields"; fields = qsToPass; if (fields.contains("EOR>")) // We are going to add a QSO to the log... prepare the Query! { //qDebug() << Q_FUNC_INFO << " - START of QSO adding"<< QT_ENDL; //dataProxy->isThisQSODuplicated() //int getDuplicatedQSOId(const QString &_qrz, const QString &_date, const QString &_time, const int _band, const int _mode); QString str, _call, _date, _time, _band, _mode; double _freq = 0.0; bool haveBand = false; QDate _qslrdate = QDate::currentDate(); QString _satName = QString(); bool qsl_rcvd = false; QString field, data; QStringList clearAdif; bool validQSO = false; int modifiedQSO = -1; foreach (str, fields) { //field = readAdifField("<"+str).at(0); clearAdif.clear(); clearAdif << readAdifField("<"+str); //qDebug() << Q_FUNC_INFO << " - clearAdif length: " << QString::number(clearAdif.length()); if (clearAdif.length()==2) { validQSO = true; field = clearAdif.at(0); data = clearAdif.at(1); //qDebug() << Q_FUNC_INFO << " - field: " << field; //qDebug() << Q_FUNC_INFO << " - data: " << data; if (field == "CALL") { if (util->isValidCall(data)) { _call = data; } else { _call = util->getAValidCall(data); } } else if (field == "QSO_DATE") { //qDebug() << Q_FUNC_INFO << " - field: " << field; //qDebug() << Q_FUNC_INFO << " - data: " << data; _tdate = util->getDateFromADIFDateString(data); if (_tdate.isValid()) { _dateTime.setDate(_tdate); } } else if (field == "TIME_ON") { //qDebug() << Q_FUNC_INFO << " - field: " << field; //qDebug() << Q_FUNC_INFO << " - data: " << data; _time = data; if (util->getTimeFromADIFTimeString(data).isValid()) { _dateTime.setTime(util->getTimeFromADIFTimeString(data)); } } else if (field == "BAND") { _band = data; haveBand = true; } else if (field == "MODE") { _mode = data; } else if (field == "FREQ") // In MHz with 5 decimal places { if (haveBand) { int bandi = dataProxy->getIdFromBandName(_band); if (dataProxy->getBandIdFromFreq(data.toDouble()) == bandi) { _freq = data.toDouble(); } else { _freq = dataProxy->getLowLimitBandFromBandId(bandi); // IF band is defined but not the same than freq, Band wins } } else { _freq = data.toDouble(); int bandi = dataProxy->getBandIdFromFreq(data.toDouble()); if (bandi>=0) { _band = dataProxy->getBandNameFromFreq(_freq); haveBand = true; } } } else if (field == "APP_LOTW_RXQSO") { //_qslsdate = data; } else if (field == "QSL_RCVD") { if (data == "Y") { qsl_rcvd = true; } } else if (field == "QSLRDATE") { if ((util->getDateFromADIFDateString(data)).isValid()) { _qslrdate = util->getDateFromADIFDateString(data); } } else if (field == "SAT_NAME") { if (dataProxy->getSatelliteName(data).length()>0) { _satName = data; } } else { //Unknown ADIF received. } } else { //qDebug() << Q_FUNC_INFO << " - NOT VALID ADIF RECEIVED: " << "<" + str; } } //qDebug() << Q_FUNC_INFO << " - If QSO is valid, we will call the addQSOToList" << "<" + str; //qDebug() << Q_FUNC_INFO << " - New Add String query: "; //dataProxy->addQSO(&qso); if (validQSO) { modifiedQSO = -2; // if (qsl_rcvd) { modifiedQSO = dataProxy->lotwUpdateQSLReception (_call, _dateTime, _band, _mode, _qslrdate); } //qDebug() << Q_FUNC_INFO << " - QSO Modified: " << QString::number(modifiedQSO); if (modifiedQSO>0) { //qDebug() << Q_FUNC_INFO << " - QSO Modified: " << _call; readed.append(modifiedQSO); modifiedQSOList << _call << util->getDateTimeSQLiteStringFromDateTime(_dateTime) << _band << _mode;// << util->getDateSQLiteStringFromDate(_qslrdate); emit addQSOToList(modifiedQSOList); modifiedQSOList.clear(); } else if ((modifiedQSO == -1 ) && (!qsl_rcvd)) { bool ignoreQSO = false; //qDebug() << Q_FUNC_INFO << " - QSO NOT found but confirmed by LoTW - Is it an error or should I add it to the log? " << _call; if (alwaysAdd) { //qDebug() << Q_FUNC_INFO << " - ADD THE QSO AUTOMATICALLY!!!" ; modifiedQSO = dataProxy->addQSOFromLoTW(_call, _dateTime, _mode, _band, _freq, _qslrdate, stationCallsign, logN); if (modifiedQSO>0) { readed.append(modifiedQSO); //qDebug() << Q_FUNC_INFO << " - QSO ADDED readed: " << QString::number(readed.length()); modifiedQSOList << _call << util->getDateTimeSQLiteStringFromDateTime(_dateTime) << _band << _mode;// << util->getDateSQLiteStringFromDate(_qslrdate); emit addQSOToList(modifiedQSOList); modifiedQSOList.clear(); //qDebug() << Q_FUNC_INFO << " - QSO ADDED: " << QString::number(modifiedQSO); } else { //qDebug() << Q_FUNC_INFO << " - QSO NOT ADDED: " << QString::number(modifiedQSO); } } else if (alwaysIgnore) { //qDebug() << Q_FUNC_INFO << " - IGNORE THE QSO AUTOMATICALLY!!!" ; } else { //if (askUserToAddThisQSOToLog(_call, _dateTime, _mode, _band, _freq, _qslrdate)) if (askUserToAddThisQSOToLog(_call, _dateTime, _mode, _band, _freq)) { //qDebug() << Q_FUNC_INFO << " - ADD THE QSO !!!" ; modifiedQSO = dataProxy->addQSOFromLoTW(_call, _dateTime, _mode, _band, _freq, _qslrdate, stationCallsign, logN); if (modifiedQSO>0) { readed.append(modifiedQSO); //qDebug() << Q_FUNC_INFO << " - QSO ADDED-2 readed: " << QString::number(readed.length()); modifiedQSOList << _call << util->getDateTimeSQLiteStringFromDateTime(_dateTime) << _band << _mode;// << util->getDateSQLiteStringFromDate(_qslrdate); emit addQSOToList(modifiedQSOList); modifiedQSOList.clear(); //qDebug() << Q_FUNC_INFO << " - QSO ADDED-2: " << QString::number(modifiedQSO); } else { //qDebug() << Q_FUNC_INFO << " - QSO NOT ADDED-2: " << QString::number(modifiedQSO); } } else { //qDebug() << Q_FUNC_INFO << " - IGNORE THE QSO !!!" ; } if (askUserToUseAlwaysSameAnswer()) { if (!ignoreQSO) { alwaysAdd = true; } else { alwaysIgnore = true; } } else { alwaysAdd = false; alwaysIgnore = false; } } } else { //qDebug() << Q_FUNC_INFO << " - QSO NOT Modified: Error: " << QString::number(modifiedQSO) << " - " << _call; } } _call.clear(); _date.clear(); _time.clear(); _band.clear(); _mode.clear(); _qslrdate = QDate::currentDate(); //qDebug() << Q_FUNC_INFO << " - END of QSO "<< QT_ENDL; fields.clear(); i++; } // END of if (fields.contains("EOR>")) // We are going to add a QSO to the log... ! else { if (file.atEnd()) { noMoreQso = true; } //qDebug() << Q_FUNC_INFO << " - fields DOES NOT contains EOR>"; } if (( (i % step ) == 0) ) { // To update the speed I will only show the progress once each X QSOs //qDebug() << Q_FUNC_INFO << " - MOD 0 - i = " << QString::number(i) ; aux = tr("Importing LoTW ADIF file...") + "\n" + tr(" QSO: ") + QString::number(i) + "/" + QString::number(numberOfQsos); progress.setLabelText(aux); progress.setValue(i); } if (i>=numberOfQsos) { noMoreQso = true; } if ( progress.wasCanceled() ) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - User cancelled")); aux = QString(tr("You have canceled the file import. The file will be removed and no data will be imported.") + "\n" + tr("Do you still want to cancel?")); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked noMoreQso = true; break; case QMessageBox::No: // No Save was clicked break; default: // should never be reached break; } } } } progress.setValue(numberOfQsos); //qDebug() << Q_FUNC_INFO << " - - END: " << QString::number(readed.length()); return readed; } bool FileManager::adifReadLog2(const QString& tfileName, const int logN) { //qDebug() << Q_FUNC_INFO << " - Start: " << tfileName << "/" << QString::number(logN); QFile file( tfileName ); if (!file.exists ()) { //qDebug() << Q_FUNC_INFO << " - END: file does not exist"; return false; } //int qsos = howManyQSOsInFile (file); //qDebug() << Q_FUNC_INFO << " - QSOs: " << QString::number(qsos); qint64 pos = passHeader (file); // Position in the file to calculate where the header ends if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << Q_FUNC_INFO << " File not found" ; return false; } file.seek (pos); // QSO Data starts here QSO qso; QStringList fields, fieldsRest; // fields keeps the running array, // fieldsRest keeps the rest of fields after adding a QSO to prevent losing any field. fields.clear (); QString line = QString(); line.clear(); while (!file.atEnd()) { line.append(file.readLine().trimmed().toUpper()); if (line.contains("")) { fields << line.split("<", QT_SKIP); QString aux; foreach (aux, fields) { QString field = "<" + aux; if (field.contains ("")) { qso.setLogId (logN); qso.toDB (); qso.clear (); } else { qso.setData (field); } } } } file.close (); //qDebug() << Q_FUNC_INFO << " - END"; return true; } qint64 FileManager::passHeader(QFile & _f) { //qDebug() << Q_FUNC_INFO << " - Start: " << _f.fileName (); QFile &file = _f; if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << Q_FUNC_INFO << " File not found" ; return false; } //bool hasEOH = false; qint64 pos = file.pos(); QString line; while ( !file.atEnd() ) { line = file.readLine ().toUpper (); //qDebug() << Q_FUNC_INFO << " - " << line; if (line.count ("")>0) { break; } } pos = file.pos(); file.close (); //qDebug() << Q_FUNC_INFO << " - END (" << QString::number(pos) << ")"; return pos; } bool FileManager::adifReadLog(const QString& tfileName, const int logN) { //qDebug() << Q_FUNC_INFO << " " << tfileName; //QElapsedTimer time1; //int n = 0; //QSqlDatabase db = QSqlDatabase::database(); //int maxLogs = dataProxy->getNumberOfManagedLogs(); // To manage several logs usePreviousStationCallsignAnswerAlways = false; // This is to ensure that the StationCallsign is used in the process Line function bool sqlOK = true; QStringList queries = QStringList(); queries.clear(); QSqlQuery query; QStringList fields, qsToPass, qsAux; QStringList currentQSOfields = QStringList(); fields.clear(); qsToPass.clear(); qsAux.clear(); QString fieldToAnalyze = QString(); QString fileName = tfileName; QString line = QString(); QString aux = QString(); QString auxString = QString(); QString _band = QString(); bool inHeader = true; bool EOR = false; noMoreQso = false; bool isDupeQSO = false; bool askedToAddDupeQSOs = false; bool addDupeQSOs = false; qint64 pos; //Position in the file int i = 0; //Aunxiliar variable int numberOfQsos = 0; int step = 1; //int errorCode = -1; //int qsosInTransaction = 0; bool ignoreErrorCode19 = false; QFile file( fileName ); //bool moreThanOneLog = adifCheckMoreThanOneLog(file); int howManyLogs = howManyLogsInFile(file); fillHashLog(file); //I am creating several logs when importing a file //We need to fill the hashLog to process then in processLog //bool keepLogsInFile = false; //qDebug() << Q_FUNC_INFO << " Logs: " << QString::number(howManyLogs); if (howManyLogs>1) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - Log selection")); aux = QString(tr("There is more than one log in this logfile.") + "\n" + tr("All logs will be imported into the current log.") + "\n" + tr("Do you want to continue?")); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked //qDebug() << Q_FUNC_INFO << " clicked YES"; //keepLogsInFile = true; break; case QMessageBox::No: // No Save was clicked //qDebug() << Q_FUNC_INFO << " clicked NO"; //keepLogsInFile = false; return false; default: // should never be reached //keepLogsInFile = false; return false; //qDebug() << Q_FUNC_INFO << " default"; } } if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << Q_FUNC_INFO << " File not found" << fileName; return false; } bool hasEOH = false; pos = file.pos(); while ( !file.atEnd() ) { line = (file.readLine()).toUpper(); numberOfQsos = numberOfQsos + line.count("EOR>"); if ((line.count("")>0) && (!hasEOH)) { hasEOH = true; } } //qDebug() << Q_FUNC_INFO << " QSOs found: " << QString::number(numberOfQsos); QProgressDialog progress(tr("Reading ADIF file..."), tr("Abort reading"), 0, numberOfQsos, this); /*progress.setWindowModality(Qt::WindowModal);*/ progress.setWindowModality(Qt::ApplicationModal); progress.setVisible(true); progress.setValue(0); progress.setMaximum(numberOfQsos); step = util->getProgresStepForDialog(numberOfQsos); //step = getProgresStepForDialog(numberOfQsos); //qDebug() << Q_FUNC_INFO << " (STEP)/Number: " << QString::number(step) << "/" << QString::number(numberOfQsos); //qDebug() << Q_FUNC_INFO << " (number & step: " << QString::number(numberOfQsos % step); file.seek(pos); /* Optional header information may be included before the actual data in the file. To include optional header info, the first character of the file must be something other than <. Any amount of header info of any value except may be included. The header info must be terminated with . Any number of characters of any value except < may follow . The first < after is the start of the first field of the first data record in the file. */ //qDebug() << Q_FUNC_INFO << " Going to read the HEADER"; //Read HEADER line = file.readLine().trimmed().toUpper(); //qDebug() << Q_FUNC_INFO << " " << line; if ( (!(line.startsWith('<'))) && (inHeader) ) { // The file has a header if (line.contains("")) // To check if the first line contains the EOR but not alone in the line. { inHeader = false; } line.clear(); // We should finish the if with real data in "line" or a clear one. while ( inHeader && hasEOH) { line = file.readLine().trimmed().toUpper(); if (line.contains("")) { inHeader = false; line.clear(); //TODO: Maybe this clearing deletes a line that may have data... } } pos = file.pos(); } else if (!(line.startsWith('<'))) { // The file does not have any header. // Reading the first QSO... /* Cases: 1.- One big line with several QSO 2.- One QSO uses several lines. 3.- Last line of one QSO includes data of the next one */ inHeader = true; while (inHeader) { pos = file.pos(); line = file.readLine().trimmed().toUpper(); if ( (line.startsWith('<')) ) { inHeader = false; line.clear(); //TODO: Maybe this clearing deletes a line that may have data... } } } file.seek(pos); // START reading QSO data... //qDebug() << Q_FUNC_INFO << " QSO data reading started..." ; preparedQuery.prepare( "INSERT INTO log (call, qso_date, bandid, modeid, srx, stx, srx_string, stx_string, qso_date_off, band_rx, rst_sent, rst_rcvd, cqz, ituz, dxcc, address, age, cnty, comment, a_index, ant_az, ant_el, ant_path, arrl_sect, checkcontest, class, contacted_op, contest_id, country, credit_submitted, credit_granted, distance, eq_call, email, eqsl_qslrdate, eqsl_qslsdate, eqsl_qsl_rcvd, eqsl_qsl_sent, force_init, freq, freq_rx, gridsquare, my_gridsquare, iota, iota_island_id, my_iota, my_iota_island_id, k_index, lat, lon, my_lat, my_lon, lotw_qslrdate, lotw_qslsdate, lotw_qsl_rcvd, lotw_qsl_sent, clublog_qso_upload_date, clublog_qso_upload_status, max_bursts, ms_shower, my_antenna, my_city, my_cnty, my_country, my_cq_zone, my_name, name, operator, station_callsign, owner_callsign, my_rig, my_sig, my_sig_info, my_sota_ref, my_state, state, my_street, my_vucc_grids, notes, nr_bursts, nr_pings, pfx, precedence, prop_mode, public_key, qslmsg, qslrdate, qslsdate, qsl_rcvd, qsl_sent, qsl_rcvd_via, qsl_sent_via, qsl_via, qso_complete, qso_random, qth, rx_pwr, tx_pwr, sat_mode, sat_name, sfi, sig, sota_ref, swl, ten_ten, vucc_grids, web, lognumber) VALUES (:call, :qso_date, :bandid, :modeid, :srx, :stx, :srx_string, :stx_string, :qso_date_off, :band_rx, :rst_sent, :rst_rcvd, :cqz, :ituz, :dxcc, :address, :age, :cnty, :comment, :a_index, :ant_az, :ant_el, :ant_path, :arrl_sect, :checkcontest, :class, :contacted_op, :contest_id, :country, :credit_submitted, :credit_granted, :distance, :eq_call, :email, :eqsl_qslrdate, :eqsl_qslsdate, :eqsl_qsl_rcvd, :eqsl_qsl_sent, :force_init, :freq, :freq_rx, :gridsquare, :my_gridsquare, :iota, :iota_island_id, :my_iota, :my_iota_island_id, :k_index, :lat, :lon, :my_lat, :my_lon, :lotw_qslrdate, :lotw_qslsdate, :lotw_qsl_rcvd, :lotw_qsl_sent, :clublog_qso_upload_date, :clublog_qso_upload_status, :max_bursts, :ms_shower, :my_antenna, :my_city, :my_cnty, :my_country, :my_cq_zone, :my_name, :name, :operator, :station_callsign, :owner_callsign, :my_rig, :my_sig, :my_sig_info, :my_sota_ref, :my_state, :state, :my_street, :my_vucc_grids, :notes, :nr_bursts, :nr_pings, :pfx, :precedence, :prop_mode, :public_key, :qslmsg, :qslrdate, :qslsdate, :qsl_rcvd, :qsl_sent, :qsl_rcvd_via, :qsl_sent_via, :qsl_via, :qso_complete, :qso_random, :qth, :rx_pwr, :tx_pwr, :sat_mode, :sat_name, :sfi, :sig, :sota_ref, :swl, :ten_ten, :vucc_grids, :web, :lognumber)" ); /* if (db.transaction()) { //qDebug() << Q_FUNC_INFO << " Transaction Opened" ; } else { //qDebug() << Q_FUNC_INFO << " Transaction NOT Opened" ; } */ //file.seek(pos); fields.clear(); // while ( (!file.atEnd() ) && (!noMoreQso) && (sqlOK)) //time1.start(); while ((!noMoreQso) && (sqlOK)) { if (!file.atEnd()) { line.clear(); line.append(file.readLine().trimmed().toUpper()); //line.append(file.readLine().toUpper()); // TODO: Check if we should remove extra spaces,tabs and so on... //qDebug() << Q_FUNC_INFO << " -line:" << line; //fields.clear(); //TODO: Check if I should clear fields... I think I should not because I could loose data if a line contains data after an fields << line.split("<", QT_SKIP); } //TODO: Check what happens //qDebug() << Q_FUNC_INFO << " START fields"; qsToPass.clear(); auxString.clear(); foreach (aux, fields) { QString fieldToCheck; fieldToCheck = "<" + aux; //QStringList _TEST; //_TEST.clear(); //_TEST << util->getValidADIFFieldAndData('<'+fields.at(0)); aux = aux.trimmed(); if ( (aux.contains('>')) && (auxString.length() > 0) ) { //qsToPass << auxString + aux; qsToPass.last() = qsToPass.last() + auxString; //qDebug() << Q_FUNC_INFO << " Modified in qsToPass: " << qsToPass.last(); qsToPass << aux.trimmed(); //qDebug() << Q_FUNC_INFO << " Added to qsToPass: " << aux.trimmed(); auxString.clear(); } else if (( aux.contains('>')) && (auxString.length() <= 0) ) { qsToPass << aux.trimmed(); } else { auxString = auxString + "-" + aux.trimmed(); //qDebug() << Q_FUNC_INFO << " auxString: " << auxString; } //qDebug() << Q_FUNC_INFO << " fields: " << aux; } //qDebug() << Q_FUNC_INFO << " -W-1"; if (auxString.length()>0) { //qDebug() << Q_FUNC_INFO << " auxString2: " << auxString; qsToPass.last() = qsToPass.last() + auxString.trimmed(); } //qDebug() << Q_FUNC_INFO << " END fields"; //qDebug() << Q_FUNC_INFO << " Mod: " << qsToPass.join("/"); //qDebug() << Q_FUNC_INFO << " END2 fields"; fields = qsToPass; if (fields.contains("EOR>")) // We are going to add a QSO to the log... prepare the Query! { //qDebug() << Q_FUNC_INFO << " fields contains EOR>"; preparedQuery.bindValue( ":lognumber", logN); while ( (!EOR) && (!fields.isEmpty()) ) { //qDebug() << Q_FUNC_INFO << " -W-2"; fieldToAnalyze = (fields.takeFirst()).trimmed(); if ( fieldToAnalyze.contains("EOR>") ) { //qDebug() << Q_FUNC_INFO << " -W-2.1"; currentQSOfields << fieldToAnalyze; isDupeQSO = processQsoReadingADIF(currentQSOfields, logN); if (isDupeQSO && (!askedToAddDupeQSOs)) { askedToAddDupeQSOs = true; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - Add new QSOs?")); QString aux = QString(tr("Do you want to add dupe QSOs to your local log?")); msgBox.setText(aux); msgBox.setDetailedText(tr("There are some QSOs in this logfile that may be dupes as they have same call, band & mode and a very close date.")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: addDupeQSOs = true; break; case QMessageBox::No: addDupeQSOs = false; break; default: // should never be reached break; } //qDebug() << Q_FUNC_INFO << " isDupeQSO = true" ; } } else { //qDebug() << Q_FUNC_INFO << " Not contains EOR" ; if ((!fieldToAnalyze.contains('>')) && (currentQSOfields.length()>0)) { //qDebug() << Q_FUNC_INFO << " Contains > & currentsQSOfields.length>0" ; auxString = currentQSOfields.at(currentQSOfields.length()-1); auxString = auxString + "\n" + fieldToAnalyze; //currentQSOfields.at(currentQSOfields.length()) = auxString; fieldToAnalyze = auxString; } currentQSOfields << fieldToAnalyze; EOR = false; } } if ((!isDupeQSO) || (addDupeQSOs)) { sqlOK = preparedQuery.exec(); } else { //qDebug() << Q_FUNC_INFO << " DUPE QSO, not adding it"; } //qDebug() << Q_FUNC_INFO << " executedQuery1: " << preparedQuery.executedQuery() ; //qDebug() << Q_FUNC_INFO << " executedQuery2: " << preparedQuery.executedQuery() ; //qDebug() << Q_FUNC_INFO << " LastQuery2: " << preparedQuery.lastQuery() ; if (( (i % step ) == 0) ) { // To update the speed I will only show the progress once each X QSOs //qDebug() << Q_FUNC_INFO << " MOD 0 - i = " << QString::number(i) ; //aux = QString(tr("Importing LoTW ADIF file...\n QSO: %1/%2\nImporting speed: 0 QSOs/sec")).arg(i).arg(numberOfQsos); aux = tr("Importing ADIF file...") + "\n" + tr(" QSO: ") + QString::number(i) + "/" + QString::number(numberOfQsos); progress.setLabelText(aux); progress.setValue(i); } else { //qDebug() << Q_FUNC_INFO << " Mod: "<< QString::number(i) << " mod " << QString::number(step) << " = " << QString::number(i % step); } if (sqlOK) { //qDebug() << Q_FUNC_INFO << " (1) in While sqlOK (QSO added) = TRUE" ; } else { //errorCode = preparedQuery.lastError().nativeErrorCode(); //qDebug() << Q_FUNC_INFO << " QSO DUPE"; //qDebug() << Q_FUNC_INFO << " (1) LastQuery: " << preparedQuery.lastQuery() ; //qDebug() << Q_FUNC_INFO << " (1) LastError-data: " << preparedQuery.lastError().databaseText() ; //qDebug() << Q_FUNC_INFO << " (1) LastError-driver: " << preparedQuery.lastError().driverText() ; //qDebug() << Q_FUNC_INFO << " (1) LastError-n: " << QString::number(preparedQuery.lastError().nativeErrorCode() ); if (((preparedQuery.lastError().nativeErrorCode()).toInt() == 19) && (!ignoreErrorCode19)) { // There are some repeated QSO QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - Duplicated QSOs")); aux = tr("It seems that there are some duplicated QSOs in the ADIF file you are importing. Do you want to continue? (Duped QSOs will not be imported)"); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked //qDebug() << Q_FUNC_INFO << " (1) clicked YES"; sqlOK = true; break; case QMessageBox::YesToAll: // Yes was clicked //qDebug() << Q_FUNC_INFO << " (1) clicked YES to ALL"; ignoreErrorCode19 = true; sqlOK = true; break; case QMessageBox::No: // No Save was clicked //qDebug() << Q_FUNC_INFO << " (1) clicked NO"; sqlOK = false; break; default: // should never be reached sqlOK = true; //qDebug() << Q_FUNC_INFO << " (1) default"; break; } //; } else if(((preparedQuery.lastError().nativeErrorCode()).toInt() == 19) && (ignoreErrorCode19)) { sqlOK = true; //qDebug() << Q_FUNC_INFO << " errorCode=19 && ignoreErrorCode19"; } else { //qDebug() << Q_FUNC_INFO << " (2) LastQuery: " << preparedQuery.lastQuery() ; //qDebug() << Q_FUNC_INFO << " (2) LastError-data: " << preparedQuery.lastError().databaseText() ; //qDebug() << Q_FUNC_INFO << " (2) LastError-driver: " << preparedQuery.lastError().driverText() ; //qDebug() << Q_FUNC_INFO << " (2) LastError-n: " << QString::number(preparedQuery.lastError().nativeErrorCode() ); emit queryError( Q_FUNC_INFO, preparedQuery.lastError().databaseText(), preparedQuery.lastError().nativeErrorCode(), preparedQuery.lastQuery()); noMoreQso = true; } } if ( progress.wasCanceled() ) { QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - User cancelled")); aux = QString(tr("You have canceled the file import. The file will be removed and no data will be imported.") + "\n" + tr("Do you still want to cancel?")); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked noMoreQso = true; break; case QMessageBox::No: // No Save was clicked break; default: // should never be reached break; } } currentQSOfields.clear(); queryPreparation(logN); // to clear Values //progress.setValue(i); i++; } // END of if (fields.contains("EOR>")) // We are going to add a QSO to the log... ! else { if (file.atEnd()) { noMoreQso = true; } //qDebug() << Q_FUNC_INFO << " fields DOES NOT contains EOR>"; } //TODO: Check how to stop the importing process } // END OF WHILE if (noMoreQso) { //qDebug() << Q_FUNC_INFO << " noMoreQso = true"; progress.setValue(numberOfQsos); } else { //qDebug() << Q_FUNC_INFO << " noMoreQso = false"; } if (sqlOK) { //qDebug() << Q_FUNC_INFO << " sqlOK = true"; } else { //qDebug() << Q_FUNC_INFO << " sqlOK = false"; } if (sqlOK) { /* if (db.commit()) { //qDebug() << Q_FUNC_INFO << " Last commit OK" ; } else { errorCode = preparedQuery.lastError().nativeErrorCode(); QMessageBox msgBox; aux = tr("An error ocurred while importing. No data will be imported. Please send this code to the developer for analysis: "); msgBox.setText(aux + "FM-3 #" + QString::number(errorCode)); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Ok: // Yes was clicked sqlOK = false; //qDebug() << Q_FUNC_INFO << " I have just set sqlOK=False (5)"; break; default: // should never be reached sqlOK = false; //qDebug() << Q_FUNC_INFO << " I have just set sqlOK=False (6)"; break; } if (db.rollback()) {} else { //TODO: Check the error if db.rollback returns false } } */ } else { //qDebug() << Q_FUNC_INFO << " sqlOK = NOK" ; } progress.setValue(numberOfQsos); //qDebug() << Q_FUNC_INFO << " END " ; return true; } QHash FileManager::SwitchHash; void FileManager::initializeSwitchHash() { SwitchHash = { {"CALL", 1}, {"QSO_DATE", 2}, {"BAND", 3}, {"MODE", 4}, {"SUBMODE", 5}, {"SRX", 6}, {"STX", 7}, {"TIME_ON", 8}, {"QSO_DATE_OFF", 9}, {"BAND_RX", 10}, {"TIME_OFF", 11}, {"RST_SENT", 12}, {"RST_RCVD", 13}, {"SRX_STRING", 14}, {"STX_STRING", 15}, {"CQZ", 16}, {"ITUZ", 17}, {"DXCC", 18}, {"ADDRESS", 19}, {"AGE", 20}, {"CNTY", 21}, {"COMMENT", 22}, {"A_INDEX", 23}, {"ANT_AZ", 24}, {"ANT_EL", 25}, {"ANT_PATH", 26}, {"ARRL_SECT", 27}, {"AWARD_GRANTED", 28}, {"AWARD_SUBMITTED", 29}, {"CHECKCONTEST", 30}, {"CLASS", 31}, {"CONT", 32}, {"CONTACTED_OP", 33}, {"CONTEST_ID", 34}, {"COUNTRY", 35}, {"CREDIT_SUBMITTED", 36}, {"CREDIT_GRANTED", 37}, {"DISTANCE", 38}, {"DARC_DOK", 39}, {"EQ_CALL", 40}, {"EMAIL", 41}, {"EQSL_QSLRDATE", 42}, {"EQSL_QSLSDATE", 43}, {"EQSL_QSL_RCVD", 44}, {"EQSL_QSL_SENT", 45}, {"FISTS", 46}, {"FISTS_CC", 47}, {"FORCE_INIT", 48}, {"FREQ", 49}, {"FREQ_RX", 50}, {"GRIDSQUARE", 51}, {"HRDLOG_QSO_UPLOAD_DATE", 53}, {"HRDLOG_QSO_UPLOAD_STATUS", 54}, {"MY_GRIDSQUARE", 55}, {"MY_ANTENNA", 56}, {"IOTA", 57}, {"IOTA_ISLAND_ID", 58}, {"MY_IOTA", 59}, {"MY_DXCC", 60}, {"MY_FISTS", 61}, {"MY_IOTA_ISLAND_ID", 62}, {"K_INDEX", 63}, {"LAT", 64}, {"LON", 65}, {"MY_LAT", 66}, {"MY_LON", 67}, {"MY_ITU_ZONE", 68}, {"MY_POSTAL_CODE", 69}, {"LOTW_QSLRDATE", 70}, {"LOTW_QSLSDATE", 71}, {"LOTW_QSL_RCVD", 72}, {"LOTW_QSL_SENT", 73}, {"CLUBLOG_QSO_UPLOAD_DATE", 74}, {"CLUBLOG_QSO_UPLOAD_STATUS", 75}, {"MAX_BURSTS", 76}, {"MS_SHOWER", 77}, {"MY_CITY", 78}, {"MY_CNTY", 79}, {"MY_COUNTRY", 80}, {"MY_CQ_ZONE", 81}, {"MY_NAME", 82}, {"NAME", 83}, {"OPERATOR", 84}, {"STATION_CALLSIGN", 85}, {"OWNER_CALLSIGN", 86}, {"MY_RIG", 87}, {"MY_SIG", 88}, {"MY_SIG_INFO", 89}, {"MY_SOTA_REF", 90}, {"MY_STATE", 91}, {"STATE", 92}, {"MY_STREET", 93}, {"MY_USACA_COUNTIES", 94}, {"MY_VUCC_GRIDS", 95}, {"NOTES", 96}, {"NR_BURSTS", 97}, {"NR_PINGS", 98}, {"PFX", 99}, {"PRECEDENCE", 100}, {"PROP_MODE", 101}, {"PUBLIC_KEY", 102}, {"QRZCOM_QSO_UPLOAD_DATE", 103}, {"QRZCOM_QSO_UPLOAD_STATUS", 104}, {"QSLMSG", 105}, {"QSLRDATE", 106}, {"QSLSDATE", 107}, {"QSL_RCVD", 108}, {"QSL_SENT", 109}, {"QSL_RCVD_VIA", 110}, {"QSL_SENT_VIA", 111}, {"QSL_VIA", 112}, {"QSO_COMPLETE", 113}, {"QSO_RANDOM", 114}, {"QTH", 115}, {"REGION", 116}, {"RIG", 117}, {"RX_PWR", 118}, {"TX_PWR", 119}, {"SAT_MODE", 120}, {"SAT_NAME", 121}, {"SFI", 122}, {"SIG", 123}, {"SIG_INFO", 124}, {"SILENT_KEY", 125}, {"SKCC", 126}, {"SOTA_REF", 127}, {"SWL", 128}, {"TEN_TEN", 129}, {"UKSMG", 130}, {"USACA_COUNTIES", 131}, {"VE_PROV", 132}, {"VUCC_GRIDS", 133}, {"WEB", 134}, {"APP_KLOG_TRX", 137}, {"APP_KLOG_LOGN", 138}, {"APP_N1MM_POINTS", 139} }; } bool FileManager::processQsoReadingADIF(const QStringList &_line, const int logNumber) //, const bool _keepLogsInFile) //bool FileManager::processQsoReadingADIF(const QStringList _line, const int logNumber, const bool _keepLogsInFile, QHash &_logs) { //qDebug() << "FileManager::processQsoReadingADIF: log: " << QString::number(logNumber); //qDebug() << "FileManager::processQsoReadingADIF: log: " << _line.at(0); //qDebug() << "FileManager::processQsoReadingADIF: " << _line.join("/"); //QHash &hashLogs = _logs; //QFile &file = _f; //bool keepLogsInF;// = _keepLogsInFile; //TODO: Check if needed or remove it completely. This line is just to remove a warning int i = -1; QDate date, dateT; date = QDate(); dateT = QDate(); QTime time; QDateTime dateTime, dateTimeOFF; dateTime = QDateTime(); QStringList qs = _line; QStringList oneField; QString field, data; QSqlQuery query; if (SwitchHash.empty()) initializeSwitchHash(); //confirmed = 0; // 0 means worked, 1 means confirmed //QString queryString, stringFields, stringData; QString aux; // Aux string QString aux2; QString qrzCall = QString(); QString submode = QString(); QString defaultRSTTX = util->getDefaultRST(QString()); QString defaultRSTRX = util->getDefaultRST(QString()); bool isDupeQSO = false; int modei = -1; int bandi = -1; int bandrxi = -1; bool rstRXr = false; bool rstTXr = false; //KLog does not understand (and will not import) a QSO without these fields bool haveCall = false; //QString wrongCall = QString(); bool haveBand = false; bool bandRXDef = false; bool haveMode = false; bool haveSubMode = false; bool haveTime = false; bool haveDate = false; bool haveTimeOff = false; bool haveDateOff = false; bool haveFreqTX = false; bool haveFreqRX = false; bool hasStationCall = false; bool hasLotwQslSent = false; bool hasEqslQslSent = false; bool hasQrzQslSent = false; bool hasClublogQslSent = false; QString freqTX = QString(); //bool ret; //int length = 0; //int currentLog = logNumber; //qDebug() << "FileManager::processQsoReadingADIF" << QString::number(qs.size()) << "/" << QString::number(logNumber); //TODO: To remove the next line, it was just to measure the time it takes. ignoreUnknownAlways = true; QString str; //preparedQuery.bindValue( ":confirmed", '0' ); //qDebug() << "FileManager::processQsoReadingADIF: Entering the foreach"; foreach (str, qs) { //qDebug() << "FileManager::processQsoReadingADIF: " << str; if ( !( (str.contains(":")) && (str.contains(">")) ) ) { //qDebug() << "FileManager::processQsoReadingADIF: NOT (contains : and >): " << str; } else { //qDebug() << "FileManager::processQsoReadingADIF: (contains : and >): " << str; oneField = str.split(">", QT_SKIP); //qDebug() << "FileManager::processQsoReadingADIF: (oneField)" << oneField; if (checkADIFValidFormat(oneField)) { i = (qs.at(0)).count(":"); field = (oneField.at(0)).trimmed(); // Needs to be cleared FIELD:4:D data = (oneField.at(1)).trimmed(); data = util->checkAndFixASCIIinADIF(data); //qDebug() << "FileManager::processQsoReadingADIF: field/data" << field << "/" << data; if (i == 2) { // DATE:8:D / 20141020 //length = (field.section(':', 1, 1)).toInt(); field = field.section(':', 0, 0); } else if (i == 1) { // DATE:8 / 20141020 //length = (field.section(':', 1, 1)).toInt(); field = field.section(':', 0, 0); } else { //qDebug() << "FileManager::checkADIFValidFormat-1 "; //return false; } //field = oneField.at(0).trimmed(); //data = oneField.at(1).trimmed(); //length = field.indexOf(":"); //field = field.left(length); //qDebug() << "FileManager::processQsoReadingADIF (field/data): " << field << "/" << data; if (SwitchHash.find(field) != SwitchHash.end()) { switch (SwitchHash[field]) { case(1): //qDebug() << "FileManager::processQsoReadingADIF-CALL:" << data; qrzCall = data; haveCall = util->isValidCall(qrzCall); if (haveCall) { //qDebug() << "FileManager::processQsoReadingADIF-CALL: Have CALL!!" ; preparedQuery.bindValue(":call", qrzCall); } //qDebug() << "FileManager::processQsoReadingADIF-CALL-END:" << data; break; case(2): //qDebug() << "FileManager::processQsoReadingADIF-QSO_DATE:" << data; dateT = util->getDateFromADIFDateString(data); if (dateT.isValid()) { dateTime.setDate(dateT); haveDate = true; } else { //qDebug() << "FileManager::processQsoReadingADIF QSO_DATE is NOT VALID: " << data; } break; case(3): //preparedQuery.bindValue( ":bandid", data ); i = dataProxy->getIdFromBandName(data); //i = db->getBandIDFromName2(data); if (i >= 0) { preparedQuery.bindValue(":bandid", QString::number(i)); haveBand = true; bandi = i; //qDebug() << "FileManager::processQsoReadingADIF-Band: " << data << "/" << QString::number(i); } else { //qDebug() << "FileManager::processQsoReadingADIF-Band - Wrong band: " << data << "/" << QString::number(i); } /* queryString = QString("SELECT id FROM band WHERE name ='%1'").arg(data); query.exec(queryString); query.next(); if (query.isValid()) { preparedQuery.bindValue( ":bandid", query.value(0).toInt() ); //qDebug() << "FileManager::bprocessQsoReadingADIF-Band: " << data; } */ break; case(4): modei = dataProxy->getSubModeIdFromSubMode(data); // get modeid if (modei >= 0) { { if (!haveSubMode) { preparedQuery.bindValue(":modeid", QString::number(modei)); haveMode = true; haveSubMode = true; submode = dataProxy->getSubModeFromId(modei); } } } break; case(5): modei = dataProxy->getSubModeIdFromSubMode(data); if (modei >= 0) { preparedQuery.bindValue(":modeid", QString::number(modei)); preparedQuery.bindValue(":submode", QString::number(modei)); haveSubMode = true; haveMode = true; submode = data; //submode = data; } break; case(6): preparedQuery.bindValue(":srx", data); //qDebug() << "FileManager::bprocessQsoReadingADIF-srx: " << data; break; case(7): preparedQuery.bindValue(":stx", data); //qDebug() << "FileManager::bprocessQsoReadingADIF-stx: " << data; break; case(8): time = util->getTimeFromADIFTimeString(data); if (time.isValid()) { dateTime.setTime(time); haveTime = true; } break; case(9): dateT = util->getDateFromADIFDateString(data); if (dateT.isValid()) { dateTimeOFF.setDate(dateT); haveDateOff = true; } break; case(10): i = dataProxy->getIdFromBandName(data); //i = db->getBandIDFromName2(data); if (i >= 0) { preparedQuery.bindValue(":band_rx", QString::number(i)); bandRXDef = true; bandrxi = i; } break; case(11): time = util->getTimeFromADIFTimeString(data); if (time.isValid()) { dateTimeOFF.setTime(time); haveTimeOff = true; } break; case(12): preparedQuery.bindValue(":rst_sent", data); //qDebug() << "FileManager::bprocessQsoReadingADIF-rst_rsent: " << data; rstTXr = true; break; case(13): //qDebug() << "FileManager::bprocessQsoReadingADIF-rst_rcvd: " << data; preparedQuery.bindValue(":rst_rcvd", data); rstRXr = true; break; case(14): preparedQuery.bindValue(":srx_string", data); break; case(15): preparedQuery.bindValue(":stx_string", data); break; case(16): preparedQuery.bindValue(":cqz", data); //cqz = data.toInt(); break; case(17): preparedQuery.bindValue(":ituz", data); //ituz = data.toInt(); break; case(18): //dxcc = data.toInt(); preparedQuery.bindValue(":dxcc", data); break; case(19): preparedQuery.bindValue(":address", data); break; case(20): preparedQuery.bindValue(":age", data); break; case(21): preparedQuery.bindValue(":cnty", data); break; case(22): preparedQuery.bindValue(":comment", data); break; case(23): preparedQuery.bindValue(":a_index", data); break; case(24): preparedQuery.bindValue(":ant_az", data); break; case(25): preparedQuery.bindValue(":ant_el", data); break; case(26): preparedQuery.bindValue(":ant_path", data); break; case(27): preparedQuery.bindValue(":arrl_sect", data); break; case(28): preparedQuery.bindValue(":award_granted", data); break; case(29): preparedQuery.bindValue(":award_submitted", data); break; case(30): preparedQuery.bindValue(":checkcontest", data); break; case(31): preparedQuery.bindValue(":class", data); break; case(32): preparedQuery.bindValue(":cont", data); break; case(33): preparedQuery.bindValue(":contacted_op", data); break; case(34): preparedQuery.bindValue(":contest_id", data); break; case(35): preparedQuery.bindValue(":country", data); break; case(36): preparedQuery.bindValue(":credit_submitted", data); break; case(37): preparedQuery.bindValue(":credit_granted", data); break; case(38): preparedQuery.bindValue(":distance", data); break; case(39): preparedQuery.bindValue(":darc_dok", data); break; case(40): preparedQuery.bindValue(":eq_call", data); break; case(41): if (data.contains("@") && (data.contains("."))) { preparedQuery.bindValue(":email", data); } break; case(42): dateT = util->getDateFromADIFDateString(data); if (dateT.isValid()) { preparedQuery.bindValue(":eqsl_qslrdate", util->getDateSQLiteStringFromDate(dateT)); } break; case(43): dateT = util->getDateFromADIFDateString(data); if (dateT.isValid()) { preparedQuery.bindValue(":eqsl_qslsdate", util->getDateSQLiteStringFromDate(dateT)); } break; case(44): preparedQuery.bindValue(":eqsl_qsl_rcvd", data); break; case(45): preparedQuery.bindValue(":eqsl_qsl_sent", data); hasEqslQslSent = true; break; case(46): preparedQuery.bindValue(":fists", data); break; case(47): preparedQuery.bindValue(":fists_cc", data); break; case(48): preparedQuery.bindValue(":force_init", data); break; case(49): //qDebug() << "FileManager::processQsoReadingADIF -FREQ: " << QString::number(data.toDouble()); if (haveBand) { if (dataProxy->getBandIdFromFreq(data.toDouble()) == bandi) //if (db->isThisFreqInBand(db->getBandNameFromNumber(bandi), data)) { preparedQuery.bindValue(":freq", data); haveFreqTX = true; freqTX = data; } else { // IF band is defined but not the same than freq, Band wins } } else { preparedQuery.bindValue(":freq", data); haveFreqTX = true; freqTX = data; i = dataProxy->getBandIdFromFreq(data.toDouble()); if (i >= 0) { preparedQuery.bindValue(":bandid", QString::number(i)); haveBand = true; //qDebug() << "FileManager::processQsoReadingADIF-Band: " << data << "/" << QString::number(i); } } break; case(50): if (bandRXDef) { if (dataProxy->getBandIdFromFreq(data.toDouble()) == bandrxi) { preparedQuery.bindValue(":freq_rx", data); haveFreqRX = true; } else { // IF band is defined but not the same than freq, Band wins } } else { preparedQuery.bindValue(":freq_rx", data); haveFreqRX = true; i = dataProxy->getBandIdFromFreq(data.toDouble()); if (i >= 0) { preparedQuery.bindValue(":band_rx", QString::number(i)); bandRXDef = true; //qDebug() << "FileManager::processQsoReadingADIF-Band: " << data << "/" << QString::number(i); } } break; case(51): preparedQuery.bindValue(":gridsquare", data); break; case(53): dateT = util->getDateFromADIFDateString(data); if (dateT.isValid()) { preparedQuery.bindValue(":hrd_qso_upload_date", util->getDateSQLiteStringFromDate(dateT)); } break; case(54): preparedQuery.bindValue(":hrd_qso_upload_status", data); break; case(55): //TODO: if data is NULL or empty, ask for my_gridsquare preparedQuery.bindValue(":my_gridsquare", data); break; case(56): //qDebug() << ": MY_ANTENNA: " << data; preparedQuery.bindValue(":my_antenna", data); break; case(57): //qDebug() << "FileManager::processQsoReadingADIF (IOTA): " << data; data = awards->checkIfValidIOTA(data); /* if (data.length()==4) //EU-1 { data.insert(3, "00"); } else if (data.length()==5) //EU-01 { data.insert(3, "0"); } */ if (data.length() == 6) { preparedQuery.bindValue(":iota", data); } break; case(58): preparedQuery.bindValue(":iota_island_id", data); break; case(59): /* if (data.length()==4) //EU-1 { data.insert(3, "00"); } else if (data.length()==5) //EU-01 { data.insert(3, "0"); } */ data = awards->checkIfValidIOTA(data); if (data.length() == 6) { preparedQuery.bindValue(":my_iota", data); } break; case(60): preparedQuery.bindValue(":my_dxcc", data); break; case(61): preparedQuery.bindValue(":my_fists", data); break; case(62): preparedQuery.bindValue(":my_iota_island_id", data); break; case(63): preparedQuery.bindValue(":k_index", data); break; case(64): preparedQuery.bindValue(":lat", data); break; case(65): preparedQuery.bindValue(":lon", data); break; case(66): preparedQuery.bindValue(":my_lat", data); break; case(67): preparedQuery.bindValue(":my_lon", data); break; case(68): preparedQuery.bindValue(":my_itu_zone", data); break; case(69): preparedQuery.bindValue(":my_postal_code", data); break; case(70): dateT = util->getDateFromADIFDateString(data); if (dateT.isValid()) { preparedQuery.bindValue(":lotw_qslrdate", util->getDateSQLiteStringFromDate(dateT)); } break; case(71): dateT = util->getDateFromADIFDateString(data); if (dateT.isValid()) { preparedQuery.bindValue(":lotw_qslsdate", util->getDateSQLiteStringFromDate(dateT)); } break; case(72): preparedQuery.bindValue(":lotw_qsl_rcvd", data); break; case(73): preparedQuery.bindValue(":lotw_qsl_sent", data); hasLotwQslSent = true; break; case(74): dateT = util->getDateFromADIFDateString(data); if (dateT.isValid()) { preparedQuery.bindValue(":clublog_qso_upload_date", util->getDateSQLiteStringFromDate(dateT)); hasClublogQslSent = true; } break; case(75): preparedQuery.bindValue(":clublog_qso_upload_status", data); break; case(76): preparedQuery.bindValue(":max_bursts", data); break; case(77): preparedQuery.bindValue(":ms_shower", data); break; case(78): preparedQuery.bindValue(":my_city", data); break; case(79): preparedQuery.bindValue(":my_cnty", data); break; case(80): preparedQuery.bindValue(":my_country", data); break; case(81): preparedQuery.bindValue(":my_cq_zone", data); break; case(82): preparedQuery.bindValue(":my_name", data); break; case(83): preparedQuery.bindValue(":name", data); break; case(84): if (util->isValidCall(data)) { preparedQuery.bindValue(":operator", data); } break; case(85): if (util->isValidCall(data)) { hasStationCall = true; preparedQuery.bindValue(":station_callsign", data); } break; case(86): if (util->isValidCall(data)) { preparedQuery.bindValue(":owner_callsign", data); } break; case(87): preparedQuery.bindValue(":my_rig", data); break; case(88): preparedQuery.bindValue(":my_sig", data); break; case(89): preparedQuery.bindValue(":my_sig_info", data); break; case(90): preparedQuery.bindValue(":my_sota_ref", data); break; case(91): preparedQuery.bindValue(":my_state", data); break; case(92): preparedQuery.bindValue(":state", data); break; case(93): preparedQuery.bindValue(":my_street", data); break; case(94): preparedQuery.bindValue(":my_usaca_counties", data); break; case(95): preparedQuery.bindValue(":my_vucc_grids", data); break; case(96): preparedQuery.bindValue(":notes", data); break; case(97): preparedQuery.bindValue(":nr_bursts", data); break; case(98): preparedQuery.bindValue(":nr_pings", data); break; case(99): preparedQuery.bindValue(":pfx", data); break; case(100): preparedQuery.bindValue(":precedence", data); break; case(101): preparedQuery.bindValue(":prop_mode", data); break; case(102): preparedQuery.bindValue(":public_key", data); break; case(103): dateT = util->getDateFromADIFDateString(data); if (dateT.isValid()) { preparedQuery.bindValue(":qrzcom_qso_upload_date", util->getDateSQLiteStringFromDate(dateT)); hasQrzQslSent = true; } break; case(104): preparedQuery.bindValue(":qrzcom_qso_upload_status", data); break; case(105): preparedQuery.bindValue(":qslmsg", data); break; case(106): dateT = util->getDateFromADIFDateString(data); if (dateT.isValid()) { preparedQuery.bindValue(":qslrdate", util->getDateSQLiteStringFromDate(dateT)); } break; case(107): dateT = util->getDateFromADIFDateString(data); if (dateT.isValid()) { preparedQuery.bindValue(":qslsdate", util->getDateSQLiteStringFromDate(dateT)); } break; case(108): preparedQuery.bindValue(":qsl_rcvd", data); //preparedQuery.bindValue( ":confirmed", '1' ); break; case(109): preparedQuery.bindValue(":qsl_sent", data); break; case(110): preparedQuery.bindValue(":qsl_rcvd_via", data); break; case(111): preparedQuery.bindValue(":qsl_sent_via", data); break; case(112): //qDebug() << "FileManager::bprocessQsoReadingADIF-QSL_VIA: " << data; if (data == "BUREAU") // This comprobation is to "correct" old logs, mainly from KLog // comming from older ADIF files { preparedQuery.bindValue(":qsl_sent_via", "B"); } else if ((data == "B") || (data == "D") || (data == "E")) // M Deprecated value from ADIF 304 { preparedQuery.bindValue(":qsl_via", data); } else { // If values are not valid, are not imported. //TODO: Send an error to the user to show that there was an invalid field } break; case(113): preparedQuery.bindValue(":qso_complete", data); break; case(114): preparedQuery.bindValue(":qso_random", data); break; case(115): preparedQuery.bindValue(":qth", data); break; case(116): preparedQuery.bindValue(":region", data); break; case(117): preparedQuery.bindValue(":rig", data); break; case(118): //qDebug() << "FileManager::bprocessQsoReadingADIF-rx_pwr: " << data; preparedQuery.bindValue(":rx_pwr", data); break; case(119): //qDebug() << "FileManager::bprocessQsoReadingADIF-tx_pwr: " << data; preparedQuery.bindValue(":tx_pwr", data); break; case(120): preparedQuery.bindValue(":sat_mode", data); break; case(121): preparedQuery.bindValue(":sat_name", data); break; case(122): preparedQuery.bindValue(":sfi", data); break; case(123): preparedQuery.bindValue(":sig", data); break; case(124): preparedQuery.bindValue(":sig_info", data); break; case(125): preparedQuery.bindValue(":silent_key", data); break; case(126): preparedQuery.bindValue(":skcc", data); break; case(127): preparedQuery.bindValue(":sota_ref", data); break; case(128): preparedQuery.bindValue(":swl", data); break; case(129): preparedQuery.bindValue(":ten_ten", data); break; case(130): preparedQuery.bindValue(":uksmg", data); break; case(131): preparedQuery.bindValue(":usaca_counties", data); break; case(132): preparedQuery.bindValue(":ve_prov", data); break; case(133): preparedQuery.bindValue(":vucc_grids", data); break; case(134): preparedQuery.bindValue(":web", data); break; case(138): //Lognumber in a multiple-log file //TODO: Think about how to import a file with different logs //isThisQSODuplicated(const QString &_qrz, const QString &_date, const QString &_time, const int _band, const int _mode) break; case(139): //Importing from N1MM preparedQuery.bindValue(":points", data); break; } } } else { //qDebug() << "FileManager::processQsoReadingADIF (field) CheckAdif FALSE: " << field; } } } if (sendEQSLByDefault) { if (!hasLotwQslSent) { preparedQuery.bindValue( ":lotw_qsl_sent","Q"); } if (!hasEqslQslSent) { preparedQuery.bindValue( ":eqsl_qsl_sent","Q"); } if (!hasClublogQslSent) { preparedQuery.bindValue( ":clublog_qso_upload_status","M"); } if (!hasQrzQslSent) { preparedQuery.bindValue( ":qrzcom_qso_upload_status","M"); } } if ( haveCall && haveDate && haveTime && haveBand && haveMode) { QList _dupeQSOs; _dupeQSOs.clear(); _dupeQSOs << dataProxy->isThisQSODuplicated(Q_FUNC_INFO, qrzCall, dateTime, bandi, modei, duplicatedQSOSlotInSecs); if (_dupeQSOs.length()>0) { isDupeQSO = true; } //QList DataProxy_SQLite::isThisQSODuplicated(const QString &_qrz, const QDateTime &_dateTime, const int _band, const int _mode, const int _secs) } if ( (haveDate) && (haveTime)) { preparedQuery.bindValue( ":qso_date", util->getDateTimeSQLiteStringFromDateTime(dateTime)); //preparedQuery.bindValue( ":time_on", dateTime.toString("hhmmss")); } if ( (haveDateOff) && (haveTimeOff)) { preparedQuery.bindValue( ":qso_date_off", util->getDateTimeSQLiteStringFromDateTime(dateTimeOFF)); } if ((haveBand) && (!haveFreqTX)) { preparedQuery.bindValue( ":freq", dataProxy->getFreqFromBandId(bandi)); } if ((bandRXDef) && (!haveFreqRX)) { preparedQuery.bindValue( ":freq_rx", dataProxy->getFreqFromBandId(bandrxi)); } if ((haveFreqTX) && (!haveFreqRX)) { preparedQuery.bindValue( ":freq_rx", freqTX); } if (!haveCall) { QString text = util->getAValidCall(qrzCall); if (!(util->isValidCall(text))) { haveCall = true; qrzCall = text; } else { qrzCall = QString(); haveCall = false; } } if (!(haveBand && haveMode && haveTime && haveDate )) { //qDebug() << "FileManager::processQsoReadingADIF (Don't have all mandatory fields): "; aux2 = tr ("This QSO is not including the minimum data to consider a QSO as valid!") + "\n\n\n" + tr("Please edit the ADIF file and make sure that it include at least:") + "\n\nCALL, QSO_DATE, TIME_ON, BAND "+ tr("and") +" MODE.\n\n" + tr("This QSO had:") + "\n"; if (!haveBand) { aux2 = aux2 + tr(" - The band missing and the following call: ") + qrzCall + ".\n"; } if (!haveMode) { aux2 = aux2 + tr(" - The mode missing and the following call: ") + qrzCall + ".\n"; } if (!haveDate) { aux2 = aux2 + tr(" - The date missing and the following call: ") + qrzCall + ".\n"; } if (!haveTime) { aux2 = aux2 + tr(" - The time missing and the following call: ") + qrzCall + ".\n"; } aux2 = aux2 + "\n\n" + tr("Do you want to continue with the current file?"); //qDebug() << "FileManager::processQsoReadingADIF - Missing fields: " << aux2; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog: Not all required data found!")); msgBox.setText(aux2); msgBox.setStandardButtons(QMessageBox::Yes|QMessageBox::Cancel); msgBox.setDefaultButton(QMessageBox::Cancel); msgBox.setIcon(QMessageBox::Warning); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked break; case QMessageBox::Cancel: noMoreQso = true; break; default: // should never be reached break; } } if ((!rstTXr) && (!rstTXDefault)) { //submode = dataProxy->getSubModeFromId(i); defaultRSTTX = util->getDefaultRST(submode); QMessageBox msgBox; aux = tr("Some QSOs of this log, (i.e.: %1) seems to lack RST-TX information.").arg(qrzCall) + "\n\n" + tr("Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem.").arg(defaultRSTTX).arg(submode) + "\n\n" + tr("If you select NO, maybe the QSO will not be imported."); msgBox.setWindowTitle(tr("KLog: No RST TX found!")); msgBox.setText(aux); msgBox.setStandardButtons(QMessageBox::Yes|QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); msgBox.setIcon(QMessageBox::Warning); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked rstTXDefault = true; break; default: // should never be reached rstTXDefault = false; break; } } if ((!rstRXr) && (!rstRXDefault)) { defaultRSTRX = util->getDefaultRST(submode); QMessageBox msgBox; //aux = tr("Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information.").arg(qrzCall) + "\n\n" + tr("Click on Yes to add a default 59 to all QSO with a similar problem.") + "\n\n" + tr("If you select NO, the QSO may not be imported."); aux = tr("Some QSOs of this log, (i.e.: %1) seems to lack RST-RX information.").arg(qrzCall) + "\n\n" + tr("Click on Yes to add a default %1 for mode %2 to all QSOs with a similar problem.").arg(defaultRSTRX).arg(submode) + "\n\n" + tr("If you select NO, maybe the QSO will not be imported."); msgBox.setText(aux); msgBox.setWindowTitle(tr("KLog: No RST RX found!")); msgBox.setStandardButtons(QMessageBox::Yes|QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); msgBox.setIcon(QMessageBox::Warning); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked rstRXDefault = true; break; default: // should never be reached rstRXDefault = false; break; } } if ((!rstTXr) && (rstTXDefault)) { preparedQuery.bindValue( ":rst_sent", defaultRSTTX ); } if ((!rstRXr) && (rstRXDefault)) { preparedQuery.bindValue( ":rst_rcvd", defaultRSTRX ); } if ((!hasStationCall) ) { if (!usePreviousStationCallsignAnswerAlways) { QMessageBox msgBox; if(getStationCallsignFromUser(qrzCall, dateTime.date())) { hasStationCall = true; } else { msgBox.setWindowTitle(tr("KLog - No Station callsign entered.")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText("KLog - No Station callsign entered."); msgBox.setInformativeText("Not entering a valid Station Callsign may create problems in some ocasions, like when uploading data to LoTW.\n\n Do you want to try again?"); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); if (ret == QMessageBox::Yes) { if (!getStationCallsignFromUser(qrzCall, dateTime.date())) { msgBox.setWindowTitle(tr("KLog - No Station callsign entered.")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText("KLog - No Station callsign entered."); msgBox.setInformativeText("No valid station callsign to add to the QSO."); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } else { hasStationCall = true; } } } msgBox.setWindowTitle(tr("KLog - Apply to all QSOs in this log?")); msgBox.setIcon(QMessageBox::Question); msgBox.setText("KLog - Do you want to use the same answer for all the QSOs in this log?"); msgBox.setInformativeText("KLog can use the same answer that you provided to all the QSOs in this logfile when importing it."); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); if (ret == QMessageBox::Yes) { usePreviousStationCallsignAnswerAlways = true; } else { usePreviousStationCallsignAnswerAlways = false; } } //qDebug() << "FileManager::processQsoReadingADIF defaultStationCallsign: " << defaultStationCallsign; if ((hasStationCall) || (util->isValidCall(defaultStationCallsign))) { preparedQuery.bindValue( ":station_callsign", defaultStationCallsign ); } } preparedQuery.bindValue( ":lognumber", QString::number(logNumber)); return isDupeQSO; } bool FileManager::getStationCallsignFromUser(const QString &_qrzDX, const QDate &_dt) { //qDebug() << "FileManager::getStationCallsignFromUser: " << _qrzDX << "/" << util->getDateSQLiteStringFromDate(_dt) << "-"; bool ok; QString text; QString aux; QString _date = QString(); if (_dt.isValid()) { _date = ", on "+ util->getDateSQLiteStringFromDate(_dt) ; } if (util->isValidCall(_qrzDX)) { aux = tr("KLog has found one QSO without the Station Callsign defined.\n\nEnter the Station Callsign that was used to do this QSO with %1 on %2:").arg(_qrzDX).arg(_date); text = QInputDialog::getText(this, tr("KLog - QSO without Station Callsign"), aux, QLineEdit::Normal, "", &ok); } else { text = QInputDialog::getText(this, tr("KLog - QSO without Station Callsign"), tr("KLog has found one QSO without the Station Callsign defined.\n\nEnter the Station Callsign that was used to do this QSO on %1:").arg(_date), QLineEdit::Normal, "", &ok); } if (ok && util->isValidCall(text)) { defaultStationCallsign = text.toUpper(); return true; } else { return false; } } void FileManager::queryPreparation(const int _logN) { //qDebug() << "FileManager::queryPreparation log: " << QString::number(_logN); //Prepares the query, ALL fields to default except lognumber, as may change... QStringList columns; columns.clear(); columns << dataProxy->getColumnNamesFromTableLog(); if (columns.size()<2) { //qDebug() << "FileManager::queryPreparation: <2 " ; return; } for (int i=0;i'); file.close (); //qDebug() << Q_FUNC_INFO << " - END-1"; return ((data.at(1)).toInt()); } } } else if (line.contains("EOR")) { qsos++; } } file.close(); //qDebug() << Q_FUNC_INFO << " - END"; return qsos; } int FileManager::howManyLogsInFile(QFile& _f) { //qDebug() << "FileManager::howManyLogsInFile:"; QFile &file = _f; //qint64 pos; //Position in the file QString line = QString(); QStringList fields = QStringList(); QStringList logs = QStringList(); QString aux = QString(); QStringList data = QStringList(); bool atLeastOneLog = false; if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << "FileManager::howManyLogsInFile File not found"; return false; } //pos = file.pos(); while ( !file.atEnd() ) { //line = file.readLine(); line.clear(); line.append(file.readLine().trimmed().toUpper()); if (line.contains("APP_KLOG_LOGN")) { fields.clear(); fields << line.split("<", QT_SKIP); foreach (aux, fields) { aux = aux.trimmed(); if (aux.contains("APP_KLOG_LOGN")) { data.clear(); data << aux.split('>'); //qDebug() << "FileManager::howManyLogsInFile: data.0: " << data.at(0); //qDebug() << "FileManager::howManyLogsInFile: data.1: " << data.at(1); if (!logs.contains(data.at(1))) { logs.append(data.at(1)); } } } } else if (line.contains("EOR")) { atLeastOneLog = true; } } //qDebug() << "FileManager::howManyLogsInFile: JUST ONE!" << aux; file.close(); if ( (logs.size()<2) && atLeastOneLog ) { return 1; } return logs.size(); } bool FileManager::fillHashLog(QFile &_f) { //qDebug() << Q_FUNC_INFO << " - Start" ; //hashLogs //1.- Run the log and fill hashLogs //2.- Run the file and continue the log series to be able to translate the files log into our own log hashLogs.clear(); QStringList qs; qs.clear(); qs << dataProxy->getListOfManagedLogs(); int i = 0; for (i=0;i'); //qDebug() << "FileManager::howManyLogsInFile: data.0: " << data.at(0); //qDebug() << "FileManager::howManyLogsInFile: data.1: " << data.at(1); if (!logs.contains(QString::number(data.at(1).toInt()+10000))) { logs.append(QString::number(data.at(1).toInt()+10000)); } } } } else if (line.contains("EOR")) { //atLeastOneLog = true; } } file.close(); return logs; } void FileManager::setVersion(const QString &_version) { util->setVersion(_version); } QStringList FileManager::readAdifField(const QString &_field) { // This function receives a QString with an ADIF field and returns a QStringList with the following format: // ADIF-tag, value // If the QString is not an ADIF tag, it returns a clear QStringList. // We are expecting the ADIF format: // D // Data //qDebug() << "FileManager::readAdifField: " << _field; QStringList result; result.clear(); if (_field == "") { //qDebug() << "FileManager::readAdifField: EOR found!!"; result << "EOR" << "EOR"; return result; } if (!((_field.startsWith("<")) && (_field.contains(":")) && (_field.contains(">")))) { //qDebug() << "FileManager::readAdifField: NOT (contains : and >): " << _field; return QStringList(); } // Now we have the data in the result[1] result = _field.split(">", QT_SKIP); // Remove the first '<' and split in field & data QString data = result.at(1); QStringList fieldList; fieldList.clear(); fieldList << (result.at(0)).split(':'); // we may have 1 or 2 depending on the format of the ADIF field. int iAux = fieldList.length(); //qDebug() << "FileManager::readAdifField: iAux: " << QString::number(iAux); int dataLength; QString field; QString fieldType; //qDebug() << "FileManager::readAdifField: analyzing..." ; if (iAux == 2) { field = fieldList.at(0); dataLength = (fieldList.at(1)).toInt(); fieldType = QString(); } else if (iAux == 3) { field = fieldList.at(0); dataLength = (fieldList.at(1)).toInt(); fieldType = fieldList.at(2); } else { // Not valid ADIF //qDebug() << "FileManager::readAdifField: iAux != 1, 2"; return QStringList(); } field.remove('<'); data = data.left(dataLength); //qDebug() << "FileManager::readAdifField: field: " << field; //qDebug() << "FileManager::readAdifField: dataLength: " << QString::number(dataLength); //qDebug() << "FileManager::readAdifField: data: " << data; //qDebug() << "FileManager::readAdifField: fieldType: " << fieldType; if (data.length() != dataLength) { //qDebug() << "FileManager::readAdifField: data.length != dataLength: " << QString::number(data.length()) << "/" << QString::number(dataLength); return QStringList(); } result.clear(); result << field << data; //qDebug() << "FileManager::readAdifField: OK: " << field << "/" << data; return result; } QDateTime FileManager::getDateTimeOfLastBackup() { //qDebug() << "FileManager::getDateTimeOfLastBackup: " << (QDateTime::currentDateTime()).toString("yyyyMMdd-hhmmss")<< QT_ENDL; //qDebug() << "FileManager::getDateTimeOfLastBackup: " << util->getCfgFile(); QFile file (util->getCfgFile()); QString line; QStringList fields; fields.clear(); QDateTime _dataTime = QDateTime(); if (file.open (QIODevice::ReadOnly)) /* Flawfinder: ignore */ { while ( !file.atEnd() ) { line.clear(); line.append(file.readLine().trimmed().toUpper()); if (line.contains("LATESTBACKUP")) { fields << line.split("=", QT_SKIP); line = fields.at(1); line.truncate(15); return _dataTime.fromString(line, "yyyyMMdd-hhmmss"); } } } return QDateTime(); } bool FileManager::writeBackupDate() { //qDebug() << "FileManager::writeBackupDate: current: " << (QDateTime::currentDateTime()).toString("yyyyMMdd-hhmmss"); //qDebug() << "FileManager::writeBackupDate: current: " << (getDateTimeOfLastBackup()).toString("yyyyMMdd-hhmmss"); QFile file (util->getCfgFile()); QString line, lineTemp; //QStringList fields; //fields.clear(); QDateTime _dataTime = QDateTime(); QStringList completeFile; completeFile.clear(); if(file.open(QIODevice::ReadWrite | QIODevice::Text)) /* Flawfinder: ignore */ { QString s; QTextStream t(&file); while(!t.atEnd()) { QString line = t.readLine(); if ( !(line.toUpper()).contains("LATESTBACKUP") ) { s.append(line + "\n"); } } s.append("LatestBackup=" + (QDateTime::currentDateTime()).toString("yyyyMMdd-hhmmss") + ";\n" ); file.resize(0); t << s; file.close(); } return true; } void FileManager::setStationCallSign(const QString& _st) { //qDebug() << "FileManager::setStationCallSign: " << _st; if (util->isValidCall(_st)) { //qDebug() << "FileManager::setStationCallSign: True"; defaultStationCallsign = _st; //qDebug() << "FileManager::setStationCallSign: " << defaultStationCallsign; } else { //qDebug() << "FileManager::setStationCallSign: FALSE"; } //qDebug() << "FileManager::setStationCallSign: -" << defaultStationCallsign << "-END"; } bool FileManager::askUserToUseAlwaysSameAnswer() { //qDebug() << "FileManager::askUserToUseAlwaysSameAnswer: " ; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - Don't ask again")); msgBox.setText(tr("Do you want to reuse your answer?")); msgBox.setInformativeText(tr("KLog will use automatically your previous answer for any other similar ocurrence, if any, without asking you again.")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked return true; case QMessageBox::No: // No Save was clicked return false; default: // should never be reached return false; } //qDebug() << "FileManager::askUserToUseAlwaysSameAnswer: - END"; } bool FileManager::askUserToAddThisQSOToLog(const QString &_call, const QDateTime _datetime, const QString &_mode, const QString &_band, const double _freq) { Q_UNUSED(_freq); //qDebug() << "FileManager::askUserToAddThisQSOToLog: " << _call; QString qsoData = QString(tr("
  • Date/Time: %1
  • Callsign: %2
  • Band: %3
  • Mode: %4
")).arg(util->getDateTimeSQLiteStringFromDateTime(_datetime)).arg(_call).arg(_band).arg(_mode); QMessageBox msgBox; msgBox.setTextFormat(Qt::RichText); msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - QSO not found")); msgBox.setText(tr("Do you want to add this QSO to the log?:\n\n") + qsoData); msgBox.setInformativeText(tr("We have found a QSO coming from LoTW that is not in your local log.\n\nDo you want KLog to add this QSO to the log?")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked return true; case QMessageBox::No: // No Save was clicked return false; default: // should never be reached return false; } //qDebug() << "FileManager::askUserToAddThisQSOToLog: - END"; } bool FileManager::showInvalidCallMessage(const QString &_call){ QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - Invalid call detected")); QString aux = _call; if (aux.length()<1) { aux = QString(tr("An empty callsign has been detected. Do you want to export this QSO anyway (click on Yes) or remove the field from the exported log file?")); } else { aux = QString(tr("An invalid callsign has been detected %1. Do you want to export this callsign anyway (click on Yes) or remove the call from the exported log file?").arg(aux)); } msgBox.setText(aux); msgBox.setInformativeText(tr("Exporting wrong calls may create problems in the applications you are potentially importing this logfile to. It may, however, be a good callsign that is wrongly identified by KLog as not valid. You can, however, edit the ADIF file once the export process is finished.")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // Yes was clicked return true; case QMessageBox::No: // No Save was clicked return false; default: // should never be reached return false; } } void FileManager::writeADIFHeader(QTextStream &out, const ExportMode _em, const int _numberOfQsos) { if (_em == ModeEQSL) { out << "ADIF v3.1.0 Export from KLog\nKLog "; } else { out << "ADIF v3.1.0 Export from KLog\nhttps://www.klog.xyz/klog\n" << klogVersion << "\nKLOG "; out << "" << QString::number(_numberOfQsos); out << "" << QDateTime::currentDateTime().toString("yyyyMMdd-hhmm"); } out << "\n"; } void FileManager::writeQuery(QSqlQuery query, QTextStream &out, const ExportMode _em, const bool _justMarked, const bool _onlyRequested, const int _logN ) { //qDebug() << "FileManager::writeQuery: " << query.lastQuery(); int nameCol; QString aux; bool propsat = false; // Reset the QSO in case it is a Satellite QSO QSqlRecord rec = query.record(); if (_justMarked) { nameCol = rec.indexOf("marked"); aux = (query.value(nameCol)).toString(); if (aux != "X") { return; } } if (_onlyRequested) { nameCol = rec.indexOf("qsl_sent"); aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( aux !="R" ) { return; } } nameCol = rec.indexOf("call"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); //qDebug() << "FileManager::writeQuery: " << QString::number(nameCol) << "/" << aux; if (util->isValidCall(aux)) { out << "" << aux << " "; } else { if (showInvalidCallMessage(aux)) { out << "" << aux << " "; } } } nameCol = rec.indexOf("qso_date"); QDateTime tDateTime; if (nameCol>=0) { aux = (query.value(nameCol)).toString(); tDateTime = util->getDateTimeFromSQLiteString(aux); if (tDateTime.isValid()) { aux = util->getADIFDateFromQDateTime(tDateTime); out << "" << aux << " "; aux = util->getADIFTimeFromQDateTime(tDateTime); if (_em == ModeEQSL) { aux.chop(2); out << "" << aux << " "; } else { out << "" << aux << " "; } } } nameCol = rec.indexOf("bandid"); QString bandst = QString(); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); //qDebug() << "FileManager::writeQuery-Band-1: " << aux; aux = util->checkAndFixASCIIinADIF(aux); //qDebug() << "FileManager::writeQuery-Band-2: " << aux; aux = dataProxy->getNameFromBandId(aux.toInt()); if (dataProxy->getIdFromBandName(aux)>=0) { //out << "" << aux << " "; bandst = aux; } } nameCol = rec.indexOf("freq"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); //qDebug() << Q_FUNC_INFO << ": FREQ1: " << aux; aux = util->checkAndFixASCIIinADIF(aux); double freqTX = aux.toDouble(); if (freqTX > 0.0) { //TODO: Check if the Band is correctly defined. BAND Wins and freq is lost if not correct if (dataProxy->getBandIdFromFreq(freqTX) != dataProxy->getIdFromBandName(bandst)) { bandst = dataProxy->getBandNameFromFreq(freqTX); } if (_em != ModeEQSL) { out << "" << aux << " "; } } if (dataProxy->getIdFromBandName(bandst)>0) { out << "" << bandst << " "; } } // Now the BAND RX nameCol = rec.indexOf("band_rx"); QString bandrxst = QString(); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); aux = dataProxy->getNameFromBandId(aux.toInt()); if (dataProxy->getIdFromBandName(aux)>=0) { bandrxst = aux; } } nameCol = rec.indexOf("freq_rx"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); double freqRX = aux.toDouble(); if (freqRX > 0.0) { //TODO: Check if the Band is correctly defined. BAND Wins and freq is lost if not correct if (dataProxy->getBandIdFromFreq(freqRX) != dataProxy->getIdFromBandName(bandrxst)) { bandrxst = dataProxy->getBandNameFromFreq(freqRX); } out << "" << aux << " "; } if (dataProxy->getIdFromBandName(bandrxst)>0) { out << "" << bandrxst << " "; } // END of Band RX } nameCol = rec.indexOf("modeid"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); // get SubModeId to check if it is the same or not from modeid QString aux2 = dataProxy->getSubModeFromId(aux.toInt()); //aux = db->getModeNameFromID2(aux.toInt()); aux = dataProxy->getNameFromSubMode(aux2); if ((aux.length()>1) && (dataProxy->getIdFromModeName(aux)>=0)) { out << "" << aux << " "; } if ((aux != aux2) && (aux.length()>1) && (dataProxy->getSubModeIdFromSubMode(aux2)>=0) ) { out << "" << aux2 << " "; } } nameCol = rec.indexOf("prop_mode"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (((aux.length())>1) && (aux!="NO")) { out << "" << aux << " "; if (aux == "SAT") { propsat = true; } } //qDebug() << "FileManager::writeQuery: PROP_MODE" ; } nameCol = rec.indexOf("sat_name"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; if (!propsat && (_em == ModeLotW)) { out << "SAT "; propsat = false; } } //qDebug() << "FileManager::writeQuery: SAT_NAME" ; } nameCol = rec.indexOf("gridsquare"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_gridsquare"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("station_callsign"); if ((nameCol>=0) && (_em != ModeEQSL)) { aux = (query.value(nameCol)).toString(); //qDebug() << "FileManager::writeQuery: StationCallSign: " << aux ; if ((util->isValidCall(aux)) && (aux.length ()>0)) { // User selected one station callsign from the log out << "" << aux << " "; } } nameCol = rec.indexOf("qso_date_off"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); tDateTime = util->getDateTimeFromSQLiteString(aux); if (tDateTime.isValid()) { aux = util->getADIFDateFromQDateTime(tDateTime); out << "" << aux << " "; aux = util->getADIFTimeFromQDateTime(tDateTime); out << "" << aux << " "; } } nameCol = rec.indexOf("srx"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); int i = aux.toInt (); if (i>=0) { out << "" << aux << " "; } } nameCol = rec.indexOf("srx_string"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("stx"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); int i = aux.toInt (); if (i>=0) { out << "" << aux << " "; } } nameCol = rec.indexOf("stx_string"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } //qDebug() << "FileManager::writeQuery - 100"; nameCol = rec.indexOf("cqz"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())>0) && (0 < aux.toInt()) && (aux.toInt() < CQZones+1) ) { out << "" << aux << " "; } } nameCol = rec.indexOf("ituz"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())>0) && (0 < aux.toInt()) && (aux.toInt() < ITUZones+1) ) { out << "" << aux << " "; } //qDebug() << "FileManager::writeQuery: DXCC - Now..." ; } nameCol = rec.indexOf("dxcc"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; //qDebug() << "FileManager::writeQuery: DXCC " << aux; } //qDebug() << "FileManager::writeQuery: DXCC - Exported!" ; } nameCol = rec.indexOf("address"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("age"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); int age = aux.toInt (); if ((age>=0) && (age<=120)) { out << "" << aux << " "; } } nameCol = rec.indexOf("cnty"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("comment"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } //qDebug() << "FileManager::writeQuery - 200"; } nameCol = rec.indexOf("a_index"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); int i = aux.toInt (); if ((i>=0) && (i<=400)) { out << "" << aux << " "; } } nameCol = rec.indexOf("ant_az"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); double i = aux.toDouble (); if ((i>=0) && (i<=360)) { out << "" << aux << " "; } } nameCol = rec.indexOf("ant_el"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); double i = aux.toDouble (); if ((i>=-90) && (i<=90)) { out << "" << aux << " "; } } nameCol = rec.indexOf("ant_path"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux == "G") || (aux == "O") || (aux == "S") || (aux == "L") ) { out << "" << aux << " "; } } nameCol = rec.indexOf("arrl_sect"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("checkcontest"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } //qDebug() << "FileManager::writeQuery - 30"; nameCol = rec.indexOf("class"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("cont"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (util->isValidContinent (aux)) { out << "" << aux << " "; } } nameCol = rec.indexOf("contacted_op"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((util->isValidCall(aux)) && (aux.length ()>0)) { out << "" << aux << " "; } } nameCol = rec.indexOf("contest_id"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("country"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("credit_submitted"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("credit_granted"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("distance"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); double i = aux.toDouble (); if (util->isValidDistance (i)) { out << "" << aux << " "; } } nameCol = rec.indexOf("darc_dok"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("eq_call"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((util->isValidCall(aux)) && (aux.length ()>0)) { out << "" << aux << " "; } } nameCol = rec.indexOf("email"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { if (aux.contains("@") && (aux.contains("."))) { out << "" << aux << " "; } } } nameCol = rec.indexOf("eqsl_qslrdate"); QDate date; if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); out << "" << aux << " "; } } nameCol = rec.indexOf("eqsl_qslsdate"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); out << "" << aux << " "; } } nameCol = rec.indexOf("eqsl_qsl_rcvd"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( (util->isValidQSL_Rcvd (aux)) && (aux!="N") ) { out << "" << aux << " "; } } nameCol = rec.indexOf("eqsl_qsl_sent"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( (util->isValidQSL_Sent (aux)) && (aux!="N") ) { out << "" << aux << " "; } } nameCol = rec.indexOf("fists"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (util->isValidFISTS (aux)) { out << "" << aux << " "; } } nameCol = rec.indexOf("fists_cc"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (util->isValidFISTS (aux)) { out << "" << aux << " "; } } nameCol = rec.indexOf("force_init"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux == "Y") || (aux == "N")) { out << "" << aux << " "; } } nameCol = rec.indexOf("hrdlog_qso_upload_date"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); out << "" << aux << " "; } } nameCol = rec.indexOf("hrdlog_qso_upload_status"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); //TODO: Add a isValidUploadStatus if ( util->isValidUpload_Status(aux)) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_antenna"); //qDebug() << Q_FUNC_INFO << ": my_antenna-0"; if (nameCol>=0) { //qDebug() << Q_FUNC_INFO << ": my_antenna-1"; aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); //qDebug() << Q_FUNC_INFO << ": my_antenna: " << aux; if ((aux.length())>0) { //qDebug() << Q_FUNC_INFO << ": my_antenna ... printing..."; out << "" << aux << " "; } } //qDebug() << Q_FUNC_INFO << ": my_antenna-99"; nameCol = rec.indexOf("my_dxcc"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); int i = aux.toInt (); if (util->isValidDXCC (i)) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_fists"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("iota"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); //qDebug() << "FileManager::writeQuery (IOTA): " << aux; if (((aux.length())>=4) && ((aux.length())<=6)) { out << "" << aux << " "; } } nameCol = rec.indexOf("iota_island_id"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); int i = aux.toInt (); if (i>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_iota"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (((aux.length())>=4) && ((aux.length())<=6)) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_iota_island_id"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); int i = aux.toInt (); if (i>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("k_index"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_itu_zone"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("lat"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("lon"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_lat"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_lon"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("lotw_qslrdate"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); out << "" << aux << " "; } } nameCol = rec.indexOf("lotw_qslsdate"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); out << "" << aux << " "; } } nameCol = rec.indexOf("lotw_qsl_rcvd"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( (util->isValidQSL_Rcvd (aux)) && (aux!="N") ) { out << "" << aux << " "; } } nameCol = rec.indexOf("lotw_qsl_sent"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( (util->isValidQSL_Sent (aux)) && (aux!="N") ) { out << "" << aux << " "; } } nameCol = rec.indexOf("clublog_qso_upload_date"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); out << "" << aux << " "; } } nameCol = rec.indexOf("clublog_qso_upload_status"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( util->isValidUpload_Status(aux) ) { out << "" << aux << " "; } } nameCol = rec.indexOf("qrzcom_qso_upload_date"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); out << "" << aux << " "; } } nameCol = rec.indexOf("qrzcom_qso_upload_status"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( util->isValidUpload_Status(aux) ) { out << "" << aux << " "; } } nameCol = rec.indexOf("max_bursts"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("ms_shower"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_city"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_cnty"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_country"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_cq_zone"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.toInt()>0) && (aux.toInt()<41)) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_name"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("name"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("operator"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((util->isValidCall(aux)) && (aux.length ()>0)) { out << "" << aux << " "; } } nameCol = rec.indexOf("owner_callsign"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((util->isValidCall(aux)) && (aux.length ()>0)) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_postal_code"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_rig"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_sig"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_sota_ref"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_postal_code"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_state"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("my_street"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("notes"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { aux.replace("\n", "---"); out << "" << aux << " "; } } nameCol = rec.indexOf("nr_bursts"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("nr_pings"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("pfx"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("precedence"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("public_key"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("qslmsg"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("qslrdate"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); out << "" << aux << " "; } } nameCol = rec.indexOf("qslsdate"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); date = util->getDateFromSQliteString(aux); if (date.isValid()) { aux = util->getADIFDateFromQDate(date); out << "" << aux << " "; } } nameCol = rec.indexOf("qsl_rcvd"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( (util->isValidQSL_Rcvd (aux)) && (aux!="N") ) { out << "" << aux << " "; nameCol = rec.indexOf("qsl_rcvd_via"); aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())==1) { out << "" << aux << " "; } } } nameCol = rec.indexOf("qsl_sent"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( (util->isValidQSL_Sent (aux)) && (aux!="N") ) { out << "" << aux << " "; nameCol = rec.indexOf("qsl_sent_via"); aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())==1) { out << "" << aux << " "; } } } nameCol = rec.indexOf("qsl_via"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("qso_complete"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("qso_random"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("qth"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("rst_sent"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("rst_rcvd"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("region"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("rig"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("rx_pwr"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if (((aux.length())>0) && (aux.toDouble()>0) ) { out << "" << aux << " "; } } nameCol = rec.indexOf("tx_pwr"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ( ((aux.length())>0) && (aux.toDouble()>0)) { out << "" << aux << " "; } } nameCol = rec.indexOf("sat_mode"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } nameCol = rec.indexOf("sfi"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("sig"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("sig_info"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("silent_key"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("skcc"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("sota_ref"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("state"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("swl"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("ten_ten"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("ten_ten"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("uksmg"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("ve_prov"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("my_usaca_counties"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("usaca_counties"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("vucc_grids"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("my_vucc_grids"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } nameCol = rec.indexOf("web"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0){ out << "" << aux << " "; } } if (_logN == -1) { nameCol = rec.indexOf("lognumber"); if (nameCol>=0) { aux = (query.value(nameCol)).toString(); aux = util->checkAndFixASCIIinADIF(aux); if ((aux.length())>0) { out << "" << aux << " "; } } } out << "\n"; } klog-2.3.3/infowidget.cpp0000644000015700001710000005200114542412415015176 0ustar jenkinsjenkins/*************************************************************************** infowidget.h - description ------------------- begin : ago 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "infowidget.h" InfoWidget::InfoWidget(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "InfoWidget::InfoWidget: " ; dataProxy = dp; awards = new Awards(dataProxy, Q_FUNC_INFO); //Just to know colors locator = new Locator(); world = new World(dataProxy, Q_FUNC_INFO); bandLabel1 = new QLabel; bandLabel2 = new QLabel; bandLabel3 = new QLabel; bandLabel4 = new QLabel; bandLabel5 = new QLabel; bandLabel6 = new QLabel; bandLabel7 = new QLabel; bandLabel8 = new QLabel; bandLabel9 = new QLabel; bandLabel10 = new QLabel; bandLabel11 = new QLabel; bandLabel12 = new QLabel; continentLabel = new QLabel; prefixLabel = new QLabel; cqzLabel = new QLabel; ituzLabel = new QLabel; gradShortLabel = new QLabel; distShortLabel = new QLabel; gradLongLabel = new QLabel; distLongLabel = new QLabel; distShortLabelN = new QLabel; distLongLabelN = new QLabel; imperialSystem=false; dxLocator.clear(); createUI(); clearBandLabels(); //qDebug() << "InfoWidget::InfoWidget: - END" ; } InfoWidget::~InfoWidget() { delete(awards); delete(locator); delete(world); } void InfoWidget::createUI() { bandLabel1->setText(tr("10M")); bandLabel2->setText(tr("15M")); bandLabel3->setText(tr("20M")); bandLabel4->setText(tr("40M")); bandLabel5->setText(tr("80M")); bandLabel6->setText(tr("160M")); bandLabel7->setText(tr("2M")); bandLabel8->setText(tr("6M")); bandLabel9->setText(tr("12M")); bandLabel10->setText(tr("17M")); bandLabel11->setText(tr("30M")); bandLabel12->setText(tr("70CM")); bandLabel1->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel2->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel3->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel4->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel5->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel6->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel7->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel8->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel9->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel10->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel11->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); bandLabel12->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *continentLabelN = new QLabel(tr("Continent")); continentLabelN->setAlignment(Qt::AlignVCenter | Qt::AlignCenter); continentLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *prefixLabelN = new QLabel(tr("Prefix")); prefixLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); prefixLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *cqzLabelN = new QLabel(tr("CQ")); cqzLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); cqzLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *ituzLabelN = new QLabel(tr("ITU")); ituzLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); ituzLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *shortLabelN = new QLabel(tr("Short Path")); shortLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *longLabelN = new QLabel(tr("Long Path")); longLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *gradShortLabelN = new QLabel(tr("Deg")); gradShortLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); gradShortLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); distShortLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *gradLongLabelN = new QLabel(tr("Deg")); gradLongLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); gradLongLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); distShortLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); distLongLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); distLongLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); clear(); //continentLabel->setText("--"); //prefixLabel->setText("--"); //cqzLabel->setText("0"); //ituzLabel->setText("0"); //gradShortLabel->setText("0"); //gradLongLabel->setText("0"); //distLongLabel->setText("0"); //distShortLabel->setText("0"); QGridLayout *infoLayout1 = new QGridLayout; infoLayout1->addWidget(continentLabelN, 0, 0); infoLayout1->addWidget(continentLabel, 1, 0); infoLayout1->addWidget(prefixLabelN, 0, 1); infoLayout1->addWidget(prefixLabel, 1, 1); infoLayout1->addWidget(cqzLabelN, 0, 2); infoLayout1->addWidget(cqzLabel, 1, 2); infoLayout1->addWidget(ituzLabelN, 0, 3); infoLayout1->addWidget(ituzLabel, 1, 3); QGridLayout *shortPathLayout = new QGridLayout; shortPathLayout->addWidget(shortLabelN, 0, 0, 1, 0); shortPathLayout->addWidget(gradShortLabelN, 1, 0); shortPathLayout->addWidget(gradShortLabel, 1, 1); shortPathLayout->addWidget(distShortLabelN, 1, 2); shortPathLayout->addWidget(distShortLabel, 1, 3); QGridLayout *longPathLayout = new QGridLayout; longPathLayout->addWidget(longLabelN, 0, 0, 1, 0); longPathLayout->addWidget(gradLongLabelN, 1, 0); longPathLayout->addWidget(gradLongLabel, 1, 1); longPathLayout->addWidget(distLongLabelN, 1, 2); longPathLayout->addWidget(distLongLabel, 1, 3); QHBoxLayout *pathsLayout = new QHBoxLayout; pathsLayout->addLayout(shortPathLayout); pathsLayout->addLayout(longPathLayout); QGridLayout *bandsLayout = new QGridLayout; bandsLayout->addWidget(bandLabel1, 0, 0); bandsLayout->addWidget(bandLabel2, 0, 1); bandsLayout->addWidget(bandLabel3, 0, 2); bandsLayout->addWidget(bandLabel4, 0, 3); bandsLayout->addWidget(bandLabel5, 0, 4); bandsLayout->addWidget(bandLabel6, 0, 5); bandsLayout->addWidget(bandLabel7, 1, 0); bandsLayout->addWidget(bandLabel8, 1, 1); bandsLayout->addWidget(bandLabel9, 1, 2); bandsLayout->addWidget(bandLabel10, 1, 3); bandsLayout->addWidget(bandLabel11, 1, 4); bandsLayout->addWidget(bandLabel12, 1, 5); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(bandsLayout); mainLayout->addLayout(infoLayout1); mainLayout->addLayout(pathsLayout); #ifdef Q_OS_WIN continentLabel->setFrameShadow(QFrame::Raised); continentLabel->setFrameStyle(QFrame::StyledPanel); continentLabelN->setFrameShadow(QFrame::Raised); continentLabelN->setFrameStyle(QFrame::StyledPanel); prefixLabelN->setFrameShadow(QFrame::Raised); prefixLabelN->setFrameStyle(QFrame::StyledPanel); prefixLabel->setFrameShadow(QFrame::Raised); prefixLabel->setFrameStyle(QFrame::StyledPanel); cqzLabelN->setFrameShadow(QFrame::Raised); cqzLabelN->setFrameStyle(QFrame::StyledPanel); cqzLabel->setFrameShadow(QFrame::Raised); cqzLabel->setFrameStyle(QFrame::StyledPanel); ituzLabel->setFrameShadow(QFrame::Raised); ituzLabel->setFrameStyle(QFrame::StyledPanel); ituzLabelN->setFrameShadow(QFrame::Raised); ituzLabelN->setFrameStyle(QFrame::StyledPanel); shortLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); shortLabelN->setFrameShadow(QFrame::Raised); shortLabelN->setFrameStyle(QFrame::StyledPanel); longLabelN->setFrameShadow(QFrame::Raised); longLabelN->setFrameStyle(QFrame::StyledPanel); gradShortLabelN->setFrameShadow(QFrame::Raised); gradShortLabelN->setFrameStyle(QFrame::StyledPanel); gradShortLabel->setFrameShadow(QFrame::Raised); gradShortLabel->setFrameStyle(QFrame::StyledPanel); distShortLabelN->setFrameShadow(QFrame::Raised); distShortLabelN->setFrameStyle(QFrame::StyledPanel); distShortLabel->setFrameShadow(QFrame::Raised); distShortLabel->setFrameStyle(QFrame::StyledPanel); gradLongLabelN->setFrameShadow(QFrame::Raised); gradLongLabelN->setFrameStyle(QFrame::StyledPanel); gradLongLabel->setFrameShadow(QFrame::Raised); gradLongLabel->setFrameStyle(QFrame::StyledPanel); distLongLabelN->setFrameShadow(QFrame::Raised); distLongLabelN->setFrameStyle(QFrame::StyledPanel); distLongLabel->setFrameShadow(QFrame::Raised); distLongLabel->setFrameStyle(QFrame::StyledPanel); bandLabel1->setFrameShadow(QFrame::Raised); bandLabel1->setFrameStyle(QFrame::StyledPanel); bandLabel2->setFrameShadow(QFrame::Raised); bandLabel2->setFrameStyle(QFrame::StyledPanel); bandLabel3->setFrameShadow(QFrame::Raised); bandLabel3->setFrameStyle(QFrame::StyledPanel); bandLabel4->setFrameShadow(QFrame::Raised); bandLabel4->setFrameStyle(QFrame::StyledPanel); bandLabel5->setFrameShadow(QFrame::Raised); bandLabel5->setFrameStyle(QFrame::StyledPanel); bandLabel6->setFrameShadow(QFrame::Raised); bandLabel6->setFrameStyle(QFrame::StyledPanel); bandLabel7->setFrameShadow(QFrame::Raised); bandLabel7->setFrameStyle(QFrame::StyledPanel); bandLabel8->setFrameShadow(QFrame::Raised); bandLabel8->setFrameStyle(QFrame::StyledPanel); bandLabel9->setFrameShadow(QFrame::Raised); bandLabel9->setFrameStyle(QFrame::StyledPanel); bandLabel10->setFrameShadow(QFrame::Raised); bandLabel10->setFrameStyle(QFrame::StyledPanel); bandLabel11->setFrameShadow(QFrame::Raised); bandLabel11->setFrameStyle(QFrame::StyledPanel); bandLabel12->setFrameShadow(QFrame::Raised); bandLabel12->setFrameStyle(QFrame::StyledPanel); #else continentLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); continentLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); prefixLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); prefixLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); cqzLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); cqzLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); ituzLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); ituzLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); shortLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); longLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); gradShortLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); gradShortLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); distShortLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); distShortLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); gradLongLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); distLongLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); distLongLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); gradLongLabelN->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel1->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel2->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel3->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel4->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel5->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel6->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel7->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel8->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel9->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel10->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel11->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); bandLabel12->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); #endif setLayout(mainLayout); } void InfoWidget::clearBandLabels() { QString defaultColorName = (awards->getDefaultColor()).name(); bandLabel1->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel2->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel3->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel4->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel5->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel6->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel7->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel8->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel9->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel10->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel11->setStyleSheet("* { background-color: " + defaultColorName + "; }"); bandLabel12->setStyleSheet("* { background-color: " + defaultColorName + "; }"); } void InfoWidget::clearInfoFromLocators() { //qDebug() << "InfoWidget::clearInfoFromLocators"; gradShortLabel->setText( "0" ); gradLongLabel->setText( "0" ); distShortLabel->setText( "0" ); distLongLabel->setText( "0" ); cqzLabel->setText("0"); ituzLabel->setText("0"); } void InfoWidget::clear() { continentLabel->setText("--"); prefixLabel->setText("--"); clearBandLabels(); clearInfoFromLocators(); } void InfoWidget::setColors (const QString &_newOne, const QString &_needed, const QString &_worked, const QString &_confirmed, const QString &_default) { awards->setColors (_newOne, _needed, _worked, _confirmed, _default); clearBandLabels(); } void InfoWidget::setCurrentLog(const int _log) { currentLog = _log; } void InfoWidget::setImperialSystem (const bool _imp) { imperialSystem = _imp; if (imperialSystem) { distShortLabelN->setText(tr("Miles")); distLongLabelN->setText(tr("Miles")); //distShortLabel->setText( QString::number( Km2Mile(imperialSystem, (distShortLabel->text()).toInt() )) ); //distLongLabel->setText( QString::number(Km2Mile(imperialSystem, (distLongLabel->text()).toInt()) ) ); } else { distShortLabelN->setText(tr("Km")); distLongLabelN->setText(tr("Km")); } } QString InfoWidget::getStyleColorToLabelFromBand(const QString &_b, const QString &_q) { // Receives band name, Entity number (as a String) //qDebug() << "InfoWidget::getStyleColorToLabelFromBand: " << _b << "/" << _q; QStringList _qs; _qs.clear(); _qs << _q << QString::number(dataProxy->getIdFromBandName(_b)) << QString::number(-1) << QString::number(currentLog); //TODO: Check if we can know the mode and replace the -1 //qDebug() << "InfoWidget::getStyleColorToLabelFromBand (Band/background-color): " << _b << (awards->getQRZDXStatusColor(_qs)).name() ; return "* { background-color: " + (awards->getQRZDXStatusColor(_qs)).name() + "; }"; } //void InfoWidget::showInfo(const int _entity, const int _bandid, const int _modeid, const int _log) void InfoWidget::showInfo(const int _entity) { // Default values of _modeid & _log = -1 //qDebug() << "InfoWidget::showInfo: " << QString::number(_entity); //QColor getQRZDXStatusColor(const QStringList _qs); // Receives Entity, band, mode & log if (_entity <1) { clearBandLabels(); } bandLabel1->setStyleSheet(getStyleColorToLabelFromBand(bandLabel1->text(), QString::number(_entity))); bandLabel2->setStyleSheet(getStyleColorToLabelFromBand(bandLabel2->text(), QString::number(_entity))); bandLabel3->setStyleSheet(getStyleColorToLabelFromBand(bandLabel3->text(), QString::number(_entity))); bandLabel4->setStyleSheet(getStyleColorToLabelFromBand(bandLabel4->text(), QString::number(_entity))); bandLabel5->setStyleSheet(getStyleColorToLabelFromBand(bandLabel5->text(), QString::number(_entity))); bandLabel6->setStyleSheet(getStyleColorToLabelFromBand(bandLabel6->text(), QString::number(_entity))); bandLabel7->setStyleSheet(getStyleColorToLabelFromBand(bandLabel7->text(), QString::number(_entity))); bandLabel8->setStyleSheet(getStyleColorToLabelFromBand(bandLabel8->text(), QString::number(_entity))); bandLabel9->setStyleSheet(getStyleColorToLabelFromBand(bandLabel9->text(), QString::number(_entity))); bandLabel10->setStyleSheet(getStyleColorToLabelFromBand(bandLabel10->text(), QString::number(_entity))); bandLabel11->setStyleSheet(getStyleColorToLabelFromBand(bandLabel11->text(), QString::number(_entity))); bandLabel12->setStyleSheet(getStyleColorToLabelFromBand(bandLabel12->text(), QString::number(_entity))); } void InfoWidget::showEntityInfo(const int _enti, int _cq, int _itu) { //qDebug() << "InfoWidget::showEntityInfo" << QString::number(_enti); if (_enti<=0) { return; } /* TO paint a flag of the Worked entity QString flagSt; flagSt.clear(); QString aux; aux = dataProxy->getISOName(_enti); if (aux.length()>1) { flagSt = ":/" + aux + ".png"; } else { flagSt.clear(); } flagSt = ":/flags/" + dataProxy->getISOName(_enti) + ".png"; flagIcon->setIcon(QIcon(flagSt)); */ //infoLabel2->setText(world->getEntityName(_enti)); continentLabel->setText( world->getContinentShortName(_enti) ); prefixLabel->setText( world->getEntityMainPrefix(_enti)); int i = -1; if ((_cq>0) && (_cq<41)) { cqzLabel->setText( QString::number(_cq) ); } else { i = world->getEntityCqz(_enti); if( i > 0 ) { cqzLabel->setText( QString::number(i) ); } else { cqzLabel->setText("0"); } } if (_itu>0) { ituzLabel->setText( QString::number(_itu) ); } else { i = world->getEntityItuz(_enti); if ( i > 0 ) { ituzLabel->setText( QString::number(i) ); } else { ituzLabel->setText("0"); } } } void InfoWidget::showDistanceAndBearing(const QString &_locLocal, const QString &_locDX) {// Local / DX //qDebug() << "InfoWidget::showDistanceAndBearing: " << _locLocal << "/" << _locDX; QString lloc = _locLocal.toUpper(); QString ldx = _locDX.toUpper(); if ( locator->isValidLocator(lloc) ) { if ( locator->isValidLocator(ldx) ) { dxLocator = ldx; int beam = locator->getBeamBetweenLocators(lloc, dxLocator); gradShortLabel->setText( QString::number(beam) ); if (beam >= 180) { gradLongLabel->setText( QString::number(beam -180 ) ); } else { gradLongLabel->setText( QString::number(beam + 180 ) ); } distShortLabel->setText( QString::number( locator->getDistanceBetweenLocators(lloc, dxLocator, imperialSystem) ) ); distLongLabel->setText( QString::number( 40000 - locator->getDistanceBetweenLocators(lloc, dxLocator, imperialSystem) ) ); } else { clearInfoFromLocators(); return; } } else { clearInfoFromLocators(); return ; } } void InfoWidget::setLocalLocator(const QString &_loc) { if (locator->isValidLocator(_loc)) { localLocator = _loc; } } void InfoWidget::setDXLocator(const QString &_loc) { if (locator->isValidLocator(_loc)) { dxLocator = _loc; } } int InfoWidget::getDistance(bool shortPath) { // Returns the distance in KM //qDebug() << Q_FUNC_INFO << distShortLabel->text (); if (shortPath) { return (distShortLabel->text ()).toInt (); } else { return (distLongLabel->text ()).toInt (); } } klog-2.3.3/mainwindow.h0000644000015700001710000005675014542412415014677 0ustar jenkinsjenkins#ifndef KLOG_MAINWINDOW_H #define KLOG_MAINWINDOW_H /*************************************************************************** mainwindow.h - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include #include #include #include "setupdialog.h" #include "aboutdialog.h" #include "tipsdialog.h" #include "world.h" #include "filemanager.h" #include "fileawardmanager.h" #include "dataproxy_sqlite.h" #include "dataproxy_sqlite.h" #include "locator.h" #include "dxcluster.h" #include "awards.h" #include "inputwidgets/mainwindowsattab.h" #include "inputwidgets/mainwindowmydatatab.h" #include "inputwidgets/mainwindowinputcomment.h" #include "inputwidgets/mainwindowinputothers.h" #include "inputwidgets/mainwindowinputeqsl.h" #include "inputwidgets/mainwindowinputqsl.h" #include "inputwidgets/mainwindowinputqso.h" #include "mainqsoentrywidget.h" #include "elogclublog.h" #include "utilities.h" #include "downloadcty.h" #include "dxccstatuswidget.h" #include "awardswidget.h" #include "softwareupdate.h" #include "logwindow.h" #include "searchwidget.h" #include "infowidget.h" #include "showerrordialog.h" #include "udpserver.h" #include "statisticswidget.h" #include "updatesatsdata.h" #include "hamlibclass.h" #include "elogqrzlog.h" #include "lotwutilities.h" #include "eqslutilities.h" #include "widgets/adiflotwexportwidget.h" #include "widgets/showadifimportwidget.h" #include "widgets/map/mapwindowwidget.h" #include "widgets/showkloglogwidget.h" #include "qso.h" #include "updatesettings.h" #include "klogdefinitions.h" class QTimer; class QDateTime; class QPushButton; class QLineEdit; class QComboBox; class QTimeEdit; class QDateEdit; //class QStatusBar; class QMenuBar; class QMenu; class QMessageBox; class QTextEdit; class QProgressDialog; //class QPoint; class QGroupBox; class QTabWidget; class QFrame; class QTableView; class QLabel; /* enum { Log_Id = 0, Log_Name = 1, Log_BandId = 2, Log_ModeId = 3, Log_DateId = 4, Log_TimeId = 5 }; enum { DX = 0, NoContest = 0, CQ_WW_SSB = 1, CQ_WW_CW = 2, CQ_WPX_SSB = 3, CQ_WPX_CW = 4, CQ_WPX_RTTY = 5 }; */ //enum ExportMode {ModeLotW, ModeADIF}; class MainWindow : public QMainWindow { Q_OBJECT friend class tst_MainWindow; public: MainWindow(const QString &tversion); ~MainWindow(); void checkIfNewVersion(); void recommendBackupIfNeeded(); void init(); void showNotWar(); private slots: //void slotQueryErrorManagement(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); //void slotTest(); // Slot for testing purposes only void slotOpenWiki(); void slotAWAImport(); void slotClearNoMorErrorShown(); void slotQueryErrorManagement(QString functionFailed, QString errorCodeS, QString nativeError, QString queryFailed); void slotQRZReturnPressed(); //void slotQRZSpacePressed(); void slotQRZTextChanged(QString _qrz); //void slotSRXTextChanged(); //void slotSTXTextChanged(); void slotUpdateLocator(QString _loc); void slotLocatorTextChanged(const QString &_loc); //void slotMyLocatorTextChanged(); void slotFreqTXChanged(const double _fr); void slotFreqRXChanged(const double _fr); void slotFreqTXChangedFromSat(const double _fr); //void slotSplitCLicked(); //void slotSearchBoxTextChanged(); //void slotCloseStats(bool _vis); void slotSearchToolNeededQSLToSend(); void slotToolSearchRequestedQSLToSend(); void slotToolSearchNeededQSLPendingToReceive(); void slotToolSearchNeededQSLRequested(); void slotToolLoTWMarkAllQueuedThisLog(); void slotToolLoTWMarkAllQueued(); void slotToolLoTWMarkAllYesThisLog(); void slotToolLoTWMarkAllYes(); void slotLoTWDownloadedFileProcess(const QString &_fn); void slotClubLogLogUpload(); void sloteQSLLogUpload(); void slotElogEQSLModifyCurrentLog(); void slotOKButtonClicked(); void slotClearButtonClicked(const QString &_func); void slotBandChanged (const QString &_b); void slotModeChanged (const QString &_m); void slotValidBandsReceived(const QStringList &_b); void slotRefreshDXCCWidget(); void slotLogWinShow(); void slotLogRefresh(); void slotQSODelete(const int _id); void slotQSOsDelete(QList _id); void slotQSOsExportToADIF(QList _id); void slotQRZcomUpload(QList _id); void slotQRZCOMLogUpload(); void slotElogQRZCOMDisable(const bool _b); void slotShowAwards(); void slotUpdateStatusBar(const QString &statusm); void setMainWindowTitle(); void slotSetup(const int _page=0); void slotADIFExport(); void slotLoTWExport(); void slotLoTWDownload(); void slotLoTWFullDownload(); void slotADIFExportSelection(const QString &_call, QList _qsos, ExportMode _eM); void slotADIFExportAll(); void slotADIFImport(); void slotRQSLExport(); void slotReceiveQSOListToShowFromFile(QStringList _qs); void slotTimeOutInfoBars(); // Clears the infoLabels when the timeout emits the signal void slotSetPropModeFromOther(const QString &_p); void slotSetPropModeFromSat(const QString &_p, bool _keep); void slotFillEmptyDXCCInTheLog(); void slotUpdateCTYDAT(); void slotUpdateSATSDAT(); void slotShowStats(); void slotWorldReload(const bool _b); void slotExitFromSlotDialog(const int exitID); void slotSetupDialogFinished (const int _s); void exitQuestion(); void fillQSOData(); bool slotOpenKLogFolder(); void slotFilePrint(); void slotFileClose(); void slotHelpAboutAction(); void slotHelpCheckUpdatesAction(); void slotAboutQt(); void slotTipsAction(); void slotDebugAction(); // MainQSOEntryWidget void slotShowInfoLabel(const QString &_m); void slotAwardsWidgetSetLog(); void slotAwardsWidgetSetYear(); void slotManualMode(bool _enable); // MyDataTab void slotMyLocatorTextChanged(const QString &_loc); // logpanel //void slotRighButtonFromLog( const QPoint& pos); void slotDoubleClickLog( const int _qsoID); //void slotDoubleClickLog( const QModelIndex & index); //SEARCH void slotShowSearchWidget(); // The SearchWidget request being shown //SEARCH // CLUSTER void slotAnalyzeDxClusterSignal(const QStringList _qs); void slotDXClusterSpotArrived(const QString _dxCall, const QString _dxGrid, const double _freq); // CLUSTER //CLUBLOG void slotElogClubLogShowMessage(const QString &_s); void slotElogClubLogProcessAnswer(const int _i, const int _qID); void slotElogClubLogDisable(const bool _b); void slotElogClubLogFileUploaded (QNetworkReply::NetworkError _error, QList _qsos); void slotElogClubLogModifyCurrentLog(); //CLUBLOG // EQSL void slotElogEQSLFileUploaded (QNetworkReply::NetworkError _error, QList _qsos); // EQSL void slotShowSoftUpdateResults(const bool _b); // Software Update: Receives the signal to see if it is needed or not to update // EQSL // QRZCOM void slotElogQRZCOMShowMessage(const QString &_s); void slotElogQRZCOMFoundData(const QString &_t, const QString & _d); void slotElogQRZCOMCheckThisCall(); void slotElogQRZCOMAutoCheck(); //void slotElogQRZCOMAutoCheckFromSetup(const bool _s); void slotElogQRZCOMModifyCurrentLog(); void slotElogQRZCOMLogUploaded (QNetworkReply::NetworkError _error, QList _qsos); // QRZCOM //SATELLITE //void slotSatBandTXComboBoxChanged(const QString &_q); void slotDefineNewBands (const QStringList _bands); //HAMLIB void slotHamlibTXFreqChanged(const double _f); void slotHamlibModeChanged(const QString &_m); //void slotHamlibModeNotADIF(); // PST Rotator //void slotRotatorShow(); // WORLD MAP void slotShowMap(); //DXCCWIDGET //void slotShowQSOFromDXCCWidget(const int _q); void slotShowQSOsFromDXCCWidget(QList _qsos); //UDP Server (WXJT-x) void slotWSJXstatusFromUDPServer(const int _type, const QString &_dxcall, const double _freq, const QString &_mode, const QString &_report, const QString &_de_call, const QString &_de_grid, const QString &_dx_grid, const QString &_sub_mode); void slotWSJTXloggedQSO (const QString &_dxcall, const QString &_mode, const QString &_band, const double _freq, const QString &_mygrid, const QString &_dxgrid, const QString &_rstTX, const QString &_rstRX, const QString &_comment, const QString &_stationcallsign, const QString &_name, const QString &_opCall, const QDateTime &_datetime, const QDateTime &_datetime_off, const QString &_exchangeTX, const QString &_exchangeRX, const QString &_mypwr); void slotCaptureDebugLogs(const QString &_func, const QString &_msg, DebugLogLevel _level); //void slotTakeOverFocus(int _id); void slotTakeOverFocusToQSOTabWidget(); void slotTakeOverFocusToMainQSOInput(); void slotNewLogLevel(DebugLogLevel l); void slotQSO_SetBand(const double _fr); void slotQSO_SetMode(const QString _submode); private: //void setWidgetsOrder(); void startServices(); void backupCurrentQSO(); void restoreCurrentQSO(const bool restoreConfig); void showMessageToEnableTheOnlineService(const OnLineProvider _service); void cleanQRZCOMreceivedDataFromUI(); void saveWindowsSize(); void setWindowSize(const QSize &_size); bool maybeSave(); void setCleaning(const bool _c); bool setHamlib(const bool _b); bool setUDPServer(const bool _b); void logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level); void setLogLevel(const DebugLogLevel _sev); //void fileExportLoTW(const QString &_st, const QString &_grid, const QDate &_startDate, const QDate &_endDate); void fileExportLoTW2(const QString &_call, QList _qsos); //void fileExportClubLog(const QString &_st, const QDate &_startDate, const QDate &_endDate); void fileExportClubLog2(const QString &_call, QList _qsos); //void fileExportEQSL(const QString &_st, const QDate &_startDate, const QDate &_endDate); void fileExportEQSL2(const QString &_call, QList _qsos); //void fileExportADIF(const QString &_st, const QString &_grid, const QDate &_startDate, const QDate &_endDate); void fileExportADIF2(const QString &_call, QList _qsos); bool callTQSL(const QString &_filename, const QString &_call); void showNumberOfSavedQSO(const QString &_fn, const int _n); //QString getCallToUseForLoTWExportUpload(); UpdateSatsData *updateSatsData; //UPDATE CTY.DAT DownLoadCTY *downloadcty; HamLibClass *hamlib; QSO *qso, *backupQSO; bool hamlibActive; bool hamlibChangingMode; bool hamlibModeNotADIFSupported; bool sendQSLByDefault; bool deleteAlwaysAdiFile; MapWindowWidget *mapWindow; // PST Rotator //PSTRotatorSupport *pstRotator; //bool usePSTRotator; //RotatorWidget *rotatorWidget; // void createStatusBar(); void createUI(); void createUIDX(); void reconfigureDXMarathonUI(const bool _dxM); //void createDXClusterUI(); void clearBandLabels(); void createMenusCommon(); void createActionsCommon(); //bool validCharactersInCall(const QString &_qrz); // Looks for SQLi and no valid chars in the QRZ bool readQSOFromUI(); //QString readDataFromUI(); // Reads the QSO data from the UI and returns the SQL Query //QString readDataFromUIDX(); //QString readDataFromUIDXModifying(); void actionsJustAfterAddingOneQSO(); //void clearForNextQSO(); void clearUIDX(bool _full = false); //full= false leaves the "keep this data"; full = true clears everything void setAwardDXCC(const int _qsoId, bool modifying); // Adds or modify the status of a DXCC entity // data << dxcc(id) << band(id) << mode(id) << confirmed(0/1) << qsoid(id) << modify(0/1); //void checkIfWorkedB4(const QString &_qrz); //bool checkContest(); void showStatusOfDXCC(const QStringList _qs); void showDXMarathonNeeded(const int _dxcc, const int _cqz, const int _year, const int _log); bool createConnection(); void openSetup(const int _page=0); //bool processConfigLine(const QString &_line); //void readConfigData(); //void saveSettings(); bool loadSettings(); bool applySettings(); void selectTheLog(const int _i); // Receives a log number from loadSettings and setups all about the logN void defineStationCallsign(const QString &_call); QString selectStationCallsign(); void checkIfNewBandOrMode(); void selectDefaultBand(); void selectDefaultMode(); void readActiveBands (const QStringList actives); void readActiveModes (const QStringList actives); bool checkIfNewMode(const QString &_mode); void addNewValidMode(const QString &_mode); void setModeFromFreq(); void qsoToEdit (const int _qso); void setModifying(const bool _m); void completeWithPreviousQSO(const QString &_call); //void showAwards(); //void showDXMarathon(const int _year); void updateQSLRecAndSent(); //double checkFreqRanges(double _f); //void setRSTToMode(const QString &_m); // CLUSTER void clusterSpotToLog(const QString &_call, const QString &_freq); QStringList dxclusterServersList; //QString dxclusterServerToConnect; //int dxclusterServerPort; bool dxclusterSendSpotsToMap; // CLUSTER //LOTW AdifLoTWExportWidget *adifLoTWExportWidget; //LOTW ShowAdifImportWidget *showAdifImportWidget; QWidget *mainWidget; //QWidget *dxClusterTabWidget;//, *searchTabWidget; World *world; FileManager *filemanager; FileAwardManager *fileAwardManager; Locator *locator; Awards *awards; Utilities *util; //SetupPageMisc *miscPage; //WorldEditorWidget *worldEditor; //HelpHelpDialog *helpHelpDialog; //HelpAboutDialog *helpAboutDialog; AboutDialog *aboutDialog; TipsDialog *tipsDialog; ShowKLogLogWidget * showKLogLogWidget; StatisticsWidget *statsWidget; DXCCStatusWidget *dxccStatusWidget; QLabel *logLabel; //LogModel *logModel; LogWindow *logWindow; UDPServer *UDPLogServer; ShowErrorDialog *showErrorDialog; // QFrame *dxUpLeftInputFrame;//, *dxUpRightOutputFrame; QString statusBarMessage; QTabWidget *dxBottonTab, *dxUpLeftTab, *dxUpRightTab; QMenu *fileMenu; QMenu *toolMenu; QMenu *qslToolMenu; QMenu *lotwToolMenu; QMenu *clublogToolMenu; QMenu *eQSLToolMenu; QMenu *QRZCOMToolMenu; //QMenu *lotwMarkAllAsQueuedMenu; //QMenu *lotwMarkAllInThisLogAsQueuedMenu; QMenu *viewMenu; //QMenu *setupMenu; QMenu *helpMenu; //QAction *TestAct; // Action for testing purposes only QAction *awardAddAct; QAction *klogFolderAct; //QAction *openAct; //QAction *saveAct; QAction *exitAct; QAction *printLogAct; QAction *addAct; QAction *editAct; QAction *removeAct; QAction *logWinAct; QAction *setupAct; QAction *helpAct; QAction *aboutAct; QAction *tipsAct; QAction *debugAct; QAction *aboutQtAct; QAction *updateAct; QAction *scoreWinAct; QAction *scoreeWinAct; QAction *ADIFExport; QAction *ADIFExportAll; QAction *ADIFImport; //QAction *LoTWExport; QAction *LoTWImport; QAction *ReqQSLExport; QAction *CabrilloExport; QAction *fillQsoAct; QAction *fillDXCCAct; QAction *findQSO2QSLAct; QAction *findRequestedQSLAct; QAction *findQSLPendingToReceiveAct; QAction *findQSLDXRequestedAct; QAction *lotwMarkSentQueuedThisLogAct; QAction *lotwMarkSentQueuedAct; QAction *lotwMarkSentYesThisLogAct; QAction *lotwMarkSentYesAct; QAction *lotwCallTQSL; QAction *lotwUpdateFromLoTWAct; QAction *lotwFullDownloadFromLoTWAct; QAction *clublogLogUploadAct; QAction *clublogLogModifyCurrentLogAct; QAction *eqslUploadAct; QAction *eqslLogModifyCurrentLogAct; QAction *QRZCOMCheckThisCallAct; QAction *QRZCOMAutoCheckAct; QAction *QRZCOMLogUploadAct; QAction *QRZCOMLogModifyCurrentLogAct; QAction *downloadCTYAct; QAction *downloadSATSAct; QAction *showStatsAct; //QAction *showRotatorAct; //QAction *showDXCCSummaryAct; QAction *loggWinAct; /* QAction *delQSOFromLogAct; QAction *qsoToEditFromLogAct; QAction *qslSentViaBureauFromLogAct; QAction *qslSentViaDirectFromLogAct; QAction *qslRecViaBureauFromLogAct; QAction *qslRecViaDirectFromLogAct; */ QAction *qslSentRequestedAct; QAction *qslRecRequestedAct; QAction *showMapAct; QStringList bands; QStringList modes; QStringList entitiesList, propModeList; // UI DX //QLabel *entitySecLabel, *iotaAwardLabel, *entityNameLabel, *propModeLabel; //entityPrimLabel QLabel *infoLabel1, *infoLabel2, *dxMarathonLabelN, *dxMarathonTopScoreLabelN; QString lotwTQSLpath; bool checkNewVersions, reportInfo; // Selected in the Setup->Misc to check if new versions and report info back to KLog's servers bool logEvents; // Should KLog log the events for debugging DebugLogLevel logLevel; // Manages as syslog, the severity of the application debug log (7 means debug, 0 emergency) bool txFreqBeingChanged, updatingBands; //rxFreqBeingChanged // When the freqs is being modified it is defined to true to prevent other automated to change. bool txFreqBeingAutoChanged, rxFreqBeingAutoChanged; // This is defined to true when freq is being changed by the Sat tab to prevent a loop. bool qslingNeeded; bool noMoreErrorShown; // If true, the errors shown in slotQueryErrorManagement will not be shown anymore in that KLog execution bool noMoreModeErrorShown; // If true, the non-valid modes received from WSJT-x will not be showed to the user bool wsjtxAutoLog; // If true, logged QSO are automatically logged into the log when sent from WSJTX bool manualMode; // If true, hamlib and WSJTX are not updatind the interface MainWindowSatTab *satTabWidget; MainWindowMyDataTab *myDataTabWidget; MainWindowInputComment *commentTabWidget; MainWindowInputOthers *othersTabWidget; MainWindowInputEQSL *eQSLTabWidget; MainWindowInputQSL *QSLTabWidget; MainWindowInputQSO *QSOTabWidget; MainQSOEntryWidget *mainQSOEntryWidget; AwardsWidget *awardsWidget; SearchWidget *searchWidget; InfoWidget *infoWidget; //AdvancedSearchWidget *advancedSearchWidget; bool keepSatPage; // UI DX SetupDialog *setupDialog; // DXClusterWidget *dxClusterWidget; bool dxClusterShowHF, dxClusterShowVHF, dxClusterShowWARC, dxClusterShowWorked, dxClusterShowConfirmed, dxClusterShowAnn, dxClusterShowWWV, dxClusterShowWCY; // // int infoTimeout; // timeout that temporary info will stay in the infobars QTimer *timer, *timerInfoBars; QDateTime *dateTime, *dateTimeTemp; bool yearChangedDuringModification; QString infoLabel1T, infoLabel2T; QString ctyDatFile, defaultADIFLogFile; QString softwareVersion; bool itIsANewversion; int dupeSlotInSeconds; QString stx; QString srx; QPalette palRed, palBlack; // To paint Text in red or black(normal) bool alwaysADIF, needToSave, useDefaultLogFileName, upAndRunning, qrzSmallModDontCalculate, imperialSystem, sendQSLWhenRec, manageDxMarathon, completeWithPrevious, completedWithPreviousQTH, completedWithPreviousLocator, completedWithPreviousName, completedWithPreviousIOTA, completedWithPreviousQSLVia; // bool realTime, UTCTime; bool cleaning; bool manageMode; // If true, the DXCC and awards will take the mode into consideration to decide if needed or worked. False implies only band is taken into account // Station Setup bool configured, modify; bool needToEnd; // Just to control if the software needs to end. bool qrzAutoChanging; //To remove the data coming from QRZ.com only when data is coming. QString mainQRZ, stationCallsign, operatorQRZ, dxLocator; //int my_CQz, my_ITUz; Not used int defaultMode, defaultBand, currentMode, currentModeShown, currentBand, currentBandShown; int currentEntity, previousEntity; bool InValidCharsInPrevCall; int currentLog; // This is to be able to manage multiple logs without showing // them all at the same time. int modifyingQSO; // When modifying, the QSO is saved here. int selectedYear; bool readingTheUI; // While reading the data from UI after QSO intro or modificationthis is true // Station Setup QColor defaultColor; QColor neededColor; QColor workedColor; QColor confirmedColor; QColor newOneColor; QSize windowSize; // bool clublogActive, clublogRealTime, eQSLActive; //clublogUseStationCallSign, eLogClubLog *elogClublog; int clublogAnswer; QStringList clublogPrevQSO; // // QRZ.com bool qrzcomActive; bool qrzcomSubscriber; eLogQrzLog *elogQRZcom; // QRz.com - END // Contest //int points, qsoPoints, multipliers, qsoMultiplier; //QString contestMode; //Contest *contest; // Contest DataProxy_SQLite *dataProxy; SoftwareUpdate *softUpdate; bool callingUpdate; bool UDPServerStart; // LOTWUTILITIES LoTWUtilities *lotwUtilities; bool lotwActive; //eQSLUtilities eQSLUtilities *eqslUtilities; //LOGVIEW //QString bandOld, modeOld; //LOGVIEW signals: void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution protected: void keyPressEvent(QKeyEvent *event) override; void closeEvent(QCloseEvent *event) override; void showEvent(QShowEvent *event) override; }; #endif klog-2.3.3/main.cpp0000644000015700001710000003637014542412415013776 0ustar jenkinsjenkins/*************************************************************************** main.cpp - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include //#include #include #include #include #include #include #include #include #include #include #include "startwizard.h" #include "mainwindow.h" #include "utilities.h" int main(int argc, char *argv[]) { //qDebug() << Q_FUNC_INFO << " - Start! "; //qDebug() << Q_FUNC_INFO << " - " << QSslSocket::supportsSsl() << QSslSocket::sslLibraryBuildVersionString() << QSslSocket::sslLibraryVersionString(); QT_REQUIRE_VERSION(argc, argv, "5.9") //qDebug() << QT_VERSION_STR; QDir d1 = QDir(); //QCoreApplication::setApplicationVersion(QString(APP_VERSION)); //qDebug() << Q_FUNC_INFO << " - STARTED: "; Utilities util(Q_FUNC_INFO); QStringList arguments; QTextStream cout(stdout); //QCoreApplication::setOrganizationName("EA4K"); //QCoreApplication::setOrganizationDomain("klog.xyz"); //QCoreApplication::setApplicationName("KLog"); QApplication app(argc, argv); QString iconSt; iconSt = ":/img/klog.ico"; QIcon KLogIcon(iconSt); QApplication::setWindowIcon(KLogIcon); app.setApplicationName(QString("KLog")); app.setOrganizationName("EA4K"); app.setOrganizationDomain("klog.xyz"); app.setApplicationVersion(QString(APP_VERSION)); QString version = QCoreApplication::applicationVersion(); //qDebug() << Q_FUNC_INFO << " - -10 "; // Now we check if the user is executing from the command line arguments.clear(); arguments << app.arguments(); if (arguments.length()>1) { if (arguments.contains("-v")) { cout << "Version: KLog-" << app.applicationVersion() << "\n"; } else if ((arguments.contains("-?")) || (arguments.contains("-h")) ) { util.printCommandHelp(); } else { util.printCommandHelp(); app.quit(); return 1; } app.quit(); return 0; } //qDebug() << Q_FUNC_INFO << " - Start of translation activities: "<< (QTime::currentTime()).toString("HH:mm:ss"); //qDebug() << Q_FUNC_INFO << " - Detected language: " << (QLocale::system().name()).left(2) << ".qm"; // Translations begin QTranslator qtTranslator; qtTranslator.load("qt_" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath)); /* Flawfinder: ignore */ app.installTranslator(&qtTranslator); QTranslator myappTranslator; bool missingTranslation = false; //QString msgOSFilePath = QString(); // The OS depending part of the message to be printed if no translation is found. #if defined(Q_OS_WIN) //qDebug() << Q_FUNC_INFO << " - WIN "; //qDebug() << Q_FUNC_INFO << " - 20 - WIN"; if (QFile::exists(QCoreApplication::applicationDirPath() + "/translations/klog_" + (QLocale::system().name()).left(2) + ".qm") ) /* Flawfinder: ignore */ { myappTranslator.load(QCoreApplication::applicationDirPath() + "/translations/klog_" + (QLocale::system().name()).left(2) + ".qm"); /* Flawfinder: ignore */ } else if (QFile::exists(QDir::homePath()+"/klog/klog_" + (QLocale::system().name()).left(2)+ ".qm") ) /* Flawfinder: ignore */ { myappTranslator.load(QDir::homePath()+"/klog/klog_" + (QLocale::system().name())); /* Flawfinder: ignore */ } else if (((QLocale::system().name()).left(2)) == "en") /* Flawfinder: ignore */ { // If language is English, it will execute without showing message } else { missingTranslation = true; //msgOSFilePath = QCoreApplication::applicationDirPath() + "/translations/" ; } //qDebug() << Q_FUNC_INFO << " - -20 - end WIN "; #elif defined(Q_OS_OSX) //qDebug() << Q_FUNC_INFO << " - OSX "; if (QFile::exists(QCoreApplication::applicationDirPath() + "/translations/klog_" + (QLocale::system().name()).left(2) + ".qm") ) /* Flawfinder: ignore */ { myappTranslator.load(QCoreApplication::applicationDirPath() + "/translations/klog_" + (QLocale::system().name()).left(2) + ".qm"); /* Flawfinder: ignore */ } else if (((QLocale::system().name()).left(2)) == "en") /* Flawfinder: ignore */ { // If language is English, it will execute without showing message } else { missingTranslation = true; } #else //qDebug() << Q_FUNC_INFO << " - OTHER OS: " << (QLocale::system()).name(); if (QFile::exists("klog_" + (QLocale::system().name()).left(2) + ".qm") ) /* Flawfinder: ignore */ { myappTranslator.load("klog_" + (QLocale::system().name()).left(2)); /* Flawfinder: ignore */ } else if (QFile::exists("/usr/share/klog/translations/klog_" + (QLocale::system().name()).left(2) + ".qm") ) /* Flawfinder: ignore */ { //qDebug() << Q_FUNC_INFO << " - OTHER -2: " << "/usr/share/klog/klog_" + (QLocale::system().name()).left(2); /* Flawfinder: ignore */ myappTranslator.load("/usr/share/klog/translations/klog_" + (QLocale::system().name())); /* Flawfinder: ignore */ } else if (QFile::exists(QCoreApplication::applicationDirPath() + "/translations/klog_" + (QLocale::system().name()).left(2) + ".qm")) /* Flawfinder: ignore */ { //qDebug() << Q_FUNC_INFO << " - OTHER -3: " << QCoreApplication::applicationDirPath() + "/translations/klog_" + (QLocale::system().name()).left(2); myappTranslator.load(QCoreApplication::applicationDirPath() + "/translations/klog_" + (QLocale::system().name())); /* Flawfinder: ignore */ } else if (((QLocale::system().name()).left(2)) == "en") /* Flawfinder: ignore */ { // If language is English, it will execute without showing message } else { missingTranslation = true; //sgOSFilePath = QCoreApplication::applicationDirPath() + "/translations/" ; } #endif //qDebug() << Q_FUNC_INFO << " - -40 "; if (missingTranslation) { //qDebug() << Q_FUNC_INFO << " - Translation missing! "; QMessageBox msgBox; QString urlTranslate = QString(); urlTranslate = "

TRANSLATE

"; QString msg = QString(); msgBox.setWindowTitle("KLog"); msgBox.setIcon(QMessageBox::Warning); msgBox.setTextFormat(Qt::RichText); QString language = (QLocale::system().name()).left(2); /* Flawfinder: ignore */ msg = QString("No translation files for your language have been found so KLog will be shown in English.") + "

" + QString("If you have the klog_%1.qm file for your language, you can copy it into the %2/translations/ folder and restart KLog.

If you want to help to translate KLog into your language, please contact the author.").arg(language).arg(QCoreApplication::applicationDirPath()) + "

" + urlTranslate; msgBox.setText(msg); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } //qDebug() << Q_FUNC_INFO << " - 1" << (QTime::currentTime()).toString("HH:mm:ss") ; app.installTranslator(&myappTranslator); //qDebug() << Q_FUNC_INFO << " - End of translation activities: "<< (QTime::currentTime()).toString("HH:mm:ss"); // Traslations end /* Application Singleton * * We want to run only one instance of KLog application */ QSystemSemaphore semaphore("klogapp", 1); // create semaphore with unique ID klogapp semaphore.acquire(); // Raise the semaphore, barring other instances to work with shared memory #ifndef KLOG_Q_OS_WIN // in linux / unix shared memory is not freed when the application terminates abnormally, // so you need to get rid of the garbage QSharedMemory nix_fix_shared_memory("klogshm"); if (nix_fix_shared_memory.attach()) { nix_fix_shared_memory.detach(); // if there is no running instance then it remove the orphaned shared memory } #endif QSharedMemory sharedMemory("klogshm"); // Create a copy of the shared memory - Unique ID klogshm bool is_running; /* * trying to attach a copy of the shared memory to an existing segment * * if successful, it determines that there is already a running instance * otherwise allocate 1 byte of memory and no instance is running */ if (sharedMemory.attach()) { is_running = true; } else { sharedMemory.create(1); is_running = false; } semaphore.release(); // If you already run one instance of the application, then we inform the user about it // and complete the current instance of the application if (is_running) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setText(QObject::tr("KLog is already running.") + "\n" + QObject::tr("It is allowed to run only one instance.")); msgBox.exec(); return 1; } // END OF Application Singleton QString klogDir = util.getHomeDir(); //configFileName = util.getCfgFile(); //qDebug() << Q_FUNC_INFO << " - 10"; //qDebug() << Q_FUNC_INFO << " - Setting klog dir: " << (QTime::currentTime()).toString("HH:mm:ss")<< QT_ENDL;; if (!QDir::setCurrent (klogDir) ) { //qDebug() << Q_FUNC_INFO << " - KLogDir does not exist.... creating "; if (d1.mkdir(klogDir)) { if (QDir::setCurrent (klogDir) ) { //qDebug() << Q_FUNC_INFO << " - KLogDir has just been created and pointed "; } } } //qDebug() << Q_FUNC_INFO << " - Setting klog dir - finished: " << (QTime::currentTime()).toString("HH:mm:ss"); //qDebug() << Q_FUNC_INFO << " - Setting config file: " << (QTime::currentTime()).toString("HH:mm:ss") ; QPixmap pixmap(":img/klog_512x512.png"); //qDebug() << Q_FUNC_INFO << " - 51" << (QTime::currentTime()).toString("HH:mm:ss"); QSplashScreen splash(pixmap); if (!((QFile::exists(util.getCfgFile ())))) { //qDebug() << Q_FUNC_INFO << " - Starting wizard... "; StartWizard *wizard = new StartWizard(klogDir, version); wizard->setModal(true); wizard->exec(); } else { //qDebug() << Q_FUNC_INFO << " - Start of DB Activities" << (QTime::currentTime()).toString("HH:mm:ss"); DataBase *db = new DataBase(Q_FUNC_INFO, version, util.getKLogDBFile()); //qDebug() << Q_FUNC_INFO << " - After Start of DB Activities"; if (!db->createConnection(Q_FUNC_INFO)) { //qDebug() << Q_FUNC_INFO << " - Conection not created"; return -1; // Exits with an error; no DB has been created } else { //qDebug() << Q_FUNC_INFO << " - DB to be updated"; db->updateIfNeeded(); // Check if we need to update the DB //qDebug() << Q_FUNC_INFO << " - DB Updated"; } //qDebug() << Q_FUNC_INFO << " - DB Updated"; //qDebug() << Q_FUNC_INFO << " - 98" << (QTime::currentTime()).toString("HH:mm:ss"); db->~DataBase(); //qDebug() << Q_FUNC_INFO << " - 99" << (QTime::currentTime()).toString("HH:mm:ss"); } //qDebug() << Q_FUNC_INFO << " - 100 " << (QTime::currentTime()).toString("HH:mm:ss"); splash.show(); //qDebug() << Q_FUNC_INFO << " - 101 " << (QTime::currentTime()).toString("HH:mm:ss"); splash.showMessage ("Creating window..."); //qDebug() << Q_FUNC_INFO << " - 102 " << (QTime::currentTime()).toString("HH:mm:ss"); MainWindow mw(version); //qDebug() << Q_FUNC_INFO << " - 103 " << (QTime::currentTime()).toString("HH:mm:ss"); splash.showMessage ("Initializing window..."); //qDebug() << Q_FUNC_INFO << " - 104 " << (QTime::currentTime()).toString("HH:mm:ss"); mw.init(); //qDebug() << Q_FUNC_INFO << " - 105 " << (QTime::currentTime()).toString("HH:mm:ss"); splash.showMessage ("Checking for new versions..."); //qDebug() << Q_FUNC_INFO << " - 106 " << (QTime::currentTime()).toString("HH:mm:ss"); mw.checkIfNewVersion(); //qDebug() << Q_FUNC_INFO << " - 107 " << (QTime::currentTime()).toString("HH:mm:ss"); splash.showMessage ("Checking if backup is needed..."); //qDebug() << Q_FUNC_INFO << " - 108 " << (QTime::currentTime()).toString("HH:mm:ss"); mw.recommendBackupIfNeeded(); //qDebug() << Q_FUNC_INFO << " - 109 " << (QTime::currentTime()).toString("HH:mm:ss"); splash.showMessage ("Showing window..."); //qDebug() << Q_FUNC_INFO << " - 110 " << (QTime::currentTime()).toString("HH:mm:ss"); mw.show(); //qDebug() << Q_FUNC_INFO << " - 111 " << (QTime::currentTime()).toString("HH:mm:ss"); splash.finish(&mw); //qDebug() << Q_FUNC_INFO << " - 112 " << (QTime::currentTime()).toString("HH:mm:ss"); mw.showNotWar(); //qDebug() << Q_FUNC_INFO << " - 113 " << (QTime::currentTime()).toString("HH:mm:ss"); //qDebug() << Q_FUNC_INFO << " - END"; return app.exec(); } klog-2.3.3/klog.ico0000644000015700001710000032473514542412415014003 0ustar jenkinsjenkins Ç©‰PNG  IHDRôxÔú IDATxœìÝwxœÅµøñï¼[´Òª÷f¹âŠ»ÁÝØ²1Åz %ÉM#!•›„â„b !íæ&!…”_ „„\ÀX€é†ÐŒ{¯rQ_iû;¿?feK²l¯dI«•ÎçyöYiµ»š•vß9ïÌ™3 „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!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„¢×©D7@‘0 ÈÒ4À»Ý¤œà±A@a û>4‡Z Ò[ Bœ: „8,`0(r\.WzaaaYvvvYVVVQFFF®×ëÍLKKKs8nbÇe`Y–RJ)˲ÐZs‰F£Ú¶ívßG£ÑÖkmÛ¶¶m›H$bH0ôûý~_sss}ssóaŸÏ·³¹¹y§ÖÚ‡ »˜ BÑG$"yXÀéÀh (333oذaSŠŠŠ†ååådeee¸ GjjªJKKSn·[E"¢‘ˆŠD"DLg­¢Ñ(ÑHÛ¶‰}mn³mìhTE¢QìhôHGoÇ®´m£c×(¥ÑÚ\J)­”Ò­÷o½ ¥´eY¶ÖZt(²#‘ˆƒvccccSSÓÞúúúuÍÍÍLpð>PÝwf! „èZ;ú‰N§sÈØ±cg 6ltiii‘×ëõ¤¦¦:222,¯×«"á° ‡Ã*‰‰Dˆ„B* ©p8L8&ëä;;›ï±Ûµ6AAœ÷sàQ–…eYÚ²,[Y–­”BY–v8ÑH$bûý~; êp8l766Ö×ÕÕm©¯¯ͶíÀ&àM %aÿ%!’œB$–˜Œ;í´Ó&;öŒ¡C‡V¤§§§edd8rss-mÛ* ªp8L0  ªp(tLçÞë}Þ`™Á¶œNÛaY¶eY6JEü~¿Aˆ666lhhx7 ¾ ¬^B¦„ˆ‹BôL¦–——Oœ1cÆÂ‘#GËÊÊJ-((p¸Ýnðû …B*ðûU(2£m†ïëŽùx?ëê™WŸ§õþt¸M)…åpا3¢”Ò–Ã …B¿ß¯@¨©©i[ccc•Özð"°+±ÿv!ú' „è=)Àb`ìŒ3*g̘qFqqqV~~¾#==Ý * ðû•ßï'w»³¶µ†D ]ýÝqÞ¿µóï,H°c?·m»5(ˆ*ËŠ´Žh °}>ß¾æææç´ÖïÏaò „ô$¢çXÀ<`æôéÓÏ=ãŒ3&———§;-˲‚¦³Çï÷«pìÌþDg¿v’±¼ãI£»ØyŸ #îìgÇûv›ÄÀ¸–“~‚×Þñ1J)m9a ŠRáP( Ñ–––]¡PèààdÊ@ RqjŠ€s***Î_¸paåÈ‘#3JKK]n·Û øý4·´(K ‘HäèPö‰:ÝuŠÇùYw;þãu¦]mŸÝö9»øšŽ¹=6äßÙï?Þï‰÷õÇV!„4Dm­C¡P( CápøM­õ߀!« Ä "€]7Ͳ¬¥‹-º|ÆŒcÊÊÊŸ øýÇvh'épOÖ!w§3·m›@ @0$ ‡‰F£„ZWÄ~  µ¹Ç–Öý”þX¦ N‡§Ó‰ÃéÄår‘’’‚Óå²,sŸØýÀ±¯¥›þ‰:þN“͵¶µjÛÛÔ&ÊÙ üø?L¡"! „8¾ééé-[¶ìò &VTT¸ÐÚjni¡©±ñèY~ÛËI:ôx:ýuî---øý~‚±N»©±‘ºº:êëêð55Û¡' ‡ÃËåÂívãv»q8G ‡ÃqÂü‚®Žœp"FCPCH-y¼xø ¦z¡IO!Ú›dYÖ‡–-[víôéÓ‡ 6ÌmG£Êçó)ŸÏwd8œ¶CÉÝìäw¿ßO“ÏG0 ¹¥…ÕÕ:xúúz¢Ñh¢ÿ>}N)u$@pÅFZGàäÓ ñü?N@Û&bö=ˆÏÝ&DR’@È®ž={ö',X0vĈ).§Óò57ÓÔØ¨ÚίÃïNç …¨¯¯ÇPW[ËÞ½{9X]?Hôß#i8Ž#—Ö„xþ/@—GJÌ,ˆÍÀcÀ€w{ø¥ Ñë$ƒÙÂâââk/¾øâKÆŒ“••åhòùÌð~'kòOåâ÷û©«¯ÇßÒ¾ýûÙ»{7µµµI9\ßßµhçÙ~Ü4DbÓó-ï¿ÀŒ ¾a‘”$ƒMR꺥K—~fÖ¬Yî`  T0èòÐ}g—h4Jmm----ìÝ»—íÛ¶Q__Ÿè×-z‰ X ê_Ç.‡Ú0!NB1XLËÎÎþÔe—]vÕØ±cÓ332ª©±QuµÓ:íðÙ¾u+;¶o'–©áÁ&6*Ð „1y?ÞKlË„èœb s—7îsçœsδѣG§„‚A«¡¡áȲ=8vùY«¾¾^Ùµ9Ù~ë~mm-{öîeãºu’¨'â¢!h›-‹£À;˜@àÉĶJC1Ÿ:ÿüó?3sæÌ¢ŒŒ gC]åóùÚU¬‹§Ã×ZSWWGMm-Ö¯§zÿþ¾,‘ì4„b@ØüSWàÔ+/ ÑMˆ`„eY7.[¶ì£S¦LÉL÷z555VÛê|pòοuhÿàÁƒ¬ûàùšÄ¤!l›åƒ`;p?¦¸,}N‘Ì*Ç/¸à‚M™2%ÃaYÎÚÚZ+ž?Ù™>˜ºóµµµ8p€õ|@sKKÂ^Œ 1¡–¢¿»`äȑߜ={ö„¼¼ÌŠåÀïÜ$‘„$‰rfzzúO'NœxZº×ëi¨«sGÚ ÷·½ƒÔ×ÕqèÐ!éø…8ªm’à«Àç€Ý n“H"ˆ¾–Ü1|øð)/Oõ·´x~¿¥:tüáp˜ºº:êêê¤ãâ8bE„š0—¯Kp“D’@ô¥Ùn·ûÁ1cÆT¸]®ÔfŸÏ­mû˜3þh4JSS“tüBÄOÇrB˜=n¤Ü¥8! D_°€[ ¾TTX˜ …ÒÂÁ Õ±ã·m¿ßOCCƒTì¢b•}À^à3Àk n’èÇ$½m¼eY?,..ž‘–ššêoiñèXçÞ6…Bø|>Z—ý !º-5ÓAàÀw‘*‚¢ˆÞt½Ûí¾7///CÛ¶7 9¡}ÇßzÖ/ëø…èY64ÇÊ ¿€I<à&‰~FÑ2€û=Ïei©©žH8ìEkÕqy_$‘Ž_ˆ^Ô&A°ø,°:ÁMýˆ#Ñ Î¥Ô£.—k¾¡`0-‰¨H$B4%D‡Ã2Ï/D/Sà°À£!¸“$øz‚›%ú =ézà; < 28Ý !„«žnÄ|-1 DOp×(p[™è !ŽeCP›)u˜€}W‚›$Hqª ßgXàUšàö!N@CÄ6» 6`‚€—Ü$‘ ’ NÅTLÑ‘Ñd)3Ï(„èÇX¤hSŸã2`ð~‚›%@Ñ]W`6 Éq@¶Ì÷ ‘T”ÀÎÆ¬Ü©Jl“D_“@tÇ÷(Hu@62•$DRj3j7< Ä nÑ.àGÀ R-ð&ºABˆSgC@›Â/ÅäˆN¯ àwÀ|é±áC!Ä+Ô¼ |¨Ip“D/“@Ä£x˜dA¦w¢$„èy± ÀFà*`O‚›$z‘âd†FÆ2ý%Ù¯ÓÚÌáÚ@4vÝq'ÝæºÓ¯·sŒjÌPm.trÝú…ÂäY€¥Ú?Fô3m‚€ÝÀ•Àæ7IôùŠ™< ÇÎü¥óOm:fˆQ}äf¢Útò'ÛB1„1Ãc—¦œ?vi‰ÝØ}W%΋éÈÁ$yc—4Ì´P f„È»>Ù{Æ¡Lpà vHbK¾º€ È]²€tLÐP ”Å.˜\“Ž«“TlÚÉŠ}í\JÞ“½ÍŽš‘€CÀÅÀú·Gô0 Dg¦Ù±Î_Þ'=$ÖÑõÑ3øíGèC˜Î{7总ÓÙï¶Å®òÞîPŒÀyÀp`PŽ ŽŒ*´˜©‡Š}Ý×ÀZƒ€Ã˜ `]‚Û#zØEGÓ1–tþ§&v6Òæl¾u¾U¦CØìÖ[û¼¡ÉE£Ó1ÂÌhÕÚ/Ku+p*3b‚§¢5¨Á$¸=¢‡ÈÁ]´uð S:ÿ®Ó¦³Ä:ûÐÑ›9¼…éìwk0¾èY£€˜ƒ9˜Qƒ¬ÖƇ2Ó®Ä41iµ ‘ÄÀAð¢ÕdàïÈ™\bCø¡XgÔGçê›÷€ÕÀ&àEÌ\¼HŒaÀ\L0pfj¡u«S™‘·$¸ÆÅ¶¡^›i¨ 0ÓS"‰ÉA^ŒÅìž/ÿñÅÎîC±yûÖŒùFÌý À›±Ë@ž£Ov.`>f#«³1S ­åpݱÑI0<®hl$`3ð!̈€HRr §O%’íß^ì,?ëøƒæ&˜áü•À«±¯Eòr 0Á2ÌH#¤Ä)|ÕF›:k‹0_‹$$ÀàVüÛÔgÐwþÚÁ Ä–àµÎãÀŒ¼„éøƒ‰jŸèuÀy˜é‚JÌrEpK0`Ä‚€zÌTוID€Á+ø?`¢e¶ó´;CÆ:ý`lh¿uYÞfÌÈÈJLòž|,Ì4Á"Ìpw€O, Ô‰„möxøL¢Û#ºN€ÁÉ…)ï;?ÖùʨÖN¿Íðþfà1ÌÙ¾,lj™&¸ ¨6ÁÀ ü µÙEð€»ÝÑ5 N¿.¤ûDc­¦Óßü³B–6‰x-ÄdÂ_dbò<±Ë :®ÚЬMÊ/a6 IbP½QË/*ȰŽf?x±N?ˆ™ÛoÆ ïÿ3¯/Dw¹0‰pæa*¦ÄA3E`C£6Ÿ«‹0«bD`p¹xPAšÕ¾jÚ€«Àços¶¿x³Á‘$ò‰ž6³…îÇ€"̨@ªe6Fð¢&)°“7!Û' )À?¤[mª£ DÚlªÓzÆþüY²×-÷ßÿ]g0L·míQ íõ¦5:Tç¿ï¾{¤ÞAç,Ì™ð'0yVlD u€×ˆÆ‚€w0¹d÷s %˜löÒØr¿)–•ìÇ ó×?~©»/âôØcdýú-¹J©³1ÙÌ&<©˜Š‡û·´æ_‡zR©¨ïÖ[ï` s£€1#n)–Ùq@®ºÑŽÕøð…D·Gœ˜Ÿ…Yî7+Öù¸†`¬ã`²÷ÿs Ÿðâ+VÜ úZóEÌ®|'¢J©¯åæŽøË7^+AÀñŸÂŒ dÆj ¤ ÄÕü¶É¸³ªFôS |÷Ÿ² k %%Å–ñµÄvÝ{ø.ðï7+‘Z?ϺÃ×q¹ûî»b‚§qtíØ¾‰èïßyç·¤ ̉¹k›¢X¥Aï@ bIMÀ`C¢Û#:'ÀÀvðolØq@ˆñ·`:þ5À€gÛª>—I:»”ƾOÃ|®]˜¿ÑAÌ^î‡-˜@é&7ÂøÎw¾g…B-W`Ört³=à³~à¡{ï½×>é½… øðe xŽèX>À˜ @òú¡òfÇ üD{ tþ±ùÅfLgó.pP•ØVõ7æÌüBÌf6­óò]ù G1S%µ˜„ÈU@U0Ø ml"Ào€‡4|YCP'¶T7iGi•ÙnÙ«Íû÷_ ž`=i$í›KœÐrà‹`Þß¶Í8„éøfpl·[ŠéL?÷Æ/HMM哟ü$EE…hÝîOUJ=ª”ºí¶ÛnßÞÙco¿ýV+%Åsp;í#;IË—³±7Ú<d_Á$ ¦Äjv¤&¸M§Ä†mVŽÌÕ¢ŸHöa&q¬ÙÀçbkŽ“¶ó·Á…:m殿 LÇ”ì迳±Ê˜aÓ^éüæÌ™MqqQÇΟ͛7‡|ðoÜvÛíû÷Ø+îµAÓá·U íùÖõÀ71ŸãG54Å>¡“<®ß²ÌÆcÀ÷ÝÑž‹ø)f­qRVúÓŠð|˜ ‹æ`殺"L-õÿÅt¤½Æét2uêÔv¿RŠðøã§îÞ½ûÛÀ/Ç{ŽåË¿Õ ¬ëøÔZ“ß+\va–Ñ}XcCcìL:šàvu‡;]€ÙjYô ,w屈;ÙØ±ƒ\#ðL²Ûç0C‡…)Óü p)}ð¹œ:u*ÙÙÙí€p8ÌêÕ«inn“äwðð Ž?ÑqHW+50’Nû‰×s€5챡.¶&©(SÙ…ÈIpsDŒ$sëbK‰’ªØ†@,»¿ ¸³[á`YJV‚™â¸†î|•·¬Œ´ü|¼%Å ,´mc‡BêëðíÛOËDÑQs9fÌh”RG¥»víâÝwßëøÊ1ÿ“ëaFe|ðgŽƒu l¥Tm—_‡8™Ç€g€;4\… eV $Ínž¤ÛPÜÉo &ÀÀàÁ¬áv%Ù’¿hÔtúàŸÀc’ýp%¦PS—†û3G¦|Á|ÊæÌÁ[XHZAŽT—ÛtêmïlÛDC!B>þššvíâÀoPXT„mÛmîfóÞ{ÇtþmÇL/}¸xòðášlÌrĶ‚ÀŽ®¼·à&à·Àl˜+-œN$t+³9Rš6;'þÙ50á$n†ÄIÁ6»ô5c†ø¿ŽY&4(à4LÕ ‰s¸ßr»©8g)㮺šÜqcq¥™8O·éĵmwš!i¹\xrrðäæ’{Úi Ÿ=›ì§Ÿ6“.1>Ÿ-[¶ž¬`&&ó…­[·¾0räȼ¶°[kèeï•À—4Ü…°éÉ0`AZÔ‰÷KøI½ýšÉo,ð‰XÖ¿ÿjˆÚ&Á/„N¾Øò ©ÿuÌPh\*ÎYʤO~’¼ñã Ûk»3$Z£w €ŠFA=iôùšihˆûß,}ë­ÿ,±mm RõxRZƒÖúÅåËo»êÛòå·¨””T¯mS¬”• všRêÖº:--\wóÍw–© ®²10ÿ… ˜–,£xm3rt &˜ Ò¯ß(".8L–~-6×ïà ó‰ÁU¾wf®ñžõ§¤pÆ-ß`ÔâLí¹-å½Rºz5ºMÐX\ÌÊ›XûË_Ž? ¤¤$xÆgø&LÍÌÌüØ-·ÜzÒÑœ;îøV–Ãá83 2³þ½µQSyð]¥ø«RÖ£·Ýv{}—5¸(Lñ¥o` eô÷%À±½ªi˜‘@‘$·Ë€ŸÇ>ðUrë/tìÇÌõ–-z³0æÏÐ…­˜ó§O猛¿BÑÔ©Ý;Û?Œ}û(zõÕv#£Fqpʯ]Ëú?ü‘íO>ÙÕßk;ÎF˲¾ …~Äq–mÞsϽîh4üa¥Ô׈oÓ¡(°Ô—@W-_þM2>¾Ó€‰ RûùRàhê0K|¿èÆ VI•-.Úñ+ÈéÏt ¡Øþ൘e}ÄEMºh!fˆó â¬ææHKãŒ[nጯÜDfEèžïïRIß»§]à/( ¥°oQeóæS0iþº:|»wÇû´Ê¶mO4]‚9«ßÙîÈ X±âî|­íß*¥¾™‰çÄŠÝw°¡ªªjc¼ „j1ï7'0EC$¶Û`\îma¦1NÇ´9é–6$¯Ïç[foñþøÇ6õû›1k™¯ÄT· ²1ëˆYF×H[áÌ™,¼ÿ» ]\‰åê½\·ßOÆÎí€pV¾ÒR°m,‡ƒìQ#²ð,ÒË˩ߵ‹P]]W~Eæÿ½S(hÿŠw×Zÿ³3\wFÓ€‹W>½jUÕ`Y)Ò6°x X Màè§ùA.mV¹çݘÁH€ä” üF™Í~úcðhÔôñc–Œ}Á‘èçÂTn{8Ÿ8?_)EE̼õÎüêWñ–”ôøGÎ@€Œ]»ÚÝq»ð rä{mÛ8Ün 'M¤báBœéÔlØ€êÒàÍ0àã&Œ;~üø›”R— ¶ Û0 >ÀŒerìvÆÝoÄê–¸Ï&º-ƒQ¿‰EÜJ5 ²úÛÜlÈ?€Ùgþó Ž¢>©˜’¹Ë!'¹ïÞaØþ¥/1üì%}Òñ· :Ć[nçÂÅ II9š7‰DøûßÿIÙn$Î,°Ù”à ±ÿõ7xÿ·¿£úå—Núû–.]ʼysÛ J)¢Ñè'õÚœœìW?ýé: ï¼óÎËRÅì"×ÖýË—Sö—ïš)À/€áý-i؆fmJJOÁœ<ˆ>"SÉçàL‡É.ï/œ5gàû˜jeƒa8o<¦<îÍÄYßÜr8˜ð©O1ë_§xêTsc/$úuF9ìæYj^y‘#‡“ššÚÚãó5³wï^öì¡`þ|”£“CƒÖ(Ë"køp*.$sÄpê¶o?n~@vv6Ë–ÇÓ~ £Ïçã‰'ž8üðÿýä“ÿØÎq’BŸþù–ÊÊEÍÀå´¯-ªü}U•l/ß՘ѩñÚTž´ûÝ…, IDATQá gld¼šèÆ &ý11D_ðeÎ:ûEç¯!l›%} ˜=ÌÃQÙƒI¼“ð—ÌÑ£9ãæ¯P6gŽ9ë¿­Àþj”RìÙ³Úºzª«P]}€–?ZkT“p“”¼ã—•°#\Þ4F_z)e³g³é¯åý_?D´¹}Ì7oÞ\233yO?ý4k×~0 ø˜÷ËýÀót(¥ÞÕZGi¬Ê.,Ìo?ñ«®¾¦áf"–É«HèT°KAŠ6e¦€ü_ûŒÉås˜j_ý¢Þ¿ ض½ë0s÷†ˆf`ÊøÎ'ÎÏåt2ñ³Ÿe܇¯&%;Ûœñ' óǶqee‚R¼ýÎ{ضeµ?ö+—ËTmˆçé"ÒŠŠ˜òÙÏ2tñbÖ=ü›ÿüg#FŒlw˲ظqï¼ónëM̪€9À?0×·Ú7Y•¢cà‡#tßw×4ü. vl%QBûmNp.þ/‘mL$ 0y¤×÷—³ÿØ|¿óa=—ßù{oaÎTç3gâé,ýÍCLýìgHÉÊJLÇ£Ì1cŽ´¡cçÖ¤«ÀQImÛhÛ&gÌfß~g?ôkJ, ¨¨ˆÂ‚c¶>ΰ}fÙàÓÀ­?°,Ê8v5@Ccã`XTÒ«^Î6Ø&90îòͽ!V¹Ð9‘}DF’Ç¥@ºe†Ÿ©µª_3tû½·§·)ÌÙþ©ñ>È‘šÆä?ËØ«¯ÂžÞgI~'¤59“'‘·p5U/@‡Àòx¨¸þzTÇÀ ž§ŽFQ–EùܹNšDàÙgqhM$ztµÞÙ¿ÿ‰ž&³dôà_X–µ µ;6h½mäìÿÔmÁï?·a©‚h"Gc£ó0#ÕŽÁD€äq®2rÂ75Dµéü}˜Ò¶O%ª-}$¸ ¸‘x³¦•¢dÞ\¦ñKL<;íŒr8ùÙOã)+¥úïOmnA)…gèP*®¿†œÓÇŸR{íHgZÃN;ÈúõG¯RìÛ·—H$®UhåÀ=J©ëš›[²RSSÛ$(¥^¸ýö' ~üãŸ8jÇ“•bªÖ”`’Të”Rë´Ö«-˱ý¶ÛnëWËâ  ³Šån Ÿn“Ðçb@3&üy"Ú0Ø$|(YÄm‹‚’DEè±d¿F`&‘hC"ÚÑG\˜Ò³÷bêÕÇÅS\ÌÔÏÝÈÈeËp¦¦ö«Ž¿Ø’¼pc#ÁC‡q¤zHÉËÑšŠŽö@}¥(}ùeÒª«Þüíïç­7ß:þã:p8Œ7Ž3¦S\\Lff&Ñh´˜¹|ù77uö˜+îÎÐZ_|3bs¼L÷ZÌfT?\¾ü›¯Åݨí:̨ž'Q«Œb«‰ÞÎêëß=IJwc{~÷ù€†`,ÓÿàzÌ’¢ª¸¸–8Ïú•e1ì ˜ô‰O3jTB²ûû­Ï?OJM͑۔R¬ÉÎæ??ÊþÕ«»üœL›6-:vì˜ç~ô£ŸK‡Àïÿ{Vs³èÀÜ.<õ!àÛ‡ão½õ¶„΃÷óß+ÈR&9°OGmðks¬9ÁQG$¡¤@r˜\©ÀÛ×uÿmh‰ Ë= |¨Û²ºÀœ}Ä5=æ­¨`Î]w2éã'-?ÐwþJCÖöí8#·i¥ˆ.ZDù9ç3f µÛ¶ª­û9[ZZغu«µfÍš|­ufåI#À]wÝ•‡oÁä Œ<Ñót ,ÑZ3oÞ¬Õ/¾øÒ`ÿîÂT`<'¶€»9ŽX1±MÀû}ø{%Y2b×}:bcC“6åZ‡ìt‹×`ð0¦”oy<PJ1æºë8ï¡_3tñâ„­ëï¯T'Ó:Å™–ƈeË8ÿ¡_3í«7ãÌÊêÒóÚ¶…YûðÂÂÂ|¥ø*&WãD•15Ç_6è¾æv{æw©1×zà<`]l…@ŸíÞ 6fkcÑËd 9Œ.Qªú(°¡!‰ß ÜÃÀ\s|ø¦ i\ŸïС̻ï^NÿÈõ¸ÒÓ{³}ÉÉRdìÞ³åè¯ h1‚¨Û Zãòz)š:•ŠÅ•hË¢nݺ®äL( X<{ö¬«GŒq¡Öº³í[€• ~üxxóFûÏ’ÔÐE‹*©ªª’†Ì0üãÀTmö¹°ú°V@ó¿ûsý¾AKV$‡Ö9÷(½?j£Û”õý"ðX/ÿ¾D™‚IxZLœA•årqú§?Íøk>Œ'7·ÿ&ùõÑ”öé Põõ™ Z-É1‚™_ÿÃÏYÊûý†}/¼÷ßuܸqÌ›7¯Â>öþà)¥¸½®®zíü´]ðzÇßúžÃḠ“äÙöxè‰t(F4ˆ5b~¡átí>j%}ð{=HuÀ—§:¶(JO²cÛø6a’ýþÙ‹¿+Q¼À¿ÆgçŸ=nóﻇї^ŠÃãIhAŸþ.T߀õÖ›d:ö­ Øù‹4gdá))::ž¤5J)2ÊÊZYIΘ1ÔmÝzÜýZ9.¿ü2²³³ÛM½D£Qjjjt»Ý7|ë[wî}õÕ5Ç<öùç_°—,Yô†ÖÌ¥}΀²,6­ZU%õè²1žJ1»\ê>ØC ¬Í1ï½ü{= ’C¸JA^/~ø¢±e~5˜u¸mi”s¶ÿ{Lµ±¸)WVÓnº‰Y·~ƒœÓFËYvýùQìõ))=z§”"ìðŸ¿ý… ˜ ª-­±\.rNͰsÏÁSTÄáµm“HØÖÔ©S™9s&mÏþ•R¼þúëüñyá…J€­˜÷ó1V­ª²+++#Àe~t¨ªªê¯ÝxÙÝ¿1Ÿ™@´7wŒåìÂé¢I`òxJ÷Rç¯!5sþû€ 0ëp’<`ðpf\PŠÒE Yú‹™pýu¸¼éØñ±Ô ®z‘Ã5µG†V"‘‡¢¶¶ŽHm ‡ßxóH-‚v´FÛQRsr8ýúëYöð÷‘,(¥˜1cú1ß»w+W>‡Ö:³¿üJà›'±S)öurs_ q'«{;5b' ½%lëÅç1’&Ða9ÚŽF{,PCÄ6sþÛ+€=õÜý€¸ø6]È*vçæ2ý¦/3ò‚ pzë7ldïÞýÔÔÖá÷›$Êá eï”e·èŽm–”5lg~ãë ?ÿ<Þ}ðAö½¸RXXHQQQ»³Û¶yñÅÛ-å/îÀì3ðcàQÚì7¯5mzÐùƒhõÌê ïÚ@oT ÔfÚá?=ý¼âX2nf———EÎ9ÿ\åèl¯önhÓù¯>ÄÀêüË1sˆ  ÿð‹/bÙþŸ™ëw»¥óï"+Õƒ#5 ÛŽòÆšÿ°wß~J)TëY4¾¿©¶mКÂÉ“©üÁXøã‘5f £G"¥M’¡RŠýû÷³qc§ÅÆcjü³§FlHAïä¾}S«žð;àóü±ãGÑ&;$StLô2 ú¿+€Oääæ8gœ1ÃUZZÆô3ãÅ>‘XißzL¤}pÂ]Z’ˆS³` fñ¸†tS Xð½û™ç]dÚ›íÐ\™™äÌsÂûäLžÔ¥$JmÛXn7C++9ï÷¿cò9KÛ=^)ÅîÝ'ÝgÀÌÆ„ó”Ró:¹ßq7lp{ ø¸†æž ”R,=o)˜€þ©×É@ÿ6X¡”RóçÏ-**,¶FŒÁ{o¿Mà8 R'£!›Ã{ ¸ŠŽâh$ðfOñ¸JYŒºòr¦ÜpÞÒÒž©…ß´ÖèH+Å vÿZ‘P~éEø¶mÿu[ûµ&é²'MìúÈJlé`JVÙùùè6e†µÖlÛ¶5ÞgJÎOKK[P]]RXXˆeY­+ Z”âØe¸ûî;‹Á:t%fª!Óqm^õúòåË÷tá&£§€ÿÒðÛØt@ת:uðÍ;ïäü ÎU@°åùªæwc <‰^"«ú¯Bà ãœsÏ.ª2Ôãp8ˆF£(¥HÏÈ`çŽ]~Ò6ÿ«Àå˜ý’ø$ðGLÙä¸r$ÒGŽ`î]wqúÇ>Š+#’d¸_9xõ5¶>ò©ù¤äætk ßÞâÊÌ$gòd´¥L¹ßH”ÔáÃ(¿îà ¹ø"¬”î'+Û&{ó&¡£Åé¢Ñ(/¼ø"-ÍÍq?O8v¿ÿþZ‡ÏׄeYdddât:?HIqß÷ì³+;}ÌOú5kÖÜÉ••‹õCÌÓ,`&Gç4Ì(ÕÀµ••‹FWVV¾]UUÕ› s‰¶“4|`ww¯’·›_þêWŒ=–Š¡å)/¿üJK]mÝx̶Àk{°½¢ Ù ¨ra†Ø&9óŒì)“§äx<©„Ãa"‘È‘ë5o¼Á–MÇ÷£ ##Û¶ÑZ¹ÖZ““þ={…N^ª»Mç¿Óù'{¶s&p3fßðÎ’¹:•?}sﺓї\Œ3--é’ü”ÃÁî§þÍî¿þÍì?‰P÷λxí5¬7i%%8SSûM `¹\8RRzl„BÙšœ Pm^ŸírcŸ³”‘^HZY)‡×¯'Ò…Ñ­5õõ jóæÍ§gc*oîÀ é³bÅ]ãµæ¯˜|œ®.ÅÍÂÔÕµªªjW›L¶b6ïYFG.¿òJn»ývœ±ÂQ–eQ^^îÈÊNw¯z®Ê îŸÂ(=H€þç:àóC*ÊÝsçÍ-ÉÏ+Pm;ý¶§ÓIaQÛ¶n=áYO,á¯í™2wþ X<„©VW’Ÿ3=_ûof|ùËäŒÕ›íëUƒyÿ°[Ú Þ(E¤ÉÇÁW^¥nãFœ^/©E…8\½Y42A,ÈÚ¶«í¨¥¨>•’Bá”) ?ç´²¨ß²;îʳ;€!˜•Ó­Ë—/w:Ž'0ù8'ÒúìlTÕ ÌX²dñã«V­jéäçÅVLÄ2L± “ééé<öøã¹Í¶m\N. ™ÿ¼õ¶…ù<)‡.zˆýËxà-Ëržþ¹%CÊ+J©vgþÀ‘k¥©iidçæ²sûöNŸ0Öù700:ÿ\LAŸûÄ9…U2>ó﹇ŠÊE8“¹Œ¯¥Øòð#^ýR§gÔJ)ÕÕTWUÑ\]'¿€”¼Ü~•pª”ÖdoÛ†nÓ±+EÃÈ‘h§âòz©X´ˆò ð¨c6¯ÙŒÉè8 ^¤5{ªªª^ïJC’ÐfL p.f$à„ O>õÓ¦Mkw›Öšh4JZjåC†¤î¯Þܼis&/ªó Ñ-ôé˜-is/¸pYј1ã_sM0:ÅŠÿzöÙ玎^¹òV­ªòUV.|ÔGi? ž ê᪪ªÚ®¾ö$´³Ã": Xþ­oqÓW¾Òé{¹µóF£h­)È/TÙ¹™žÿë™&`ð,0þ†½.ùŒÃÇ€;&¥²rQQA~á1güÏBZ;¯×ËÅ_½ì²Ë‚-~´M­µàMÌ:ÿd\êçÄ,§z XHœïUw^³–ßδÏÝHjnnÒvvm)‡ƒCkÖ°ñg?ïz0£QŸC¯¾Fíºõ¸¼^R‹Š°’0?@‡Ã|°â^rS=ä¹])E³¯™þý ùóæàLOoÿ8ÛF)EÑôé ?ï\PŠº-[°“<«”â /8f§A¿ßÏ#<œöÔSOMÃŒìÆÔ­?Feåâ:à`x››ÀUUU;ºóú“Ð;˜Qǹ­™Mœ<™_ýú×íª9¶Õ´^”R;NËõúëo„€9˜ãBr-ßé‡$H¼‰Àÿ8ç%—^T2lè«uÞ¿ãœÛ¡¥‡ƒ«®ºŠx ú­·Þz ¨Ó®!ˆùð]MòùQ˜áÓÿÅ”@ÎŽçA–ËÅèk¯aÁ½÷R:sfo¶¯Ïéh”OþƒÆ L@Ï@J)‚Rý 4ï߇'/O^.*‰FGšwîdߣãpºR^†Ïçcßþýlذ™-[¶jn&ãôñ¤ r샕2ËSS©X´²yó4ÔÓ´cÇ1ùEEE,^\Ùáኗ^z™·ß~ÌÖ¸W“0¥ƒ[1ЪªªŠÊÊE‹iŸ<¨”R¯ZUwÕ¢à b»*@sÿzÉ’% >ü˜7rëq¯càv§P\R쮫« oܰ)“¬ùï>~-Nò|ú¦TLñšÜ+¯º¼hÒÄ)).—«Ó9ÿVm€eË–±råʃ?ûÙÏöcΖÿŠ9ãxø É7L–Š ùÀÄYÍ/sôhfÝ~㯹†”¬¬þ³´¯ug,Ë¢ðŒ3È3†¦Ý»:ß4Àq4oÛNõ /ò5‘V\‚;ë” ¸õ™À¡CZYEsK [6oåƒuرc7uuu„#S kìX2ÇŽ9áȉ’–ŸÏˆsÏ%Ò$vîÂàÀ‘ŸWV.¢¢¢¢ÝçîðáÃüéOnû4 ƒ †aßµ½Ceå¢Ó>@+¥~¿jUÕ`Ûén5P¨aBìäÄ~òÉ'k¯ºêªÔìììc>ã¶m“îÍ 7/'íÝwßm©­©…Ù½t]_¿˜D€Äº˜}ÖÂùóæÍÏÊHÏ8nçG€Y³fqàÀ†¯~õ«µÀ1gûÿGò%üÍÄlÞóÌf 'e¹\Lüìg˜}ûmLœxJbQа¯™õ>HJn.žÜÜ 2† £´r1)……4íØI¤±±{¯Y)t8LÃûk9øÆ´ÖxKKú}~€¶m<ó,v$B8¶ °íë·#Ê.»OQaO«¥1b#—·¬”úí;ˆ66²¨rGß‚JY¼òÊËìØÑé>AnLõÉË0«T6 ÷Üs¯GkûN §Í}£J©ï¬ZUÕµlÄáYL@>ë÷û‡oÛ¶-û¼óÎK÷xf 5iÒé¯×{3íÞÏj¯Rê¾U«V¼r×Àô2fî~/ðü¦M›.œ .L·Ú,U=Q ”"??ß…ó?o½Æ_r´ƒè £ SÈ&åú\S¼Çή{„Røà;ïF‡Ãèh”ú÷ÞcïÊ•8ÒÓI/+ÇrwµÜ±´mãLK£hÖlòϘAÈ×LóÎîïbkòQýâ‹4íÚ…§ O~~ÿQé côhüª ìÚÆŒÃk­ñ”•2úK_ÀSPÐõ`P™< WZS¦·ek»÷U}}=UUUñ–Ζ:ŽËKKK½)))êèãÔ3Ë—/ÿãÉž`ÅŠ;]••K†,ZtÖÂÊÊʳ*+]Y¹hÆâÅ‹ò++‡æÎã{ñÅûÉv )ee¤Ÿ>žÂ¥KvÝ5¤¢OqgDw}=™Û·· jjjyóÍ7»ò4Öž={ÒÖ®]«üþ@ =ÝëOOOw‚~¨ªªêµã=èî»ïÎ\¼¸òÓZó}Ð+@]‡QX‚)¬s5èÿr8K*+ùÏ>{Ѧ瞫Jæ@àpè‰'ž˜sÑE¥•””8áø9mƒ€ÌŒL¼ii«_\í …BS×1# ¢ $è{Ÿ®ž6cšç¢]˜_XX|ÒÎL0}útÞ{コ+VÂ$ËêôÎý—…Ù4äqÌ-®^ÜéMgÆ•3¿úUÒKûц7m)Eã–­¬½÷¾ÎG%”"tø0ûŸ}ަ=»ñ–—‘ÒùZ£”É(9kžâ"wí"ÒÐpJùõk×rðõ×ѶÆ[ZÚò´F9¤•—‘=i"9§OÀ;t¨ { yžúzÒ÷¶ïG´ÍæC‡ÍΆ]ؾ}»sÍš7uMMíþúúúoÙ²ewÇûÝwß½ž… Ïú0f÷Ïkr:ߪ]aê .ךÓ-:륪ªç“¹FþÀðªªªŠ«®º*Ãëõª¶+:^·-‹ž››§Ò¼÷«¯¼ÖŒYjø(0X§WºE€¾5ø‰eYÎ~ìú’±cƳä:ú/(( 777på•W¾‚‰x“If×¾ï` úœ”²,†žs ¾sC++MIÛþÐ uÂŽFùàg?£åD[4+S¦©yÇNöüëßDÂa¼åe¸z0? gŠçÎÅòxhÚ¶  u{Ù`Äç£æ5Ô¬ý§7´ââþS?@kS±‡ßžÆFÒ÷ìi÷7³¦O§àÃWãôz©Ý¼;еjÚZkguuuö–-[®Ætîÿ!V›cÅŠ»3lÛþ p×…§UÀ8¥ÔäÊÊEÿ®ªªJÖB_Ï×ÔÔœ‰D¼K–,I·,«ÓÍÏ:Þæ°äå庚š£›6nvcJ?›è“L$è;àW@éõ¹¶`Á¼³<­…0N6ôït:™9s¦ý¡}hssóŸŸõ]³O™³Dñ˜¡Ì¸2´RËË8ó–[˜rà ¤õŸ¥}QŠCkÞdË/~ÿY·mSÿÞûìyúœ™™¤——õ\~€×KÁŒéäŸy¡@€æmÛ82aÞUJ>S§â¯¯Ã·³[;ü¦z½Þ%gµà†ôôô ǹO f¯¿`–õ¾ŽùÜ—Ñþ¸­€±Ñ¨~«ªªjó1Ï’|5)9Ùý»ã?Bqð7Øóøßº]¥¥×Ô²åJšöìÁ[RBJNΩïâ{/¥WTPͼ;ï$ܸ¤Û¾6½¢‚ìIiܾ£Ë‰bm)¥hÙ¹“=ÿü'á`oi)®ŒŒSn·m,§‹œqã(ž?+#ƒÆM›ÐÁà)ä4SóÆ¿ýÎŒt¼%%=3r‘@v(Äæ‡~ËÐTO»:V8Ì«¿ù=™S&ãÊ6•©µmc¹\äOÅ¢E¸sr¨Ý¼…hËɧâÇÏYg-h„)¥‡#zÿþ}wÜÿ÷n­ªªª}é¥Õí Ï?_]²dñf­õ&Ì´ZÛãwIeåÂ_TU=Ÿìg¾¯ìÞ½û✜œ”9s椵nt¢@kÇ“JFFzêÆ ZjkëF[0E™Ä HÐûn–-\´ õÊ+¯ÌmÝè§Õñæý¦NÊ÷¾÷½o¿ýöËÀ7ú¨½Ý•|Sß`,qôÉ?žß¾Ó.¾gjjo¶¯W¥•–RvöFëßfÛ¦-4TWS0gv»×§m·×KñŒ ‰gª[·î„5.¿ür23Ûïf¨µæ±ÇSÿú׿gb·ÐI)ïU«V±`ÁÜ–åø0ßæG)ÀÃUUÏ<…?C6­\¹ò¼¥K—zÊÊÊ\'š h{ÉÈÈ$5-ųÚLÌÆ”FOæäÈ^'@ï: 3ôïúâ—¾P:aÂD¥Ž3ôßVëÐÿÚµkï¸ãŽ˜¡ÿþZîRaæÝþ \OûíOËr¹˜ô¹™wÇäœ6ªKCÈ¿Ÿ¯‰Ô¼<ìP¸ûéS=ÌrþöÎ;<Žêlû¿3e»zo–›ÜmÜ{·©ÁôN(!!!¤JÊ›7¤È›PC ¡[¶1àŠqï²U¬ÞV«í;3ß³»–À’UÖ¶s_×Z–4š=³;{Îsžç~î[!uÄò/«Ïþý衾«ôéÁ |HÃæÍXÓR±çäDÛÝú™n7À–‘Aö̤Ošˆ¿¹eeß3/†¯¼‚ÚÕk47ã*,Ä’š|Zi³ I¢æíåxöì%7/UU©««§ìÐ!¶|¼ÖV7ÁÚ:rÎ9ûØÁ˜a`ÏÈ `ölr§Ï èóÑvðÓž?£GbÖ¬YŸÚýøá:>øà0ËgS1‰NÌ@ S›ßêÕkôÅ‹GgŸIé©•+K«úýbœz”™+W®,¹á†’UUÇZô?ù½$I¤¤¤ÈÁpÐØ³{¯ÀäK|V èŸ'±ÔÞí_ûJæ9KϳZ­æÄÑ]Ë€Åb!333|þùç׆q?ðáIwoÜ‹éÜ7¨' „ þæ>ú0Ã.\†¤*½bS YæÈÚ÷y릛PN2ÆŽA¶Z1´‹4 »¬)SÈš=‹`»_E…Ù²ÖÇt{¸¹…š+ñTWcËÈLŒ‹_”à,( wÎ\œÃ†à9\N¸¥¥_úm»vQûÁ€³°0!™‹“…–¶àÛ€ÚÚ:vìÚEYÙaêëñûM[ !I䜽ôSvÃqD_Óä¢"ŠæÏ'mäÜGŽh8*×1þ<ŠŠŠÐ£÷¼‚ææfþùϧ?¹)paÚ`_€É’?€¹;æ7¿ù½|7Ã:@ü©´´´ºÿ¯Ä€À:·Û}Õju.Z´È‰DºÜùwü¹Íf')Ùeß³g¯¯Å,|ÖÐ > Nn.[¸h¾ý†oJÏÍÉëqêÔ¨Q<úè£õ[·n]<|r†Û+Ș‚>ÿ.£§‚>))Lþæ7˜z×$›‹b/¡Øl¬ûéÏpïÝGÕš5|ã?¤JÚ°af 1PÈh†55•¼ùóH;–öÊJBM}>ßár޼ý!¿g^ÔÅ/BB’¢2|8y  ¦¦ÒºsF8ÜgB£æ5ù ›6£¦¦àÌÏðü!¡¶6š?\¦i`ð©@È’“Máe7ø2¢¯iúÈ‘/]‚37—ú;1–.]‚½C©KUUÖ­[Ç]:gb 0K‡fÍš¡bÞ;kt¿*-ý¯1ŠÛß{k—.]j/((P»â|º„Õ¦Z?xÿC&aòy¢ÁÓg茒<ý¯C1ð¦,Ëö_ÿö±¢óÉš¦‰DÐ4í˜]×ÉÈÈ`ß¾}m×^{m%¦aЧ”ÃN1a¶õÝDÓýB†^z ã¾ðÒKJÐû¸[’D㎼~啟úyÞ¼¹Ì¸÷^2F"ìõöéü' B"?Õ¥«9ð÷§ÔÔôOgß0PÓÓzýu,Z„%==1OtLÞÊJ½ú*U/¼ý!dBVȘ1a×_OÚ˜Ñýã DÈíf×Âø0ŸœH„’{¿crzñZÇÞg÷áÃzíß\˜™ALÿ ‰ð‡?üºº•îÀòk®¹úù±cÇþ Ó>;†r`êü Ûàᇶéº6Ü0ŒiBˆâè9B ÁÇŠ¢ìüÞ÷îôøO<(..þÒºuëŠE‘H„ž¶œfÜ÷}ÆÝ|sÿ}„à½{諒òeNÃÀS^ξç_ àv“5aŠõXV§1~@îÂHV+퇣}ç4®[OãÖ­¨ÉI8rr-jBêîÖÔT²§N%}ú4|MMø+úÈÂäTVR»j–\ƒŠ°$õ¨9ä¤C±ÛI;†öÃå„ëÍ9Ö–›ÅåäŸnŸ7[z:ƒJJH¯ê|ï¶¶¶²bÅÊ9dÈeVI’:f—§¦¦üýÍ7ßúÔ†ªÊ…‹/ºË0Œ?ßB\ŠYb˜Ì.®ÓuýüÅ‹y.\phÕªUá¾\k‚±Áív.99Ù5þ|g8î²Ð1+`³Úp:öm[·Å‚61ð6S§Ÿ‰Ç%À­Ó¦OµÞzë­™¹9yvø±Gì{ó†5VPPÀã?^¿qãÆ5ÀOõ…tÀpLÃïÑ™yÜ-J®¹šù¤˜´Ù³(¾þZ²æÍé_{ªa`w·~Je°®®Ž>ÚÒ«S•——ËnwŠ"ãp8°X,ºâá{îùÎŽOûÐC%­Y³úNL>Ò…˜ú]]ˆ3Ãw…bÔâŋז––žjŸ°kÕªUËÎ;ï<{zzºÚ1‹ÛñÇæÔŽs­Ë™„Ýaµ¬_·¡SñiNµ“‚Ï€Ä"x°Ýûýoçž5a’lÄoÈOGv»²²2ï÷¾÷½LàÞËÊ%*¦léß0?@=ô).fî#3æúë±&''d!Žøý¼ÿÃá­î†ã$ã¿z#¯¸b`·¢Ö´4rçÍ%eÌ|õukëú ‹Ÿ“¾ôå[R/üÜ2—ÕjÞ”Gšvì2€Óé4n¾ùæZÇó;FëÊẌùôpò²Ì¨n`ÞÑ9~|Â&²ª²ÿÕרûôÓÝ—\Rœ<`*ÓBà*,$oÁì´>L¸¯.~†AÛÎÔ¾÷:μ|T§3mƒ²ÕJúرœ½M’hÛ¾=jnÔGåÖjW­¡uß^\E…س²ú7Æ!°77㬮>Ò´iäß|3²ÃAÖ-½z¯ ÃÀëõ²gÏÑØØ¸“,Ø|䑇òuÝx˜G] €"Ã`°Ë•ü¯}ûööá ÅÆºººK ãÆ³‡B!"Z„ˆA‹?:f0`±Xq:Ž?Xç ‡Ãg+9ý\TO> ‡9À÷ ªwÝùÍœ¼Ü4=‘ê~“ͪ£ëæ×””d^~ùå¦7ß|s¦gÀ©4õpa.úÅÜô©ãÆ1sÝ5(6{Ÿþ]ÁW_Ïû?z°[•=IU™ýàÉ=zà¥þ»C”1ž:j$9óç!;x—£ùý}N·ÇvÙ[·¡88rs­Ö„ŠËEδidÍ™ƒ¿µß¡Ã}ç`૪¢úÝÝn\ŃL~ÀéôþõVOÎ#G„ ™Exè`ò¦MgÐÒ%Û½´îÛ×—ÓK@p‰Åb™9gÎì„ftql3&1î!xD)àréL,(ÉÏÏ_[ZZz¸/ƒJ B@õòåË_|ñÅN»Ã.k‘z|Ñ×ÑôÎ¥ÖØüët:…+Ù¥|´y‹scóü)¾–ƒÏ€ÄÀüúÃÝŸ=qâdL‹Xófì˜ú×â5]7-Ú›‚_ÿú×1ÿòSt ¦zÖS˜iÿÉòÉnû ³¾/é#G&ܵOR¶þé/T-§Ûã_x!ã¿psBŸû¤Â0L•¾É“Éš6°?€·²¢Ÿü€&jW­Â]^Ž5={vVÂÒíöÌ ò-$eü8Zvïé3?@¡i´îÜEÍÊR$›WQQBœ,>®ÊÊÎNƒéix³sSHhðÒ%äLFÓ¾}{ßÑ'„o¸áóó²² Á•i0 ‘eqëý÷ÿà©ÒÒÒ÷W®,ÝRZZºîì³—¼`Ƈ˜„ÀN>B ¼²mÛ¶Þ_tb±8Ëãñ,\°0) ‰-þš†®é²­z<ã*„DJj²¥¹¹%XUY•x1-™Ïx|$÷K®½þjçe—]‘jµÚ¢èѿ֡ÞË †ŽÕfåù¿õeee¯:EãÏÀtîvœcMAÁâÅÌyðÇ ¿ðBSð%Á‹¿$šwïaÝ#¢ü]gËËcΈ=³7vê†5=œ¹³I;_C=þšÚ>—„ø+*©YYJÀ݆='Ç4ZJ\……Ö¼þ¸ÏúB´@€Æ×Q¿qÖÌ yy‹Ð\ÑÙ=0ì÷ã.*BŠé$ARQ!Ã/ZFÒàbj6mFö¼…}ôèÑ,Y²ØÔ2è]×I’tå]w}õ™¥KÏoÿäß­X±Ò(---_¼xÑ.àót.dde¥ÿaåÊѰe÷îÝWžuÖY¶¼¼|‹1Óÿ~­Ó¦Ëœo-ª…”T—mÍêµ` ¦ÃbÛ)¾–SŽÏ€þc ð —Ë©Üwß½y¹¹ù¢#E×ttÃÀøDZÊ”®”ÙòÑÏïÿûzLâßÉ&ÛH˜ZÇôéQ’”{îfòw\TÔ­¬q¿ ë¬ÿùÏi>ÎÎcÂW¾Ìà³—ö/u,„ÙB7@¸ƒq•¾ùóqà=r„PSsßÓíºŽ{×.êÖ®EÓ4œ…‰ãHŠBÚ¨‘äŸ{º$hÛ½§ÏʇÄ3«q—ÄYXˆ-#c`“:{CÓ¨þ÷(’¥ÎNƒMlzgéS&#©jüç’¢9f Ö-Cq8høxk²kŸÿüõ„†L“¡0Ï=÷|ðùç_ØýÈ#¿(£«ÜÅ‹—Ô€q³vÃ+--Äd7`Y¿~ýY]tQ²$IÂLûñR€¡2®ºaη‡SJJrJÛ·íˆ`jµ¼vНå”ã³àø,n¾|Óàç.Ì”ýµ€üÀïÏšß%éééÎÑ£G9"-¾±:Zr=¢›¯¸mpªµ²²ÊßÐÐ0S0˜€™ùÌÇ4:Õ]' ŸÇF&fëÌ/0mmçcÞ ©ªªZ† j;kâÛÐ!C¬ªÅ"Ï™;ÓzÕUW¦Y,6“ÙofDªëѺTTºR7âÑ)Þzë­–Õ«WïÁtÑ;YÄ?i4ò ædУUÜ’–ÆŒ`—¾ˆ#³ÇR}F¸½÷ü Þ#]{›H²Ì´ï}—ì³ÎêÝ&B’‰øýÔnÜć?ÌÖÇgÿk¯‘4hi%%æù -ª9yYÓ§Ñ4¼e‡úå/jj¢nÍ{¸ËÊ¢ü€ìĤۣ-Žù‹‘f¶o2f{]5zãçÌ™%kšöUL#ø%*--­KÀË‘h@åºuëÎY¼x±Óérʺ¦Å³¬Ÿì²ŠÍɆ®£Z,df¥[Þ_û“¸}>¦°ÙùÀŘ™Ø[0çülÌ®ŠÖSs™'§_8}b‘ |¸Žh:|áâösÏ=×–ŸŸïÊËÍSŠ¢ s²Ô -¢!$Ñi’Ó;¥¡ôx4#9R¾õÖ[« Ãø2ðîIº¾aÀÏ0oôž‰³ Á°Ë.eÒíwTßgßÞ@VUv>õÖÿä'ÝW¸d1 ñ s{!@’ˆø|´ìÛOõÆ ìû׋xË;s.…$‘=}3ﻬñ㤬°¡i4~¼•ƒÏŒ‡~È¥ëú>Ìq -B0ñþûPq¬“œB<µlÙ²¥·ßq{®¡º®"ñòkG>€¦iºA0dÏž=^!DX Ì9\ÓñùÚ½{öEÖ¯ßàD"±˶b껼Áiåqy||Å…Àƒ@ªÃa—¾ö;R¦L™šœ›“+¹œ.ì6;6«EQ: y€9…#aÁ ^¯—`0ÂìÓXtTþ Cüñ¬}ã7Vן„k³b–*ÆÜôŽAEL¿çŠ.쿺\O!ÞšÞüÂñVtÝ¡$%qöÿ@ΤI]–„$!$‰öêjÚ**9¼ü*Þ]¿¶ö¸ÃT…×\ÃÄÛoÇ™“CÄçPŸ!ID¼^jÖ¾OÙsÏâݰ_†®cÍÊdÐ¥—RtþyØ23V ’„¿¾ž²_¢ò¥WЃ~Y#ËdΞͰk¯&uÔ(ó\8’DÅ˯Rõï2c£$'1éw¿î±†…$¼µµì~æYv?õ¹éiÜr˱XŽ&ôü~?¿ýíoq»Ëu«ÃìþùíÏþ³Â`0XJç Â&EQçÜ{。cÿù)Ãàõ_üâ£FrĉÑ–@=Ö-¹Æ6_B’°ÛlX­VdY†èüí÷ûiooÇðÓÒÒ¢×ÖÖxÖ¯[ïÛ¶mGŒ3qxXsê.9±ø¬`¦ÀÜ-„°}ý›·§Þ}ÏÝ9gM˜hT4HääääJÂb± Ë s§/b"(BBEQ±Ûì¤$§àr¹Ð5ƒ€ß¡ƒÖA£:ÑØ¾m»ÿüc3p;'V”B`Ö·þ†É_è‘ ¤(Œ¸î:æýä'äLœx‡wìçÞò›ßQ½fu·Ç¸æjF^~yç‰_„$ah:íUUT®]ËÖ?ü‘u>È_¤iÛv"íŸ"@†®Ó¸m{_xÕå"cÌ$‹e`ñT•”%äΙƒœä2ýúÍØLÃG!Ùl8ó ±ËŽò²¦O'kæ üMÍøé'? œšwß%ÔîÁYP`îœ*? zýï€:Æjä^|!é“'õꜪÓIÁ¬™.˜OR0HINN§CY»¶Gv".L×¼e™s32Ò‹dYîøb.¿ï¾û_ìùàNš€œššš‘³gÍNV%®·bèFòµÕj!?¯€âAÅ <˜œì2Ó3HKK#-5•ÌŒ rsrT4ˆü¼Sf-Bn7­ee”½ñ&ëö3¶üêÿQñÎ;¸÷ïï×¢­CT­ZMÙo’2dÉEEk·ãLšDÖ¬™hš†çÀÁ~ñÂ--Ô¯yÖû±efâÈÉéŸ+`‡±Ú22È_¸”Ñ#i;\N¸¹¹Ïã44ÝÔ(]…Pdœùù(öÉWœtXRR°ädÓ²é#è ¥lhÉÇ3䦛úÌm°geQ4dh'!UU•lßþ){€î¾{÷îÂúúú°Ífõ¤¥¥y„vàÒÒÒý}܉ÇÖúúúkŠ‹‹íùV ÃÜñGÉÖ‡“%% 2””äd¬ H)¶‰ÃœÇ‘$„$$j±”œBA~ùùùØmv¥  À5fÜhû‘ªª`[›g4p.&qû´n%<“æÎxêÙç.µ}ûÛwçå窃‹‡ž‘Ì›Ã\û£ ?‚I˜ÙI|*00!„DJÔ³½½ÝC(b݇ëÛ_zé¥6à@Í º¶™˜­}_ÀŒî Ùfcüm_aÚ·¾EzIÉ V÷04u?Jëž=]$S¾u…sçâoj¢nËv>õëý)»Ÿ|’êµkñ×Õ%n‘kF¹3¦“\<Gff§v­ƒ(ù.gÆ Ò&L àv㫨è{ª]üUG¨-]…·¶gAÖÙ !p Dþ’%X²³hÛ¿ˆ××çÌ…д~õ›6¡¦¥áÌÍ5ߣ¨ÎAE¤M™ŒœšŠ°X° *¢è†ë(¾êÊ~ËWÛ›qÔÔÄI’¨©©açÎ]½:a444ÈÛ¶mSöìÙSž——·2%%å¯À +øy÷îÝ“çΓl³Û„®C‡ exI v‡£Ã&ÎüÇä]HHÑD®ÄÑ9]ŠÎï’$°Zmäåå‘••M8V&LŸ¬ZÔÈý]ÀE˜™€Þ+6  М٠‡À”ºÙå—Ø?Ãçs]Î$† †Åjít“:tˆ²ƒelÛ¶êêj‚Á`ÔbS%//—±cÇQR2œaÇ#G YF”En``ÐÖÖÆáòCìß òëÇ][VV¶Ó^·ç*ÇG*ð}à˘€!oþ<¦Üy'£F|‡Ô3HªÊ¡7ßbõ·¾ÕíŽÝ–•ÅØ›o¢qÇN*W¬è6SП±¤O˜ÀÈ+® mø0R‡ Cu¹ÐÃAåø²LÄç£víZ>ý,ÞúÅ@×±df2èÒK(ºàüÄòd_m‡^z‘ªë7:x IDATWÿîóõ=Û` 2gÍbص×:z ’"ŸÔ,Öñ „À€¦½Îþ~Þ„ }ß>Ò·o?ú#`ë¡C¼ü¯‰´õk“Ú‚Ù1ôsNJéñ0ø¿;î¸#cΜÙÉV›•‘#FáèT™ÊÓÑ6l#î£ÐÜÜŒßoÚrÛí6ÒÓÓ±ZÍLL4A`Vª€P(ÌÇo¡¡±žõÖ»Ÿ{æ…fÌ«1U O;œ©Àw€Ûæ/˜kýú7¿žç´9EÉð¨ªOå†ÁŽÛyíµ×HIN¡¸x0™™¸\IÄ|¸Ã¡0mž6Ù»o/^¯—‹.¾ˆ©S¦ ( Äo6 O{;‡—±cûÎðÃ?\íóù^ÀÔHFb¦ûÒÃ÷U¶Z™rÏ= ¿hª«G‰‚†ÇÃ[_ú2-;¶ÿà[NÃ/»”ÜI“È;[ZZ”OÐýBghBQd=2°J‚’,ãol¤êåzöYÂ-­ýjõ3tÇ! »þZòæÍ35´¸ Y¦uÏö?õš>ü#Ò7 ds Âb¡ð’‹|Ñ2œ……ñŸÿ·"­¬ŒŒ-[޾f†Aó¤Iì…Øþç?S¹beØ]˜寒ØMK1xeÉ’%¹W_suvvv–Y2ÒÔZˆfm 0“¹©®fÇŽlܸ]3ÈÎÎFUU Ý ÝÛN}}=É)É̘11£Çž‘ÑMœn˜Ü‚íÛ·QW_ˆ ÜOÿóÙfÌVÊe ×^áL,L~–œœ,ÿàG÷åÛ,ièà¡XTK´õÛ ¹©‰¿þõ¯4ÔÕ3mê4FŒIVvIIIX¬6T‹ŠÅjÃf·“”œLVV™ºÁ¶mÛXûþû 2§Óeþ›DEQ$E•åÌÌ,Ëúõë‹0ÛoúY˘m‹Oaþz4k,YÌÂÿý_-ZtÊSÚ²ª²ëÿ¤ì•—OÞsZ,dϜɄ/ßÊ”oÝŤÛn£hþ|’;úÔgÁ’DýÖ­¼ûµ;H9Š”!CT`DÉg&={6ºnàÙÛ'£ÀܽFÜnê×¼GËž=ز³päå&j°Ø23É[¸€ä‘#ñTVjl쳚 ºŽ{çNªW¬EÁYo¦ÙÿKƒ«ÇÓÉi!§¦bŒàŋÉ?Ou5þºú¾¾Y˜‹\>°S0çTCžš0aÂÐ믿.777G” 37r±¹Ü0·ý4Ô×óü /°eË2Ò3˜:y*'NdØðᦸ¸˜áÃK?n<9Ù9lÞ¼™7ßz ·ÛM^^žPDÏ™™™E[›‡ŒŒt›ÝnÕöìÞkÅìH8í”ÏÄà ûÁ‡~˜“kÍËÉÇåJŠïÒ>Ì_þò'œEÉð\ÉI¨Õ$ŠŽ\€£'’@UUBá0®¤$„ÿùÏÈÉÉ&++ ]3ÌÔ“®c³Z †‚ØvÕïóGÊÊÊ&`Öëûò©LÅLÍýHïþP–Œ fÜ?SîøšiÁzŠÓ£BÜåå|øàCDÚ='ôyÔ´4F^s5gÝ~;S¾õ-Æ\{ ™cÇbKMER”^ïf…$±çùç©xëm¼ü Íûö“5a<ΜôPxàä× kj*Ù3¦“>eŠÉ8\Þ/~@ ºšÚ•¥xkjpš–`~À¢EXsrð:DÄãé;? ¤iÃFê7oFMNÆ‘››˜Î†!}>’?a4ä‡iËÎA¶ÛH<˜â¥KqæçÓZQA¨µOÚ6 ¦Žþ2ÌŒÀáD ¿øŠ¢(—Þzë­yÆ‘‡ŠÕj‹g](!ðÃ×ñÊ+¯2aÂ&ž5‘ìì.ªÅ‚"ËȲ‚¬ÈȲŒ¢*8œN¬+©É)ÔÖÖòö[o‘“›KfFF\d)3=ƒºúzŠŠ uuuþÚšÚ"Ì×ã”û&÷gZ° ¸á¼ αŸ{Þ¹iЬ’—›¿Y***xöÙgYºx1™YYØlv„,!! Fúë@ì8ÃK²DK³‹ÕŠÍf'ÉåbÅÊdge“™™ L…@»ÍŽ×׎Åb±}ðÁ‡B×õz ·¹ïñ˜$Æ+蚟$†\t y˜‚9sLË”d6ýê1êÖ}˜øsË29³f1榙|×LþÚ×(^º”äÂB“-ÞOµ?Oe%«ï¼ËüÆ0hÝ¿Ÿ½Ï?®idއêp ¨¶AG^9sçà:Oe%áææ>ÛºNÛ¾ýÔ®Zƒ¦EpBq$È_@UI3†œyó@–i?t=ìóXÃMÍÔ­Zûð!ìYÙØ33M^ÄA `è:•Oý“"§!ŽuÁº:>ZYJê„ H ²ÕJÖøñ Z¸Éj£åð!t—¶Ý!ø&ïc:( žD¤¸òÊ+sfÍžáÈË- %9å¨/‰aöý¿úêkÔ××±háb223°Ùífï¿017:e „aÞcºN—‹”¤$V¯6Û’ dÞŸB"))‰ÚºZ† j]¹b•˜Ž¹™8iÀãàL þy×ÝßÌVe‹R”_„¢˜©ÖÖžúÇS,Y¼„´4“"E[C„$! ©C@aòÌö>Àw›MÓ«ÕJ’ÓÅ»+ÞeäÈ‘8®8EaúXš õ`.æ=‚¹èÿ384|83¸Ÿ _¼[zú€!EI²Lí¦MlþŸ_bDK°+¹æ–üæ×Œ¾ú*r&M––†¤ª‰«Y+2›{œæO´Y‘µëֱq^RrâÌ’úÃ@’eRJ†“·`>jZî½{1Á>·ãéM›6S¿~jJ΂‚cKÚöa¬ªÓIöôédLJ¨½_eeßZ£ÜeÕï,'ÐÞŽ#/k´Kçt…$êß{ŸªçÿÅÈ‘#ÌÅ ó}QT•«ßCw8H3:ðZ’’ÈŸ5‹ü3xÊËû¨:€ó0âµÀÉ º3??Þe—_–•››+ òL;ÃÀ$^믿þo4McÚÔi8œNd5zOÆŽ1Ž…Žâníí^,ªŠÍæ %9‰¶lF’d ò 1 ‹j% !$!'%9õ;vI€Ø|’_‹>ãL Æߘ6cšõsŸ» M2YÙf¤¨ë<ÿüsL2•ììl,ÑÅ_’Dü«%3 €£Iûh¡­­ˆf’,£ª¬ ®û€©“§ „„¡›¥UUñ´{ðûýʆõ$àL2Iw°c’×ûVÈ2£o¼YÜOΤ^ˆŒœ$h¡>ômöúo—¾ÎŸ7—ÁK–Dƒ´" ëÈ6Æ“3gº$Ѷ§ïÙKS? •ºÕïѼ{7öÜ\쟦é3 [f¹óæ’n,íuu¦Bfï^LÅ$â­àä‘Uà±sÏ=7wÒ䉶üÜ|lVÑ• ƒ-[¶PYUÅôéÓ±;œQµH:-ú"Ö/íŠh,h¶¶µ{’„¢*Øl6\Nïð>ƒ‹‹INN6=ìŽTW‘—Ÿg{û­ån S[æ´À™ÜLÿêí_NMNJ¶f¤fb³Z1€½{÷àñx9r$v§I–‘d I’‘dÙÌH2’ˆ þDÓF@|÷‡p¦­%ýµ4· „  ??.$ø~"‘°TQQljjªº“íÊÃ÷9®bˆ5;›™?øcoø¼¹Ë »þdU¥ì?o°ë¯íñ¤#ÛídOÊÔ{îfÜ¿HíÇlj:汎Ü\†œsÎ Ù}¼ÿ£ã9t¨Û㲦OcÊwôÈ«à”!Ƙ6Œ©S ¸[ûΈ.ÈêjjV–â«oÀ5¨kjjBùy‹bËÍ¥½¼œ°ÛÝç±êÁM6P·aj’ G~þiÇ’ öå„êhllbÛ¶ìܵ‡ÊÊ*ZZÝæAZ„œsÏ9æ}(d™Ô!C(^²Wa!mUU››{3 “|<SçÄyŽâ|EQ.»è¢e™…ùR~vTÝ<ú¾µ´¶ò̳Ï0gÎ\\.²¬D5I"æ¿`ö÷Å)&ñnj´y<ñ9_V,V+›÷־ǔÉSd“7ðûQTY„BÁÈ-˜Þ‡OÂëÐoœIÀ}@Ö7}>[Ót‘—g¦òuƒW^}…I“'áJJF–edEF’ddYŠÒ§wFçÿ†A›§ M‹ÄëIŠª" X¿a=3§Ï0S¦FÌ%PÃëm55µáƒZ1ÓúÇBð4p)æ®[äÍŸÏüG¡`Îìþ™¯œ@ššXû£ 6v­„,d™äaÃ8ëöÛûÅ[˜ñÝï2òÊ+I+)Áž‘AÙëÿÆ×…®¿-+“á]”ðÉ\È2GÞ[˶ßÿ¾Ûs«©©Ìäa’b-hq~@.9sçT2œöÊ*ÂMM}fášFÛž=Ô¬Z¦Ep„š~œ0šœ¹sÀ¢â=\ŽôÐÚJ]é*܇cÏÊž•uÚð„xËËiß½ €¦i8J&ìŃÈ=ç쮵 Ùj%sÜ8ŠæÏ#Ѽcgo‡R‚Ùaõ6'ÞN÷‹“'Ož>cæ W~np:b-ÌðÎÛo““›Czz†¹"nÞvT§-Hæë%q45gòx<ñ¹_ªª ¨ mn7 ÈËËÝä465’–žÊªÒ5^Lm€îµÌ ïyZ@J233äÔ´TIUTÀ¬ÃW×ÔàJNBVÂá0@€@ H8&1þ´˜¹„®Gëh˜Ñ#G¿ý_tà `€$$\®$ìv;e‡ËÐt MÓˆh³D`·âr¹lÀŽ/‹Ž{‘ŠÂØ/}‰ùüF_sMbvZ'B’hÝ€zÍ×u+±5;›Ù?xGVÖ±[!¨Ý´©ËŠ‚Ñ×_o¦tIQØ÷âKü׿º=.u̦ûÛ(öÓË·>Ã@¶ÙH7ŽÜùóÐÏž=ýóhm¥î½µ´ìÚ#7{vvbר¿@Μ9¤Œ¿±uu¿ÚvíæÈŠ• Ë8 ö£7¥$BA?dòäIèºfftvŸ‡¦¦f6nØØfÆ ƈ+^À$Ùt‹ŒI“˜÷àÉŸ1sÀïXÀ`ý£?¥iëÇÝ5î‹·0ô¼óºœ|$E¡fã&>ú蘿×ÃaF]w=ªÓÙïÇà­©aÍ÷¾GÄÛu†SRUf|ÿûd7 Á0°¤¤5u S§hó˜þÐ7>Q~ÀªUøpäw›ÅéÕé¥(?`ÞÒæ¸“6m*JFjfIãÆRxÍU\p^Ÿ…¾2Ç#©¸˜š Ð{—MI\Û§'î“+ç/˜—VTT(ÅZÿŒ¨ÐK/½LFzv»=º¸KUÈ2¾C‡ÙúƒQ5レôqã²4àÞ_C×q .&iØPô(ˆ/\}Ű‹.Ä–žÆûþ_EEOÿLÁ4;Û¼Ûç'?62UU•l6›’D8Ž·f‡ÃaÊ+Ê)(( ›[ÒüGÜŠ¢Äwözlq×cÞ-Á`Ð,ùbæpcô@ÓCH2Kºe™2e2FTå5“——»Ñ²|Ý'gJ ȲW‡ŠhB@8¡½½ÝÐã }§‡U‰Rä¸j”¢(ó{׃®ëñš‘0Ì›2n*Õ (²- ë\1¢ª X‡9^Í_Æ~鋜uÛm¨vû€_üBn7~úh·r¹B–÷…›qæät_g7 ,ÇÙÝF‚zþ%Aöíì{á…n³¤§3î _0ÙÖt§ØWš†PUòæÏ#cªV¼ËÁ¿ÿÃÜe÷¥, IDÜmìÿÓŸ©~û†Ýp=¹sçš–¸ý|íôH[f&£¾ôEòÌçà³ÏQûî „IÒéýX…æ>dýÚ÷)ºü2†^v)ÎAƒÌ `½Ï†a`D?[‰•¡é̞͟ý”•ߺ›@M LmÀï€YÀ±[uú‡Åb‘b÷\D‹ÄZÝîV"š™Å ƒÑ­WgÇVS+@Çj±Æ×ƒX¤Ç&cÃÀð£i‘£/¤2_‹…úúz"ÑòpÌ8ÖåŠÏI‰K=ž@œ)$@€ÏçC’„YÃ'Vï1ðù¼´··w~x¢¯‡ööv¼žvÚ=^¼ý¿§­-ê*å' ½!âQ§iOiDSHztù7]× „B!“={1¦›_×0ù®»˜üµ¯™Ä¸4 uÅá`ÛOâ­¬êö¸¼9³)^²¤GF‹+©Ûß{ëêz5Æ® G4>úÍo»å,Œ¸ür2ÇŽP‹B¢aè:–”d†^~9s~÷[Н¾ª_Œy!¾òr¶?òS6Þw?Í[·&,p34”áÙxï÷˜ö??'uÒÄøÙ§±J•/¾Äû_½ýÿ|†ÛH„àчadOœÈ¢_þjjjoþ´xˆÄŠb뺮£išV‹~O»· †‚&ù/$ ľðûýøý|~|—¯ëºÉËÒtôˆ†®ix½ÞøÿuMCDÐ4 -A×4$I2».t ÝÐÃ4‰Ó㟃•"êÿýw¯‰€ššZ]–"á±ÐNQ‚Á šnf$IB–¢_cYEF–dsç¯È¨Šj-„5 Ÿß‡¢((aEUQd9žvQ÷@!‰¸RW -‚»Õ­G"°?Ä$º’ª2ëÁSrÉ%nÒ$E¡üÝwÙþ‡?t{œl³1þ–[PÎã¦X ]Ç’Ü}ŽjÈ÷'@ŠLÅ;¥Ô¬í¾œ™4l#¯¾ŠÄí½.b;&GA>coû ù ràÙgi\½Æ< /üàuóGlÚ±“œ³—2ôÊ+H*.Ž=aßǪë!Èš>´1c8²²”²gžÅ_QÑ'‹d!Ihí^öýîwY¾œ7ÝHÞüy}ßéC×É2…ß¿—µßý^oÞ“›0Ê>HÐP|¡PH¦ÑÚ'~ ‡…BBAˆ5qDwïZ4PÐ"óa±`±¨¦N@\ÕÕ  ãmo?š¥%ªÐÁ&£Æ”è†xòƒNt+dBp¦;}ó¦M«¯¹¿ï¨þuJJ2m­mx<”¨èÏÑ@@ê\ˆЬ ªjÜ@ÂÝ*ªj‘j”# 05Ó½>/Y™Yt\ Ãä"TVV†£¿˜Œéê"$Eaúý÷1|Ù²Wƒìþæf6?öØq+>ï\r§LíñµO`Ç[W‡PŒ~Ø †Z[ÙüØcÝf$„$1îÆI*(8­Þ—þ"v­icF3ùþûi8g#ûž|ïƒê­½€è¡5¯ÿ‡†5ï1øÚ«):÷\¬‰àD"È6ƒ/¾ˆìÓ9üÊ«T¼ô2š×Û'~€¤(øËÊh?r¤_ã: G" 9ï<ö¿ò uôØ»#¦^z5‰‘ ®Ô4MollÔ"á°Üq>UTÅ\ü,VëQòŸ0Óþf+·v”„­™5ºa‹eš[š †:“…ˆ©ÂšA@Àï'%5•Øók‘0V›…ƒe‡b)¦þ8¼ž4œ)€¨=°¿,ßçóÁPPÄ4ù Ù\ûííí¨ªéú'Éæâ’¥Î€ª˜‹¿¢ª%Œ(ªŠ‰Ä€H4B†himaÄÈ’Nƒ ƒx½íÔÖÖ€vàªî.¢äš«)¹øbúÑï| `MNæü'Ÿ¤ìÍ·ØðÐCÇô%WSR{óÍ ÷üÚâ¶½]À[SÓ/DIUØ÷Ò+Ç•*Κ6Áç{F-þaè:’"“;w6ég§ze)ž|’pK«y¯öBñx8ðÇ?SõŸ7(¹ù&rçÌAŽ8õz8Œ-3“Ñ_¾•ü… 8øü Ô½³¼OÜKNÅçŸÏ`œ ²ŒÅå:þq0S.¸¿Ø D*Ê+CM³hšϪ&%%!É>Ÿ/ÄêþÄ%ØuM7u"†ff"ᰙݕ$"šFCc‘H$þžÆÎc® 2š¦áñx(ê ò …q8í¬ÿp½p­'gJ ˜B;æÎ›cu8쪪ZP‹ÕÂÎ;p»[Ñu­Sû_8!mŒD"D´H\Ä'–JjooöõGÑš”ýÞÐu¼žv:ÄôéÓHJ:š¶n÷¶søÐaíýµ´ù|¾0¼«ÁgϘÁŒï|KròIx©Ùb!kìX†]r1XT>ÚÒé÷£®¿ž’^*÷…½^öüóé.ï*.fh?æ¶Ê Þ»ïþnkÿ²ÍÆÌûî#}Dɳt‰¨¢\Ú¨Qä.Zˆ¡(xöí3³'}Té‹´µQ¿ö}ZvïÁž“=;»_=þÇjËÌ$gÖLRÆŒÆÛÐ@ º¦ççÖuÆÜ}écÆœ1ï»azã vþå‰Þ~¦dÀ<Ÿ€aèÀ…V«5kÜø±ŽääÔh›£¢(”——ãnuc³™~.±qÇÛù0âo—Þ? Ekýnw+nw«Y"ˆý<:ǃŸª#G7aiii躎»­…P8¤?÷Ì -˜AÊ?p­'gR Ë컘:mŠ3èb·Û±Z­©®Æïàik‹×‰"Ñ>½ B¡MMM¸ÝnÚÛÛ ƒqÍ£ÃÂß)0 Âá0ÍMMCAæÏŸ×‰1ÝÜÒÈûk?}üñV7„ù!ù„$1ëþ+f—‹‚Y³(\´ö†zÚ—#) ³ò éYÐ „}>ö<ýt×Z6#.»¬Oã²Ä¦_þІM›º=nȲeŒùüç¬äò)a º\dMJæÌ™¦¿@EEL*³wçŠﯮ¦öÝxq`MM€‹_T£ÃU\LÞÜ9Ø ðTVnu÷ýL™<‘Q7!Ÿ<êh†£ì?o°î¡‡Ð}².^£³ÐY_‘‰D¦Ž5™•%ÙíŽø/$Ifýºõ$''U2Œ*µÅÄÛ0b}ÿѲ@Äœãƒá ÕGŽ˜ó”ì§GÝ0âA@[«›Ê#GXºt ²,ã÷û0Щ¬¬ò”®\ížÖ%à:O8Δ˜ý¨¯¼ô—\rQz8‘SôT$IfÊ”)ÔT×à÷ûÍ4´ÖKù´µµ±ÿþx&@’$l6ÉÉÉ”””••…ªiD¢-J$‚¢ªD"BÕÕÕœsÎÙ&¿ßGsS³±qãfa^º‘Ïü¹Ï‘;­çµñÓ™cưô±Ç¨zo-UkÖÜÍ|Åá0 –]Ôç-ÍD‚Á^« I¢î£-”½új·ÇÙ²³wãHªrÚf GôõH-Δþ€ú›‘4Ç IDATØÿÄ“´ïßßg5A]ÓL~ÀªÕ ¾þZŠÎ9kFz§çëÓP5 ÅédðEËÈž>ïý›ÊW^Ak÷{¬†ÁˆoB¶YO‹œ~AZËÊØþ×ÿ£ì¥—º}%IŠ÷Î.à ×&ÇÀ»ç«›7}5j¤3-5=>·–” Ǧ3«kûÖ:dh£ˆ¦Q"´yÚhii¡½½ŸÏ‹,ˤ§¥‘–šíæ:šþ×e™°×K}C=Ó¦MÅW|>/®¤$^{åõöèøÞJÀ5žœI0{ìg¥gdcÆŒvƒ!ìVI.î67>¯¦¦F ݈§ZZ[©ªªÂåra¡PY–ãÙƒúúz¬6‹%žöEŒŸ·ÛMZZsæÎé4s÷ÿahýú -†al&qŒv!ILüú×H1â¿n‘’DêÁΛkª•õòú ]g÷?ŸF›[¤‡BŒ½ùFdµw€³öþð”wÏã{Ë- 9ïÜÿº÷%ÑB4¨ˆ‚¥K°æåâÞ¹ Íïï³yÓ¼i3µï¯EMM1Uúú¨v׆a ¸\dMžLæô鄃AÚËÊ>u\þ² |ñE§êfß!$ Cû^~™~øC“ øþ÷¿ÏÎ;ñûý]’ "#Ë2‹«ÕJRRÕGŽš–f¶œEo–P0ˆÏÛŽ×çãŠ+®ÀjµÆ…)¼ÞvÊ•éÿxêé&¿ßß„é uαlIIaÊw¢tcöqºCô•Ô¨iìyî9"Þ.jô†Áˆ+®À’Ô}»`GHŠÌ¡7ßf÷ßÿÞí˜RGbú·¿êttyÌgè#êâ7j$yK— ¬ÚöìEï¨]ßAÄÓNýš÷hÙ½[vù`òfÎ$eô--ª«A$‹…ñßù6¶ôô„<Ï@ƒ$‚--ìyîyJ+ª+Ѻú|uÀ\Àc=F(bÍš5]–†YoMÀP=~¿‰ªª–’Ã,.§Ë´îE››ËÁƒilhDUÕx¶Y 0€}û÷±mû6tCÇëõÒÖÖF0Ä0 TU¥ÍãÁï÷“žžŸÓ=n7µ ,Yº”AEE-î\.ÿøÇӇ̀ûp}'gZƬAÓØÔš;wv’×ëÅáp¢( Ń‹9\^n¶‚47IN6-‚ÃQ2 Õ ˆ1²‰aX,tà ðø ƒ\wýµ¤¥§EÛ¢LÏ€Úºj^zñ•¶ýûx€1ÿŽÙLì,*bÜnþ¬Æ| ÈV+{ÿõ"¡––c`”\vöŒŒŸ3Ðܪï~·ësb2¡§Þs¹S&¶ûï- Åá kÚ4²fÏ"ÐÒ‚¯¢²oü€(ÕÕÔ¼û.¾¦&ùXSRÈDÎœÙØ òñ.§èòËÈŸ÷ßÙ÷¯G"T­^ÃÊ{¾Mùë¯w™Yû$æÏŸÏã?NAA’$ñ·¿ý­«CUL=€D”öŸ«­©M:l°#-=CŠéÿËŠLII «V­&‰˜íÝ´m3 ð´µ±eËGœÇÓPUUUq9477“äraµXh÷´ÑÜê¦dÔHæÌ ü?ápƒe½Oüù¯nÌÝÿpm' gZ°8«ªêH‘Ó錌;Úéø±ÙìØ¬6F””PWW‡Åb¡®®‡Ó‰$™:ÓZ´Ö¬( ‹%IJ, øÑu‹ÕÂõ×_Gfffü‰u]§©¹‘åËWø–¿ón³aë€ç³5Xg~>#.¿ü³àXÐ4¿³ouu—‡ ¿ârÙ=“å–T…ý?*ßy§ÛãòçÍcâm·!*p' †5-íÿ³wÞñQ•ÙÿÞ;5™dÒ© )" ‚‚‚ E Öµ®ºõ·Ö]\uW]t-Ø+«b/t”"Mj€@„ô@zO¦dæÞß7&e’çó%3ï{ç¶¹ç¼ç<ç9ô›8Ÿ”djÆZQqÂÑd™ºÌƒY¹ I¯ˆp¥+f7짨ÑàOèøqø'%u©?q¦AP©¨/*b×[ ÙñÒKX++Ýž;iÒ$.\H||< ”â}üñÇ΂8m‘tþs2p ©©éš¢Â£ ILððòö”VïàááAÊÐÖ¯_¯”i«9Õ5ÕÔÕÕ¡R©ZÀÙ›Õý4MËs]­Ñ€$!È5 Ä À”©SP‰"v»êšJì’ÝöÌ“ÿ(±Z­M( ®7 ée8€_«vïÞ£  ÿk“NV§%>>I–¨ªªÂn·#BK9ˆ ($œo»ÝŽÙdR¢*‘””®½ö|||”RdI¦²ª‚5¿þj^üå×ev»½¸E£`ÿ‚¯¼Òeƒ+g üqn¹åú÷ïïr\XXXg› G) ì" €¸W–åÏV,_•d6[ì3gÎð ë‡^¯4JU"£ÇŒfhêP22ðËêÕäç(%ÛÍÏq‡£éxO¥RÌE]HÿʱÚlMÔÔVc—ìÒ·Þ)ÞðÛF °x°›Žå”ã\v@áÌÞ[üå×[¿¡èÝï7(ΠQkìŠÁwÜ$Žò‡àüÒ¨­øehn(QGzzºeÑ¢/ªr²sL@!ðÚ³D³PšGt¸ÌÏY±’a#Z5§è€Œ©¬s]‘ú¢.»ËÙMl_ðj‡ÅÎH¸ùf|cœUz ½’ÕŠwT£þõ¥Û·³ÿµ×iÈÊr? &Ë_t!cÆô'‚@Õ¡Cl{ùeެsÉÔoOOOî¹çî¼óNQwÁ}éÂP¡´ îNÔwʲüÞÚ5ëR ­wÞu{À ¸Aj//oAqØ=<<>|:–O?ù AZžëÕ@dzÞh4b0Ž Q™±XM””–˜_ú÷ü²ââ°¸%{Fâ\M8£E¢Ò¯¾¾~Èš_×6V×ÔXüýýÔõõuê¢Â#-,G˜È*r„‹A`pü`‚‚±X­44Ô±ÿ¾¦o¿ý¾êã>­¬ªªjBÉÝtÔP»˜Š¢–Õ~óò‰»fÚY] xB¡©¾ž’­Û\ÑtÚÈ’„!<œ¨+.GAUú>·ø¢NGÒì¿`¡~›ÙÌþϱ6'ÇíyW]uŸ~ú)wÞy'¡¡¡-†²3äççóÑG¹úØŽ’/¯us÷ÝE#Ê3v@eeUÌÚ5ëêüý}u:NÐhÔ‚Òȧ¬¬Œ}ûö£V«[žëÎ)FC¿~ýÀ ||½¨®©‘V®XU1oî+õõ và àÏ()3}€;°…˜›“´yÓï–]»vëUÅ'‡"”s®H«Õ"I~>T×TÙwlß^·ðÍw*¿ýæûªìì+J¹ÊpÝ K"€‰~h6£ dĈ¾šA täH¢'O¢±ºªã¦=¢@üM7¹ÜFci)ëþö8Mµ®ŸG¢ZÍÈ¿ýà”äÓwþAé.Ù¼ Εû ùí?$È˧" µ2]òdI"òšiD]yEßoå|”¥ïcã?þÁ¡/¿t;zËo¼ÁSO=E”;$Z'äççóᇺúXBqÜ'¸°(”eyÔ¾ôýòÊ«ëÔjj­Z«×ëA(/+'#ã@K$Ãñ\w¬þ½¼¼hîÿÒd?tèPÕss^(ݳ{¯…åÿWà=ºÇpÚÐÇdjY–=/½ôÒ¹YYY 4He4ihhÀb±´bŒ:Bÿ:ŽÊÊJ6mÚTű¼–ì@Q½r·ä%؃Ò Tz=Ó~ü¾[ívжlaË‹sipRoÓpÃêU²·Eµš­óæ³ï½÷:ÝvääÉ\4÷ÅSJ&Õj$ÉNÑ£ÔÒXRŠ©¼ »ÅŠghÆÈH ÁÁx#:Žíl¿/dP{ê©É:̾7Þ¢bófåæähƒýÊËÎñ߉ R)‚>_Íž×ßÀÞIe‹3T*=ô÷Üs‰‰‰'ôÝ¿ýö^x¡«PZžçŸÐÆÝ‡7ðà&@/‚0|Ä0±ãÎ×7Ô×ö¥Pëõú}G‰·J¥"44OOOÌf37n”jkkË,K)Ê"î-À½“y Ïh†,Ë¢Åb yðÁçüª½{‘l¶ÇŠj5†˜fÎ¤ßØóñéßÿœ0z‚ j4ÿþ;ÿ}†ÃÙ*²ÝÎà‡þHì7ž»¹APœáM›ØùúTíÝëöÔØØXæÏŸÏ”)SПDªë믿fÆ —±r`0à¾ØÀÉÁå™z-0¨ù=ß#FøùûûcµZ[dßAá  R©ÐëõØl6öïß/ÕÔÔ¼wùå—?ôßÿþ·s¢Ð†>KȲ¬Y»ví…Ï>ûìg —ÄÅÅ©5¢¶æ‡¯sžÈ9W¤V«ihh°çççÏþØÅ‰å·d§áV\\—ªýûñ #(%¹ˆæ*­– ¤$L›*5e;w{Õ•íÔe»õO>E]nn§Û|ÓM ºöÚÜc§}’$Šwì`ã?ÿIú;ïb*.îô:Ë’„µ²’¢ß~#gõj¬5µxGE¡óõ=ëÙnÇ;2’È+¯@BMFžÑQ$<ðÀYU«<ÕjJKÙ÷ñÇl{á_4v"Õjž(òÄOðꫯ2zôè–öº'Š5kÖ°téRW PÒ®§&”hìgÀÏÀa $::º¿———àœÖU«Õøúú¶4‚S«Õxzz-ètºa;wî¼tРAk \Ë„ža8׫eÙ÷›o¾¹ý믿þg@@€wDD„`6›•6¿ÍQ[T¥Rµp‡sœØ |‰â´ßWIbÛ¼y Šÿ ¸>'ÀdYÆ+,ŒQ>€)S0WT¶*T*²—-§dËïnGëçÇà×#jÔ.Wá݉CßÿÀÖÿû¸J³°”–²÷í·Éýå’︃þS.CãéyVw«“l6L¿–°ñãi8Rtn–ý9Úõ.[Æï/ÎÅ\\ìöÔØØX^{íµ‘›î@QQQgW£H²Ÿn~E¨Õê Få,òæHë‚ò q¼T*ñññbXXØè½{÷nŸ2eÊ­Ë—/_ršŽ¡[qÎ4˲,ʲ<`Á‚o¯\¹ò常8c```»”ˆ³à¼òïãïÀ €KÓVWÇÆgçÐXVÞ'ì“ ;Ì1ã/Š49¦§Ÿ¦«¦dÖêjÒÞ|‹²={ZôÄ»’Ýή·Þbóßÿ~BÆßuYYl~æ¶½ü eeg¿f `·XÐúñ2äœ3þ‚(ÒP\̦çžgýìÙnµZÍ3Ï<ÃÆ¹üòË»Íø755‘––ÖÙLzyα¨s¹õz=žm¤£€aâĉ~žžžß=zž,Ëg|ýŒ?€,˺C‡]²páÂ*++'DDDˆ]hÇËn··ü»«UT}}½œŸŸ¿E•êdQÂfŒ ކéh15„Ά;OMõõlzþªèz0P}èÙK—ÒÔP1:½Ÿ_·F^dYfÛÜ—Ø÷ÞûݶM€ŠôtŽîÜI¿qcÑzyuë¶ûÐ ÐÜy4gé2~ùÓŸ(Û¶Íí&»£Fâ“O>áŽ;îÀ«›ïÜÜ\þñ`vÍ«yè<ôÖó¸ ::úboooÑ9üïìàw¤õâ}‹ŠŠ ÃùóæÍ›8lذU¨;ÇrR8Ë—­!˲ ËrÀöíÛ^´hÑ&1""BpÔù7içùu«Ò5«;ëA¢ä«\¢põj¶/X€,[+ž“…J§cÀ”Ë{¾Ûsl ì}ç]–ß}7þ÷9¶ÆÆné?ýó2ÿ÷?·Ç ‚àöª¾rÏ6üc6×ýÙûp&B¨ÍÍeýO²þ±ÇÜnÞc4™;w.Ë–-c„ =ÑÊÍÍ¥ª“Nš@§áÓ®ÎC[›Ðœ.¾øâ €·ÝvÛ„S²£=€s& ˲Ä/[¶lþ¦M›öôôôla€v´òw'`2™Ø¾}»Õjµ>N÷u‚jB!Î@‘Íì•ééZÁ))ŠA:‹ó½ÝAñ'úâ‹ :”êü|Ì4r†µºšÂµk)Û—ŽÞ×cd$‚Z}Bç]Eª23Yû·¿¹ö>œó{””ûîeÈí·“póÍDL¸k£‰ú¢"—¡ï†ü|ì’Dèðá}Ý Ïtv³™œeËYóÈ£TîÞíæ4iÓ¦±páBfΜÙ.ÔÝ]e™… ²iÓ&WCL()ΞÐ8¤úûûO èÔ“vDÒÀÎÿV©Tøúú 111†ÊÊÊ[úõë×”™™¹ùÙgŸ=£ÂçDY–e]MMÍä%K–Ì­ªªJðõõl6‹¥ÕËl6·ú·ãoÉEÈ·¼¼\Þ¸q£Ùjµ>¸T¾8A(¥+ŸàB"Cså$Þz+‰‰J°Ïp ‚(b©­%ï—_Ø6÷¥ãjˆ"ˆ"±×L#ñ¶ÛðOH@nnå.lf3›_øÙß~Ûù÷¨TŒ™óN›†J£iŸ~eŽü¾•ÍÏ?O½ …7A÷⿉»új¤s,G~¶@* máB V®r{^pp0Ï=÷3gÎÄÇǧ÷P‰„Ž3†]»v¹²¸˜ÓGtÀ_ÅŒ‹.º(¨#Þ(çÛÁ p~ét:t:]«‹¢HNN޼ÿþU 7Í™3çT•8ž4Îú€,Ë™™™^ºté|µZéëë+H’ÔáJ¿í{Žè@Û»$IdeeI[¶l9l·Û§w‘9qd¢ˆN\ÚÉRyœ•+ijlÀ…Þ×·¯BÀÈ2*ŽÀøx^3 /Å[¶¸=·2ãÙ+Vb7›1ÆÄ óñqë¼ ¢ÈÑ-[Ø9ÿåN5µÑȤ7ß`Àå—+ã:+##‰¾t2Å;wb*)ép_K÷¦3ø†ú¢g• [C™_}͆§ž¢jÿ~·çΘ1ƒwß}—©S§âq dÄ7mÚļyó\.˜P„ÑÖôøŽt “,ËËsssÇi4š ???±mÀAúnpþ¿sIxhh¨{àÀ™ãÇßñûï¿÷´ÐQ·à¬udYçÌ™“°aÆy;wîüc@@€‡^¯G’¤vƾ«€3Ìf3;wîlÊÌÌü¸ÈëÉöäÎJ ¥ÛwP°y¢J…1:Z)ësÜ‚ÆÓ“°Éž:KCÕ™™nÍ“ÌfŠ·n¥pófT:-ƨ(Ôžw»ÅÊö :–.n†¨Õrñ_#|ìX·˜í:oo‚RRÈúþ{äJmõõøÄÆ0x°[ÇÕ‡ÓA)Þ±ƒõO=MÖâÅHnªùòöÛoóä“OqJª…$Iâý÷ßgíÚµ®†˜Ùt_šôdQ |TRRU__Ÿ j«Бáokü_>>>ÄÄÄø–••ÝÑžžþ{oO œ•€,ËºÆÆÆIK—.}·¼¼|BPP Šb+ãï0ôv»¦¦¦N*++å5kÖ˜+++åÔHBJÀ ùÌø®[++)\³–òŒ ô~~x…‡+Ê}i· ÷ó#úâ‰<ŠÌƒXÊËÝšg©¨ à—_(Ý›ŽÖhÄ;"BYm·=ï‚@eÆ~vΟßé5I¹ÿ~âo¼ÑmýY–1c5™(ݱ£Ã1 åÄÏœÑçörˆj5Öº:ö¼ÿ›Ÿy†ÆÎëê[áÖ[oåã?fâĉ'-ès<(..æ¾û¾ÞÕ]À|N;°ß×ÖÖæåææN Ôxzz¶xKÃî\àÊø;^z½žèèh•§§ç¥ .6kÖ¬e«V­êµÒÁg ˲_vvöý«W¯þZ­ŽöõõE–e$IÂúwEüs•$‰Ã‡K›6mʶÛíWßâòKP"n t×ç»lõ¥%x…‡ãÔ£;x6A¼#"xõUxEGstÓ¦WÕ¡¡°¼åË©ÌÊÂ30¯°0pbí«4Ò?ù„²;]n#`Ø0F?ñøq‡ëeIBg4rpñW~n©¬$nút4=DëCw@ hÃFV?ü0+Wºí¬…††òÁðÄOt~ë_|ñ_|ñEgCþ ¬;E»s¼Øm·ÛÌÍͨÕjüüüçA®Bÿm_Î%…!!!Bppðà={öL?~ü–-[¶¸'ËxŠqÖ”6—øÅnݺõ•õë×ÿÛÇÇÇßQãÚ¶Œ£m™_G;¢&“‰;vØvíÚõp°õ4b=ðð‹»$›¬¯¾fÅÝ÷°çÝ÷0WTôå€j_{-Ó—.%éþûÜž'Ùí¬\ÉÊ?ÜÍŠû t÷±Ê'(Xÿ[§ónºÏ6ÒÅîBïëçòKV+¥púpÚ!ˆ"–švü÷5Vß{/ yîe5 <ò›7ofÆŒ¨NCŸ’’Þ}÷ÝÎH° ( ˜ÞŒ}À¨´´´Ï·mÛÖd6›Ën8Þ“$©åï~ýú1eÊ”A:î·Ûo¿ý.Y–{éþ¬pdYVÛíö±ßÿýç¼=,,L­Õj[­ü¯®.¢$IX­VÌf3åååòêի͹¹¹¦súËWÊPº[= ¸íQZÊÊØùòˬzðaÿ¼»ÅÒÒV¶C–eñŽ;ˆ¼èBdùÄòôæª*2>ùÔå56 ŸãìïÞ‡‚ Päi ²ýß/º]†êééÉœ9sxýõ×1bDâðY¹ IDATOÊ’w‰ììl}ôQŠ]KËÀŸ83vÚíö¥ÙÙÙi4šA«Õ¶4kòwþ[Eé8VM,øùù%¯X±âêóÏ?íöíÛÝ#õ0ÎØ@sÈ?dóæÍÏüôÓOozyyõóññiå‰u¶úoëÁY,jjj(++cûöí¶íÛ·/Fpúe+]áp?J%ÂjŽC_;åJVÞ}7[çϧ&/¯/pT*"/¸€i‹¿dÔ3OwÙšyü?ŸEÕ¼úk}}§WpêÐ'é uùw<Žm ¢ˆ¨R!jÔ¢Ð×{¢› ˆŠÓ·jËþp7}ìö5¿à‚ øöÛoyôÑGOK®ß6›>ø +íÿíÀ¯§h—ºiÀ˜;v|½iÓ&[ii)‹¥ËrÛh€ÃöDEE —]vYŠ,ËÛî¸ãŽé§ñØZpF>ù›Uýùå—¯ïß¿ÿŽ~ýú©u®Ž‡TÛ‹áˆ8Gl6MMMÔÖÖRVVFaa¡¼nÝ:kqqñsÀ(ÊU½ |Dé³íÖSA¶Ù(OK#oÝzÀ…Ö`8.1›s*­–àäd¢.Œ¥¡±Ã²ÁˆÉ“vÿ}­˜ü¦ÊJ²¾éXüGﺳ]ëbw!ªÕìýè#*:éŸpóMx††ºü~d™º£G)Û½›¼U«È]½šŒ/¾¤lÏ^,µJ—kM_‚ ŠT:Ä–þÅž7ߤ©ºÚ­y†_|‘ùóç“””tZrým±uëV}ôQ]+YJÀS(¥Ìg",À×UUUU999F£Ú`0G”ß”3?@§Ó¡­­­½Þh4~ñÅ«ÞyçÓV–sƹô²,k233/Z¾|ù»Ý>$,,LÐét-Í'¿­ñw{ÇËjµÒØØHII ÅÅÅv,*®¯TÌM¢ˆÍd"wå*ÒÞy‡úìì–÷¯]¶VãKw¥±lÖ,¸æ§ñéßÿø÷Ch(.áçY³0¹è¯öô䚟~ÄÐÖd»#›·pè»ï(XµªÓòC]@¯½–¸k¦á£´Zîs;… Š )÷§ŸØ±àU,nÊO\vÙeÌ™3‡‘#Gö ÃÐÐÐÀ½÷ÞËÿ:ïcñ+Ššií©Ù«ÅùÀ'cÆŒ0bÄ1,, //¯–n‚ŽÎ‚mËAhgl6V«•ÌÌLyË–-¿Ùíö[W¬XqZ„ƒzÇÝä&dYÖoܸñÆÅ‹¿íéé,8Ÿä¶^WÛü¿s$ ¾¾žÂÂB ؾ}»mÏž=«€«ôÓz'‡:`-° únÑþ!wé2êJK1„†âÔòu²Œ¨V˜8„È ÆQ—G}^>)>Hì—·3¤²,‘ñé§.77cÆ ED•Šƒß}OÞÒ¥.Ç„ŒMÂÌ™­H€¢FÓÒNv×Ë/S“•Õ¥óg7™(Û¹“Cß|  >11¨ûJ ]BT«©Ø·Ÿu{œŸ|‚½¡Á­y*•Š—_~™¹sç2`À€Óšëo‹Ÿþ™9sætÅü%Uy6 ø¼°°0©®®n€§§§èåå…N§k·úoZ-Fé!000º°°ð†„„„-™™™§ú Î@–eÃ’%Kîþúë¯_‹ŒŒôñõõuyÒèˆ ÐÔÔDee%¹¹¹>|Xþõ×_­G}¸¥Ôîl@1ð# ûvîîĪŒ ²W,G²ZñŽŒDßÌ«èCç% ¯/ƒ®¹¯þý‰»êª»ö ¢È/¿D²X;ÜŽ_|Fg\}õÕZõõB@ÁG’ä_/þf¹‹)ÀZzP‚Rßz#ðg úxöÃ8hIwÜN̤Ihƾ‡»;e•Êå*ZT«ÙúÊØ÷öÛ~šÊÔ÷ßC¥×»ý•RS›_øY_u, yqÚ?àÛ¿?²,#%ii¬þãƒnç¡;ƒÆÇ‡ þõý§LÁæºü9A¥¢lÏ~q.åˆ>µ…F£aÔ¨QÄÅÅÉ´iÓHNNîUNÀË/¿Ì£>ÚÙ"`p†’št&¢«;TÈ[·níô¾§R«½A¨×j´‡}||~a-°A„ÞŸ|vÁDŽ7NŒŽŽÆËË«U ÀÙZE }ŒF"#"ð6i²ÙÈÊÊâÓO>µ¯ÿmýÜÜÜܧNÕAôz@–eá»ï¾»lÑ¢EßÜ~ÛmžãÇŽEÔ ZµFƒÅl¡¬´Œ´=iØíöv)›ÍF]]cÕOZZšíÀ€[QnÆ^fN¿YF¸¸„Ž¯Í”¯¾üfEó¿Gw³€®Ú|Õ¢üà¼Q$…dz_ý&\Dâ­·6r$bGéúp\(Ùµ‹å³nuùùðGf“|×]nmKP©Hÿè#vÌ}©ÓHMä¤I\üêeŽ P““Ã/³gS›yðøv¾ \±øK‚’“Ïé{ÄRSÃÁo¾%íµ×šÜÓs¸¸8RSSñqŠºI’Djj*W^y%111§=-—žžÎ´iÓÈn溸@øu±¹rà£æ×>€?>tÿ¥×^3}…¢ *blf‹??¿ºÐ°´¨¨¨¹ÀJANwWÁà“ÄÄÄ‹/¼ðBubb"~~~h4š -@%ŠÄD`` ­^¨Ra1Y(-)å7ß°ôÉG///ÿש8€^Ÿ˜3gŽ÷ÓO?½èšiÓ"¦N™"мzi‘fUØl6Ô¢¥å ¹ÆÙø———“™™IFF†¼nݺ¦‚‚‚ùÀíôrÊ 3§_=$iÈrAÿ Óéh4訫Vêþ}ï‹À(À¥¢ˆ"€j§Ç7¯]n9K–ÐXU‰1<ý ²Ôû ÀBiz:õùó~Š·nÅEPJ ¸ˆº8,¾ø’­/¼Ðé÷©ôzÎÿÇßñG–eìV+›æÌ¡l{Ç=:ü¾6«W(Þ±“˜É“Ð ç–àPó±ïØÎ†Ì!û›oÝv‚ ãÆcèСxxx´räAàèÑ£Ô×ןöš‹Å /¼ÀÊ•+»ê•ì žÀXà(ÑÉŸ¦M›öu\Ü PFƒCÏÅn³c6›)..ÖíÛ·7zÏÞ½—#ËÁ ¾½ëÙgŸuPÑ3h•••©srrÆèt:•———àååÕ. Ë2*•ŠaC‡âmPº»«š£¢J±a*QErb²XXTxá¾ýû~—eÙu·°nB¯w¬Vëeµµµ~ì‘GDUshÕêW©Õ¢ˆ½ÉŽ­Iqêêë0™•ê=‹ÅBQQ¤¥¥IkÖ¬©hll¼x÷ô•‚[n¹Å3~Èà/ Ã?CCC}ýüüÑ6׌;JÛ hÿ¾Œ‘(dÅ…Šw¾%§å^µ€,S™žNÎ/¿ ˆ"ÆÈH¥¬pÜU*ü$ëëo:^µË2«VS™•E@B‚"ØÔü¾Ã×9ÂÎ7Þd÷ë¯wy NŸNÂÍ7)¿Qäð’%ìÿàÃ.çiüýH¼ë.Æ<õ$IwÝEâw;mƱTçdÓT[×n޵ª Q¯#|ìXªeam¬Ç‰Ýl>kAi,+cïû°åÙÒXè^PQEfÏžÍ7ÞˆÙlv¹ºW«ÕÜqÇœfÇ{íÚµ<ùä“X­óWNÀ¡S¯˜zQtT” V; ›Ý†ÕÚ„ÕjÁb1SYY©ß¹sǘí;¶¥>÷Üó?¾ÿþû§»ÙΓɴ1==}’$I^ƒA0¨$¹eY&iÈ|ŒFì6 ÉS­Ñ ªTØmvì6;‚,­úá§Æ›L¦×zzÇ{µ ˲ðÁüá†n—œœ,Hvû1 9 "v[³ªŸM1šU444ÍþýûÙºu«mçΛdYž‚Ò•ª§Ñ¸%Å0¸¥‘O>Š×Èõ3¯OD6Ĉ=?¼_8j• »Ý†ÍfÇfkj׉Àl2 3ÅuÃþ @ Iðsý· »í Ù°â»Ðy{ãŽJ§ës޲ŒGp0Z£E¿¹î Psè‹Q’–F]ÑÌ•”gd°ÑÿØôÔS”íÚÕåy7ÆfÜœ9h›WæŠ Ö>ò(Muí·3‚FbâüùÄ^~9ú€´ÞÞh <:”˜É“i2[¨Ü·¯ý~çÐÿ²ËØûá‡l|ü êÊÊ;ïüøÃaÀ7=´¯@/Ì™3G|ýõ×g?øÇCôHv»Â`F £*? AYù7Ù[–,_ÂŽ;¤_~ù¥º¡¡á&”V”=ºDõòòzð¾ûîûhæÌ™ãâââ ýû÷W ~~~øùù !!!ÚÊÊJ£‡AàÿZRb’ÆÇÇG†pô#°;VÿǼAgÔÕÕ‘—×íz#ÀKÀ”È@8nÊD×:DÎÏ?Ñd6ãŽÞ×·/p;–&‹…ò´´n=o*Ž þCôÅcoÙZ*+Ù6ÿeÌee.çù%'sÉk¯¢1xvéÌ ¢H¿Ñ£È^±¢Ž}Ezz»ã)øåö}öA©©øÇÅa?€æEHΊüú—¿RÖyœV4hü1÷ÜsÞÞÞí>W«ÕDDD0zôht:YYY\uÕU :´;ฑ››Ë_þòJJޝ“¤J¸=.Ž…^ȣÇ“àãƒ^Ñ‹"^^œÂ}‰‰L‹eˆ–¦&åäòÍ’%|µø+JKËhh¨G’dÔj5v»³YI˜ÍÊËb± I’˜¥×ë}.¿üŠK&Mšäѯ_?üüüð÷÷üýýƒÁ 2 IáááwùûûW§§§oÀj“É´uïÞ½S$Iò0 Â!Cð÷ÇÖ¤DwÅæð¿º™0è°5Ù0YLÂ_~aF)§ì1ôöMMMk“Åákûqþq£ÿþžQQQ„„„´0AU*²,ãëëKll¬×Ñ’#÷øúú©‚‚ƒ‘ì’ÓÊ¿Y8Âiõ߬ÌÚ‚¬Çÿ… ¸ØÜÌF!v »Åʾwß#gù ’ﺓþS¦ ÷óë+t²ÝΈ‡Â+4”íó^Ân>ùt¦6 €ñÏ?GÔ„ ÇJòÚü|ª:Ù; j4ŒyüoŠ$´;‘YFëåÍy³g³îÏqkßšª«Y~Ë,b¯»Ž‹æ¾ˆÝrºÓ·îÃQ=±ýÕ×(èš×µZÍ-·ÜÂã?N|||—ãF#W]u£GÆë4K.ÛívÞ}÷]ö‡N„ZÍì”®8Á~~¨÷Rë‡ZAà<__Î à¤$òëëÉ®®&½¼œÿüô_}õžžžÄÄÄ0th Ñ1Ñ}Œ-ÑR'èõzý8çß {ôz=¾¾¾‚¯¯¯—^¯_ ŠâØE‹ÝKÏɽ¯”$é¼+V¼ôèÑ 'NTvÈ©T] ƒR/Y±eAAAˆ¢è×¼[ÑÛY’¤º#EG i1ü€b¹YXÁ•¨";;[B ù÷´ñ÷=zô¢iÓ¦MŠŠŠÒÄÇÇc0E±•¤ÝnG£Ñ`4Õ²$…(ÈÍá~%ì,¬¥Zû4€½çn#ð/àa”–Ço¢ôïþp «·K4ðû³ÿ$oõj’°‘#Qé´}iN 7ë$Ü|ÁDZëÍ7)\µú„·çÕ¿?cÿþ a£Fµ:ï¢JEA'|€Øë¯#85õ¸¾O²Ù=ïtˆW÷î¥Àl&xHn6oÞÌÔ˧¶šêÊè·…(Š„„„©NII™X]]ýáæÍ›o¢çd‹ËTjµà(áu–®o!²;ì˜Ó‚V­V÷¸H]¯w|}}kª«ªeYhŽyNÇÈøùû„®û¢žüýýçN˜0áòÈÈHmBBƒ___—7ŸsïhdP7“QhËj7_À9´Q_×ã­ ¢½`þ‡Òdè>”hA?w6h««c×+ÿáð’¥ ½ûDN˜€ÖۻРdYFÔj 9’~cÆzx+*i(+C¶Û@’µ<ƒƒÑùø´j9ê 6“‰¦NšÐ¦¤ õöÂî¢GA;ì–Aׇ†2øúëÆ¢7¢y…V¶gÛ¼JÉÆnOõññá¾ûîã‚ .@¯×ãííM|||«zð3ÅÅÅÌ›7¯ÃšÿgRS™6`æ°,Ÿüõì²ÌÁêj>ÊÈàŒ ªm6.^¦†æ¡¡ ¿€€@×ÙÉÎ~¢(K~~¾6%%åÊÊÊÊgffþßÉ„KDj5š–H°#à,[ï°cŽýn¶i=Þ¨×ß™‹ÅRS[£xw¢ˆÐìavpüm4¡kÊ‚J¥ºm„ wÄÄÄx&''c4;5þH’„ÅbA¥j¾I’Úäý›Wÿ-Ûj}×»ÙEì$àLÖ¸ø¼ x¥4åo(QötæP›™Éoý“&‘8kÁÇ¡ê“”ÎÏŸoÇãÜxøª´ZäN\¼£"‘m'æ”™ÊÊhpÑ‚Øç=2CXh¯5þ‚(b®ªbß'Ÿ²ïý÷«TqÒ¤IÜu×]„……a³Ù0 ¤¦¦¢iö:ÓðÉ'Ÿ°yóæ–¿½T*^5Š©11 0••~w\GAÀ*Ëì*-eaz:Ÿ>Œ$Ë\Ò¼ä" í¼˜lý}—LžØòìE‘¦¦&·ÉÒZ­–””êêê<ï...ÞQSSóåÉT;j´ZAlŽ`«DQ±eÍ/Guò1[Y–)++ëñ¦½Þ$ÉR]] 2-µ Ž\JËÉrÊx¼à8õîÝDRjjêsqqq~©©©øûû»4þmÃQ²,c±XšÃÿ~Çrÿm¶á\áà€ÉÔS„ÕVèÌp ¸ ¥Då)`í§¢põjŠ~ý•Á·Î"áÆ…{©Q8[ Òjñ q)d®®>±Î ‚@Õál,åå 7Žè‰{íu5Š·mã÷—^¢r·ûŒ÷€€~øaÆŒÓRªæííÍСCÏ8ã/Ë2‡æÇäÉ'Ÿ ÉhäÉáù4&†­¶{Âü‚@ƒ$±¡¨ˆ×öìaia!j”®eE õ»ªQB!+ͪª¢¤¸„аPT*‹ÕÒ:âÚ DQD¯×“ššJuuµoAAÁÜmÛ¶¥Ýx÷ÕétÇä´Uª– €,É­ ¿ã•››ÛçØíö†ªªªc¹ôfNä ç܉,Ë< ঠÍqÀ#00pÁðáÃÃ’’’ ÁÏϯUJÂaô;ºñ$IÂl1£Õh戭ËþZ8öÀÖä!ì$q§ÚBV››'€þî|,Iøør–.#õþûè?uªR6Ø è1ˆj5!#†S›•Õáç¥;vÒd2£:N£%Ûl¤øa§cA õþûP{zö:@ELååì~ç]|úéqÍ=z4³gÏ&$$¤E³C¯×“””„þ8º9žn455±wï^¾øâ Þxã L\ÎýII\‰GKºµ{Vü•6«òòxu÷n6——ã…Rs|7Š$©;$—£4ع#É—]¢(ªTX]€€¶ÏeQÛ××—¤¤$¡²²²_~~þ‚’’’kpÑ©ðá­Õj[Âÿ2 6§dZ¯ú‘A’%¬V+¥¥¥=Jú‚3À0™L5H’„ U+ƒë¸ÐÎùY–ñ0x€›Œuw!Šâ£#GŽ9pà@Í€ð÷÷oÇGèŒ IV‹Uiëé¨uúÚ߬6›­'uœ‹r_¸ëm4 ôVXŽò;¾ 7Ë-eeüþÜó^²„”?ü~cÇ¢Öëûž€ qÁúrq‡7R´a1“'»]y ˆ"y«¡xÓ¦NÇ ºåf¥¼°—8ºy ›_xºÃî÷]ñööæüóÏ'::šÌÌL´Zm xÈ! †®7Ò `2™øý÷ßyçwX¼x1¢,sÇÀÌŠçÂÐnNÕGÍf–ää° -}uuóPBún­œà¼ \ÓÐ@ñÑb"£"Q‰"&“¹Ýs²•p‚s¹`LL EEEš¡C‡žÿ믿þÉf³Í;Î]ê Z­öXÀ©§‡óþ9¿š£½=Núêõ€F£©4™L²>W·ZÀ~* IDAT«;Ø“#Nxê=ÁÍ´›H0`ÀÝ4¦¤¤Щ.wÛÐ?(+z«ÕŠF£FtvœËqøB»>M§N5M.E: Dï¡D&ã^§BÊwîâ×1`Ú4†Ür3þC†´tëC÷@²Ù;m` Váúßç¾D`b†Ð®«5D•Šª¬,6=ûl§ƒÊÓ“„›nêUÄ?Ai(.f÷{ïqpÑÿÜž'Š"‰‰‰¤¤¤àéé‰,ËäååqäÈÌ´iÓðóëêQ·¢¦¦†5kÖðŸÿü‡õë×ã¯ÑðDR7D¢Ÿ_÷úrêêø1'‡ùiišÍÄ¢è‡Ä¦/€½{öЍRa6wì´ý[–åcõø(Ïì¡C‡RTTäsèСsrr~¦ûtøuz¾…èø>Q‘$YI8¥$Y¢ÑÔJçÖE¯wjkk˜Íf< žÇàXýdÛ€‡‡€›ÍmÜ€<7lذСC‡¶¨ü¹Zõ;—ý9{ž’$ÑÔdE£Ñ¶|.tPèøÂ¶)€¦Sþw ™ãwØŽâÔ_ÂHÁMÉéì~ ·¹l0nút¼šÛ×öÃq¦CíáAÊÝ`ûÜ—:<§¬òIÆ<ñ8~*îtÛq‚€¨VS‘‘Á†9sº,öç?áÓ;®¡ Y­ü¶móçÓ—çöÔàà`FŽIX˜b²œç6›ôôtŽ=Ê´iÓ9rd¯Ìÿ9r„Ÿþ™ ‘‘Á@//^;ÿ|®%‘žé¦ë$ ŠÞÿ7‡óâîݘìv’PVíÓY~(Œäë8RT„¯&“ÉåŠZ;mŸÝžžž :”âââМœœç€ë»a7Ô:NQªU©Z‰I’½U$Û-nŽTtÓ÷»Þ±žþ‚“ÅàÁƒäääÈf³¹5Û¿MÞÄ™ ¨÷Ð (Ò¶Ý›‡ 6666V‡§ç1jA‹wT$tÂe«µ µZÕF$¨ecÊÿ8¶-gØl§T7Ý-f'hB©ø%µ÷' Ò‰RS»ß|‹C?þDêý÷3ùR´Fï¾´@7@–$]{-%;vR°jU‡cJ6ofÕC“tûmDŒ‡wd$¢F£”úÙl4“õÓOì}çì]èRxÇÆ{ŽBJEjòóØóîûdû­Û÷“Z­fúôé8úv¸Ü¾ PQQÁ‡~Èúõë™>}:ƒ ê®Ý?)ddd°xñb.\Hqq1çò¿‹/fjt4¾Í×¶»òûM²ÌÎòr8À32€ñÀ`4ÇJùº —c€½û0lDj»€;D@gÄÄÄ0`À]jjê…iii×_wÃnê´:$IBT)ÌšíD‹ñoŽH’„$K˜L&8Ú ßÝ)z½ðÃ?Ô [Ÿ{ž^^ø ˆgH‚µyyÔfv»<î¼?ÿ½¿ÿi5þ‚(b7›É^¾œ¯¾†¹‹NˆÎ9r$÷Þ{/Äl6³wï^>ŒÍfëïãx/++‹W^y…‘#GrÅWÚmÇã.dYfÆ ,Z´ˆ?þ«ÅµQQÜ3u*†‡ãá SwǵEm66•”ðNz:_åæ¶0úA 'v+!Ë >(ìãi ÒØØØ©Ñoë´uA`ذaäååìÙ³çÿ$IZÂIö ðññ WÂýRK%›ÒPjeôáGº躶ö$Ñë‹Åb³˜-ZçÐŽ#g´rddGø- ¾úîóÏ?@bb¢ÑJå¯3â_GQÅ0cÔ·Öªv&ÿ5§ÿ;\iôtSˆ6ÒÍÛ+žÈÄ£ëãèúß|Ë-$Ü8ŸØæþD½!¤ÜÛÐ\gl·Z‘›ë¡-µµHMMØ­V<ƒ‚Ðz{ãÞ‰óç±öñ'hì$ n«¯§"-í„â“&>~Üi½N¢FCål{ùeެ[ïöøGb¯º ÀÀ¾h@[È2ëþö8û÷c­©ÁV[«´Ü•edIbòï>f ’ÝNÐСLzu;^}#ëÖuë¹D‘”»ÿ€J¯?-€ ˆØLìÿßçìZ°Ûqh;–{ï½—˜˜˜ví¸m6>>>Lœ8‘ÚÚZvìØAQQ‘KB°(ŠX,¾ÿþ{6nÜÈ5×\È#z„PQQÁ’%Kxå•Wؽ{7a:/žw× @¬ÑØ}Š}*Eõõ¬,(`Þ®]dÔÖŠÂè¿8Õ‰oà9`J“üü—%€=›]9 ‰‰‰:tÈwÇŽ÷[­Öÿq„¼ À ‡±Aní8¿ìv»#pJ:e €,I’Él6ûÉ’Œ,´&ü9É&¶D4Z œ|ºéþÑ£GG$%%ØÚº»ê‡c7¡ÍfÃf·¡R«[qÚl¤yNû‡q“õ”rºó ‹¢ÞyÒ°54°ý¥yüá†?ð\€Ú³ë¾õç •ŠàÔTr~ø¡ÃÏ Ö®#rÜ8ì6È2þƒsÑ‹ÿ&{Ù2Ò?ú˜úÜÜnÙ!wÝE`RÒi1þ¢FCÙÞ½üþï¹”mï¼ù‘3<<Ë7ß|3 ‚êÖ¬¥~íÇäÿô§Œ[z!a‰Ihÿ»úM#füxb§Læà¦ï|­twSñÎ;_½ÈË×WSUB(¼ö'd/¹€öÚZº¤cÿ~: ŒŒ &7#»vRúäSn=.“o¹…Д”ã~ ——óípè[ÏgýYYY\~ùå̘1ÃY¿ŽQ£FQPP Šy9 66–Ë.»ŒéÓ§óá‡RVVfw÷:C/`VRRÂ\àñ±(ŠÂ† x饗X¾|9þ²ÌÕYY,+,¤ :š@_ û$ «ªRÖÒ‹åå.!!_"¸7÷Øüùó)..¦««‹ÔÔTî½÷^¾úê+}ôQ({öY*ßz‹É7ßLÚé§ö?ë ýü˜ô‹›Yuå•. ÁŽgž%<)™œ — PókšFPd$ÁQQHz!¦Þ{´ëÀ¶/Á­ñ*( ýŒ3|þ›Œ É2]‡±cÅ v>ÿ‚Ç-†eYfÑ¢E\rÉ%ÄÇÇG’ŸŸï¶ÄoVV?ÿùÏ)++ã¿ÿý/ûöís9~(ŠÂ’%K<žý···³~ýzžxâ V¯^M¨Ÿ).fiv6¹‘‘Èv¨o ¿Ùfã›æfžß¾Wjj@Ó¸ø "•ïD-rŒ¨@vf}=o¾ù&×^{í ë8¦p»Bff&III’$]­iÚÐ@d¤¿ªªHªdï·¡1P`Sm(½ÚÛÛU+û~8á @/ÚÛÛ5MÓ$W"@Çf@š¦áçïGHHˆÜÝ݇w©À/ÒÓÓ'¤¥¥IžTõ2jäü¯ÍfCUÕ~§-ÙÿrEF˜@FŒ“ŒˆŽŽæ¢‹.²ÇMõÔ—Y³fQ\\Ìÿû_–/_N§‡.Ks3_ßq•ï¾KñÏ~F´©¢ÞÿÐT•Ñùãɾøbvÿç?¾Wm6¾úÓíXÚÛȽäqŽœŒº¦i}íš% Õfcó#rxs‰Û}OZ¶Œ€ððc?û—$4U¥á«¯Øú̳úö[WÕtaa¡ÇÕ&%IÂÙhŠ‹‹ÉÎÎæë¯¿fÍš59r¤HNNfæÌ™ƒn«¶¶–uëÖñ÷¿ÿŠŠ yfî\NON&-,Ìwù$‰v«•õ<±mkššÔ4nB4™ÊÐzEoœ‚è øÄOpî¹ç2zôhC1 '™Œ;V7n\ö®]»¦ yƒÀð°p“ª¤Š kï¬ß>ûW»÷·¥¥å€—ûFˆŽŽnjkk ÷âéy“ŽG @pp0ˆžõî€?ðcI’ŠCBB. ŽV…˜˜|"Ò1€Ø5N!è+þ#ZC¹®§N€¾B:ð£/%Iâ /$--mÀl±X0™L\rÉ%œ|òÉ,_¾œÕ«WêžÕÑ\RÂÇ×]GÆ’%\vQ9Ù}³Ùÿ˜)¾ñ••ÑZV6à{MQÙtï}ÙSEÁ—™•%Αó}'I¨V+¥Ï¿Àž·Þr»ÏôsÎ!qÆôcnüe??:ØöÌ3ì~ý ¯ ]tK–,±Oî MÓ(,,$:Ú£öv„††ÚõŸ~ú)Ÿþ9f³EQ¸è¢‹ = ªª²k×.V®\ÉÝwßM{{;##y}áBæÅÅ1&8X~_ _e™ƒf3«jkyh˶¶¶2Q¸g)¢ÔîHB" ñܽ{yýõ×¹á†Ü.ïÉŸ@hhh p°ø/àióˆ¤ÐÐP{  ÞÕÖPT»Pqhÿ}èСz·?,Œhmkoë7ãw6úŽaI’ˆ‰‰‘êëëÒÙ–øùù]žœœ|vXX˜ÉÏÏ«ÕJww7j6W!gÖ©³;?ÓÀ4@ñøÇ±“•#ÌÇGê  Ãê'YYY,\¸ÐíÜÝÝMdd$·Ývçž{.>ú(ååå×C¨~ë-ö¾û.–-#ç¼s÷?EBbb8é/aõOе¥Åå2Uo¾Iõ;ïsÉ%¤ž2Ÿ˜q㈈@6™P¬VŽìª ô¹ç¨7¨¨Ã/t®ù±¨x¬ IhŠBÕðÝCÑUçùø˜™™ÉM7ÝDaa¡áóåz—ùùùÄÆÆõ¨‰å¢‹.bêÔ©|øá‡H’D^Þ@³ÚÓÓömÛø×¿þÅ3Ï<ƒ¢(œ—’ÂMóæ1mÌBõ^ >4üû:;ykÏÞº•:³™LDµ® ð]ÕãNDÑ! øç?ÿÉ~ô#"## ¯¹§“¼ÈÈHÓ”)SÎß·oßù‡z8 ü XûjñÁÁÁ"@Ÿð©Ò€€¢(ØjoXSS“ë‡ÖÇ ££ÃÜÚÚŠž8 `/)н€žºçèÃ~™œœüËôôôÈÐÐPl6f³™îîîÍv|5ûwLÔ4ÍîpØŽ#œ§3àsí]ÂÏÏË.»Œ¨¨(Œyww7ÙÙÙ<þøãlذÇ{ŒC‡yt ª¢°í‘G¨xóM¦Ü|3cœŠß÷”›~¼¡i1ãó8õÑGøú®¿ÑVYéz9E¡bÅ *V¬À?2’Q ø‡Ž¢³¡‘.ƒJŽd™â›o&*;Û×?ÁÙÏ£û÷³ù‘G S]®'Ë\uÕUœwÞy„……y]L+;;Û'Uü$I"##ƒë®»«ÕÚ/]ðèÑ£lܸ‘Gy„>ø?Yæyy\>nù£GèËø>€,³³­—ví⩲2Zm6¦÷gÒÀIh¾î¤ÏG?sæÌ~5\‰È=çcbb8óÌ33f ‡¢©©)¬¼¼|Ù矾¬­­­ xxØá¼ªI6Iý<R€¢ ãoSmö㪭­µ ë„xˆA$I2·´´hý. ª¹$zGÀ^M‚Þ•——wKnn®XXÝÝݘÍfÔ_Gè“ɵ@ç*à8¶Ö1ÔE"¼‡†:¡Ù³g3}út¯cÍŸ?Ÿ©S§òÆoðòË/ÓÓã™0Ò¼?_üö·TÍ›GÑu?%¶°ð„êNwÌ iÄO™Â‚'gëÓÏP5ˆßÚÚJk«wõNçÍ%ç¼ó†s”n¡Z­ì~ï=¾¹ó.”Ͻ`±±±Ìœ9“É“'ã7„ÑÔÔTRR|›Ù®§8p€uëÖqÿý÷SRRB|@L›Æ¹dFD û2¾ I|×ÜÌ‹åå<_Y‰YQ8 ¸ÑUod40ˆzàSàvD;Òш´Äfફ®bÔ¨Qn½³žŽõŽªýèèh"""ÈÈÈ`Á‚ìÛ·/¤¢¢âÖO?ýôV³Ùüð`e晴Roq7I3{£8‡Ø¿Íf³sÝÝÝØl¶ÿ_HGww÷ÑÃ͇í'Í]%@Ý…Ò+Ø9'==ý9sæ„GFFÚgû:œÝôŽÿ—8³M}/›äYŽ{rUà8¶Ö1Ô‘ç2`¶Ñ—QQQ\|ñÅ Qœ×ÓÓƒ¿¿?×\s §œr Ï=÷Ÿþ¹Çiƒë×Ó¸~=yW_Mî.&<5U|ñ&šªš˜ÈÌÛÿHÒ¬Yl~âq:«k|²íˆ¼\¦þú×ø»d‡ I–ißWËw>J퇞7¦ôóócòäÉäææÀæÍ›©ªª"??Ÿ””È@||<ééÞv¨÷ ÕÕÕ¬ZµŠ¿ÿýïìß¿Ÿ)QQ,Ÿ73RS‰ ñm|Ñ•ë˦&^(/çÕšPU.®A4Ñ p¿ú ‹]Àˆ¢Ìè߀h„`Þ¼yLž<¹ß:Ãì9íqü;..Žˆˆrss©©©™¿yóæùµµµß"tP¡’I’EE€´ÞÉ_¯ÖKwýÛ›}ò×k£ÜwÚòFhoookiiA±)Hþi.Òõ‹jZ´hÑâââb{|ß•ÁwüÛÕ 2”ÍÕ:Š¢ ¡!KŽ+‚ââá·ßVÀ04¨øgøD-^¼˜œœœa ³ÙLBBýë_)))áÑG¥¦¦Æãíî|ñE*_{É¿ú‹Î$02òMLdœyq“ŠÙýÞ{lêi=(®–•ż{î%2=Ý·Æ_’°vvRµr%ß=ð J—gã $I¤¦¦2yòdbbbìcÉdâèÑ£|õÕWÄÅÅ1aÂÆŒãrš¦˸qãÜÿòš¦±cÇ^~ùe{ì1:;;¹ %…+O;))Œòóóm|èTU6ìßÏ“ee|P_O° ¸˜Èñ©Ñïk(À6à%D"+¢ÀÙ@ÂÕû" pË-·Øu\îÆõ¡xŒþöóó#99™èèhêêê¦mÛ¶mýö›L&IQdIî-ûÞç°)6{•XÝ+Ú›ñutègÊsŒ iÚa³ÙLWwa~aúgÂ@_þ¿£ 22’„„„~©>Î$ÁùïaŸË¿aµZíe ¢¯ â"ÖoSNxà ÞiF dff²xñâáS?hš†Åbaâĉ<óÌ3¬]»–gžy†¶¶6ÖWº»ùöocçë¯3å–›Iš9S`àšh𯍏8&^{-©'ŸÌîwߥò•WQ,Þ…Ç.>“i¿þ ¡‰‰WÜó’,Ó¼s'[žzzPá¡#"""(**"-- —Ï ,ËûŒ´´4òòòˆˆˆè÷üGEEQPP`XÒ×[X,JKK¹÷Þ{y÷ÝwQ…ëss¹$+‹9 ȾlÌ I´X,¬­«ã¡mÛØxø°=&w1ïJ|Ot# ÿ½ù½ \„h<Îa¹Fà„ëÊ”).ÇzÞ]Èílôíe|HALL 3fÌ ²²2 Àjã¿Éd²E®«bí7Æ÷€ÿ/ÔØd6›µîînBCCûeyF…µ·#šóÅwõÞÕ߃ÁQHb´Mýs›Í†$KÈN)€Îpeìac ow8 1¹p Y–¹ð ‰‹‹óyWCEQ$‰³Î:‹™3gòŸÿü‡·ß~Ûã°ÉÑÊJ>»áFRÏ8ƒ ?¹†ÑãÇŸýë4M÷‰ÎÉaê¯~EÎ’%Ô|ô{?þ˜öÊÝn× Œ¥ðºëÈ>ï\Fò™ñ—d™žÖVv¾öÛŸ~Å‹š§žz*×\s ááálÙ²…ÚÚZCq—þœVUUQ__ϸqãÈÎÎ&((ˆððpòóó}büÛÛÛùú믹í¶Û())Á$Iü¡¨ˆ‹23™Ó7Ó÷¡°¯¶³“U{÷rß–-Twv’ <Žè¿ÊÈÈáwF+°¸(Ex-®CÔýOExô3¼ƒhŸ7wî\‚‚‚ ÇòáŒ÷z¡ç">n<Ñ`SD i 1û׿£ö«§§GÌìØXî?Ÿ3ÒÒˆÔµ>¼‡4YfÓ¡C¼½g••aUUÎ~pÅh5ú=To÷mÀxD–ÂL„¡Òp=3Q÷›I&9.n€AõE¨×Ùů“wMMà„˜þmãUÁªXd~)Š¢[HÚ IDAT‡t ^bD@³Z­³Ùä²°æ0ûï½¾þþþý<®. ÜŽGãŲÐç$0Þ®ë:ÇÃp:ÁÓQ~,ð[ÜhŠÎ<óLòóóëoЙ÷¬Y³(**âƒ>`ùòåty((³¶´ðåï~Ï®I“˜ró/ˆ›4It·ûCm6+²ÜçúweUÕµkÕzü‹y²C ž3¬“––ÆÙgŸÉdò9èêꢳ³“Ñ£G» §pñÅ3wî\^zé%>úè#Ó›KJX}ÕÕd.]Ê„«®$"=ý­8Öýüè>|˜’'Ÿ¤òåW<^O×x\~ùåÄÆÆzTKWeOœ8‘ôôt¶mÛF]]a—>Y–QU• 6°uëV,XÀܹsÔÿïèè°{–V®\I°,smN—çå1-&Æ÷±vI¢ÃfcãÜ_RÂÇ€`Ý…ŒLE'ð5ð"a>Xœöyjýü^+žžF{{»½æŠ«±ÖyÌv$‘F“AG/®»,WöEý©šŠÕfE5©ýB®ÆÅ£G—"@0B€¢(=–û,_WþÛßký³1›Í./Œ3[ƒÁÝDž0#2 ªª}¢³?WƒÍæÚ0õ˜{'@Ot3“CœwÞy$%%ùÜøK’ÄöíÛ©ªª"33“üü|BCC —·X,ÄÄÄðÛßþ–E‹ñÔSOQVVæñqU½ñÕo¿Mñ­¿$ûœs ŽŽ:&3ã2”žjÖ¬eÓÐía§G=Ù¯¿þzŠ‹‹ gýn÷«(Œ5Š9sæpàÀ¶lÙÂáÇ×3?“ÉDgg'o¿ý6_}õçœsÅÅÅ´µµ±víZþïÿþ-[¶ÈÅÅ\FTÊùQ´çÇEÂð{s……€Ò3Òˆˆ§ãèQl6«Ë‰œ#œ=ƒFFßÝäRÓ4ûmC÷»Û_{{ûqkü2b€¦ií–‹8q!WÆDÕ­žž·ìÌÈmÓ»?—ŸyòÃ1Û÷cµÚe!xCö‰]ÁÓŠw>Ä` !ü3¬:cÆ æÍ›çsãpøðajjje™êêjöíÛGAAYYYžG‹ÅBnn.?ü06làÉ'Ÿô¸¬°¦(”<ð å+^fÆm uî\$æŠÿP!™d:›PúÜóT¾ü²Ç÷CPPW\qgœq‘‘‘Ã.…­( ±±±œ~úé˜ÍfÖ¯_ÏáÇ ãý&“‰ƒòüMÓøâ‹/hjj"/<œgçÌaqz:‰zYi_Þã²LCGkëêøó¦Mìëîf ð$°¡~‰Ø‡Pé? Ô b‡¿BT!ŒÄ{ÃbÔ\h&Ù9Â)É26›b8Áód¬7òè…{œ €PU•Ç=ÈýÒÚÚÚáå©2F̦iÚ‘öövq’ÒUMµ¿tb±XLuu5;vì@QNçŸ rRR’öÿ§­÷ª«¹gËš­V&w§3rýeˆøþsˆ´¾BDžɈYÄP ?ˆz;E²s² @Y’í£ÉÙ`†ÞÈc À%peg7ü6IbWk+Ëwîä©òrº……ÀÏ©5>ÛÓñƒ|üx ¡(ž,A´öÇXÑï)dà߈™JêØ;“e ‹ÅjŽ›¤ 6ásüN·!0Ù’Þž4^¡¹¹yàwŒ0b€¦iû[ÛZ…ñtî¨j.=ÎB@#áÆ`DÀé8ÜÎß¹òØlJo Mjš®gpÕ¾€».ò¾ŒçœsÎ1¬È6¨ªJ™‹þöŽÐ+¾­]»–´´4òóóûU|s†Õj%99™;’’ž~úiªªª<>öòç_`׊—™vÛÈX´=ßû’É„­»›ò7Þ¤äÿðª OQQ?ûÙÏÈÎÎ>&DjôèÑäää ˆû'&&²téRjkkY¾|9õõõ„šLüiâD.7ŽìðpL¾®ØôhÛáÁ-[xsï^Mãr„¨f#SÑß…ˆÇ?¬Fú³{_)ô¥ò ç,š€À'ÀW@fV}4I’%,VKßøÚ w^o5`ìpÛUU8pàÀq©#‹´µ´´Hý. Úßø;_ݰ0, &“iЋåÎ¥ïÈ¿s8¾~;¿tñ‡c oñPÅ9ÍÇŸ‰PŠkÝ­¸dÉÆŽ{LqY–™5kåååÔÖÖº]V’$öîÝK}}=yyyöŠoFÇ¥ª*“&Mâ±ÇãÓO?åÙgŸõ¸¬°ÚÓÃÆ?ÿ…²—V0ãw¿%qÆŒÿ‰´AGH²Ìá²2¾}à~ó­Çë³lÙ2N?ýô~e»}MÓˆˆˆ ??¿_kX€¦¦&V¯^Íßÿþw*++I ä©Y³8;=$G"ç«c’$ºl6¾>tˆ»7m⳦&nEôÏ.fd–êmÖ%ˆŠ`×§±±¢/ -°‘òg“$â™X4±ßr²$cíõ¸ËÈ'Çp€;-€ÍfëGNòˆWåSSS™;w.ÅÅÅÇìž £¨¨¨Ÿñ¯¬¬dåÊ•üñÄl63><œ·,`^RÑz?_$Ñnµ²fÿ~îùî;JŽ! ¿Èbd*úkµùïATïKþL£OØC7üz‡”=ÀGÀ›ˆIÀøüñL›>• À@ÚÚÛ°8ô²d‹ÕârÖám@ÿ~0 €³MQÅk @OOmmm¾©¶åF ¸.77wB[{Û€ æ(t¾há½E!üüü<º`®nîØ¡‘ É‘ Ø¬675Ä{›Íµ¡±ÿn€®*朜i´‚,Ë,Y²„¨¨¨cûסi²,“˜˜ÈèÑ£©­­¥¬¬¬_›gWÇÖÙÙÉ×_Muuµ½#œ;}@TT?ÿùÏY°`Ï=÷œWe…ë>ZEýê5L¸ñFr—^HÈèÑÇ”}_Ð4ƒ%%l¼çZÊvx¼^HHÓ§O'##Y–ùä“OHNN¦  €¨¨(\²žî§  Ànü¿ýö[Þzë-î¿ÿ~dIâô„n›<™É±±„ aŸ$ÑÜÓÃ÷îåÞ’*Ž%¡„¿‘ö6±‘{"V8ø%".8aŸ©wýrDËßÂâÓçŸÌì“NbThímmiØ/G–$,=ýCî<½:ŒÆ}ÇïŒBý&¢ÿ*Šâuy鎎õU@”K8¦ Àÿ÷ÂÂB4ÈØÔ>"àŠ9r„ÀÀ@·îçûmß–8˜«IUU{3gèæ_sÙöw(¹Ï>€3ˆFû`£-ZĤI“ŽÛ±jš†¿¿?YYY$&&RQQÁîÝ»Ýù‘e™C‡ñé§Ÿ’‘‘A^^ááá†ÆÆf³‘‘‘ÁÝwßÍÆyê©§hhhðÈ8iªJéc±ó¥—˜~Û»`~#1²ë’DOk+»þó¥O>éñ¬_’$rrr(**²Ÿw@ïß¿Ÿ††rrrÈÍÍvéh???»Ûÿã?æßÿþ7/½ôA&7ææò“ñã)ˆ‰Áîð1AÛßÝÍ**ø¿ÒR{z˜€hU{6âaiP1÷×)‰2B«ð# ¡ö…á·;c"ôÚ+.ç¤Ù³‰ˆŒ µµ•–Öq¹\k$IÜñ àÎûë8Ž9~æi€N¼)+ èÕJ#€¿"2%)FøåÔ©ScüýýimkÅ^ Ø¡°pFXX0¬ÛìŽ8vøNÖ€£I²ûú\‘W‡›ÿáì/€ûšÇc†ȱ±±ŒÇb±`6›ééé!00°ß‰vÎЊÕjp‘Ü•ttÅõ÷Ž0"ÎË:ºƒ„ýyë²ä0jBèÊØ+Õ1 @p#n*Ž^z饤§§kö¯ÿ¡ý#W…ήNüÐpˆÿ«® @XXŠ¢ô{¹clFßë_?6Çe¿= Њ„dŸüÙ{ô.£ô°ù¨ûš—Ð € ܆Ð÷¸Ä¸qãX°`Á°â¶ŽFßÙøKŠ‚æ!‹Ö¯Ebb"±±±ÔÔÔP^^>¨>@¯ï>fÌ&L˜@\\œ[}@\\·Þz+ .äÙgŸeûöíÿöª7Þ¤úíw(þÕ­äœ{.QQ'4$ U±Q³f ›}ŒÎš×MOOgÙ²eÙ¯M||žGO?“ˆ Fß—Ï’$aÓ4>mhàéíÛy§¶DYÛ›ñpÃB'0ö"ww H@ðD†B ÂE?\Ÿ¤žÊ÷5ð4®Gæ3!!!¨š†¦9d`9²€°X­žÇÁ¼·ŽË¹úÌ9ÐoêæàÝ]à$8¾ø3âRœÐ $$ä7±±±öVºŠ¢ÐÕÝEDxÄ€«@ppð€j€ƒ¹mt†çÎå¯/¯»2]y „\öÐÐ fÿ€ÏÚ¯z Ýb.Îw·à¥—^JLLŒ×³I­/"âræoê63öÃÕôŒŽáÀ´ÉØ‚=›Kiš†ŸŸ999¤¤¤PQQAeeå ú€Ã‡óÙgŸõ«àêwéì~üøñ<øàƒ|ñÅ<ýôÓ<èYOMQ(¹ÿQVø¿'eî\ä°¬°ìïOÇþýlyò)ªÞzËã‚>~~~\}õÕœsÎ9Œ5ªßóH~~>)))”——³oß>·÷Ž$IÔ××ÓÐÐ@vv6ãÆ³oÓb±°gÏÞyçÖ¯_ªª\•Å5yyL3†Q&“0¾œñKŠÂª}ûxª¬ŒOššˆþ\†Pô´æ< Bp÷Bا"Ì¿àÞe<óù¸†®è¯>C¸úëxÓc6£ijïËÁø£‡€lIÂîõ5—?sÞu„QÀ`("@§1Ê!¼Ý«xoÔéÃiùùù€=–¢( ÝÝÝb¶ìäpåÒ 9Îþÿ5r߀{ Ã•×Ày9UUQl¶ÞÙ¿äàÊê½‰Ñ ]ý߃ijŠ`Ÿ£Œ:í´Ó˜:uê±· bä̼5˜å$¾³ÿ#­Œ™7“š Î¥-#Í+@pp0'N$55•;v°ÿþAgë555ìß¿Ÿœœrrrvùu8þ|ŠŠŠxï½÷xõÕWÝÎlanhe…çÎaÒ²eŒ.(8a¼’,Ó¼c^~6õ ÚðÞ|óÍv;Ó4Q"uÚ´idddPVVÆîCªªÚõYYYtttðꫯ²cÇ‚M&~?aee1>&}Ÿ¾<—’D³Å««ùǶmlok#áº^ÄȬÑß|‡¨Ø÷/„»ïTD†B.}ùûÙ‚è”~/BÍÿž ³¹§wL¦—ˆq7×W’$¬–!ç=ñ8ÃS€}Òg³ —€ wpŒÚŸÈàꘘûìÄÅí6wÛÝçý<..˜ŸŸ‹ÅÐè]8p­Œ¸ZV߯ÍáwhšÖ×Ш—¸ÍN¿'¢àÏd£/9ÿüó‡%üCÓÄ #IfÿAGZHZõ1–„14,9‡¸ÏÖSø§»h\r.{ÏX€5Ì3I•~M¢££™={6MMMlÛ¶ÖÖVÃuDÑj×äçç3vìXÃ8´žï«—^±bëÖ­óø¼4nøœ?ÿ‚Ü«®büå—–”äñlûX¡µªŠ/îü«ÇÆ?44”«¯¾šÅ‹4hËeÝ 6fÌæÎK]];vìàèÑ£†ëtuuQYYÉ /¼@WWéÁÁ<:s&‹ÓÒÈ3}_(I¢¾³“÷ª«ùËwßqØj%xQèÆ°(Æ Œ6àKà!Dg¾`àrÄïÉ¢ÏàçLJ½Û©Ax>Å{"Ñcé±»ÿûfûúÌß`¿’„µ·°+ƒo4¦ëï—q|¯ZÇ÷îlÉP€ }Ì(à„Óç8Q À¨¤¤¤‹ì@’$L&æsÿT M5hì!Ç‹etáto¸yâp\VߟÉä: Þe\Aý~f„©ÀOps\zé¥dggÙøkRoKMàþ—…¸›ˆø¦„æSç°ÿä94ž4‹Ô5õÕ74Mì1°ïO¨(++s[fY×lܸ‘êêj ˆ·oÏŠ¢0vìXn»í6Î<óLžyæË kšÆÎ_¤òµÿ0å·¿#sñ"üCC»G@ö÷§¥²’ ü#G¶•º¼$IL›6«®ºŠqãÆÙïwO¡i¢gzzz: .õmmmÔÔÔ°uëVl6sccùùŒœ–’BŒß÷5a’$vµ´ð^M ·mÞŒªi+Â>ï ¼~ÿh@¸ßïCäò' „}3dDl¸G=•¯ xÑòw¨Ý_U{ª·£Ç‡É“óØ xòr†£Ñ÷…€ô—Þoĸês\ÍÿøIbb¢IÏ£Ô €ŸŸzK`{@u=û‡¾Ž€ŽWD@Q:::ì ofþ®€óßvàçgŸù;,„¦  +|O3Áóp3Æ¥¦¦²páÂa—nàþ×4$Bëö“°j-Ö11Ä|ò9…‡›ÙwÁ9ìYr.þ Ð%M¶ÚðëêÂæq怦õé’’’¨¬¬¤²²rÐ8ô¡C‡X·n©©©¸ÕLž<™‡~˜Ï>ûŒçž{Îã²ÂJ·™o¯¼Ì´ßü†Ä™3[YaÕj¥fÕ*¾üãíÕñŠŠâ§?ý)óçÏ·7ß*4MèÆOJJ eeelÙ²…²²2öìÙƒªª\œ–ÆÇçä„Q|_6<È;UUÜ»};2pÂ[„(t3’ !Œñ;ˆ#"®ÿ'` ¢Ÿ·Âð…}`FäðÿØ5Ìí¢¢Ÿª êÆßÕÐ#I"z°‰œ»I}?½pôæ:kŒˆ€¾¾·YÍ®»fÎF´S¨ójcà„$²,_0jÔ( ˆÝ«ES ×h¥‚Z­V—YúßV«•#GŽô›µèûsˆ€± Ä±n€óËf³¡ØlúÙõmK0Z#±ßp ì0àZn87W^y%±±±¾96Ýý¯‰p€lî!é“ÏðkieׯnBÖ í·ÿ×ûÙù‡_r`úTü:»Húòk’_‡¦ ΦæôSQ½xØ4MÔ(..&--ÒÒRÝþ&MÓØ»w/äääØëé‚‚‚8묳˜6mï¼óo½õ–Çe…Ûwïáãë®'eáB&^{-QÙYø{Uj×#ôžû¶}ûØþü T½õ–«H,^¼˜ .¸€ÔTýöU¨Êl6S[[Ë{ï½Çwß}À/òò¸*/I£G»ÿ’„EUùº±‘ïÚÅ {öà‡pýQÃßýN8ؾg3ñn„ù%â÷#‚ʾ˜ñw"´/"\þ¾BßL^íåzjߘ٫p~^õô^Gw=xÒuµœãgÎÞHC¦æ­û ˆ(Í=^opœˆ 4>>~.Ð/þ‚˜Íf1Øhô;ù®Ô8{Ìf34œÉ9¿Œ£Îë8/g±Xè±ô0*,pºÙÑ|OÀ³gÏfæÌ™¾;.Çó'Iøuu^±‡€æVFï(§váilýý¯ˆÛ\B[V&’ªt¸™ôV½f’I"tw,˜?ÄÝkDEE1gÎ)--T`±XúõL0zôh®¿þzæÏŸÏòåËùöÛo=6˜u«WS·z5)§ŸNúÂÓI˜6 èh$“ ÜÜûnÑûL) Gvî¢âÍ7©yÿ}rûCBB¸ùæ›™?¾Ç¹ùž ½½ÒÒRV¬XÁž={1™¸kòd.ËÍ%]oÌãëgA’8jµòec#nÝÊ'MM fÇK ¾ÝÛqØ Ü ¬Dùň „Yôuä.]“9üŸ/MÃÜž+Xm61ûW<½ÿÝ Šb0‡ÁúÎ:0g8Š'’F!åÐÐP¯³›Þ&×ð?B®ŠŒŒ”œÝÿ b²mímvÕ¿»ø?`Ÿ¹òtuuÑÔÔäróÔí¯ß,Ž®pg&©g.ô-ç¤Jí}Y û 'ùÆ·àâ‹/vÛUo¸è‰Ž¢ô··0ö“ψë}¢¿ùŽ}_HÃÌhþDî®"ó•×ñ?r„ª®!õ­÷éJNDFîÁIJJ"..Žêêjôlܸ‘ªª* ‰‹‹³oÏyûŠ¢••ÅwÞÉ7ß|óÏ>ëQF‚Žº5k¨_»Éd"þ¤Ù$LŸAL^.cÇ3“_of„$!ɲ=t$™Lh½ƒ–­ÇLÏ‘Ž66r`ófª?ø¶Š Ï“ÉdâÖ[oåä“Ovù;‡UUY³f +V¬ ©©‰qaa<3{6çggpl ¿,s¨»›uû÷sûÆTvv…¨Ñ&ÂPŽ4t „v÷#~À%ˆß“HŸ¸gRFäð¯þK6‡¥W̧:k‡ûÁ•@x”Gq·óÍÈÓ«Ãq,÷&0”N€n<Yƒ0À G$Iš£×îwEZÛZû€jìþ×— 0û?zô¨Ç5ÝÁµ:ÔUÀñsÇÙ¿ÍfCÓ´>¢ õ1Yý~¶¤zfí¿ IDATšRv¬!IK—.%77×çÆ_ßž~~Ì£c¨¼ð|L*"ý½Èú¿Çé¸ïNBIé?ø7d÷ï~A[f‡Ó™˜€æ'—-dEÅì¹NÓ„ M¯P^^n?A×|öÙg¤¤¤PPP@dd¤¡WÉd2qÒI'QXXÈš5kxñÅõúߟf³Ñ°n= ëÖ aì¨QÇÅATVáøˆŽv’ŸÖκ¢³¡‘#tÕÕ )ŒÄŸþô'æÌ™ãÓ{òý÷ßçñÇ`fl,žu‘þþÇÌð×utðáÞ½üáÛoi±ZIGûNâ}»·ã‚CˆÂ= JèÆË¿Ç—BE؇Hå{ƒá‡<ͦÐW@S{o C €8‹axa*(xSȨp•;¸! ºFß7¤`€Ž„††ž§ýqŒÿƒ˜´µµõKÌEGGc±XìË···S_?x»e£øŽ7Œ±§§ÇAo !Ë&»çBj@;P\ô°XN @ll,‹/>&=ÛصkEEEŒ=Íd¢5;‹Òe×qæé„ï©&ý¹Ó— V+™O=Ïè™S1µ´Ócß–¤ªDT×ôéFUì¦ì×7ÓçU¿UMÓ bòäÉddd ªÐõûöí£±±‘ììlrss S$u÷à…^ÈŒ3xã7øðýRÏëÇiëèàhGGÛK¼ZßSÄÅÅqûí·3aŸÿ/¾ø‚'žx‚3O.$;=ŽÇ_ü˜gwìà—'ú.æÞ;~T¶·óFe%ݺ‹ª2 ø0—‘§è×­x_F¨ûÇ!ªÅÌB}ñ„JÃ_Ž'¬ôÁ6½hê£9e¨Æ IBUú<à>œëΠÃñ;gO‚ÑKQbÆ%O ªªÞ Ћø€Yáááºñw&ªª  _<7³111466"IíííÔÕyîAqwã8‡œ×³Z­vâ¡ßŒ²,éê4­7ů÷u"{dYæÇ?þ1qqq>7þz=þ––Ö®]KFFöjoJPGòóèJˆC æÐ¤"üzzÈXù±¯¿‡„92Ùj%|_)«?&rÃWø·´Ñzò,l!Áøõ˜ >xˆŽ”d¯ú hšFdd$sçÎ¥¡¡­[·ZÇÞjµ²cÇjkkÉÏÏ'==ݰ¬°ªª$%%qË-·°`Á^xáJKKYxe(HKKã–[naüøñ>mLUVVÆ]wÝÅ„qI<{ÿu‡…Ðc±ñ»—?£ÅlæÎéÓ‡WJW’PT•Gް|çNßµ EU¹ÑÙj6#¯F¿ ìžG 2S[‰ôuäîÝ£WíÛŒhÇûÉ0·7Ttuv¢õ†€ú˜éê9‘z³¬t¯+àrü\þ=˜À“€N"#½£–ƒ=û'!8™ÏR_N40ßßßßåì_G{{»=eΓ222’ºº:Ìf3{÷îõhg8Ø2Î!UUíqÀÈâfÖ4{¼¾£Ù߉à˜8q"sçÎ=&†©ººšÖÖVûù«ªª²7çÉÎÎÆßß_„¢£Ùò,Z(åW\Bak+Á»kðëì$󽕄µ‰Ã OáÐÜÙÄ­ûœÚÅg` #nã&²žy¿û%GòÆ é8‰‹‹£ªªŠ²²²AëØëõvïÞMqq1ñññ.¯±~N ¸÷Þ{ùòË/yöÙg9tèÐ÷JFÅôéÓÉÈÈ ¼¼‹Åb/Ã;\ÔÔÔp×]w‘Æžù%É 1 *ÜwûåȒ̽+>¡Ófã¾Y³ö¶s¢$aVJ››ydÛ6^ë}æŠ(Õ;1‚Ž$X€o]_£¯bßEˆV¼2¾öÑ»ow{÷‰ù¿Û{?öÁ.xªŽ‡8¡€,˧ê%ãÿ€Ý…ïÍÀÅÑ£G©««ój=g7‘‘ÐÕ°«««‹ ×S ³WúDzŒBÖïÙàïïÏÕW_}L„]]]”——÷ûLÿlݺ•={öP\\LRRRÿЃ$¢‚¢bNI$ «›¨/¾¦múÏ#ç…shÑi´äæ|¸™Ô•Ñ“˜@WÜ$Uů«ÕÏ„âešŽÉdbܸq¤¤¤°cǪ««Õ477óé§Ÿ’ššÊ„ ˆˆˆ0$þþþœrÊ)Lž<™ 6ðú믳ÿ~¯Žq¸¦¨¨ˆŒŒ BBBì÷xEEûöícüøñ¤§§Û;rz‹C‡ñàƒ"«Ý¬xâ×äe$Ø›ôD„ñàŸ¯ ПGž_…¢iümÆ ¢<xJíV+ß<È=›7óqSþˆÙñ¥ˆþ‘†VÄìû1`=Âcñ#D‘Žxúfú¾˜ñw›5úE?CÚ{ß>T#’#Ž+:::í"@û˜«jnC¢ÛªæR`äöwõr†þ¹ã³ëÎ.èÝC½»¦e(ä‡JfëlÊÜ– u…ÈÈHêëë½€¸rù»rÿ;»wõ¶ÅÎÄEÓ´ÞÀ½ŒS¢_E+CÀ÷œðóŸÿœ3fÐÖÖ6 Ô1\ìܹ“îîn—žI’èììäóÏ?'>>žÂÂBbbbìç[ `çµWÚØHs^.›¾ŸÌVSpç½hþÔÏ; Õd"þó¯Uº“ÚË.$jgaûj ßY5:Šª‹–Бo{Mý¦NJff&Û¶mãÀ†ÆP?Þ½{÷Úû äååÎQU•°°0–,Y©§žÊÁƒùè£Ø²eË „c¨0™L$''“žžNjjªÝ¸;þ&I’èé顤¤„½{÷Ú«"úùùyLZZZxøá‡©ÛWÍkOßÂÜéyàúÒ4Bü¹ï—äÏ=Oü—@Iâ÷S§2ƨ«š$qÈba}]woÞÌÖÖV"€¿32ýûÿ"füeˆŽ|7!fýQøÆÍ¢iQ3Âð?…HëŽ "þ‰è8îΈu£o䥕ú²nÜ…<ÿëpÞ¦'!oÇK³Å·­þìÕ†ÝàD"9Fñèïpe4\ÁhÆå Ü1DÇ™¿þ·ªª=zÔ~“èǨß8’,9ÜÀô‰[T㸓í{$ Ü|óÍdddÐØØHEE6›Íãs٫d¹»ž’$qàÀÖ¬YCfff?}@Od=‘ÂÍÖÁ¼<¢ƒÖ`Œ ¬¾Ù¦¸úcä Éo¯Dî6Ó•FGNí9YH6«WÆßùø£¢¢˜?> ”””¸%§º:yÇŽìÛ· &––f¨0›Í‘ššÊM7ÝD[[UUU”––òÅ_°ÿ~ÌfóîmI’§¸¸˜™3g2nÜ8bccÙ¿?Û·ow;‘$‰––6lØ@RRùùù‰ÚÚÚxùå—))ùŽå-ãÌ“'ö7þ:4@Yâ/¿¹˜Ð îøÇ[µÙ¸gölF;z$‰Ú®.VVWó­[©êê"x1BÆy}V¾_h@%ð&Âð7ÙÀˆŠ}aå½/蟢+ßF„áïõ1Ö#òÌ_ÅÎâqEgg§:ÎÌû‡%ž'Õ8¿wž¹» eÕð¶  ‡)ßy^mtœH`‘,ˆñýÂX­Vzzz<®²äm?fçýÇe OÁ©¿ãMä¨ÐT Mîóhšq`0n|¬!Ë2wÞy'€ ±±±TWW³oß¾a{dY¦¸¸˜±cÇRZZJ]]&7]þ$I¢ººšÚÚZ ÈÌÌ$  ßyÖ‚iž3‹šóÎBC"ó­w‘vÒ¼p>¦£G Ù]Í®®åhÚXTßèÌ5M³ëvïÞMYY™ÛY÷llܸ‘ŠŠ ŠŠŠHHHp;³·X,3a ¹òÊ+éèèààÁƒ444ÐÜÜLGG‡ýï®®.û DTTÑÑѤ¤¤ǘ1cˆ‰‰±*ÑÏaFF‰‰‰TVVRQQá–\H’DCCMMMdee1nÜ8BCC]’™îîn>úè#Þÿ}½û*–,˜4hËÜàÖŸMtd(ËîømV+OÌ›ÇèÀ@vµ·óFEO”•qÐba:ðwàtFž¢ß ”/!È‹ aðPö‡ ¿/*öIˆJ}Ÿ#ºÿÙ„õ܉p˜¼ˆ÷á¸×$ïîê"@Çl,; WœD'ÔF•Â:Œ€£Á×?sgüEÁßË1ÆÃ±Þ„~áÕÆ p"€Xçô?瀦‰ØŽ>;òŒŒ¾‘ÄÅëêêB’${h@‡Ý õ÷èlÖÝ@û}€)S¦°téÒ~Ÿé5ô“““©¨¨ààÁƒ^³\úyŒŠŠ²«ìKKKinnv{Íl6[¶l¡²²Ò®0™Lh@sÞ8Z²3Ñd™¸o6ýÅFö/9‡ÚE IùøSBöÔ nüeÙ܃„äÁ ['w¹¹¹¤¥¥±}ûvÜõGŽaݺu$%%1qâDÃþŽûÑï=Ý;0vìX;sô<9ÎB½ Ž÷š+cDaa!cÇŽeûöíƒ+ÒõuuuäææÐ(ŠÂG}ÄsÏ=Çn>«–žLŸgÏdI檋æèoâšß>G—ÕJzx8/TTУ(œŽÈy?ð¾èê÷‹N„ØîiD:Ÿ X,Ò³¯JõìV#z(bÓuƒ>À³VÇÝÐÕÕկߋª‰n}  ¸ŸÌ¹z9Ãñ¹sî1à. àíäÓ‹ðÞl~h@’¤³ŒâÿúÉ–e«Õêi¬ºÀq¿®nç÷zz¢~ì®Y¥Ô»’D æ¦€mˆá‹áÀÏÏ;ï¼Ó0E¯¡ßÜÜLyy9f³yÈý<%''GMM Û¶m£§§Çp›’$ÑÕÕe×- _/!éHN¦é¼E4Ì;Ir­/åÒ=$7o%õßÿf÷u?¥Ù‹¬M m¦M›FVV%%% õ$œhhFŒÜöþŒhõv:¢bøFѯ·ã­DdlÛTÿ¼Ïî;îQöÝaìUû{Ü=Ê®€£PÀ`$À•ÀÀ[ »Ê£NHðjÃnpÂY–sÝÅÿ¡ÏàʼnRCW}ôý»Š™Íf»ÁÒ?s$zÜ\ê5ú²C.+šæ6 *Ç¿`qq1³fÍt¹˜˜N:é$jkk©¬¬t)ÚôªªÚ«ð%''³sçNví=ÅŒ¶)Ë2dõêÕô)Iì¹ð|4Y³ UCR5dƒz Še½óÉ/¾JÝWs$gh2UU‰ŒŒdÁ‚Ô××SRRâ¶À‡£> ¦¦†ÂÂBÒÒÒŽIÑ%o IñññýÚ'»#ߺ>à‹/¾ )) EQxøá‡™7+»o]JDÀІ?IâúkÎâ»u¬xu=÷c‡ø›¾/ìÖw#TöqÀ¯­xcÆÚWZBÄôw"úÇn+ôE6 qÓÇ} êêê²ÏôUUíßXõT\ÁÙ f4Ówß¶sàŽd;áà¯6n€…„Fñ'Üd2¡ªªWõñ½½ú¾ô]=ΟI’D[[›[7’¾ž$éUtÁÓô›Õõ³¥ïãxcÉ’%„……y´¬$IŒ;–„„vïÞM}}½Ga]Ua¤$t1*¤¿AVU•àà`&MšdWÙïÛ·Ïí6%I¢ªªŠ½{÷RXXHVV–¨ÐJÐ4Q^Ø6*ÉEHE3ÉÈ+ËW½êSöüáfêgNëW4HRUB¤#9É£°€þ[’’’HHH ¢¢‚;v ªèîîæ›o¾a÷îÝ“âKÞÂd2‘MRRìÞ½{PÏÂæÍ›Y¹r%é)£Yñè2ÆD‡«u¯d±ñ£sOâùW×ó5#‡”!ÊçÞƒHë+@€B ßÄ÷A$ˆwÛ¾}âãnD”áÀó¦®ñ=yÆ]Ñ´=”jOCF)Î0 il6!!Þ5>|ø°§‹¦zµa78QÀBýdÅÿõÎcz76OáíEÐáÌð\Å|dY¦££«Õj?>GbàêÛ®N^õ8–qìg¨îÛᢸ¸Øë™|@@ùùùöúíí톱|MƒU_Db2E°ì²úB|ýŒˆˆ`Μ9dggSRRBKK‹á6õ¸wII {ö졨¨¨¯~Ð8k:ɉ˜ësË2aõÞu?²¬QvÿÎÎìoä%‰1;v’sÿ#4\°˜º§Ðé±>@’${þü¶mÛØ»wï Ä®¹¹™Ï>ûŒääd Õkhšf¯––FYY™aIíÖÖVV­ZÅè¨Q|´â$ÅE¹Vü{‰Ù3ò˜0.‰;+ös'nÜߊ0Ä/ fáVà4à,„„;ßÄ÷AþvD@ÿyì]ùš³ý§éŸÊ7wj±Xú‰ù4­·1}TFÐ ³£7·Ÿ˜ÐÉ`;G æp&úò^ý^/€ 1öµ=Q@–Qü_‡îï„qC%Žû5Šÿ+ŠB{{û€£û__Nü ÔWÈh`ÿ>ÜÿÀ…}ÿ»óŽªJßø÷Þi™ôÞ+„JBé@Dq-뺶]uÝ]]ËÚÖ]]ײºÅú[ÛªØÁˆRTJPZ5ž^H&eÚ½¿?nîd’L…@Â>|æC29÷Ü2gÎyÏû>ï󄆆2mÚ4ª««9tèPŸ’ÎuzJªõ\·¸A€ºFmíZÒ“{’Õg˜˜˜HLL eeeìÚµ ‹Åâ– e›7o&11‘ñãÇ Z--é=û×hˆ:T@ÖSÏÑ‘žÂþßßLgdDŸ…]´XHçcÐëHúä+b¿ßFéÏ.¥zÊ$…PèÃ]’$ çœs#FŒ`çÎÔ××»ÄÔ1TVVFUU•ƒp²<ý‰ððpÎ=÷\—å“M&ëׯG@æ“WïfÄÐÄ~YüŒ‚Àoo¸[ï<`j¿ôÚhCYøÿ |‹²È_ÌGQìèŸø>]}5¢T|GÞ^Šà%àD?œÆg|Ð™Íæ‹«ê1•Õ0€;8¤€½yÜý­7œ õwO!€“Ywü€ByÓï“ôÂ`1Œ€c±pÅþw®=îÏÎX¯×£×ëýÖÔwûw¶ ÛÛÛ±Ùlh4š>–¦3Q¹^… K2²Ð¥ ²ZÝÜ'nÀ`G||<ÑÑÑQRRÒcç^Û€N ‰ñm4žÐñöªxZ5¥¥¥ìÞ½›¶¶6:½ùÎÌÿ‚ $&&KII û÷ï§¹¹™M›6ÑÒÒª×îâ¼é£ÀÚcX–™?s,Qä Ib2ƒCÖ·…Ñ7Já p J¡¡DºüþŠñW£æùÅíix E¼gàµÃû V«µ û÷1{Ám-Üþ*z{zÿîÊ ÐÏ¥€]!Éï¸À`1&C÷Bën‡¯>x_˧ªP ù W¸«@kk«[ s?vÉŽ v½<ŠÌ¥ëÁ7.ßþ@ï´Áºº:DQÃîƒÁd$Z2ÚùÏ{ÉTÖk;ÔŒ1ÀNk›–GÂÈÎjÆÐsñe½^ïªUÝéž<†£GRXXÈØ±c6lz½M{A”ÜökŠ/\€h±¸ÜÉ45“òÆJd]†–°0Üð ¢'M@ßjÂn4€$+œQ@ðÁk£…©©©$''SPP@~~>‹Å£!ÐÑÑá¨/0XøZ­–ÌÌL‚‚‚xê©§¨««åÝÿû—œ?±ÿ.d¤ÅqÃU³xç½Mü ¥@ú@¡e§ÿÊ¢‹’¿J|_¢ÿvû Äõ?¥GÞÞvFÿGýt*O8ã­· ÔP3ÜW‚U³_z®\ý®vï®Bþr΀ì÷ \`°ÔÔÜÛ ˲CmÏSE6Wˆ‹‹óËPÏé|nçŸeYÆd29v¦½Sõ›Õ†Ðõµ¿.÷?²ûª†èo’““C}}=ùû 8Zn`ÆøV|’HB´•–v‘‰£MØl"Ÿ|˾B#¡!6²†õõbªŸEhh(3gÎdĈüøã477{äȲ̞={zÔ8tõÈv;¢›¬YÉXó Ú¦zêÏŸCúËoÿÝŠ/½˜ºq£’`×â¿'ãñãTÌ>kPÏa€Q£F‘žžN^^ÅÅÅ.Ã&Î÷¢òRRR3f aaajttt°iÓ&<Ès\˲ó'+Ïå4@´Ù¹zÉt^{oߣø9Ó(@cÿ;Ð Œ~‹’–h ÝüªRÏ'(y{²BØØuúÍýt*_pÆ'#• ò{ºÉ^<‚{€óßûwè½ùSßs·û—$‰ˆÞ\#àg`¦ß'pÁàAè¡%ª>T»ÝŽÍfsü¬Zu'NøÞŠ‹ó_Ô•ÛÈÙj4™L.½®,M»ÝîâRsÿeœ¬Yw€³Üà Aˆ‰‰!8l<'Ú4ü°;Q9wRf‘èˆNÖo‰aב@~¹¸Îåâï õùÆÆÆ²hÑ"¦OŸî0ÝA£ÑÐÞÞÎwß}ǦM›¨«©q\[ß †ˆâRâ>øœêë®fßÝ·‘÷÷¿` 0’þÖÊîf²Lú¦ïñבñìëŒzímd?Ýóv»½^ÏôéÓ¹à‚ ˆ÷Ø^5hJKKùú믺 ý!Ñì/¬V+kÖ¬á7Þà‘;–rÃÕó0èNovþÔ)£ÈÊLàï(4÷3+°e¡<„²àÿ xe6ÖÓÛdØÙužßßB§¬èøL.D1Îä10›Ýi>•s¦c#媠·×½çto¡ç¹ÜÝ®ßùå‹<¶3Ìf³¿¢oY~À ‹ ÇutÇÍ{Zi'눉‰ñ«½«ó€hkkëá©èpîG=^)ÿ‹2p»vGª5ëÖ0@Àé\HŽ[$À¯¯ìä‡\=©q aãÎ`®]TOΨÚ;5hDƒÞó3PŸ÷СCIKKãÀìÛ·ÏcX@«ÕRWWÇúõëÉÌÌdôèÑ}eleˆ8R€ØÙLèöDϦ>k$-÷üý‰HZ-ÚN3Ã>ÿ’„×ߥê†kˆüv3æ”$Nv®Tùóçϧ¼¼ÜQ_À“7Àn·÷á8óeN'$IbÆ ,_¾œ?Üx>¿ýõB‚Nó⤹û¶%Üt×+ä£,ħ &`7ð°e¢ZŠÂêA×Wšþ[í(~ýP$‚QùÂ~:ÍÉàŒêæOEÐÿW~v ¡;õ\Ïç½C¾ðz{Ü…ìv»ßJ÷F¨¿¸Â`0FºzS5ÔCE‡€3ëØDGGŸÔ…¹úív»ƒ´ÕÛCર‹ú7%@ñ* Ëšu§àqŸ¥ˆ‰Ò2k’‡ïŠ&&:×TS¢’ÜP®¾ ‘œ¬¬ÞÇ–½Aõ2 gœ`Jv¢(#I»÷G0nT3z]Ïg&Ë Q4''‡ÌÌLvîÜIii©G=nQ9v옣Ìmff&F£Qù¼(¾`>µ9c¾jÙ¿ÿ# - èšŸÑM`]=Y¯¿Eèæ\Šþt75#†“ðÆû´¦¥ œ‚û[÷ÉÉÉ$$$PPPà±j"¸×Pû;]ÈÍÍå¹çžcáì±Ü÷»¥Dž¡ÄßÉôÑŒâ¾ì® I’ˆŒŒdéÒ¥±}ûöc¨74 mmmlÙ²…„„ÆŽKLLŒcQ7l8ücU 9÷=€¦CæÐTUMÚïƒM®7Ðídl ÐÐDâî½Ä¯^‹-ÔÈá›EKšïÜu•0uêT233Ù³gUUU½²¬èTVV2räHFŒѯúEEE<úè£D†êùìõ{HŽ:%•?Ÿ`20K#"Ëæ&ðìÇe¬n=…®eàðŠrN ÜŒp ÿˆ} Lº¥(†×q[‰ÇŽB/H·¿3d2²Z,’‡…Z…€€]ê+äÊà*öï ®<®¼Ãêÿþ¦éú#oï„‘À®“9PÅ`0|ÒœU¼ ~‡´Z­W‚Xo¸"ÿY,‡êŸÚŸ§4@õºw j¢(()€ŽË‹ðë>û ý±klhh <<Üc®~t¤†?ÍÖ•ÞÙ¡ÅÔ)òú#Á”•6òÂcihÑmæ§¼êš5üæJEüJVÈ÷^a·ÛIOOw(æååy¼&FCMM 555 2„¬¬,‡ Ÿ=Ј)3ƒ_z ÚzGC°Ù©šCÎãÿ{¶@#º¶6âŽûÝVÂÖ~GçØLôÅÇÑ$ÇÐ ‚@`u5m }uÜ@åÌ;—ÊÊJöîÝKSS“ljÆn·³ÿ~ŠŠŠÈÉÉ!55õ”ë Ô××óØcqâD3¾÷ #³Ò ã¤&/ïíÐ^m…ÐQ² (÷rŒ¬‡çØm¿¢jÆ9>ÐêøJJJ">>ž£GràÀ:::§¤¢Ž™3Æ0,>²â‰]‰o–fh-„ö":èŽTö´øŒ: ·]–ÎuOìg/¾çEµ¡TÇ{ø…½¿¸¥¯š~×__?%•ïK"¡ìýÙwÑÿj~§‚‰Gªé|’¤„JÝÿžža÷F«§GÖÓËz½ÏÑûC` 5hNRöÝ¿8ƒ À¯yCÂÂÃèèèðÙµo0ˆaöìóHÏHãŸO?ãõçA¡r,‹GÍõ=çAç°6QÝHvì’ˆ¡Ë¥ˆZ¸¹ Ÿîo°aË–-?~œãÇsøðafϞͼyó¼c´GÿÍûŸ6óÜ&Rƒxôî¶½Vfø¬ø$‘°;³ÚØôS(M­Οᛆ¶êNŸ;w.µµµlݺ•––²Â6›={ö8„„RSSûÄâ ¦vä` m£†¡íì¤#5ca)È2žÑÿ÷-çÏâxÎXD«Œw?D ¦%s¨ò kµhÌfì:OuÜ5ŠÔÔT:ä(ÐãÉ{ÓÐÐÀÆIKKcìØ±„„„øl´··³|ùröíÛ×õ,%Ö}—ϺïòIKŠdÅngîøa'—ÿ/`k‡¶ ÅÅo­§{Zð0=È2çMˆÆ Ya•¼ Àz¿útû.@©Èý»ã·¡,üÿE)Á'jµ\ÿË_²qãFJJJ<þJ ¡Á„™Œl¶žY’|ðt×ðFìý³?€Þý‰¢Àm¿»…°°0ŒFÿ¤€OÒðkóì ƒè—˜×=÷ÞETT¤_¤ ƒÁà(É{þ ¸÷þ{|:ÎyÐX­V¯¤³ÁÐ;6$8ÞW-Y©‹Ð"9Òûœßç;ì_œJ ¡¡/¾øÂa™ÍfÖ­[Çã?ÎæÍ›=–“ˆ×pÛQ|òJ"Ïý5ŽòJX¿]÷SׇM‚«U3}|#s&·²ó`v»ª²è¬V+,]º”3fxu‹«ü€­[·²qãFjkk{ÈUwD†³ý©§¨˜>sXûn¿{Cq S®»}QE/DEwî&tÛ.Ê~v)ÖÀ@’ÚÍøg_dÂãO½ÿ€rBŸ¿Ýn' €I“&qÁ””äÓ‚^ZZÊÚµkÉÏÏ÷I?Àb±ðÁ°nÝ:×ýU6ríÍϰó@)h}u} ].þãPóT| ÛÁÚˆ?ÓRz¼‘ß-MæÜË‹PS?*ûPêã^‹âGí¯…_:Q³··{ôzþõÌ38p€©S§z[ükPˆ'å>€ÝfëNìZø½òÁ.èíꇞ º«€§9Ý]ìß`Ðó×Çæœs§##û]¨££ƒðp¿ÕO9çv0> ÜpÓuÌ›?DZ°ø £ÑHG{·Á0Á\®ºú ·í{ð²,;b4®\FžÜIÝV¥RþW’z·ÀCªÖYe™uëÖõ1ÎÔ’Éï¾û.ÿøÇ?ÈÏÏ÷ÊÇÐj² Å*3uœž‹æÇp¸$„ÙSt¤$ê$‰ñcš¸fq-í¾ÜË«$±97šŽNß¾6›ôôt®¸â Fíõš4 uuulذíÛ·÷ðHz=írBݸ1¼ów²É``Ø^'ðxi¯¿ hHXû 3/»Ž=‰¾ªŽS§b òðQ‚ïfJú»ÝNxx8³fÍböìÙDDDx½»ÝN~~>ëÖ­£¨¨ÈáUpõŒÖ¬YÃ{ï½ç±¿ã5'XxÍì+¨ÑA¡²ø›¡q7T|µß@G ;bû~Á.sÉœ:€M½þ´EH' e!žF ¬/Dá ô'±¯%´p=Jæ@Kl,¯½þ:¥¥¥üáJùöýë_ÞºZŽC`Pa`<v»Ó®¿g&€»KR Ùžvù®}wp^ô³ÒÔÀýþ‘””d@Ù`øk´··óø“ó·Û0¿NâƒÁð‰ÈÎâ‹"Š"z½Þo wžå¥—]âñCrå6rçNr5°œÿw5’¤îWwq‹Áå8Y”••±yóf;ÊÒÒR^|ñE^~ùeÊËËݶS1)'åOÇ£Ó Ì˜ÀÁB-¡‘c1™3Ði5D‡wòášxv dìð Ë ¼µ*Iòm­.”&Là²Ë.#99Ùãâ©Þ[QQëׯgß¾}n«&çæb4²ç¹Ç)ºé’ö  ¤’¶Ñ™ˆz-–¸¶|´‚Ÿ|˜£- %)¤-ÛÉ~ä ôþÉ‚öà,X°€)S¦88 žîE­/°aÃjkk{Ü£$IlÙ²…W^yÅ'ÏB]£‰%×þücÇé¯ÀÞ -Gàø8þ´î©„Sš4"œ™cCyhF‘Èû0 x˜Â ZŽ·? A -|\üH™4‰•+Wrøðan¼ñFâãã±X,¼ñÆxên?JßÁˆñØmÊ|é$Ôíp}Œ€"£îngïÍ8ð´™sõºî†_–žæh×ÞÖN@€š&S+Ægrßôç°ÿ À§@þÍ·ÜDHˆÂó 4bµú^ôJ¯×“ŸÔ㘈Ènùͯ<§€ž©Ü¿Ü-þ’,u1‹º²SL‹.—–ËóŸîÔ*78Ù@pp0³gÏö˜r¦Zç»wïæÉ'Ÿäã?öšÖ©^ÎÒ…aL«çÚ»yì%&ëh̶D•¸îâ¦oä¢Yõ*  ²Ö@eU %¾ñdl6Ìž=› .¸Àk|\E¬V+ûöícýúõ!ËNi†²Ì‘E ÙýÌã4 J{BÇuÛ¾wÀù}u’up†$):‚¬f(é,vI@‡Uë 'I 0DEEqÕUW1yòdÖ®]Ë<V«•uëÖ‘››Ë’%K˜:uªÇ/Nx¨È½¿æêeVôz˜H-ï}ª!=©•1#µ˜L2V«QPÖ˜×GQR­ç×—Õ’×IXˆ÷…Ìf³Í’%K(,,d×®]«ô‰¢ˆÉdbÛ¶m;vŒììlâââ”· Ð’‘Ž ËD”•!XM”.>I§Ån4"X,h,$½ÂåÑX¬èëª1MÍAÒi­6e†úõ£‡Ó4Ìwƒ_åL˜0!C†°oß>ÊÊʼæ'—––R^^Npp0ÿýïOF¡ŒM¹Ô~OphØÛé^ìO“Ä´,3,1 8Šâî?—nÑžþdóËÀq”ìU€øå/É/~ñ æÌ™ãÒ…{âÄ ^|ñEoÏrŠÖÿ`Å€’2ÀŽ*žt< õÞ°y 8ÿ­wàÒË–ôPmmi%,ÔÿuY5²µZ-W^õ3òöúúŸÈðZL=3s(qñÝ}  ~Ô`Å Ðr¢§Þrjj qqqÔt…QáÑ-ïdôL@Ÿ Ö‘:"t²¢( ’(zŒó»“>Ý8 F£aøðᤥ¥‘——Ǻuë(++ó(\sâÄ Þ~ûm6mÚIJeËÈÊÊò¸P¥$vᆦ¨¬5!²-u|¾ÑFfr'õ + I2³vK•u:‚øhï¡#õ‹>dÈRSSÙ¿?ì¹ÃïQ©««s°ìGíÐ@–)Ÿ2™š·W` F$:"íh;;±+ßccMb{'ÍC2ì‚ÝΘ×ß&öƒOž;‹÷Þ‰ä3ÉN$)¥Ig̘AUUûöí£¾¾Þc mSS+W®ô[q³ûœvšê (˜Ó¶è;Á.Áæ½J)Õ£ìömôŸbŸ€²ý-FÑè_ßÕ÷-·Ü 7ÜÀäÉ“=Ž×µkײråJ·G‰\<†¢„;þÚD{‡†)£¸ôÂVžz%‚¹ÚY<¯Šº&=O¼–Âʯb‰ ³3q´‰¬aÞ7õsž0a™™™ìÚµ‹ÊÊJ·†€šZTTDee%ÇgĈÝú¡ÝR5B{'‚$ahi¥#: °ÊãV™éièMmd½ö&Ñ«×Sù«ë9|Õ2Å­áC,¾7Ô±˜””D\\%%%ìÛ·ööö> Wgg'ëׯ?éÅ_9´¶XNúxQÕdæ¿ë*˜ ¥ÿèóÊBøE¹O«Óqçwpýõ×3jÔ(¯•òòrž}öYo§zÈí‡K> ,»#kJÝ@©"?nÑ‹è-þß»­+¨›ç´ï”Ô"ºÖPæ 6€À@ÿR¡§™¸ìqìݳ×Ûaþí‚]`0^ƒ›Îå|eYÆdò»r’r"QÄÔÖæ0€ž_à z©”ÁªÆ¥ddÉŽ,H‚äѱæN h0Áf—yùݾÏíàéû,ø袋ÈÎÎfãÆäææÒÙÙéqݵkûöícþüù,X°€ÐP÷Æž^'põeáÌŸB[‡DB¬–÷?  µÝÄÒ‹N Û%ö C`bV;'L^ù4–»¯µ’šè[*©Íf#009sæP]]ÍO?ýäјQùùùù”””0vìXÒÒÒºÓ e™ÊéSŸxÙ¬Ä,5"¡ÕÕ˜b°êuŒ}õ ÂÖÿ@áý·S2¶ÒñI,þÎP šÌÌL’’’8|ø0‡vdX,Ö¯_ï·Ô¶+4°(Ù§{ k¾ßÓÀ‘òN~MÿøUÀÝ(;þ(á­¿Þq?ÿùÏÉÈÈðIêÕn·óÞ{ï±cÇOÍ g Ö Œ@%J=¹S¾„zs·÷!Ë2»vïf\ε=û®î;áõ¶ ]ý]ÝM©»'5î=Ð!€.KV–$Å ‚ »—=²**ÍD†Š$'é9tÔÌ]k 0@`úä`‚{ö£Ñh1biiiìÝ»—¯¿þšòòra“ÉÄ›o¾ÉƹüòË5j”Çë3è>\žˆÝ®¬«Ÿ|¥cH2,[DmM3ßíˆ$1ÚJBl'Ÿ}Ƕ}Á vÍ8Áäq͈¢wYa€¡C‡:ê >|Ø£ Ÿ Ô×׳iÓ&RRR7n¡¡¡=Æ—`³NCð®<Ú'e“÷ø#œHNì»ë?É0€«ûe™°°0Î9çrss9vìØ)÷«¢º¾óôÓÆ8PjbÝŽ®æäóúÀ„’>ø>PŒ1‚·ÿô'.¾øbÂÃÃ=ï ¼üòËTUUyjöJ ¢³2I6{ _‹õôt·÷E 7z{Ô¹ÞbéæÒé´´µœÃj±ö˜?,¾¥¹Ÿ²‰}Vûöå÷ø=;'›Õ«¾`Ú´i}¬0w((( 8$£“F³,Ëä«êk.àn0¨^u08®8W~W Ë.I¢€(áA4eàB¾v Ölê༉:$»Ìïþ\Ç “̼i‚ŠÊ¬¼÷q3×]FJRw¸* €iÓ¦1jÔ(¿øÿþ÷¿™4i—\r .Û‚@2)‰-bì˜d66E°çh·þ¬†m»#ÙšÌ/סÓÙY±*ŽøØNÒ| H’„V«eüøñ :”Ý»wSQQáöù©ã¤¤¤„ªª*†ÎÈ‘#1 C`߯n$jÖLÚ£c舌è³ÐËZ-¡Ç iMKSÆ—]/†‚Ýnç³Ï>㫯¾òé¾}…Âo•O¯@'òé¦ã˜Íçâÿ ¥joPÒùÚI“&±üᇙ;wîIÅrUlÞ¼™×_÷X˧Eño0éý{Âyì͇ÀÛ¸v*ìÎåïŠà©_W€²Ò²¿GEE‘·ç{ÆŒƒ¿hljèñ{i¯¾Oƒ€W-8F­“`ô˜, |üñÇ}¬0WhjjâÃ?`æy3z¼_^^AuÕ©¥Ýö¶{ÿÞí‘U¨BòÀô÷zZà«ÐÙ)±ë€…ø=w<\Çù3 ˜1-æ;~ºžM?š1µ»¾•p×]w1kÖ,.~õºvíÚÅ#<ªU«hmõ\Ø ð»_EsÞô`šNØyá 3 Î12v  !8ÐζÝa%‚$›ýwßÙív‚‚‚õ"##=~n*?`ÿþý¬]»–¢¢"ǽ4 FGD¸ËÅ;´´œ‰·ÝÉèVÐÐàÚxkë‰Î?€ Ë^e…wìØÁòåËý¸cß0ad‚ã¶?PÙhæãÕŒ2¼¶î†(^®F) tÞ…òÝwß±uëV/^|J‹]]Ï?ÿ¼·TåP ž-8 Ü=ovkxæ¸ÚÙ{J ôjè@}åçïÇjíþŒ•ùK¢­Í?ŽZSSQ1‘=γ{׿ú8Yœ@~þ~ÇÏ¡¡!,»üRöåçñöÛoÓèA5­¬¬Œ—^~‰Q£G’‘‘Þ³Ï^žgxŠï»bŽz™d¹Kò‡«ûåÞò(À×/Ä#fšM2ï¯614UËâù!´¶IÄDkyæå Êl¼ðh £†yVÅRùwÜqcǺ×fP!I_~ù%=ôÛ¶móI""LÃo ç¶ëÂТé0‹üåw2s§µ²â³xj›´ÄE{®S°{¦v×N3»ÝN\\\pÓ¦Më±³wAhoo'77—o¿ý–ÚÚZ¯Õ-[S’(øÛ_Ûô#Soþ ‘÷m$É$ü¸“1>ÆØÿ{™Êãûlhhðø÷“Ax †¬aa`?,Qà§MW™YŠo™¥ï³À À{ ×Þx#¹¹¹¬^½šóÎ;½þ”‰Õ|òÉ'në&t¡ x EüçlÁ€¤$ÙUét§ùÒ+7ʃ°'/€//µ½Ýn§µÕDqqqSOœ<ܾ'tȲÌÖ­[6l¨ã½ââêëûÿ{é gEàõWß`ÊÔÉ5À±ãÆpée—°ê³/رc_|1Æ #,, Y–ijjb÷îÝìÙ»‡)S&rÁ… zô×ÔÔÌò—_óxNO¬PH€²$;„€¤.U+©ëïžvÛE¬¯÷­ºÞÑ"36›ÌÔqþrW4ßo31)KÏ'_¶òív3/<Ű!z˜Ñi†q?¹jµZ? //µk×RQQá1,ÐÞÞÎ믿Ά ¸òÊ+ÉÌÌôÈÎ>gŠ’ooµÉÌœh`s®‘s'…qõÂJ:;íÄF¹»UTYñyËæŠÌ™æúË©Ž—ÌÌLRRR8tèn¥‚U¨úÉÉÉäääêZJ’¨œ6™šœ1Då ixfß6¢@ñ… *« æ³µTÍžMk’ .A/^Ìœ9s(..¦¦¦†ââbÖ¬YƒÍf;) €‘é ‰óO Õ_HZ‘?(&E–ƒ÷íi>Š\ï@£ÓqÏ]wqå•W2nÜ8¿k·{BAA/¼ð‚·fÏ£džM8”ξ°ÛìNU¥®p€÷]»Ô‹î¥|} ¨Ç÷æwmýaÇw tEGGQXÎû=Ús(@–e6lÜÀèq£zž?îøÉãqý‰³Æ¨¯oà«/ÖrÕÏ»‹øL6…ÔÔ¾^÷ 7mdíºµÈ’„ Š zââbùÅ/¯&+kT¾dYfõgŸÓÑá~Ççm0x[ü{Gd¥0]MåÈÙJ—ç ÀŠ+˜7ožW7èð!:–Î3rçÍ‘D¾ÿÉÌþcVö³òÏ#="€;ÿRö½‚"3&éøÓ1Š´µKÜ÷xwý:œ!éÝ®÷€€¦NÚC?àĉSîÊÊÊxê©§˜2e —\r‰×ìVàñûbx÷“f^yßLFJ"÷þFKyéQL&SŸö² «6Äe㜠M^ŸŸ$Ièt:ÆÏ!CÈËË£¼¼¼‡aè u¼”••QUUÅÈ‘#5j:®A°Z±k´ÔN¯H»@`M-‘_o¦îªK¨ÏÑcñ—EQ 8½Ę1c±Ëë®»Ž††Ìf3­­­ìÙ³‡òòr6mÚÔƒìꋦÇb Ô€ù4°2ì+7ñÝžf®¢PÒöœ! l¯óPÊñê {øa.¹ä¯dÒ“ÅbaÅŠRˆ,[ŸMþ‘0—éùÝ•5èu’$xÍeò fæÌ™TWW³wï^êëëÝzÔôÇüü| ÉÎÎ&#C‰n÷ naÁngèk@£¥pÑÈ ²(`hn!yç.D³•†¡49¹{C§ÓOHHãÆ# ›ÍFKK GŽaïÞ½,_¾œÂÂBl6[Ÿê[ö5ñÖÚ F¦¤%%:€`½FYB$N=‹Á ²9·­$3‹žÂ?”ª|y(u €þï©§¸ð ÏótàÇä•W^ñÔÄ<ŠRFàlÀªÕ‘þç"þßç»ÑUØ_€;8oê\ûµWWðÀŸîëQ(g|6 lúî[d»@RR2¢(ÒÞÞNañ1’’˜3ofc, o½ñö ýöŸïëäñˆ?·ü°•!C3zX\ ÔˆŠŠ"&6†è˜hBBB\Zø7næé¿{.ÉCFF†#Üà ê"/xpå˲L[[………X¬BCC 0 ˆb÷q€©­ï® êxMÞwœý Y–),,déÒ¥žÕ&ÕÛ¶XeŒ‰ Î dñ‚::$î{²ÙSô¼ü~+)1ûÚÈLÓ£åkà×˹`ŽçgÂèÑ£1bÍÍÍÔÕyŸ;9¶mÛ&..Îc‰M(8îABCCùïgì/Ð2<ÝD‡YÃò•nfæ”F^û8‰M;"°šuÄÇv¢Ó*Bs‹I¿;C–e‚ƒƒ2d¡¡¡455a6›=†7l6TVVîµ8Q×ÄéÈ‘#‰Åf·a³Ú°X­X­–>›çïF{{;¡Áa¤¤¤8\ëîÔÿìv;V«Õㆯ¥¥…ââb·¡ÑŠòJ¬6+ã²Çö'IOO#-#Q+ ÐÃØqcHJJì1/ÙívÞûïJ>_ý¥¿è¯þàŒ³ÊÊùÈ_þÆu7\Ëâ‹æ›$pSc«W}áuçžE€Ô÷=ê{®Úw[ ŠÛUõÈ‚€ Hž˜Ò(¸uëVÞ|óMîºë.ŸÚ‰ÜxM¤c=é4ËXl°ä‚`îý­>kæP‘•œ1|üÅ ÌføÙ%á´´J´¶) ~îÂä*? 55•üü|Ö¬Yã•ÐÚÚÊŠ+ؼy3—_~9Æ óI½ =IËò-A\8g,¹{i2‰üfV=Qföäfö áÕ’¸íê ´™í{ÂÉÝÄŸn.C¯ëkÁ«»ˆ!C†˜˜ÈáÇ9räV«Õãu555ñí·ß’’’BNN!!!n‹Di::òþGtÏ dÖ @QLÙ—¶¾Ÿ–?Gkj2É?lgøÏR;~-©=•ËÔ±=a‚‚Ü׉ŒŒäÆodΜ9ŽÒ·C‡*^…ŽŽÚÚÚ0™LTWWÓØØÈ[kx¹£Q@€œ¡ K bÉŒ8’bŒÄÇIŽ2¨´"ØÜ¨d Ûö5RÝdãV (¶ïõÀ”)Sxþþû™3gÎIåðŸ Ö®]ËÇ쩉ª÷ï[žéàÃz”Ø¿B˜–zì{3ù….cÒÙ#Û»;-Oðf|üá§È’Ìϯ¹ŠÐž›AzH÷†ÉÔÆ‡+?båûz<ÇéÀYg¨xëwøôãϸå77“•5’¤ä¤> ‚,Ë”—•³ÿA^þÏr:;=³¼{ëîCwvõ~yê§{ð‰¢²€è[+¤Üwß}œ{î¹L:ÕçcÔ *BÃM? æ…Í\8;½Aç¯Ä#Iðê‡mÕrïM:::ƒøÇëñh42ÓsZšÖFîÁšNè0›u Mí gT :‹¿3$IB¯×“““CFFû÷ï§´´Ô-?pð***ÈÊÊrÍÒ¶l'8w‡ŸxkH0È2‚$)d|YÄ‚¬ÕR7fÃD‘ æfNd¤¢éèD´Ø° 1˜8~¼ÇÅß<ðÀìÞ½›7ß|“É„ÑhÄh4Mzz:’$a³Ùhmm¥©©‰––ÊÊÊ(o–ùäûCØl6ƒ45\:3–ái!ŒJjT!zÂÃtŽŒ‹Mâ­5å$ÑÀKÀ§(B>K–,á–[naÞ¼y~—c=TVVòÜsÏy[D–>•x¤€c±vA”û*$¹[ úz\e¸ƒ¯¡ØO>þŒ}ûò¹õ¶›=z4¢—4XY–9tð0Ë_yƒ†: ÌÎ^è—U.&6†ñrˆŠRò)ëêêÙ³kïI¥99’¹sçz”þÔh4Ž—(Š=^Îymm-6l ½£¤¤DÂÃÃÑhµh»ŽChjlt9Èvþ´‹â¢¿¯¿?‘““ÃW_}å· *(Þå-;Úø~G; Ñ®XÎÓ/6°û ™ü9†[ï¯ã¢ó¸ú²0>[ÓÂþ#V^y:_HÙ²,S]]͆ زe‹O¥“EQdáÂ…Ìž=Û'©Ò +:@t¤†+n­")ÆNRL# ¢ºQÇðÔN~uùqþó^2²,pÓå•Ȳ@x¨÷²Ã*A ¦¦†¼¼<ŸReYÆh4:d|mG)»vQ6y vƒY«ÁX]‡¤×2åî?a‰‹¡nÉB¢~ØFØ×?ðã›/v´Œ—W i·Ð|ÞT4¾Ÿðé¾|Î0›Ílܸ‘•+W¢Óé<Z²,ÓÚÚJ\\ÙÙÙ=z”cÇŽ±mÛ6jjjPÕ3'd“š`dé¹q¤'Ñaµ³èž]È’ŒˆâK¿þúë¹îºë˜5kV¿û¼A’$ž~úixàOÍŽ硤ÿ­¸ E(ñŒbñâEdÏÆb1ÓÙÙI{{íímNU<¬464›À¹çžKhh¨K€šËo±X°X,·ãdzqãFv‘vëã²Ç²ìòKILL >!ÞaZ,ª«ª9^UͪOW÷G¾ÿ) ø³ÖÐuµu¬_÷M¿ôåiG¯¢7Ðùؾ})ƒKQ”$I”@µ@ }>ÊâöÀÞ½{¹÷Þ{Y¾|¹ßâ(‚3§1sš²›Ü•×ΧßvðÒß"9p°£Qà¦_D©áÂ9ÁlÛÛH[»„(BmƒèH ¡Áî s \uÕULž<™µkײÿ~Ïi•’ÄçŸÎ?üÀ²eËÈÉÉñÈqHKV„‰¬6ˆŽˆ2pá‚t4ÚjÞ]£eñ¬Fö„RT¥çž_g÷þp>ÝÎý¿*'&Âê2в,Ǽyó())áàÁƒœ8q­! lÛ¶ƒ2uêTbbb°ÛíØŒFŠgô»¹|Öˆ(¶¾ý2#?_CDîO„|»¦y3Ìf2Ÿy‰–s§P=w™¡»ýNør5ÄÅx½öÞ0 \tÑEL›6Õ«W³qãF\~T¾…Édb÷îÝ,[¶Œûî»A(..æØ±c”””°aÃö°ú©ƒJv…VÄÞ•óû;îàšk®aÒ¤Ig|áW‘ŸŸÏK/½ä­ÙcœÝ‹? T` 'Ö¾ËyZùÝ.ÙJS×:.½‰‚®àm-p…}yùìËStfA (H™;ÛÚÚŒÜí g ðL@u]zªBçLtGTcÑEÅEØí6B‚ƒ1è ˆ¢€@×1‚R‚U¦¯ øxÅqš›^)4??Ÿ€€Î=÷\Ÿã讠׋$ÇÀüY¡|ó]f3\uI(‚ÑQZ–^Le••ß inn&66ƒÁÐcrƒÅJÊkïb‹¢&'›ðâ •U¸ë6ª«‰^ÿ=ûøQ—]BÄ‚ùðï‘gLE8¶¼Ñh$''‡œœŠ‹‹ihhpkЈ¢ˆÝngÏž=:tˆ¸¸8ÆŒøqã8çœs¸öÚk¹âŠ+¸þúëY´hqñ ,Z´ˆçž{Žk¯½–¤¤¾¡¿3…ŽŽ}ôQ6mÚä©ÙFà/œ]¢?® \v¦Oš9t(q qØì6¬6V‹«ÕÚƒ[å±vÓÙÑI 1¤¤d‡Ú;íÏÙà-þßÒÒBIIÉ)‰fY,V,ß=ƒ~à”H€ƒÁx˜ÁŠp ::ÚkxÏPÝœÅÅÅ])aA úîãdNs§Ëã++sb›6m"##ƒÑ£GŸ´pJ QdÌ(#Z@ QàÍOLè52w Šî{¼ŽØ( /=ÇøÑ:þôÏ&Ì0ªœÓÝ\¯ÓéHNNfâĉSVV†Õêþ 'MMMlÛ¶††‹ÝÝb`7ÚÈäœN4ÙøõµQü¸7í{íÜ|E=_AS‹–»®«`æ„6ìˆÀdÒÓÙ©E£ ïÄoY–Ñh4ÄÇÇ“œœŒÍf£©©Éq½î ¦çI’Dttt·1#Éôt¤¤¿ú)ï|ŠÆÜÉáûÿ@Sæ»Dü7ß1ÑS¦À±"„WÞBXx>¤$Ã7·åB[;BL èüsFDD0{ölÉËËóX0I£Ñ`2™Ø¶mÄÅÅŠ(Š„„„˰aÃ8ÿüó™1cqqq¶ð«Ø¸q#>ø §ôÔNàz”’¿g;r€KÏôI3† !>>›Maë[­Åp¸ÿûz];:;1’””äÒp®h³Ù¼†ûÃ8Mù0bI«_ çÿßWœÉ¤ÈEÚ%;ÁAÁèõzDAt¤? €ÙbvI«¬¬4À·ß~Kff&£G>åÉ7>VÇ´l=«×·q¨ÐÆèázÚÚì¼þ¡‰¿?ÃÐ41‘Z>ü² Y:JÊ-<òzæ„Aï¡ ÁÀСCÉÉÉÁn·SQQáÑå&lݺ«ÕJ||¼Ç°@pȼ™Aèt"?ßÄM? &33þkã—‹ÉHn£º.ö„`ÐI´˜´|º1ŠáiD„ù¶e™€€RRRˆ§­­––¯Þ—ÚÚZ¥èUp0‘‘‘Ê} p"%™Ê‹. fÁ,J.»S|I›· ²t1AwüžaÅ{Œ|çïá¡Gþü–"¼ø2rGÂÌøDÐè…¤¤$æÍ›‡V«eß¾}žÓ25jkkùî»ï0›ÍÄÄÄô1ÌzáE-óž{î¡  ÀS³×º^#éÙ¿ #ƒ„ø8ìv6›µËPÓö$GøT¦+ŒŠ@gGF1=6›Í«@ÝÄ RàÑSé`0ž«Àœa¨€'!ÀQ°·'À­­­—#uÑëu¢“ Ë•«öçŒÁä°Z­¬]»–¸¸8&NœxÊýÅÆè¸hn0—^Bj’ž’r+_lhç÷7„`È?ØÁÊ/ÛøÙ¢žy­™¼£6~ÜÝÁ±ÂNFd tÏPõFŽéU?@U·;rä»víÂh4ã±8‘N+pÙ† 5ðÀ“d&k¸ïöDÚ;,<ÿvI16nûyCSÛÙ²;ŒÔX;)]•eï5z "--ððpšššèììôhH’¤0ìËË‰ŽŽ&((HI£Òj±teH éÛwñÎGèÿúÂï†áþúùÎß@J2Âw#¿ôÂsO#ϘŽðÛ{áÜ)0ôäB:Ž‘#GrÞyçÑÔÔDqq±Ûç«~¯Ž;Fnn.†¸¸¸3Êì÷†wÞy‡çŸÞS“à:àÌ yœŒ–žé“ÉÈPB6U@Ñè“ÕPBªC ñ ºÍP‰€Þ “É4X=V~ÉIc0÷§W8ÜODEE‘‘‘á“àŠà “ɤ’DPP :ê¥r5X¬Gþµ3ŽWV €3¬V+_|ñaaaL˜0ÁãnÎ8?²Ð` [w´S\j¦ªÆÊ³¯·0ozá¡"ï}ÑΣw†1f Ͼي™À@ƒˆÁà> 0**ŠñãÇ“””Dee%&“Éc\½³³“Ý»wSXXHDDnCZ€A/0{z Ó&mdç>#«6X¹ûÆNô&öåP‰‘…ç5PSÀ§ßÄ’w(”Ð ™Èðî°pÓ Æ7ê~‚@dd$iii êëë=ºÓÕû8zô(­­­ÄÄÄ ×ë“edXi æ£Ý¾ù“O ï ¼ý¼º¡¦^{áwÀ HJDxïÈ ã³]žÓW2yòdÆŒÑ#G<EQÄf³‘——Ç #22ò”ÇÜ©âØ±cÜyçÞD©B©4ü¿‚ñÀ%gú¤ééiÄÅÇc·Ù±vylv»bÔʲ@îA˜î4›1èHHHp—{{Ô…ß µµu°À§ÒÁ`0n<ûÚÏ0¢¢¢| }þÞuZ[[)-)A’%{z@±ê>Àñ#6%¿ùæÉÊÊòZÆ×WæžHE¥™Ü=Î ä’‹B¹ïÉn¹2ˆk.À xã£VöXùaG'o~ÔÂÌ)F¢"Üe­Vëà„††RRRâUV¸±±‘íÛ·S__Oll¬[eIP¸ a¡ì’Ìÿ½ÙÌì)®ÿyh"yü%éc[ˆŠ°ñâÊDÆ í$!Ö̇ßD24ÙBD¨•N³ÈŸ%r° „ñY®K˲ŒV«%66–””ìv»£ ¦'C ¹¹™#GŽ ÑhFDVVº¨HX¶¢"áxül)Âí¿E„ÄäcG>û94>úaÕjä;žÖ}‚úØ›±±àç¢Åܹs‰ŽŽ&??ß'~ÀöíÛ)//'&&†°°°S"¤ž,l6O=õ«W¯öÔl7pྺÔÙ‡‰À’3}Òôô4âU€Ý†Åbq,ÚÎa‡ €¹ÓŒ^§#.Náõ¸bÿ;ÞXùƒØÐüãT: À¯Q4= T6¶7€sοê¶TV¡ žRä.@§Óõá8 AìA‡T<Íý{s¾áI Ÿ‹,Ë|ýõ×´µµ1iÒ¤SªŸîŒ@£ÈÄì@Í&{tï}ÒÌŽ<+OÞƒ1@äÍ÷9Zjgå‹ñ\¹$„¾4"3~¬gÉbP :” &`³Ù(//÷Ø^åäææb·Û‰‰‰ñxŸ¢ °p^0ã²Dxó}%Ç%žy$…WW TÕ d$X™>±‰êZ#’]ÃÔvóÍŽ0æNn!9Á»XU@@IIIÄÇÇÓÞÞî? ººšââb²²²HJJRÞÔéFB¸ð|„œl DøÏ+ȯ¾…ðâ¿‘ƒa[.Â?„8„Û á]ú E%ðû»à÷àòKÁËwÅA --¹sç¢Ñh8pà€G‚©Êزe mmmÄÅÅyýŽö7¶oßÎ}÷Ý×§þdàFÀcE ³“€‹ÏôISÓR‰‹Ãf·c³Y{]u%dµÖzÌf3:­žøøxÇøpUØ—@P<¥¥¥ƒÑ¨C©n}Ò À•@š×VgªÀ—ÉEõ¸›€ÕÁ#ËÆ@#:¾@i‰bO êxÍMb¼¢Y> ˆs×H’$rss9zô(&L **ªß.Ày38i¬žìÑFŠJ-üá±F¹=‚)Œ•Xxwµ‰«/ !8HüöÎ;>ª2}ûßs¦¥÷Þ=캲ØŠº¢Ëº»(¼bÙµëʪ(®uÑ]+EVP‘+¥Š jBÒÛ”L;ï'3sf2™LÈ40—Ÿ1dræœg2'Ïs=÷}Ý×Ͳ/Y³ÑHb‚HjŠ÷© ÄÅÅ1hÐ Š‹‹ýÒØl6~ùå¶mÛ†N§#--Ígßx­VI ¬Ą̂a:ŠúEóâ[zž¹/žøx ÿx;–šF gëÉHmeÑ—™d¦Z˜p¾l7ì/âââÈÏÏ'%%…úúzŒF£O"`±Xؼy3¿üò yyyÞmrív„‡ÿ†”š çžf3ÂòO‘þù ÂÙ Húég„iwËâ«wç#dg#ýô3”W ¨Tà§‹ ë÷¥¥¸¸˜³Ï>›ššŽ;ÖÎPËÇß[II ›7of̘1!Ó´´´ðÀ°uëV_‡-^àÔþ)6•™‰­-`±XڀΒ0£QkÉÌÌt‹xVt%¡à0¯;'ˆ0îA(áo\RG6ÀÍÍÍ>r ‰è˜Ôu»€#í ”‡¬¾¾Cv0ëüòË/|óÍ7ôîÝ›¾}ûT¥›­a`_’ϼRƒ ÁƒÓd¢ñÌ+5¤§ª¹abúk%UµvR“Dž{£‰!Er2;NM8ôÇ'//ÒÒÒNõF£‘mÛ¶qðàÁNõ¢ƒ‹¢8m@jÀî=FŒ&k&¤0z˜–ŒD‰ÓúÕràHëvÆqË„*’»à ¨|IIIôêÕ‹¨¨(¿ôuuu|ÿý÷455‘ŸŸï^õP猂—_B˜ù¶Hó_G¸æJ0›‘>Z„pãM0q"ƒðÖ{HoÏCxä~¤#¥/¾7ß1§e¼!--qãÆ‘ššÊîÝ»½"ÅÄÄpÇw„l÷_^^ÎôéÓ)++óuØsÈ­ NEŒ®õEóóóÉÌÊtŠe{v›;2 @Q`n5£R«ÉHÏpê¸kböüfŽ5séùq({uèt:úõëLj#°X,~ù;vŒM›6a6›ÉÈÈð©HLP1áâx.ÃÍW%’¬bó¶V.=?ŽKƧ’Ÿ—…Z­F’$Ìf‹Ó>º³hŠcŒQQQdee1xð`ÆŽ˰aè­­¥¬¬Ì'³ÛíìÚµ‹M›6‘ššê2ØÑj23 >ŽW!Ýÿ¼÷>¼þ µWF7ÃÔH/ÏB¸ã÷™³_Fºþ„œl¨k@ª®Aˆ‹ƒNš£(!Š"½zõbܸq¨T*öïßïü}H’ĤI“0`€ßçë.æÌ™Ã{ï½çëCÈe§’ðO‰°€¼ü\223Ú|¬N@»Bü'—HN_µJMzZº[À›`W€CtAøø¾;'ˆ0 ¸8܃P"55•8,Q IDAT‚‚‚N €ãæñ4ò¬8zô(v¢£¢Q«UÙï/€ÊÊJêëÂRFü°Yñ} ° (úwöâ;v°jÕ*ìv»_å”]…(Àèá1Œ+›ý´Ë„J„É“R}fõµ®¸$Œ4×ÂWZnåo/ס7Ùù¿Ëb¼ŠeÏîXLqq1555>Y¿R°sçN4³äÎûñ2ˆ‰9ViåæU î¯fø´Z-)))ÄÄe±ð?Ñä¥Ó·0•J…Z­vk:¥ÕF¡ÖÄ’ššD^^………ôë×ôôt¢¢¢¤¤$†NŸ>}8|øp§ýŒF#›6m¢¤¤„üü|W³¤²c0ázˆ×Á›¯#ŒS˜ýkìß‹ðÚ+à ?k×",YŽpבJ"\zÂ+¯#í܉0pdftþ+ Óé(..fĈÔÕÕQ^^Nnn.7ÝtÓ ;Rv;wîdÆŒ455ù:ìÏÈ!ÙS#ß„ú¢ùy2°Z­Î‡Ý.ÉÝqßÉ›[ͨTjÒRÓˆwÛý{vô—=z4R ÀÝ9A$€bÂP^â þè|‡æ »»©Ô®€# çliGŽWVQW–›îKÜ È‘€O8d_pŸµuuu¬\¹’ 6’’B~~¾Oá܉@­–Wýûhxóý&Þ[ÖÌòÿxpz EýÜû¼ñn=ŽZÉÉPsɸzÈcÙ±ÛÄS/ÕÐ+Wí$ }Àˆ#ÈËËãèÑ£ †Ç!Š"ƒíÛ·SRRBRR’O}@b¼Š+/‰¡¨_Q ƒ¦f;›·šø÷"+¢Ï„K{Ó« ¼¼<ùw•òU±¼½4ŠÊªx† J%7'Îë}¨R©ÈÎÎfôèÑ$$$°wïÞNõ555|ÿý÷èõzróòˆNK…ÓOC¸ù&„Þ…®ƒm6¤Wç@^>Âm·È즶¦ÝƒP\S&#äåBL,Òä›`ûO3g!]v‰Yè"âãã5j”³Š##£ëç8´¶¶òøãóý÷>7Zß"šEN——Àca yùy¤gÈÍ®\Àö‹¸¼ŽË¿þÖV3*QMjjª³Ÿ‹ÒÈ“t†&Ë Ý9A$€tàwá„]I€{  Ž@ii)¥C­’5¢l€mBQt?OUU5µ5aÉ;} lòò¼X,rº?=ÊÒ¥KÙ½{7999äææ¼~;)QÅÕ—Ç3d –‰ÇÒ»@‡VãZä~ÞÛÊsó¸gJ"Ÿ­60åÆDR“UlÙibê#Õì9dÅÒjãÂsÝ?o‡>`ôèÑDGG;{:tG7RSSCJJŠO}@|œÊmñÙjø‚sã8s†ƒ¥VÎJåJ3-³°`‰ž›&DÓØ/Ìo休QV=€¬²ïÛ·/£FÂf³QRRÒéîùСCüðý÷袢È= u’GûdQ„ªj„÷#8A£†9s–|‰4ûïÆ‚Z…”“ƒ0âL8s(Â?æBï<„1£}^Û222ZmÒV¯^Íc=櫯„ ¹IÎÉÞí¯3Œ.õEóòóHOOw«{Ø]³ÙŒ(ªœ@‘õLøƒN¼üÔD¨ ÷ ”HMM%??ß/àððïˆI677SVVŠ„DTtj• Áh³¡•ì΀rq¬®®¡¦º&`ï« ø ØØÁÏìÈú€¯sñÃÃÁn·³gÏ>ýôSªªªèÓ§OÀ'qµJ 'KCFšÚµ¨Z¬0ûõ:²RD.>/–Ͼ6pç­‰¬ÝdàþgêÐj´jçN'1ÁûŸƒV«¥ÿþ >³ÙÜ©@ii)›7oÆh4’™™ÙeŸ„ì, £Îˆv#2éij.??–‘Ãbyf4,k!%Îâ[p§Lo :”êêj***|›ÍÆ®]»Ø²e éééî†a@$}´ûá•76ÿžŸ‰pÝ5²FàÐa„ /FªkBX·6l†['! Ü¥ßE¸ÐÐÐÀ´iÓ())ñuØëÀÛ!R81¸,ÔÍËÏ#-=Õþ·ÙlØ%Y¨\ü=S¢ G*Ë[Àß¶¼˜ ëÎ "˜ˆ°Ž€)))ëG=³cw繫U6*--tQ:9—ë°nKHv g@aTSSKuUX*Š|Ž!“€3€Nj2™Ø¸q#_~ù% 7úðçwÜ|·¶…7>hfö#i”³PrØ‚Z„¿¿ÖÈŸ&ųa›‰?ßϸ1±XÌR›>Ãû¹âââ:t(§vUUU>'‡>`ß¾}ìܹ­VÛ©€Û땪ý@ôz;ÕµVöheÑglØaáÖk∋S±è?|»Ö€€D^Ž÷눢HJJ ǧ  €#GŽÐÒÒâ³ÜN¯×³aÃ:Dvv6‰‰‰ò}pápõøÍÅðøƒãÇ#=ø($% @f6Â?_G:}üuÂå—‚òwà˜„X:(¼÷Þ{Ì;××BQ‹¼ûïÐèÂÙ„‰¤¦¦8S’½-|ïæ¨ôd ªœ8o;óÿz½>R ÀTº™vŠð ° ânÀ‘³îªxÍ›%pKK‹+¥C%ªE—€€ìeíh;Mmm-UÇÃFüÉ-Õï·ýûLÀ¯š¬úúzV®\ÉêÕ«IKK£W¯^×8`±ØIŒ¸ü‚x¾]ÓÂ?¶òó> />šJc½…ý‡­<6#åÿmáî¿Õ°i«Â\é7ªIIIaÔ¨Qdggsøða_®pnú€}ûö9ýì»*`«©³1ç­z}¡ž‹›øò{•µvîžœÀØ‘±Ü~o%ßll%Z o/Ñ£UK Ôq‹ µZMnn.£F"..Žýû÷wª¨®®æÇ”õ¹¹²€ @f& 臜 *žx~X‹ð»›`äp¤šZhh@¸{(Ëö”p„€ƒrçwvVúõÝTaŸD8¸4ÔÍ+È#%%Ù­qÝîXÄíÎÅß-`6# ¢Ü}pE­¹#6ºÙ "‡Ü„FÕãN„xNœŽ›­¹¹™Ò²2AV4«T"‚(Ê‹¿›‰Kà8Wm]Ç+«øÎüÆ*ü—Ø€u™ÀüŒæTVV²téRvìØAAAyyy5HKQ3jX4v Þ]ÜDC£ÄüçÒÉHUs×ßêxø®$†žE|œÈé5÷Óò×çêÔOMn¶o#¡¼¼<ÆŽKtt4ôK°yófŽ?îô³÷çýV×Z™rÿqVo0qóĘšÂÔ[’˜rcEýt|-“[®M$9^|«™k/#&ZÄî£û £üñ¬³ÎÂl6sèСN5dÍš5h4²²²ÜÉ› @a<ÿ:-Í‹>F¨j€Ûn–µÐ~ñw›…°Æ%IbÖ¬Y¬X±Â×a;‘mÌOeáŸcÈ“ €3üo·Ëg) £ Pn,à *’““]Õ,¸7ò7ÿ´EqK#4 §º…H!sLääd¿SàM* À±cÇ N‡¨R!**äÉ·€cQ¨¯«§²òx ßš¿X¬ïÂñP üYP„ÜK SØívöíÛÇÒ¥Kƒ¦¹tpüÙ1\:>†~…Z^œW‹ü~RϪæÕwš‘( cÓ6™i"ýûDñÁ’zòs]ÆAžÐh4ôïߟ³Î: £ÑØöY{‡ãs-++cóæÍ ¿ô‚ «“X¿­µJàô"}{kѨvïmåé¹<9#™Ñm¾›ùò{¿»&N`öÜ:jk-ô)ÔyM+8쑇 ÂàÁƒ©ªª¢ªªÊgZÀjµòÓO?±}ûv’““IKKsF5„¾}®¿¶oCxiÔ6!½ü,Bÿþm!/EØ¿Ýâïv!Ÿ¿—`aãÆÜwß}˜L>û2L†hH‘€1À%¡¾h~lYíŠHNg(ߣ ÙlA'è(à/ôz}$€MÀ‚îž$RÀYD#ЕütG;¹––Ž;ÖÐ*Âü®€ãõ¢Ê444PQ^ÙÍwsBøXw¯³{O Áüìôh2™Ø°a‹/F­VÓ¯_¿€5r@£HJPaj•øeŸ‰+.Š£´Ì̇+ <ôçDZ[íüýµFô&¸{J·˜ùZ#Ñ*; Mv²35h4·INR¹ ôbcc6lÅÅÅTTTøœ, è¾}ûرcl[ÚQWEFà´Q\{yÕ•fžž×HÉÁVÎ9+šO>k¤ü¸GïNC£0˜$^[Ð@fšÈu¨o°2ëõF~Xoäâq²w‚7x–?yôèÑÄÆÆRRRÒ©> ªªŠüƒÁ@vv6ÑÑÑòñññQ:ÿòýžÏ‡|öÙgùý·"û–„Å¢3Œ8¸(ÔÍÏË#!1ÁÃÇ_r~u…ÿ@Àl¶ r eë%ø XÓÝ“D ¨GîŸHII!//¯Ë uO'@´òcÇ­Vƒ ŠíŒ€äVÀž€¦ÆFŽ+Üó߀› Ù<è¿ÀJ ?\8~ü8K–,aÇŽôêÕ‹ü|Ÿ.Ä'A€Â|-#‡hùú=¯/l¦Õ"ñ÷¿¤ñÙWͬßnfѼ,.{²24œ;:–¼,Áý5äd©ù˳õðÙ\­¹ÛŸ9(ˆlœ‡lþRää;•üv›ÝÕÀîÞ Ø¹  `1[ä¤ä#]A„€ß€û0RÈŠÚ„p\€õ°W–š´´´PQQÞÐÊÀ¶ÅE@¹ø;@Ks›‡@èñ Ýô˜ö+ð ðP…ìà×/Øjµ²iÓ&>úè#bccéÛ·o‡ cwЧ—ŽÓ‹£Øö“‘ÛZyüžtçîØ`”˜õZŽU<~_:cÏŠáo/T3ÿ£&L …ù:§«_S‹ƒÑîÜmÇÆÆ2|øpȱcÇhllìp ÿ€½{÷²uëV4 ™™™¦AÔ*YpÄ8n¾:Ë/ˆCۖ㯪±ñ÷Wê1XË­×'¡V 44Ù¸ý¾ã$Ç À¯ÞÁz½ž/¿ü’+VMŸ>}Þv w–IWÅ»Ùô~·NÏÛKõ̼/•œL5*$Æ‹Œ¬ã—Þx¿‘ß\‡V#ðÍ=7ϨâìaZ²2\‹jjj*cÆŒ!==’’ÌæŽ ¼(Š˜L&vìØÁž={œJûŽP­F :Ê}Q|wQ#k·´òèÝ©äfÉ¿§·>¨gõ†V~{a ½{i9,š5äe©¼j<¡Ôèt:gù£/"püøqÖ­[Gss3™™™ÄÆÆºŽï(ôß|…\NV«•‡zˆ5k|½6ÿ/ >¹0Ž0€^½ ˆ‹Ç.Ù±ÙìíRžN€`±XILL$))©[áˆH°x3'Š$p:Ò099™¼¼|8&“‰ÒÒRŸúI’8tè›6mB¥R‘‘‘Îa ¤,‰õ¶ÓreÀ7ß|ÃC=äÓǸK8.B0Ž0TjëªPD\Àå`±X„„'ÚmÐüÛ#0ð/ä9ºÛˆ$`þîA€Lrss»¥pL†---TVV" ÑjÜ<QÖ¸-þ*Ñi¬oi ø–àõÈ¢ª­À`ü4„’$‰’’,X@cc# ð)œë =MÅŒ ÙYþß,f˜xq,˾jáÝezŠzk¸ý†D¶ì0òÞ2=Ïü%•‚ŽÝ µZ-EEE >œ††ŽïØïAé°iÓ&Z[[ÉÎÎ&*ªc§¿˜h‘«.ãôbq±2¡Üõ‹‰¯~0ò΋YŒKÿB5O¼ÒÀ•Ç’ÖÖL¨Õ,ñÁ’F¹¢Þjúôêø=‚@||`×®]ìÞ½›¸¸8RRR|Gq‚úojjâŽ;îàСC¾{x- >ù0ž0€^½ä®¬Ê.€ŽÅßîµ°|!$&$dNÐëõ;v,’À"”Š l[¶îarž8bà‹%vöpkYé¨RUšPHm!,·ÿ"¡c¶"‹ÏA¶Wõ»’Åbá…^`È!Ì›7/h¤Eýt|07›ë'&¢ÕФ$ Íí7È»ñÿw{ ¼±°‘ë.aøPÿ4 ÙÙÙÜyçÜ}÷ÝdgûöNr¤–/_ÎsÏ=Çš5k|šÕ$ĉ¤§ºW•V+4ëånùq•€Jl3žj´ñüœÞ^Ü̼§Ò8ÿœ8~9ÐÊ·kZ(9ÔqºB¥RQ\\Ìý÷ßÏ”)SÜv]½²²2æÍ›Ç›o¾é,3tƒRxy[±téRÖ¯÷éyÕL„5+ûµÁµƒwÌÉmÿ¦ƒ¼$yt ìÞ#±,P'ФÈV“~5– &€@Ñ8#¢ §œùÙ@Täÿe€@‹^ÏÑ#GðŽºŒïǹ Ù€è} †.èÌf3Ÿþ9K—.¥°°>}útÙo¿3¨D­V`ôðhZZ¬|¸¬…7>jaüYZþø»6o7²z­‰G¦§’ß5n‘‘ÁرcIIIáÀ¾ÚÏ:û lÛ¶}ûö‘ššJjjj§%zéjiåÃeÍlÙiäÝeþïòh.“ÉÀ~:.ªçž§êøz­‰O¾h!N'1¸8ªÃM¸Z­&??ŸQ£F¡Õjí“;óذaz½žÞ½{··vÏ÷×U=z”[n¹Å§(ørë¯ãÛ!E¯Â^ÄÆÆÊ››s÷ï°öl«A‘è.",Ð<¨“EÈ! BO$%%€7èõzY ¸4‚Â@ðÈý«^ú=GÂC¾'¼MNš‘{ | ôi{ø…ºº:>üðCvìØAQQQ§»êN+púiÑŒC«ÞÂÍ×$b¶H45Ù¹îŠ8 ò\Â?« }B¥RQXXȘ1c$‰#GŽtª¨««cÓ¦MTUU‘••E||ÇÆ‹*Q`üØ2RDZ[%®¼(†›¯Mbçn#}º†Â| Ï>’AFššo×êyø…îŸϬÓè“§fæœF.;/š”$ßÓFTTdذaN{dI’:$’$a49ÿüóÛ§:ÒÏ>û,_|ñ…¯CJ€[‘Ó“¿vŒ'  °°€˜˜˜6 ÍÍ ÐQ è(”@.´ÈVÀ‰‰‰$''w{ ƒ²²2"Âûi°4P'‹4`C®o +¨ W´mQp~• € j³Y5päð¯* „„\wý ²êu0îï‹÷îÝËo¼Ñh¤¨¨È/á\W¡Ó œ;:–Ìt5‹–71ûÍ&n½6ÁYƒ°êû>ü´‘Â|-I ÞÿÜÊ[©k°‘˜ B@Ø 4ˆ¡C‡RSSCMMLJãäÑ£GÙ¸q#f³Ù§>@% ô-Ô2zx }{kùêÛfœ]Ïﮊãî?¦-ÒØlçáY5œÞ_Ã_ïJ#6FDTÁûËô\0ZG~Ž–Ã¥f›í¾'Aw`gœqýû÷§²²’úúúIÀí·ß1gGزe þóŸ}FZ€Û€Ý¡QÄc<áˆôîELL v»ÍEœf@  ‚'[­@ x BÀ{œ˜M»WD(Eo¾¶« HNN&''' @ŽTºª¡-ìï¨P”¶¥À`0pä𑼣.ã;ÂO°!OÂï Û¯ü6X»v-sæÌ!''‡¾}ûúÎug‰fìð(z)vÿv;Œ6þ³²……ËZÈËÛ‰êÞþ¸»«aÑçz¶ï00h€Žä¶vbb"£F¢  €#GŽ ×ë;¼¾(ŠX­V§@LL >vGY™³ ‘{§$ríoZ€m;¼µXϬSÉÉ’ßϪïôüï'3SnHdî;õ<8»Ž¥+õ(11¨HG|œ÷©DEÒÓÓ9r$iii9r“ÉäF† „ :Ma ­­­L›6]»|©­$@µÖ§ÆŽ@ïB¢££äÅßfÃæf,!):‚£ н  »Ðëõ”——G ø²Ãj@ià4äÜoØ””XÐÐ:"B[ ]@å–0è øž•™fä… 7:?ï_›ÍÆgŸ}ƧŸ~JÿþýéÓ§OP›´÷á‚ì2xÕoHŽƒÜ Yéî ò±r éÉ"ùS?ïmåÓ¯ô\v¾«a dee1vìXâãã9xð 3Äé â¸mÛ6öîÝKZZiii^ONTqÅ…qôï£s‹°¯ÿŸž-?›™1%­V ´ÜÂóóZ¬áÚßÄSSkcð Ó&'ñÍZ¶˜¸d\¬×Nƒ¨ÕjzõêåÔ>|›Í†J¥âücÐ*8¼aÅŠ<ýôÓ¾Ò+­Àµ@uÈù8Ÿ0€Þ½{ݶøÛÜK=Ì€°X¬r@b`«"€Ôò„‘HR€ß†sIIIÝ.t@¯×Sé]7•‹‚€Ñ`äð¡à&dtQP[[ËÂ… Ù½{7ÅÅÅdffkŒnØOGFºº]*»_çœCN– |ÚÂo/ˆ%5Y…Å*aµÊnjµš¾}û2zôhìv;¥¥¥ ì$Ó¡8~ü8ÙÙÙ^õj•ÐnLÆV‰¥_é9ó4 ¢(ðÌ+5TÖØy|F*™éjŠúëqF4Yéj F}aà†ßÆwØ2Y ¥> ¥¥…ÁƒsöÙgwé÷ÙÔÖÖrÓM7Q]ísmYˆÚÆЧ]”›2`“:Ï*«ÅŠ$$N!€9ݱ IDAT¹È½U†°†Ú;À`P¢ˆ§I…Bæ^Æ‚óö•/约p¢¶©§>ìÈý°/®žúùûâÅ‹³xñbfΜÉwÜAV–_­ ºgßZ völ¥¢ÒÊöŸM¬ZÓʰ²³Ô,ø¸—· ÕÜyK<‹G­–{œOš4‰1cưdÉöìÙÓ¡ÀNìv;ëׯgçÎ\|ñÅŒ?Þ§P`ÈiQÜuSÓ¯Eb£^y"•}uTÕØØwÀDÅq+Ûv™XµÎÌçF‘–ìÿ^Brss¹ãŽ;:3ß 8.\Ⱦ}û|R <¢áô 38në¶ Ò1_¢ÿµ•ý9Ž—Þ¾1Û‰"‚J¿ ô #1`FÃ5€`¥”¡ƒ€J¥r~o2™8tЧAI°É%$`ð G¾oüNòûí·¼ñÆäççÓ¯_?÷´ Âl‘XùM3÷ý½–·—4³y§Ü2øúËc˜z[ ˾hâó›™|U,gœ¦eÖÍ ,TÑ[a,”””äÔ”——ÓÔÔä3-`µZÙ³gÿûßÿˆ‹‹#++«Ã2I•J`øÐh.Í¥çEó‡I‰dehX¸¨ž{Ÿ®eé*‡K­ÄňÜ~],“®Irë2è˜/;˲8¯¡Â¾}û˜4i’¯Íp/YBO"}ûöA«ÕÊ·@›×ŠŸ«MÖÊ(B"z‚`”‰€Å„9 g~nŠUåοíä~M1D¢¨Szàd…ìÀdü¼·[ZZ¸õÖ[y饗x饗7n\‡)cåê&}©‘ôd‘ÍJçŒAÑÄDË¡øÿí0òÊ»Í<ô§n¹^ž¼¶ÿlæó¯ œ?6‹U¢¢ÊJ¯\¹¯Ä°aÃ(**bݺu¬X±‚æææ‰€(ŠÔÖÖ2þ|~øá®¾új Ðá8{hé] ϯO¿\Íû+ ¨åÉûRé] igs íI j_¿!I/¼ðÍÍ;Û¼¢!lÏfQpìäÁáö«Œž:£ʹZñ}íÞ»‹㤑Øì¾‚’””DvvvÀ"N+`¢ Ð3 Èÿ;¢­æV” À;ê26_‡ãÂÝDð²> èåï +++Y°`GŽ¡¸¸˜´´´`‘Ül-Ù)°z½‰cåVr2UdeªQ©æ.¨§Å ñØŒ4tZƒQâ­Ošè“§bܘX±pÝÔJšêÌôî¥%>N…F£¡OŸ>Œ1[ w$tèjjjظq#UUUäääøì|)0lH4™I°ü[#Ç*,äe«ÉÌP»-ôÊã½ý;œøá‡˜1c†¯Á Ü„Etsà `L¨/Ú¯¿ÜðËÞ°yöðpìsD»'tD:1Œ 6î!½("•¤¡S)H`0œN€jµº­ Pt.þ‚g  èJXÌJJàuÛMxNV”#û·ÿ‚\6è÷,°}ûvæÌ™Ctt4 ˆÔZ­À ¢(®½<ŽºZ3OÍmÄb²1°_3ÿYÏ]7Ç1lˆ\é¸q›‘÷?kaòõ ô+”½Ò“^~§…ÄX³ÎpUDÆÄÄ0xð`Lcc#UUU>õÿ€ 6““ÓaD§rZ4W^CɳÿÕHNºÈ€>:Å9#gÁWB¯×sÛm·qô¨OO÷WC4¤“Wg…ú¢ýúõE­Qc³Ù¥€Ê*ÉK€ÍfC퀻ƒÁ@EEE8 À1äÔTÀÉ*³yáºp0BÿÎ?.a ¤ˆý;SŠ×pïôî#8Åò¡… øÙ@èQdwA¿ I<ðÅÅÅ|üñÇÆ  0-EÅ´?¤ññ?3¸äü8Ô*ùÒn—^YmåÕ·ÔOÃÙ#d2j±J¬Ùldp?5×ý6Á}Üm_{õêÅwÞÉÔ©SÉÏÏÇî8¡8´&K–,aæÌ™¬_¿Þ§9Nv¦†GïÍàßϦsÎȘNóýA¶ò÷ Ÿ~ú)ëÖùLë×…h8'+Â2'¢Ø6˧€ÚþïèŽÑ /ëÄ‘¨Î¥ e^BàS¢€ÊEŸ%€*• Q±Ú¬ìßW€wÔeìFnÎs*Àü,Dv„ŸÄ×h4²xñb¾ÿþ{Š‹‹ÉËË ’€šôT5:­€ˆÄ¼š©­±ðïš8^kãÙÓÈÏ‘ yÖn60ïƒfîÿc"CO“çäÊ*+o.¬ã‡õbc²3e}@vv6£F"55•ÒÒRôz}‡¤ÒÓ? 33“ÔÔÔÇœ•¡q–ýùó+Qã993jP^^ÎÕW_Á`èè;ðwÀ§'p¸‘0ø³ ØQ]»§½]Àjm&&ž  ²'EPåE2Ùpr¨/š””DVVV@«DAD­V;M~\W •" UØì6öíÝ€wÔe” [ðžJhB&5_#“€<_xôèQæÏŸOyy9ô¹0vCEQ˜#²m·™‚\5LO¡x€fol¶óô+uôÉWsÇÍÉh5V+<ñB ¶¶Ò+WÍ‚EÍ45Ûœ©FCaa!ÇG¿ôuuulذšššõŽ—ûZ¼½E”ÏùsŽîâÅ_ìÌï7ðG䉶ãd]MH1``¹œÕf“Í€œvÀÞ5 AHJ \  ²²2\àß°ûŸ'".§ “u àˆDGûí8Û! C›€Z­ñP‰*D•ÊIì’½¿ø¬YŽpê¡”"— îGÎiú=Clݺ•¹sçOÿþýB=! ЧPÇ%ãâ?&–Ô—vÅ×Í,YeàÑé)Î’@A€¹ï52åÿâùÓ­ÉädŠ<ñJWœKR¢ëÏ[©0”——û¥X»v-‚ øÔxCg© 7úà§Ÿ~bÒ¤I ÿî~ üÕO9üèê‹,Øìö¶R@»› ¼øÛÛjÿå×ÈÞ2HHHðy~`4ÃE$äÝÐ.ÉõýÑt­Ÿ´#'¥xÞ[ àú¿„(†Ÿ~e‹,HÈgrø·Ãø°'ìv;÷ÝwC‡eÉ’%¾BËÝ‚ç‚XZná­›¹b\4ÃN—CÿÕµVÞú ŽØ(øxy k7éÙ³¯AœVÂ8üvzõêÅ”)S˜>}:½{÷n —v4³ÙÌÒ¥K™9s&›6mòy|Wá¯_À‰Àjµòä“OúÔ? «ü'ðW?%–9AD…ñrÞ_áüçVV-ù?/w'òšá} ¨ÝàNð Ap@ê ÊRo®Üh’û /ÃYÐ*¹/þŠcTª°}<Ý}œhFnø2ø˜.´}-//çºë®ãŠ+®`Íš5-4݆J„¢Þj®½"­FÀf—xêå,ÕsÓ•± î¯æŽ‡jذÝÂ+¥’)GìvذÅÀu.§ä}ù‡ Â=÷ÜÃm·ÝFjjj§D ¶¶–7ß|“üã””t®KñV ôö|ºjÕ*–,YâëàÜÿ*{Ð1Â2'ˆ*ÑUÿKüçMèðpx¬@Ç„ +ó{˜`'ͨNr‡À}ÁøÐ]Ê1@¹ëweMk˜*N…*€®à0²Èé|à]yáwß}ǹçžËôéÓÙ¿?xzœ, />™éþµ¶Âºíf¦ÞÇo/Mä¡éŒ¬å¢1:.:O.]´X$–¯jâî'k¹æÒúji5C‹^&+111Œ7Ž¿þõ¯L˜0­VÛ!‘qèJJJ˜={6ï¼óŽÏ6Åžðô fÞ¿¡¡{î¹Ç×!vàMzBÿ]®óC ‡K¤¼rJÿ• »£RÀs³uènÔ x8ì‹DºÀJ Š‹%&&’••0 @EE¢ÓÀÕíÏ=ÿ/ºòÿ*•³%ðþ}û±Ù‚»»ô‚FàµP_4p˜¬8 ¹ë _ؼy3¯¿þ:±±±ôîÝ›¸¸¸ T 8N©V ´4YYöµ‘þ½5˜LŸýWO|¬Ày£cÑí,\ÔÈ‹o5óÜÉ\uY·˜þXó?næèEýuÄÅŠDGGS\\ÌàÁƒ1™L”••µ]Ë»>àÈ‘#üðÃN_FÓîXoãö÷ùîàwÞáwÞñuÈA` ]Hýô€{½YBFC¿þ}m€F@n–À /€äääNû^ø‡°©)`]x;C3²ïBpê8YÈ©€?wfñ@ €C@";ª;)yñW’—øOI”hëoR4#wDû5BB6Bš!ø^ÝÚ`·ÛYµj‹/&''‡Â õ¹iV´óä« ¼·´« îšœDl¬ÈósjYµÆÄœ§Ò=<†Ÿö˜¸íþj†i¸ëw |»ÁĶ]&Ɖmë(‹¦†ÊÀ©©©áøñãzõ; íÞ½›M›69+g|E¬<•ÿÁXü:Äo~ó_) ð°6ðW?¥q?]Ì:޾ýú8 €\‹¿£ @ÂnsD\Àn³ƒ)É)!Ž9<„àÀÆP\(R{xC+p2:öqGPÿ¸Ä+’2Z%¹¿FÔš°|D¡éŠÙh@^(æ³ øI˜9Â7ÞÈ¥—^Ê£>ʨQ£:Ý!ŸbcDn¾.™K/HàX……Ôd0ý‘ãDiÞ~!“Ül MvfÏ­gP_5Ï>šAL´HT”Ȫáîj¹¯€jµšÓN;ÂÂB¶lÙŠ+8~üx‡ãE‘úúzæÍ›ÇÀ¹îºëèÓÇ·uG0Ãÿ¯¼òŠO##ä…aðFpÊ"ð7p'PkÔíŒÒk»Û\-!!œ¼Ý¿#„÷çÉ¢pà[NR»N—ò_I,\¹YÝÚ>u¥Q‡e-ù{crËáË‘sÆ~Ï_}õçž{.wß}7»ví ZëÛ´CEa2KÜ:£Š¢¾ž{,ƒÜlùcüe¿‘­¿X¸çŽ$§yOÉa3Ñ:Øh‘ÿ~×Ìì×jøä?)“Ϙ˜Î=÷\|ðA®½öZ¹#›ñ‹¢È¾}û˜5kï¾û.µµµAy¯¾°qãF^yÅgàÊ!ú4‡fD§B>'hÔ—c*’ûJA_”þ²ßBÈp²sQëƒ}‘®”ùu^ ±º_YôíBN„= =þ‹ÜW`*rS¿g˜×_#Fðâ‹/:ëßÄŒ?¦’’ä Vü°ÑDï•Ó¨¦ÎÆòկץصÏÌ®}¾Yk`Ú#UìÞgr¾699™ &ððÃ3vìX¬Vk‡ãwè~øá{ì1Ö® ]”Ýd2ñàƒvvØGÈ®=è:B>i´ŽKºÔýÊ PÌ­òa.­ ã©Îã!ÀmȾÿ!ÃÉHìȉ€wFR"P7Ž›â_¡\u]È#àq¯©ƒ:ö'“6$”°o ë^Zü}akk+ýë_¹à‚ X´hQPLEÒRTŒKlŒûŸul´€Ù f‹|.ø¨ÃÇlÜ|uq±"3îHåß/d1gV6ÉI"ï.jB™Bwý&OžÌ<@QQfsÇ›hGG¶@ä_ýÅòåËùî»ï|RÌ ÍhNI„|NP«ÔŠÞ¡ðW¬÷΀ä*B AÆëÀ¢`_Ä'#¨FËú=wþ°=oLÇsÎÛÙ# ¼áÂè!¾Qü ,GÖ§ø…½{÷rà 7pã7²zõjL&Sç/ê&.¿0£Éν«âîÇŽ3‰ži·Æ3¼­ãà‹oÖòÙÊF~Ø §´Ü†FÞ´|jµš¢¢"¦M›ÆÔ©SIIIñê I§Ÿ~:§Ÿëøêêj¦NêërC• —UÂ=h›ûœ6*Î]”rƒæxJrK³ždøÙ‘2ä8Y Àà‚äáXæè¹âf¤”°(¡V÷D"?Ûÿ£ FB+W®ä¢‹.âþûïª> w†þ™Å€Þ*ã^}<… ωåûu-Ô5Ø8cŽÿ£çñë8´Ž?ONv¾Vuu"**ŠÑ£GóðÃsíµ×¶õkw… 4 W_}uPÊ ½áwÞéLs° ÙS½'ŽÐµR¨˜G=çWI±ø;Ib£Ù;ÿ-ÀÁ¾HG8Ù'ú2äœÞMð½$$$‘‘2@“ÉÔÖ Èá 8}T*E  ¨(l+E‘ÚÚZª«ý7\ $d‹Üø‡À{È~C‘ýüZý6oÞÌÂ… Ñétäåå‘”…31^Åèá1\pN,} µ”–[™|5cÏÔ1îìXújX÷?#O=Nv¦‚t¶ÍÞ†Eÿþý9r$‹… Š"_|1gŸ}vÀ߃7üòË/\y啾1ÿØ’ºxœ¯™™¤¤¦`S6²ÙÜšÙíîUrã HII!6¶ûUリªª`”–ã‘•…'sÀïÛûÝïÝ_* x¸¥·:p¯ Fù˜ÍÖíÔ‚ ˜ Œ^Fngíš››ùË_þÂe—]ÆÂ… ©¯¯ÖØOÇUÅð÷WêXöek78Ziwº*¡´ïU>äŸ dddpË-·ðÈ#0dÈ.¹ä’ _ÄsÏ=×ÙaŸ·=zÐ=„|NÐhT(sÿ®€·¹Ù‘jµ»ÇS#7°Kæ‰`àT ›™¿âdÿà•€ö?R¦”:› ‡œ8Ž÷"3ûÅtÁÍkÏž=Üzë­Üzë­¬^½£1xF`*ž¸7;nŒçß7óÞg¦ÝGn–;áô¶ó÷æç¯R©èß¿?wÝuW@Z°úƒï¾ûŽ ø:¤ xŠ.¤fzÐ!B¾V8S ”§ŽÊ)l›[í’;A‚@6#oZ«yÒÁÉdÔ~ÎDî-H >tIrñQgË‹>Àq„g)@˜ªz@÷± ¸ø ð$p~þ½­X±‚Ï?ÿœiÓ¦qûí·3xðà D‚¢t×LHä² ã±Ùec!ÑÇ'ïOf¢#çÀ@£¥¥…ûî»Ï×!rÅFOèÿ$…Z­qŸ•s©GŽ_ù3$ Éí¸ÂGÀÍÈÕlaÇ©pÀ\ ü™nŠ'¡Ã€¢ÂÅ{ º'p’ã `09çç׌$Iÿüç?9ÿüó™={6‡Úd-+úý¡ûF¨æÛÅ‹³mÛ6_‡ìæ„f4¿ „|NɤkbTF¼‡ÿ]s¬÷4AXÓV`:0‰YüáÔ#8jµWŸÈ‹© užK™ÇRÞTn Åsò×P)©=ÐC òbt.ð<]Èû566òè£2qâDÞ{ï½ ê:ºÕªò8O/å1Á&¥¥¥Üy§Ïª)3rÍÿñàŽäW…Ï ‚@»Í‘òÖr,þòî_rF[%ål¨ù»{7õ`Ø`íT% —h]\¬Îî¹ÛAÁH=¯á%ÿïñÚœ2¨Dî/p!°”.è~úé'&OžÌ­·ÞÊÊ•+1BÓÈ®³?OrÁõú—$‰¹sçv¦øX¼Qô ÁcN”PzÐnñw¥ÇÝ8¹‰ÒYÈ©ˆÃ©LXd¿ŽøóG‰É‰°EWyŠëR4Õ.2ÐH€3}ÐCNEì@Ö\ÜœÆïv+V¬àŠ+®àÞ{ïeÛ¶m^x Ï]¾ÎïƒÔÙÏ6oÞ̳Ï>ëëz`&!h¥ÚƒàBP†œëºR1¥Xüi‡ˆ:Pç<î?lÀ›@dÇЈ"8ðk ¼ "7[XŽÅÖÖn2P¹"§Àã¢.Ûöw6€(üš>¢_ìÈåi—Óõþ½Ðnç7ÞàÒK/åùçŸçÈ¿xí Cî÷z‹+¢Á$uuuÌœ9³³Ã>Öo=QtŸ="Î;—|¿"~uÙ‘»‡öBn]v•gø5®.ï#;·#—ºMk‹‹Å°üŽ x‹—º~êú§â[QÕ8ÅÑ‚¬Y¼[ðÛõ©ººš‡~˜‰'2þü wàóÌû‡28e6›yõÕWùüsŸ%ý‡€‰à×IаLB¢ zIºåP=Dme„5s¸c=ð#À}@ðBÜЧ;ø5ÍAF¹ÈµÛo &“‰ÖÖÖ€…ApåªPä°p‰½åÿ%$Dñd7kìŸ8†œ/¼øY8èvîÜÉþð&OžÌW_}TÿO„Š|ù嗼𠾱#/þC3¢_ÂB¨D•ˆ›úÏMhêL´'J’Dkk«·žåÈ彑#Ë/"çüO*üš €ÈÍBþ¤X,–ò@6iqˆY¢ÜRÎÜÿÚTª°|D=;¨ðap+' øüóÏ™0a÷Þ{/[·n º>ÀÁ"GeêÔ©´´øìýµÙ޹ÁAÈççÜç¦RîîÝÃÿ¸¥7\“É„Ùl¶¯"ïð“‘7öìBa@hÉf³í1˜ÍæÀ¥<"—Ä¥p¿ÉCe¬âe@=¬Èþ¿Aö±÷{’±Z­Ì›7Ë/¿œ§žzŠC‡kŒNx¦‰ºº:üq***|Ö„ìUøË=p ô@T)7ÿnû'y~”óªb¾uËtoî6›ÍFìvûÀÝÈ9þ†ÿ*‚†àߘÍf»Ñh Èâ/ŠŠ€‡Ê¿ÝߕǷa"¡©1ëAghBî~ð ]UUUñä“OrÍ5×ðöÛoSWW¬1 V«•9sæðÎ;ïtvèÀ÷!Ò¯!¯ªP©Tnå¸-þ®ªIÉîÍÙÊGÛFÐ|ê÷ ôïØÞÒÒ¢oii P@¡ðÌcyfÀ„É 0¸²òtÇ€G].?¦ mûöíüþ÷¿ç¶Ûn ©@wa·ÛY±b…?Í~¶³éñû6ÊB}A•Úáž )÷¿rnuÆYÇuçÑÒÒ‚^¯×#·”>åÐC¼ã놆†šÆÆÆ®Öz…ÓÐÂKˆ×SÎ*¡R©Âá°6Ôì_ØŽ¬ø?ä¯ß‹Þòå˹òÊ+™>}:[¶lñ·¬)lX·nS§NEž{;Dp]¨œèÁ #¤¥•޶é€{@YUVV¹mœ›ªîB’$©¯¯¯å]e#=À;Ìv»}¥Ñh´ëõú€¤¡©vRù‡no$ Ä9Ûïß0#ûü¹çÅ^¿_h6óÖ[o1qâDž~úiŽ=¬1v [·nåꫯ¦²Ò§§xŽžšÿPáp(/æŒ|*sܾ3ª*?áQ˜Ý¿Á`°Ûíö•@k(ߨÐC:ÆGõõõMõõõݾ‘”Éco ðò¼VòŽ€B}ÁtÍÀ¿‘ËŸ¥ »àòòržxâ ®¾újæÏŸ1ú»ÝÎêÕ«™8q"55¾eD ·ú)Œ¦5Z§.Ï“sNõœsÝ*N|Þnhh ¡¡¡ 9ívJ¢‡tŒššš~nllôVÚ%8|”w´g(Ëåºßè:®[×?|ê öà„Q†lhu °.è¶nÝÊwÜÁ¤I“øê«¯º}Ÿwv»U«V1eÊŽëÔGe?²{¢ÏºÀ!¢Üæ@¯×³páB®¿þzl÷#·TíéôZ4B­…N§ssEi3K.Zà¶ø;RmGàœ][[KCCC3ðÏмãð ‡øÆ’ºººŸ0 'žÿX– y†+  Õjƒù=± ”ëA@aþ \‰ljµßßšL&æÏŸÏÅ_Ìĉ™3g;vìzzàСCLŸ>É“'wfôPÜËcKPÕƒŽ° TÒê´ø,‘vL”Ž”¿3Ð~íêÃ`0ÐÐÐ@]]Ýn`qÞnØ–³“6I’ž®©©y/666)??¿Ë'pE$çê¹À·}×áž-Ä)€ ¡¼X‚‚Fà_À—À©@š?/¬««ã‹/¾à‹/¾@ ¸öÚk9çœs1b™™™!¤555|ýõ×Ìœ9“={üê”Z¼óßÔí‹÷àD²ß½ós[Еy~ÇÏùäþõ¯±k×. F£‘¨¨(´Z­ßU*6›ÒÒRV­ZÅÔ©Syíµ×¨®öë¾®E&2_teì=8v#7½ úŽ$''‹ääd¬66« ›ÍŠÕjÃfó|رÛlH’ ÛJ¦A$55•®Î× TUUÙªªªVO%”ú»òIDATþEz"þá‰ÊÊÊÑ:®wTTT—vä’$É-}ð¶Õï(Ó  ] GU}êÁìBö0x 8·«'q”E}òÉ'|òÉ'ˆ¢Hff&§Ÿ~:]tƒ "55•¸¸8¢¢¢ˆŽŽ¦µµÕNݳgëÖ­céÒ¥46vɱ·YÛ°‚À”w÷ {˜<ì‹hu:ïõʧœQ°·Í¯’‡eJW"f³™ªª**++K‘­¥Oyôÿ°ßb±Ì¬­­}I«Õ&åææv¹6¿£ì¿ó‡žO(žÓ…F !û\÷àÔD+²>`#²PðaäNf'»ÝNEE¬Zµ «]A@£‘ËV­V+’$uÇLëàFäI=ˆ ¼<@[{¦™¼é¦•i'@BÀµðûKìv;•••ÔÕÕ5Z,–gè‚¿ÆÉŒ ÿx§¾¾~I}}½±ººÚïË¡p(jW]zˆW·¼*4vÀoÑcük@r$à|ägÀT~ŽÅ¾µµ•ÖÖVl6[wÿUÈ=‹da?!躨ÅŽõÿ’k;å(tê$Éû&Ë$I¢ººšºº:S]]Ý2d_z€ÿ€»+++×ÔÕÕ™«««±ÛínêQ»ÝÞîáVØv7éŸRØB`lžöEzQ¨žÎCžÐ‰ ?ýäqMDîЃÈÃÓÈ©¥ ¡Ýœç)œV¦PTxÏ9ÚÛ£¦¦†ÚÚZseeåz`:Mȧz@× —$é÷¥¥¥›kjj,ž$ #(#ÞX­ó9(€Û냋'CÁ¾H"vàgà6ätÀ5Èi ¿dù†¹ãÚyÀLNQëÕSû€Y¡º˜äå_ŽïäùÒ1·Úq:­zTx{Øívª««©©©±”––n“$é6d‡Í_ z4]G™$I“ËÊÊÞ—$é ›Í¦KKKëP Ib[8K¹Ðû©ƒKvÒ³ûÿµÃŽl¬óYÛ#(âÿ·ww±UÞuÀ¿çpNK;ÚM-Œ!›¢‰n,ñ…mÎM0јE³ _nŒ1^j¼4^© ^x­ñ%z±/ÐÁÉ2ç…qq…]Í›Y °PZŠœô´=ÏãÅÓ–ÒB7 ‘Ï'9Éiûä´iNÎÿÿÿ=¿—dG’'’|8ÉÆUúÝeªáS?IÕmÎÂ{ø^’§S½OVÜÂA@s–´UYphšïX_xýÕfEQd||“ä£SSSw­_¿þŠ%'333éêîª2f.¥,é¸\À*j§J²ºcB^¼-S5Ûùk’Ÿ'Ùšä‘$ŸMuBHÒ›‹ žMÕbõI^Š…ÿvÓI²+ÉkIVÞ·®÷ǵú¥ýÕ{Tje¹;UƒŠkL5“j„çƒI¾‘*T °Z.¦ê+ñ¡TÑ€kÍùè$ùVRÛývn}–IîîïÏC}àG##'?vèСÕ_ýÆ4À[`|ü_/n}`Ëïk©=œdóü$Àú©€k²fÍš²^[óý½Ï>÷ËT‰W/%y<ËvNòr’Ÿ¥š¾' "7Áé$û’<“j Ó=I³ü¡óXªÞ¼~äÛ~p]£Ñx|ff&SÓÓK&öõõeË»î{õÝïyàé—ÿtГë°ê-æXÞŽÇvÕÕlö7›Í¢Ñhœhvujt5÷ØwàJezïMÕ˽oöë©T­]ÿœ;°™pÛ¸?ÉG’lJU-ÒH58˜dhñÅ_øòSLYû|§S윞ž,Ê"eQNÔëõ?ötwïß»wÿá›ùÇÜzÿ¥ü#OLxÒIEND®B`‚klog-2.3.3/softwareupdatedialog.h0000644000015700001710000000436514542412415016733 0ustar jenkinsjenkins#ifndef KLOG_SOFTWAREUPDATEDIALOG_H #define KLOG_SOFTWAREUPDATEDIALOG_H /*************************************************************************** softwareupdatedialog.h - description ------------------- begin : feb 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include class SoftwareUpdateDialog: public QDialog { Q_OBJECT public: SoftwareUpdateDialog(); ~SoftwareUpdateDialog(); void setVersion(const QString tversion, const bool updateNeeded); private slots: void slotAcceptButtonClicked(); private: void keyPressEvent(QKeyEvent *event); QTextBrowser *textBrowser; QString text; QString _version; }; #endif // SOFTWAREUPDATEDIALOG_H klog-2.3.3/locator.h0000644000015700001710000000734214542412415014157 0ustar jenkinsjenkins/*************************************************************************** locator.h - description ------------------- begin : vie feb 7 2003 copyright : (C) 2003 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #ifndef KLOG_LOCATOR_H #define KLOG_LOCATOR_H #include #include #include #include "klogdefinitions.h" const double PI = 3.141592654; //http://en.wikipedia.org/wiki/Pi const bool LATITUDE = false; const bool LONGITUDE = true; const double EARTH_RADIUS = 6371; //http://en.wikipedia.org/wiki/Earth_radius const double RADIAN = 180.0/PI; const double DEG_TO_RAD = PI/180.0; const double KM_IN_A_MILE = 1.609344; class Locator{ public: Locator(); ~Locator(); bool isValidLocator(const QString& tlocator); double getLat(const QString& tlocator); double getLon(const QString& tlocator); QString getLocator(const double lon1, const double lat1, int length=6) const; //IN80aa is the default length int getBeam(const double lon1, const double lat1, const double lon2, const double lat2); int getBeamBetweenLocators (const QString& tlocator1, const QString& tlocator2); int getDistance(const double lon1, const double lat1, const double lon2, const double lat2, const bool _imperialSystem); int getDistanceBetweenLocators (const QString& tlocator1, const QString& tlocator2, const bool _imperialSystem); //int getDistanceMilles(const double lon1, const double lat1, const double lon2, const double lat2); //void degTodms(const double deg); //double dmsTodeg (int deg, int min, int sec); Coordinate getLocatorCoordinate(const QString _tlocator); Coordinate getLocatorCorner (const QString& tlocator, bool northWest = true); //northWest = returns the Noth West corner, false implies South East bool checkCoords(const double lon1, const double lat1); QStringList getAll(int _length = 4); // Returns the list of All locators of the requested size, 4 as default QStringList getShortLocators(const QStringList &locators, const int _length=4); private: //bool valid; //QString myLocator; //QString testLocator; //QString otherLocator; //QChar theChar; //double my_lon, my_lat, other_lon, other_lat, beam, testNumb; //int ideg, imin, isec; }; #endif klog-2.3.3/lotwutilities.cpp0000644000015700001710000006616614542412415016001 0ustar jenkinsjenkins/*************************************************************************** lotwutilities.cpp - description ------------------- begin : apr 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "lotwutilities.h" #include #include #include #include //#include LoTWUtilities::LoTWUtilities(const QString &_klogDir, const QString &_klogVersion, const QString &_parentFunction, DataProxy_SQLite *dp) { Q_UNUSED(_parentFunction); #ifdef QT_DEBUG //qDebug() << Q_FUNC_INFO << ": " << _klogDir << " - " << _parentFunction; #else #endif dataProxy = dp; calendar = new QCalendarWidget; util = new Utilities(Q_FUNC_INFO); util->setLongPrefixes(dataProxy->getLongPrefixes()); util->setSpecialCalls(dataProxy->getSpecialCallsigns()); manager = new QNetworkAccessManager(this); reply = nullptr; file = new QFile; //url = new QUrl; klogDir = _klogDir; klogVersion = _klogVersion; downloadAborted = false; stationCallsign.clear(); startDate.clear(); lotwQuery.clear(); lotwUser.clear(); lotwPassword.clear(); fileName = "lotwDownload.adi"; pDialog = new QProgressDialog(nullptr); pDialog->cancel(); firstDate = QDate::currentDate(); calendar->setToolTip(tr("Double click on the date that you want to use as the start date for downloading QSOs.")); connect(calendar, SIGNAL(activated(QDate)), this, SLOT(slotCalendarDateSelected(QDate))); //qDebug() << "LoTWUtilities::LoTWUtilities(): - END" ; } LoTWUtilities::~LoTWUtilities() { delete(dataProxy); delete(util); delete(file); delete(manager); //qDebug() << "LoTWUtilities::~LoTWUtilities" ; } void LoTWUtilities::slotCalendarDateSelected(const QDate _d) { //qDebug() << "LoTWUtilities::slotCalendarDateSelected: " << _d.toString("yyyyMMdd") ; firstDate = _d; startThefullDownload(); } void LoTWUtilities::setFileName(const QString &_fn) { //qDebug() << "LoTWUtilities::setFileName: " << _fn ; if (_fn.length()>0) { fileName = _fn; } //qDebug() << "LoTWUtilities::setFileName - END" ; } QString LoTWUtilities::getFileName() { //qDebug() << "LoTWUtilities::getFileName: " << fileName ; return fileName; } bool LoTWUtilities::selectQuery(const int _queryId) { //qDebug() << "LoTWUtilities::selectQuery: - Start: " << QString::number(_queryId); bool savePassword = true; if (lotwPassword.length()<1) { savePassword = false; bool ok; lotwPassword = QInputDialog::getText(nullptr, tr("KLog - LoTW password needed"), tr("Please enter your LoTW password: "), QLineEdit::Password, "", &ok); if (!ok) { //qDebug() << "LoTWUtilities::selectQuery: - END 1" << QT_ENDL; return false; } } switch (_queryId) { case 1: // Normal query lotwQuery = QString("https://lotw.arrl.org/lotwuser/lotwreport.adi?login=%1&password=%2&qso_query=1&qso_qsl=no&qso_owncall=%3&qso_startdate=%4").arg(lotwUser).arg(lotwPassword).arg(stationCallsign).arg(startDate); break; case 2: lotwQuery = QString("https://lotw.arrl.org/lotwuser/lotwreport.adi?login=%1&password=%2&qso_query=1&qso_qsl=no&qso_owncall=%3&qso_startdate=%4").arg(lotwUser).arg(lotwPassword).arg(stationCallsign).arg(firstDate.toString("yyyyMMdd")); break; default: { lotwQuery = QString("https://lotw.arrl.org/lotwuser/lotwreport.adi?login=%1&password=%2&qso_query=1&qso_qsl=no&qso_owncall=%3&qso_startdate=%4").arg(lotwUser).arg(lotwPassword).arg(stationCallsign).arg(startDate); } } if (!savePassword) {// We delete the password as soon as possible if the user is not willing to save it lotwPassword = QString(); } url = QUrl(lotwQuery); //qDebug() << "LoTWUtilities::selectQuery: - END" << QT_ENDL; return true; } bool LoTWUtilities::setStationCallSign(const QString &_call) { //qDebug() << "LoTWUtilities::setStationCallSign: " << _call; if (!util->isValidCall(_call)) { //qDebug() << "LoTWUtilities::setStationCallSign: FALSE 1" ; return false; } if (((dataProxy->getStationCallSignsFromLog(-1)).contains(_call))) { //qDebug() << "LoTWUtilities::setStationCallSign: TRUE" ; stationCallsign = _call; QDate date = dataProxy->getFirstQSODateFromCall(stationCallsign); //qDebug() << "LoTWUtilities::setStationCallSign: Date: " << startDate ; if (date.isValid()) { startDate = date.toString("yyyyMMdd"); //qDebug() << "LoTWUtilities::setStationCallSign: StartDate" << startDate ; } else { startDate.clear(); //qDebug() << "LoTWUtilities::setStationCallSign: StartDate not valid Date"; //qDebug() << Q_FUNC_INFO << "False 2 - END"; return false; } //qDebug() << "LoTWUtilities::setStationCallSign: startDate: " << startDate ; //qDebug() << Q_FUNC_INFO << "True 1 - END"; return true; } else if (dataProxy->getHowManyQSOInLog(-1) <1) { //qDebug() << "LoTWUtilities::setStationCallSign:TRUE Empty log" ; stationCallsign = _call; //qDebug() << Q_FUNC_INFO << "True 2 - END"; return true; } else { //qDebug() << "LoTWUtilities::setStationCallSign: Not a single QSO in the log with that StationCallsign: " << stationCallsign ; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - LoTW Station callsign")); QString aux = QString(tr("There is not a single QSO in the log with that station callsign.") ); msgBox.setText(tr("Are you sure that you want to use that station callsign (%1)?").arg(_call)); msgBox.setDetailedText(aux); msgBox.setStandardButtons(QMessageBox::Yes|QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); if (ret == QMessageBox::Yes) { stationCallsign = _call; //qDebug() << Q_FUNC_INFO << "True 3 - END"; return true; } else { //qDebug() << "LoTWUtilities::setStationCallSign: FALSE 2" ; //qDebug() << Q_FUNC_INFO << "FALSE 3 - END"; return false; } } } void LoTWUtilities::startRequest(QUrl url) { //qDebug() << "LoTWUtilities::startRequest: " << url.toString() ; QByteArray agent = QString("KLog-" + klogVersion).toUtf8(); QNetworkRequest request; request.setUrl(url); request.setHeader(QNetworkRequest::UserAgentHeader, agent); //request.setRawHeader("User-Agent", agent); //reply = manager->get(QNetworkRequest(url)); reply = manager->get(request); //qDebug() << "LoTWUtilities::startRequest - 10" ; // Whenever more data is received from the network, // this readyRead() signal is emitted connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead())); // Also, downloadProgress() signal is emitted when data is received connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(slotDownloadProgress(qint64))); // This signal is emitted when the reply has finished processing. // After this signal is emitted, // there will be no more updates to the reply's data or metadata. connect(reply, SIGNAL(finished()), this, SLOT(slotFinished())); //qDebug() << "LoTWUtilities::startRequest: - END"; } int LoTWUtilities::download() { //qDebug() << "LoTWUtilities::download - Start"; if (!selectQuery(-1)) { //qDebug() << "LoTWUtilities::download - END-1"; return -1; } //qDebug() << "LoTWUtilities::download: - 10"; QFileInfo fileInfo(url.path()); //qDebug() << "LoTWUtilities::download: - 11"; if (QFile::exists(fileName)) { //qDebug() << "LoTWUtilities::download: - 12"; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - LoTW File already exists")); QString aux = QString(tr("There is a file already existing with the name that will be used.") ); msgBox.setText(tr("The file %1 already exist. Do you want to overwrite?").arg(fileName)); msgBox.setDetailedText(aux); msgBox.setStandardButtons(QMessageBox::Yes|QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); //qDebug() << "LoTWUtilities::download: - 13"; if (ret == QMessageBox::No) { //qDebug() << "LoTWUtilities::download - END- 2"; return -2; } } //qDebug() << "LoTWUtilities::download: - 20 Filename: -" << fileName << "-"; if (!file->isOpen()) { //qDebug() << "LoTWUtilities::download: - 21 Filename: -"; file->setFileName(fileName); //qDebug() << "LoTWUtilities::download: - 22 Filename: -"; } //qDebug() << "LoTWUtilities::download: - 23 Filename: -"; if (!file->open(QIODevice::WriteOnly)) /* Flawfinder: ignore */ { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - LoTW Can't write the file")); QString aux = QString(tr("KLog was not able to save the file %1.\nError returned: %2") ).arg(fileName).arg(file->errorString()); msgBox.setText(tr("The file %1 already exists.").arg(fileName)); msgBox.setDetailedText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); //file->close(); //delete file; //file = nullptr; //qDebug() << "LoTWUtilities::download - END - 3"; return -3; } //qDebug() << "LoTWUtilities::download: - 30"; // used for progressDialog // This will be set true when canceled from progress dialog downloadAborted = false; //qDebug() << "LoTWUtilities::download: - 31"; //progressDialog = new QProgressDialog(nullptr); //qDebug() << "LoTWUtilities::download: - 40"; pDialog->setLabelText(tr("Downloading data to file: %1.").arg(fileName)); //qDebug() << "LoTWUtilities::download: - 41"; pDialog->setWindowTitle(tr("KLog - LoTW download")); //qDebug() << "LoTWUtilities::download: - 42"; pDialog->setWindowModality(Qt::WindowModal); //qDebug() << "LoTWUtilities::download: - 43"; pDialog->reset(); //qDebug() << "LoTWUtilities::download: - 44"; pDialog->setRange(0, 0); //qDebug() << "LoTWUtilities::download: - 45"; pDialog->setMinimumDuration(0); //qDebug() << "LoTWUtilities::download: - 46"; pDialog->show(); //qDebug() << "LoTWUtilities::download: - 47"; connect(pDialog, SIGNAL(canceled()), this, SLOT(slotCancelDownload())); //qDebug() << "LoTWUtilities::download: - 50"; startRequest(url); //qDebug() << "LoTWUtilities::download - END"; return 1; } int LoTWUtilities::fullDownload() { //qDebug() << "LoTWUtilities::fullDownload"; QDate date = dataProxy->getFirstQSODateFromCall(stationCallsign); //qDebug() << "LoTWUtilities::fullDownload: Date: " << startDate ; if (date.isValid()) { startDate = date.toString("yyyyMMdd"); //qDebug() << "LoTWUtilities::fullDownload: StartDate" << startDate ; } QMessageBox msgBox; msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - LoTW Start date selection")); QString aux = QString(tr("This is the first date of a QSO with the callsign %1 in this log If you think that in LoTW you may have previous QSOs, answer No.").arg(stationCallsign) ); msgBox.setText(tr("Do you want to use this date (%1) as start date?").arg(startDate)); msgBox.setDetailedText(aux); msgBox.setStandardButtons(QMessageBox::Yes|QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); if (ret == QMessageBox::Yes) { //qDebug() << "LoTWUtilities::fulldownload - Yes"; firstDate = date; startThefullDownload(); return 1; } calendar->setSelectedDate(firstDate); calendar->setGridVisible(true); calendar->setMaximumDate(QDate::currentDate()); calendar->show(); //qDebug() << "LoTWUtilities::fullDownload - END"; return 2; } int LoTWUtilities::startThefullDownload() { //qDebug() << "LoTWUtilities::startThefulldownload - Start"; if (calendar->isVisible()) { calendar->close(); } if (!selectQuery(2)) { //qDebug() << "LoTWUtilities::startThefulldownload - END-1"; return -1; } //qDebug() << "LoTWUtilities::startThefulldownload: - 10"; QFileInfo fileInfo(url.path()); //qDebug() << "LoTWUtilities::startThefulldownload: - 11"; if (QFile::exists(fileName)) { //qDebug() << "LoTWUtilities::startThefulldownload: - 12"; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - LoTW File already exists")); QString aux = QString(tr("There is a file already existing with the name that will be used.") ); msgBox.setText(tr("The file %1 already exist. Do you want to overwrite?").arg(fileName)); msgBox.setDetailedText(aux); msgBox.setStandardButtons(QMessageBox::Yes|QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); //qDebug() << "LoTWUtilities::startThefulldownload: - 13"; if (ret == QMessageBox::No) { //qDebug() << "LoTWUtilities::startThefulldownload - END- 2"; return -2; } } //qDebug() << "LoTWUtilities::startThefulldownload: - 20 Filename: -" << fileName << "-"; if (!file->isOpen()) { //qDebug() << "LoTWUtilities::startThefulldownload: - 21 Filename: -"; file->setFileName(fileName); //qDebug() << "LoTWUtilities::startThefulldownload: - 22 Filename: -"; } //qDebug() << "LoTWUtilities::startThefulldownload: - 23 Filename: -"; if (!file->open(QIODevice::WriteOnly)) /* Flawfinder: ignore */ { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - LoTW Can't write the file")); QString aux = QString(tr("KLog was not able to save the file %1.\nError returned: %2") ).arg(fileName).arg(file->errorString()); msgBox.setText(tr("The file %1 already exists.").arg(fileName)); msgBox.setDetailedText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); //file->close(); //delete file; //file = nullptr; //qDebug() << "LoTWUtilities::startThefulldownload - END - 3"; return -3; } //qDebug() << "LoTWUtilities::startThefulldownload: - 30"; // used for progressDialog // This will be set true when canceled from progress dialog downloadAborted = false; //qDebug() << "LoTWUtilities::startThefulldownload: - 31"; //progressDialog = new QProgressDialog(nullptr); //qDebug() << "LoTWUtilities::startThefulldownload: - 40"; pDialog->setLabelText(tr("Downloading data to file: %1.").arg(fileName)); //qDebug() << "LoTWUtilities::startThefulldownload: - 41"; pDialog->setWindowTitle(tr("KLog - LoTW download")); //qDebug() << "LoTWUtilities::startThefulldownload: - 42"; pDialog->setWindowModality(Qt::WindowModal); //qDebug() << "LoTWUtilities::startThefulldownload: - 43"; pDialog->reset(); //qDebug() << "LoTWUtilities::startThefulldownload: - 44"; pDialog->setRange(0, 0); //qDebug() << "LoTWUtilities::startThefulldownload: - 45"; pDialog->setMinimumDuration(0); //qDebug() << "LoTWUtilities::startThefulldownload: - 46"; pDialog->show(); //qDebug() << "LoTWUtilities::startThefulldownload: - 47"; connect(pDialog, SIGNAL(canceled()), this, SLOT(slotCancelDownload())); //qDebug() << "LoTWUtilities::startThefulldownload: - 50"; startRequest(url); //qDebug() << "LoTWUtilities::startThefulldownload - END"; return 1; } void LoTWUtilities::slotDownloadProgress(qint64 bytesRead) { //qDebug() << "LoTWUtilities::slotDownloadProgress: " << QString::number(bytesRead); if (downloadAborted) { //qDebug() << "LoTWUtilities::slotDownloadProgress: CANCELLED"; return; } pDialog->setValue(bytesRead); //qDebug() << "LoTWUtilities::slotDownloadProgress - END "; } void LoTWUtilities::slotReadyRead() { //qDebug() << "LoTWUtilities::slotReadyRead: " << reply->readLine(); if (file) { file->write(reply->readAll()); } //qDebug() << "LoTWUtilities::slotReadyRead - END"; } void LoTWUtilities::slotFinished() { //qDebug() << "LoTWUtilities::slotFinished - Started"; // when canceled if (downloadAborted) { if (file) { file->close(); file->remove(); //delete file; //file = nullptr; } //reply->deleteLater(); pDialog->cancel(); reply->close(); //qDebug() << "LoTWUtilities::slotFinished - END Canceled"; return; } //qDebug() << "LoTWUtilities::slotFinished - 10"; // download finished normally pDialog->cancel(); //qDebug() << "LoTWUtilities::slotFinished - 11"; file->flush(); //qDebug() << "LoTWUtilities::slotFinished - 12"; file->close(); //qDebug() << "LoTWUtilities::slotFinished - 13"; // get redirection url QVariant redirectionTarget = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); //qDebug() << "LoTWUtilities::slotFinished - 14"; if (reply->error()) { file->remove(); QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - LoTW Download error")); QString aux; msgBox.setText(tr("There was an error (%1) while downloading the file from LoTW.").arg(QString::number(reply->error()))); aux = QString(tr("The downloading error details are: %1") ).arg(reply->errorString()); msgBox.setDetailedText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); } else if (!redirectionTarget.isNull()) { //qDebug() << "LoTWUtilities::slotFinished - Redirection"; QUrl newUrl = url.resolved(redirectionTarget.toUrl()); QMessageBox msgBox; msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("KLog - LoTW Redirection found")); QString aux = QString(tr("The remote server redirected our connection to %1") ).arg(newUrl.toString()); msgBox.setText(tr("Do you want to follow the redirection?")); msgBox.setDetailedText(aux); msgBox.setStandardButtons(QMessageBox::Yes|QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); int ret = msgBox.exec(); if (ret == QMessageBox::Yes) { url = newUrl; //reply->deleteLater(); file->open(QIODevice::WriteOnly); /* Flawfinder: ignore */ file->resize(0); startRequest(url); //qDebug() << "LoTWUtilities::slotFinished - END-1"; return; } } else { //qDebug() << "LoTWUtilities::slotFinished: " ; } //qDebug() << "LoTWUtilities::slotReadyRead - Going to parse ..."; parseDownloadedFile(file->fileName()); //qDebug() << "LoTWUtilities::slotReadyRead - END"; } void LoTWUtilities::slotCancelDownload() { //qDebug() << "LoTWUtilities::slotCancelDownload - Start"; downloadAborted = true; reply->abort(); //qDebug() << "LoTWUtilities::slotCancelDownload - END"; } void LoTWUtilities::setUser(const QString &_call) { //qDebug() << "LoTWUtilities::setUser: " << _call; lotwUser = _call; //qDebug() << "LoTWUtilities::setUser: END"; } void LoTWUtilities::setPass(const QString &_pass) { //qDebug() << "LoTWUtilities::setPass: " << _pass; lotwPassword = _pass; //qDebug() << "LoTWUtilities::setPass: END"; } bool LoTWUtilities::getIsReady() { //qDebug() << "LoTWUtilities::getIsReady: user/station: -" << lotwUser <<"/" << stationCallsign << "-"; if ((lotwUser.length()>1) && (stationCallsign.length()>1)) { //qDebug() << "LoTWUtilities::getIsReady: true"; return true; } else { //qDebug() << "LoTWUtilities::getIsReady: false"; return false; } } void LoTWUtilities::parseDownloadedFile(const QString &_fn) { //qDebug() << "LoTWUtilities::parseDownloadedFile: " << _fn; QString _fileName = _fn; QMessageBox msgBox; QString aux; QFile file( _fileName ); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << "LoTWUtilities::parseDownloadedFile File not found" << _fileName; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - LoTW File not found")); msgBox.setText(tr("KLog can't find the downloaded file.")); aux = QString(tr("It was not possible for find the file %1 that has been just downloaded.") ).arg(_fn); msgBox.setDetailedText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); //qDebug() << "LoTWUtilities::parseDownloadedFile: END-1"; return ; } else { //qint64 startOfFile = file.pos(); // Look for a Header bool hasHeader = false; int numQSO = 0; QString Lotw_owncall = QString("OWNCALL: %1").arg(stationCallsign.toUpper()); //bool hasOwnCall = false; //bool hasProgramID = false; bool userPasswordError = false; while ((!file.atEnd()) && (!hasHeader)) { QByteArray line = file.readLine(); QString lineU = line.toUpper(); //qDebug() << "LoTWUtilities::parseDownloadedFile: lineU: " << lineU; if (lineU.contains("")) { //qDebug() << "LoTWUtilities::parseDownloadedFile: EOH found"; hasHeader = true; } //else if (lineU.contains("LOTW")) //{ // //qDebug() << "LoTWUtilities::parseDownloadedFile: ProgramID found"; // hasProgramID = true; //} //else if (lineU.contains(Lotw_owncall)) //{ // //qDebug() << "LoTWUtilities::parseDownloadedFile: OWNCALL found"; // hasOwnCall = true; //} else if (lineU.contains("', QT_SKIP); numQSO = (data.at(1)).toInt(); //qDebug() << "LoTWUtilities::parseDownloadedFile: QSOs: " << QString::number(numQSO); } else if (lineU.contains("USERNAME/PASSWORD INCORRECT")) { userPasswordError = true; } } // WE HAVE JUST FINISHED TO READ THE HEADER OR THE FILE, IF IT IS NOT AN ADIF if (!hasHeader || (numQSO<1)) { //qDebug() << "LoTWUtilities::parseDownloadedFile Header not found" << _fileName; QString aux; if (userPasswordError) { msgBox.setWindowTitle(tr("KLog - LoTW user/password error")); msgBox.setText(tr("LoTW server did not recognized your user/password")); aux = QString(tr("Check your user and password and ensure your are using the right one before trying again.") ); } else if(numQSO<1) { msgBox.setWindowTitle(tr("KLog - LoTW No QSOs ")); msgBox.setText(tr("LoTW sent no QSOs")); aux = QString(tr("It seems that LoTW has no QSO with the Station Callsign you are using (%1).") ).arg(stationCallsign); } else { msgBox.setWindowTitle(tr("KLog - LoTW Unknown error")); msgBox.setText(tr("KLog can't recognize the file that has been downloaded from LoTW.")); aux = QString(tr("Try again and send the downloaded file (%1) to the KLog developer for analysis.") ).arg(_fileName); } msgBox.setIcon(QMessageBox::Warning); msgBox.setDetailedText(aux); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); //qDebug() << "LoTWUtilities::parseDownloadedFile: END-2"; file.remove(); return ; } msgBox.setIcon(QMessageBox::Information); msgBox.setWindowTitle(tr("KLog - LoTW download")); msgBox.setText(tr("KLog downloaded %1 QSOs successfully. Do you want to update your log with the downloaded data?").arg(QString::number(numQSO))); aux = QString(tr("Now KLog will process the downloaded QSO and update your local log.") ); msgBox.setDetailedText(aux); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); if (msgBox.exec() == QMessageBox::No) { //qDebug() << "LoTWUtilities::parseDownloadedFile: END-2"; return ; } //file.seek(startOfFile); emit actionProcessLoTWDownloadedFile(_fileName); } //Procesar los QSOs y meterlos en una tabla? o en un QStringList o alguna otra estructura //qDebug() << "LoTWUtilities::parseDownloadedFile - END" ; } /*void LoTWUtilities::showMessage(const int _messageIcon, const QString &_msg, const QString &_msgExt) { } */ klog-2.3.3/Changelog0000644000015700001710000020507614542412415014161 0ustar jenkinsjenkinsChangelog 2.4 WIP: - Bugfix: Started to reduce the possibility of SQLi with the use of prepared statements. bool QSO::add() Finish add, think/create/review QSO::modify, update: QString MainWindow::readDataFromUI() Dec 2023 - 2.3.3 WIP: Bugfix: Sat QSO edit was not showing the worked SAT (Closes #645) - Bugfix: After editing a QSO, the restore was not working properly. (Closes #649) - Bugfix: In Sat QSO, still not selected band may make the QSO unusable. (Closes #651) - Bugfix: All Gridsquares are now listed when Export to ADIF is used. (Closes #514) - Bugfix: Selecting a sat with a new band made the bandcombobox unusable. #613 - Bugfix: F1 (online manual link fixed (Closes #627) (TNX ikbenkous) - Bugfix: 'Usage' does not properly handle arguments, print newlines or return status codes (Closes #625) (TNX ikbenkous) - Enhancement: Improved the Frequency entry. (Closes #622) (TNX ikbenkous) - Enhancement: Use a good discriminator in header guards (Closes #624) (TNX ikbenkous) Jun 2023 - 2.3.2 - Bugfix: KLog was not starting when started in clean installations.(Closes #599)(TNX cwross) Jun 2023 - 2.3.1 - Bugfix: When exporting a log, selecting the stationcallsign has no efect on the qsos shown - Bugfix: When no validating callsigns, some ADIF fields were exported even if they were empty. - Bugfix: In some conditions, not identified propagation modes were exported as "NO". (Closes #518) - Bugfix: VUCC_GRIDS validation was not properly done. - Bugfix: It was not possible to select the second pair of freqs of a Sat (Closes #483) - Bugfix: Export/Upload lists of QSOs where not properly created due to call validation issues. (Closes #528) - Bugfix: Fixed the ClubLog URLs that were changed by ClubLog. (Closes #502) - Bugfix: QSOs confirmed with LoTW were not properly shown in DXCC Status. (Closes #551)(EA5WA) - Bugfix: In some conditions, not identified propagation modes were exported as "NO". - Bugfix: In some conditions QRZ.com log upload was not working. (Closes #542) - Bugfix: In some conditions eQSL.cc log upload was not working. (Closes #526)# - Bugfix: VUCC_GRIDS validation was not properly done. - Bugfix: It was not possible to select the second pair of freqs of a Sat (Closes #483) - Bugfix: LoTW export was not using the selected grid when exporting (Closes #539) - Bugfix: Some statistic widgets had a broken layout (Closes #491) - Bugfix: When a new QSO is added, the numbers in awardswidget were not updated. - Bugfix: Distance/beam is shown when editing. (Closes #330) - Improvement: Inclusive search and submodes in LoTW download and WSJTX import. (TNX AG5UR) - Improvement: Code improvement in the MainWindowInputQSO class. - Improvement: Log export widget shows now only QSOs in the current log. - Improvement: Code improvement in the MainWindowInputQSO class. - Improvement: Warning of unused parameters removed. - Improvement: Some SQL queries optimized for speed. - Improvement: Optimized the way log files are exported to online services. - UI: Added QRZ Lookup Button (Closes #390) (EA5WA). - UI: Removed the locator, TX Freq and RX freq widgets from the Satellite tab. (Closes #534, 535, #536) - UI: Shows the total number of QSOs when exporting. - UI: Added a Right-click menu in the DXCluster widget to send a spot to QRZ.com. - UI: Columns in LogView are now movable with the mouse. - Removed the user callsign from the http header when checking for a new version for increased privacy. - Translations: Catalan (TNX Txema), Latvian (TNX YL3GBC), Spanish (EA4K), Ukrainian (UR6QV & UR3QJW). Oct 2022 - 2.3 - Improvement: Code optimization (TNX JohnS0819) https://github.com/ea4k/klog/pull/485 - Bugfix: Calls like EA4K/P were not identified as EA. - Bugfix: Adding DXCluster servers was failing. (Closes #492) (TNX EA7IXM) - Bugfix: When accepting changes on Settings, the settings were being readed twice, causing errors an delays. (Closes #495) - Bugfix: QSOS with a lotw_qsl_sent status as NULL where not identified when queuing QSOs for LoTW. (closes #514) - Improvement: Added the modes and propagation modes of ADIF 3.1.3 (Closes #509, #510) - Improvement UI: Freq & RST labels have been reorganized for clarity. - Improvement: Windows package updated to hamlib 4.4. - Improvement: Minor UI changes in the Setup->misc tab. - Improvement: Showing seconds in the QSO edit can be selected by the user. - Improvement: LoTW upload process allows the user to select a specific locator to be uploaded to be matched with TQSL locations. - Improvement: Changed how hamlib is initialized to speed-up the setup widget exit, specially for non-hamlib users. - Improvement: Some code cleaning. Aug 2022 - 2.2.1 - Bugfix: Temporary bugfix for Setup eLog Page preventing crash on start. (Closes #489) - Bugfix: Temporary quick fix to prevent call validation in some classes that may cause errors. (Opens #490) - Bugfix: Config for real time for clublog was not properly managed. - Bugfix: Calls like EA4K/MM were identified like Scotland, not maritime. - Improvement: Code improvement in the Setup of eLogs. - Tests: Tests for SetupPageElog added. Aug 2022 - 2.2 - Bugfix: DL was not properly shown in the DXCC status table (Closes #460) (TNX N6PAZ) - Bugfix: Clublog QSO status export to file was not properly done. - Bugfix: Removing first char in the callsign caused a crash. (Closes #455) (TNX G4MKT) - Bugfix: Database was not beig properly created in first start. - Bugfix: Changing the statistic widget crashed KLog. (Closes #484) - Bugfix: Some prefixes were not properly identified. - Bugfix: Fixed some database column name typos. - Improvement: Callsign identification optimized. - Improvement: The Debug logging has been improved, still much work TBD. - Improvement: General code cleaning (coveralls.io) - Improvement: General code cleaning (lgtm.com alerts) - Improvement Distance is now stored for new QSO added or modified QSOs from the UI. (Closes #459). - Map back to OSM to recover the map for raspberry & linux - Translations: Spanish (EA4K). Feb 2022 - 2.1 - Improvement: Changed the map provider to ESRI to be able to get Map legends in English. - Improvement: Added two buttons to the map to change the zoom level. - New feature: DX Spots coming from DXCluster can be sent to the map. - Bugfix: Longitude was not properly calculated from a callsign. - Translations: Spanish (EA4K). Feb 2022 - 2.0 - Stop the Ukranian war release. This KLog release is showing my request to stop the war in Ukraine. No other feature of bugfix will be done in this release. Feb 2022 - 1.9 - New feature: Map showing locators. (Closes #168) - Bugfix: Mark QSL to be sent is not shown if QSL is sent on right click menu in the search widget. (Closes #387). - Improvement: Query the radio after leaving manual mode (Closes #416). - Improvement: Grids are now sorted on Grid stats for satellites. (Closes #424). - Translations: Catalan (TNX Txema), Italian (TNX IU5HIU), Japanese (TNX JJ1TGT) & Spanish (EA4K). Jan 2022 - 1.8.7 - Bugfix: Removed the hamlib test from the KLog start that was causing big delays. - Bugfix: Serial speed was not saved to config file. - Bugfix: eQSL Uploads problem solved (Closes #406). - Bugfix: Connection to the radios were not being done properly (Closes #407) (Closes #379). - Bugfix: SplitCheckBox was checked when coming from Setup (Closes #377). - Bugfix: Entering a QRZ cleared the DX Gridsquare if it was previously entered (Closes #357). - Bugfix: Imported QSOs add the default electronic QSL send info if configured. - Bugfix: DXCC widget shows last Entity status after modifying a QSO (Closes #412). - Bugfix: Hamlib is now stopped while editing a QSO (Closes #414). - Bugfix: Hamlib on serial devices works ok. (Closes #355). - Bugfix: RST is not changed on mode change when editing. (Closes #423). - New feature: Added a Manual Mode checkbox to disable quickly hamlib & wsjtx integration. - New feature: Added "Save" and "Cancel" button when editing a recorded QSO. - Update: Developers mailing list address changed to klog@groups.io (Closes #421). Jan 2022 - 1.8.6 - Bugfix: Net rig & FLRig hamlib connections were not working propertly. (Closes #339) (TNX W5PNY) - Bugfix: Some prefixes were not properly detected. (Closes #371) (Closes #367). - Bugfix: Serial Hamlib rigs were not properly working. (TNX W5PNY) - Bugfix: QRZ.com was disabled if user was not subscribed. (TNX EA5WA) - Bugfix: QRZ.com data was not updated if the boxes were already filled. (TNX EA5WA) - Bugfix: Callsigns formet were not always properly checked. - Improvement: Hamlib 4.4 in binary packages (macOS & Windows) tested also in Linux. - Improvement: RTS & DTR are defined to OFF by default in hamlib. - Improvement:KLog differenciates QRZ.com subcribed users from non subscribed. (TNX EA5WA) Oct 2021 - 1.8.5 - Bugfix: Station callsign was not shown on window title. (Closes #347) - Bugfix: Received QSOs from LoTW were shown as to be sent. (Closes #358) - Bugfix: Log was not properly ordered. (Closes #346) (TNX EA5WA) - Improvement: Message of the mainwindow has been updated. (Closes #361) - Improvement: Logs to be uploaded to LoTW are only shown from the current log. (Closes #362) - Improvement: Logs to be uploaded to ClubLog are only shown from the current log. (Closes #363) - New feature: It is now possible to enable/disable the callsign check. (Closes #186) - Removed dead & commented code. - Improved how mainCallsign & Station callsigns are used. - QRZ.com queries are disabled if QRZ.com returns a non-subscribed user answer. Aug 2021 - 1.8.4 - Bugfix: In some situations callsigns were always shown as to be worked. (Closes #345) - Bugfix: Double click on DXCC widget was not sending the DXCC QSOs to the search widget. - Bugfix: Queued LoTW were not properly selected for upload. (Closes #354) (TNX EA5WA) - Improvement: KLog start is optimized. Aug 2021 - 1.8.3 - Added some backport code so systems without Qt 5.15.2 can compile and use KLog. - Bugfix: Selecting File->Export to ADIF was not showing all the possible QSOs to be exported. Aug 2021 - 1.8.2 - Bugfix: Updated the openSSL libraries for Windows users that was causing TLS errors on some connections. (Closes #342) - Bugfix: Spanish typo (TNX EA5WA) (Closes #341) - Bugfix: Statistics were showing wrong numbers on DXCC/Grid per band (Closes #344) Aug 2021 - 1.8.1 - Bugfix: QSOs comming from WSJTX and other sources where not shown, depending on logview configuration. (Closes #338) Aug 2021 - 1.8 - Bugfix: Some recently added ADIF fields where not properly imported from ADIF. - Improvement: Code updated to Qt 5.15.2. (Closes #323) - Improvement: VUCC_GRIDS & MY_VUCC_GRIDS are also managed in the UI. (Closes #319) - Improvement: LogView fields to be shown can be selected in the prerefences. (Closes #23) - Translations: Catalan (TNX Txema), Italian (TNX IU5HIU) & Spanish (EA4K). July 2021 - 1.7 - Bugfix: RealTime remained checked when editing. - Bugfix: Some Hamlib parameters were not properly stored. - Bugfix: Coredump when no entity (Closes #302) - Bugfix: Colors are now properly defined. (Closes #275) (Closes #40) - Bugfix: Station callsign is read from the settings. (Closes #307) - Bugfix: The right setup dialog tab is open on first start. (Closes #311) - Improvement: DarkMode added. (TNX EA5WA) (Closes #56) - Improvement: DXCC & WAZ management optimization. - Improvement: Current UI data is saved before going to edit a QSO and restore after editing. - Improvement: Order of widgets when tab is pressed has been improved. (Working on #265) - Statistics: Added the Grids & DXCC per band statistic. (Closes #312), (Closes #313), (Closes #314) - UI: The Setup menu has been moved to Settings into the File menu. - Translations: Catalan (TNX Txema), Italian (TNX IU5HIU) & Spanish (EA4K). June 2021 - 1.6 - Optimization: Isolated the QSO tab to an independent widget. - Bugfix: When starting KLog for the first time, it crashed. - Bugfix: Hamlib was not properly started on KLog start (closes #126) (TNX G4MKT) - Bugfix: SAT_MODE was being added to non SAT QSOs. - Bugfix: DXCC status was not being properly updated. - Improvement: Added user selectable ADIF fields in the Other and My Data tabs. (Closes #4) - Improvement: Enhanced how the UDP server is started on KLog start. - Improvement: Added some basic SQL Injection protection to the UI. (Closes #95) - Improvement: UI data is saved before entering the Setup and restored after setup is done. (Closes #188) - Improvement: Only one instance of KLog is allowed to run simultaneously. (Closes #250) (TNX foldynl) - Commented some Flawfinder false positives. - Translations: Catalan (TNX Txema), Czech (TNX OK1MLG), Italian (TNX IU5HIU) & Spanish (EA4K). May 2021 - 1.5.3 - Bugfix: Fixes the DataBase update process to add the Q65 mode. - Bugfix: Unexpected Setup dialog behavior. (Closes issue #178) (TNX foldynl) - Bugfix: Time is not in UTC when "Log in real time" is uncheck. (Closes issue #179) (TNX foldynl) - Bugfix: Missing translation in SoftwareUpdateDialog. (Closes issue #180) (TNX foldynl) - Bugfix: Inconsistency text in Tip#2. (Closes issue #182) (TNX foldynl) - Bugfix: Missing Translation string in SetupPageMisc::createUI. (Closes issue #185) (TNX foldynl) - Bugfix: When LoTW service was no enabled, KLog insisted to show the QSOs to be exported. - Bugfix: Setup->Satellites did not show a correct Short name. (Closes issue #192) (TNX foldynl) - Bugfix: Removal DX Cluster unexpected disconnection. (TNX foldynl) - Bugfix: Tip #21 was not shown. (Closes issue #184) (TNX foldynl) - Bugfix: TQSL was not properly found on macOS. (Closes issue #195) (TNX K0JM) - Enhancement: Improved the readability of the DX Cluster window. (TNX foldynl) - Updated the KLog tips. - Translation: Czech (TNX OK1MLG), Spanish. May 2021 - 1.5.2 - Bugfix: Complex calls like K/EA4K/P were identified as wrong calls. (Closes issue #177) (TNX PA3FNT) April 2021 - 1.5.1 - Added the GitHub repository to find new releases due to the issue with savannah.nongnu.org - New feature: F4 toggles the real time status (on/off). - Improvements on call identification management on user input. - Bugfix: Editing removes QTH and name (Closes issue #113) - Bugfix: Some complex calls (i.e. F/EA4K) were causing a crash unders some conditions. - Bugfix: DX Entity of some complex calls where not properly identified. (Closes issue #8). March 2021 - 1.5 - Added the 8M & 5M bands. - New feature: Added "Adif file deletion" checkbox. User can choose to show or not the message boxes after uploading QSOs. - New feature: New function added to fill automatically the satMode field in satellites Tab depending on upload/download frequencies. - UI: Added EA5WA as Author. :-) - New feature: LoTW confirmation is also counted for DXCC & WAZ. - New feature: DUPES are now identified when coming from WSJTX, ADIF logs, LoTW logs or simply adding a QSO. - New feature: Added a time period to consider a QSO as DUPE if call, band & mode are also the same. (Closes issue #41) - Improvement: Hamlib now supports network communication (TNX DG1VS) - Improvement: Optimized the way DXCC & WAZ are managed. - Improvement: KLog receives the clear messages from WSJTX and is able to clear the KLog UI. - Statistics: Added the Grids on Satellites statistics. - Statistics: Added the DXCC on Satellites statistics. - UI: Removed the QComboBox of the Setup Log tab to select the log. (TNX G4MKT) - UI: Added the QSO per log in the logs setup. - UI: Added a checkbox to keep the Propagation mode, if needed. Propagation mode is also linked to the Satellite tab. (TNX EA5WA) - UI: Added a Help->Online Manual menu or push F1 to go to the Online Manual (Closes issue #52) - Bugfix: Improved the way the QSOs come from WSJT-X. (EA5WA) - Bugfix: Double clicking on a call, while searching made the search to be redefined to that call and the previous search was lost. - Bugfix: Satellite stats where not properly calculated. (TNX EA5WA) - Bugfix: Identifying some bands was not properly done due to the names being in lower case. - Bugfix: When importing an ADIF and asking for a default station callsign, it was only used for the first QSO, leaving the rest without a station callsign. - Bugfix: Stats widget where not being properly created. - Bugfix: The Log combobox on the Statistics was not working. (TNX EA5WA) - Bugfix: End date tooltip updated on the export widget.(TNX G4MKT) - Bugfix: DX Locator tooltip was not OK. (TNX G4MKT) - Translations: Catalan (TNX Txema) & Spanish (EA4K). January 2021 - 1.4.7 - Added the Q65 mode. - eQSL sent is added as Q when received from WSJT-X (github issue #45) January 2021 - 1.4.6 - Bugfix: Improved the way the QSOs come from WSJT-X. (EA5WA) January 2021 - 1.4.5 - Added the FST4 and FST4W modes. - Added the RS-44 satellite. - UI: Changed "Config Dialog" to "Settings". (TNX G4MKT) - UI: Changed QRZ to Callsign. December 2020 - 1.4.4 - Bugfix: QSOs received from WSJT-X may not be saved properly. - Bugfix: ClubLog, eQSL.cc and QRZ.com were losing one setting. (TNX EA5WA) December 2020 - 1.4.3 - Bugfix: PJ7 flag was not being shown in the DXCC widget. - Bugfix: Disabling LoTW made impossible to enable it again via the setup. (TNX G6YRK) December 2020 - 1.4.2 - Bugfix: ADIF export was failing in some circunstances. December 2020 - 1.4.1 - Bugfix: Stat 01-QSO per year was not properly shown when returning from other stat. (TNX EA5WA) - Bugfix: UpLink sat freq was not properly defined when exiting the setup. - Translation: Spanish translation fix. December 2020 - 1.4 - Improvement: Prepared the WSJTX-2.4 UDP interface. - Improvement: User data stored in the setup is know used in the QSOs (default power, station callsign). - Improved the KG4xx (Guantanamo bay) DXCC detection from KG4 calls. - Updated how KLog counts the confirmed DXCC entities to include LoTW confirmations. - New feature: QSO upload to the QRZ.com Logbook (including qso selection and qso mark that has been uploaded) - New feature: QSO upload to the eQSL.cc Logbook (including qso selection and qso mark that has been uploaded) - New feature: ClubLog full log upload (adding or overwriting). - New feature: It is possible to keep the comment field from one QSO to the following one. (TNX EA5WA) - New feature: It is possible to select multiple QSOs in the log and execute several actions with the selected QSOs.(TNX EA5WA) - New feature: It is possible to check for the data of calls in QRZ.com (you need a subscription in QRZ.com) - UI: Removed the Keep my data option from the Setup UI. - UI: The RX frequency follows the TX unless the split is checked. - UI: Consolidation of all the electronic logs configurations in one single setup page into the eLog tab. - Bugfix: Save all QSOs to ADIF process continued even if the user clicked in cancel.(TNX G4MKT) - Bugfix: Backup file was not being created in the right path.(TNX G4MKT) - Bugfix: Some paths were converted to upper case causing some issues in some case sensitive situations. (TNX G4MKT) - Bugfix: In some cases, the RST format was not properly defined.(TNX G4MKT) - Bugfix: Default ADIF file was not being saved on exit. (TNX G4MKT) - Bugfix: It was not possible to select empty logs from the preferences. (TNX G4MKT) - Bugfix: QSOs comming from WSJTx were not being uploaded to ClubLog. (TNX PD9Q) - Bugfix: Too many mesages when uploading in realtime to Clublog. It should be done silently.(TNX EA5WA) - Bugfix: Typo in the INSTALL-linux. (TNX DL4TO) - Bugfix: Hamlib polling rate was not being saved from the setup. Default value is defined to 300ms. (TNX G4MKT) - Bugfix: Complete with previous QSO (name, locator, ...) was not working properly. - Bugfix: PROGRAMID ADIF data was not properly tagged. - Bugfix: When selecting the QSOs to upload to LoTW, if the selected call was the first one on the combobox, selection didn't worked properly. - Bugfix: When importing ADIF files with fields without RST_SENT or RST_RCVD the proposed default value was not adapted to the mode of that QSO. - Bugfix: Extension .adi was always added, even if the file had it already. - Bugfix: When doing a database backup, the name of the file was not being properly defined. - Bugfix: ClubLog realtime syncronization was not working properly. October 2020 - 1.3.2 - Bugfix: Data comming from WSJT-X, when several WSJT-X instances were running was not properly parsed. (TNX 2E0WJW) October 2020 - 1.3.1 - Translations: Croatian (TNX M0NKC). October 2020 - 1.3 - Improved the search widget to make searching much quicker. - Improved the Edit of QSO related to the default QSL sent status. - Improved the QRZ.com & DXHeat.com queries from the log & search window. - Improved the UDP datagram receiver to ensure it is working multicast. - UI: KLog remembers the size of the window from last execution. (TNX EA5WA) - UI: The Station Callsign and number of QSOs in the current log is shown in the windows title.(TNX G4MKT) - New feature: KLog now search for the call as the user enters for previously QSOs with that call. (TNX EA5WA) - Adds an ".adi" file extension to the log ADIF files if not added by the user. (TNX G4MKT) - When reading a log from LoTW, if there are new QSOs not present on the current logfile, KLog offers the option to import them. - Bugfix: It was not possible to add a log if the date and Station Callsign were the same. Now operators and comments are also taken into consideration.(TNX G4MKT) - Bugfix: The export of QSOs without an station callsign defined was failing.(TNX G4MKT) - Bugfix: When reading a log from LoTW, the list of QSOs were not shown at the end. (TNX EA5WA) - Bugfix: Comment in the new log widget was converted to uppercase. (TNX G4MKT) - Translations: Catalan (TNX Txema), Italian (TNX IU5HIU), Spanish (EA4K). Sept 2020 - 1.2.2 - Bugfix: LoTW export was failing due to a wrong SQL sentence. (TNX PD9Q). Aug 2020 - 1.2.1 - Bugfix: ADIF export was not exporting dates with the right format in some eQSL fields. - Bugfix: QSOs were not properly imported when received from WSJT-X. - Bugfix: Pool/Poll typo fixed. (TNX Barry!). - Bugfix: QSO editing - Locator was being cleared from sat tab. - Bugfix: QSO editing - User Inferface was not properly clearedn after editing. - Bugfix: QSOs tag in the Award tab was not properly formatted in Windows OS. - Improvement: ADIF creation has been optimized. - Improvement: All fields received from WSJTX are now added to the log. - Improvement: GRIDSQUARE & MY_GRIDSQUARE ADIF fields are now also exported to LoTW upload. Aug 2020 - 1.2 - New feature: KLog proposes to do a database backup before it is upgraded so data can be recovered if there is any problem. - Improvement: When receiving the status from WSJT-X,the RX frequency is also updated with the same TX freq - Improvement: Dates and Times are now together and it is possible to sort the log based on date & time. Date format has been overall updated. - Improvement: Search is now more confortable as the search does not start inmediately after a key is pressed but some time after so it's possible to enter more letters and reduce the search time. - Bugfix: Fixed the DB update processes. - Translations: Catalan (TNX Txema), Italian (TNX IU5HIU), Spanish (EA4K). May 2020 - 1.1 - Improvement: Search widget has been improved. - Improvement: Callsigns are always checked to be a good callsign before they are saved to the log, imported and exported to ADIF. - Improvement: Removed some death code. - Improvement: If TX Freq & RX Freq are the same, only TX Freq is exported. - Improvement: New functions to check calls when importing ADIF logs. - Improvement: Improved how CTY.CSV (country files) is working. - UI: Widget to show the QSOs to be exported to ADIF & LoTW. - UI: Widget to show the QSOs updated from ADIF & LoTW. - UI: Clear the UI also clears the status of a DXCC in the Band status widget. - UI: Added a checkbox to easily enable/disable the real time in the QSO entry box. - UI: Passwords are now hidden in the UI when entered. - BugFix: Only QSOs are now updated when data is uploaded from LoTW. - BugFix: DXCC & WAZ information was updated twice when removing a QSO. - BugFix: DXCC & WAZ count. - BugFix: Fixed one SQL query on satellite. - Bugfix: Fixed the print function. (JL3OXR). - Translations: Catalan (TNX Txema), Spanish (EA4K). April 2020 - 1.0.1 - BugFix: UTC time was not properly managed, specially in the date. March 2020 - 1.0 - UI: Removed the first column inthe DXCC widget to make it more user friendly. - UI: Created a widget to manage the Main QSO entry to make KLog more modular. - UI: eQSL & LoTW are marked as queued to be sent by default if the user activates it in the setup. - UI: Added the title to some QMessage boxes that were missing. - UI: Improved the usability of creating new logs or editing existing logs in the setup. - New feature: Integrate TQSL to upload QSOs to LoTW directly from KLog. - New feature: You can check a call in QRZ.com by right-clicking in the call from the log. - New feature: You can check a call in DXHeat.com by right-clicking in the call from the log. - New feature: It is now possible to save in a file all the DX-Cluster activity. - Improvement: Added https to the cty.dat download. - Improvement: Added the https to download.klog.xyz - Improvement: Propagation modes are now sorted in the Propagation mode combobox. - Improvement: Four new tips added. - Improvement: eQSL & LoTW dates are updated always that are modified to any status. - Improvement: If a QSO does not have a freq, a default freq based on the band is assigned if edited. - Improvement: Removed some deprecated functions. - Improvement: Improved the way KLog checks for a wrong call (IARU rules applied). - Improvement: Improved the way KLog checks for a wrong IOTA reference. - Removed the functionality to sort the log based on Date & Time columns. - Removed one console message about a duplicated database connection. - Bugfix: It was not possible to include new dxcluster servers in the setup. - Bugfix: The default value of RST in some digital modes using SNR were not properly shown. - Bugfix: In translated instances of KLog, Propagation mode was sometimes not properly saved when no propagation mode eas selected. - BugFix: Locator in SAT widget was not always not correctly evaluated as correct. - Updated translations: Catalan (TNX Txema), Croatian (TNX M0NKC), Finnish (TNX Kristjan), Spanish (EA4K). February 2020 - 0.9.9.1 - BugFix: Bands & modes where sometimes duplicated in the combobox (TNX G4MKT). January 2020 - 0.9.9 - UI: Created a widget to manage the Awards to make KLog more modular. - UI: When starting a new version for the first time, the splashscreen is not hidding other messages anymore. - UI: Removed some not used File menus (New, Open, Save & Save As). - UI: Sorting by date the log is also sorting taking into account the time. - New versions are now found depending on the OS, not just for the sources. - New feature: Added some tips in the Help menu to help the users to get the most of KLog. - Hamlib has now a read-only mode that will read freq & mode from the radio but will never modify/update anything in the radio. - Added some debug log option. - Some code cleaning with cppcheck and compilation warnings removed. - UI: Added a WSJT-X like color schema. - Bugfix: KLog was crashing if the call was completely removed in the Setup. - BugFix: KLog was always logging 59 instead of the real RST. (TNX DB4BIN) - BugFix: KLog was changing the mode in the radio from CW-R to CW if hamlib was active. (TNX G4MKT) - BugFix: KLog was changing freq in the radio in the starting process if hamlib was active. (TNX G4MKT) - Improvement: KLog reads the radio freq/mode when starting. (TNX G4MKT) - BugFix: ADIF export function was not exporting the DARC_DOK properly. - Bugfix: Closes Debian bug: #948911: FTBFS on mipsel. (TNX Lisandro) - BugFix: Editing the log metadata in the setup was not possible. - KLog exit process improved. - KLog start process improved. - DataProxy_SQLite class removed to optimize the code. - Other minor improvements. - Updated translations: Catalan (TNX Txema), French (F4HWL), Spanish (EA4K). August 2019 - 0.9.8.1 - Added the Es'hail / QO-100 satellite. - UI: Satellite list, propagation modes and others are now shown sorted. (TNX Isabel) - UI: Added default values to the infoWidget (Continent, Prefix, CQ, ITU...). (TNX Isabel) - UI: RX/TX Freq in Satellite tab are also in red/black depending on the frequency being out/in of ham bands. - UI: Mode selected is now changing the RST format and default values for some modes. - Bugfix: Editing a QSO to remove a comment was not properly working. (TNX Isabel) - Bugfix: Worked & Confirmed QSO numbers are now aligned in the Awards tab. (TNX Isabel) - Bugfix: KLog.pro is now fixed to compile in Linux. (TNX KB2YSI) - Bugfix: Improved how the DXMarathon was managed when disabled. - Bugfix: Improved how DXCC Award was updated after one QSO was added. (TNX Isabel) - Fixed a bug in the SQL update database. August 2019 - 0.9.8 - New feature: Basic Hamlib support. - Fixed a bug in the SQL update database. - Fixed a bug in the DXCCWidget. - Fixed a bug in the QSO per hour stats. - Added the FT4 mode. - Updated translations: Catalan (TNX Txema), Danish (TNX Joe), Finnish (TNX Kristjan), French (F4HWL), German (TNX Burkhard), Spanish (EA4TV). March 2019 - 0.9.7.3 - TODO: Remove the band 0 / Light from the DB. - UI: KLog warns the user if the frequency used is out of the hamradio bands. - Reworked how freqs and bands are managed. March 2019 - 0.9.7.2 - Bugfix: Frequency boxes did not accepted frequencies higher than 99.999 MHz. (TNX KB2YSI) March 2019 - 0.9.7.1 - Bugfix: The frequency was not properly saved in the DB. (TNX KB2YSI) - Bugfix: The QSO_DATE was not exported into ADIF. (TNX KB2YSI) March 2019 - 0.9.7 - Bugfix: When clicking on Check updates, the dialog froze. - Bugfix: Printing log is not longer showing band in the mode column. - Updated the default date on date boxes to the current date. - Improved the Frequency syncronization between Satellite tab and the main tab. - Improved how default mode is calculated. - Added Satellites widget in Setup. - Updated translations: Catalan (TNX Txema), Danish (TNX Joe), Finnish (TNX Kristjan), French (F4HWL), German (TNX Burkhard), Spanish (EA4TV). December 2018 - 0.9.6 - Optimizing the Statistics widget. - Added some new Statistics widgets. - Fixed some messages with typos. - Bugfix: Fixed a bug preventing to modify a QSO. (TNX KB2YSI). October 2018 - 0.9.5 - Added a dot at the end of all the tooltips. - Updated the Satellite database (TNX KB2YSI). - Some queries optimized. - Bugfix: You can nor close the About KLog window from any tag (TNX F4HWL). - New feature: KLog shows some statistics of your log: Tools->Stats - New feature: It is now possible to update the satellite data reading a sats.dat file: Tools->Update Satellite Data. - Satellites file (sats.dat) updated to september 2018 (TNX KB2YSI). - New translations: French (TNX F4HWL) and German (TNX Burkhard). - Updated translations: Catalan (TNX Txema), Croatian (TNX M0NKC), Finnish (TNX Kristjan), Spanish (EA4TV). August 2018 - 0.9.4 - WSJT-X support to receive logged QSO and realtime data. - Check bool DataBase::updateTo012() / it was always returning true without any action. - Syncronize RX Freq with the satellite downlink combobox. - Focus is back to search line edit when right click on the list of found QSOs. - Update process has been improved. - Some warnings removed from compilation time. - Bugfix: Date was not properly calculated and UTC settings was not applied. That may create wrong date QSO when date changes due to UTC (TNX AC1DW). - Bugfix: When adding a QSO, if the QSL is marked as received, KLog showed a SQL error. - Bugfix: Table qsl_via needed to be renamed (TNX EA6ZS). - Bugfix: Some DXCC status were nor properly calculated. - Updated translations: Catalan (TNX Josep), Croatian (TNX M0NKC), Danish (TNX Joe), Spanish (EA4TV). April 2018 - 0.9.3 - Double clicking on DXCC Widget name of the Entity will show the QSO is providing that status on the Search widget. - Added DXCC support for Kosovo. - Bugfix: Default band & mode are now defined as the most used band and mode. - Bugfix: TX frequency was not saved. - Bugfix: In the dxcc status widget, some countries were showing the UN flag unappropriately. - Bugfix: When updating the CTY file, query errors were shown on world.readCTYCSV function. - Bugfix: When editing the QRZ, the cursor position was not properly maintained. - Bugfix: Fixed the flags of several DXCC entities that were not correctly shown. - Bugfix: DXCC Status widget was not listing all the DX entities. - Bugfix: Modes & Bands where not always properly updated from the Setup. - Bugfix: Adding new QSO that implies a DXCC or WAZ status already worked failed. - Bugfix: Updating the WAZ status was not always possible due to a incorrect DB query. - Updated translations: Danish (TNX Joe), Spanish (EA4TV). January 2018 - 0.9.2.9 - Bugfix: Adding new QSO that implies a DXCC or WAZ status already worked failed. - Bugfix: Modes where not properly added from the setup (TNX KB2YSI). - UI Change: Freq in the Satellite tab is now not deleted when a new QSO is added. - New translation: Catalan by Josep (Thank you!) - New translation: Finnish by Kristjan (Thank you!) January 2018 - 0.9.2.8 - Important Optimization on KLog speed on start and general use. - New satellites (AO-91 & AO-92) added. - Added ALL the ADIF 3.0.7 fields (except the _INTL ones). - New feature: New menus to export ADIF files for LoTW and manage LoTW status. - GUI: Implemented an error reporting for the users for main errors - GUI: When a satellite is selected the main bands are automatically proposed. - GUI: QSO band is now linked to the uplink & downlink bands in the satellite tab. - Bugfix: Some ADIF fields were not properly imported/exported. - Bugfix: When searching calls like 1A0XX, 2E0XX, ... no results were found but there are with 3D0XXX - Bugfix: If an empty log was selected on config file, on next KLog start KLog crashed. - Bugfix: Doubleclicking on the log to edit was sometimes causing the band/mode data to be shown as a number instead of the human readable name. - Bugfix: Windows version did not detected the DB movement correctly. - New translation: Polish by LA7RRA (Thank you!). - New translation: Danish by Joe (Thank you!). - Updated translations: Croatian (TNX M0NKC), Italian (TNX IU5HIU), Spanish (EA4TV) - Several internal updates. September 2017 - 0.9.2.7 - KLog offers the possibility to move the DB to another path (maybe a DropBox folder!) - New Operating systems recognized in runtime. - Updated the references to macOS from OSX. - Updated the list of valid modes up to ADIF 3.0.6. - Updated the list of valid propagation modes up to ADIF 3.0.6. - Update the 136KHz band limits to the new US licenses. - Optimized the speed of printing the log. - GUI: Added the QSO information done in a year on the DX-Marathon area. - GUI: Simplified the way active bands/modes are selected. - GUI: Satellite tab is redesigned. - GUI: Created a widget to manage all "eQSL" simplifying implementation of the main widget. - GUI: Created a widget to manage the Log, simplifying implementation of the main widget. - GUI: Created a widget to manage the Search, simplifying implementation of the main widget. - GUI: Added a SplashScreen on KLog start to show the user the starting process. - GUI: If the user adds a frequency in the TX Freq box that is not a currently used band, it is automatically added to the band seletion widget. - BugFix: Fixed how new logs were added to the DB. - BugFix: Identification is a band was HF or VHF was not always properly done. - BugFix: Higher bands where not shown to be selected in the preferences. - BugFix: DB updating function (009) blocked the execution of KLog the first time it was executed. - BugFix: Language message if English is the System language is no shown anymore. - New translation: Italian by IU5HIU (Thank you!). - Translations updated: Original English (TNX JustinBRye, from Debian-10n-english), Spanish (EA4TV), Japanese (TNX JL3OXR). May 2017 - 0.9.2.6 - Check updates feature added. On start or when user desires KLog checks if there is one updated version available. - Simplified the way new logs are added, importing the general StationCallsign & Operators as default for new logs. - Improved the way first start was managed when no entity information was loaded. - GUI: Application icon is now shown in the application windows. - GUI: Updated some messages & tips. - GUI: DXCluster offers the Station Callsign as default value to connect. - GUI: Some menu minor reorganization. - Console: Added a few commands to the console command. - Changed the World class to be able to import files from any folder. - Changed how some non ARRL valid entities are managed to show the common name (Sicily / Italy) - BugFix: When manually importing a new CTY.CSV, although data was updated, it was not shown until next KLog start. - BugFix: In the others tab, the DXCC was sometime not correctly identified. - BugFix: Update on the DXCC widget caused no data to be shown if some columns were selected. - BugFix: Identification is a band was HF or VHF was not always properly done. - BugFix: Some improvements in data quality when exporting an ADIF file. - BugFix: When importing an ADIF file, if the file was not correct it was not possible to cancel the whole importing process. - Some minor changes on source code to optimize and improve. - Translations updated: Croatian (TNX M0NKC), Japanese (TNX JL3OXR) & Spanish (EA4TV). Nov 2016 - 0.9.2.5 - BugFix: ADIF export function was not exporting the correct BAND & MODE data. Sep 2016 - 0.9.2.4 - GUI: Created a DXCC status where all the DXCC entities are listed showing the working/confirmed status. - GUI: Created a Satellite list including (up to now) only LOTW compatible satellites. - GUI: Created a widget to manage all "My Data" simplifying implementation of the main widget. - GUI: Bands in the combobox are always shown correctly ordered (botton-up). - GUI: Improved the LOTW date management (TNX JL3OXR). - BugFix: Preferences->Misc: It was not possible to edit the default filename. (TNX K6XT). - BugFix: Added the Power unit (W) to the power box. Debian bug #654332. - BugFix: When editing a QSO in some text boxes text was reused from previous QSO and data could be corrupted. - BugFix: Minor bug in WAZ management. - BugFix: When managing logs in the setup is was not possible to edit the log data as a new log was always created. - When starting KLog for the first time, the setup guidance has been improved. - When selecting an entity, different from the proposed on country file, KLog asks the user which one to use. - Operator from the selected log is used as default when entering QSO (as station callsign). - Japanese translation updated. (TNX JL3OXR). - Spanish translation updated. - Some cleaning in the code. Jan 2016 - 0.9.2.3 - Improved the way translations are managed (Specially in Linux). - Icon application is now shown in OSX & Windows. - New translation: Japanese by JL3OXR (Thank you!). - Bugfix: Some strings where not defined to be translated (TNX JL3OXR). - Bugfix: Some tips in the UI where not correctly placed (TNX JL3OXR). - Bugfix: QSOs in JT9 were not properly imported from ADIF (TNX EA3XQ). - Bugfix: Logfiles with the in the first line, following some test were not properly imported. Nov 2015 - 0.9.2.2 - Translations are now working properly in Windows & OSX. - New translation: Catalan by EA3NM (Thank you!). - Ported from Qt4 to Qt5. - BugFix: Aether ADIF files could not be properly imported. (TNX AA5VU). - BugFix: QSOs where not properly shown in the search box. - BugFix: When started for the first time, no modes were shown as default. - BugFix: CTY.CSV was not properly updated. - BugFix: When upgrading the mode information in database some modes where not properly updated. - GUI: Changed the year to show the full number to avoid problems with old QSO. - Import ADIF functionality is improved to support importing of logs with some missing data. - Removed the Spot button until its functionality is implemented. Sep 2015 - 0.9.2.1 -BugFix: Band & Mode information was not properly stored. Aug 2015 - 0.9.2 - Bugfix: An ADIF file with one blank line and one QSO used to froze KLog. - Bugfix: Minor bugfix in the definition of propagation modes. - BugFix: When editing a QSO the name was not shown. - BugFix: STX_String field was not always imported properly. - BugFix: Fixed a minor bug in log table regarding the prop_mode foreign key. - BugFix: Improved the color & status shown of a QSO on the DXCC. - BugFix: DXCluster: Fixed a bug that caused the colors to appear always as new one. - BugFix: DXCluster: The option to show only not confirmed was not working correcty. - BugFix: IOTA reference was not saved when entering a QSO. - BugFix: BIGCTY.DAT was not properly download in KLog first start. - GUI: Added some shortcuts in the preference widget. - GUI: DXCluster: Add a suggestion to hit enter if no password is expected for the cluster. (tnx AA5VI) - GUI: DXCluster: Warns you if the spot is needed for the current year DX-Marathon - GUI: Added a Propagation Mode Combobox. - GUI: Prop_Mode combobox automatically goes to SAT if sat name or sat mode are defined. - GUI: Added a Find DX-QSL requested option. - Added the 630M & 13CM bands. - Updated Mode & submode definition up to ADIF 3.0.4. - Special CQ & ITU zones in some calls are now identified. - KLog is able to import QSOs with no BAND field if FREQ field is present. - KLog offers the user a default value if RST_TX or RST_RX field is not present when importing. - Support of realtime upload, modification & removal of a single QSO to/from ClubLog.org. - Updated the DB with the PROP_MODE options. - Improved the way KLog manages & shows the bands & modes. - Removed the option to choose to run in memory or file in the start wizard. KLog will run always using a file for the DB. - Added an auto complete option to auto-complete info (QTH, Locator, Name, QSL Manager & IOTA) from previously worked QSO. - Cleared the world.cpp file. - Some minor performance improvements. Apr 2015 - 0.9.1.1 - Bugfix: Editing a QSO with satellite data was not properly done and caused some errors. Apr 2015 - 0.9.1 - Bugfix: Fixed DataBase::getBandIdFromFreq it was not ansswering properly. - Now checks if band & frequency are coherent before adding a QSO. Band wins. - All Satellite QSO include the PROP_MODE ADIF tag to make it compatible with LOTW. - Improved the DXMarathon code. - GUI: Added basic Satellite support. - GUI: It is possible to mark a QSL sent via bureau/direct & DX QSL as requested with one action from Search box. - GUI: KLog request a valid QRZ and at least one first logtype to start using it. - KLog supports the management of several logs, being possible to edit, remove and select the one to use. Jan 2015 - 0.9.0.3 - Bugfix: ADIF was not properly imported when Fields where using the Type of data optional field preventing logs from Logger32 being imported. (TNX EB1TR) - Bugfix: QSL Sent/Received status in the search box were switched. - Bugfix: CTY.CSV was not updated if the file was already existing. - Bugfix: Entity DB was not updated when CTY.CSV was updated. - Bugfix: Search results showed the default Station Callsign if non was in the QSO. This lead to errors if QRZ was not the default. - KLog recognizes now .ADIF files (instead of only .ADI). - KLog shows now the WAZ status. - Added a very basic support of DX Marathon (http://www.dxmarathon.com/). - DXCluster filters are now working. - The user can manually assign the DXCC entity for a DX. - Improved the function to update the DB from one release to the following. - DB file is compressed everytime KLog finishes. - It is possible to find QSL pending to receive. - It is possible to modify entities data in the World Editor in preferences. - It is possible to choose in preferences whether to keep my Data Tab from one QSO to the next or not. - GUI: A tooltip is shown in the search results showing the DXCC name / CQ zone. - GUI: Added a button to rescore awards. - GUI: Added a button to update the search Box without modifying the text. - GUI: Updates Bearing/distance/... when changing Locator. - GUI: When the QRZ lineedit is blank or the clear button is clicked, entity info is deleted (beam, distance, ...). - GUI: The IOTA continent is updated when the QRZ is modified. - GUI: DXCluster input is disabled when not connected. - GUI: Corrected the behaviour of the status bar. - GUI: Added primary & secondary subdivisions in the Others Tab. - Some other minor fixes. Nov 2014 - 0.9.0.2 - Bugfix: Right-click on search result sometimes caused KLog to crash. Nov 2014 - 0.9.0.1 - Bugfix: Selected DX-Cluster servers were not used to connect. (TNX DL6FBS) Nov 2014 - 0.9.0 - Ensures the ASCII requirement of ADIF. - Updated the Preferences dialog. - Added the About Qt help menu. - Bugfix: Selected DX-Cluster servers were not used to connect. - Bugfix: When selecting QSL received/sent with right click, date was not updated. - Bugfix: Fixed the FileManager::adifReadLog to be able to read logs with several lines per QSO. - Some other minor bugfixes. - New feature: It is possible to show Imperial System (Miles instead of Km) data. (TNX - KF5JNU) - New feature: It is possible to mark/look for & export requested QSL. - New feature: It is possible to automatically mark(or not) a QSL as requested by the DX when the DX's card is received. - New feature: It is possible to show (or not) the callsign used in the search box. - New feature: KLog uses bigcty.csv for normal DX & will use cty.csv for contesting. Apr 2014 - 0.7.1 - Backport to Qt 4.8. - Download the http://www.country-files.com/cty/cty.csv instead of cty.dat (with no ARRL id). - Capable to read cty.csv to get the info of the ARRL id. Apr 2014 - 0.7.0 - Full rewritten software based only in Qt. NO KDE dependency. - KLog can now run on Linux, OSX and Windows. Nov 2013 - 0.6.2 - Bug fixed: Under some conditions, KLog crashes when entering a new QRZ. (TNX LW1EQI). - Bug fixed: IOTA data was not properly cleared when clicking the Cancel button. - Bug fixed: QSL combobox content was not properly managed. (TNX DF4FH). - Bug (gui) fixed: IOTA continent is now "automagically" detected... again (a bug prevented this functionality). - GUI updated: You can click on RX or TX Frequency buttons to copy the frequency to the other one. - GUI updated: You can select eQSL in the QSL combobox as an option to mark the QSL information of a QSO. - GUI updated: Two new shortcuts: CTRL+W: deletes the current QSO. CTRL+Q: to (quick)edit the last QSO added. - GUI updated: Minor tab reorder. Jun 2013 - 0.6.1 - Bug fixed: Locator was not properly calculated due to a sign difference management from KLog and CTY.DAT. - GUI updated: The cursor position management of the QRZ box has been improved to ease the operation. Jan 2013 - 0.6.0 - Bug fixed: Typo "Frecuency" changed to "Frequency" in a tooltip. (Debian bug: #654328) (TNX Jonas Stein) - Bug fixed: Typo/wishlist "Numb" changed to "Number" in main table. (Debian bug: #654331) (TNX Jonas Stein) - Bug fixed: Typo/wishlist "UTC" changed to "Time" in main table. (Debian bug: #654331) (TNX Jonas Stein) - Removal of several not needed #includes. - Removed some warnings on compilation. - GUI improved: The information boxes are now independant from the top right tab widget to improve usability. - GUI updated: Disabled the Setup tab of Hamlib until hamlib is properly working. Jan 2012 - 0.5.9 - Bug fixed: When starting for the first time, the CTY.DAT file downloaded had a loop that was not properly managed. (Debian bug: #653697) (TNX Jonas Stein) - Fixed some typo: "Km" changed to "km". (Debian bug: #6536978) (TNX Jonas Stein) Dec 2011 - 0.5.8 - Bug fixed: Right button in the search result did not "sent" the QSL card. - Bug fixed: Closing the window did not ask to save data before exit. (TNX EA7HEG). - Bug fixed: Beam was not properly calculated. (TNX DL6FBS). - Bug fixed: Minor problem of APP_KLOG_NUMBER ADIF header fixed. - Bug fixed: When modifying, some fields did not accepted empty fields (deleting). (TNX VK4JAZ). - GUI updated: Remove the map tab in the main GUI as it is still not implemented. - GUI updated: Ordered the tab-switching to make it more usable. (TNX Cedric). - Added the support for QRP. Power has two decimals. (TNX VK4JAZ). Nov 2010 - 0.5.7 - New feature: Added the Export needed QSL that allows to create an ADIF file with all the QSO with new ones and new bands still not confirmed that has not been QSLed. The objective is to export it to a QSL or label printing software (until KLog implements that feature). - Updated translations: SV by SM4ABE. - GUI improved: Added sliders to be able to move panels. - GUI improved: Changing the band combobox changes the TX Freq box and viceversa. - Minor fix: The PROGRAMVERSION tag in log was not properly formated. Jul 2010 - 0.5.6 - Fixed the hamlib compilation scripts (CMakeLists.txt, FindHamlib.cmake). (TNX AB4BD). - Fixed one bug that causes some architectures not to compile. - Fixed some permisions and other warnings for Fedora packaging. (TNX N3LRX). - BUG fixed: Setting QSL from the log with right button was not working. May 2010 - 0.5.5 - New feature: If cty.dat file is not found, KLog offers to download from the web. - New feature: New tool to update the update the cty.dat file from the web. - New feature: QRZ font color changes to red if has been worked previously. (Proposed by KE7TDY) Mar 2010 - 0.5.4 - Small fix to initialize a variable before using it.(realTimeLog in klog.cpp) - Fixed a bug that caused KLog to crash of no cty.dat file was found (bug #016917)(TNX KA6MAL) Feb 2010 - 0.5.3 - Fixed a bug that caused modified QSO not being updated. - Fixed a bug in the way the band & mode combobox managed the data. Feb 2010 - 0.5.2 - Fixed a bug that causes a crash when connectiong to DXCluster. (bug #016653) - Added a very basic Satellite support. - Removed the Freq LCD and added two new editable widgets: Freq TX and Freq RX. (bug #016609) - Added again the entity count of /M stations. Jan 2010 - 0.5.1 - Fixed a bug with the display of the Date. Dec 2009 - 0.5.0 - Migrated to Qt4. - Updated translations: SV by SM4ABE, DE by DL5PD, ES by EA4TV. - ZL2ACG joined the KLog team. Welcome and thank you Andrew! Apr 2009 0.4.7 - New feature: Import cabrillo logs. - Improved the ADIF compatibility up to ADIF 2.2.2. - BUG fixed: Improved the confirmed QSO accounting. - BUG fixed: RST format were not changed when another mode was selected if the CALL was empty. (TNX Alvaro, EA4RCT). - BUG fixed: Calls like F0XXX/TU8 were not recognised if written as TU8/F0XXX. - BUG fixed: TX_PWR is only saved when bigger than 0w :-) - BUG fixed: Prefixes were not properly managed and some information, as the STATE from ADIF files were not always well imported. - BUG fixed: Related with the ADIF saving CQ & ITU zones for QSO. It was not properly saved but can be recovered from the CALL. Dec 2008 - 0.4.6 - BUG fixed: Printing was not properly working due to library actualization. - BUG fixed: Fields STX/SRX/STATION_CALLSIGN/CONTEST_ID were copied from one QSO to the following one. Nov 2008 - 0.4.5 - GUI fixed: Changed the order of the input fields tab switching. - GUI fixed: Corrected the layout to fix the screen as ITU was not properly shown. - GUI improved: Added a new one color to differ a completely new one spot in the DX-cluster from a needed in a band. This last improvement is specially usefull in the search QSO to QSL. Test it! - GUI improved: Added a tab in the botton box with the DXCC status (only main HF bands). - New feature: Added the possibility to choose to show or not DX Spots based on CW/SSB activity. (TNX EA7BJ) - New feature: Added the support of the 0.136KHz and GHz bands (not to the GUI but KLog can process them). - BUG fixed: Minor check on QSL sent date was not properly done (no data lost). - BUG fixed: Some Entities & zones where not properly recognized. - BUG fixed: The state (needed/worked/confirmed) was not always properly shown. - Improved the way is readed the cty.dat file and added support for its new format. - Improved the ADIF compatibility supported fields, band frecuencies, modes... - Improved the QSO merging with previous data. - Updated translations: English, Spanish, TNX: Swedish (SM4ABE), German (DL5PD). May 2008 - 0.4.4 - BUG fixed: KLog now recognises a "/LH" LightHouse stations (TNX G3OAG) - BUG fixed: TLF import did not show the imported QSO in the log. QSO were not lost, just not shown. They were added to the logfile and saved when saving. No data was lost. This bug was introduced in release 0.4.2 after an optimization in the logfile reading. BUG: Frequency was not compliance with ADIF as was saved in KHz instead of MHz. - BUG fixed: If a logfile does not provide a MY_GRIDSQUARE, KLog does not add the predefined MY_GRIDSQUARE. - BUG fixed: Some GRIDSQUARES were not detected as wrong althought they were. - Minor fix: Corrected the URL to CTY.DAT file in the start message. - GUI improved: Added a progress dialog when saving. - GUI changes: Some widgets have been changed to prepare for the Qt4 migration. Specially the Led near the QRZ box that will reapear as usual when KLog is migrated to Qt4. - Added the 70Mhz band. - New feature: New tool added "Merge QSO data" that looks in all the log for the QSO that has been worked more than once and merges the data like Name, QSL info, QTH, Locator, ... The information comming from all the appearances of a call in the log is grouped in the first appearance of that call in the log. Jan 2008 - 0.4.3.1 - Package fix: Distributed with the language (po) files. Jan 2008 - 0.4.3 - BUG fixed: KLog copied the QSL sent date into the QSL rec date. Only QSL rec date was lost but not the QSL status. - BUG fixed: KLog now recognises a "/J" (Jamboree On The Air) Scout Station. - GUI improved: Added the cty.dat URL. Sep 2007 - 0.4.2 - New feature: The user can now configure to require or not the mandatory data for each QSO (QRZ, date, time, band, mode, RST tx & RST rx. (if not all the mandatory fields are entered, KLog's behaviour may be unexpected). - New feature: Klog creates a temp file (~.klog/tempklog.adi) where it saves automatically all the QSOs entered until the log is manually saved. It prevents the log to be lost in case of unprevented KLog/computer failure. (TNX SM5OUU) - BUG fixed: If the field (maybe any other field too) COMMENT is more than one line long, the log is broken and cannot be read. (TNX SM5OUU) - BUG fixed: KLog does not ask for the file name if you have previously opened one file and the name has not changed. - BUG fixed: In the GUI, the "Preferences" is correctly shown and not as "&Preferences". - BUG fixed: When modifying a QSO, the number of QSOs was incremented when the user click over OK. - BUG fixed: If a QSO was deleted the awards/number of QSO where not decresed. - BUG fixed: When the date - GUI improved: Deleted the WAE box (the WAE calculations was not implemented). - New translation: KLog is now also in Swedish.(TNX SM4BE) - New translation: KLog is now also in Galician.(TNX Fuco Mera) - Updated German translation.(TNX DL5PD) - Updated Spanish translation. Dic 2006 - 0.4.1 - Bug fixed: The distance and beam is also resetted when the call box is deleted. - Bug fixed: Calls /M and /MM do not count for DXCC.(TNX SM5CNQ) - Bug fixed: It is possible to filter only for needed entities spots. - Change: The hamlib signal meter has been removed from the GUI. - New feature: There is a new tool available to find QSO from which the QSL is needed that you have still not sent the QSL. Very useful to find which QSL you need to send first! - New feature: The MY_GRIDSQUARE is managed by default by all QSO (saves the default if none is entered) Sep 2006 - 0.4.0 - New feature: It is possible to manage user-created local awards (TPEA, DOK, WAS, ...) KLog reads user defined awards in a special format. - New feature: KLog reads ".adif" files also.(TNX DL5PD) - New feature: It is possible to add/delete new DXServer clusters in the setup box.(TNX DL5PD) - GUI Improved: IOTA continent is now "automagically" detected. - Bug fixed: Not really a bug but now, the log is cleaner as it does not save the "STATE" for ALL the QSO, only does it if needed. - Bug fixed: After modifying a QSO the band and mode did not return to the last used (TNX DL5PD). - Bug fixed: If the band changed, without any call in the Call box, KLog showed "new one, work it" - Bug fixed: If the band changed, when modifying KLog fooled the entity color band boxes. - Bug fixed: KLog recognises /MM as maritime mobile station - Bug fixed: When opening a new log, the number of QSO did not start from zero. - New translation: KLog is now also in German.(TNX DL5PD) Jan 2006 - 0.3.3 - New feature: It is now possible to sort the log by numbers from the main log. - New feature: The frequency box is now also used when no hamlib support is active (double clicking over a dx-cluster spot. - New feature: If file name does not end in .adi, add the .adi. - Bug fixed: Reporting a bug does not crash KLog although the widget has been temporally/drastically simplified. - Bug fixed: It is possible to select the radio from the setup. - Bug fixed: (introduced in 0.3.2) It was not possible to activate the progress dialog. - Bug fixed: When clicking over "New File", confirmed entities was not set to "zero". - Bug fixed: When reading from cty.dat file, the prefix was reading with some spaces at the begining. - GUI Improved: After pressing OK/clear button, the QRZ box is selected. (TNX P.H. Rankin Hansen) - GUI Improved: You can now reach to Name&QTH using the tab key (TNX P.H. Rankin Hansen) - GUI Improved: QTH/Locator is now on the main QSO tab (TNX P.H. Rankin Hansen) Apr 2005 - 0.3.2 - New feature-(unstable): Hamlib support to control/read the rig from KLog. - New feature-(unstable): It is possible to click over a DX-Spot and set the radio to that frecuency & mode to work the spot (hamlib). - New feature-(unstable): KLog reads the frecuency, band, mode and signal from the radio in real time (hamlib). - New feature: After QSLing using the Right Button option from the search box, the search box is updated so the QSL status is shown updated. - New feature: Local operator callsign can now be also logged. - Bug fixed: A call ending in /B is now correctly recognised as a beacon. - Bug fixed: Now it recognise all the "special suffix" like /r Rotuma, /a Mount Athos,... - Bug fixed: WARC Bands were not correctly detected. - GUI improved: The QRZ box always shows the QRZ as uppercase. (TNX ea4eej) - Bug fixed: KLog can now read ADIF files where the QSO can be in several lines. - Bug fixed: Importing from tlf, the QSO count was not properly done because of the comment lines. Jan 2005 - 0.3.1 - KLog has been optimized and now runs faster. - New feature: KLog saves the date/time of the last log file save. - New feature: KLog ask the user for a comment when Importing a TLF log (for example to note that those QSO are from an specific contest or whatever). - Bug fixed: When selecting a DX-Spot from the DX-Cluster it did not overwrote the name. - Bug fixed: When writting the log, there was an space missing before the . It is just a "cosmetic" fix, not a real bug. - Bug fixed: The same with the QSL card status. - Bug fixed: KLog now recognises all the prefix that appears in cty.dat file with special CQ/ITU zones. - Bug fixed: KLog recognises the special call "3XDQC/P" as "3X" although it does not follow the "prefix+number+suffix" pattern - Bug fixed: When starting it now looks the cty.dat file in: ~/.klog and in the current directory before starting without Entities' data. (TNX oh7jjt) - Bug fixed: If we are modifying a QSO, the search box is not updated. Avoids some crashes. Nov 2004 - 0.3.0 - Fixed source code to allow compiling in more architectures. - New feature: It is possible to show a progress dialog when opening the log file. This is configurable. - New feature: It is now possible to hide/show WARC spots or announces from cluster. - New feature: Printing the is now possible. - New feature: Sorting the log file is now possible. - New feature: New option in right button to send&rec QSL at once. - New feature: If a CALL has been previously worked it shows data to the actual QSO. - Fixed bug: When modifying, the QTH was not modified. - Fixed bug: It did not make you save if you just modify a QSO. - Improved the gui: The "T" (from RST) does not disappears but is disabled when is not needed. (TNX Ferm�n H.). - Improved the gui: The QSL info text box is always active. - Improved the gui: When connecting to the DX-Cluster server, automatically sets the DXCluster window as active. May 2004 - 0.2.9 - New feature: Selection of a DX-Spot shows the Entity data and state. - New feature: KLog checks and captures the output of a sh/dx command in cluster. - Fixed bug(caused in 0.2.8): QRZs as KA3AA, when the prefix is just one letter but the call uses two are now well recognised. - Fixed bug: Better recognision from /number calls from DX-Cluster. Mar 2004 - 0.2.8 - Fixed bug: Now ignores comments in TLF's files. - Fixed bug: QRZs as VP2MCV, with complex prefixes are now well recognised. - Improved the gui: RST, Power size adjusted. (TNX ea1ddn) - Improved the gui: Name and QTH moved to QSO tab. - Improved the gui: QSL via bureau is now the default option. (TNX ea1ddn) - New feature: Calculate distance and beam if locator is entered. (TNX ea1ddn) - New feature: Auto-open logfile when starting is now possible. (TNX ke6sls & ea1ddn) - New feature: Now it is possible to double-click over a DXCluster spot to copy it to the QSO input box. (TNX ea1ddn) - New feature: In the search box, QSOs are colored indicating if worked, needed, ... Jan 2004 - 0.2.7 - Fixed bug: When editing a QSO, the QSL date was not properly displayed. - Fixed bug: When entering a QSO, if the band is changed, KLog checks the state in this new band. - Fixed bug: RST (tx&rx) in ADIF was always length 3, now is calculated for every QSO (at writing). - Fixed bug: When modifying if QSL rec, the date was shown as 00/00/0000 - New feature: It is posible to select a default mode & band in the setup. - First Icon draft created. Dec 2003 - 0.2.6 - Fixed bug: When Non real time logging was setting the time was "real time" when modifying. (TNX rz3dfs) - Fixed bug: When reading the log file if an entity was not recognised Klog used to crash. - Fixed bug: Now we recognise calls like 3XY1L when reading from a log file. - Fixed bug: Improved the way of checking the confirmed/worked entities. - Fixed bug: /P, /M and /QRZ are now better recognised when reading from logfile or clicked. - Fixed bug: Stats were not shown after importing a tlf log file. - Fixed bug: The zone & entity numbering fixed. - New feature: It is posible to setup a default power level. - New feature: When receiving a qsl with the mouse's right button the numbers are updated. - New feature: Also a default color is selectionable as non-info color. - Improved the gui: Band info leds removed to gain space in the info widget. Aug 2003 - 0.2.5 - Fixed bug: RST was changed so when entering SSB RST. Entering 590 -> showed 509. (TNX ke6sls) - Fixed bug: In cluster some frecs (432MHz and 2190m) were not properly recognized. - New feature: It is now possible to hide HF/VHF/ANN spots or announces from cluster. - New feature: It ask for the file name when saving first time instead of using "klog.adi" as default. (TNX ke6sls) - New feature: It is now possible to add QSO in non real time (to add previous QSOs). (TNX yu1is) - New feature: Power value is remembered from previous QSO. (TNX ke6sls) - New feature: Basic bug report system. (TNX ke6sls) - New feature: Mode selection affects to the RST configuration (TNX yu1is & ke6sls) - New feature: Colors for confirmed/worked/needed are configurable by the user. - New feature: Added tips to many widgets to explain their functions. Jul 2003 - 0.2.4 - Fixed bug: Some calls were not recognized when checked (as 3da0sv). - Fixed bug: When opening a second log having a previous one KLog did not ask for saving if needed. - New feature: Basic Setup dialog and functions. - New feature: Now the band combo change checks automatically the entity state. - New feature: Smart cluster tells you if a dx spot is needed, worked and/or confirmed using colors. - New feature: Clock is now in UTC by default but can be changed in preferences. Jul 2003 - 0.2.3 - Improved the gui: The "entity state" LED has been moved to a always seen zone. - Improved the gui: The way to edit QSO. - Fixed bug: When searching it showed a wrong name and a qth. - New feature: Basic DX-Cluster support. - New feature: It is possible to add a log file to the current log. - New feature: QSO deletion. - New feature: QSO selection's data is shown in the show box. - New feature: You can delete qso & manage qsl from the list with righ button quickly & easily. Jun 2003 - 0.2.2 - Changed the behavior of the search box to look not only for complete calls but characters. - Fixed bug: Improved the GUI layout. - Fixed bug: When editing a previous QSO the date was not always properly saved. - New feature: Added real time clock. Mar 2003 - 0.2.0 - New feature: Added search for QSO tab. - New feature: Added Name field. - New feature: Added QTH field. - New feature: Added operator (self call) field. - Fixed bug: When saving log to file comment is not saved if there is no comment. - Fixed bug: When selecting a "portable" (/P) (or /number) qso in the list it didn't recognize the entity. - Translation updated: pt_BR. Mar 2003 - 0.1-beta02 - Added many modes and some more bands. - New feature: Asking for saving when finishing without save. - New feature: Asking if overwrite when saving as to an existing file. - New feature: The main led only shows info about the current band. - New feature: Band/Mode sticky between contacts. - New feature: Added the long path beam and distance. - New feature: You can track each entity state per band with leds. - New feature: Basic WAZ award support. - Fixed bug: If you had a log and started a new one, the DXCC kept the data. - Fixed bug: The IOTA number was limited to 99 (now 999). Feb 2003 - 0.1-beta - New feature: Led is green (new one), yellow (worked but not confirmed), red (confirmed). - New feature: Support calls as EA4TV/EA8, EA8/EA4TV. - New feature: Import TLF logs. - New feature: Added beam and distance calculations. - New feature: Added Locator & IOTA fields. - New feature: Basic DXCC award support. - Improved the search the Entity algorithm (much quick). - Clear button shows "Cancel" when modifying. - Changed many classes from Qt classes to KDE classes. - Fixed bug: Some times the QSL was checked automaticaly. - Fixed bug: The Mode combobox showed SBB and it is SSB. - Fixed bug: some calls showed as worked before and they were not. Jan 2003 - 0.1-alpha - Fixed bug: When modifying a QSO it was not shown in the log box. - Fixed bug: If you clicked over the log box but not over a qso, the program crashed - Fixed bug: When modifying a QSO the date was always set to "now". - Now you can select what log file you want to open. - Now you can select the file's name when saving the log. - Now you can create a new log always you want. - Logs are now stored in ~/.klog directory by default. - Logs are saved as klog.adi by default. - Some prefix were not found in previous version. - QSL date is activated when a QSO is selected - QSL via is working, manager field, and QSL info field 22-Jan-2003 - 0.1-pre-alpha - First "release" of the software. - You can add/edit QSOs and save/read your log to/from the disk with a fixed name in ADIF format. - Can manage QSL sent/rec. klog-2.3.3/widgets/0000755000015700001710000000000014542412415014003 5ustar jenkinsjenkinsklog-2.3.3/widgets/adiflotwexportwidget.cpp0000644000015700001710000006133614542412415020777 0ustar jenkinsjenkins/*************************************************************************** adiflotwexportwidget.cpp - description ------------------- begin : July 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "adiflotwexportwidget.h" AdifLoTWExportWidget::AdifLoTWExportWidget(DataProxy_SQLite *dp, const QString &_parentFunction, QWidget *parent) : QWidget(parent) { #ifdef QT_DEBUG //qDebug() << ": " << _parentFunction; #else #endif (void)_parentFunction; //qDebug() << Q_FUNC_INFO << " - Start: " + _parentFunction; dataProxy = dp; starting = true; util = new Utilities(Q_FUNC_INFO); util->setLongPrefixes(dataProxy->getLongPrefixes()); util->setSpecialCalls(dataProxy->getSpecialCallsigns()); stationCallsignComboBox = new QComboBox; myGridSquareComboBox = new QComboBox; startDate = new QDateEdit; endDate = new QDateEdit; okButton = new QPushButton; cancelButton = new QPushButton; tableWidget = new QTableWidget; topLabel = new QLabel; numberLabel = new QLabel; selectedEMode = ModeLotW; //By default this widget will be used for LoTW Export. defaultStationCallsign = QString(); defaultMyGrid = QString(); numOfQSOsInThisLog = 0; util->setLongPrefixes(dataProxy->getLongPrefixes()); util->setSpecialCalls(dataProxy->getSpecialCallsigns()); createUI(); starting = false; qsos.clear (); //qDebug() << Q_FUNC_INFO << " - END"; } AdifLoTWExportWidget::~AdifLoTWExportWidget() { delete(util) ; } void AdifLoTWExportWidget::setDefaultStationCallsign(const QString &_st) { //qDebug() << Q_FUNC_INFO << " - Start"; if (util->isValidCall(_st)) { defaultStationCallsign = _st; } //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::setDefaultMyGrid(const QString &_st) { //qDebug() << Q_FUNC_INFO << " - Start"; if (util->isValidGrid(_st)) { defaultMyGrid = _st; } //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::createUI() { //qDebug() << Q_FUNC_INFO << " - Start"; //fillStationCallsignComboBox(); tableWidget->setSortingEnabled (true); stationCallsignComboBox->setToolTip(tr("Select the Station Callsign that you want to use to upload the log.")); startDate->setCalendarPopup (true); endDate->setCalendarPopup (true); startDate->clear(); startDate->setToolTip(tr("Select the start date to export the QSOs. The default date is the date of the first QSO with this station callsign.")); endDate->clear(); //endDate->setDate(QDate::currentDate()); endDate->setToolTip(tr("Select the end date to export the QSOs. The default date is the date of the last QSO with this station callsign.")); QLabel *stationLabel = new QLabel; stationLabel->setText(tr("Station callsign")); QLabel *myGridLabel = new QLabel; myGridLabel->setText(tr("My Locator")); QLabel *startLabel = new QLabel; startLabel->setText(tr("Start date")); QLabel *endLabel = new QLabel; endLabel->setText(tr("End date")); okButton->setText(tr("Ok")); cancelButton->setText(tr("Cancel")); hv = tableWidget->verticalHeader(); hv->hide(); hv->setStretchLastSection(true); hh = tableWidget->horizontalHeader(); QStringList header; header.clear(); header << tr("DX") << tr("Date/Time") << tr("My Locator") << tr("Band") << tr("Mode"); tableWidget->setColumnCount(header.length()); tableWidget->setHorizontalHeaderLabels(header); QGridLayout *mainLayout = new QGridLayout; mainLayout->addWidget(topLabel, 0, 0, 1, -1); mainLayout->addWidget(stationLabel, 1, 0); mainLayout->addWidget(stationCallsignComboBox, 2, 0); mainLayout->addWidget(myGridLabel, 1, 1); mainLayout->addWidget(myGridSquareComboBox, 2, 1); mainLayout->addWidget(startLabel, 1, 2); mainLayout->addWidget(startDate, 2, 2); mainLayout->addWidget(endLabel, 1, 3); mainLayout->addWidget(endDate, 2, 3); mainLayout->addWidget(tableWidget, 3, 0, 1, -1); mainLayout->addWidget(numberLabel, 4, 0); mainLayout->addWidget(okButton, 4, 1); mainLayout->addWidget(cancelButton, 4, 2); setLayout(mainLayout); connect(startDate, SIGNAL(dateChanged(QDate)), this, SLOT(slotDateChanged())) ; connect(endDate, SIGNAL(dateChanged(QDate)), this, SLOT(slotDateChanged() )); connect(stationCallsignComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotStationCallsignChanged() ) ) ; connect(myGridSquareComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotMyGridChanged() ) ) ; connect(okButton, SIGNAL(clicked()), this, SLOT(slotOKPushButtonClicked() ) ); connect(cancelButton, SIGNAL(clicked()), this, SLOT(slotCancelPushButtonClicked() ) ); //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::setDefaultStationComboBox() { //qDebug() << Q_FUNC_INFO << " - Start"; //stationCallsignComboBox->blockSignals(true); if (!util->isValidCall(defaultStationCallsign)) { //qDebug() << Q_FUNC_INFO << " - END-1"; //stationCallsignComboBox->blockSignals(false); return; } if (stationCallsignComboBox->findText(defaultStationCallsign, Qt::MatchCaseSensitive) >= 0) { stationCallsignComboBox->setCurrentIndex(stationCallsignComboBox->findText(defaultStationCallsign, Qt::MatchCaseSensitive)); } //stationCallsignComboBox->blockSignals(false); //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::setDefaultMyGridComboBox() { //qDebug() << Q_FUNC_INFO << " - Start"; if (!util->isValidGrid(defaultMyGrid)) { //qDebug() << Q_FUNC_INFO << " - END-1"; return; } if (myGridSquareComboBox->findText(defaultMyGrid, Qt::MatchCaseSensitive) >= 0) { myGridSquareComboBox->setCurrentIndex(myGridSquareComboBox->findText(defaultMyGrid, Qt::MatchCaseSensitive)); //qDebug() << Q_FUNC_INFO << ": 1: " << myGridSquareComboBox->currentText(); } else if (myGridSquareComboBox->count()>=3) { myGridSquareComboBox->findText(myGridSquareComboBox->itemText(2), Qt::MatchCaseSensitive); //qDebug() << Q_FUNC_INFO << ": 2: " << myGridSquareComboBox->currentText(); } else { //qDebug() << Q_FUNC_INFO << ": 3"; } //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::fillStationCallsignComboBox() { //qDebug() << Q_FUNC_INFO << " - Start"; //stationCallsignComboBox->blockSignals(true); stationCallsignComboBox->clear(); //qDebug() << Q_FUNC_INFO << " -1" ; stationCallsignComboBox->addItem(tr("Not defined")); //qDebug() << Q_FUNC_INFO << " -2" ; if (currentExportMode == ModeADIF) { //qDebug() << Q_FUNC_INFO << " -3"; stationCallsignComboBox->addItem(tr("ALL")); //qDebug() << Q_FUNC_INFO << " -4"; } if (currentExportMode == ModeLotW) { //qDebug() << Q_FUNC_INFO << " -3"; stationCallsignComboBox->addItems(dataProxy->getStationCallSignsFromLogWithLoTWPendingToSend(logNumber)); //qDebug() << Q_FUNC_INFO << " -4"; } else { //qDebug() << Q_FUNC_INFO << " -5"; stationCallsignComboBox->addItems(dataProxy->getStationCallSignsFromLog(logNumber)); //qDebug() << Q_FUNC_INFO << " -6"; } //stationCallsignComboBox->blockSignals(false); //qDebug() << QString::number(stationCallsignComboBox->count()); //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::fillStationMyGridComboBox() { //qDebug() << Q_FUNC_INFO << " - Start"; // Keep the grid that is shown now // clean and fill the combo. // If the saved locator is in the list, it is selected. //myGridSquareComboBox->blockSignals(true); QString tempGrid = myGridSquareComboBox->currentText (); myGridSquareComboBox->clear(); QStringList grids; grids.clear (); if (util->isValidCall(stationCallsignComboBox->currentText())) { //qDebug() << Q_FUNC_INFO << " - ValidCall: " << stationCallsignComboBox->currentText(); grids.append (dataProxy->getGridsToBeSent (stationCallsignComboBox->currentText(), startDate->date(), endDate->date(), currentExportMode, true, logNumber)); } else if (stationCallsignComboBox->currentIndex() == 0) { // Not defined call //qDebug() << Q_FUNC_INFO << " - Not Defined" ; grids.append (dataProxy->getGridsToBeSent ("NOT", startDate->date(), endDate->date(), currentExportMode, true, logNumber)); } else { //ALL calls //qDebug() << Q_FUNC_INFO << " - ALL Calls" ; //myGridSquareComboBox->addItem(tr("ALL")); grids.append (dataProxy->getGridsToBeSent ("ALL", startDate->date(), endDate->date(), currentExportMode, false, logNumber)); } myGridSquareComboBox->addItem(tr("Not defined")); myGridSquareComboBox->addItem(tr("ALL")); myGridSquareComboBox->addItems(grids); if (myGridSquareComboBox->findText(tempGrid, Qt::MatchCaseSensitive) >= 0) { myGridSquareComboBox->setCurrentIndex(myGridSquareComboBox->findText(tempGrid, Qt::MatchCaseSensitive)); } //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::setTopLabel(const QString &_t) { //qDebug() << Q_FUNC_INFO << " - Start"; topLabel->setText(_t); //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::fillDates() { // Shows the first and last QSO done with one specific callsign. //qDebug() << Q_FUNC_INFO << " - Start"; //startDate->blockSignals(true); //endDate->blockSignals(true); if (util->isValidCall(stationCallsignComboBox->currentText())) { //qDebug() << Q_FUNC_INFO << " - Not valid Call"; startDate->setDate(dataProxy->getFirstQSODateFromCall(stationCallsignComboBox->currentText())); endDate->setDate(dataProxy->getLastQSODateFromCall(stationCallsignComboBox->currentText())); } else if ((stationCallsignComboBox->currentIndex() == 0) && (stationCallsignComboBox->currentText().length()>3)) {//Not defined //qDebug() << Q_FUNC_INFO << " - Not defined"; startDate->setDate(dataProxy->getFirstQSODateFromCall("NOT")); endDate->setDate(dataProxy->getLastQSODateFromCall("NOT")); } else {//ALL //qDebug() << Q_FUNC_INFO << " - ALL"; startDate->setDate(dataProxy->getFirstQSODateFromCall("ALL")); endDate->setDate(dataProxy->getLastQSODateFromCall("ALL")); } //startDate->blockSignals(false); //endDate->blockSignals(false); //qDebug() << Q_FUNC_INFO << " - END"; } QList AdifLoTWExportWidget::fillTable() { //qDebug() << Q_FUNC_INFO << " - Start"; QList _qsos; _qsos.clear(); //bool justQueued = true; QString _myGrid; if (myGridSquareComboBox->currentIndex () == 0) { _myGrid = "NOT"; } else if (myGridSquareComboBox->currentIndex () == 1) { _myGrid = "ALL"; } else { _myGrid = myGridSquareComboBox->currentText(); } QString _myCall; if (stationCallsignComboBox->currentIndex () == 0) { //qDebug() << ": NOT"; _myCall = "NOT"; } else if ((stationCallsignComboBox->currentIndex () == 1) && (currentExportMode != ModeLotW)) { //qDebug() << ": all"; _myCall = "ALL"; } else { _myCall = stationCallsignComboBox->currentText(); //qDebug() << ": Call: " <<_myCall; } //qsos.clear (); switch (currentExportMode) { case ModeADIF: //justQueued = false; //_qsos.append(dataProxy->getQSOsListLoTWToSend(_myCall, startDate->date(), endDate->date(), justQueued, logNumber)); _qsos.append(dataProxy->getQSOsListToBeExported(_myCall, _myGrid, startDate->date(), endDate->date(), logNumber)); //qsos.append(dataProxy->getQSOsListToBeExported(_myCall, _myGrid, startDate->date(), endDate->date())); //qDebug() << Q_FUNC_INFO << " ADIF"; break; case ModeLotW: //qDebug() << Q_FUNC_INFO << " LoTW"; //justQueued = true; _qsos.append(dataProxy->getQSOsListLoTWToSend (_myCall, _myGrid, startDate->date(), endDate->date(), true, logNumber)); //qsos.append(dataProxy->getQSOsListLoTWToSend (_myCall, _myGrid, startDate->date(), endDate->date(), true, logNumber)); break; case ModeClubLog: //qDebug() << Q_FUNC_INFO << " ClubLog"; _qsos.append(dataProxy->getQSOsListClubLogToSent(_myCall, startDate->date(), endDate->date(), true, logNumber)); //qsos.append(dataProxy->getQSOsListClubLogToSent(_myCall, startDate->date(), endDate->date(), true, logNumber)); break; case ModeEQSL: //qDebug() << Q_FUNC_INFO << " EQSL"; //justQueued = true; _qsos.append(dataProxy->getQSOsListEQSLToSent(_myCall, startDate->date(), endDate->date(), true, logNumber)); //qsos.append(dataProxy->getQSOsListEQSLToSent(_myCall, startDate->date(), endDate->date(), true)); break; case ModeQRZ: //qDebug() << Q_FUNC_INFO << " QRZ"; //justQueued = true; _qsos.append(dataProxy->getQSOsListQRZCOMToSent(_myCall, startDate->date(), endDate->date(), true, logNumber)); //qsos.append(dataProxy->getQSOsListQRZCOMToSent(_myCall, startDate->date(), endDate->date(), true)); break; } //qDebug() << Q_FUNC_INFO << " -3" ; tableWidget->clearContents(); tableWidget->setRowCount(0); if (tableWidget->columnCount()>0) { //qDebug() << Q_FUNC_INFO << " pre FOR"; for (int i=0; i<_qsos.length(); i++) { //qDebug() << Q_FUNC_INFO << " in FOR " << QString::number(i); addQSO(_qsos.at(i)); } } //numberLabel->setText(tr("QSOs: ") + QString::number(_qsos.count()) + ); numberLabel->setText(QString(tr("QSOs: %1/%2")).arg(_qsos.count()).arg(numOfQSOsInThisLog) ); numberLabel->setToolTip (QString("The current number has %1 QSOs and your selection in this widget shows %2 QSOs").arg(numOfQSOsInThisLog).arg(_qsos.count ())); if (_qsos.count()>0) { //qDebug() << Q_FUNC_INFO << " Enable OKButton"; okButton->setEnabled(true); } else { //qDebug() << Q_FUNC_INFO << " Disable OKButton"; okButton->setEnabled(false); } return _qsos; //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::addQSO(const int _qsoID) { //qDebug() << "AdifLoTWExportWidget::addQSO: " << QString::number(_qsoID); //qDebug() << Q_FUNC_INFO << " - Start"; QStringList qsoToAdd; qsoToAdd.clear(); qsoToAdd << dataProxy->getQSODetailsForLoTWDownload(_qsoID); //qDebug() << "AdifLoTWExportWidget::addQSO: Columns: " << QString::number(tableWidget->columnCount()); //qDebug() << "AdifLoTWExportWidget::addQSO: qsoToAdd-length: " << QString::number(qsoToAdd.length()); if (qsoToAdd.length() == tableWidget->columnCount()) { tableWidget->insertRow(tableWidget->rowCount()); for (int i = 0; isetTextAlignment(Qt::AlignCenter); newItemID->setFlags(Qt::NoItemFlags); tableWidget->setItem(tableWidget->rowCount()-1, i, newItemID); } } //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::slotStationCallsignChanged() { //qDebug() << Q_FUNC_INFO << " - Start"; if (starting) { //qDebug() << Q_FUNC_INFO << " - END-1"; return; } blockAllSignals (true); QString tmpCall = stationCallsignComboBox->currentText (); if (stationCallsignComboBox->count()<1) { //qDebug() << Q_FUNC_INFO << " - END-1"; return; } //qDebug() << Q_FUNC_INFO << " - 01" ; fillDates(); //qDebug() << Q_FUNC_INFO << " - 03" ; fillStationMyGridComboBox(); updateIfNeeded(); stationCallsignComboBox->setCurrentIndex(stationCallsignComboBox->findText(tmpCall, Qt::MatchCaseSensitive)); blockAllSignals (false); //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::blockAllSignals(const bool _b) { //qDebug() << Q_FUNC_INFO << " - Start"; stationCallsignComboBox->blockSignals (_b); myGridSquareComboBox->blockSignals (_b); startDate->blockSignals (_b); endDate->blockSignals (_b); //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::updateIfNeeded() { //qDebug() << Q_FUNC_INFO << " - Start"; if (currentCall != stationCallsignComboBox->currentText()) { //qDebug() << Q_FUNC_INFO << " - 1"; currentCall = stationCallsignComboBox->currentText(); qsos = fillTable(); } else if (currentGrid != myGridSquareComboBox->currentText()) { //qDebug() << Q_FUNC_INFO << " - 2"; currentGrid = myGridSquareComboBox->currentText(); qsos = fillTable(); } else if (currentStart != startDate->date()) { //qDebug() << Q_FUNC_INFO << " - 3"; currentStart = startDate->date(); qsos = fillTable(); } else if (currentEnd != endDate->date()) { //qDebug() << Q_FUNC_INFO << " - 3"; currentEnd = endDate->date(); qsos = fillTable(); } //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::slotMyGridChanged() { //qDebug() << Q_FUNC_INFO << " - Start: " << myGridSquareComboBox->currentText(); if (starting) { //qDebug() << Q_FUNC_INFO << " - END-1"; return; } blockAllSignals (true); QString tmpGrid = myGridSquareComboBox->currentText (); //TODO: Add StationCallsigns that has been worked from that grid? //TODO: Update the startDate when that grid was activated? //TODO: Update the endDate when that grid was activated? qsos = fillTable(); myGridSquareComboBox->setCurrentIndex(myGridSquareComboBox->findText(tmpGrid, Qt::MatchCaseSensitive)); blockAllSignals (false); //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::slotDateChanged() { //qDebug() << Q_FUNC_INFO << " - Start"; if (starting) { //qDebug() << Q_FUNC_INFO << " - END-1"; return; } blockAllSignals (true); QDate tmpStartDate = startDate->date(); QDate tmpEndDate = endDate->date(); updateIfNeeded(); startDate->setDate (tmpStartDate); endDate->setDate(tmpEndDate); blockAllSignals (false); //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::slotOKPushButtonClicked() { //qDebug() << Q_FUNC_INFO << " - Start"; this->hide(); emit qsosToSend (stationCallsignComboBox->currentText(), qsos, currentExportMode); return; QString myGrid = myGridSquareComboBox->currentText(); if (myGridSquareComboBox->currentIndex () == 0) { myGrid = "NOT"; } if (stationCallsignComboBox->currentIndex() == 0) { //qDebug() << Q_FUNC_INFO << " - emit NOT"; emit selection("NOT", myGrid, startDate->date(), endDate->date(), currentExportMode); } else if (stationCallsignComboBox->currentIndex() == 1) { if ((currentExportMode == ModeLotW) || (currentExportMode == ModeClubLog) || (currentExportMode == ModeQRZ)|| (currentExportMode == ModeEQSL)) { //qDebug() << Q_FUNC_INFO << " - emit 1"; emit selection(stationCallsignComboBox->currentText(), myGrid, startDate->date(), endDate->date(), currentExportMode); } else { //qDebug() << Q_FUNC_INFO << " - emit ALL"; emit selection("ALL", myGrid, startDate->date(), endDate->date(), currentExportMode); } } else { //qDebug() << Q_FUNC_INFO << " - emit stationcall"; emit selection(stationCallsignComboBox->currentText(), myGrid, startDate->date(), endDate->date(), currentExportMode); } //qDebug() << "AdifLoTWExportWidget::slotOKPushButtonClicked - END"; close(); //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::slotCancelPushButtonClicked() { //qDebug() << Q_FUNC_INFO << " - Start"; close(); //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::closeEvent(QCloseEvent *event) { //qDebug() << Q_FUNC_INFO << " - Start"; event->accept(); //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::showEvent(QShowEvent *event) { //qDebug() << Q_FUNC_INFO << " - Start"; starting = true; numOfQSOsInThisLog = dataProxy->getHowManyQSOInLog(logNumber); //myGridSquareComboBox->blockSignals(true); //stationCallsignComboBox->blockSignals(true); //startDate->blockSignals(true); //endDate->blockSignals(true); fillStationCallsignComboBox(); //qDebug() << Q_FUNC_INFO << ": 1 - " << stationCallsignComboBox->currentText(); setDefaultStationComboBox(); //qDebug() << Q_FUNC_INFO << ": 2 - " << stationCallsignComboBox->currentText(); fillDates(); //qDebug() << Q_FUNC_INFO << ": 3 - " << stationCallsignComboBox->currentText(); fillStationMyGridComboBox(); setDefaultMyGridComboBox(); //qDebug() << Q_FUNC_INFO << ": 4 - " << stationCallsignComboBox->currentText(); starting = false; updateIfNeeded(); //qDebug() << Q_FUNC_INFO << ": 5 - " << stationCallsignComboBox->currentText(); event->accept(); //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::setExportMode(const ExportMode _EMode) { //qDebug() << Q_FUNC_INFO << " - Start"; currentExportMode = _EMode; if (currentExportMode == ModeLotW) { setWindowTitle(tr("KLog - QSOs to be uploaded to LoTW.")); topLabel->setText(tr("This table shows the QSOs that will be sent to LoTW.")); } else if (currentExportMode == ModeClubLog) { setWindowTitle(tr("KLog - QSOs to be uploaded to ClubLog.")); topLabel->setText(tr("This table shows the QSOs that will be sent to ClubLog.")); } else if (currentExportMode == ModeEQSL) { setWindowTitle(tr("KLog - QSOs to be uploaded to eQSL.cc.")); topLabel->setText(tr("This table shows the QSOs that will be sent to eQSL.cc.")); } else if (currentExportMode == ModeQRZ) { setWindowTitle(tr("KLog - QSOs to be uploaded to QRZ.com.")); topLabel->setText(tr("This table shows the QSOs that will be sent to QRZ.com.")); } else { setWindowTitle("KLog - QSOs to be exported to ADIF."); topLabel->setText(tr("This table shows the QSOs that will be exported to ADIF.")); } //fillStationCallsignComboBox(); //slotStationCallsignChanged(); //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::setLogNumber(const int _logN) { //qDebug() << Q_FUNC_INFO << " - Start"; if (dataProxy->doesThisLogExist (_logN)) { logNumber = _logN; } else { logNumber = -1; } numOfQSOsInThisLog = dataProxy->getHowManyQSOInLog(logNumber); //qDebug() << Q_FUNC_INFO << " - END"; } void AdifLoTWExportWidget::setCallValidation(const bool _v) { util->setCallValidation(_v); dataProxy->setCallValidation(_v); } klog-2.3.3/widgets/showadifimportwidget.h0000644000015700001710000000531214542412415020420 0ustar jenkinsjenkins#ifndef KLOG_WIDGETS_SHOWADIFIMPORTPORTWIDGET_H #define KLOG_WIDGETS_SHOWADIFIMPORTPORTWIDGET_H /*************************************************************************** showadifimportwidget.h - description ------------------- begin : July 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include "../dataproxy_sqlite.h" #include "../utilities.h" class ShowAdifImportWidget : public QWidget { Q_OBJECT public: explicit ShowAdifImportWidget(DataProxy_SQLite *dp, const QString &_parentFunction, QWidget *parent = nullptr); ~ShowAdifImportWidget(); void addQSOToTheList(const QStringList _qso); void clear(); protected: void closeEvent(QCloseEvent *event); void showEvent(QShowEvent *event); private slots: void slotOKPushButtonClicked(); // void slotCancelPushButtonClicked(); signals: //void selection(QString _st, QDate _startD, QDate _endD); private: void createUI(); void fillTable(); void addQSO(const QStringList &_qso); QList qsosList; DataProxy_SQLite *dataProxy; Utilities *util; QPushButton *okButton;//, *cancelButton; QTableWidget *tableWidget; QHeaderView *hv, *hh; }; #endif klog-2.3.3/widgets/onlinemessagewidget.h0000644000015700001710000000450114542412415020211 0ustar jenkinsjenkins#ifndef KLOG_WIDGETS_ONLINEMESSAGEWIDGET_H #define KLOG_WIDGETS_ONLINEMESSAGEWIDGET_H /*************************************************************************** onlinemessagewidget.h - description ------------------- begin : November 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include "../utilities.h" class OnlineMessageWidget : public QWidget { Q_OBJECT public: explicit OnlineMessageWidget(QWidget *parent = nullptr); int showMessage(QNetworkReply::NetworkError _error, OnLineProvider _prov, OnlineErrorCode _onlineError, OnlineErrorReason _onlineReason, const QString &_msg); signals: public slots: private: QString translate(QNetworkReply::NetworkError _error); }; #endif // ONLINEMESSAGEWIDGET_H klog-2.3.3/widgets/adiflotwexportwidget.h0000644000015700001710000000735214542412415020442 0ustar jenkinsjenkins#ifndef KLOG_WIDGETS_ADIFLOTWEXPORTWIDGET_H #define KLOG_WIDGETS_ADIFLOTWEXPORTWIDGET_H /*************************************************************************** adiflotwexportwidget.h - description ------------------- begin : July 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include "../dataproxy_sqlite.h" #include "../utilities.h" class AdifLoTWExportWidget : public QWidget { Q_OBJECT public: explicit AdifLoTWExportWidget(DataProxy_SQLite *dp, const QString &_parentFunction, QWidget *parent = nullptr); ~AdifLoTWExportWidget(); void setExportMode(const ExportMode _EMode); void setLogNumber(const int _logN); void setDefaultStationCallsign(const QString &_st); void setDefaultMyGrid(const QString &_st); void setCallValidation(const bool _v); protected: void closeEvent(QCloseEvent *event); void showEvent(QShowEvent *event); private slots: void slotOKPushButtonClicked(); void slotCancelPushButtonClicked(); void slotStationCallsignChanged(); void slotDateChanged(); void slotMyGridChanged(); signals: void selection(QString _st, QString _grid, QDate _startD, QDate _endD, ExportMode _exportMode); void qsosToSend(QString _call, QList _qsos, ExportMode _exportMode); private: void createUI(); QList fillTable(); void setTopLabel(const QString &_t); void addQSO(const int _qsoID); void fillStationCallsignComboBox(); void fillStationMyGridComboBox(); void fillDates(); void setDefaultStationComboBox(); void setDefaultMyGridComboBox(); void updateIfNeeded(); void blockAllSignals(const bool _b); DataProxy_SQLite *dataProxy; Utilities *util; QComboBox *stationCallsignComboBox, *myGridSquareComboBox; QDateEdit *startDate, *endDate; QLabel *topLabel, *numberLabel; QLineEdit *searchLineEdit; QPushButton *okButton, *cancelButton; ExportMode selectedEMode; QTableWidget *tableWidget; QHeaderView *hv, *hh; ExportMode currentExportMode; int logNumber, numOfQSOsInThisLog; QString defaultStationCallsign, defaultMyGrid; QString currentCall, currentGrid; QDate currentStart, currentEnd; bool starting; QList qsos; }; #endif klog-2.3.3/widgets/showadifimportwidget.cpp0000644000015700001710000001643614542412415020764 0ustar jenkinsjenkins/*************************************************************************** showadifimportwidget.cpp - description ------------------- begin : July 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "showadifimportwidget.h" ShowAdifImportWidget::ShowAdifImportWidget(DataProxy_SQLite *dp, const QString &_parentFunction, QWidget *parent) : QWidget(parent) { Q_UNUSED(_parentFunction); dataProxy = dp; util = new Utilities(Q_FUNC_INFO); okButton = new QPushButton; //cancelButton = new QPushButton; tableWidget = new QTableWidget; qsosList.clear(); setWindowTitle("ShowAdif"); createUI(); util->setLongPrefixes(dataProxy->getLongPrefixes()); util->setSpecialCalls(dataProxy->getSpecialCallsigns()); } ShowAdifImportWidget::~ShowAdifImportWidget() { delete(util); } void ShowAdifImportWidget::createUI() { QLabel *msgLabel = new QLabel; msgLabel->setText(tr("The following QSOs are those QSOs that you have received the LoTW confirmation.")); okButton->setText(tr("Ok")); //cancelButton->setText(tr("Cancel")); hv = tableWidget->verticalHeader(); hv->hide(); hv->setStretchLastSection(true); hh = tableWidget->horizontalHeader(); QStringList header; header.clear(); header << tr("DX") << tr("Date/Time") << tr("Band") << tr("Mode"); tableWidget->setColumnCount(header.length()); tableWidget->setHorizontalHeaderLabels(header); QGridLayout *mainLayout = new QGridLayout; mainLayout->addWidget(msgLabel, 0, 0, 1, -1); mainLayout->addWidget(tableWidget, 1, 0, 1, -1); mainLayout->addWidget(okButton, 2, 1); // mainLayout->addWidget(cancelButton, 2, 2); setLayout(mainLayout); connect(okButton, SIGNAL(clicked()), this, SLOT(slotOKPushButtonClicked() ) ); // connect(cancelButton, SIGNAL(clicked()), this, SLOT(slotCancelPushButtonClicked() ) ); } void ShowAdifImportWidget::fillTable() { //qDebug() << "ShowAdifImportWidget::fillTable "; //header << tr("DX") << tr("Date/Time") << tr("Band") << tr("Mode"); //QList qsos; //qsos.clear(); //qsos.append(dataProxy->getQSOsListLoTWToSend(stationCallsignComboBox->currentText(), startDate->date(), endDate->date(), true)); //qDebug() << "ShowAdifImportWidget::fillTable QSOS: " << QString::number(qsosList.length()); //QString aux, prefix; //qDebug() << "ShowAdifImportWidget::fillTable: -3" ; tableWidget->clearContents(); tableWidget->setRowCount(0); if (tableWidget->columnCount()>0) { //qDebug() << "ShowAdifImportWidget::fillTable pre FOR"; for (int i=0; icolumnCount()); //qDebug() << "ShowAdifImportWidget::addQSO: qsoToAdd-length: " << QString::number(qsoToAdd.length()); if (qsoToAdd.length() == tableWidget->columnCount()) { tableWidget->insertRow(tableWidget->rowCount()); for (int i = 0; isetTextAlignment(Qt::AlignCenter); newItemID->setFlags(Qt::NoItemFlags); tableWidget->setItem(tableWidget->rowCount()-1, i, newItemID); } //QTableWidgetItem *newItem = new QTableWidgetItem(tr("%1").arg(pow(row, column+1))); //tableWidget->setItem(row, column, newItem); } //qDebug() << "ShowAdifImportWidget::addQSO: - END" ; } void ShowAdifImportWidget::slotOKPushButtonClicked() { this->hide(); //emit selection(stationCallsignComboBox->currentText(), startDate->date(), endDate->date()); close(); } void ShowAdifImportWidget::closeEvent(QCloseEvent *event) { //qDebug() << "ShowAdifImportWidget::closeEvent"; event->accept(); } void ShowAdifImportWidget::showEvent(QShowEvent *event) { //qDebug() << "ShowAdifImportWidget::showEvent"; fillTable(); event->accept(); } void ShowAdifImportWidget::addQSOToTheList(const QStringList _qso) { //qDebug() << "ShowAdifImportWidget::addQSOToTheList - Start"; // QRZ-DX, Date-Time(yyyyMMdd-hhmmss), Band, Mode if (_qso.length()!=4) { //qDebug() << "ShowAdifImportWidget::addQSOToTheList - NO valid qso list received"; return; } if (!util->isValidCall(_qso.at(0))) { //qDebug() << "ShowAdifImportWidget::addQSOToTheList - NO valid QRZ received"; return; } if (dataProxy->getIdFromBandName(_qso.at(2))<0) { //qDebug() << "ShowAdifImportWidget::addQSOToTheList - NO valid BAND received"; return; } if (dataProxy->getIdFromModeName(_qso.at(3))<0) { //qDebug() << "ShowAdifImportWidget::addQSOToTheList - NO valid Mode received"; return; } QDateTime _dateTime = util->getDateTimeFromSQLiteString(_qso.at(1)); if (!_dateTime.isValid()) { //qDebug() << "ShowAdifImportWidget::addQSOToTheList - NO valid DateTime received"; return; } QStringList _newQSO; _newQSO.clear(); _newQSO << _qso.at(0) << util->getDateTimeSQLiteStringFromDateTime(_dateTime) << _qso.at(2) << _qso.at(3); qsosList << _newQSO; //qDebug() << "ShowAdifImportWidget::addQSOToTheList QSO Added! - "<< _qso.at(0) <<" - END"; } klog-2.3.3/widgets/showkloglogwidget.h0000644000015700001710000000534714542412415017730 0ustar jenkinsjenkins#ifndef KLOG_WIDGETS_SHOWKLOGLOGWIDGET_H #define KLOG_WIDGETS_SHOWKLOGLOGWIDGET_H /*************************************************************************** showkloglogwidget.h - description ------------------- begin : jan 2021 copyright : (C) 2021 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "../utilities.h" // This widget will show the KLog log, the software log, to be able to debug // or see how it is executing. Mainly for debug & development. class ShowKLogLogWidget : public QWidget { Q_OBJECT public: explicit ShowKLogLogWidget(QWidget *parent = nullptr); ~ShowKLogLogWidget(); void add(QString const &_func, QString const &_log, const DebugLogLevel _l); void setLogLevel(const DebugLogLevel _l); signals: void newLogLevel(DebugLogLevel level); private slots: void slotLevelComboBoxChanged(const QString &_l); private: void createUI(); QString debugLevelToString(DebugLogLevel _l); QStringList list; QListView *logsView; QStringListModel *model; QComboBox *levelComboBox; DebugLogLevel logLevel; QFile *debugFile; Utilities *util; }; #endif // SHOWKLOGLOGWIDGET_H klog-2.3.3/widgets/showkloglogwidget.cpp0000644000015700001710000001036214542412415020254 0ustar jenkinsjenkins/*************************************************************************** showkloglogwidget.cpp - description ------------------- begin : jan 2021 copyright : (C) 2021 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "showkloglogwidget.h" ShowKLogLogWidget::ShowKLogLogWidget(QWidget *parent) : QWidget(parent) { util = new Utilities(Q_FUNC_INFO); levelComboBox = new QComboBox; model = new QStringListModel(); //QStringList list; list.clear(); model->setStringList(list); logsView = new QListView; logsView->setModel(model); createUI(); } ShowKLogLogWidget::~ShowKLogLogWidget() { delete(util); } void ShowKLogLogWidget::createUI() { levelComboBox->clear(); levelComboBox->addItems(util->getDebugLevels()); levelComboBox->setCurrentIndex(0); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(levelComboBox); layout->addWidget(logsView); setLayout(layout); connect(levelComboBox, SIGNAL(currentIndexChanged (QString)), this, SLOT(slotLevelComboBoxChanged(QString) ) ) ; } void ShowKLogLogWidget::add(const QString &_func, QString const &_log, const DebugLogLevel _l) { //qDebug() << "Debugging0: " << _func << "/" << _log << "/" << util->debugLevelToString(logLevel) << "/" << util->debugLevelToString(_l); if (logLevel >_l) { return; } QString msg; msg = QString("%1 %2 - %3 - %4").arg(QDateTime::currentDateTime().toString("yyyy-MM-ddThh:mm:ss")).arg(util->debugLevelToString (_l)).arg(_func).arg(_log); //qDebug() << "Debugging1: " << msg; if(model->insertRow(0)) { QModelIndex index = model->index(0, 0); model->setData(index, msg); } return; // FILE debugFile = new QFile(util->getDebugLogFile()); if (!debugFile->open(QIODevice::Append | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << Q_FUNC_INFO << " Can't open the file to log - EXITING"; return; } QTextStream out(debugFile); out << (QDateTime::currentDateTime()).toString("yyyyMMdd-hhmmsszzz") << " - " << _func << " - " << msg; //qDebug() << "Debugging2: " << out.string(); debugFile->close(); } void ShowKLogLogWidget::setLogLevel(const DebugLogLevel _l) { //qDebug() << Q_FUNC_INFO << " - New log Level: " << util->debugLevelToString(_l); QString logString = util->debugLevelToString(_l); if (util->isValidLogLevel(logString)) levelComboBox->setCurrentIndex(levelComboBox->findText(logString, Qt::MatchCaseSensitive)); else { levelComboBox->setCurrentIndex(0); logLevel = util->stringToDebugLevel("None"); return; } logLevel = _l; } void ShowKLogLogWidget::slotLevelComboBoxChanged(const QString &_l) { emit newLogLevel(util->stringToDebugLevel(_l)); } klog-2.3.3/widgets/onlinemessagewidget.cpp0000644000015700001710000001320514542412415020545 0ustar jenkinsjenkins/*************************************************************************** onlinemessagewidget.cpp - description ------------------- begin : November 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "onlinemessagewidget.h" OnlineMessageWidget::OnlineMessageWidget(QWidget *parent) : QWidget(parent) { } int OnlineMessageWidget::showMessage(QNetworkReply::NetworkError _error, OnLineProvider _prov, OnlineErrorCode _onlineError, OnlineErrorReason _onlineReason, const QString &_msg) { Q_UNUSED(_prov); Q_UNUSED(_onlineError); Q_UNUSED(_onlineReason); Q_UNUSED(_msg); //enum OnLineProvider {ClubLog, LoTW, eQSL, QRZ, HamQTH}; QString message = QString(); QString detailedText = QString(tr("The server returned the following error: %1")).arg(translate(_error)); QString title = QString(); /* switch (_onlineReason) { case OnlineErrorReason::Other: break; case OnlineErrorReason::Auth: break; case OnlineErrorReason::DupeQSO: break; case OnlineErrorReason::WrongLogBook: break; } switch (_prov) { case ClubLog: { } break; case LoTW: {} break; case QRZ: {} break; case eQSL: {} break; } */ if ((title.length()<1) || (message.length()<1) || (detailedText.length()<1)) { return -100; } QMessageBox msgBox; if (_onlineError == OnlineErrorCode::Ok) { msgBox.setIcon(QMessageBox::Warning); } else { msgBox.setIcon(QMessageBox::Information); } msgBox.setWindowTitle(title); msgBox.setText(message); msgBox.setDetailedText(detailedText); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); return msgBox.exec(); } QString OnlineMessageWidget::translate(QNetworkReply::NetworkError _error) { switch (_error) { case QNetworkReply::NoError: return QString::number(_error); break; case QNetworkReply::ConnectionRefusedError: break; case QNetworkReply::RemoteHostClosedError: break; case QNetworkReply::HostNotFoundError: break; case QNetworkReply::TimeoutError: break; case QNetworkReply::OperationCanceledError: break; case QNetworkReply::SslHandshakeFailedError: break; case QNetworkReply::TemporaryNetworkFailureError: break; case QNetworkReply::NetworkSessionFailedError: break; case QNetworkReply::BackgroundRequestNotAllowedError: break; case QNetworkReply::TooManyRedirectsError: break; case QNetworkReply::InsecureRedirectError: break; case QNetworkReply::ProxyConnectionRefusedError: break; case QNetworkReply::ProxyConnectionClosedError: break; case QNetworkReply::ProxyNotFoundError: break; case QNetworkReply::ProxyTimeoutError: break; case QNetworkReply::ProxyAuthenticationRequiredError: break; case QNetworkReply::ContentAccessDenied: break; case QNetworkReply::ContentOperationNotPermittedError: break; case QNetworkReply::ContentNotFoundError: break; case QNetworkReply::AuthenticationRequiredError: break; case QNetworkReply::ContentReSendError: break; case QNetworkReply::ContentConflictError: break; case QNetworkReply::ContentGoneError: break; case QNetworkReply::InternalServerError: break; case QNetworkReply::OperationNotImplementedError: break; case QNetworkReply::ServiceUnavailableError: break; case QNetworkReply::ProtocolUnknownError: break; case QNetworkReply::ProtocolInvalidOperationError: break; case QNetworkReply::UnknownNetworkError: break; case QNetworkReply::UnknownProxyError: break; case QNetworkReply::UnknownContentError: break; case QNetworkReply::ProtocolFailure: break; case QNetworkReply::UnknownServerError: break; default: return QString(tr("Not identified")); break; } return QString::number(_error); } klog-2.3.3/widgets/map/0000755000015700001710000000000014542412415014560 5ustar jenkinsjenkinsklog-2.3.3/widgets/map/mapwidget.cpp0000644000015700001710000001407114542412415017250 0ustar jenkinsjenkins/*************************************************************************** mapwidget.cpp - description ------------------- begin : May 2021 copyright : (C) 2021 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "mapwidget.h" MapWidget::MapWidget(QWidget *parent) { Q_UNUSED(parent); //qDebug() << Q_FUNC_INFO; //qDebug() << Q_FUNC_INFO << " - END"; } void MapWidget::init() { createUI(); } void MapWidget::createUI() { //qDebug() << Q_FUNC_INFO << "Start"; QWidget *container = QWidget::createWindowContainer(&qmlView, this); circleRoles[CoordinateRole] = QByteArray("coordinate"); rectangleRoles[NorthRole] = QByteArray("north"); rectangleRoles[SouthRole] = QByteArray("south"); rectangleRoles[ColorRole] = QByteArray("color"); modelCircle.setItemRoleNames(circleRoles); modelRectangle.setItemRoleNames(rectangleRoles); qmlView.rootContext()->setContextProperty("rectangle_model", &modelRectangle); qmlView.rootContext()->setContextProperty("circle_model", &modelCircle); //qDebug() << Q_FUNC_INFO << "13"; //qmlView.setSource(QUrl(QStringLiteral("qrc:qml/mapqmlfile.qml"))); //qmlView.setSource(QUrl::fromLocalFile("qrc:qml/mapqmlfile.qml")); qmlView.setSource(QUrl("qrc:qml/mapqmlfile.qml")); //qDebug() << Q_FUNC_INFO << "14"; qmlView.setResizeMode(QQuickView::SizeRootObjectToView); QVBoxLayout *layout = new QVBoxLayout(this); layout->addWidget(container); setLayout (layout); //addMarker(latitude, longitude) //setMinimumSize (200, 200); //This minimum size may be relative to another widget... (maybe the mainwindow?) //connect(okButton, SIGNAL(clicked()), this, SLOT(slotButtonClicked() ) ); //qDebug() << Q_FUNC_INFO << "-END"; } void MapWidget::clearMap() { modelRectangle.clear(); } void MapWidget::setCenter(const Coordinate &_c) { QObject *object = qmlView.rootObject (); object->setProperty ("zoom", 8.0); object->setProperty ("lat", _c.lat); object->setProperty ("lon", _c.lon); //qDebug() << Q_FUNC_INFO << " - END"; } void MapWidget::addLocator(const double lat1, const double lon1, const double lat2, const double lon2) { QObject *object = qmlView.rootObject (); //MapRectangle object->setProperty ("locLat1", lat1); object->setProperty ("locLon1", lon1); object->setProperty ("locLat2", lat2); object->setProperty ("locLon2", lon2); //qDebug() << Q_FUNC_INFO << " - END"; } void MapWidget::addMarker(const Coordinate _coord) { //qDebug() << Q_FUNC_INFO << QString("Lat/Lon = %1/%2").arg(_coord.lat).arg(_coord.lon); QObject *object = qmlView.rootObject (); QMetaObject::invokeMethod(object, "addMarker", Q_ARG(double, _coord.lat), Q_ARG(double, _coord.lon)); // QMetaObject::invokeMethod(object, "addMarker", // Q_RETURN_ARG(QString, returnedValue), // Q_ARG(double, 40.5), Q_ARG(double, -3.5)); } void MapWidget::addQSO(const QString &_loc) { //qDebug() << Q_FUNC_INFO << ": " << _loc; if (!locator.isValidLocator(_loc)) { return; } qmlView.rootContext()->setContextProperty("circle_model", &modelCircle); //qmlView.setSource(QUrl(QStringLiteral("qrc:qml/mapqmlfile.qml"))); QStandardItem *item = new QStandardItem; item->setData(QVariant::fromValue(QGeoCoordinate(locator.getLat(_loc), locator.getLon(_loc))), CoordinateRole); modelCircle.appendRow(item); } void MapWidget::addLocator(const QString &_loc, const QColor &_color) { if (_loc.contains ("IN99")) { //qDebug() << Q_FUNC_INFO << ": " << _loc; } //qDebug() << Q_FUNC_INFO << ": " << _loc; if (!locator.isValidLocator(_loc)) { return; } qmlView.rootContext()->setContextProperty("rectangle_model", &modelRectangle); Coordinate _north, _south; _north = locator.getLocatorCorner(_loc, true); _south = locator.getLocatorCorner(_loc, false); QGeoRectangle rect; rect.setTopLeft (QGeoCoordinate(_north.lat, _north.lon)); rect.setBottomRight (QGeoCoordinate(_south.lat, _south.lon) ); if (rect.isValid ()) { QStandardItem *item = new QStandardItem; item->setData(QVariant::fromValue(QGeoCoordinate(_north.lat, _north.lon)), NorthRole); item->setData(QVariant::fromValue(QGeoCoordinate(_south.lat, _south.lon)), SouthRole); item->setData(QVariant::fromValue(_color), ColorRole); modelRectangle.appendRow(item); //qDebug() << Q_FUNC_INFO << " Rectangle OK"; } } klog-2.3.3/widgets/map/mapwindowwidget.h0000644000015700001710000000664614542412415020156 0ustar jenkinsjenkins#ifndef KLOG_WIDGETS_MAP_MAPWINDOWWIDGET_H #define KLOG_WIDGETS_MAP_MAPWINDOWWIDGET_H /*************************************************************************** mapwindowwidget.h - description ------------------- begin : Feb 2022 copyright : (C) 2022 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include //#include #include "mapwidget.h" #include "../../klogdefinitions.h" #include "../../dataproxy_sqlite.h" #include "../../locator.h" class MapWindowWidget : public QWidget { Q_OBJECT public: explicit MapWindowWidget(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~MapWindowWidget(); void init(); void setBands(QStringList _bands); void setModes(QStringList _modes); void setCenter(const Coordinate &_c); void addQSO(const QString &_loc); void addLocator(const QString &_loc, const QColor &_color); void addLocators(const QStringList &_locators, const QColor &_color); void appendLocators(const QStringList &_locators, const QColor &_color); void setColors (const QColor &_worked, const QColor &_confirmed, const QColor &_default); void addMarker(const Coordinate _coord, const QString _loc); private slots: void slotBandsComboBoxChanged(); void slotModesComboBoxChanged(); void slotPropComboBoxChanged(); void slotSatsComboBoxChanged(); void slotConfirmedCheckBoxChanged(); //void slotLocatorsCheckBoxChanged(); private: void createUI(); void paintGlobalGrid(); void setPropModes(); void setSatNames(); void showFiltered(); QString getShortLocators (const int _length); QString getPropModeFromComboBox(); DataProxy_SQLite *dataProxy; MapWidget *mapWidget; QComboBox *propComboBox, *bandComboBox, *modeComboBox, *satNameComboBox; QCheckBox *confirmedCheckBox;//, *locatorsCheckBox; QColor workedColor; QColor confirmedColor; QColor defaultColor; }; #endif // MAPWINDOWWIDGET_H klog-2.3.3/widgets/map/mapwidget.h0000644000015700001710000000553314542412415016720 0ustar jenkinsjenkins#ifndef KLOG_WIDGETS_MAP_MAPWIDGET_H #define KLOG_WIDGETS_MAP_MAPWIDGET_H /*************************************************************************** mapwidget.h - description ------------------- begin : May 2021 copyright : (C) 2021 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include "../../locator.h" class MapWidget : public QWidget { Q_OBJECT public: MapWidget(QWidget *parent = nullptr); void init(); void setCenter(const Coordinate &_c); void addLocator(const double lat1, const double lon1, const double lat2, const double lon2); void addQSO(const QString &_loc); void addMarker(const Coordinate _coord); void addLocator(const QString &_loc, const QColor &_color); void clearMap(); //void setLocale (const QString _locale); signals: void doAddMarker(double latitude, double longitude); private slots: private: void createUI(); QQuickView qmlView; QStandardItemModel modelCircle, modelRectangle; QHash circleRoles; QHash rectangleRoles; int CoordinateRole = Qt::UserRole + 1000; int NorthRole = Qt::UserRole + 1000; int SouthRole = Qt::UserRole + 1001; int ColorRole = Qt::UserRole + 1002; Locator locator; //double lat, lon; }; #endif // MAPWIDGET_H klog-2.3.3/widgets/map/mapwindowwidget.cpp0000644000015700001710000003166614542412415020511 0ustar jenkinsjenkins/*************************************************************************** mapwidget.cpp - description ------------------- begin : May 2021 copyright : (C) 2021 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "mapwindowwidget.h" MapWindowWidget::MapWindowWidget(DataProxy_SQLite *dp, QWidget *parent) { Q_UNUSED(parent); //qDebug() << Q_FUNC_INFO; dataProxy = dp; //qDebug() << Q_FUNC_INFO << "1"; mapWidget = new MapWidget(this); //qDebug() << Q_FUNC_INFO << "2"; propComboBox = new QComboBox; bandComboBox = new QComboBox; modeComboBox = new QComboBox; satNameComboBox = new QComboBox; confirmedCheckBox = new QCheckBox; //locatorsCheckBox = new QCheckBox; //qDebug() << Q_FUNC_INFO << " - END"; } MapWindowWidget::~MapWindowWidget() { //qDebug() << Q_FUNC_INFO << " - Start"; delete(dataProxy); delete(mapWidget); //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::init() { //qDebug() << Q_FUNC_INFO << " - Start"; workedColor = Qt::black; confirmedColor = Qt::black; defaultColor = Qt::black; createUI(); //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::addMarker(const Coordinate _coord, const QString _loc) { Q_UNUSED(_loc); //qDebug() << Q_FUNC_INFO << QString(" %1 = %2/%3(lat/lon)").arg(_loc).arg(_coord.lat).arg(_coord.lon); mapWidget->addMarker(_coord); //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::createUI() { //qDebug() << Q_FUNC_INFO << " - Start"; bandComboBox->setToolTip(tr("Select QSOs in this band.")); modeComboBox->setToolTip(tr("Select QSOs in this mode.")); propComboBox->setToolTip(tr("Select QSOs in this propagation mode.")); satNameComboBox->setToolTip(tr("Select QSOs using this Satellite.")); confirmedCheckBox->setText(tr("Only confirmed")); confirmedCheckBox->setToolTip(tr("Select only confirmed QSOs.")); //locatorsCheckBox->setText(tr("Show Locators")); //locatorsCheckBox->setToolTip(tr("Show Locators or QSO positons.")); QGridLayout *buttonsLayout = new QGridLayout; buttonsLayout->addWidget(bandComboBox, 0, 0); buttonsLayout->addWidget(modeComboBox, 0, 1); buttonsLayout->addWidget(propComboBox, 1, 0); buttonsLayout->addWidget(satNameComboBox, 1, 1); //buttonsLayout->addWidget(okButton, 1, 2); buttonsLayout->addWidget(confirmedCheckBox, 0, 2); //buttonsLayout->addWidget(locatorsCheckBox, 1, 2); QVBoxLayout *layout = new QVBoxLayout(this); layout->addLayout(buttonsLayout); layout->addWidget(mapWidget); setLayout (layout); setPropModes(); setSatNames(); //qDebug() << Q_FUNC_INFO << "3"; mapWidget->init(); //qDebug() << Q_FUNC_INFO << "4"; connect(bandComboBox, SIGNAL(currentIndexChanged (QString)), this, SLOT(slotBandsComboBoxChanged())); connect(modeComboBox, SIGNAL(currentIndexChanged (QString)), this, SLOT(slotModesComboBoxChanged())); connect(propComboBox, SIGNAL(currentIndexChanged (QString)), this, SLOT(slotPropComboBoxChanged())); connect(satNameComboBox, SIGNAL(currentIndexChanged (QString)), this, SLOT(slotSatsComboBoxChanged())); connect(confirmedCheckBox, SIGNAL(clicked()), this, SLOT(slotConfirmedCheckBoxChanged())); //connect(locatorsCheckBox, SIGNAL(clicked()), this, SLOT(slotLocatorsCheckBoxChanged())); satNameComboBox->setEnabled(false); // Starts disable until propagation = SAT //qDebug() << Q_FUNC_INFO << "-END"; } void MapWindowWidget::setCenter(const Coordinate &_c) { //qDebug() << Q_FUNC_INFO << " - Start"; mapWidget->setCenter(_c); //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::setBands(const QStringList _bands) { //qDebug() << Q_FUNC_INFO << " - Start"; QStringList bands; bands.clear(); bands = _bands; bands.removeDuplicates(); //bands = dataProxy->sortBandNamesBottonUp(bands); bandComboBox->clear(); bands.prepend("All - " + tr("All bands")); bands.prepend("None - " + tr("Show nothing")); bandComboBox->addItems(bands); //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::setModes(const QStringList _modes) { //qDebug() << Q_FUNC_INFO << " - Start"; QStringList modes; modes.clear(); modes = _modes; modes.removeDuplicates(); modes.sort(); modes.prepend("All - " + tr("All modes")); modeComboBox->clear(); modeComboBox->addItems(modes); //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::setPropModes() { //qDebug() << Q_FUNC_INFO << " - Start"; QStringList propModeList; propModeList.clear(); propModeList = dataProxy->getPropModeList(); if (propModeList.size()>1) { propModeList.prepend("All - " + tr("All propagation modes")); //propModeList.prepend("01 - " + tr("Not - Not Identified")); propComboBox->addItems(propModeList); } //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::setSatNames() { //qDebug() << Q_FUNC_INFO << " - Start"; QString nosat = tr("All satellites"); //QString othersat = tr("Other - Sat not in the list"); QStringList satellitesList; satellitesList.clear(); satellitesList = dataProxy->getSatellitesList(); //satellitesList.prepend(othersat); satellitesList.prepend("All - " + nosat); if (satellitesList.size()>1) { satNameComboBox->clear(); satNameComboBox->addItems(satellitesList); } else { //TODO: Check how to do it better... now I could simply remove the if satNameComboBox->addItems(satellitesList); } //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::showFiltered() { //qDebug() << Q_FUNC_INFO << " - Start"; if (bandComboBox->currentIndex () == 0) { mapWidget->clearMap(); //qDebug() << Q_FUNC_INFO << " - END1"; return; } QStringList confirmedLocators; QStringList shortLocators, confirmedShortLocators; shortLocators.clear(); confirmedShortLocators.clear (); QString satName = satNameComboBox->currentText(); // Get Confirmed Locators // Print Confirmed // !only confirmed // Get worked locators // Remove confirmed from worked // Print Worked //locators << dataProxy->getFilteredLocators(bandComboBox->currentText(), modeComboBox->currentText(), getPropModeFromComboBox(), satName.section(' ', 0, 0), confirmedCheckBox->isChecked()); confirmedLocators << dataProxy->getFilteredLocators(bandComboBox->currentText(), modeComboBox->currentText(), getPropModeFromComboBox(), satName.section(' ', 0, 0), true); QColor color; Locator locator; confirmedShortLocators << locator.getShortLocators (confirmedLocators); confirmedShortLocators << confirmedLocators; confirmedShortLocators.removeDuplicates(); confirmedShortLocators.sort(); color = confirmedColor; color.setAlpha (127); addLocators(confirmedShortLocators, color);// The alpha gives some transparency if (!confirmedCheckBox->isChecked ()) { QStringList wLocators; wLocators.clear (); wLocators << dataProxy->getFilteredLocators(bandComboBox->currentText(), modeComboBox->currentText(), getPropModeFromComboBox(), satName.section(' ', 0, 0), false); QStringList workedLocators; workedLocators.clear (); foreach (QString loc, wLocators) { if (!confirmedShortLocators.contains (loc)) { workedLocators.append (loc); } } shortLocators.clear(); shortLocators << locator.getShortLocators (workedLocators); shortLocators << workedLocators; shortLocators.removeDuplicates(); workedLocators.clear (); foreach (QString loc, shortLocators) { if (!confirmedShortLocators.contains (loc)) { workedLocators.append (loc); } } workedLocators.sort(); color = workedColor; color.setAlpha (127);// The alpha gives some transparency appendLocators(workedLocators, color); } //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::slotBandsComboBoxChanged() { //qDebug() << Q_FUNC_INFO << " - Start"; showFiltered(); bandComboBox->setFocus(); //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::slotModesComboBoxChanged() { //qDebug() << Q_FUNC_INFO << " - Start"; showFiltered(); modeComboBox->setFocus(); //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::slotPropComboBoxChanged() { //qDebug() << Q_FUNC_INFO << " - Start"; if (getPropModeFromComboBox() == "SAT") { //qDebug() << Q_FUNC_INFO << ": SAT"; satNameComboBox->setCurrentIndex(0); satNameComboBox->setEnabled(true); } else { //qDebug() << Q_FUNC_INFO << ": NO SAT"; satNameComboBox->setCurrentIndex(0); satNameComboBox->setEnabled(false); } showFiltered(); propComboBox->setFocus(); //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::slotSatsComboBoxChanged() { //qDebug() << Q_FUNC_INFO << " - Start"; showFiltered(); satNameComboBox->setFocus(); //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::slotConfirmedCheckBoxChanged() { //qDebug() << Q_FUNC_INFO << " - Start"; showFiltered(); //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::addQSO(const QString &_loc) { Q_UNUSED(_loc); //qDebug() << Q_FUNC_INFO << ": " << _loc; //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::addLocator(const QString &_loc, const QColor &_color) { //qDebug() << Q_FUNC_INFO << ": " << _loc; //if (!locator.isValidLocator(_loc)) //{ // return; //} mapWidget->addLocator(_loc, _color); //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::addLocators(const QStringList &_locators, const QColor &_color) { //qDebug() << Q_FUNC_INFO << " - Start"; mapWidget->clearMap(); foreach(QString i, _locators) { if (i.contains ("IN99")) { //qDebug() << Q_FUNC_INFO << ": " << i; } mapWidget->addLocator(i, _color); } //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::appendLocators(const QStringList &_locators, const QColor &_color) { //qDebug() << Q_FUNC_INFO << " - Start"; foreach(QString i, _locators) { //mapWidget->addLocator(i, confirmedColor); mapWidget->addLocator(i, _color); } //qDebug() << Q_FUNC_INFO << " - END"; } QString MapWindowWidget::getPropModeFromComboBox() { //qDebug() << Q_FUNC_INFO << " - Start"; QString _pm = QString(); //qDebug() << Q_FUNC_INFO << ": " << propComboBox->currentText(); _pm = (((propComboBox->currentText()).split('-')).at(1)).simplified(); QString _n = (((propComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << Q_FUNC_INFO << ": " << _pm; if (_n == "00") { //qDebug() << Q_FUNC_INFO << " - END1"; return QString(); } //qDebug() << Q_FUNC_INFO << " - END"; return _pm; } void MapWindowWidget::paintGlobalGrid() { //qDebug() << Q_FUNC_INFO << " - Start"; //qDebug() << Q_FUNC_INFO << " - END"; } void MapWindowWidget::setColors (const QColor &_worked, const QColor &_confirmed, const QColor &_default) { //qDebug() << Q_FUNC_INFO << " - Start"; defaultColor = _default; workedColor = _worked; confirmedColor = _confirmed; //qDebug() << Q_FUNC_INFO << " - END"; } klog-2.3.3/inputwidgets/0000755000015700001710000000000014542412415015063 5ustar jenkinsjenkinsklog-2.3.3/inputwidgets/mainwindowsattab.cpp0000644000015700001710000007727014542412415021157 0ustar jenkinsjenkins /*************************************************************************** mainwindowsattab.cpp - description ------------------- begin : Jul 2016 copyright : (C) 2016 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "mainwindowsattab.h" /* This class implements the Satellite TAB of the MainWindow */ MainWindowSatTab::MainWindowSatTab(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "MainWindowSatTab::MainWindowSatTab" ; satNameComboBox = new QComboBox; satNameLineEdit = new QLineEdit; satModeLineEdit = new QLineEdit; satOtherLabel = new QLabel; satBandTXComboBox = new QComboBox; satBandRXComboBox = new QComboBox; //txFreqSpinBox = new QDoubleSpinBox; //rxFreqSpinBox = new QDoubleSpinBox; keepThisDataForNextQSOQcheckbox = new QCheckBox; dataProxy = dp; util = new Utilities(Q_FUNC_INFO); createUI(); populateSatComboBox(); qsoToEditInProcess = false; modifying = false; updatingBands = false; updatingSat = false; satNameLineEdit->setEnabled(false); satOtherLabel->setEnabled(false); palRed.setColor(QPalette::Text, Qt::red); palBlack.setColor(QPalette::Text, Qt::black); palWhite.setColor(QPalette::Text, Qt::white); setDefaultBands(); //TODO: Check how the bands are included not to create an inconsistence with the selected (in the setup) bands //qDebug() << "MainWindowSatTab::MainWindowSatTab - END" ; } MainWindowSatTab::~MainWindowSatTab(){ delete(util); delete(dataProxy); } void MainWindowSatTab::createUI() { connect(satNameLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotSatNameTextChanged() ) ); connect(satModeLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotSatModeTextChanged() ) ); //connect(satDXLocatorLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotSatDXLocTextChanged() ) ); connect(satNameLineEdit, SIGNAL(returnPressed()), this, SLOT(slotReturnPressed()) ); connect(satModeLineEdit, SIGNAL(returnPressed()), this, SLOT(slotReturnPressed()) ); //connect(satDXLocatorLineEdit, SIGNAL(returnPressed()), this, SLOT(slotReturnPressed()) ); connect(satNameComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSatNameComboBoxChanged() ) ) ; connect(satBandRXComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSatBandRXComboBoxChanged()) ) ; connect(satBandTXComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSatBandTXComboBoxChanged()) ) ; connect (keepThisDataForNextQSOQcheckbox, SIGNAL(clicked()), this, SLOT(slotSatKeepThisDataClicked()) ); QLabel *keepLabel = new QLabel(); keepLabel->setText(tr("Keep this data")); keepLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); keepLabel->setToolTip(tr("Data entered in this tab will be copied into the next QSO.")); keepThisDataForNextQSOQcheckbox->setToolTip(tr("Data entered in this tab will be copied into the next QSO.")); QString othersat = tr("Other - Sat not in the list"); QString aux; aux.clear(); aux = QString(tr("Name of the Satellite if not in the list. Select: \"%1\" to enable this box. (format like AO-51).").arg(othersat)); satNameLineEdit->setToolTip(aux); //satNameLineEdit->setToolTip(tr("Name of the Satellite if not in the list. Select Other Sat (format like AO-51)")); satModeLineEdit->setToolTip(tr("Satellite mode used.")); satNameComboBox->setToolTip(tr("Select the satellite you are using.")); satBandTXComboBox->setToolTip(tr("UpLink band.")); satBandRXComboBox->setToolTip(tr("DownLink band.")); QLabel *upLinkLabel = new QLabel(); upLinkLabel->setText(tr("UpLink")); upLinkLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *downLinkLabel = new QLabel(); downLinkLabel->setText(tr("DownLink")); downLinkLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *satNameLabel = new QLabel(); satNameLabel->setText(tr("Satellite")); satNameLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *satModeLabel = new QLabel(); satModeLabel->setText(tr("Mode")); satModeLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); //QLabel *satOtherLabel = new QLabel(); satOtherLabel->setText(tr("Other")); satOtherLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); //txFreqSpinBox->setDecimals(3); //txFreqSpinBox->setMaximum(99999); //txFreqSpinBox->setSuffix(" " + tr("MHz")); //rxFreqSpinBox->setDecimals(3); //rxFreqSpinBox->setMaximum(99999); //rxFreqSpinBox->setSuffix(" " + tr("MHz")); QHBoxLayout *keepLayout = new QHBoxLayout; keepLayout->addWidget(keepLabel); keepLayout->addWidget(keepThisDataForNextQSOQcheckbox); QHBoxLayout *lastlineLayout = new QHBoxLayout; //lastlineLayout->addWidget(satModeLabel); lastlineLayout->addWidget(satModeLineEdit); QGridLayout *tabLayout = new QGridLayout; tabLayout->addWidget(satNameLabel,0,0); tabLayout->addWidget(upLinkLabel,1,0); tabLayout->addWidget(downLinkLabel,2,0); tabLayout->addWidget(satModeLabel,3,0); tabLayout->addLayout(lastlineLayout,3,1); tabLayout->addWidget(satNameComboBox,0,1); tabLayout->addWidget(satBandTXComboBox,1,1); tabLayout->addWidget(satBandRXComboBox,2,1); //tabLayout->addWidget(satModeLineEdit,3,1); //tabLayout->addWidget(satModeLineEdit,3,1,1,-1); tabLayout->addWidget(satNameLineEdit,0,2); //tabLayout->addWidget(txFreqSpinBox,1,2); //tabLayout->addWidget(rxFreqSpinBox,2,2); tabLayout->addLayout(keepLayout,3,2); tabLayout->setSizeConstraint(QLayout::SetFixedSize); setLayout(tabLayout); } void MainWindowSatTab::slotSatNameComboBoxChanged() { //qDebug() << Q_FUNC_INFO << ": " << satNameComboBox->currentText(); if (modifying || (satNameComboBox->currentText().length()<4)) { //qDebug() << Q_FUNC_INFO << ": Modifying: return"; return; } updatingSat = true; int i = satNameComboBox->currentIndex(); //qDebug() << Q_FUNC_INFO << ": SAT index: " << QString::number(i); satNameLineEdit->clear(); if (i == 0) { //qDebug() << Q_FUNC_INFO << ": i=0, emitting setPropModeSat - Not"; emit setPropModeSat("Not", false); satNameLineEdit->setEnabled(false); satOtherLabel->setEnabled(false); satModeLineEdit->clear(); } else if(i == 1) { //qDebug() << Q_FUNC_INFO << ": i=1, emitting setPropModeSat - SAT"; emit setPropModeSat("SAT", keepThisDataForNextQSOQcheckbox->isChecked()); satNameLineEdit->setEnabled(true); satOtherLabel->setEnabled(true); autofillSatMode(); } else { //qDebug() << Q_FUNC_INFO << ": i = else, emitting setPropModeSat - SAT"; emit setPropModeSat("SAT", keepThisDataForNextQSOQcheckbox->isChecked()); satNameLineEdit->setEnabled(false); satOtherLabel->setEnabled(false); setBandsOfSat(satNameComboBox->currentText()); //dataProxy->getSatelliteMode(satNameComboBox->currentText()) autofillSatMode(); } updatingSat = false; //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindowSatTab::slotSatNameTextChanged() { //qDebug() << Q_FUNC_INFO << ": " << satNameLineEdit->text(); int cursor = satNameLineEdit->cursorPosition (); satNameLineEdit->setText((util->getClearSQLi (satNameLineEdit->text())).toUpper()); if (modifying ) { satNameLineEdit->setCursorPosition (cursor); //qDebug() << Q_FUNC_INFO << ": Modifying return"; return; } if ((satNameLineEdit->text()).length()>0) { //qDebug() << Q_FUNC_INFO << ": Emitting setPropModeSat -SAT- signal"; emit setPropModeSat("SAT", keepThisDataForNextQSOQcheckbox->isChecked()); } else if ((satModeLineEdit->text()).length()<1) { //qDebug() << Q_FUNC_INFO << ": Emitting setPropModeSat -Not- signal"; emit setPropModeSat("Not", false); } satNameLineEdit->setCursorPosition (cursor); //qDebug() << Q_FUNC_INFO << ": - END"; } void MainWindowSatTab::slotSatModeTextChanged() { //qDebug() << Q_FUNC_INFO << ": - " << satModeLineEdit->text(); /* satModeLineEdit->setText((satModeLineEdit->text()).toUpper()); if ((satModeLineEdit->text()).length()>0) { emit setPropModeSat("SAT"); } else if ((satNameLineEdit->text()).length()<1) { emit setPropModeSat("Not"); } */ //qDebug() << Q_FUNC_INFO << ": - END"; } QString MainWindowSatTab::getSatName() { // Sat name must follow the format CC-NN to make it compatible with LOTW // C = Character // N = Number /* QString satName; satName = satNameLineEdit->text(); //TODO: Check that the format is OK return satName; */ //qDebug() << Q_FUNC_INFO << ": - " << satNameComboBox->currentText(); QString _pm = QString(); QString satName = QString(); _pm = (((satNameComboBox->currentText()).split(' ')).at(0)).simplified(); //qDebug() << "MainWindowSatTab::satNameComboBox: " << _pm; if (satNameComboBox->currentIndex() == 0) { //qDebug() << Q_FUNC_INFO << ": 0 return "; return QString(); } else if(satNameComboBox->currentIndex() == 1) { satName = satNameLineEdit->text(); if (satName.length()>0) { //qDebug() << Q_FUNC_INFO << ": - satName.length>0 return: " << satName; return satName; } else { //qDebug() << Q_FUNC_INFO << ": - else return"; return QString(); } } else { //qDebug() << Q_FUNC_INFO << ": - return _pm: " << _pm; return _pm; } //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindowSatTab::setNoSat() { //qDebug() << Q_FUNC_INFO << ": - Start"; satNameComboBox->setCurrentIndex(0); setSatMode("-CLEAR-"); keepThisDataForNextQSOQcheckbox->setChecked(false); //qDebug() << Q_FUNC_INFO << "- END"; } void MainWindowSatTab::setSatName(const QString &_t) { //TODO: Check that the format is OK //qDebug() << Q_FUNC_INFO << ": " << _t; //satNameLineEdit->setText(_t); if (_t =="") { //qDebug() << Q_FUNC_INFO << ": empty- return"; return; } if (getSatIndex(_t) > 0) { setSatelliteCombo(_t); } else { satNameComboBox->setCurrentIndex(1); satNameLineEdit->setText(_t); } //qDebug() << Q_FUNC_INFO << " - END"; } QString MainWindowSatTab::getSatMode() { //qDebug() << Q_FUNC_INFO << ": " << satModeLineEdit->text(); return satModeLineEdit->text(); } void MainWindowSatTab::setSatMode(const QString &_t) { //qDebug() << Q_FUNC_INFO << ": " << _t ; if (_t == "-CLEAR-") { satModeLineEdit->clear(); } else { satModeLineEdit->setText(_t); } //qDebug() << Q_FUNC_INFO << " - END"; } bool MainWindowSatTab::getRepeatThis() { //qDebug() << Q_FUNC_INFO << " - Start" ; return keepThisDataForNextQSOQcheckbox->isChecked(); } void MainWindowSatTab::setRepeatThis(const bool _t) { //qDebug() << Q_FUNC_INFO << " - Start" ; keepThisDataForNextQSOQcheckbox->setChecked(_t); } void MainWindowSatTab::clear(bool _full) { //qDebug() << Q_FUNC_INFO << " - Start" ; modifying = false; if ((keepThisDataForNextQSOQcheckbox->isChecked()) || (!_full)) { } else { satModeLineEdit->clear(); satNameComboBox->setCurrentIndex(0); satNameLineEdit->clear(); } if (_full) { keepThisDataForNextQSOQcheckbox->setChecked (false); } //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindowSatTab::refreshData() { //qDebug() << Q_FUNC_INFO << " - Start" ; populateSatComboBox(); //autofillSatMode(); } void MainWindowSatTab::populateSatComboBox() { //qDebug() << Q_FUNC_INFO << " - Start" ; QString nosat = tr("Not Sat QSO"); QString othersat = tr("Other - Sat not in the list"); satellitesList.clear(); satellitesList = dataProxy->getSatellitesList(); satellitesList.prepend(othersat); satellitesList.prepend("No-SAT - " + nosat); if (satellitesList.size()>1) { satNameComboBox->clear(); satNameComboBox->addItems(satellitesList); } else { //TODO: Check how to do it better... now I could simply remove the if satNameComboBox->addItems(satellitesList); } //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindowSatTab::setSatelliteCombo(const QString &_p) { //qDebug() << Q_FUNC_INFO << " - Start: " << _p ; QString aux = QString(); int indexC = getSatIndex(_p); //int indexC = satNameComboBox->findText(_p, Qt::MatchContains); //qDebug() << "MainWindowsatTab::setSatelliteCombo: N=" << QString::number(indexC); if (indexC>0) { satNameComboBox->setCurrentIndex(indexC); } else { satNameComboBox->setCurrentIndex(0); if (_p.length()>0) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); aux = tr("KLog has detected a satellite name that it does not recognise. If it should use one of the names of known satellites instead, please select it from the list. Alternatively, please contact the development team to add the new satellite name.") + "\n\n"; msgBox.setText(aux + tr("The satellite you have in your QSO is: ") + _p + "\n\n" + tr("Please be aware that the satellite name will not be saved if it is not in the list, so that information may be lost!")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Ok: break; default: // should never be reached break; } } } //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindowSatTab::setOtherSatName(const QString &_t) { //qDebug() << Q_FUNC_INFO << " - Start: " << _t ; satNameLineEdit->setText(_t); } QString MainWindowSatTab::getOtherSatName() { //qDebug() << Q_FUNC_INFO << " - Start" ; return QString(); } int MainWindowSatTab::getSatIndex(const QString &_p) { //qDebug() << Q_FUNC_INFO << ": - " << QString::number(satNameComboBox->findText(_p, Qt::MatchContains)) ; return satNameComboBox->findText(_p, Qt::MatchContains); } void MainWindowSatTab::addBands(QStringList _bands) { //qDebug() << Q_FUNC_INFO << " - Start: " << QString::number(_bands.length()); updatingBands = true; QString _txBand = satBandTXComboBox->currentText(); QString _rxBand = satBandRXComboBox->currentText(); //txBandsBeingChanged = true; satBandRXComboBox->clear(); satBandTXComboBox->clear(); satBandTXComboBox->addItems(_bands); satBandRXComboBox->addItems(_bands); satBandTXComboBox->setCurrentIndex(satBandTXComboBox->findText(_txBand, Qt::MatchCaseSensitive)); satBandRXComboBox->setCurrentIndex(satBandRXComboBox->findText(_rxBand, Qt::MatchCaseSensitive)); //txBandsBeingChanged = false; updatingBands = false; //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindowSatTab::setDefaultBands() {//Defines the default bands for SAT communications: 10m/2m/70cm/23CM only if they exist in the selected bands //qDebug() << Q_FUNC_INFO << " - Start" ; QStringList _b; _b.clear(); _b << "10M" << "2M" << "70CM" << "23CM"; satBandRXComboBox->addItems(_b); satBandTXComboBox->addItems(_b); //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindowSatTab::slotSatBandRXComboBoxChanged() { //qDebug() << Q_FUNC_INFO << " - Start" ; if (updatingBands || modifying) { //qDebug() << Q_FUNC_INFO << " - return 1"; return; } bool freqInBand = dataProxy->isThisFreqInBand(satBandRXComboBox->currentText(), QString::number(freqRX)); if(!freqInBand) { // If the freq does not belong to the current band, we need to update the band //qDebug() << Q_FUNC_INFO << " changing to: Band: " << satBandTXComboBox->currentText() ; //qDebug() << Q_FUNC_INFO << " changing to: " << QString::number(dataProxy->getLowLimitBandFromBandName(satBandTXComboBox->currentText())) ; setNoSat (); updateRXFreq(dataProxy->getLowLimitBandFromBandName(satBandRXComboBox->currentText())); } autofillSatMode(); //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindowSatTab::slotSatBandTXComboBoxChanged() { //qDebug() << Q_FUNC_INFO << " - " << satBandTXComboBox->currentText(); if (updatingBands || modifying || (satBandTXComboBox->currentText().length()<2)) { //qDebug() << Q_FUNC_INFO << " - return"; return; } //qDebug() << Q_FUNC_INFO << " - Freq: " << QString::number(freqTX); QString tmpBand = satBandTXComboBox->currentText(); bool freqInBand = dataProxy->isThisFreqInBand(tmpBand, QString::number(freqTX)); if(!freqInBand) { // If the freq does not belong to the current band, we need to update the band //qDebug() << "MainWindowsatTab::slotSatBandTXComboBoxChanged changing to: Band: " << satBandTXComboBox->currentText() ; //qDebug() << "MainWindowsatTab::slotSatBandTXComboBoxChanged changing to: " << QString::number(dataProxy->getLowLimitBandFromBandName(satBandTXComboBox->currentText())) ; QString tmpFreq = dataProxy->getFreqFromBandId(dataProxy->getIdFromBandName(satBandTXComboBox->currentText())); //qDebug() << ": Normal" << dataProxy->getSatelliteUplink(getSatName()); //qDebug() << ": Normal1" << dataProxy->getSatelliteUplink(getSatName(), 1); //qDebug() << ": Normal2" << dataProxy->getSatelliteUplink(getSatName(), 2); //qDebug() << ": Full" << dataProxy->getSatelliteFullUplink(getSatName()); double upLink = tmpFreq.toDouble(); double downLink; if (dataProxy->isThisFreqInBand(tmpBand,dataProxy->getSatelliteUplink(getSatName(),1)) ) { upLink = (dataProxy->getSatelliteUplink(getSatName(),1)).toDouble(); downLink = (dataProxy->getSatelliteDownlink(getSatName(),1)).toDouble(); updateRXFreq(downLink); } else if (dataProxy->isThisFreqInBand(tmpBand,dataProxy->getSatelliteUplink(getSatName(),0)) ) { upLink = (dataProxy->getSatelliteUplink(getSatName(),0)).toDouble(); downLink = (dataProxy->getSatelliteDownlink(getSatName(),1)).toDouble(); updateRXFreq(downLink); } else { //qDebug() << Q_FUNC_INFO << " - Selected satelite does not work in the selected band. NO sat should be selected"; setNoSat (); } updateTXFreq(upLink); } autofillSatMode(); //qDebug() << Q_FUNC_INFO << " - END" ; } void MainWindowSatTab::setUpLink(const QString &_t) { //qDebug() << Q_FUNC_INFO << "Start: " << _t ; if (satBandTXComboBox->currentText () == _t) { //qDebug() << Q_FUNC_INFO << "END-1"; return; } int index = satBandTXComboBox->findText(_t, Qt::MatchCaseSensitive); //qDebug() << "MainWindowsatTab::setUpLink: new index: " << QString::number(index); //qDebug() << "MainWindowsatTab::setUpLink: current index: " << QString::number(satBandTXComboBox->currentIndex()); //int indexRX; if (index>=0) { satBandTXComboBox->setCurrentIndex(index); } /* if (index>=0) { satBandTXComboBox->setCurrentIndex(index); if ( dataProxy->getIdFromBandName("2M") == dataProxy->getIdFromBandName(_t) ) { //qDebug() << satNameComboBox->currentText() ; if (satNameComboBox->findText("AO-7 - AMSAT-OSCAT 7", Qt::MatchCaseSensitive)) { indexRX = satBandRXComboBox->findText("10M", Qt::MatchCaseSensitive); } else { indexRX = satBandRXComboBox->findText("70CM", Qt::MatchCaseSensitive); } satBandRXComboBox->setCurrentIndex(indexRX); } else if ( dataProxy->getIdFromBandName("70CM") == dataProxy->getIdFromBandName(_t) ) { indexRX = satBandRXComboBox->findText("2M", Qt::MatchCaseSensitive); satBandRXComboBox->setCurrentIndex(indexRX); } } */ //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindowSatTab::setUpLinkFreq(const double _t) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_t); if ((!updatingSat) && (!qsoToEditInProcess)) { //qDebug() << Q_FUNC_INFO << ": Calling setNoSat"; setNoSat (); } updateTXFreq(_t); setUpLink(dataProxy->getBandNameFromFreq(_t)); //qDebug() << Q_FUNC_INFO << "END"; } double MainWindowSatTab::getRXFreq() { //qDebug() << Q_FUNC_INFO << " - Start" ; return freqRX; } void MainWindowSatTab::setDownLinkFreq(const double _t) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_t); if (util->isSameFreq (freqRX, _t)) { //qDebug() << Q_FUNC_INFO << " - Is same freq"; return; } updateRXFreq(_t); QString downLinkBand = dataProxy->getBandNameFromFreq(freqRX); int index = satBandRXComboBox->findText(downLinkBand, Qt::MatchCaseSensitive); //qDebug() << Q_FUNC_INFO << ": " << downLinkBand; if (index>=0) { satBandRXComboBox->setCurrentIndex(index); } //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindowSatTab::updateRXFreq(const double _f) { //qDebug() << Q_FUNC_INFO << QString::number(_f); if (util->isSameFreq (freqRX, _f)) { //qDebug() << Q_FUNC_INFO << " - END-1"; return; } freqRX = _f; if (modifying) { //qDebug() << Q_FUNC_INFO << " - END-2"; return; } int bandId = dataProxy->getBandIdFromFreq(freqRX); if (bandId>=1) { //This prevent that a non-hamradio frequency is used on TX //qDebug() << Q_FUNC_INFO << " - Freq IS in ham band"; bool freqInBand = dataProxy->isThisFreqInBand(satBandRXComboBox->currentText(), QString::number(freqRX)); if(!freqInBand) { // If the freq does not belong to the current band, we need to update the band //qDebug() << Q_FUNC_INFO << " - Freq in current band"; QString aux; aux = dataProxy->getBandNameFromFreq(freqRX); if (satBandRXComboBox->findText(aux, Qt::MatchCaseSensitive)<0) { addNewBand(aux); } //addNewBand(const QString &_p) satBandRXComboBox->setCurrentIndex(satBandRXComboBox->findText(aux, Qt::MatchCaseSensitive)); } } emit satRxFreqChanged(freqRX); //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindowSatTab::updateTXFreq(const double _f) { //qDebug() << Q_FUNC_INFO << QString::number(_f); // user changes TX Freq // If band is real and band is configured, bandcombo is selected // If band is real and not configured, we launch the band config and select the band. // if band is real emit the band if (util->isSameFreq (freqTX, _f)) { //qDebug() << Q_FUNC_INFO << " - END-1"; return; } freqTX = _f; if (modifying) { //qDebug() << Q_FUNC_INFO << " - END-2"; return; } int bandId = dataProxy->getBandIdFromFreq(freqTX); if (bandId>=1) { //This prevent that a non-hamradio frequency is used on TX bool freqInBand = dataProxy->isThisFreqInBand(satBandTXComboBox->currentText(), QString::number(freqTX)); if(!freqInBand) { // If the freq does not belong to the current band, we need to update the band //qDebug() << Q_FUNC_INFO << ": If the freq does not belong to the current band, we need to update the band"; //qDebug() << Q_FUNC_INFO << ": We define UpLink to: " << dataProxy->getBandNameFromFreq(txFreqSpinBox->value()); QString aux = dataProxy->getBandNameFromFreq(freqTX); //qDebug() << Q_FUNC_INFO << QString("FreqTx = %1 / Band = %2").arg(freqTX).arg(aux); if (satBandTXComboBox->findText(aux, Qt::MatchCaseSensitive)<0) { addNewBand(aux); } satBandTXComboBox->setCurrentIndex(satBandTXComboBox->findText(aux, Qt::MatchCaseSensitive)); //setUpLinkFreq(dataProxy->getLowLimitBandFromBandName(satBandTXComboBox->currentText())); } //autofillSatMode(); } //qDebug() << Q_FUNC_INFO << QString::number(freqTX); emit satTxFreqChanged(freqTX); //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindowSatTab::setBandsOfSat(const QString &_p) { // Until the data is in the DB, this function tries to solve data of active sats from: http://www.amsat.org/status/ // This function: // - identifies the freqs & bands that the sat is using //qDebug() << Q_FUNC_INFO << ": " << _p << " - Short: " << _p.section(' ', 0, 0); //"AO-7 - AMSAT-OSCAT 7" //2M/10M << 2M/70CM if (modifying) { //qDebug() << Q_FUNC_INFO << ": modifying return"; return; } double upLink = (dataProxy->getSatelliteUplink(_p.section(' ', 0, 0))).toDouble(); double downLink = (dataProxy->getSatelliteDownlink(_p.section(' ', 0, 0))).toDouble(); //qDebug() << Q_FUNC_INFO << ": upLink: " << QString::number(upLink)<< QT_ENDL; //qDebug() << Q_FUNC_INFO << ": downLink: " << QString::number(downLink)<< QT_ENDL; if (upLink>0) { //qDebug() << "MainWindowSatTab::setBandsOfSat upLink: emitting: " << QString::number(upLink)<< QT_ENDL; emit satTXFreqNeeded(upLink); //qDebug() << "MainWindowSatTab::setBandsOfSat upLink: emitted: " << QString::number(upLink)<< QT_ENDL; } else { //qDebug() << "MainWindowSatTab::setBandsOfSat upLink: setting to ZERO (should be = RX) " << QT_ENDL; updateTXFreq(0.0); } if (downLink>0) { //qDebug() << "MainWindowSatTab::setBandsOfSat downLink: emitting: " << QString::number(downLink)<< QT_ENDL; emit satRXFreqNeeded(downLink); //qDebug() << "MainWindowSatTab::setBandsOfSat downLink: emitted: " << QString::number(downLink)<< QT_ENDL; } else { //qDebug() << "MainWindowSatTab::setBandsOfSat downLink: setting to ZERO" << QT_ENDL; updateRXFreq(0.0); //satBandRXComboBox->setCurrentIndex(0); } //qDebug() << "MainWindowSatTab::setBandsOfSat downLink: emiting: " << QString::number(downLink)<< QT_ENDL; //emit satRxFreqChanged(downLink); //qDebug() << Q_FUNC_INFO << ": " << _p << " - END " ; } void MainWindowSatTab::addNewBand(const QString &_p) { //qDebug() << Q_FUNC_INFO << ": " << _p; if (dataProxy->getIdFromBandName(_p)<0) { //qDebug() << "MainWindowSatTab::addNewBand: Id: " << QString::number(dataProxy->getIdFromBandName(_p)); return; } QStringList bands; bands.clear(); int indexRX = satBandRXComboBox->currentIndex(); int indexTX = satBandTXComboBox->currentIndex(); //qDebug() << "MainWindowSatTab::addNewBand: RX Id: " << QString::number(satBandRXComboBox->count()); //qDebug() << "MainWindowSatTab::addNewBand: TX Id: " << QString::number(satBandTXComboBox->count()); for (int i = 0; i < satBandTXComboBox->count(); i++) { bands << satBandTXComboBox->itemText(i); for (int ii = 0; ii < satBandRXComboBox->count(); ii++) { bands << satBandRXComboBox->itemText(ii); } } bands << _p; //bands.removeDuplicates(); emit newBandsToBeAdded(bands); satBandRXComboBox->setCurrentIndex(indexRX); satBandTXComboBox->setCurrentIndex(indexTX); //addBands(bands); //qDebug() << Q_FUNC_INFO << ": 2 RX Id: " << QString::number(satBandRXComboBox->count()); //qDebug() << Q_FUNC_INFO << ": 2 TX Id: " << QString::number(satBandTXComboBox->count()); } void MainWindowSatTab::setModifying (const bool _m) { //qDebug() << Q_FUNC_INFO << util->boolToQString(_m); modifying = _m; } void MainWindowSatTab::setFillingToEdit(const bool _m) { // Some functions should know that data is arriving to the UI from qsoToEdit to // prevent some auto settings, like band setting when a satellite is selected. //qDebug() << Q_FUNC_INFO << util->boolToQString(_m); qsoToEditInProcess = _m; } void MainWindowSatTab::slotReturnPressed() { //qDebug() << Q_FUNC_INFO << " - Start"; emit returnPressed(); } void MainWindowSatTab::slotSatKeepThisDataClicked() { //qDebug() << Q_FUNC_INFO << " - Start"; if (keepThisDataForNextQSOQcheckbox->isChecked()) { //qDebug() << Q_FUNC_INFO << ": True"; } else { //qDebug() << Q_FUNC_INFO << ": False"; } slotSatNameComboBoxChanged(); //qDebug() << Q_FUNC_INFO << " - END"; } void MainWindowSatTab::autofillSatMode() { //qDebug() << Q_FUNC_INFO << " - Start"; QString downLinkBand = bandToLetter(dataProxy->getBandNameFromFreq(freqRX)); QString upLinkBand = bandToLetter(dataProxy->getBandNameFromFreq(freqTX)); satModeLineEdit->setText(upLinkBand + "/" + downLinkBand); //qDebug() << Q_FUNC_INFO << " - END"; } QString MainWindowSatTab::bandToLetter(const QString &_band) { //qDebug() << Q_FUNC_INFO << " - Start: " << _band; QString letter = ""; if (_band == "15M") { letter = "H"; } else if (_band == "10M") { letter = "A"; } else if (_band == "2M") { letter = "V"; } else if (_band == "70CM") { letter = "U"; } else if (_band == "23CM") { letter = "L"; } else if (_band == "13CM") { letter = "S"; } else if (_band == "5CM") { letter = "C"; } else if (_band == "3CM") { letter = "X"; } else if (_band == "1.25CM") { letter = "K"; } else { letter = "-"; } //qDebug() << Q_FUNC_INFO << ": " << _band << " -> " << letter; return letter; } void MainWindowSatTab::setKeep(const bool _b) { //qDebug() << Q_FUNC_INFO << " - Start"; keepThisDataForNextQSOQcheckbox->setChecked (_b); } bool MainWindowSatTab::getKeep() { //qDebug() << Q_FUNC_INFO << " - Start"; return keepThisDataForNextQSOQcheckbox->isChecked (); } bool MainWindowSatTab::getDarkMode() { //qDebug() << Q_FUNC_INFO << " - Start"; if (satNameLineEdit->palette().color (QPalette::Base) == "#646464") { return true; } else { return false; } } klog-2.3.3/inputwidgets/mainwindowmydatatab.h0000644000015700001710000001227314542412415021304 0ustar jenkinsjenkins#ifndef KLOG_INPUTWIDGETS_MAINWINDOWMYDATATAB_H #define KLOG_INPUTWIDGETS_MAINWINDOWMYDATATAB_H /*************************************************************************** mainwindowmydatatab.h - description ------------------- begin : jul 2016 copyright : (C) 2016 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the mainwindow that supports MY DATA // #include #include #include "../klogdefinitions.h" #include "../locator.h" #include "../utilities.h" #include "../dataproxy_sqlite.h" //#include "dataproxy_sqlite.h" class MainWindowMyDataTab : public QWidget { Q_OBJECT public: explicit MainWindowMyDataTab(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~MainWindowMyDataTab(); void createUI(); void setData(const QString &_stationCallsign, const QString &_operator, const QString &_myLocator); //void setSetupStationQRZ(const QString &_op); void setSetupMyLocator(const QString &_op); void setMyPower(const double _power); double getMyPower(); //double getLastPower(); void setOperator(const QString &_op); QString getOperator(); //QString getLastOperator(); void setStationCallsign(const QString &_op); // Sets ONLY the LineEdit, not the internal/configured stationCallsign QString getStationCallsign(); //QString getLastStationQRZ(); void setMyLocator(const QString &_op); QString getMyLocator(); bool setMyRig(const QString &_op); QString getMyRig(); bool setMyAntenna(const QString &_op); QString getMyAntenna(); bool setMySOTA(const QString &_op); QString getMySOTA(); bool setMyVUCCGrids(const QString &_op); QString getMyVUCCGrids(); // Returns the VUCC list in LOC1, LOC2 or LOC1,LOC2, LOC3, LOC4 format bool setUserADIFTypeComboBox(const QString &_value); QString getUserADIFTypeComboBox(); bool setUserADIFValue(const QString &_adifValue); QString getUserADIFValue(); void show(); //Shows the values into the widget void clear(bool _full = false); //full= false leaves the "keep this data"; full = true clears everything void setKeep(const bool _b); bool getKeep(); void setModify(const bool _modify); void setLogLevel (const DebugLogLevel _b); void loadSettings(); signals: void debugLog (QString _func, QString _msg, DebugLogLevel _level); void myLocChangedSignal(const QString &_q); // MyLocator once updated void returnPressed(); private slots: void slotMyLocatorTextChanged(); void slotOperatorTextChanged(); void slotStationCallSignTextChanged(); void slotReturnPressed(); void slotMyUserADIFComboBoxChanged(); void slotSetCurrentMyUSerData(); private: void logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level); bool setInitialADIFValues(); void setColorsForMyUserADIFLineEdit(); bool checkMyVUCC_GRIDS(const QString &_string); QStringList adifValidTypes; QDoubleSpinBox *myPowerSpinBox; QString stationCallsign, operatorQRZ, myLocator; //Not changed during normal operations. They come from the configuration QString lastOperatorQRZ, lastMyLocator; //lastStationQRZ, Change dinamically during execution double myPower, lastPower; QLineEdit *operatorLineEdit, *stationCallSignLineEdit, *myLocatorLineEdit, *myUserADIFLineEdit; QComboBox *myUserADIFComboBox; QCheckBox *keepThisDataForNextQSOQCheckbox; QPalette palRed, palBlack, palWhite; // To paint Text in red or black(normal) Locator *locator; DataProxy_SQLite *dataProxy; Utilities *util; bool modify; QString my_rig, my_sota, my_antenna, my_vucc_grids; DebugLogLevel logLevel; bool getDarkMode(); }; #endif // MAINWINDOWMYDATATAB_H klog-2.3.3/inputwidgets/mainwindowsattab.h0000644000015700001710000001243414542412415020613 0ustar jenkinsjenkins#ifndef KLOG_INPUTWIDGETS_MAINWINDOWSATTAB_H #define KLOG_INPUTWIDGETS_MAINWINDOWSATTAB_H /*************************************************************************** mainwindowsattab.h - description ------------------- begin : jan 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the mainwindow that supports Satellites // #include #include #include "../dataproxy_sqlite.h" //#include "../locator.h" #include "../utilities.h" class MainWindowSatTab : public QWidget { Q_OBJECT friend class tst_MainWindowSatTab; public: explicit MainWindowSatTab(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~MainWindowSatTab(); QString getSatName(); void setSatName(const QString &_t); void setOtherSatName(const QString &_t); void setNoSat(); QString getOtherSatName(); QString getSatMode(); double getRXFreq(); //double getTXFreq(); void setSatMode(const QString &_t); bool getRepeatThis(); void setRepeatThis(const bool _t); void addBands(QStringList _bands); void setDefaultBands(); //Defines the default bands for SAT communications: 10m/2m/70cm/23CM only if they exist in the selected bands void setUpLinkFreq(const double _t); void setDownLinkFreq(const double _t); //void updateTXFreq(const double _f); //void updateRXFreq(const double _f); //void setLocator(const QString &_t); void refreshData(); void setModifying (const bool _m); void setFillingToEdit(const bool _m); void setKeep(const bool _b); bool getKeep(); void clear(bool _full = false); //full= false leaves the "keep this data"; full = true clears everything signals: void setPropModeSat(const QString &_p, const bool _keep); //void satBandTXChanged(const QString &_p); //void satBandRXChanged(const QString &_p); void newBandsToBeAdded(const QStringList _p); void satTxFreqChanged(const double _p); void satRxFreqChanged(const double _p); void satTXFreqNeeded(const double _p); void satRXFreqNeeded(const double _p); //void dxLocatorChanged(const QString &_p); void returnPressed(); private slots: void slotSatNameTextChanged(); void slotSatModeTextChanged(); //void slotSatDXLocTextChanged(); void slotSatNameComboBoxChanged(); void slotSatBandRXComboBoxChanged(); void slotSatBandTXComboBoxChanged(); //void slotSatFreqRXChanged(const double _f); //void slotSatFreqTXChanged(const double _f); void slotReturnPressed(); void slotSatKeepThisDataClicked(); private: void createUI(); void populateSatComboBox(); void setSatelliteCombo(const QString &_p); int getSatIndex(const QString &_p); void setBandsOfSat(const QString &_p); void addNewBand(const QString &_p); void setUpLink(const QString &_t); QString bandToLetter(const QString &_band); void updateTXFreq(const double _f); void updateRXFreq(const double _f); void autofillSatMode(); QLineEdit *satNameLineEdit; QLineEdit *satModeLineEdit; //QLineEdit *satDXLocatorLineEdit; QLabel *satOtherLabel; QCheckBox *keepThisDataForNextQSOQcheckbox; QComboBox *satNameComboBox; QComboBox *satBandTXComboBox, *satBandRXComboBox; QStringList satNames, satModes; QStringList satellitesList; bool updatingBands, updatingSat; bool qsoToEditInProcess; // True just when MainWindow::qsoToEdit is being executed QPalette palRed, palBlack, palWhite; // To paint Text in red or black(normal) //QDoubleSpinBox *txFreqSpinBox, *rxFreqSpinBox; DataProxy_SQLite *dataProxy; Utilities *util; double freqTX, freqRX; int downLinkBandId, upLinkBandId; QString downLinkBand, upLinkBand; bool modifying; bool getDarkMode(); }; #endif // MAINWINDOWSATTAB_H klog-2.3.3/inputwidgets/mainwindowinputothers.cpp0000644000015700001710000006010414542412415022251 0ustar jenkinsjenkins/*************************************************************************** mainwindowinputothers.cpp - description ------------------- begin : Ago 2016 copyright : (C) 2016 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "mainwindowinputothers.h" MainWindowInputOthers::MainWindowInputOthers(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << Q_FUNC_INFO; logLevel = None; dataProxy = dp; util = new Utilities(Q_FUNC_INFO); //QLabel *entityPrimLabel, *entitySecLabel, *iotaAwardLabel, *entityNameLabel, *propModeLabel; iotaContinentComboBox = new QComboBox(); entityPrimDivComboBox = new QComboBox(); entitySecDivComboBox = new QComboBox(); entityNameComboBox = new QComboBox(); propModeComboBox = new QComboBox(); iotaNumberLineEdit = new QLineEdit(); keepPropCheckBox = new QCheckBox(); userDefinedADIFComboBox = new QComboBox(); userDefinedADIFValueLineEdit = new QLineEdit(); // TODO: I should find the way to connect the SAT tabwidget's signal to set the propmode in this widget // Now it is done though the mainwindow but I should avoid depending on that class for that, if possible //connect(satTabWidget, SIGNAL(setPropModeSat(QString)), this, SLOT(slotSetPropMode(QString)) ) ; connect(propModeComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotPropModeComboBoxChanged() ) ) ; connect(userDefinedADIFComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotUSerDefinedADIFComboBoxChanged() ) ) ; connect(userDefinedADIFValueLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotSetCurrentUSerData() ) ); createUI(); setInitialADIFValues (); //qDebug() << Q_FUNC_INFO << ": "- END"; } MainWindowInputOthers::~MainWindowInputOthers() { logEvent (Q_FUNC_INFO, "Start", Debug); delete(util); } void MainWindowInputOthers::createUI() { //qDebug() << Q_FUNC_INFO ; logEvent (Q_FUNC_INFO, "Start", Debug); entitiesList.clear(); propModeList.clear(); adifValidTypes.clear(); autoUpdating = false; sota_ref = QString(); distance = 0; age = 0; palRed.setColor(QPalette::Text, Qt::red); palBlack.setColor(QPalette::Text, Qt::black); palWhite.setColor(QPalette::Text, Qt::white); QLabel *entityPrimLabel = new QLabel(tr("Primary Div")); QLabel *entitySecLabel = new QLabel(tr("Secondary Div")); QLabel *iotaAwardLabel = new QLabel(tr("IOTA")); QLabel *entityNameLabel = new QLabel(tr("Entity")); QLabel *propModeLabel = new QLabel(tr("Propagation mode")); QLabel *userSelectLabel = new QLabel(tr("Others")); entityPrimLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); entitySecLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); iotaAwardLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); entityNameLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); propModeLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); userSelectLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); keepPropCheckBox->setText(tr("Keep propagation mode")); entityPrimDivComboBox->setToolTip(tr("Select the primary division for this QSO.")); entitySecDivComboBox->setToolTip(tr("Select the secondary division for this QSO.")); entityNameComboBox->setToolTip(tr("Select the entity for this QSO.")); propModeComboBox->setToolTip(tr("Select the propagation mode for this QSO.")); iotaContinentComboBox->setToolTip(tr("Select the IOTA continent for this QSO.")); iotaNumberLineEdit->setToolTip(tr("Select the IOTA reference number for this QSO.")); keepPropCheckBox->setToolTip(tr("Keeps the same propagation mode for next QSO.")); userDefinedADIFComboBox->setToolTip(tr("Select the appropriate ADIF field for this QSO.")); userDefinedADIFValueLineEdit->setToolTip (tr("Value for the selected ADIF field.")); entityPrimDivComboBox->setEnabled(false); entitySecDivComboBox->setEnabled(false); entityNameComboBox->setEnabled(true); propModeComboBox->setEnabled(true); keepPropCheckBox->setEnabled(true); QHBoxLayout *keepLayout = new QHBoxLayout; keepLayout->addWidget(propModeComboBox); //keepLayout->addWidget(keepPropCheckBox); keepLayout->setSizeConstraint(QLayout::SetFixedSize); QGridLayout *tabLayout = new QGridLayout; tabLayout->addWidget(entityNameLabel, 0, 0); tabLayout->addWidget(entityNameComboBox, 0, 1, 1, 2); tabLayout->addWidget(entityPrimLabel, 1, 0); tabLayout->addWidget(entityPrimDivComboBox, 1, 1, 1, 2); tabLayout->addWidget(entitySecLabel, 2, 0); tabLayout->addWidget(entitySecDivComboBox, 2, 1, 1, 2); tabLayout->addWidget(iotaAwardLabel, 3, 0); tabLayout->addWidget(iotaContinentComboBox, 3, 1); tabLayout->addWidget(iotaNumberLineEdit, 3, 2); tabLayout->addWidget(propModeLabel, 4, 0); tabLayout->addLayout(keepLayout, 4, 1, 1, 2); tabLayout->addWidget(entityPrimLabel, 1, 0); tabLayout->addWidget(entityPrimDivComboBox, 1, 1, 1, 2); tabLayout->addWidget(userSelectLabel, 5, 0); tabLayout->addWidget(userDefinedADIFComboBox, 5, 1); tabLayout->addWidget(userDefinedADIFValueLineEdit, 5, 2); tabLayout->addWidget(keepPropCheckBox, 6, 2); //tabLayout->setSizeConstraint(QLayout::SetFixedSize); setLayout(tabLayout); if (entitiesList.size()>1) { entitiesList.prepend("00-" + tr("Not Identified") + " (000)"); entityNameComboBox->addItems(entitiesList); } propModeList = dataProxy->getPropModeList(); if (propModeList.size()>1) { propModeList.prepend("00 - " + tr("Not - Not Identified")); propModeComboBox->addItems(propModeList); } iotaContinentComboBox->addItems(dataProxy->getContinentShortNames()); iotaNumberLineEdit->setInputMask("000"); iotaNumberLineEdit->setText("000"); logEvent (Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << ": (" << QString::number(this->size ().width ()) << "/" << QString::number(this->size ().height ()) << ")" ; } void MainWindowInputOthers::clear(bool _full) { //qDebug() << Q_FUNC_INFO ; logEvent (Q_FUNC_INFO, "Start", Debug); entityNameComboBox->setCurrentIndex(0); userDefinedADIFComboBox->setCurrentIndex (0); userDefinedADIFValueLineEdit->clear (); sota_ref = QString(); distance = 0.0; age = 0; iotaContinentComboBox->setCurrentIndex(0); iotaNumberLineEdit->setText("000"); if ((!keepPropCheckBox->isChecked()) || _full) { propModeComboBox->setCurrentIndex(0); } if (_full) { keepPropCheckBox->setChecked (false); } logEvent (Q_FUNC_INFO, "END", Debug); } void MainWindowInputOthers::setEntitiesList(const QStringList _qs) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_qs.length()); logEvent (Q_FUNC_INFO, "Start", Debug); entitiesList.clear(); entitiesList << _qs; if (entitiesList.size()>1) { entitiesList.prepend("00-" + tr("Not Identified") + " (000)"); //entitiesList.prepend("00-Not Identified (000)"); entityNameComboBox->addItems(entitiesList); } logEvent (Q_FUNC_INFO, "END", Debug); } void MainWindowInputOthers::setEntity(const int _ent) {// Select the appropriate entity in the ComboBox //qDebug() << Q_FUNC_INFO << ": " << QString::number(_ent); logEvent (Q_FUNC_INFO, "Start", Debug); if (_ent<=0) { entityNameComboBox->setCurrentIndex(0); logEvent (Q_FUNC_INFO, "END-1", Debug); return; } QString aux = QString(); aux = QString::number(_ent); if (_ent > 1000) { aux = (QString::number(_ent)).right(3); } int indexC = entityNameComboBox->findText("(" + aux + ")", Qt::MatchEndsWith); //qDebug() << "MainWindow::selectCorrectEntity: " << pref << "/" << QString::number(indexC); entityNameComboBox->setCurrentIndex(indexC); setIOTAContinentFromEntity(_ent); logEvent (Q_FUNC_INFO, "END", Debug); } int MainWindowInputOthers::getEntity() { logEvent (Q_FUNC_INFO, "Start", Debug); QString aux = entityNameComboBox->currentText(); if (!aux.contains ('(')) { logEvent (Q_FUNC_INFO, "END-1", Debug); return -1; } //qDebug() << Q_FUNC_INFO << ": " << (aux.split('(').at(1).chopped(1)); //return (aux.split('(').at(1).chopped(1)).toInt (); QString a = aux.split('(').at(1); a.chop(1); //qDebug() << Q_FUNC_INFO << ": " << a; logEvent (Q_FUNC_INFO, "END", Debug); return a.toInt (); } QString MainWindowInputOthers::getEntityPrefix() { //qDebug() << Q_FUNC_INFO << ": " << (entityNameComboBox->currentText()).split('-').at(0); logEvent (Q_FUNC_INFO, "Start-END", Debug); return (entityNameComboBox->currentText()).split('-').at(0); //return world->getQRZARRLId(pref); } void MainWindowInputOthers::setPropMode(const QString &_qs, bool _keep) { //qDebug() << Q_FUNC_INFO << ": " << _qs; logEvent (Q_FUNC_INFO, "Start", Debug); autoUpdating = true; if(( propModeComboBox->findText(_qs+" -", Qt::MatchContains))>0) { //qDebug() << Q_FUNC_INFO << " PropMode found" ; propModeComboBox->setCurrentIndex( propModeComboBox->findText(_qs+" -", Qt::MatchContains)); keepPropCheckBox->setChecked(_keep); } else { //qDebug() << Q_FUNC_INFO << " PropMode NOT found" ; propModeComboBox->setCurrentIndex(0); keepPropCheckBox->setChecked(false); } autoUpdating = false; logEvent (Q_FUNC_INFO, "END", Debug); } QString MainWindowInputOthers::getPropModeFromComboBox() { //logEvent (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO << ": " << propModeComboBox->currentText(); QString _pm = (((propModeComboBox->currentText()).split('-')).at(1)).simplified(); //qDebug() << Q_FUNC_INFO << ": - 10" ; QString _n = (((propModeComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << Q_FUNC_INFO << ": - 11: " << _n ; if (_n == "00") { //qDebug() << Q_FUNC_INFO << ": - 12" ; logEvent (Q_FUNC_INFO, "END-1", Debug); //qDebug() << Q_FUNC_INFO << ": - 13" ; return QString(); } //qDebug() << Q_FUNC_INFO << ": - 14" ; logEvent (Q_FUNC_INFO, "END", Debug); //qDebug() << Q_FUNC_INFO << ": " << _pm ; return _pm; } bool MainWindowInputOthers::isSATPropagation() { logEvent (Q_FUNC_INFO, "Start", Debug); if (getPropModeFromComboBox() == "SAT") { logEvent (Q_FUNC_INFO, "END-True", Debug); return true; } else { logEvent (Q_FUNC_INFO, "END-False", Debug); return false; } } void MainWindowInputOthers::clearIOTA() { logEvent (Q_FUNC_INFO, "Start", Debug); iotaContinentComboBox->setCurrentIndex(0); iotaNumberLineEdit->setText("000"); logEvent (Q_FUNC_INFO, "END", Debug); //iotaNumberLineEdit->setPalette(palBlack); } bool MainWindowInputOthers::isIOTAModified() { logEvent (Q_FUNC_INFO, "Start", Debug); if ((iotaContinentComboBox->currentIndex()>0) || (iotaNumberLineEdit->text()).toInt()>0) { logEvent (Q_FUNC_INFO, "END-True", Debug); return true; } else { logEvent (Q_FUNC_INFO, "END-False", Debug); return false; } } void MainWindowInputOthers::setIOTA(const QString &_qs) {//TODO: Seems to be better to send the color info like in: (it is much more flexible as I can send any color!) //void MainWindowInputQSL::setQSLVia(const QString &_qs, QColor qColor) //qDebug() << "MainWindow::setIOTA: " << _qs; logEvent (Q_FUNC_INFO, "Start", Debug); if ( (checkIfValidIOTA(_qs)).length() !=6 ) { iotaNumberLineEdit->setPalette(palRed); logEvent (Q_FUNC_INFO, "END-1", Debug); return; } else { QStringList values = _qs.split("-", QT_SKIP); //qDebug() << Q_FUNC_INFO << ": IOTA " << _qs; iotaContinentComboBox->setCurrentIndex( iotaContinentComboBox->findText(values.at(0) ) ); iotaNumberLineEdit->setText(values.at(1)); if (getDarkMode()) { iotaNumberLineEdit->setPalette(palWhite); } else { iotaNumberLineEdit->setPalette(palBlack); } } logEvent (Q_FUNC_INFO, "END", Debug); } QString MainWindowInputOthers::getIOTA() { logEvent (Q_FUNC_INFO, "Start-END", Debug); return (checkIfValidIOTA(iotaContinentComboBox->currentText() + "-" + iotaNumberLineEdit->text())); } void MainWindowInputOthers::setIOTAContinentFromEntity(const int _n) { //qDebug() << "MainWindow::setIOTAContinentFromEntity:" << QString::number(_n); logEvent (Q_FUNC_INFO, "Start-END", Debug); setIOTAContinent(dataProxy->getContinentShortNameFromEntity(_n)) ; } void MainWindowInputOthers::setIOTAContinent(const QString &_qs) { logEvent (Q_FUNC_INFO, "Start", Debug); if(( iotaContinentComboBox->findText(_qs, Qt::MatchContains))>0) { //qDebug() << Q_FUNC_INFO << ": setting to index: " << QString::number(iotaContinentComboBox->findText(_qs, Qt::MatchContains)); iotaContinentComboBox->setCurrentIndex( iotaContinentComboBox->findText(_qs, Qt::MatchContains)); } else { //qDebug() << Q_FUNC_INFO << ": setting to index: 00"; iotaContinentComboBox->setCurrentIndex(0); } logEvent (Q_FUNC_INFO, "END", Debug); } QString MainWindowInputOthers::checkIfValidIOTA(const QString &_tiota) { /********************************** IOTA should be always with this format: CC-NNN being: - CC the shortname of the continent - NNN Number of the reference. NNN has ALWAYS to include THREE(3) characters. ADIF Specs says: CC is the continent designator {NA, SA, EU , AF, OC, AS, AN} XXX is the island designator, where 0 <= XXX ,<= 999 [use leading zeroes] Returns a valid format IOTA if possible and "" in other cases. ************************************/ //qDebug() << Q_FUNC_INFO << ": " << _tiota; logEvent (Q_FUNC_INFO, "Start-END", Debug); QString _continent; QString _number; if (_tiota.count("-") == 1) { QStringList _values = _tiota.split("-", QT_SKIP); _continent = _values.at(0); _number = _values.at(1); } else { logEvent (Q_FUNC_INFO, "END-1", Debug); return ""; } //qDebug() << Q_FUNC_INFO << ": (cont) " << _continent; //qDebug() << Q_FUNC_INFO << ": (numb): " << _number; // Check if continent is valid if (dataProxy->isValidContinentShortName(_continent)) { if ( (_number.toInt() >0 ) && ((_number.toInt()) < 1000 )) { if ((_number.length()) == 3) { logEvent (Q_FUNC_INFO, "END-1", Debug); return _continent + "-" + _number ; } else if ((_number.length()) == 2) { logEvent (Q_FUNC_INFO, "END-2", Debug); return _continent + "-0" + QString::number((_number).toInt()); } else if ((_number.length()) == 1) { logEvent (Q_FUNC_INFO, "END-3", Debug); return _continent + "-00" + QString::number((_number).toInt()); } else { logEvent (Q_FUNC_INFO, "END-4", Debug); return ""; } } else { logEvent (Q_FUNC_INFO, "END-5", Debug); return ""; } } else { logEvent (Q_FUNC_INFO, "END", Debug); return QString(); } } void MainWindowInputOthers::slotPropModeComboBoxChanged() { logEvent (Q_FUNC_INFO, "Start", Debug); if (autoUpdating) { logEvent (Q_FUNC_INFO, "END-1", Debug); return; } emit setPropMode(getPropModeFromComboBox()); logEvent (Q_FUNC_INFO, "END", Debug); } void MainWindowInputOthers::setKeep(const bool _b) { logEvent (Q_FUNC_INFO, "Start", Debug); keepPropCheckBox->setChecked (_b); logEvent (Q_FUNC_INFO, "END", Debug); } bool MainWindowInputOthers::getKeep() { logEvent (Q_FUNC_INFO, "Start-END", Debug); return keepPropCheckBox->isChecked (); } bool MainWindowInputOthers::setUserADIFTypeComboBox(const QString &_value) { logEvent (Q_FUNC_INFO, "Start", Debug); if (_value == "SOTA_REF") { userDefinedADIFComboBox->setCurrentIndex (0); } else if (_value == "AGE") { userDefinedADIFComboBox->setCurrentIndex (1); } else { logEvent (Q_FUNC_INFO, "END-1", Debug); return false; } logEvent (Q_FUNC_INFO, "END", Debug); return true; } QString MainWindowInputOthers::getUserADIFTypeComboBox() { logEvent (Q_FUNC_INFO, "Start", Debug); int value = (((userDefinedADIFComboBox->currentText ()).split('-')).at(0)).toInt (); //qDebug() << Q_FUNC_INFO << ": " << QString::number(value); //qDebug() << Q_FUNC_INFO << ": " << QString::number(value); switch (value) { case 1: logEvent (Q_FUNC_INFO, "END-1", Debug); return "SOTA_REF"; case 2: logEvent (Q_FUNC_INFO, "END-2", Debug); return "AGE"; case 3: logEvent (Q_FUNC_INFO, "END-3", Debug); return "VUCC_GRIDS"; case 4: logEvent (Q_FUNC_INFO, "END-4", Debug); return "DISTANCE"; default: logEvent (Q_FUNC_INFO, "END", Debug); return QString(); } } bool MainWindowInputOthers::setUserADIFValue(const QString &_adifValue) { logEvent (Q_FUNC_INFO, "Start-END", Debug); userDefinedADIFValueLineEdit->setText (_adifValue); return true; } QString MainWindowInputOthers::getUserADIFValue() { logEvent (Q_FUNC_INFO, "Start-END", Debug); return userDefinedADIFValueLineEdit->text(); } bool MainWindowInputOthers::setInitialADIFValues() { logEvent (Q_FUNC_INFO, "END-", Debug); adifValidTypes << "01-" + tr("SOTA Ref") << "02-" + tr ("Age") << "03-" + tr ("VUCC grids") << "04-" + tr("Distance"); userDefinedADIFComboBox->clear (); userDefinedADIFComboBox->addItems (adifValidTypes); logEvent (Q_FUNC_INFO, "END", Debug); return true; } void MainWindowInputOthers::slotUSerDefinedADIFComboBoxChanged() { //qDebug() << Q_FUNC_INFO << ": " << getUserADIFTypeComboBox (); logEvent (Q_FUNC_INFO, "Start", Debug); QString currentTag = getUserADIFTypeComboBox (); setColorsForUserDefinedADIFValueLineEdit(); if (currentTag == "SOTA_REF") { userDefinedADIFValueLineEdit->setText (sota_ref); } else if (currentTag == "AGE") { userDefinedADIFValueLineEdit->setText (QString::number(age)); } else if (currentTag == "VUCC_GRIDS") { userDefinedADIFValueLineEdit->setText (vucc_grids); } else if (currentTag == "DISTANCE") { userDefinedADIFValueLineEdit->setText (QString::number(distance)); } } bool MainWindowInputOthers::setVUCCGrids(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; logEvent (Q_FUNC_INFO, "Start", Debug); if (checkVUCC_GRIDS(_op)) { vucc_grids = _op; slotUSerDefinedADIFComboBoxChanged(); logEvent (Q_FUNC_INFO, "END-1", Debug); return true; } logEvent (Q_FUNC_INFO, "END", Debug); return false; } bool MainWindowInputOthers::checkVUCC_GRIDS(const QString &_string) { //qDebug() << Q_FUNC_INFO << ": " << _string; logEvent (Q_FUNC_INFO, "Start", Debug); if (util->isValidVUCCGrids (_string)) { setColorsForUserDefinedADIFValueLineEdit(); logEvent (Q_FUNC_INFO, "END-1", Debug); return true; } else { userDefinedADIFValueLineEdit->setPalette (palRed); logEvent (Q_FUNC_INFO, "END-2", Debug); return false; } } QString MainWindowInputOthers::getVUCCGrids() { logEvent (Q_FUNC_INFO, "Start", Debug); if (checkVUCC_GRIDS (vucc_grids)) { logEvent (Q_FUNC_INFO, "END-1", Debug); return vucc_grids; } else { logEvent (Q_FUNC_INFO, "END-2", Debug); return QString(); } } void MainWindowInputOthers::setColorsForUserDefinedADIFValueLineEdit() { logEvent (Q_FUNC_INFO, "Start", Debug); if (getDarkMode()) { userDefinedADIFValueLineEdit->setPalette(palWhite); } else { userDefinedADIFValueLineEdit->setPalette(palBlack); } logEvent (Q_FUNC_INFO, "END", Debug); } bool MainWindowInputOthers::setSOTA(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; logEvent (Q_FUNC_INFO, "Start", Debug); sota_ref = _op; slotUSerDefinedADIFComboBoxChanged(); logEvent (Q_FUNC_INFO, "END", Debug); return true; } QString MainWindowInputOthers::getSOTA() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start-END", Debug); return sota_ref; } bool MainWindowInputOthers::setAge(const double _op) { //qDebug() << Q_FUNC_INFO << ": " << _op; logEvent (Q_FUNC_INFO, "Start-END", Debug); age = _op; slotUSerDefinedADIFComboBoxChanged(); logEvent (Q_FUNC_INFO, "END", Debug); return true; } double MainWindowInputOthers::getAge() { logEvent (Q_FUNC_INFO, "Start-END", Debug); return age; } bool MainWindowInputOthers::setDistance(const double _op) { //qDebug() << Q_FUNC_INFO << ": " << _op; logEvent (Q_FUNC_INFO, "Start-END", Debug); distance = _op; slotUSerDefinedADIFComboBoxChanged(); logEvent (Q_FUNC_INFO, "END", Debug); return true; } double MainWindowInputOthers::getDistance() { logEvent (Q_FUNC_INFO, "Start-END", Debug); return distance; } void MainWindowInputOthers::slotSetCurrentUSerData() { logEvent (Q_FUNC_INFO, "Start", Debug); QString currentTag = getUserADIFTypeComboBox (); if (currentTag == "SOTA_REF") { sota_ref = userDefinedADIFValueLineEdit->text(); } else if (currentTag == "AGE") { age = userDefinedADIFValueLineEdit->text().toDouble(); } else if (currentTag == "VUCC_GRIDS") { vucc_grids = userDefinedADIFValueLineEdit->text().toUpper(); userDefinedADIFValueLineEdit->setText (vucc_grids); } else if (currentTag == "DISTANCE") { distance = userDefinedADIFValueLineEdit->text().toDouble(); //userDefinedADIFValueLineEdit->setText (QString::number(distance)); } logEvent (Q_FUNC_INFO, "END", Debug); } bool MainWindowInputOthers::getDarkMode() { logEvent (Q_FUNC_INFO, "Start-END", Debug); return ( iotaNumberLineEdit->palette().color (QPalette::Base) == "#646464"); } void MainWindowInputOthers::setLogLevel (const DebugLogLevel _l) { logEvent (Q_FUNC_INFO, "Start", Debug); logLevel = _l; logEvent (Q_FUNC_INFO, "END", Debug); } void MainWindowInputOthers::logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level) { if (logLevel<=_level) emit debugLog (_func, _msg, _level); } klog-2.3.3/inputwidgets/mainwindowinputqso.cpp0000644000015700001710000005346614542412415021564 0ustar jenkinsjenkins/*************************************************************************** mainwindowinputqso.cpp - description ------------------- begin : may 2021 copyright : (C) 2021 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the mainwindow that supports the QSL options // #include "mainwindowinputqso.h" MainWindowInputQSO::MainWindowInputQSO(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "MainWindowInputQSO::MainWindowInputQSO" ; dataProxy = dp; //locator = new Locator(); nameLineEdit = new QLineEdit; qthLineEdit = new QLineEdit; locatorLineEdit = new QLineEdit; rstTXLineEdit = new QLineEdit; rstRXLineEdit = new QLineEdit; txFreqSpinBox = new QDoubleSpinBox; rxFreqSpinBox = new QDoubleSpinBox; splitCheckBox = new QCheckBox; rxPowerSpinBox = new QDoubleSpinBox; dataProxy = dp; createUI(); setDefaultData(); //installEventFilter (this); clear(); //qDebug() << "MainWindowInputQSO::MainWindowInputQSO - END" ; } MainWindowInputQSO::~MainWindowInputQSO() { delete(dataProxy); } void MainWindowInputQSO::setModifying(const bool _m) { modify = _m; } void MainWindowInputQSO::createUI() { rstTXLineEdit->setToolTip(tr("TX RST.")); rstRXLineEdit->setToolTip(tr("RX RST.")); txFreqSpinBox->setToolTip(tr("TX Frequency in MHz.")); rxFreqSpinBox->setToolTip(tr("RX Frequency in MHz.")); rxPowerSpinBox->setToolTip(tr("Power used by the contacted station.")); nameLineEdit->setToolTip(tr("Name of the contacted operator.")); qthLineEdit->setToolTip(tr("QTH of the contacted station.")); locatorLineEdit->setToolTip(tr("Locator of the contacted station.")); rxPowerSpinBox->setDecimals(2); rxPowerSpinBox->setMaximum(9999); rxPowerSpinBox->setSuffix(" " + tr("Watts")); txFreqSpinBox->setDecimals(6); txFreqSpinBox->setMaximum(99999); txFreqSpinBox->setSuffix(" " + tr("MHz")); txFreqSpinBox->setKeyboardTracking(false); txFreqSpinBox->setSingleStep(0.001); rxFreqSpinBox->setDecimals(6); rxFreqSpinBox->setMaximum(99999); rxFreqSpinBox->setSuffix(" " + tr("MHz")); rxFreqSpinBox->setKeyboardTracking(false); rxFreqSpinBox->setSingleStep(0.001); splitCheckBox->setText(tr("Split", "Translator: Split is a common hamradio term. Do not translate unless you are sure.")); splitCheckBox->setChecked(false); QLabel *nameLabel = new QLabel(this); nameLabel->setText(tr("Name")); nameLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *qthLabel = new QLabel(this); qthLabel->setText(tr("QTH")); qthLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *locLabel = new QLabel(this); locLabel->setText(tr("DX Locator")); locLabel->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *rxPowerSpinBoxLabelN = new QLabel(this); rxPowerSpinBoxLabelN->setText(tr("Power(rx)")); rxPowerSpinBoxLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *rstLabelN = new QLabel(this); rstLabelN->setText(tr("RST")); rstLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *rstTxLabelN = new QLabel(this); rstTxLabelN->setText(tr("TX")); rstTxLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QLabel *rstRxLabelN = new QLabel(this); rstRxLabelN->setText(tr("RX")); rstRxLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); QHBoxLayout *RSTLabelsLayout = new QHBoxLayout; RSTLabelsLayout->addWidget (rstTxLabelN); RSTLabelsLayout->addWidget (rstLabelN); RSTLabelsLayout->addWidget (rstRxLabelN); QHBoxLayout *RSTValuesLayout = new QHBoxLayout; RSTValuesLayout->addWidget (rstTXLineEdit); RSTValuesLayout->addWidget (rstRXLineEdit); QVBoxLayout *RSTLayout = new QVBoxLayout; RSTLayout->addLayout (RSTLabelsLayout); RSTLayout->addLayout (RSTValuesLayout); /* * QGridLayout *RSTLayout = new QGridLayout; RSTLayout->addWidget(rstTxLabelN, 0, 0); RSTLayout->addWidget(rstTXLineEdit, 1, 0); RSTLayout->addWidget(rstRxLabelN, 0, 1); RSTLayout->addWidget(rstRXLineEdit, 1, 1); */ QVBoxLayout *qthLayout = new QVBoxLayout; qthLayout->addWidget(qthLabel); qthLayout->addWidget(qthLineEdit); QVBoxLayout *rstQTHLayout = new QVBoxLayout; rstQTHLayout->addLayout(RSTLayout); rstQTHLayout->addLayout(qthLayout); QLabel *freqLabelsN = new QLabel(this); freqLabelsN->setText(tr("Frequency")); freqLabelsN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); //freqLabelsN->setAlignment(Qt::AlignCenter); QLabel *txfreqLabelN = new QLabel(this); txfreqLabelN->setText(tr("TX")); txfreqLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); //txfreqLabelN->setAlignment(Qt::AlignLeft); QLabel *rxfreqLabelN = new QLabel(this); rxfreqLabelN->setText(tr("RX")); rxfreqLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignCenter); //rxfreqLabelN->setAlignment(Qt::AlignRight); QHBoxLayout *freqTXLayout = new QHBoxLayout; freqTXLayout->addWidget (txfreqLabelN); freqTXLayout->addWidget (splitCheckBox); QHBoxLayout *freqTitleLayout = new QHBoxLayout; freqTitleLayout->addLayout(freqTXLayout); freqTitleLayout->addWidget(freqLabelsN); freqTitleLayout->addWidget(rxfreqLabelN); QHBoxLayout *freqDataLayout = new QHBoxLayout; freqDataLayout->addWidget(txFreqSpinBox); freqDataLayout->addWidget(rxFreqSpinBox); QVBoxLayout *freqLayout = new QVBoxLayout; freqLayout->addLayout(freqTitleLayout); freqLayout->addLayout(freqDataLayout); QVBoxLayout *locVLayout = new QVBoxLayout; locVLayout->addWidget(locLabel); locVLayout->addWidget(locatorLineEdit); QVBoxLayout *freqLocLayout = new QVBoxLayout; freqLocLayout->addLayout(freqLayout); freqLocLayout->addLayout(locVLayout); QHBoxLayout *rstfreqLayout = new QHBoxLayout; rstfreqLayout->addLayout(rstQTHLayout); rstfreqLayout->addLayout(freqLocLayout); QVBoxLayout *rxPowerLayout = new QVBoxLayout; rxPowerLayout->addWidget(rxPowerSpinBoxLabelN); rxPowerLayout->addWidget(rxPowerSpinBox); QVBoxLayout *nameLayout = new QVBoxLayout; nameLayout->addWidget(nameLabel); nameLayout->addWidget(nameLineEdit); QVBoxLayout *rxPwrLayout = new QVBoxLayout; rxPwrLayout->addWidget(rxPowerSpinBoxLabelN); rxPwrLayout->addWidget(rxPowerSpinBox); QHBoxLayout *namePwrHLayout = new QHBoxLayout; namePwrHLayout->addLayout(nameLayout); namePwrHLayout->addLayout(rxPwrLayout); QVBoxLayout *namePwrLayout = new QVBoxLayout; namePwrLayout->addStretch(1); namePwrLayout->addLayout(namePwrHLayout); namePwrLayout->addStretch(5); QVBoxLayout *qsoInputTabWidgetMainLayout = new QVBoxLayout; qsoInputTabWidgetMainLayout->addLayout(rstfreqLayout); qsoInputTabWidgetMainLayout->addLayout(namePwrLayout); //qsoInputTabWidgetMainLayout->setSizeConstraint(QLayout::SetFixedSize); setLayout(qsoInputTabWidgetMainLayout); connect(rstTXLineEdit, SIGNAL(returnPressed()), this, SLOT(slotReturnPressed() ) ); connect(rstRXLineEdit, SIGNAL(returnPressed()), this, SLOT(slotReturnPressed() ) ); connect(locatorLineEdit, SIGNAL(returnPressed()), this, SLOT(slotReturnPressed() ) ); connect(qthLineEdit, SIGNAL(returnPressed()), this, SLOT(slotReturnPressed() ) ); connect(nameLineEdit, SIGNAL(returnPressed()), this, SLOT(slotReturnPressed() ) ); connect(locatorLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotLocatorTextChanged() ) ); connect(txFreqSpinBox, SIGNAL(valueChanged(double)), this, SLOT(slotFreqTXChanged(double)) ) ; connect(rxFreqSpinBox, SIGNAL(valueChanged(double)), this, SLOT(slotFreqRXChanged(double)) ) ; connect(splitCheckBox, SIGNAL(clicked()), this, SLOT(slotSplitClicked()) ) ; QWidget::setTabOrder (rstTXLineEdit, rstRXLineEdit); QWidget::setTabOrder (rstRXLineEdit, nameLineEdit); QWidget::setTabOrder (nameLineEdit, qthLineEdit); QWidget::setTabOrder (qthLineEdit, locatorLineEdit); QWidget::setTabOrder (locatorLineEdit, rxPowerSpinBox); } void MainWindowInputQSO::setDefaultData() { palRed.setColor(QPalette::Text, Qt::red); palBlack.setColor(QPalette::Text, Qt::black); palWhite.setColor(QPalette::Text, Qt::white); rxFreqBeingAutoChanged = false; txFreqBeingAutoChanged = false; isSATPropagation = false; propMode = QString(); freqTX = 0.0; freqRX = 0.0; modify = false; } void MainWindowInputQSO::clear() { //qDebug() << Q_FUNC_INFO ; qthLineEdit->clear(); nameLineEdit->clear(); locatorLineEdit->clear(); rxPowerSpinBox->setValue(0); modify = false; } void MainWindowInputQSO::cleanQRZCOM(const bool _dataFromQRZCOM) { //qDebug() << Q_FUNC_INFO ; if (_dataFromQRZCOM) { qthLineEdit->clear(); nameLineEdit->clear(); locatorLineEdit->clear(); } } void MainWindowInputQSO::clearName() { nameLineEdit->clear(); } void MainWindowInputQSO::clearQTH() { qthLineEdit->clear(); } void MainWindowInputQSO::clearDXLocator() { //qDebug() << Q_FUNC_INFO ; locatorLineEdit->clear (); } void MainWindowInputQSO::slotReturnPressed() { emit returnPressed(); } void MainWindowInputQSO::slotLocatorTextChanged() {//TO BE REMOVED ONCE InfoWidget is FINISHED - At least modified //qDebug() << Q_FUNC_INFO << ": " << locatorLineEdit->text(); int cursorP = locatorLineEdit->cursorPosition(); locatorLineEdit->setText((util->getClearSQLi(locatorLineEdit->text())).toUpper()); if ( util->isValidGrid((locatorLineEdit->text()).toUpper()) || locatorLineEdit->text ().isEmpty ()) { //qDebug() << Q_FUNC_INFO << ": VALID: " << locatorLineEdit->text(); setPaletteRightDXLocator(true); emit dxLocatorChanged (locatorLineEdit->text()); //dxLocator = (locatorLineEdit->text()); //infoWidget->showDistanceAndBearing(myDataTabWidget->getMyLocator(), dxLocator); //satTabWidget->setLocator(dxLocator); locatorLineEdit->setToolTip(tr("DX QTH locator.")); //qDebug() << Q_FUNC_INFO << ": " << locator->getLat(locatorLineEdit->text()); //qDebug() << Q_FUNC_INFO << ": LON: " << locator->getLon(locatorLineEdit->text()); } else { //qDebug() << Q_FUNC_INFO << ": NOT VALID: " << locatorLineEdit->text(); setPaletteRightDXLocator(false); locatorLineEdit->setToolTip(tr("DX QTH locator. Format should be Maidenhead like IN70AA up to 10 characters.")); locatorLineEdit->setCursorPosition(cursorP); return; } locatorLineEdit->setCursorPosition(cursorP); } QString MainWindowInputQSO::getDXLocator() { //qDebug() << Q_FUNC_INFO << " - returning: " << locatorLineEdit->text (); return locatorLineEdit->text(); } void MainWindowInputQSO::setDXLocator(const QString &_loc) { //qDebug() << Q_FUNC_INFO << ": " << _loc; if (util->isValidGrid(_loc)) //if (util->isValidGrid (_loc)) { locatorLineEdit->setText (_loc.toUpper ()); } } QString MainWindowInputQSO::getName() { return nameLineEdit->text (); } void MainWindowInputQSO::setName(const QString &_st) { nameLineEdit->setText (_st); } double MainWindowInputQSO::getTXFreq() { return txFreqSpinBox->value(); } void MainWindowInputQSO::setTXFreq(const double _ft) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_ft); if ( (_ft >= double(0)) && (_ft <= txFreqSpinBox->maximum())) { //qDebug() << Q_FUNC_INFO << ": defining FR: " << QString::number(_ft); txFreqSpinBox->setValue(_ft); } else { //qDebug() << Q_FUNC_INFO << ": defining FR: 0" ; txFreqSpinBox->setValue(0); } //qDebug() << Q_FUNC_INFO; } double MainWindowInputQSO::getRXFreq() { return rxFreqSpinBox->value(); } void MainWindowInputQSO::setRXFreq(const double _ft) { if ( (_ft >= double(0)) && (_ft <= rxFreqSpinBox->maximum())) { rxFreqSpinBox->setValue(_ft); } else { rxFreqSpinBox->setValue(0); } } double MainWindowInputQSO::getRXPwr() { return rxPowerSpinBox->value(); } void MainWindowInputQSO::setRXPwr(const double _pw) { if (_pw>=0) { rxPowerSpinBox->setValue(_pw); } } QString MainWindowInputQSO::getQTH() { return qthLineEdit->text(); } void MainWindowInputQSO::setQTH(const QString &_st) { qthLineEdit->setText(_st); } QString MainWindowInputQSO::getRSTTX() { return rstTXLineEdit->text(); } void MainWindowInputQSO::setRSTTX(const QString &_st) { rstTXLineEdit->setText (_st); } QString MainWindowInputQSO::getRSTRX() { return rstRXLineEdit->text(); } void MainWindowInputQSO::setRSTRX(const QString &_st) { rstRXLineEdit->setText (_st); } void MainWindowInputQSO::setRSTToMode(const QString &_m, const bool _reading) { //qDebug() << Q_FUNC_INFO << ": " << _m ; if ((_m == "SSB") || (_m== "LSB") || (_m=="USB") || (_m == "FM") || (_m == "AM") ) { //qDebug() << Q_FUNC_INFO << ": Detected SSB/LSB/USB" ; rstTXLineEdit->setInputMask("#DD"); rstRXLineEdit->setInputMask("#DD"); //rstTXLineEdit->setText("59"); //rstRXLineEdit->setText("59"); rstTXLineEdit->setMaxLength(2); rstRXLineEdit->setMaxLength(2); } else if ((_m == "CW") || (_m == "RTTY")) { rstTXLineEdit->setInputMask("DDD"); rstRXLineEdit->setInputMask("DDD"); //rstTXLineEdit->setText("599"); //rstRXLineEdit->setText("599"); rstTXLineEdit->setMaxLength(3); rstRXLineEdit->setMaxLength(3); } else if (_m == "PSK31") { rstTXLineEdit->setInputMask("#DD0"); rstRXLineEdit->setInputMask("#DD0"); //rstTXLineEdit->setText("599"); //rstRXLineEdit->setText("599"); rstTXLineEdit->setMaxLength(4); rstRXLineEdit->setMaxLength(4); } else if ( (_m.contains("FT", Qt::CaseInsensitive)) || (_m.contains("JT", Qt::CaseInsensitive)) || (_m.contains("QRA64", Qt::CaseInsensitive)) || (_m.contains("JS", Qt::CaseInsensitive))) { rstTXLineEdit->setInputMask("#99"); rstRXLineEdit->setInputMask("#99"); //rstTXLineEdit->setText("0"); //rstRXLineEdit->setText("0"); rstTXLineEdit->setMaxLength(3); rstRXLineEdit->setMaxLength(3); } else { // By default SSB RST is configured but anything could be added rstTXLineEdit->setInputMask("#xxx"); rstRXLineEdit->setInputMask("#xxx"); //rstTXLineEdit->setText("59"); //rstRXLineEdit->setText("59"); rstTXLineEdit->setMaxLength(4); rstRXLineEdit->setMaxLength(4); } if (!_reading) { //qDebug() << Q_FUNC_INFO << ": reading the UI"; rstTXLineEdit->setText(util->getDefaultRST(_m)); rstRXLineEdit->setText(util->getDefaultRST(_m)); } } bool MainWindowInputQSO::getDarkMode() { return (nameLineEdit->palette().color(QPalette::Base) == "#646464"); } void MainWindowInputQSO::setPaletteRightName(const bool _ok) { if (_ok) { if (getDarkMode()) { nameLineEdit->setPalette (palWhite); } else { nameLineEdit->setPalette (palBlack); } } else { nameLineEdit->setPalette (palRed); } } void MainWindowInputQSO::setPaletteRightQTH(const bool _ok) { if (_ok) { if (getDarkMode()) { qthLineEdit->setPalette (palWhite); } else { qthLineEdit->setPalette (palBlack); } } else { qthLineEdit->setPalette (palRed); } } void MainWindowInputQSO::setPaletteRightDXLocator(const bool _ok) { if (_ok) { if (getDarkMode()) { locatorLineEdit->setPalette (palWhite); } else { locatorLineEdit->setPalette (palBlack); } } else { locatorLineEdit->setPalette (palRed); } } void MainWindowInputQSO::setPropModeFromSat(const QString &_p) { //qDebug() << Q_FUNC_INFO << ": " << _p; propMode = _p; if (propMode == "SAT") { splitCheckBox->setChecked (true); } else { splitCheckBox->setChecked (false); } } void MainWindowInputQSO::slotFreqTXChanged (double _f) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_f); if (util->isSameFreq (_f, freqTX)) { //qDebug() << Q_FUNC_INFO << ": Same Freq return" ; return; } freqTX = _f; int bandId = dataProxy->getBandIdFromFreq(_f); if (bandId > 1) { // If the freq belongs to one ham band txFreqSpinBox->setToolTip(tr("TX Frequency in MHz.")); if (getDarkMode()) { txFreqSpinBox->setPalette(palWhite); } else { txFreqSpinBox->setPalette(palBlack); } //qDebug() << Q_FUNC_INFO << ": emitting: " << QString::number(_f); emit txFreqChanged (_f); } else { txFreqSpinBox->setToolTip(tr("TX Frequency in MHz.\nFrequency is not in a hamradio band!")); txFreqSpinBox->setPalette(palRed); //qDebug() << Q_FUNC_INFO << ":RED - Not in band " ; } if ((!splitCheckBox->isChecked()) || modify ) { rxFreqSpinBox->setValue (_f); //qDebug() << Q_FUNC_INFO << ": copying to RX Freq " ; } //qDebug() << Q_FUNC_INFO << " - END" ; setSplitCheckBox(); } void MainWindowInputQSO::slotSplitClicked() { if ((!splitCheckBox->isChecked()) ) { rxFreqSpinBox->setValue(txFreqSpinBox->value()); } } void MainWindowInputQSO::slotFreqRXChanged(double _f) { if (util->isSameFreq (_f, freqRX)) { return; } freqRX = _f; int bandId = dataProxy->getBandIdFromFreq(_f); if (bandId > 1) { // If the freq belongs to one ham band if (getDarkMode()) { rxFreqSpinBox->setPalette(palWhite); } else { rxFreqSpinBox->setPalette(palBlack); } rxFreqSpinBox->setToolTip(tr("RX Frequency in MHz.")); emit rxFreqChanged(rxFreqSpinBox->value()); } else { rxFreqSpinBox->setToolTip(tr("RX Frequency in MHz.\nFrequency is not in a hamradio band!")); rxFreqSpinBox->setPalette(palRed); //qDebug() << "MainWindow::slotFreqRXChanged Freq is not in ANY ham band"; } if ((!splitCheckBox->isChecked()) && !modify) { txFreqSpinBox->setValue (_f); } /* int bandId = dataProxy->getBandIdFromFreq(_f); if (bandId > 1) { // If the freq belongs to one ham band rxFreqSpinBox->setPalette(palBlack); rxFreqSpinBox->setToolTip(tr("RX Frequency in MHz.")); emit rxFreqChanged(rxFreqSpinBox->value()); } else { rxFreqSpinBox->setToolTip(tr("RX Frequency in MHz.\nFrequency is not in a hamradio band!")); rxFreqSpinBox->setPalette(palRed); //qDebug() << "MainWindow::slotFreqRXChanged Freq is not in ANY ham band"; } if (!rxFreqBeingAutoChanged) { //qDebug() << "MainWindow::slotFreqTXChanged: Updating SAT Downlink"; emit rxFreqChangedForSat(rxFreqSpinBox->value()); } */ //qDebug() << "MainWindow::slotFreqRXChanged: END"; setSplitCheckBox(); } void MainWindowInputQSO::setSplitCheckBox() { if (util->isSameFreq(txFreqSpinBox->value(), rxFreqSpinBox->value())) { splitCheckBox->setChecked(false); } else { splitCheckBox->setChecked(true); } } void MainWindowInputQSO::receiveFocus() { //qDebug() << Q_FUNC_INFO; rstTXLineEdit->setFocus (); } bool MainWindowInputQSO::eventFilter (QObject *object, QEvent *event) { Q_UNUSED(object); if (!(event->type() == QEvent::Paint )) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(event->type ()); } //qDebug() << Q_FUNC_INFO << ": " << object->objectName(); if ((event->type() == QEvent::KeyPress) || (event->type() == QEvent::ShortcutOverride)) { //qDebug() << Q_FUNC_INFO << "KEY PRESSED"; QKeyEvent *ke = static_cast(event); if (ke->key() == Qt::Key_Tab) { //qDebug() << Q_FUNC_INFO << "KEY PRESSED TAB"; if (rxPowerSpinBox->hasFocus()) { //qDebug() << Q_FUNC_INFO << "emitting to hand over to mainQSO Input"; emit handOverFocusSignal(); } // special tab handling here return true; } } return QWidget::event(event); } klog-2.3.3/inputwidgets/mainwindowinputqso.h0000644000015700001710000001052314542412415021214 0ustar jenkinsjenkins#ifndef KLOG_INPUTWIDGETS_MAINWINDOWINPUTQSO_H #define KLOG_INPUTWIDGETS_MAINWINDOWINPUTQSO_H /*************************************************************************** mainwindowinputqso.h - description ------------------- begin : may 2021 copyright : (C) 2021 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the mainwindow that supports the QSL options // #include #include #include "../dataproxy_sqlite.h" //#include "../locator.h" #include "../utilities.h" class MainWindowInputQSO : public QWidget { Q_OBJECT friend class tst_MainWindowInputQSO; public: explicit MainWindowInputQSO(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~MainWindowInputQSO(); void setPaletteRightName(const bool _ok); void setPaletteRightQTH(const bool _ok); void setPaletteRightDXLocator(const bool _ok); QString getDXLocator(); void setDXLocator(const QString &_loc); QString getName(); void setName(const QString &_st); QString getQTH(); void setQTH(const QString &_st); void setRSTToMode(const QString &_m, const bool _reading = true); QString getRSTTX(); void setRSTTX(const QString &_st); QString getRSTRX(); void setRSTRX(const QString &_st); double getTXFreq(); void setTXFreq(const double _ft); double getRXFreq(); void setRXFreq(const double _ft); void setPropModeFromSat(const QString &_p); double getRXPwr(); void setRXPwr(const double _pw); void setModifying(const bool _m); void receiveFocus(); void clear(); void cleanQRZCOM(const bool _dataFromQRZCOM); void clearName(); void clearQTH(); void clearDXLocator(); signals: void returnPressed(); void dxLocatorChanged(QString _loc); void rxFreqChanged(double _f); //void rxFreqChangedForSat(double _f); //void txFreqBeingChanged(bool _f); void txFreqChanged(double _f); void handOverFocusSignal(); //void txFreqChangedForSat(double _f); private slots: void slotReturnPressed(); void slotLocatorTextChanged(); void slotFreqTXChanged (double _f); void slotFreqRXChanged (double _f); void slotSplitClicked(); private: bool eventFilter(QObject *object, QEvent *event); void createUI(); void setDefaultData(); bool getDarkMode(); void setSplitCheckBox(); QLineEdit *rstTXLineEdit, *rstRXLineEdit, *qthLineEdit, *locatorLineEdit, *nameLineEdit; QDoubleSpinBox *rxPowerSpinBox, *txFreqSpinBox, *rxFreqSpinBox; QCheckBox *splitCheckBox; //Locator *locator; DataProxy_SQLite *dataProxy; Utilities *util; QPalette palRed, palBlack, palWhite; // To paint Text in red or black(normal) bool rxFreqBeingAutoChanged, txFreqBeingAutoChanged, isSATPropagation; QString propMode; double freqTX, freqRX; bool modify; }; #endif // MAINWINDOWINPUTQSO_H klog-2.3.3/inputwidgets/mainwindowinputeqsl.cpp0000644000015700001710000005655614542412415021731 0ustar jenkinsjenkins/*************************************************************************** mainwindowinputeqsl.cpp - description ------------------- begin : jun 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "mainwindowinputeqsl.h" MainWindowInputEQSL::MainWindowInputEQSL(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "MainWindowInputEQSL::MainWindowInputEQSL" ; util = new Utilities(Q_FUNC_INFO); dataProxy = dp; eqslSentComboBox = new QComboBox; eqslRecComboBox = new QComboBox; lotwSentComboBox = new QComboBox; lotwRecComboBox = new QComboBox; clublogComboBox = new QComboBox; qrzcomComboBox = new QComboBox; eqslSentQDateEdit = new QDateEdit; eqslRecQDateEdit = new QDateEdit; lotwSentQDateEdit = new QDateEdit; lotwRecQDateEdit = new QDateEdit; clublogQDateEdit = new QDateEdit; qrzcomQDateEdit = new QDateEdit; createUI(); setDefaultData(); clear(); //qDebug() << "MainWindowInputEQSL::MainWindowInputEQSL - END" ; } MainWindowInputEQSL::~MainWindowInputEQSL() { delete(util); delete(dataProxy); } void MainWindowInputEQSL::createUI() { qslSentStatusList.clear(); qslRcvdStatusList.clear(); clubLogStatusList.clear(); qslSentStatusList = dataProxy->getQSLSentList(); qslRcvdStatusList = dataProxy->getQSLRcvdList(); clubLogStatusList = dataProxy->getClubLogStatusList(); eqslSentQDateEdit->setDisplayFormat("dd/MM/yyyy"); eqslRecQDateEdit->setDisplayFormat("dd/MM/yyyy"); lotwSentQDateEdit->setDisplayFormat("dd/MM/yyyy"); lotwRecQDateEdit->setDisplayFormat("dd/MM/yyyy"); clublogQDateEdit->setDisplayFormat("dd/MM/yyyy"); qrzcomQDateEdit->setDisplayFormat("dd/MM/yyyy"); clublogQDateEdit->setToolTip(tr("Date of the ClubLog upload.")); qrzcomQDateEdit->setToolTip(tr("Date of the QRZ.com upload.")); eqslSentQDateEdit->setToolTip(tr("Date of the eQSL sending.")); eqslRecQDateEdit->setToolTip(tr("Date of the eQSL reception.")); lotwSentQDateEdit->setToolTip(tr("Date of the LoTW sending.")); lotwRecQDateEdit->setToolTip(tr("Date of the LoTW reception.")); clublogComboBox->setToolTip(tr("Status on ClubLog.")); qrzcomComboBox->setToolTip(tr("Status on QRZ.com.")); eqslSentComboBox->setToolTip(tr("Status of the eQSL sending.")); eqslRecComboBox->setToolTip(tr("Status of the eQSL reception.")); lotwSentComboBox->setToolTip(tr("Status of the LoTW sending.")); lotwRecComboBox->setToolTip(tr("Status of the LoTW reception.")); // eQSL Tab definition starts here QLabel *clublogLabelN = new QLabel(tr("ClubLog")); clublogLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *qrzcomLabelN = new QLabel(tr("QRZ.com")); qrzcomLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *eQSLSentLabelN = new QLabel(tr("eQSL Sent")); eQSLSentLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *eQSLRecLabelN = new QLabel(tr("eQSL Rec")); eQSLRecLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *lotWSentLabelN = new QLabel(tr("LoTW Sent")); lotWSentLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *lotWRecLabelN = new QLabel(tr("LoTW Rec")); lotWRecLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QGridLayout *eqslInputTabWidgetLayout = new QGridLayout; eqslInputTabWidgetLayout->addWidget(clublogLabelN, 0, 0); eqslInputTabWidgetLayout->addWidget(eQSLSentLabelN, 1, 0); eqslInputTabWidgetLayout->addWidget(eQSLRecLabelN, 2, 0); eqslInputTabWidgetLayout->addWidget(lotWSentLabelN, 3, 0); eqslInputTabWidgetLayout->addWidget(lotWRecLabelN, 4, 0); eqslInputTabWidgetLayout->addWidget(qrzcomLabelN, 5, 0); eqslInputTabWidgetLayout->addWidget(clublogComboBox, 0, 1); eqslInputTabWidgetLayout->addWidget(eqslSentComboBox, 1, 1); eqslInputTabWidgetLayout->addWidget(eqslRecComboBox, 2, 1); eqslInputTabWidgetLayout->addWidget(lotwSentComboBox, 3, 1); eqslInputTabWidgetLayout->addWidget(lotwRecComboBox, 4, 1); eqslInputTabWidgetLayout->addWidget(qrzcomComboBox, 5, 1); eqslInputTabWidgetLayout->addWidget(clublogQDateEdit, 0, 2); eqslInputTabWidgetLayout->addWidget(eqslSentQDateEdit, 1, 2); eqslInputTabWidgetLayout->addWidget(eqslRecQDateEdit, 2, 2); eqslInputTabWidgetLayout->addWidget(lotwSentQDateEdit, 3, 2); eqslInputTabWidgetLayout->addWidget(lotwRecQDateEdit, 4, 2); eqslInputTabWidgetLayout->addWidget(qrzcomQDateEdit, 5, 2); //eqslInputTabWidgetLayout->setSizeConstraint(QLayout::SetFixedSize); setLayout(eqslInputTabWidgetLayout); connect(clublogComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotClubLogComboBoxChanged() ) ) ; connect(eqslSentComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(sloteQSLSentComboBoxChanged() ) ) ; connect(eqslRecComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(sloteQSLRecvComboBoxChanged() ) ) ; connect(lotwSentComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotLotwSentComboBoxChanged() ) ) ; connect(lotwRecComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotLotwRecvComboBoxChanged() ) ) ; connect(qrzcomComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotQRZCOMComboBoxChanged() ) ) ; } void MainWindowInputEQSL::setDefaultData() { //qsAux << tr("Y-Yes") << tr("N-No") << tr("R-Requested") << tr("I-Ignore") << tr("V-Validated"); //eqslRecComboBox->addItems(qsAux); //lotwRecComboBox->addItems(qsAux); eqslRecComboBox->addItems(qslRcvdStatusList); lotwRecComboBox->addItems(qslRcvdStatusList); //qsAux.clear(); //qsAux << tr("Y-Yes") << tr("N-No") << tr("R-Requested") << tr("Q-Queued") << tr("I-Ignore"); //eqslSentComboBox->addItems(qsAux); //lotwSentComboBox->addItems(qsAux); eqslSentComboBox->addItems(qslSentStatusList); lotwSentComboBox->addItems(qslSentStatusList); //QStringList qsAux; //qsAux.clear(); //qsAux << tr("Y-Uploaded") << tr("N-Do not upload") << tr("M-Modified"); clublogComboBox->addItems(clubLogStatusList); qrzcomComboBox->addItems(clubLogStatusList); queueSentByDefault = true; } void MainWindowInputEQSL::clear() { //qDebug() << "MainWindowInputEQSL::clear" ; // Do not upload if (queueSentByDefault) { clublogComboBox->setCurrentIndex( clublogComboBox->findText("M", Qt::MatchStartsWith)); eqslSentComboBox->setCurrentIndex( eqslSentComboBox->findText("Q", Qt::MatchStartsWith)); lotwSentComboBox->setCurrentIndex( lotwSentComboBox->findText("Q", Qt::MatchStartsWith)); qrzcomComboBox->setCurrentIndex( qrzcomComboBox->findText("M", Qt::MatchStartsWith)); } else { clublogComboBox->setCurrentIndex( clublogComboBox->findText("N", Qt::MatchStartsWith)); qrzcomComboBox->setCurrentIndex( qrzcomComboBox->findText("N", Qt::MatchStartsWith)); eqslSentComboBox->setCurrentIndex( eqslSentComboBox->findText("N", Qt::MatchStartsWith)); lotwSentComboBox->setCurrentIndex( lotwSentComboBox->findText("N", Qt::MatchStartsWith)); } eqslRecComboBox->setCurrentIndex(eqslRecComboBox->findText("N", Qt::MatchStartsWith)); lotwRecComboBox->setCurrentIndex(lotwRecComboBox->findText("N", Qt::MatchStartsWith)); eqslSentQDateEdit->setDate(util->getDefaultDate()); eqslRecQDateEdit->setDate(util->getDefaultDate()); lotwSentQDateEdit->setDate(util->getDefaultDate()); lotwRecQDateEdit->setDate(util->getDefaultDate()); clublogQDateEdit->setDate(util->getDefaultDate()); qrzcomQDateEdit->setDate(util->getDefaultDate()); } QString MainWindowInputEQSL::getClubLogStatus() { QString _pm = QString(); //qDebug() << "MainWindowInputEQSL::getClubLogStatus:" << clublogComboBox->currentText(); _pm = (((clublogComboBox->currentText()).split('-')).at(0)).simplified(); return _pm; } QString MainWindowInputEQSL::getQRZCOMStatus() { QString _pm = QString(); _pm = (((qrzcomComboBox->currentText()).split('-')).at(0)).simplified(); return _pm; } QString MainWindowInputEQSL::getEQSLRecStatus() { QString _pm = QString(); //qDebug() << "MainWindowInputEQSL::getEQSLRecStatus:" << eqslRecComboBox->currentText(); _pm = (((eqslRecComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << "MainWindowInputEQSL::getEQSLRecStatus: " << _pm; //if (_pm == "Not") //{ // return QString(); //} return _pm; } QString MainWindowInputEQSL::getEQSLSenStatus() { QString _pm = QString(); //qDebug() << "MainWindowInputEQSL::getEQSLSenStatus:" << eqslSentComboBox->currentText(); _pm = (((eqslSentComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << "MainWindowInputEQSL::getEQSLSenStatus: " << _pm; //if (_pm == "Not") //{ // return QString(); //} return _pm; } QString MainWindowInputEQSL::getLOTWRecStatus() { QString _pm = QString(); //qDebug() << "MainWindowInputEQSL::getLOTWRecStatus:" << lotwRecComboBox->currentText(); _pm = (((lotwRecComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << "MainWindowInputEQSL::getLOTWRecStatus: " << _pm; //if (_pm == "Not") //{ // return QString(); //} return _pm; } QString MainWindowInputEQSL::getLOTWSenStatus() { QString _pm = QString(); //qDebug() << "MainWindowInputEQSL::getLOTWSenStatus:" << lotwSentComboBox->currentText(); _pm = (((lotwSentComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << "MainWindowInputEQSL::getLOTWSenStatus: " << _pm; //if (_pm == "Not") //{ // return QString(); //} return _pm; } void MainWindowInputEQSL::setClubLogStatus(const QString &_qs) { //qDebug() << "MainWindowInputEQSL::setClubLogStatus: " << _qs; if((( clublogComboBox->findText(_qs, Qt::MatchStartsWith))>=0) && (_qs.length()>0) ) { clublogComboBox->setCurrentIndex( clublogComboBox->findText(_qs+" -", Qt::MatchStartsWith)); } else { clublogComboBox->setCurrentIndex( clublogComboBox->findText("N", Qt::MatchStartsWith)); } } void MainWindowInputEQSL::setQRZCOMStatus(const QString &_qs) { //qDebug() << "MainWindowInputEQSL::setClubLogStatus: " << _qs; if((( qrzcomComboBox->findText(_qs, Qt::MatchStartsWith))>=0) && (_qs.length()>0) ) { qrzcomComboBox->setCurrentIndex( qrzcomComboBox->findText(_qs+" -", Qt::MatchStartsWith)); } else { qrzcomComboBox->setCurrentIndex( qrzcomComboBox->findText("N", Qt::MatchStartsWith)); } } void MainWindowInputEQSL::setEQSLRecStatus(const QString &_qs) { //qDebug() << "MainWindowInputEQSL::setEQSLRecStatus: " << _qs; //if(( eqslRecComboBox->findText(_qs+" -", Qt::MatchStartsWith))>=0) if((( eqslRecComboBox->findText(_qs, Qt::MatchStartsWith))>=0) && (_qs.length()>0) ) { eqslRecComboBox->setCurrentIndex( eqslRecComboBox->findText(_qs+" -", Qt::MatchStartsWith)); } else { eqslRecComboBox->setCurrentIndex( eqslRecComboBox->findText("N", Qt::MatchStartsWith)); } } void MainWindowInputEQSL::setEQSLSenStatus(const QString &_qs) { //qDebug() << "MainWindowInputEQSL::setEQSLSenStatus: #" << _qs+" -"; if((( eqslSentComboBox->findText(_qs, Qt::MatchStartsWith))>=0) && (_qs.length()>0) ) { //qDebug() << "MainWindowInputEQSL::setEQSLSenStatus: found: " << _qs << " - Index: " << QString::number(eqslSentComboBox->findText(_qs, Qt::MatchStartsWith)); eqslSentComboBox->setCurrentIndex( eqslSentComboBox->findText(_qs, Qt::MatchStartsWith)); } else { //qDebug() << "MainWindowInputEQSL::setEQSLSenStatus: NOT found"; if (queueSentByDefault) { //qDebug() << "MainWindowInputEQSL::setEQSLSenStatus: NOT found - Q is defined by default"; eqslSentComboBox->setCurrentIndex( eqslSentComboBox->findText("Q", Qt::MatchStartsWith)); } else { //qDebug() << "MainWindowInputEQSL::setEQSLSenStatus: NOT found - Q is NOT defined by default"; eqslSentComboBox->setCurrentIndex( eqslSentComboBox->findText("N", Qt::MatchStartsWith)); eqslSentComboBox->setCurrentIndex(1); } //qDebug() << "MainWindowInputEQSL::setEQSLSenStatus: NOT found"; //eqslSentComboBox->setCurrentIndex(1); } //qDebug() << "MainWindowInputEQSL::setEQSLSenStatus - END"; } void MainWindowInputEQSL::setLOTWRecStatus(const QString &_qs) { //qDebug() << "MainWindowInputEQSL::setLOTWRecStatus: " << _qs; if((( lotwRecComboBox->findText(_qs, Qt::MatchStartsWith))>=0) && (_qs.length()>0) ) //if(( lotwRecComboBox->findText(_qs+" -", Qt::MatchStartsWith))>=0) { lotwRecComboBox->setCurrentIndex( lotwRecComboBox->findText(_qs+" -", Qt::MatchStartsWith)); } else { lotwRecComboBox->setCurrentIndex(lotwRecComboBox->findText("N", Qt::MatchStartsWith)); } } void MainWindowInputEQSL::setLOTWSenStatus(const QString &_qs) { //qDebug() << "MainWindowInputEQSL::setLOTWSenStatus: " << _qs; if((( lotwSentComboBox->findText(_qs, Qt::MatchStartsWith))>=0) && (_qs.length()>0) ) //if(( lotwSentComboBox->findText(_qs+" -", Qt::MatchStartsWith))>=0) { lotwSentComboBox->setCurrentIndex( lotwSentComboBox->findText(_qs+" -", Qt::MatchStartsWith)); } else { if (queueSentByDefault) { lotwSentComboBox->setCurrentIndex( lotwSentComboBox->findText("Q", Qt::MatchStartsWith)); } else { lotwSentComboBox->setCurrentIndex( lotwSentComboBox->findText("N", Qt::MatchStartsWith)); } //lotwSentComboBox->setCurrentIndex(1); } } void MainWindowInputEQSL::slotLotwRecvComboBoxChanged(){ //qDebug() << "MainWindowInputEQSL::slotLotwRecvComboBoxChanged"; //QSLRDATE (only valid if QSL_RCVD is Y-0, I-3, or V-4) //Y-Yes-0 //N-No-1 //R-Requested-2 //I-Ignore-3 //V-Verified-4 int i = lotwRecComboBox->currentIndex(); switch (i) { case 0: lotwRecQDateEdit->setVisible(true); lotwRecQDateEdit->setEnabled(true); lotwRecQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 2: lotwRecQDateEdit->setVisible(true); lotwRecQDateEdit->setEnabled(true); lotwRecQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 3: lotwRecQDateEdit->setVisible(true); lotwRecQDateEdit->setEnabled(true); break; case 4: lotwRecQDateEdit->setVisible(true); lotwRecQDateEdit->setEnabled(true); break; default: //NO lotwRecQDateEdit->setVisible(false); lotwRecQDateEdit->setEnabled(false); break; } } void MainWindowInputEQSL::slotLotwSentComboBoxChanged(){ //qDebug() << "MainWindowInputEQSL::slotLotwSentComboBoxChanged"; int i = lotwSentComboBox->currentIndex(); //{Y, N, R, I, V} //(QSLSDATE is only valid if QSL_SENT is Y-0, Q-3, or I-4) // Y-Yes = 0 // N-No = 1 // R-Requested = 2 // Q-Queued = 3 // I-Ignore = 4 switch (i) { case 0: lotwSentQDateEdit->setVisible(true); lotwSentQDateEdit->setEnabled(true); lotwSentQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 2: lotwSentQDateEdit->setVisible(true); lotwSentQDateEdit->setEnabled(true); lotwSentQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 3: lotwSentQDateEdit->setVisible(true); lotwSentQDateEdit->setEnabled(true); lotwSentQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 4: lotwSentQDateEdit->setVisible(true); lotwSentQDateEdit->setEnabled(true); lotwSentQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; default: //NO lotwSentQDateEdit->setVisible(false); lotwSentQDateEdit->setEnabled(false); break; } } void MainWindowInputEQSL::sloteQSLRecvComboBoxChanged(){ //qDebug() << "MainWindowInputEQSL::sloteQSLRecvComboBoxChanged"; //QSLRDATE (only valid if QSL_RCVD is Y-0, I-3, or V-4) //Y-Yes-0 //N-No-1 //R-Requested-2 //I-Ignore-3 //V-Verified-4 int i = eqslRecComboBox->currentIndex(); switch (i) { case 0: eqslRecQDateEdit->setVisible(true); eqslRecQDateEdit->setEnabled(true); eqslRecQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 2: eqslRecQDateEdit->setVisible(true); eqslRecQDateEdit->setEnabled(true); eqslRecQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 3: eqslRecQDateEdit->setVisible(true); eqslRecQDateEdit->setEnabled(true); eqslRecQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 4: eqslRecQDateEdit->setVisible(true); eqslRecQDateEdit->setEnabled(true); eqslRecQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; default: //NO eqslRecQDateEdit->setVisible(false); eqslRecQDateEdit->setEnabled(false); break; } } void MainWindowInputEQSL::sloteQSLSentComboBoxChanged(){ //qDebug() << "MainWindowInputEQSL::sloteQSLSentComboBoxChanged"; int i = eqslSentComboBox->currentIndex(); //{Y, N, R, I, V} //(QSLSDATE is only valid if QSL_SENT is Y-0, Q-3, or I-4) // Y-Yes = 0 // N-No = 1 // R-Requested = 2 // Q-Queued = 3 // I-Ignore = 4 switch (i) { case 0: eqslSentQDateEdit->setVisible(true); eqslSentQDateEdit->setEnabled(true); eqslSentQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 2: eqslSentQDateEdit->setVisible(true); eqslSentQDateEdit->setEnabled(true); eqslSentQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 3: eqslSentQDateEdit->setVisible(true); eqslSentQDateEdit->setEnabled(true); eqslSentQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 4: eqslSentQDateEdit->setVisible(true); eqslSentQDateEdit->setEnabled(true); eqslSentQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; default: //NO eqslSentQDateEdit->setVisible(false); eqslSentQDateEdit->setEnabled(false); break; } } void MainWindowInputEQSL::slotClubLogComboBoxChanged() { int i = clublogComboBox->currentIndex(); //{Y, N, M} // Y-Yes = 0 // N-No = 1 // M-Modified = 2 switch (i) { case 0: clublogQDateEdit->setVisible(true); clublogQDateEdit->setEnabled(true); clublogQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 2: clublogQDateEdit->setVisible(true); clublogQDateEdit->setEnabled(true); clublogQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; default: //NO clublogQDateEdit->setVisible(false); clublogQDateEdit->setEnabled(false); break; } } void MainWindowInputEQSL::setClubLogDate(const QDate _qs) { if (_qs.isValid()) { clublogQDateEdit->setDate(_qs); } else { clublogQDateEdit->clear(); } } void MainWindowInputEQSL::slotQRZCOMComboBoxChanged() { int i = qrzcomComboBox->currentIndex(); //{Y, N, M} // Y-Yes = 0 // N-No = 1 // M-Modified = 2 switch (i) { case 0: qrzcomQDateEdit->setVisible(true); qrzcomQDateEdit->setEnabled(true); qrzcomQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 2: qrzcomQDateEdit->setVisible(true); qrzcomQDateEdit->setEnabled(true); qrzcomQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; default: //NO qrzcomQDateEdit->setVisible(false); qrzcomQDateEdit->setEnabled(false); break; } } void MainWindowInputEQSL::setQRZCOMDate(const QDate _qs) { if (_qs.isValid()) { qrzcomQDateEdit->setDate(_qs); } else { qrzcomQDateEdit->clear(); } } void MainWindowInputEQSL::setEQSLRecDate(const QDate _qs) { if (_qs.isValid()) { eqslRecQDateEdit->setDate(_qs); } else { eqslRecQDateEdit->clear(); } } void MainWindowInputEQSL::setEQSLSenDate(const QDate _qs) { if (_qs.isValid()) { eqslSentQDateEdit->setDate(_qs); } else { eqslSentQDateEdit->clear(); } } void MainWindowInputEQSL::setLOTWRecDate(const QDate _qs) { if (_qs.isValid()) { lotwRecQDateEdit->setDate(_qs); } else { lotwRecQDateEdit->clear(); } } void MainWindowInputEQSL::setLOTWSenDate(const QDate _qs) { if (_qs.isValid()) { lotwSentQDateEdit->setDate(_qs); } else { lotwSentQDateEdit->clear(); } } QDate MainWindowInputEQSL::getClubLogDate() { return clublogQDateEdit->date(); } QDate MainWindowInputEQSL::getQRZCOMDate() { return qrzcomQDateEdit->date(); } QDate MainWindowInputEQSL::getEQSLRecDate() { return eqslRecQDateEdit->date(); } QDate MainWindowInputEQSL::getEQSLSenDate() { return eqslSentQDateEdit->date(); } QDate MainWindowInputEQSL::getLOTWRecDate() { return lotwRecQDateEdit->date(); } QDate MainWindowInputEQSL::getLOTWSenDate() { return lotwSentQDateEdit->date(); } void MainWindowInputEQSL::setQueueSentByDefault(const bool _b) { queueSentByDefault = _b; } klog-2.3.3/inputwidgets/mainwindowinputeqsl.h0000644000015700001710000000767614542412415021375 0ustar jenkinsjenkins#ifndef KLOG_INPUTWIDGETS_MAINWINDOWINPUTEQSL_H #define KLOG_INPUTWIDGETS_MAINWINDOWINPUTEQSL_H /*************************************************************************** mainwindowinputeqsl.h - description ------------------- begin : jun 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the mainwindow that supports the eQSL options // #include #include #include #include "../dataproxy_sqlite.h" #include "../utilities.h" class MainWindowInputEQSL : public QWidget { Q_OBJECT public: explicit MainWindowInputEQSL(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~MainWindowInputEQSL(); //void setData(const QString &_comment); //QString getComment(); void clear(); QString getQRZCOMStatus(); QString getClubLogStatus(); QString getEQSLRecStatus(); QString getEQSLSenStatus(); QString getLOTWRecStatus(); QString getLOTWSenStatus(); void setQRZCOMStatus(const QString &_qs); void setClubLogStatus(const QString &_qs); void setEQSLRecStatus(const QString &_qs); void setEQSLSenStatus(const QString &_qs); void setLOTWRecStatus(const QString &_qs); void setLOTWSenStatus(const QString &_qs); QDate getQRZCOMDate(); QDate getClubLogDate(); QDate getEQSLRecDate(); QDate getEQSLSenDate(); QDate getLOTWRecDate(); QDate getLOTWSenDate(); void setQRZCOMDate(const QDate _qs); void setClubLogDate(const QDate _qs); void setEQSLRecDate(const QDate _qs); void setEQSLSenDate(const QDate _qs); void setLOTWRecDate(const QDate _qs); void setLOTWSenDate(const QDate _qs); void setQueueSentByDefault(const bool _b); signals: private slots: void slotQRZCOMComboBoxChanged(); void slotClubLogComboBoxChanged(); void sloteQSLRecvComboBoxChanged(); void sloteQSLSentComboBoxChanged(); void slotLotwRecvComboBoxChanged(); void slotLotwSentComboBoxChanged(); private: void createUI(); void setDefaultData(); QComboBox *eqslSentComboBox, *eqslRecComboBox, *lotwSentComboBox, *lotwRecComboBox, *clublogComboBox, *qrzcomComboBox; QDateEdit *eqslSentQDateEdit, *eqslRecQDateEdit, *lotwSentQDateEdit, *lotwRecQDateEdit, *clublogQDateEdit, *qrzcomQDateEdit; DataProxy_SQLite *dataProxy; Utilities *util; QStringList qslSentStatusList, qslRcvdStatusList, clubLogStatusList; bool queueSentByDefault; }; #endif // MAINWINDOWINPUTEQSL_H klog-2.3.3/inputwidgets/mainwindowmydatatab.cpp0000644000015700001710000005647514542412415021653 0ustar jenkinsjenkins/*************************************************************************** mainwindowmydatatab.cpp - description ------------------- begin : Jul 2016 copyright : (C) 2016 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "mainwindowmydatatab.h" MainWindowMyDataTab::MainWindowMyDataTab(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "MainWindowMyDataTab::MainWindowMyDataTab" ; logLevel = None; dataProxy = dp; myPowerSpinBox = new QDoubleSpinBox; operatorLineEdit = new QLineEdit; stationCallSignLineEdit = new QLineEdit; myLocatorLineEdit = new QLineEdit; myUserADIFLineEdit = new QLineEdit; myUserADIFComboBox = new QComboBox; keepThisDataForNextQSOQCheckbox = new QCheckBox; locator = new Locator(); lastOperatorQRZ = QString(); // Last QRZ used by the user, will remain if the button is checked and removed if not //lastStationQRZ = QString(); // Last QRZ used by the user, will remain if the button is checked and removed if not lastMyLocator = QString(); // Last locator used by the user, will remain if the button is checked and removed if not stationCallsign = QString(); // Defined in the configuration by the user, will be used if the user configured so in the setup operatorQRZ = QString(); // Defined in the configuration by the user, will be used if the user configured so in the setup myLocator = QString(); // Defined in the configuration by the user, will be used if the user configured so in the setup util = new Utilities(Q_FUNC_INFO); modify = false; createUI(); setInitialADIFValues(); myPower = 0; lastPower = 0; util->setLongPrefixes(dataProxy->getLongPrefixes()); util->setSpecialCalls(dataProxy->getSpecialCallsigns()); //qDebug() << "MainWindowMyDataTab::MainWindowMyDataTab - END" ; } MainWindowMyDataTab::~MainWindowMyDataTab() { logEvent (Q_FUNC_INFO, "Start", Debug); delete(locator); delete(util); delete(dataProxy); } void MainWindowMyDataTab::createUI() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); palRed.setColor(QPalette::Text, Qt::red); palBlack.setColor(QPalette::Text, Qt::black); palWhite.setColor(QPalette::Text, Qt::white); myPowerSpinBox->setDecimals(2); myPowerSpinBox->setMaximum(9999); myPowerSpinBox->setSuffix(" " + tr("Watts")); keepThisDataForNextQSOQCheckbox->setText(tr("Keep this data")); QLabel *myPowerSpinBoxLabelN = new QLabel(tr("Power")); myPowerSpinBoxLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *operatorLabelN = new QLabel(tr("Operator callsign")); operatorLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *stationCallSignLabelN = new QLabel(tr("Station Callsign")); stationCallSignLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *myLocatorLabelN = new QLabel(tr("My Locator")); myLocatorLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QGridLayout *myDataInputTabWidgetLayout = new QGridLayout; myDataInputTabWidgetLayout->addWidget(myPowerSpinBoxLabelN, 0, 2); myDataInputTabWidgetLayout->addWidget(myPowerSpinBox, 0, 3); myDataInputTabWidgetLayout->addWidget(operatorLabelN, 1, 0); myDataInputTabWidgetLayout->addWidget(operatorLineEdit, 1, 1); myDataInputTabWidgetLayout->addWidget(stationCallSignLabelN, 1, 2); myDataInputTabWidgetLayout->addWidget(stationCallSignLineEdit, 1, 3); myDataInputTabWidgetLayout->addWidget(myUserADIFComboBox, 2, 0); myDataInputTabWidgetLayout->addWidget(myUserADIFLineEdit, 2, 1); myDataInputTabWidgetLayout->addWidget(myLocatorLabelN, 2, 2); myDataInputTabWidgetLayout->addWidget(myLocatorLineEdit, 2, 3); //myDataInputTabWidgetLayout->addWidget(keepLabel, 4, 2); myDataInputTabWidgetLayout->addWidget(keepThisDataForNextQSOQCheckbox, 4, 3); //myDataInputTabWidgetLayout->setSizeConstraint(QLayout::SetFixedSize); setLayout(myDataInputTabWidgetLayout); //myDataInputTabWidget->setLayout(myDataInputTabWidgetLayout); // i = dxUpLeftTab->addTab(myDataInputTabWidget, tr("My Data")); //connect(stationCallSignLineEdit, SIGNAL(returnPressed()), this, SLOT(slotQRZReturnPressed() ) ); connect(myLocatorLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotMyLocatorTextChanged() ) ); connect(myLocatorLineEdit, SIGNAL(returnPressed()), this, SLOT(slotReturnPressed() ) ); connect(operatorLineEdit, SIGNAL(returnPressed()), this, SLOT(slotReturnPressed() ) ); connect(operatorLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotOperatorTextChanged()) ); connect(stationCallSignLineEdit, SIGNAL(returnPressed()), this, SLOT(slotReturnPressed() ) ); connect(stationCallSignLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotStationCallSignTextChanged() ) ); connect(myUserADIFComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(slotMyUserADIFComboBoxChanged() ) ) ; connect(myUserADIFLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotSetCurrentMyUSerData() ) ); logEvent (Q_FUNC_INFO, "END", Debug); } void MainWindowMyDataTab::clear(bool _full) { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); modify = false; if (!keepThisDataForNextQSOQCheckbox->isChecked()) { //qDebug() << "MainWindowMyDataTab::clear: NOT checked" ; myPowerSpinBox->setValue(myPower); if (util->isValidCall(operatorQRZ)) { //qDebug() << Q_FUNC_INFO << ": " << operatorQRZ; operatorLineEdit->setText(operatorQRZ); } else { operatorLineEdit->clear(); } if (util->isValidCall(stationCallsign)) { stationCallSignLineEdit->setText(stationCallsign); } else { stationCallSignLineEdit->clear(); } if (util->isValidGrid(myLocator)) { myLocatorLineEdit->setText(myLocator); } else { myLocatorLineEdit->clear(); } my_rig = QString(); my_sota = QString(); my_antenna = QString(); myUserADIFComboBox->setCurrentIndex(0); myUserADIFLineEdit->clear(); } if (_full) { operatorLineEdit->clear (); stationCallSignLineEdit->clear (); myLocatorLineEdit->clear (); //myPowerSpinBox->setValue(myPower); myPowerSpinBox->clear(); my_rig = QString(); my_sota = QString(); my_antenna = QString(); my_vucc_grids = QString(); myUserADIFComboBox->setCurrentIndex(0); myUserADIFLineEdit->clear(); keepThisDataForNextQSOQCheckbox->setChecked (false); } logEvent (Q_FUNC_INFO, "END", Debug); } void MainWindowMyDataTab::show() { logEvent (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO; //qDebug() << "MainWindowMyDataTab::show: " << QString::number(myPower) << "/" << operatorQRZ << "/" << stationCallsign << "/" << myLocator; myPowerSpinBox->setValue(myPower); operatorLineEdit->setText(operatorQRZ); stationCallSignLineEdit->setText(stationCallsign); //qDebug() << "MainWindowMyDataTab::show: setMyLocator: " << myLocator ; myLocatorLineEdit->setText(myLocator); logEvent (Q_FUNC_INFO, "END", Debug); } void MainWindowMyDataTab::slotMyLocatorTextChanged() { logEvent (Q_FUNC_INFO, "Start", Debug); //qDebug() << Q_FUNC_INFO; //qDebug() << "MainWindowMyDataTab::slotMyLocatorTextChanged: " << myLocatorLineEdit->text(); //logEvent(Q_FUNC_INFO, "Start", logLevel); int cursorP = myLocatorLineEdit->cursorPosition(); myLocatorLineEdit->setText(util->getClearSQLi(myLocatorLineEdit->text()).toUpper()); //qDebug() << "MainWindowMyDataTab::clear: setMyLocator: " << myLocatorLineEdit->text() ; if ( locator->isValidLocator(myLocatorLineEdit->text())) { if (!modify) { myLocator = (myLocatorLineEdit->text()).toUpper(); } if (getDarkMode()) { myLocatorLineEdit->setPalette(palWhite); } else { myLocatorLineEdit->setPalette(palBlack); } myLocatorLineEdit->setToolTip(tr("My QTH locator.")); myLocatorLineEdit->setCursorPosition(cursorP); emit myLocChangedSignal(myLocatorLineEdit->text()); //dxccStatusWidget->setMyLocator(myLocator); //qDebug() << "MainWindowMyDataTab::slotMyLocatorTextChanged: My LOCATOR CHANGED TO: " << myLocator; //slotLocatorTextChanged(); } else { //logEvent(Q_FUNC_INFO, "END-2", logLevel); myLocatorLineEdit->setPalette(palRed); myLocatorLineEdit->setToolTip(tr("My QTH locator. Format should be Maidenhead like IN70AA up to 10 characters.")); myLocatorLineEdit->setCursorPosition(cursorP); return; } //logEvent(Q_FUNC_INFO, "END", logLevel); logEvent (Q_FUNC_INFO, "END", Debug); } void MainWindowMyDataTab::slotReturnPressed() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); emit returnPressed(); } /* void MainWindowMyDataTab::setSetupStationQRZ(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op ; if (!util->isValidCall (_op)) { return; } stationQRZ = _op.toUpper(); stationCallSignLineEdit->setText(stationQRZ); } */ void MainWindowMyDataTab::setSetupMyLocator(const QString &_op) { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); if (!locator->isValidLocator (_op)) { logEvent (Q_FUNC_INFO, "END-1", Debug); return; } myLocator = _op.toUpper(); myLocatorLineEdit->setText (myLocator); logEvent (Q_FUNC_INFO, "END", Debug); } void MainWindowMyDataTab::setMyPower(const double _power) { //qDebug() << Q_FUNC_INFO << ": " << QString::number(_power); //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); myPowerSpinBox->setValue(_power); } double MainWindowMyDataTab::getMyPower() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); if (myPowerSpinBox->value() > 0) { lastPower = myPowerSpinBox->value(); return lastPower; } else { return 0.0; } //return myPowerSpinBox->value(); } void MainWindowMyDataTab::setOperator(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; logEvent (Q_FUNC_INFO, "Start", Debug); operatorLineEdit->setText(_op); logEvent (Q_FUNC_INFO, "END", Debug); } QString MainWindowMyDataTab::getOperator() { //qDebug() << Q_FUNC_INFO << ": " << (operatorLineEdit->text()).toUpper(); logEvent (Q_FUNC_INFO, "Start", Debug); lastOperatorQRZ = (operatorLineEdit->text()).toUpper(); return lastOperatorQRZ; } void MainWindowMyDataTab::setStationCallsign(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; logEvent (Q_FUNC_INFO, "Start", Debug); if (util->isValidCall (_op)) { stationCallSignLineEdit->setText(_op); } else { stationCallsign.clear (); } logEvent (Q_FUNC_INFO, "END", Debug); } QString MainWindowMyDataTab::getStationCallsign() { //qDebug() << Q_FUNC_INFO << ": " << (stationCallSignLineEdit->text()).toUpper(); logEvent (Q_FUNC_INFO, QString("Start: %1").arg((stationCallSignLineEdit->text()).toUpper()), Debug); return (stationCallSignLineEdit->text()).toUpper(); //return lastStationQRZ; } void MainWindowMyDataTab::setMyLocator(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; logEvent (Q_FUNC_INFO, "Start", Debug); myLocatorLineEdit->setText(_op); } QString MainWindowMyDataTab::getMyLocator() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); lastMyLocator = (myLocatorLineEdit->text()).toUpper(); return lastMyLocator.toUpper(); } void MainWindowMyDataTab::setData(const QString &_stationCallsign, const QString &_operator, const QString &_myLocator) { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); if (util->isValidCall (_stationCallsign)) { stationCallsign = _stationCallsign; } else { stationCallsign = QString(); } //qDebug() << Q_FUNC_INFO << ": Setting station Callsign: " << stationCallsign; setStationCallsign (stationCallsign); if (_operator.length()>0) { setOperator (_operator); //operatorQRZ = _operator; } else { operatorQRZ = QString(); } if (_myLocator.length()>0) { myLocator = _myLocator; setMyLocator (_myLocator); } else { myLocator = QString(); } } void MainWindowMyDataTab::slotOperatorTextChanged() { //qDebug() << Q_FUNC_INFO << operatorLineEdit->text(); logEvent (Q_FUNC_INFO, "Start", Debug); int cursorP = operatorLineEdit->cursorPosition(); operatorLineEdit->setText(util->getClearSQLi(operatorLineEdit->text()).toUpper()); if (util->isValidCall(operatorLineEdit->text())) { if (getDarkMode()) { operatorLineEdit->setPalette(palWhite); } else { operatorLineEdit->setPalette(palBlack); } if (!modify) { operatorQRZ = (operatorLineEdit->text()); } } else if (operatorLineEdit->text ().isEmpty ()) { if (!modify) { operatorQRZ.clear (); } } else { operatorLineEdit->setPalette(palRed); } operatorLineEdit->setCursorPosition(cursorP); } void MainWindowMyDataTab::slotStationCallSignTextChanged() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); int cursorP = stationCallSignLineEdit->cursorPosition(); stationCallSignLineEdit->setText(util->getClearSQLi(stationCallSignLineEdit->text()).toUpper()); if (util->isValidCall(stationCallSignLineEdit->text())) { if (getDarkMode()) { stationCallSignLineEdit->setPalette(palWhite); } else { stationCallSignLineEdit->setPalette(palBlack); } } else { stationCallSignLineEdit->setPalette(palRed); } stationCallSignLineEdit->setCursorPosition(cursorP); } void MainWindowMyDataTab::setKeep(const bool _b) { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); keepThisDataForNextQSOQCheckbox->setChecked (_b); } bool MainWindowMyDataTab::getKeep() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); return keepThisDataForNextQSOQCheckbox->isChecked (); } bool MainWindowMyDataTab::setInitialADIFValues() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); adifValidTypes.clear (); adifValidTypes << "01-" + tr("My Rig") << "02-" + tr("My Antenna") << "03-" + tr("My SOTA_Ref")<< "04-" + tr("My VUCC_GRIDS"); myUserADIFComboBox->clear (); myUserADIFComboBox->addItems (adifValidTypes); return true; } bool MainWindowMyDataTab::setUserADIFTypeComboBox(const QString &_value) { //qDebug() << Q_FUNC_INFO << ": " << _value; logEvent (Q_FUNC_INFO, "Start", Debug); if (_value == "MY_RIG") { myUserADIFComboBox->setCurrentIndex (0); } else if (_value == "MY_ANTENNA") { myUserADIFComboBox->setCurrentIndex (1); } else if (_value == "MY_SOTA_REF") { myUserADIFComboBox->setCurrentIndex (2); } else if (_value == "MY_VUCC_GRIDS") { myUserADIFComboBox->setCurrentIndex (3); } else { myUserADIFComboBox->setCurrentIndex (0); return false; } return true; } QString MainWindowMyDataTab::getUserADIFTypeComboBox() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); int value = (((myUserADIFComboBox->currentText ()).split('-')).at(0)).toInt (); switch (value) { case 1: return "MY_RIG"; case 2: return "MY_ANTENNA"; case 3: return "MY_SOTA_REF"; case 4: return "MY_VUCC_GRIDS"; default: return QString(); } } bool MainWindowMyDataTab::setUserADIFValue(const QString &_adifValue) { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); myUserADIFLineEdit->setText (_adifValue); return true; } QString MainWindowMyDataTab::getUserADIFValue() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); return myUserADIFLineEdit->text(); } bool MainWindowMyDataTab::setMyRig(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; logEvent (Q_FUNC_INFO, "Start", Debug); my_rig = _op; slotMyUserADIFComboBoxChanged(); return true; } QString MainWindowMyDataTab::getMyRig() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); return my_rig; } bool MainWindowMyDataTab::setMyAntenna(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; logEvent (Q_FUNC_INFO, "Start", Debug); my_antenna = _op; slotMyUserADIFComboBoxChanged(); return true; } QString MainWindowMyDataTab::getMyAntenna() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); return my_antenna; } bool MainWindowMyDataTab::setMySOTA(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; logEvent (Q_FUNC_INFO, "Start", Debug); my_sota = _op; slotMyUserADIFComboBoxChanged(); return true; } QString MainWindowMyDataTab::getMySOTA() { //qDebug() << Q_FUNC_INFO; logEvent (Q_FUNC_INFO, "Start", Debug); return my_sota; } bool MainWindowMyDataTab::setMyVUCCGrids(const QString &_op) { //qDebug() << Q_FUNC_INFO << ": " << _op; logEvent (Q_FUNC_INFO, "Start", Debug); if (checkMyVUCC_GRIDS(_op)) { my_vucc_grids = _op; slotMyUserADIFComboBoxChanged(); return true; } return false; } bool MainWindowMyDataTab::checkMyVUCC_GRIDS(const QString &_string) { //qDebug() << Q_FUNC_INFO << ": " << _string; logEvent (Q_FUNC_INFO, "Start", Debug); if (util->isValidVUCCGrids (_string)) { setColorsForMyUserADIFLineEdit(); return true; } else { myUserADIFLineEdit->setPalette (palRed); return false; } } QString MainWindowMyDataTab::getMyVUCCGrids() { logEvent (Q_FUNC_INFO, "Start", Debug); if (checkMyVUCC_GRIDS (my_vucc_grids)) { return my_vucc_grids; } else { return QString(); } } void MainWindowMyDataTab::setColorsForMyUserADIFLineEdit() { logEvent (Q_FUNC_INFO, "Start", Debug); if (getDarkMode()) { myUserADIFLineEdit->setPalette(palWhite); } else { myUserADIFLineEdit->setPalette(palBlack); } } void MainWindowMyDataTab::slotMyUserADIFComboBoxChanged() { //qDebug() << Q_FUNC_INFO << ": " << getUserADIFTypeComboBox (); logEvent (Q_FUNC_INFO, "Start", Debug); QString currentTag = getUserADIFTypeComboBox (); setColorsForMyUserADIFLineEdit(); if (currentTag == "MY_RIG") { myUserADIFLineEdit->setText (my_rig); } else if (currentTag == "MY_ANTENNA") { myUserADIFLineEdit->setText (my_antenna); } else if (currentTag == "MY_SOTA_REF") { myUserADIFLineEdit->setText (my_sota); } else if (currentTag == "MY_VUCC_GRIDS") { myUserADIFLineEdit->setText (my_vucc_grids); } } void MainWindowMyDataTab::slotSetCurrentMyUSerData() { logEvent (Q_FUNC_INFO, "Start", Debug); QString currentTag = getUserADIFTypeComboBox (); //qDebug() << Q_FUNC_INFO << ": " << currentTag; int currentPos = myUserADIFLineEdit->cursorPosition (); if (currentTag == "MY_RIG") { my_rig = myUserADIFLineEdit->text(); } else if (currentTag == "MY_ANTENNA") { my_antenna = myUserADIFLineEdit->text(); } else if (currentTag == "MY_SOTA_REF") { my_sota = myUserADIFLineEdit->text(); } else if (currentTag == "MY_VUCC_GRIDS") { //if (checkMyVUCC_GRIDS(myUserADIFLineEdit->text())) //{} my_vucc_grids = myUserADIFLineEdit->text().toUpper(); myUserADIFLineEdit->setText (my_vucc_grids); } myUserADIFLineEdit->setCursorPosition (currentPos); } void MainWindowMyDataTab::setModify(const bool _modify) { //emit debugLog(Q_FUNC_INFO, "Start", Debug); logEvent (Q_FUNC_INFO, "Start", Debug); modify = _modify; //emit debugLog(Q_FUNC_INFO, "END", Debug); } bool MainWindowMyDataTab::getDarkMode() { logEvent (Q_FUNC_INFO, "Start", Debug); if (operatorLineEdit->palette().color (QPalette::Base) == "#646464") { return true; } else { return false; } } void MainWindowMyDataTab::setLogLevel (const DebugLogLevel _b) { logEvent (Q_FUNC_INFO, "Start", Debug); logLevel = _b; logEvent (Q_FUNC_INFO, "END", Debug); } void MainWindowMyDataTab::logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level) { //qDebug() << Q_FUNC_INFO; if (logLevel<=_level) { //qDebug() << Q_FUNC_INFO << "Emitting..."; emit debugLog (_func, _msg, _level); } } void MainWindowMyDataTab::loadSettings() { //qDebug() << Q_FUNC_INFO << " - Start"; QSettings settings(util->getCfgFile (), QSettings::IniFormat); settings.beginGroup ("UserData"); myPower = settings.value("Power").toDouble (); myPowerSpinBox->setValue(myPower); //qDebug() << Q_FUNC_INFO << " - 10 " << QString::number(myPower); QString aux = settings.value("Operators").toString(); if (aux.contains(',')) { aux = ((aux.split (',')).at(0)).simplified (); } //qDebug() << Q_FUNC_INFO << " - 11"; if (util->isValidCall (aux)) { //qDebug() << Q_FUNC_INFO << " - 12"; operatorQRZ = aux.toUpper(); //qDebug() << Q_FUNC_INFO << " - 13"; operatorLineEdit->setText (operatorQRZ); //qDebug() << Q_FUNC_INFO << " - 14"; } settings.endGroup (); //qDebug() << Q_FUNC_INFO << " - END"; logEvent (Q_FUNC_INFO, "END", Debug); } klog-2.3.3/inputwidgets/mainwindowinputothers.h0000644000015700001710000001145314542412415021721 0ustar jenkinsjenkins#ifndef KLOG_INPUTWIDGETS_MAINWINDOWINPUTOTHERS_H #define KLOG_INPUTWIDGETS_MAINWINDOWINPUTOTHERS_H /*************************************************************************** mainwindowminputothers.h - description ------------------- begin : ago 2016 copyright : (C) 2016 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the mainwindow that supports the Others tab // #include #include #include "../dataproxy_sqlite.h" #include "../utilities.h" #include "../klogdefinitions.h" class MainWindowInputOthers : public QWidget { Q_OBJECT friend class tst_MainWindowInputOthers; public: MainWindowInputOthers(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~MainWindowInputOthers(); void setEntitiesList(const QStringList _qs); void setEntity(const int _n); int getEntity(); QString getEntityPrefix(); void setPropMode(const QString &_qs, bool _keep); QString getPropModeFromComboBox(); bool isSATPropagation(); bool setUserADIFTypeComboBox(const QString &_value); QString getUserADIFTypeComboBox(); bool setUserADIFValue(const QString &_adifValue); QString getUserADIFValue(); bool setSOTA(const QString &_op); QString getSOTA(); bool setAge(const double _op); double getAge(); bool setDistance(const double _op); double getDistance(); bool setVUCCGrids(const QString &_op); QString getVUCCGrids(); void setIOTA(const QString &_qs); QString getIOTA(); void setIOTAContinentFromEntity(const int _n); void setIOTAContinent(const QString &_qs); bool isIOTAModified(); void clearIOTA(); void setKeep(const bool _b); bool getKeep(); void createUI(); void clear(bool _full = false); //full= false leaves the "keep this data"; full = true clears everything void setLogLevel (const DebugLogLevel _l); signals: void setPropMode(const QString _p); void debugLog (QString _func, QString _msg, DebugLogLevel _level); private slots: //void slotSetPropMode(const QString &_p); // To receive the signal from the SAT widget and set "SAT" propagation mode, of needed. void slotPropModeComboBoxChanged(); void slotUSerDefinedADIFComboBoxChanged(); void slotSetCurrentUSerData(); private: QString checkIfValidIOTA(const QString &_tiota); //TODO: There is an equivalent function in the Awards class. I should use only one! void setColorsForUserDefinedADIFValueLineEdit(); bool checkVUCC_GRIDS(const QString &_string); bool setInitialADIFValues(); bool getDarkMode(); void logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level); Utilities *util; DataProxy_SQLite *dataProxy; QStringList entitiesList, propModeList; //QLabel *entityPrimLabel, *entitySecLabel, *iotaAwardLabel, *entityNameLabel, *propModeLabel; QComboBox *iotaContinentComboBox, *entityPrimDivComboBox, *entitySecDivComboBox, *entityNameComboBox, *propModeComboBox; QLineEdit *iotaNumberLineEdit; QCheckBox *keepPropCheckBox; QPalette palRed, palBlack, palWhite; bool autoUpdating; QComboBox *userDefinedADIFComboBox; QLineEdit *userDefinedADIFValueLineEdit; QStringList adifValidTypes; QString sota_ref, vucc_grids; double age, distance; DebugLogLevel logLevel; }; #endif // MAINWINDOWINPUTOTHERS_H klog-2.3.3/inputwidgets/mainwindowinputqsl.cpp0000644000015700001710000002573514542412415021557 0ustar jenkinsjenkins/*************************************************************************** mainwindowinputqsl.cpp - description ------------------- begin : jun 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the mainwindow that supports the QSL options // #include "mainwindowinputqsl.h" MainWindowInputQSL::MainWindowInputQSL(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "MainWindowInputQSL::MainWindowInputQSL" ; util = new Utilities(Q_FUNC_INFO); qslSentComboBox = new QComboBox; qslRecComboBox = new QComboBox; qslSentViaComboBox = new QComboBox; qslRecViaComboBox = new QComboBox; qslSentQDateEdit = new QDateEdit; qslRecQDateEdit = new QDateEdit; qslViaLineEdit = new QLineEdit; qslmsgTextEdit = new QTextEdit; dataProxy = dp; createUI(); setDefaultData(); clear(); //qDebug() << "MainWindowInputQSL::MainWindowInputQSL - END" ; } MainWindowInputQSL::~MainWindowInputQSL() { delete(util); } void MainWindowInputQSL::createUI() { // QSL Tab definition starts here qslSentQDateEdit->setDisplayFormat("dd/MM/yyyy"); qslRecQDateEdit->setDisplayFormat("dd/MM/yyyy"); QLabel *QSLSentLabelN = new QLabel(tr("QSL Sent")); QSLSentLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *QSLRecLabelN = new QLabel(tr("QSL Rec")); QSLRecLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *QSLViaLabelN = new QLabel(tr("QSL Via")); QSLViaLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); QLabel *QSLMsgLabelN = new QLabel(tr("QSL Msg")); QSLMsgLabelN->setAlignment(Qt::AlignVCenter| Qt::AlignRight); qslSentComboBox->setToolTip(tr("Status of the QSL sending.")); qslRecComboBox->setToolTip(tr("Status of the QSL reception.")); qslSentViaComboBox->setToolTip(tr("QSL sending information.")); qslRecViaComboBox->setToolTip(tr("QSL reception information.")); qslSentQDateEdit->setToolTip(tr("Date of the QSL sending.")); qslRecQDateEdit->setToolTip(tr("Date of the QSL reception.")); qslmsgTextEdit->setToolTip(tr("Message of the QSL.")); qslViaLineEdit->setToolTip(tr("QSL via information.")); QGridLayout *QSLLayout = new QGridLayout; QSLLayout->addWidget(QSLSentLabelN, 0, 0); QSLLayout->addWidget(QSLRecLabelN, 1, 0); QSLLayout->addWidget(QSLViaLabelN, 2, 0); QSLLayout->addWidget(QSLMsgLabelN, 3, 0); QSLLayout->addWidget(qslSentComboBox, 0, 1); QSLLayout->addWidget(qslRecComboBox, 1, 1); QSLLayout->addWidget(qslViaLineEdit, 2, 1, 1, -1); QSLLayout->addWidget(qslmsgTextEdit, 3, 1, 1, -1); QSLLayout->addWidget(qslSentQDateEdit, 0, 2); QSLLayout->addWidget(qslRecQDateEdit, 1, 2); QSLLayout->addWidget(qslSentViaComboBox, 0, 3); QSLLayout->addWidget(qslRecViaComboBox, 1, 3); //QSLLayout->setSizeConstraint(QLayout::SetFixedSize); setLayout(QSLLayout); connect(qslViaLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotQSLViaTextChanged() ) ) ; connect(qslRecComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotQSLRecvComboBoxChanged() ) ) ; connect(qslSentComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotQSLSentComboBoxChanged() ) ) ; connect(qslViaLineEdit, SIGNAL(returnPressed()), this, SLOT(slotQSLViaLineEditReturnPressed() ) ); } void MainWindowInputQSL::setDefaultData() { qslSentStatusList.clear(); qslRcvdStatusList.clear(); qslViaList.clear(); qslSentStatusList = dataProxy->getQSLSentList(); qslRcvdStatusList = dataProxy->getQSLRcvdList(); qslViaList = dataProxy->getQSLViaList(); qslSentComboBox->addItems(qslSentStatusList); qslRecComboBox->addItems(qslRcvdStatusList); qslRecViaComboBox->addItems(qslViaList); qslSentViaComboBox->addItems(qslViaList); qslSentQDateEdit->setDate(util->getDefaultDate()); qslRecQDateEdit->setDate(util->getDefaultDate()); } void MainWindowInputQSL::clear() { qslSentComboBox->setCurrentIndex(1); qslRecComboBox->setCurrentIndex(1); qslRecViaComboBox->setCurrentIndex(0); qslSentViaComboBox->setCurrentIndex(0); qslSentQDateEdit->setDate(util->getDefaultDate()); qslRecQDateEdit->setDate(util->getDefaultDate()); qslmsgTextEdit->clear(); qslViaLineEdit->clear(); } void MainWindowInputQSL::qslViaClear() { qslViaLineEdit->clear(); } QString MainWindowInputQSL::getQSLRecStatus() { QString _pm = QString(); _pm = (((qslRecComboBox->currentText()).split('-')).at(0)).simplified(); return _pm; } QString MainWindowInputQSL::getQSLSenStatus() { QString _pm = QString(); _pm = (((qslSentComboBox->currentText()).split('-')).at(0)).simplified(); return _pm; } QString MainWindowInputQSL::getSentVia() { QString _pm = QString(); _pm = (((qslSentViaComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << "MainWindow::getSentVia: " << _pm; return _pm; } QString MainWindowInputQSL::getRecVia() { QString _pm = QString(); _pm = (((qslRecViaComboBox->currentText()).split('-')).at(0)).simplified(); //qDebug() << "MainWindowInputQSL::getRecVia: " << _pm; return _pm; } QString MainWindowInputQSL::getQSLVia() { return qslViaLineEdit->text(); } QString MainWindowInputQSL::getQSLMsg() { return qslmsgTextEdit->toPlainText(); } void MainWindowInputQSL::setQSLRecStatus(const QString &_qs) { if(( qslRecComboBox->findText(_qs+" -", Qt::MatchStartsWith))>=0) { qslRecComboBox->setCurrentIndex( qslRecComboBox->findText(_qs+" -", Qt::MatchStartsWith)); } else { qslRecComboBox->setCurrentIndex(1); } } void MainWindowInputQSL::setQSLSenStatus(const QString &_qs) { if(( qslSentComboBox->findText(_qs+" -", Qt::MatchStartsWith))>=0) { qslSentComboBox->setCurrentIndex( qslSentComboBox->findText(_qs+" -", Qt::MatchStartsWith)); } else { qslSentComboBox->setCurrentIndex(1); } } void MainWindowInputQSL::setQSLRecVia(const QString &_qs) { if(( qslRecViaComboBox->findText(_qs+" -", Qt::MatchStartsWith))>=0) { qslRecViaComboBox->setCurrentIndex( qslRecViaComboBox->findText(_qs+" -", Qt::MatchStartsWith)); } else { qslRecViaComboBox->setCurrentIndex(0); // bureau by default } } void MainWindowInputQSL::setQSLSenVia(const QString &_qs) { //qDebug() << "MainWindowInputQSL::setQSLSenVia: " << _qs; if(( qslSentViaComboBox->findText(_qs+" -", Qt::MatchStartsWith))>=0) { qslSentViaComboBox->setCurrentIndex( qslSentViaComboBox->findText(_qs+" -", Qt::MatchStartsWith)); } else { qslSentViaComboBox->setCurrentIndex(0); // bureau by default } } void MainWindowInputQSL::setQSLVia(const QString &_qs, QColor qColor) { palette.setColor(QPalette::Text, qColor); qslViaLineEdit->setPalette(palette); if (_qs.length()>0) { qslViaLineEdit->setText(_qs); } else { qslViaLineEdit->clear(); } } void MainWindowInputQSL::setQSLMsg(const QString &_qs) { if (_qs.length()>0) { qslmsgTextEdit->setText(_qs); } else { qslmsgTextEdit->clear(); } } QDate MainWindowInputQSL::getQSLRecDate() { return qslRecQDateEdit->date(); } QDate MainWindowInputQSL::getQSLSenDate() { return qslSentQDateEdit->date(); } void MainWindowInputQSL::setQSLRecDate(const QDate _qs) { if (_qs.isValid()) { qslRecQDateEdit->setDate(_qs); } else { qslRecQDateEdit->clear(); } } void MainWindowInputQSL::setQSLSenDate(const QDate _qs) { if (_qs.isValid()) { qslSentQDateEdit->setDate(_qs); } else { qslSentQDateEdit->clear(); } } void MainWindowInputQSL::slotQSLViaTextChanged() { //qDebug() << "MainWindow::slotQSLViaTextChanged: " << qslViaLineEdit->text() << " / Length: " << QString::number((qslViaLineEdit->text()).size()); qslViaLineEdit->setText((util->getClearSQLi(qslViaLineEdit->text())).toUpper()); } void MainWindowInputQSL::slotQSLSentComboBoxChanged() { int i = qslSentComboBox->currentIndex(); //{Y, N, R, I, V} //(QSLSDATE is only valid if QSL_SENT is Y-0, Q-3, or I-4) // Y-Yes = 0 // N-No = 1 // R-Requested = 2 // Q-Queued = 3 // I-Ignore = 4 switch (i) { case 0: qslSentQDateEdit->setEnabled(true); qslSentQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 2: break; case 3: qslSentQDateEdit->setEnabled(true); break; case 4: qslSentQDateEdit->setEnabled(true); break; default: //NO qslSentQDateEdit->setEnabled(false); break; } } void MainWindowInputQSL::slotQSLRecvComboBoxChanged() { int i = qslRecComboBox->currentIndex(); //{Y, N, R, I, V} //(QSLSDATE is only valid if QSL_SENT is Y-0, Q-3, or I-4) // Y-Yes = 0 // N-No = 1 // R-Requested = 2 // Q-Queued = 3 // I-Ignore = 4 switch (i) { case 0: qslRecQDateEdit->setEnabled(true); qslRecQDateEdit->setDate((QDateTime::currentDateTime()).date()); break; case 2: break; case 3: qslRecQDateEdit->setEnabled(true); break; case 4: qslRecQDateEdit->setEnabled(true); break; default: //NO qslRecQDateEdit->setEnabled(false); break; } } void MainWindowInputQSL::slotQSLViaLineEditReturnPressed() { emit returnPressed(); } klog-2.3.3/inputwidgets/mainwindowinputqsl.h0000644000015700001710000000714614542412415021220 0ustar jenkinsjenkins#ifndef KLOG_INPUTWIDGETS_MAINWINDOWINPUTQSL_H #define KLOG_INPUTWIDGETS_MAINWINDOWINPUTQSL_H /*************************************************************************** mainwindowinputqsl.h - description ------------------- begin : jun 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the mainwindow that supports the QSL options // #include #include #include #include "../dataproxy_sqlite.h" #include "../utilities.h" class MainWindowInputQSL : public QWidget { Q_OBJECT public: explicit MainWindowInputQSL(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~MainWindowInputQSL(); QString getQSLRecStatus(); QString getQSLSenStatus(); QString getSentVia(); QString getRecVia(); QString getQSLVia(); QString getQSLMsg(); void setQSLRecStatus(const QString &_qs); void setQSLSenStatus(const QString &_qs); void setQSLRecVia(const QString &_qs); void setQSLSenVia(const QString &_qs); void setQSLVia(const QString &_qs, QColor qColor=Qt::black); void setQSLMsg(const QString &_qs); QDate getQSLRecDate(); QDate getQSLSenDate(); void setQSLRecDate(const QDate _qs); void setQSLSenDate(const QDate _qs); void clear(); void qslViaClear(); signals: void returnPressed(); private slots: void slotQSLViaTextChanged(); void slotQSLSentComboBoxChanged(); void slotQSLRecvComboBoxChanged(); void slotQSLViaLineEditReturnPressed(); /* void sloteQSLRecvComboBoxChanged(); void sloteQSLSentComboBoxChanged(); void slotLotwRecvComboBoxChanged(); void slotLotwSentComboBoxChanged(); */ private: void createUI(); void setDefaultData(); QComboBox *qslSentComboBox, *qslRecComboBox, *qslSentViaComboBox, *qslRecViaComboBox; QDateEdit *qslSentQDateEdit, *qslRecQDateEdit; QTextEdit *qslmsgTextEdit; QLineEdit *qslViaLineEdit; DataProxy_SQLite *dataProxy; Utilities *util; QStringList qslSentStatusList, qslRcvdStatusList, qslViaList; QPalette palette; // To color some widgets }; #endif // MAINWINDOWINPUTQSL_H klog-2.3.3/inputwidgets/mainwindowinputcomment.h0000644000015700001710000000475514542412415022066 0ustar jenkinsjenkins#ifndef KLOG_INPUTWIDGETS_MAINWINDOWINPUTCOMMENT_H #define KLOG_INPUTWIDGETS_MAINWINDOWINPUTCOMMENT_H /*************************************************************************** mainwindowminputcomment.h - description ------------------- begin : ago 2016 copyright : (C) 2016 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ // // This class implement the tab of the mainwindow that supports the Comment // #include #include class MainWindowInputComment : public QWidget { Q_OBJECT public: explicit MainWindowInputComment(QWidget *parent = nullptr); ~MainWindowInputComment(); void createUI(); void setData(const QString &_comment); QString getComment(); void clear(bool _full = false); //full= false leaves the "keep this data"; full = true clears everything void setKeep(const bool _b); bool getKeep(); private: QString comment; QLineEdit *commentLineEdit; QCheckBox *keepThisDataForNextQSOQCheckbox; }; #endif // MAINWINDOWINPUTCOMMENT_H klog-2.3.3/inputwidgets/mainwindowinputcomment.cpp0000644000015700001710000000754314542412415022417 0ustar jenkinsjenkins/*************************************************************************** mainwindowinputcomment.cpp - description ------------------- begin : Ago 2016 copyright : (C) 2016 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "mainwindowinputcomment.h" MainWindowInputComment::MainWindowInputComment(QWidget *parent) : QWidget(parent) { //qDebug() << "MainWindowInputComment::MainWindowInputComment" ; commentLineEdit = new QLineEdit(); keepThisDataForNextQSOQCheckbox = new QCheckBox; comment.clear(); createUI(); //qDebug() << "MainWindowInputComment::MainWindowInputComment - END" ; } MainWindowInputComment::~MainWindowInputComment(){} void MainWindowInputComment::createUI() { QLabel *commentLabel = new QLabel(tr("Comment")); commentLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); commentLineEdit->setToolTip(tr("Add a comment for this QSO.")); QLabel *keepLabel = new QLabel(); keepLabel->setText(tr("Keep this data")); keepLabel->setAlignment(Qt::AlignVCenter| Qt::AlignRight); keepLabel->setToolTip(tr("Data entered in this tab will be copied into the next QSO.")); keepThisDataForNextQSOQCheckbox->setToolTip(tr("Data entered in this tab will be copied into the next QSO.")); QGridLayout *tabLayout = new QGridLayout; //QVBoxLayout *tabLayout = new QVBoxLayout; //tabLayout->addWidget(commentLineEdit); tabLayout->addWidget(commentLabel, 0, 0); tabLayout->addWidget(commentLineEdit, 0, 1); tabLayout->addWidget(keepLabel, 2, 1); tabLayout->addWidget(keepThisDataForNextQSOQCheckbox, 2, 2); //tabLayout->setSizeConstraint(QLayout::SetFixedSize); setLayout(tabLayout); } void MainWindowInputComment::setData(const QString &_comment) { comment = _comment; commentLineEdit->setText(comment); } QString MainWindowInputComment::getComment() { return commentLineEdit->text(); } void MainWindowInputComment::clear(bool _full) { if ((!keepThisDataForNextQSOQCheckbox->isChecked()) || _full) { comment.clear(); commentLineEdit->clear(); } if (_full) { keepThisDataForNextQSOQCheckbox->setChecked (false); } } void MainWindowInputComment::setKeep(const bool _b) { keepThisDataForNextQSOQCheckbox->setChecked (_b); } bool MainWindowInputComment::getKeep() { return keepThisDataForNextQSOQCheckbox->isChecked (); } klog-2.3.3/dxcluster.h0000644000015700001710000001240214542412415014522 0ustar jenkinsjenkins#ifndef KLOG_DXCLUSTER_H #define KLOG_DXCLUSTER_H /*************************************************************************** dxcluster.h - description ------------------- begin : oct 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include //#include #include #include #include #include "awards.h" #include "world.h" #include "utilities.h" #include "dataproxy_sqlite.h" class QWidget; class QTcpSocket; class DXClusterWidget : public QWidget { Q_OBJECT public: DXClusterWidget(DataProxy_SQLite *dp, QWidget *parent ); //DXClusterWidget(DataProxy_SQLite *dp, const QString &clusterToConnect, const int portToConnect, QWidget *parent ); void init(); ~DXClusterWidget(); void setColors (const QString &_newOne, const QString &_needed, const QString &_worked, const QString &_confirmed, const QString &_default); void setDXClusterSpotConfig(bool _showhf, bool _showvhf, bool _showwarc, bool _showworked, bool _showconfirmed, bool _showann, bool _showwwv, bool _showwcy ); //void setDXClusterServer(const QString &clusterToConnect, const int portToConnect); void setCurrentLog(const int _log); bool isConnected(); void setMyQRZ(const QString &_qrz); void setDXMarathon (const bool _enable); void setSaveSpots (const bool _enable); void loadSettings(); void setDXClusterServer(const QString &clusterToConnect, const int portToConnect); void rightButtonFromLogMenu(const QStringList _ql); //void sendSpotToCluster(const QString &_dx, const QString &_freq); private slots: void slotClusterDisplayError(QAbstractSocket::SocketError socketError); void slotClusterDataArrived(); void slotClusterSocketConnected(); void slotClusterSocketConnectionClosed(); void slotClusterSendToServer(); void slotClusterClearLineInput(); void slotClusterInputTextChanged(); void slotClusterDXClusterWidgetItemDoubleClicked( QListWidgetItem * item ); void slotClusterDXClusterWidgetItemEntered( QListWidgetItem * item); void slotClusterDXClusterWidgetItemSelected(); void slotRighButton (const QPoint& pos); void slotCheckQRZCom(); signals: void dxspotclicked(const QStringList &_qs); // DXSpotCall, DX-Freq, doubleClicked void dxspotArrived(const QString &_call, const QString &_text, const double _freq); //void dxspot(const QString &_spot); // The text string to be saved private: //void TESTADDSPOT(); // Just a test spot void createActions(); void connectToDXCluster(); QStringList readItem(QListWidgetItem * item); bool checkIfNeedsToBePrinted(const QString &_DXEntity, const int _band, const int _mode); void saveSpot (const QString &_spot); bool openFile(); void addData(); //TO BE DELETED, JUST FOR TESTING PURPOSES QTcpSocket *tcpSocket; QListWidget *dxClusterListWidget; QLineEdit *inputCommand; QPushButton *sendButton; QPushButton *clearButton; bool dxClusterConnected; bool dxClusterAlreadyConnected; QString server; quint16 port; //quint16 blockSize; QColor dxSpotColor; World *world; Awards *awards; DataProxy_SQLite *dataProxy; Utilities *util; bool showhf, showvhf, showwarc, showworked, showconfirmed, showann, showwwv, showwcy; //bool dxClusterShowHF, dxClusterShowVHF, dxClusterShowWARC, dxClusterShowWorked, dxClusterShowConfirmed, dxClusterShowAnn, dxClusterShowWWV, dxClusterShowWCY; bool showDxMarathon; QString myQrz; int currentLog; QFile *saveSpotsFile; bool saveSpots; // write/save the spots to a file QAction *checkQRZCOMFromLogAct; }; class dxClusterSpotItem : public QListWidgetItem { public: dxClusterSpotItem( QListWidget* parent, const QString& spot, const QColor& color ); ~dxClusterSpotItem(); protected: QColor spotColor; }; #endif // DXCLUSTER_H klog-2.3.3/qml/0000755000015700001710000000000014542412415013126 5ustar jenkinsjenkinsklog-2.3.3/qml/mapqmlfile.qml0000644000015700001710000001711114542412415015771 0ustar jenkinsjenkins/*************************************************************************** mapqmlfile.qml - description ------------------- begin : May 2021 copyright : (C) 2021 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ import QtQuick 2.12 import QtQuick.Window 2.12 import QtLocation 5.6 import QtPositioning 5.6 import QtQuick.Controls 2.15 Rectangle { width: 640 height: 480 visible: true property alias zoom: map.zoomLevel property alias lat: map.center.latitude property alias lon: map.center.longitude property double oldZoom //property alias mapLocale: map.plugin.locales Location { // Define location that will be "center" of map id: mapCenter } //function addMarker(latitude: double, longitude: double, locatorText: String) function addMarker(latitude: double, longitude: double) { var Component = Qt.createComponent("qrc:qml/marker.qml") //var item = Component.createObject(Rectangle, { // coordinate: QtPositioning.coordinate(latitude, longitude), text: locatorText // }) var item = Component.createObject(Rectangle, { coordinate: QtPositioning.coordinate(latitude, longitude) }) //if (zoom>5) //{ // console.log("Zoom>5: ", zoom); //} map.addMapItem(item) } FocusScope { anchors.fill: parent } Plugin { id: mapPlugin name: "osm" // Names in local language //name: "esri" // Names not in local language but english //name: "googleMap" //name: "mapboxgl" } Map { id: map anchors.fill: parent plugin: mapPlugin center: mapCenter.coordinate Plugin { //locales: "en_US" } //Component.onCompleted:addMarker(40.18, -3.649, "OOO") //onCenterChanged: //{ // console.log("Map Center X: ", lat, " - Map Center Y: ", lon); //} zoomLevel: 14 MouseArea { hoverEnabled: true anchors.fill: parent //acceptedButtons: Qt.LeftButton //onClicked: //{ // console.log("left button clicked!") //} //onPositionChanged: //{ // Qt.point(mouseX, mouseY) // var coordinate = map.toCoordinate(Qt.point(mouse.x,mouse.y)) // console.log("Mouse Position (", mouseX, ", ", mouseY, ")"); // console.log("Mouse GeoPosition (", coordinate.latitude, ", ", coordinate.longitude, ")"); //} } MouseArea { hoverEnabled: true anchors.fill: parent //acceptedButtons: Qt.RightButton //onClicked: //{ // console.log("right button clicked!") // contextMenu.popup() //} //Menu { // id: contextMenu // MenuItem {text: "Show QSOs"} //} } Rectangle { id: buttonout width: 30 height: 30 border.color: "red" radius: 5 // Let's round the rectangle's corner a bit, so it resembles more a button //anchors.centerIn: parent anchors.right: parent.right; anchors.bottom: parent.bottom Text { id: buttonText text: "-" color: "black" anchors.centerIn: parent } MouseArea { // We make the MouseArea as big as its parent, i.e. the rectangle. So pressing anywhere on the button will trigger the event anchors.fill: parent // Exploit the built-in "clicked" signal of the MouseArea component to do something when the MouseArea is clicked. // Note that the code associated to the signal is plain JavaScript. We can reference any QML objects by using their IDs onClicked: { oldZoom = zoom zoom = oldZoom - 1 } } } Rectangle { id: buttonin width: 30 height: 30 border.color: "red" radius: 5 // Let's round the rectangle's corner a bit, so it resembles more a button anchors.bottom: buttonout.top; anchors.right: buttonout.right //anchors.right: parent.right; anchors.bottom: parent.bottom Text { id: buttonTextout text: "+" color: "black" anchors.centerIn: parent } MouseArea { // We make the MouseArea as big as its parent, i.e. the rectangle. So pressing anywhere on the button will trigger the event anchors.fill: parent // Exploit the built-in "clicked" signal of the MouseArea component to do something when the MouseArea is clicked. // Note that the code associated to the signal is plain JavaScript. We can reference any QML objects by using their IDs onClicked: { oldZoom = zoom zoom = oldZoom + 1 //buttonText.text = qsTr("Clicked"); //buttonText.color = "black"; } } } MapItemView { model: rectangle_model delegate: MapRectangle { border.width: 2 topLeft : model.north bottomRight : model.south color : model.color //opacity : 0.5 } } MapItemView { model: circle_model delegate: MapCircle{ center: model.coordinate radius: 5000.0 color: 'green' border.width: 10 } } } } klog-2.3.3/qml/marker.qml0000644000015700001710000000503014542412415015120 0ustar jenkinsjenkins/*************************************************************************** mapqmlfile.qml - description ------------------- begin : May 2021 copyright : (C) 2021 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ import QtQuick 2.0 import QtLocation 5.12 MapQuickItem{ id: marker anchorPoint.x: marker.width / 4 anchorPoint.y: marker.height property alias text: locatorText.text //sourceItem: Image{ // id: icon // source: "../img/marker.png" // sourceSize.width: 40 // sourceSize.height: 40 //} sourceItem: Rectangle{ id: rectaMap Image{ id: icon //source: "../img/marker.png" source: "qrc:/img/marker.png" sourceSize.width: 40 sourceSize.height: 40 } Text{ id: locatorText //text: 'IN80' //width: rectaMap.width color: focus?"red":"black" anchors.top: icon.bottom anchors.horizontalCenter: icon.horizontalCenter horizontalAlignment: icon.AlignHCenter } } } klog-2.3.3/INSTALL-win.txt0000644000015700001710000000014714542412415015001 0ustar jenkinsjenkinsInstalling KLog on a Windows system is easy. Just double-click on the installer and follow the steps. klog-2.3.3/klogdefinitions.h0000644000015700001710000000547314542412415015707 0ustar jenkinsjenkins#ifndef KLOG_KLOGDEFINITIONS_H #define KLOG_KLOGDEFINITIONS_H /*************************************************************************** klogdefinitions.h - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles user : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include using namespace std; enum ExportMode {ModeLotW, ModeADIF, ModeClubLog, ModeEQSL, ModeQRZ}; enum OnLineProvider {ClubLog, LoTW, eQSL, QRZ}; //, HamQTH, HRDLog enum OnlineErrorCode {Ok, Fail}; enum OnlineErrorReason {Other, Auth, DupeQSO, WrongLogBook}; enum DebugLogLevel {None, Info, Debug, Devel}; enum ValidFieldsForStats {DXCC, GridSquare}; enum FilesToDownload {CTY, Sats}; struct EntityData { // Used to pass a list of data from World to dxccstatuswidget int dxcc; QString mainprefix; QString name; QString isoname; }; struct EntityBandStatus { // Used to pass a list of data from Awards to dxccstatuswidget int dxcc; int bandid; bool confirmed; }; struct Coordinate { double lat; double lon; }; #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 2)) #define QT_SKIP Qt::SkipEmptyParts #define QT_ENDL Qt::endl #define QT_RETURNBYVALUE Qt::ReturnByValue #else #define QT_SKIP QString::SkipEmptyParts #define QT_ENDL endl #define QT_RETURNBYVALUE #endif //#if QT_VERSION>=0x041502 //#else //#endif #endif // KLOGDEFINITIONS_H klog-2.3.3/searchwidget.cpp0000644000015700001710000006471314542412415015525 0ustar jenkinsjenkins/*************************************************************************** searchwidget.cpp - description ------------------- begin : jul 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "searchwidget.h" SearchWidget::SearchWidget(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent) { //qDebug() << "SearchWidget::SearchWidget" ; searchBoxLineEdit = new QLineEdit; dataProxy = dp; delayInputTimer = new QTimer; searchWindow = new SearchWindow(dataProxy, this); awards = new Awards(dataProxy, Q_FUNC_INFO); util = new Utilities(Q_FUNC_INFO); util->setLongPrefixes(dataProxy->getLongPrefixes()); util->setSpecialCalls(dataProxy->getSpecialCallsigns()); filemanager = new FileManager(dataProxy); filemanager->init(); world = new World(dataProxy, Q_FUNC_INFO); mainStationCallsign = QString(); currentLog = -1; //qDebug() << "SearchWidget::SearchWidget: 00092"; stationCallsignComboBox = new QComboBox; searchBoxClearButton = new QPushButton(tr("&Clear"), this); searchBoxExportButton = new QPushButton(tr("&Export Highlighted"), this); searchBoxSelectAllButton = new QPushButton(tr("&Select All"), this); searchBoxReSearchButton = new QPushButton(tr("&Search"), this); searchAllQCheckbox = new QCheckBox (tr("All logs"), this); stationCallSignShownInSearch = true; clear(); createUI(); //qDebug() << "SearchWidget::SearchWidget - END" ; } SearchWidget::~SearchWidget() { delete(dataProxy); delete(searchWindow); delete(awards); delete(util); delete(filemanager); delete(world); } void SearchWidget::clear() { searchBoxLineEdit->clear(); searchWindow->clear(); //qslingNeeded = false; setNeedingQSL(false); searchSelectAllClicked = false; lastSearch = QString(); callFilter = QString(); stationCallsignFilter = QString(); currentLogFilter = QString(); setModelFilter(); } void SearchWidget::setCallToSearch (const QString &_st) { //qDebug() << Q_FUNC_INFO << " : " << _st; searchBoxLineEdit->setText(_st); } void SearchWidget::setShowCallInSearch(const bool _sh) { stationCallSignShownInSearch = _sh; searchWindow->setStationCallsignInHeader(stationCallSignShownInSearch); } void SearchWidget::setVersion (const QString &_version) { filemanager->setVersion(_version); } void SearchWidget::showQSOs(QList qsoIdList) { //qDebug() << "SearchWidget::showQSOs received QSOs: " << QString::number(qsoIdList.length()); if (qsoIdList.length()<0) { return; } //QString _call, _dateTime, _band, _mode, _freq, _qsltx, _qslrx, _id, _stationcallsign, _dxcc; //qDebug() << "SearchWidget::showQSOs query: : 01" ; int i = 0; QString filter; filter = QString(); while ( (qsoIdList.at(i)<= 0) && (isetFilterString(filter); } void SearchWidget::setStationCallsign(const QString &_st) { if (util->isValidCall(_st)) { mainStationCallsign = _st; selectStationCallSign(); } } void SearchWidget::selectStationCallSign() { int index = stationCallsignComboBox->findText(mainStationCallsign); if (index>=0) { stationCallsignComboBox->setCurrentIndex(index); } } void SearchWidget::createUI() { searchBoxClearButton->setToolTip(tr("Clear the searches.")); searchBoxExportButton->setToolTip(tr("Export the search result to an ADIF file.")); searchBoxSelectAllButton->setToolTip(tr("Select/Unselect all the QSOs shown.")); searchBoxReSearchButton->setToolTip(tr("Search in the log.")); searchAllQCheckbox->setToolTip(tr("Search in all logs.")); searchBoxLineEdit->setToolTip(tr("Enter the callsign to search for. Enter '*' to show all the QSOs... it may be slow in big logs!")); stationCallsignComboBox->setToolTip(tr("Select the Station Callsign used to do this QSO.")); fillStationCallsignComboBox(); setShowCallInSearch(stationCallSignShownInSearch); //searchResultsTreeWidget->setHeaderLabels(labels); //(searchResultsTreeWidget->header())->resizeSections(QHeaderView::ResizeToContents); //searchResultsTreeWidget->clear(); //searchResultsTreeWidget->setSortingEnabled(true); searchWindow->createlogPanel(currentLog); //searchWindow->refresh(); QHBoxLayout *dxUpRightSearchTopLayout = new QHBoxLayout; dxUpRightSearchTopLayout->addWidget(searchBoxLineEdit); dxUpRightSearchTopLayout->addWidget(stationCallsignComboBox); dxUpRightSearchTopLayout->addWidget(searchAllQCheckbox); QHBoxLayout *dxUpRightButtonsLayout = new QHBoxLayout; dxUpRightButtonsLayout->addWidget(searchBoxReSearchButton); dxUpRightButtonsLayout->addWidget(searchBoxClearButton); dxUpRightButtonsLayout->addWidget(searchBoxSelectAllButton); dxUpRightButtonsLayout->addWidget(searchBoxExportButton); QVBoxLayout *dxUpRightSearchTabLayout = new QVBoxLayout; dxUpRightSearchTabLayout->addLayout(dxUpRightSearchTopLayout); dxUpRightSearchTabLayout->addLayout(dxUpRightButtonsLayout); //dxUpRightSearchTabLayout->addWidget(searchResultsTreeWidget); dxUpRightSearchTabLayout->addWidget(searchWindow); setLayout(dxUpRightSearchTabLayout); //connect(dataProxy, SIGNAL(qsoFound(QStringList)), this, SLOT(slotQsoFound(QStringList)) ); connect(searchBoxLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotStartDelayInputTimer() ) ); connect(delayInputTimer, SIGNAL(timeout()), this, SLOT(slotDelayInputTimedOut()) ); //connect(searchBoxLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotSearchBoxTextChanged() ) ); connect(searchBoxExportButton, SIGNAL(clicked()), this, SLOT(slotSearchExportButtonClicked() ) ); connect(searchBoxClearButton, SIGNAL(clicked()), this, SLOT(slotSearchClearButtonClicked() ) ); connect(searchBoxReSearchButton, SIGNAL(clicked()), this, SLOT(slotSearchBoxReSearchButtonClicked() ) ); connect(searchBoxSelectAllButton, SIGNAL(clicked()), this, SLOT(slotSearchBoxSelectAllButtonClicked() ) ); //connect(searchResultsTreeWidget, SIGNAL(itemSelectionChanged( ) ), this, SLOT(slotSearchBoxSelectionChanged( ) ) ); //connect(searchResultsTreeWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, SLOT(slotDoubleClickSearch(QTreeWidgetItem *, int))); //connect(searchResultsTreeWidget, SIGNAL(customContextMenuRequested( const QPoint& ) ), this, SLOT(slotRightButtonSearch( const QPoint& ) ) ); connect(stationCallsignComboBox, SIGNAL(currentIndexChanged (int)), this, SLOT(slotStationCallsignChanged() ) ) ; connect(searchAllQCheckbox, SIGNAL(toggled(bool)), this, SLOT(slotQCheckboxToggled() ) ) ; connect(searchWindow, SIGNAL( actionQSODoubleClicked(int)), this, SLOT(slotQSOToEditFromSearch(int))); connect(searchWindow, SIGNAL( actionDeleteQSO(int)), this, SLOT( slotQsoDeleteFromSearch(int) )); connect(searchWindow, SIGNAL( updateSearchLineEdit()), this, SLOT( slotSearchBoxTextChanged() )); connect(searchWindow, SIGNAL( requestFocus()), this, SLOT( slotRequestFocus() )); } void SearchWidget::slotRequestFocus() { emit requestBeingShown(); } /* void SearchWidget::slotRightButtonSearch(const QPoint& pos) { //qDebug() << "SearchWidget::slotRightButtonSearch" ; searchBoxLineEdit->setFocus(); } */ void SearchWidget::slotQsoDeleteFromSearch(const int _qsoId) { //qDebug() << "SearchWidget::slotQsoDeleteFromSearch: " << QString::number(_qsoId); int QSOid = _qsoId; //int x = -1; QString _qrz = dataProxy->getCallFromId(QSOid); if (_qrz.length()>=3) { QString message = QString(tr("You have requested to delete the QSO with: %1").arg(_qrz)); QMessageBox msgBox; msgBox.setIcon(QMessageBox::Question); msgBox.setText(message); msgBox.setInformativeText(tr("Are you sure?")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: if(dataProxy->deleteQSO(QSOid)) { emit actionQSODelete(QSOid); emit logRefresh(); if(qslingNeeded) { searchWindow->slotToolSearchQSL(0); } else { slotSearchBoxTextChanged(); } //dxccStatusWidget->refresh(); //awards->recalculateAwards(); emit updateAwards(); } else { //TODO: The QSO could not be removed... } break; case QMessageBox::No: // No was clicked break; default: // should never be reached break; } } else { // TODO: The QSO to be removed was not found in the log } } void SearchWidget::slotQSLRecViaBureauFromSearch() { //qDebug() << "SearchWidget::slotQSLRecViaBureauFromLog: "; int _qsoId = (qslRecViaBureauFromSearchAct->data()).toInt(); //logWindow->qslRecViaBureau(_qsoId); dataProxy->qslRecViaBureau(_qsoId, QDate::currentDate()); if(qslingNeeded) { searchWindow->slotToolSearchQSL(0); } else { slotSearchBoxTextChanged(); } } void SearchWidget::slotQSLRecViaDirectFromSearch() { //qDebug() << "SearchWidget::slotQSLRecViaDirectFromLog: "; int _qsoId = (qslRecViaDirectFromSearchAct->data()).toInt(); //logWindow->qslRecViaDirect(_qsoId); dataProxy->qslRecViaDirect(_qsoId, QDate::currentDate()); if(qslingNeeded) { searchWindow->slotToolSearchQSL(0); } else { slotSearchBoxTextChanged(); } // Mark Sent, Bureau, date, update log. } void SearchWidget::slotStartDelayInputTimer() { //qDebug() << "SearchWidget::slotStartDelayInputTimer" ; int cursorP = searchBoxLineEdit->cursorPosition(); searchBoxLineEdit->setText((util->getClearSQLi(searchBoxLineEdit->text())).toUpper()); searchBoxLineEdit->setCursorPosition(cursorP); delayInputTimer->start(800); //TODO: Define the delay in the Settings } void SearchWidget::slotDelayInputTimedOut() { //qDebug() << "SearchWidget::slotDelayInputTimedOut" ; delayInputTimer->stop(); QString _text = searchBoxLineEdit->text(); if( _text != lastSearch) { //DO WHATEVER lastSearch = _text; slotSearchBoxTextChanged(); } } void SearchWidget::fillStationCallsignComboBox() { stationCallsignComboBox->clear(); stationCallsignComboBox->addItem(tr("All in log")); stationCallsignComboBox->addItem(tr("Not defined")); if (searchAllQCheckbox->isChecked()) { stationCallsignComboBox->addItems(dataProxy->getStationCallSignsFromLog(-1)); } else { stationCallsignComboBox->addItems(dataProxy->getStationCallSignsFromLog(currentLog)); } } void SearchWidget::slotQCheckboxToggled() { //qDebug() << "SearchWidget::slotQCheckboxToggled" ; fillStationCallsignComboBox(); slotSearchBoxTextChanged(); } void SearchWidget::slotStationCallsignChanged() { //qDebug() << "SearchWidget::slotStationCallsignChanged: " << stationCallsignComboBox->currentText(); slotSearchBoxTextChanged(); } /* void SearchWidget::qslRecViaDirectMarkReq(const int _qsoId) { //qDebug() << "SearchWidget::qslRecViaDirect: " << QString::number(_qsoId); dataProxy->qslRecViaDirect(_qsoId, QDate::currentDate(), true); } */ /* void SearchWidget::qslRecViaBureauMarkReq(const int _qsoId) { //qDebug() << "SearchWidget::qslRecViaBureau: " << QString::number(_qsoId) << "/" << QDate::currentDate(); dataProxy->qslRecViaBureau(_qsoId, QDate::currentDate(), true); //qDebug() << "SearchWidget::qslRecViaBureau: END"; } */ void SearchWidget::slotQSOToEditFromSearch(const int _qsoId) { //qDebug() << "slotQSOToEditFromSearch: " << (qsoToEditFromSearchAct->data()).toString(); emit actionQSODoubleClicked(_qsoId); } /* void SearchWidget::slotQSLRecViaDirectMarkReqFromSearch() { //qDebug() << "SearchWidget::slotQSLRecViaDirectFromLog: "; int _qsoId = (qslRecViaDirectMarkReqFromSearchAct->data()).toInt(); qslRecViaDirectMarkReq(_qsoId); if(qslingNeeded) { searchWindow->slotToolSearchQSL(0); } else { slotSearchBoxTextChanged(); } // Mark Sent, Bureau, date, update log. } */ void SearchWidget::slotQSLSentViaDirectMarkDXReqFromSearch() { //qDebug() << "slotQSLSentViaDirectMarkDXReqFromSearch: "; int _qsoId = (qslSentViaDirectMarkRcvReqFromSearchAct->data()).toInt(); dataProxy->qslSentViaDirect(_qsoId, QDate::currentDate()); dataProxy->qslRecAsRequested(_qsoId, QDate::currentDate()); if(qslingNeeded) { searchWindow->slotToolSearchQSL(0); } else { slotSearchBoxTextChanged(); } // Mark Sent, Bureau, date, update log. } /* * void SearchWidget::slotQSLSentViaBureauFromSearch() { // //qDebug() << "SearchWidget::slotQSLSentViaBureauFromSearch: " << (qslSentViaBureauFromSearchAct->data()).toString() << " - Id = " << QString::number( ((logModel->index( ( (qslSentViaBureauFromSearchAct->data()).toInt() ) , 0)).data(0).toInt()) ); int _qsoId = (qslSentViaBureauFromSearchAct->data()).toInt(); dataProxy->qslSentViaBureau(_qsoId, QDate::currentDate()); //logWindow->qslSentViaBureau(_qsoId); //qslSentViaBureau(_qsoId); if(qslingNeeded) { searchWindow->slotToolSearchQSL(0); } else { slotSearchBoxTextChanged(); } } */ void SearchWidget::slotQSLSentViaDirectFromSearch() { //qDebug() << "SearchWidget::slotQSLSentViaDirectFromSearch: "; int _qsoId = ((qslSentViaDirectFromSearchAct->data()).toInt()); dataProxy->qslSentViaDirect(_qsoId, QDate::currentDate()); if(qslingNeeded) { searchWindow->slotToolSearchQSL(0); } else { slotSearchBoxTextChanged(); } //qslSentViaDirect(_qsoId); } /* void SearchWidget::slotQSLSentViaBureuMarkDXReqFromSearch() { //qDebug() << "slotQSLSentViaBureuMarkDXReqFromSearch"; int _qsoId = (qslSentViaBureauMarkRcvReqFromSearchAct->data()).toInt(); dataProxy->qslSentViaBureau(_qsoId, QDate::currentDate()); dataProxy->qslRecAsRequested(_qsoId, QDate::currentDate()); if(qslingNeeded) { searchWindow->slotToolSearchQSL(0); } else { slotSearchBoxTextChanged(); } // Mark Sent, Bureau, date, update log. } */ /* void SearchWidget::slotQSLRecViaBureauMarkReqFromSearch() { //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog - Start"; int _qsoId = (qslRecViaBureauMarkReqFromSearchAct->data()).toInt(); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 01"; qslRecViaBureauMarkReq(_qsoId); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 02: n: " << QString::number(_qsoId); if(qslingNeeded) { //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 03"; searchWindow->slotToolSearchQSL(0); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 04"; } else { //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 05"; slotSearchBoxTextChanged(); //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 06"; } //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 07"; } */ /* void SearchWidget::searchModel() { //qDebug() << "SearchWidget::slotToolSearchQSLToSend - TO PREPARE THE QUERY and optimize the function"; slotToolSearchQSL(0); //qDebug() << "SearchWidget::slotToolSearchQSLToSend - END"; } */ /* void SearchWidget::slotQSLSentMarkAsRequested() { // bool qslSentAsRequested(const int _qsoId, const QString &_updateDate); int _qsoId = (qslSentRequestedAct->data()).toInt(); dataProxy->qslSentAsRequested(_qsoId, QDate::currentDate()); if(qslingNeeded) { searchWindow->slotToolSearchQSL(0); } else { slotSearchBoxTextChanged(); } } */ /* void SearchWidget::slotDoubleClickSearch(QTreeWidgetItem * item, int) { //qDebug() << "SearchWidget::slotDoubleClickSearch" ; int number = -1; if (item){ if (stationCallSignShownInSearch) { number = (item->text(7)).toInt(); } else { number = (item->text(6)).toInt(); } actionQSODoubleClicked(number); } else {} } */ void SearchWidget::setNeedingQSL(bool const _q) { qslingNeeded = _q; searchWindow->setNeedingQSL(qslingNeeded); } void SearchWidget::slotSearchBoxTextChanged() { //qDebug() << "SearchWidget::slotSearchBoxTextChanged: " << searchBoxLineEdit->text(); //QString _id, _call, _dateTime, _band, _bandid, _mode, _qsltx, _qslrx, _stationcallsign, _dxcc; //QStringList q; //_stationcallsign = QString(); bool searchAll = searchAllQCheckbox->isChecked(); //int i = -1; int cursorP = searchBoxLineEdit->cursorPosition(); /* if (searchBoxLineEdit->text() == "*") { callFilter = QString("call<>'1'"); setModelFilter(); searchBoxLineEdit->setCursorPosition(cursorP); return; } */ searchBoxLineEdit->setText((searchBoxLineEdit->text()).toUpper()); if (((searchBoxLineEdit->text()).length() < 2) && (searchBoxLineEdit->text() != "*")) { //qDebug() << "SearchWidget::slotSearchBoxTextChanged: NO FILTER"; currentLogFilter = QString("lognumber='-1'"); setModelFilter(); return; } setNeedingQSL(false); //qslingNeeded = false; // If I am searching I am not longer looking for QSO to QSL QString theCall = searchBoxLineEdit->text(); //QSqlQuery query; QString queryString, aux; //QString aux; aux.clear(); if ((theCall.startsWith("1")) || (theCall.startsWith("2"))) { // Fix a bug (or my knowledge of SQLite) to search Strings begining with 1 or 2 // sqlite does not understand statements like SELECT call FROM log WHERE call LIKE '%1A%' aux = theCall + "%"; } else { aux = "%" + theCall + "%"; } if (searchBoxLineEdit->text() == "*") { callFilter = QString("call<>'1'"); } else { callFilter = QString("call LIKE '%1'").arg(aux); } QString searchAllQuery; if (searchAll) { //searchWindow->setCurrentLog("lognumber <> '-1'"); } else { currentLogFilter = QString("lognumber = '%1'").arg(currentLog); } //QString stationCallQuery; QString stationCallSign; if (stationCallsignComboBox->currentIndex() == 0) { stationCallsignFilter = QString(""); setModelFilter(); } else if (stationCallsignComboBox->currentIndex() == 1) { stationCallsignFilter = QString("station_callsign = ''"); setModelFilter(); } else if (stationCallsignComboBox->currentIndex() > 1) { stationCallSign = stationCallsignComboBox->currentText(); stationCallsignFilter= QString("station_callsign = '%1'").arg(stationCallSign); setModelFilter(); } else { // This should be an error so return searchBoxLineEdit->setCursorPosition(cursorP); return; } searchBoxLineEdit->setCursorPosition(cursorP); } void SearchWidget::setModelFilter() { //qDebug() << "SearchWidget::setModelFilter - callFilter = " << callFilter ; //qDebug() << "SearchWidget::setModelFilter - stationCallFilter = " << stationCallsignFilter ; //qDebug() << "SearchWidget::setModelFilter - currentLog = " << currentLogFilter; QString filter; filter = QString(); if (callFilter.length()>0) { filter = callFilter; } if (stationCallsignFilter.length() >0) { if (filter.length()>0) { filter = filter + " AND " + stationCallsignFilter; } else { filter = stationCallsignFilter; } } if (currentLogFilter.length() >0) { if (filter.length()>0) { filter = filter + " AND " + currentLogFilter; } else { filter = currentLogFilter; } } //qDebug() << "SearchWidget::setModelFilter: " << filter ; searchWindow->setFilterString(filter); } void SearchWidget::setCurrentLog(const int _log) { currentLog = _log; } void SearchWidget::slotSearchClearButtonClicked() { //qDebug() << "SearchWidget::slotSearchClearButtonClicked: "; searchWindow->clear(); searchBoxLineEdit->clear(); searchSelectAllClicked = false; setNeedingQSL(false); //qslingNeeded = false; selectStationCallSign(); } void SearchWidget::slotSearchBoxSelectAllButtonClicked() { //qDebug() << "SearchWidget::slotSearchBoxSelectAllButtonClicked: "; if (searchSelectAllClicked) { //qDebug() << "SearchWidget::slotSearchBoxSelectAllButtonClicked: UN-SELECTING"; searchSelectAllClicked = false; searchWindow->clearSelection(); searchBoxSelectAllButton->setText(tr("&Select All")); } else { //qDebug() << "SearchWidget::slotSearchBoxSelectAllButtonClicked: SELECTING"; searchSelectAllClicked = true; searchWindow->selectAll(); searchBoxSelectAllButton->setText(tr("&Clear selection")); } } void SearchWidget::slotSearchBoxReSearchButtonClicked() { //qDebug() << "SearchWidget::slotSearchBoxReSearchButtonClicked: " ; slotSearchBoxTextChanged(); } void SearchWidget::slotSearchBoxSelectionChanged() {// Detects when a selection has been done in the search box and changes // The button to clear selection //qDebug() << "SearchWidget::slotSearchBoxSelectionChanged: " ; /* if ((searchResultsTreeWidget->selectedItems()).size() > 0 ) { searchBoxSelectAllButton->setText(tr("&Clear selection")); searchSelectAllClicked = true; } else { searchBoxSelectAllButton->setText(tr("&Select All")); searchSelectAllClicked = false; } */ } void SearchWidget::slotSearchExportButtonClicked() { //qDebug() << "SearchWidget::slotSearchExportButtonClicked: Selected: " << QString::number(searchWindow->getSelectedQSOs().count())<< QT_ENDL; // MARK QSOs // SAVE MARKED QSOs TO FILE // UNMARK QSOs QList _qsos; _qsos.clear(); _qsos << searchWindow->getSelectedQSOs(); bool itemsSelected = false; for (int i = 0; i < _qsos.size(); ++i) { QString stringQuery; QSqlQuery query; stringQuery = QString("UPDATE log SET marked = 'X' WHERE id='%1'").arg(_qsos.at(i)); bool sqlOK = query.exec(stringQuery); if (!sqlOK) { //qDebug() << "SearchWidget::slotSearchExportButtonClicked: query executed-error: " << query.lastError(); emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery()); } //qDebug() << "SearchWidget::slotSearchExportButtonClicked: query executed: " << query.lastQuery(); itemsSelected = true; } if (itemsSelected) { //qDebug() << "SearchWidget::slotSearchExportButtonClicked: to Ask filename"; QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), util->getHomeDir(), "ADIF (*.adi *.adif)"); filemanager->adifLogExportMarked(fileName); //qDebug() << "SearchWidget::slotSearchExportButtonClicked: to callsign save file"; dataProxy->unMarkAllQSO(); } else { //No items were selected } //qDebug() << "SearchWidget::slotSearchExportButtonClicked: unmarking..."; } void SearchWidget::searchToolNeededQSLToSend() { searchWindow->slotToolSearchQSL(0); } void SearchWidget::slotToolSearchRequestedQSLToSend() { searchWindow->slotToolSearchQSL(1); } void SearchWidget::slotToolSearchNeededQSLPendingToReceive() { searchWindow->slotToolSearchQSL(2); } void SearchWidget::slotToolSearchNeededQSLRequested() { searchWindow->slotToolSearchQSL(3); } void SearchWidget::setColors (const QString &_newOne, const QString &_needed, const QString &_worked, const QString &_confirmed, const QString &_default) { //qDebug() << "DXClusterWidget::setColors: " << _newOne << "/" << _needed << "/" << _worked << "/" << _confirmed << "/" << _default; // Just to pass the colors to the awards class searchWindow->setColors(_newOne, _needed, _worked, _confirmed, _default); } void SearchWidget::refresh() { slotSearchBoxTextChanged(); } klog-2.3.3/lotwutilities.h0000644000015700001710000000733614542412415015440 0ustar jenkinsjenkins#ifndef KLOG_LOTWUTILITIES_H #define KLOG_LOTWUTILITIES_H /*************************************************************************** lotwutilities.h - description ------------------- begin : apr 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "dataproxy_sqlite.h" #include "utilities.h" // https://lotw.arrl.org/lotw-help/developer-query-qsos-qsls/?lang=en class QSslError; class LoTWUtilities : public QObject { Q_OBJECT public: explicit LoTWUtilities(const QString &_klogDir, const QString &_klogVersion, const QString &_parentFunction, DataProxy_SQLite *dp); ~LoTWUtilities(); bool setStationCallSign(const QString &_call); int download(); int fullDownload(); void setUser(const QString &_call); void setPass(const QString &_pass); bool getIsReady(); void setFileName(const QString &_fn); QString getFileName(); private: void startRequest(QUrl url); int startThefullDownload(); bool selectQuery(const int _queryId); void parseDownloadedFile(const QString &_fn); //void showMessage(const int _messageIcon, const QString &_msg, const QString &_msgExt); Utilities *util; //void setTarget(const QString& t); QNetworkAccessManager *manager; QNetworkReply *reply; QFile *file; bool downloadAborted; //qint64 fileSize; QUrl url; QProgressDialog *pDialog; QString klogDir, klogVersion; QString urld; QString fileName; QString stationCallsign; QString startDate; QString lotwQuery; QString lotwUser, lotwPassword; DataProxy_SQLite *dataProxy;//, *dataProxyPrepared; QCalendarWidget *calendar; QDate firstDate; private slots: void slotReadyRead(); void slotFinished(); void slotDownloadProgress(qint64 bytesRead); void slotCancelDownload(); void slotCalendarDateSelected(const QDate _d); signals: void actionProcessLoTWDownloadedFile(QString _fn); }; #endif // LOTWUTILITIES_H klog-2.3.3/startwizard.cpp0000644000015700001710000015453714542412415015436 0ustar jenkinsjenkins/*************************************************************************** startwizard.cpp - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "startwizard.h" //#include StartWizard::StartWizard(const QString &_klogDir, const QString &_softVersion, QWidget *parent) : QWizard(parent) { //qDebug() << "StartWizard::StartWizard: v=" << _softVersion; //licAcepted = false; version = _softVersion; klogDir = _klogDir; //inMemory = true; //fileOrMemoryPage = new FileOrMemoryPage(); ctyPage = new CTYPage(klogDir, version); setWizardStyle(QWizard::AeroStyle); setPage(Page_Intro, new IntroPage); setPage(Page_Lic, new LicPage); //setPage(Page_Mem, new FileOrMemoryPage); setPage(Page_CTY, ctyPage); setStartId(Page_Intro); QAbstractButton* finishButton = this->button(QWizard::FinishButton); QAbstractButton* cancelButton = this->button(QWizard::CancelButton); connect(finishButton, SIGNAL(clicked()), this, SLOT(slotButtonFinishedClicked())); disconnect( cancelButton, SIGNAL( clicked() ), this, SLOT( reject() ) ); connect(cancelButton, SIGNAL( clicked() ), this, SLOT( slotCancelWizard() ) ); //connect(fileOrMemoryPage, SIGNAL(exeInMemory(bool)), this, SLOT(slotRunInMemory(bool) ) ); //connect(ctyPage, SIGNAL(downloadTheFileSignal(bool)), this, SLOT(slotDownloadCTY(bool) ) ); QList layout; layout << QWizard::Stretch << QWizard::BackButton << QWizard::CancelButton << QWizard::NextButton << QWizard::FinishButton; setButtonLayout(layout); setWindowTitle(tr("KLog - The free hamradio logging program")); //qDebug() << "StartWizard::StartWizard: - END"; } void StartWizard::setVersion(const QString &tversion) { version = tversion; } /*void StartWizard::slotUpdateDownloadProgress(qint64 received, qint64 total) { //qDebug() << "StartWizard::slotUpdateDownloadProgress: " << QString::number(received) << "/" << QString::number(total); ctyPage->updateProgress(received, total); } */ /* void StartWizard::slotDownloadFinished() { //qDebug() << "StartWizard::slotDownloadFinished"; //close(); } */ void StartWizard::slotCancelWizard() { if( QMessageBox::question( this, tr("Quit Setup"), tr("Setup is not complete yet. Are you sure you want to quit setup?"), QMessageBox::Yes, QMessageBox::No ) == QMessageBox::Yes ) { // allow cancel reject(); } } void StartWizard::slotButtonFinishedClicked() { //qDebug() << "StartWizard::slotButtonFinishedClicked "; setResult(2); } /* bool StartWizard::doTheDownload() { //qDebug() << "StartWizard::doTheDownload"; int downloading = 1; int i = 0; int ret; QMessageBox msgBox; QString str; msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::Yes); i = dl->download(); if (downloadValueResult == 0) { return true; } return false; } void StartWizard::slotValueReturnedFromDownload(int value) { //qDebug() << "StartWizard::slotValueReturnedFromDownload: " << QString::number(value); downloadValueResult = value; //close(); } */ IntroPage::IntroPage(QWidget *parent) : QWizardPage(parent) { setTitle(tr("Welcome to KLog!")); topLabel = new QLabel(tr("Welcome to KLog! " "- brought to you under the terms of the GPL!")); topLabel->setWordWrap(true); welcomeBrowser = new QTextEdit; welcomeBrowser->setReadOnly(true); QString welcometxt = "" + tr("Welcome to KLog") + "" + "

" + tr("This looks like it's the first time you've run KLog on this computer.") + "

" + "

" + tr("KLog is a free hamradio logging program that can run on GNU/Linux, macOS, and Windows. ") + tr("It is designed to provide general purpose DX, and contest logging.") + "

" + "

" + tr("It supports QSL management, import and export of ADIF ") + tr("and Cabrillo file formats and many other features...") + "

" + tr("Before you can start using KLog, you will be asked to:") + "

    " + "
  • " + tr("Acknowledge to the terms of the license.") + "
  • " + "
  • " + tr("Download the DX entities information.") + "
  • " + "
  • " + tr("Enter your callsign, CQ zone, etc. and main configuration.") + "
" + "

" + tr("Enjoy KLog and contact the development team if you have any suggestions!") + "

" + "

73 de EA4K

"; welcomeBrowser->setHtml(welcometxt); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(welcomeBrowser); setLayout(layout); } int IntroPage::nextId() const { return StartWizard::Page_Lic; } LicPage::LicPage(QWidget *parent) : QWizardPage(parent) { setTitle(tr("KLog License information")); //setPixmap(QWizard::WatermarkPixmap, QPixmap(":/images/watermark.png")); topLabel = new QLabel(tr("Welcome to KLog!" "- brought to you under the terms of the GPL!")); topLabel->setWordWrap(true); licenseBrowser = new QTextEdit; licenseBrowser->setReadOnly(true); QString gplLic = "" "GNU General Public License v3.0 - GNU Project - Free Software Foundation (FSF)" "" "" "

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

" ""; licenseBrowser->setHtml(gplLic); aceptLicCheckBox = new QCheckBox(tr("Acknowledge")); aceptLicCheckBox->setToolTip(tr("Be aware that KLog is free software.")); registerField("licAgreement*", aceptLicCheckBox); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(licenseBrowser); layout->addWidget(aceptLicCheckBox); setLayout(layout); } int LicPage::nextId() const { return StartWizard::Page_CTY; //return StartWizard::Page_Mem; } /* void LicPage::setNextButtonActive(const bool _active) { } FileOrMemoryPage::FileOrMemoryPage(QWidget *parent) : QWizardPage(parent) { runInMemory = false; setTitle(tr("File or Memory")); //setPixmap(QWizard::WatermarkPixmap, QPixmap(":/images/watermark.png")); topLabel = new QLabel(tr("Please select whether you prefer to run the DB in memory or in a file:" "
    " "
  • Running KLog in memory will be much faster, specially when managing several thousands of QSOs.
  • " "
  • Running KLog in a file will be much secure and you will not be forced to save the file before exiting or opening the logfile when starting KLog.
  • " "
" "Please know that in this version this feature is still not fully-implemented so KLog will run in file.")); topLabel->setWordWrap(true); memoryQCheckbox = new QCheckBox(tr("Run KLog DB in &memory")); fileQCheckbox = new QCheckBox(tr("Run KLog DB in a &file")); //memoryQCheckbox->setChecked(true); memoryQCheckbox->setChecked(false); fileQCheckbox->setChecked(true); memoryQCheckbox->setToolTip(tr("Recommended for day-to-day logging")); fileQCheckbox->setToolTip(tr("Recommended for contest logging")); connect( memoryQCheckbox, SIGNAL(toggled(bool) ), this, SLOT(slotRunningModeSelectedMemory(bool))); connect( fileQCheckbox, SIGNAL(toggled(bool) ), this, SLOT(slotRunningModeSelectedFile(bool))); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(topLabel); layout->addWidget(memoryQCheckbox); layout->addWidget(fileQCheckbox); setLayout(layout); } void FileOrMemoryPage::slotRunningModeSelectedFile(bool checked) { if (checked) { exeInMemory(false); } } void FileOrMemoryPage::slotRunningModeSelectedMemory(bool checked) { if (checked) { exeInMemory(true); } } int FileOrMemoryPage::nextId() const { return StartWizard::Page_CTY; } */ CTYPage::CTYPage(const QString &_klogDir, const QString &_version, QWidget *parent) : QWizardPage(parent) { //completed = false; dl = new DownLoadCTY(_klogDir, _version); connect(dl, SIGNAL(actionReturnDownload(int)), this, SLOT(slotDownloadFinished(int))); connect(dl, SIGNAL(actionShowProgres(qint64,qint64)), this, SLOT(slotUpdateDownloadProgress(qint64,qint64))); connect(dl, SIGNAL(actionError(int)), this, SLOT(slotDownloadError(int))); connect(dl, SIGNAL(downloadStopped()), this, SLOT(slotStopProgressBar())); setTitle(tr("Country data download")); topLabel = new QLabel(tr("KLog needs country data...")); topLabel->setWordWrap(true); progressBar = new QProgressBar; progressBar->setEnabled(false); downloadButton = new QPushButton(tr("&Download")); ignoreDownloadButton = new QPushButton(tr("&Ignore")); // downloadButton.setText(tr("Download")); connect(downloadButton, SIGNAL(clicked()), this, SLOT(slotDownloadButtonClicked() ) ); connect(ignoreDownloadButton, SIGNAL(clicked()), this, SLOT(slotIgnoreDownloadButtonClicked() ) ); hiddenCheckBox = new QCheckBox(); registerField("downloadSelection*", hiddenCheckBox); QHBoxLayout *buttonLayout = new QHBoxLayout; buttonLayout->addWidget(progressBar); buttonLayout->addWidget(downloadButton); buttonLayout->addWidget(ignoreDownloadButton); ctyBrowser = new QTextEdit; ctyBrowser->setReadOnly(true); QString st = tr("Country data needed"); QString gplLic = ""; gplLic = gplLic+st+"

"; st = tr("KLog uses the cty.csv file from https://www.country-files.com/ to get DXCC information."); gplLic = gplLic + st + "

"; st = tr("You need to download the cty.csv file if you want KLog to show you the countries, locator, etc. of the QSOs you do."); gplLic = gplLic + st + "

"; st = tr("Click on Download to download now."); gplLic = gplLic+st+"

"; ctyBrowser->setHtml(gplLic); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(ctyBrowser); layout->addLayout(buttonLayout); setLayout(layout); } void CTYPage::slotUpdateDownloadProgress(qint64 received, qint64 total) { //qDebug() << "CTYPage::slotUpdateDownloadProgress: " << QString::number(received) << "/" << QString::number(total); Q_UNUSED(total); progressBar->setValue(received); } void CTYPage::slotDownloadButtonClicked() { //qDebug() << "CTYPage::slotDownloadButtonClicked"; progressBar->setEnabled(true); progressBar->reset(); progressBar->setRange(0, 0); dl->download(); //completed = true; } void CTYPage::slotIgnoreDownloadButtonClicked() { //qDebug() << "CTYPage::slotIgnoreDownloadButtonClicked"; //ignoreDownloadButton->setChecked(true); slotStopProgressBar(); hiddenCheckBox->setChecked(true); progressBar->setEnabled(false); //completed = true; } void CTYPage::slotDownloadFinished(const int ret) { //qDebug() << "CTYPage::slotDownloadFinished: " << QString::number(ret); slotStopProgressBar(); if (ret == QNetworkReply::NoError) // No error { hiddenCheckBox->setChecked(true); progressBar->setEnabled(false); //progressBar->setValue(progressBar->maximum()); //hiddenCheckBox->setChecked(true); //qDebug() << "CTYPage::slotDownloadFinished: (no error): " << QString::number(ret); } else if (ret == -1) // File could not be created! { //qDebug() << "CTYPage::slotDownloadFinished: (file could not be created): " << QString::number(ret); } else { //qDebug() << "CTYPage::slotDownloadFinished: (another result): " << QString::number(ret); } } void CTYPage::slotDownloadError(const int ret) { //qDebug() << "CTYPage::slotDownloadError: " << QString::number(ret); int errorCode = ret; int i; slotStopProgressBar(); progressBar->setEnabled(false); /* if(errorCode == QNetworkReply::NoError) { } else */ if(errorCode == QNetworkReply::HostNotFoundError) { i = QMessageBox::warning(this, tr("KLog"), tr("I can't find the host. Please check your network and try again\n" "Do you want to try again?"), QMessageBox::Retry | QMessageBox::Ignore); if (i == QMessageBox::Retry) { slotDownloadButtonClicked(); } else { slotDownloadFinished(-1); } } /* else { //TODO: Add a message showing the error that has occur. errorString()? } */ } void CTYPage::slotStopProgressBar() { //qDebug() << "CTYPage::slotStopProgressBar"; progressBar->reset(); progressBar->setRange(0,1); progressBar->setValue(1); } klog-2.3.3/global.h0000644000015700001710000000012214542412415013741 0ustar jenkinsjenkins#ifndef KLOG_GLOBAL_H #define KLOG_GLOBAL_H extern bool g_callsignCheck; #endif klog-2.3.3/showerrordialog.cpp0000644000015700001710000000727614542412415016267 0ustar jenkinsjenkins/*************************************************************************** showerrordialog.cpp - description ------------------- begin : oct 2017 copyright : (C) 2017 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "showerrordialog.h" ShowErrorDialog::ShowErrorDialog() { //qDebug() << "ShowErrorDialog::ShowErrorDialog" ; text.clear(); setWindowTitle(tr("KLog Message")); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); QVBoxLayout *layout = new QVBoxLayout(this); layout->setSizeConstraint(QLayout::SetFixedSize); txtLabel = new QLabel(text); // QLabel *txtLabel = new QLabel(text); txtLabel->setWordWrap(true); txtLabel->setOpenExternalLinks(true); txtLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); QPushButton *closeButton = buttonBox->button(QDialogButtonBox::Close); buttonBox->addButton(closeButton, QDialogButtonBox::ButtonRole(QDialogButtonBox::RejectRole | QDialogButtonBox::AcceptRole)); //connect(buttonBox, SIGNAL(rejected()), this, &QDialog::reject); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())) ; txtLabel->setFrameShadow(QFrame::Raised); txtLabel->setFrameStyle(QFrame::StyledPanel); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addWidget(closeButton); //QVBoxLayout *mainLayout = new QVBoxLayout; layout->addWidget(txtLabel); layout->addLayout(buttonsLayout); setLayout(layout); //qDebug() << "ShowErrorDialog::ShowErrorDialog - END" ; } void ShowErrorDialog::setText(const QString txt) { //qDebug() << "ShowErrorDialog::setVersion: " << txt; text = txt; txtLabel->setText(txt); //textBrowser->setHtml(text); } ShowErrorDialog::~ShowErrorDialog() { //qDebug() << "ShowErrorDialog::~ShowErrorDialog" ; } void ShowErrorDialog::slotAcceptButtonClicked() { //qDebug() << "ShowErrorDialog::slotAcceptButtonClicked" ; accept(); } void ShowErrorDialog::keyPressEvent(QKeyEvent *event){ switch (event->key()) { break; default: //QFrame::keyPressEvent(event) slotAcceptButtonClicked(); } } klog-2.3.3/README-DEVEL0000644000015700001710000002171414542412415014057 0ustar jenkinsjenkinsThis is a file to read if you want to join the KLog development team. This document will explain the KLog architecture, requirements, tips and important to know things to take into account when joining the KLog development team. CONTENT: 1 - BEFORE CODING 2 - KLOG ARCHITECTURE 3 - BEFORE CODING 4 - CODING 5 - AFTER CODING 6 - GUI 7 - DOCUMENTATION 8 - TRANSLATIONS 9 - DEPLOYING 0 - MISSION AND OBJECTIVE The objective of KLog is to provide a free software that runs in Linux, macOS and Windows. KLog will provide hamradio contest and DX logging support. 0.1 - REQUIREMENTS - Able to run in Linux, macOS and Windows. - Easy to use. - Able to localize to any language. - Any data can be exportable into ADIF (http://www.adif.org). - Can import standard ADIF. - Can export to Cabrillo (http://www.kkn.net/~trey/cabrillo/). - Provides a user manual / documentation. 1 - BEFORE CODING: Read this document. Join the KLog mailing list and send a "Hello that's me and I am here" message: http//MAILINGLIST Interesting links: http://www.qtcentre.org/wiki/index.php?title=Keeping_the_GUI_Responsive Packer: http://upx.sourceforge.net/ = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 2 - KLOG ARCHITECTURE KLog is intended to be a MODULAR software with the requirement to be modular ;-) so it is easy to add new features (mainly contests and awards support). 2.1 IMPORTANT THINGS TO HAVE IN MIND DEPRECATED - KLog version number is using the following system: Release versions: The Decimal part of the version number will always use even numbers like 0, 1.2, 2.20, ... while the decimal part of the development or Release Candidate versions will always be an odd number ie 0.1, 1.3, ... The release number is defined in the "main.cpp" file. - KLog should manage several logs. The "log" table of the DB has a column called "lognumber". ALL QSO has a lognumber id that identifies the log it belongs to. Each lognumber will have associated a Name and/or ID (TBD) so the user is able to "open" just that log. It is important that all the QSO operations are aware of this lognumber id. - The log table has a "marked" column. This column is to allow mass operations. Changing this column has to be done with care and leave it "unmarked" once the desired operation is finished. KLog should unmark(N) all QSO when starts and exits. Mark = 'X', unmark='N' or other. Marked column should not be saved. - Any change to the DB architecture must be communicated and agreed with the development team before commiting to the SVN and following the 2.4 DB UPDATES area in this document. 2.2 CONTEST SUPPORT The "Contest" class (in contest.h) is a base class and all the contest should inherit it. The "Contest" class has several virtual functions that should re-implemented in all derived classes. 2.2.1 ADDING A NEW CONTEST To add a new contest, a new class, inheriting the "Contest" class should be created. The new contest file should be named: "contest_nameofthecontest.h" and "contest_nameofthecontest.cpp" and should be included in the mainwindow.h All the calls to the contest class should be implemented in the virtual class. A new contest must include the implementation of all the functions of the virtual class. 2.3 AWARD SUPPORT 2.4 DB UPDATES A DB update consist on: - All the intended changes. - Update the softwarecontrol TABLE on the DB To update the DB structure there are several things to have in mind: - The current version of the DB is defined in database.h const float DBVersionf = 0.003; - All the actions to update the DB to the new structure are done here: DataBase::updateIfNeeded - After making any update = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 3 - BEFORE CODING Update your sources from the SVN: Remember that other developer may has done a commit. = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 4 - CODING - The development language is English. - All Strings to be shown to the user must be translatable. i.e. tr("String") 4.1 - STYLE 4.2 - ADIF SUPPORT KLog is using some application defined ADIF fields: APP_{PROGRAMID}_{FIELDNAME} Header fields: APP_KLOG_LOG_DATE_EXPORT: The date and time (in UTC) when the log was exported. APP_KLOG_QSOS: The number of QSOs in the log. DEPRECATED: APP_KLOG_RELEASE: Release of KLog used to export the log file. CHANGED TO PROGRAMVERSION (ADIF standard) QSO fields: APP_KLOG_POINTS: Points given by the QSO. APP_KLOG_LOGN: Lognumber if the ADIF file contains several logs. KLog is also importing other application defined ADIF fields: APP_N1MM_POINTS: That is imported into the points column in the log table. KLog should not export any ADIF header that comming from other application without renaming it to APP_KLOG_ 4.3 SHORTCUTS Before adding or modifying any shortcut: - It should be agreed in the devel mailing list. - It should be as standard as possible, reuse the same shortcuts of main/popular contest software. - It should be checked and added to a list below. 4.4 DATA BASE - The DB version has to be checked and modified after a DB schema modification. - Any modification to the DB has to be provided with the code to update from any previous version. = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 5 - AFTER CODING Test that your code compiles and does not break the previous code. Document your changes and close/update the tasks/bugs you have worked on. Remember to commit your code to the SVN. Try to do "atomic" commits. That is to commit updates that may be disabled as a block. i.e. A new function or a modification to a function. Don't commit several things at once if you can avoid it. This is just a recommendation to avoid big commits that, in case of a problem are difficult to trace. Document your commits: ALWAYS add a clear comment to the commits so it is easy to know what is it about. 5.1 TEST CHECKLIST Here is the list of tests to be done before releasing new software: - Install in a new installation of Windows/macOS - Upgrade from a previous version - Create a new log - Add a new QSO - Check that the DXCC & IOTA continent make sense - Check if QSO/worked DXCC, ... count changes - Edit a QSO from log - Modify at least one field in each tab - Edit a QSO from the search box - Remove a QSO - Update the DXCC status tab - Connect to the DXCluster - Click on a spot on the DXCluster - Export an ADIF file - Import an ADIF file - Remove KLog in Windows = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 6 - GUI 6.1 CONTEST GUI - The GUI should only have the data fields that are needed for that contest, keeping the GUI simple and easy to use. = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 7 - DOCUMENTATION - One feature will not be considered completed until it is not added to the user manual. Please document in the klog-handbook.xml your feature so the user knows how to use it. = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 9 - TRANSLATIONS 9.1 ADDING TRANSLATIONS To add a new translation add the new language file to the klog.pro file following the sintax: TRANSLATIONS = KLog_es.ts \ klog_fr.ts Being es, fr, the ISO codes naming the language. After a translation is added, you also need to update the aboutdialog.cpp to include a new Translator line. 9.2 TRANSLATING Translators should work in the *.ts files. 9.2 UPDATING TRANSLATIONS Update translations: Run: lupdate -verbose klog.pro in the klog directory to update the language files = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 9 - DEPLOYING Before deploying, translations should be updated. 9.1 DEPLOYING ON LINUX 9.2 DEPLOYING ON macOS Build KLog with QTCreator If you can't run KLog due to missing libTIFF/LibJPEG/libPNG/libGIF chec this URL: https://stackoverflow.com/questions/35509731/dyld-symbol-not-found-cg-jpeg-resync-to-restart Try this in the shell: $ cd /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources $ sudo ln -sf libJPEG.dylib /usr/local/lib/libJPEG.dylib $ sudo ln -sf libPng.dylib /usr/local/lib/libPng.dylib $ sudo ln -sf libTIFF.dylib /usr/local/lib/libTIFF.dylib $ sudo ln -sf libGIF.dylib /usr/local/lib/libGIF.dylib Run the following command from the build directory: mv klog.app KLog.app create new folder in KLog.app/Contents/PlugIns/sqldrivers copy $QT_DIR/plugins/sqldrivers/libqsqlite.dylib to the new folder (/Developer/Applications/Qt/plugins/) create new folder: KLog.app/Contents/MacOs/translations copy the *.qm (translation) files into KLog.app/Contents/MacOS/translations macdeployqt KLog.app/ -dmg mv KLog.dmg KLog-[VERSION].dmg 9.3 DEPLOYING ON WINDOWS Currently using an Open Source Licence of: BitRock InstallBuilder 9.4 ICON Follow this link for all the OS: http://doc.qt.io/qt-5/appicon.html Installer: http://en.wikipedia.org/wiki/List_of_installation_software klog-2.3.3/AUTHORS0000644000015700001710000000127414542412415013411 0ustar jenkinsjenkinsJaime Robles, EA4K - (2002-today) Juan Carlos Reig, EA5WA - (2021-today) Ladislav Foldyna, OK1MLG - (2021-today) Akihiro Koda, JL3OXR - (2016, 2020) Andrew Goldie, ZL2ACG - (2009-2010) Translators: Catalan - Josep Ma Ferrer, Catalan KDE Translation team (before Luis, EA3NM - 2016) Croatian - Kristijan - M0NKC Danish - Joe Hansen (debian-l10n-danish@list.debian.org) German - Burkhard Lück (lueck@hube-lueck.de) Finnish - Kristjan Lorents (debian-i18n@lists.debian.org) French - Christophe, F4HWL Italian - Simona - IU5HIU Japanese - Nick, JJ1TGT, Aki, JL3OXR Latvian - Arnis Armans, YL3GBC Polish - Piotr, LA7RRA Spanish - Jaime, EA4K UKrainian - Mykola, UR6QV & Volodymyr, UR3QJW klog-2.3.3/qso.h0000644000015700001710000004230614542412415013315 0ustar jenkinsjenkins#ifndef KLOG_QSO_H #define KLOG_QSO_H /*************************************************************************** qso.h - description ------------------- begin : may 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include //#include #include "utilities.h" #include "klogdefinitions.h" #include "database.h" #include "adif.h" //#include class QSO : public QObject { Q_OBJECT friend class tst_QSO; public: QSO(); ~QSO(); void setLogLevel (const DebugLogLevel _b); void setRealTime(const bool _rt); // Not QSO info but KLog status bool getRealTime(); void setManualMode(const bool _rt); // Not QSO info but KLog status bool getManualMode(); void setBackup(const bool _rt); bool getBackup(); void setModifying(const bool _mod); bool getModifying(); bool setData(const QString &_adifPair); void clear(); bool isValid(); void setLoTWUpdating(bool _lotw); bool setCall(const QString &_c); QString getCall(); bool setBand(const QString &_c); QString getBand(); bool setMode(const QString &_c); QString getMode(); bool setDateTimeOn(const QDateTime &_c); QDateTime getDateTimeOn(); bool setDate(const QDate &_c); QDate getDate(); bool setTimeOn(const QTime &_c); QTime getTimeOn(); bool setQSOid(const int _i); int getQSOid(); bool setLogId(const int _i); int getLogId(); bool setBandRX(const QString &_c); QString getBandRX(); bool setRSTTX(const QString &_c); QString getRSTTX(); bool setRSTRX(const QString &_c); QString getRSTRX(); double setFreqTX(const double _f); bool setFreqRX(const double _f); double getFreqTX(); double getFreqRX(); bool setQTH(const QString &_c); QString getQTH(); bool setGridSquare(const QString &_c); QString getGridSquare(); bool setName(const QString &_c); QString getName(); bool setRXPwr(const double _f); double getRXPwr(); // QSL TAB bool setQSL_SENT(const QString &_c); QString getQSL_SENT(); bool setQSLSDate(const QDate &_c); QDate getQSLSDate(); bool setQSLSenVia(const QString &_qs); QString getQSLSentVia(); bool setQSL_RCVD(const QString &_c); QString getQSL_RCVD(); bool setQSLRDate(const QDate &_c); QDate getQSLRDate(); bool setQSLRecVia(const QString &_qs); QString getQSLRecVia(); bool setQSLVia(const QString &_qs); QString getQSLVia(); bool setQSLMsg(const QString &_qs); QString getQSLMsg(); // eQSL tab bool setClubLogStatus(const QString &_c); QString getClubLogStatus(); bool setClubLogDate(const QDate &_c); QDate getClubLogDate(); bool setEQSLQSL_RCVD(const QString &_c); QString getEQSLQSL_RCVD(); bool setEQSLQSL_SENT(const QString &_c); QString getEQSLQSL_SENT(); bool setEQSLQSLRDate(const QDate &_c); QDate getEQSLQSLRDate(); bool setEQSLQSLSDate(const QDate &_c); QDate getEQSLQSLSDate(); bool setLoTWQSL_RCVD(const QString &_c); QString getLoTWQSL_RCVD(); bool setLoTWQSL_SENT(const QString &_c); QString getLoTWQSL_SENT(); bool setLoTWQSLRDate(const QDate &_c); QDate getLoTWQSLRDate(); bool setLoTWQSLSDate(const QDate &_c); QDate getLoTWQSLSDate(); bool setQRZCOMStatus(const QString &_c); QString getQRZCOMStatus(); bool setQRZCOMDate(const QDate &_c); QDate getQRZCOMDate(); void setDefaultEQSLSentServices(const bool _send); // Comment Tab bool setComment(const QString &_c); QString getComment(); bool setKeepComment(bool _k); bool getKeepComment(); // Others Tab bool setDXCC(const int _i); int getDXCC(); bool setPropMode(const QString &_c); QString getPropMode(); bool setSOTA_REF(const QString &_c); QString getSOTA_REF(); bool setAge(const double _c); double getAge(); bool setIOTA(const QString &_c); QString getIOTA(); bool setKeepOthers(bool _k); bool getKeepOthers(); bool setVUCCGrids(const QString &_c); QString getVUCCGrids(); // My data Tab bool setTXPwr(double _f); double getTXPwr(); bool setOperatorCallsign(const QString &_c); QString getOperatorCallsign(); bool setStationCallsign(const QString &_c); QString getStationCallsign(); bool setMyGridSquare(const QString &_c); QString getMyGridSquare(); bool setKeepMyData(bool _k); bool getKeepMyData(); bool setMySOTA_REF(const QString &_c); QString getMySOTA_REF(); bool setMyRig(const QString &_c); QString getMyRig(); bool setMyAntenna(const QString &_c); QString getMyAntenna(); bool setMyArrlSect(const QString &_c); QString getMyArrlSect(); bool setMyVUCCGrids(const QString &_c); QString getMyVUCCGrids(); // Satellite Tab bool setSatName(const QString &_c); QString getSatName(); bool setSatMode(const QString &_c); QString getSatMode(); bool setKeepSatTab(bool _k); bool getKeepSatTab(); bool setAddress(const QString &_c); QString getAddress(); bool setA_Index(const int _i); int getA_Index(); bool setAnt_az(const double _c); double getAnt_az(); bool setAnt_el(const double _c); double getAnt_el(); bool setAnt_Path(const QString &_c); QString getAnt_Path(); bool setARRL_Sect(const QString &_c); QString getARRL_Sect(); bool setCheck(const QString &_c); QString getCheck(); bool setClass(const QString &_c); QString getClass(); bool setClublogQSOUpdateDate(const QDate &_c); QDate getClublogQSOUpdateDate(); bool setContinent(const QString &_c); QString getContinent(); bool setDistance(const double _i); double getDistance(); bool setOwnerCallsign(const QString &_c); QString getOwnerCallsign(); bool setEQ_Call(const QString &_c); // Contacted station owner QString getEQ_Call(); // Contacted station owner bool setHRDUpdateDate(const QDate &_c); QDate getHRDUpdateDate(); bool setHRDLogStatus(const QString &_c); QString getHRDLogStatus(); bool setK_Index(const int _i); int getK_Index(); bool setDateOff(const QDate &_c); QDate getDateOff(); bool setTimeOff(const QTime &_c); QTime getTimeOff(); bool setRig(const QString &_c); QString getRig(); bool setCountry(const QString &_c); QString getCountry(); bool setAwardGranted(const QString &_c); QString getAwardGranted(); bool setAwardSubmitted(const QString &_c); QString getAwardSubmitted(); bool setCounty(const QString &_c); QString getCounty(); bool setContactedOperator(const QString &_c); QString getContactedOperator(); bool setContestID(const QString &_c); QString getContestID(); bool setCQZone(const int _i); int getCQZone(); bool setCreditGranted(const QString &_c); QString getCreditGranted(); bool setCreditSubmitted(const QString &_c); QString getCreditSubmitted(); bool setDarcDok(const QString &_c); QString getDarcDok(); bool setEmail(const QString &_c); QString getEmail(); bool setFists(const int _i); int getFists(); bool setFistsCC(const int _i); int getFistsCC(); bool setForceInit(bool _k); bool getForceInit(); bool setIotaID(const int _i); int getIotaID(); bool setItuZone(const int _i); int getItuZone(); bool setLatitude(const QString &_c); QString getLatitude(); bool setLongitude(const QString &_c); QString getLongitude(); bool setQSOComplete(const QString &_c); QString getQSOComplete(); bool setNrBursts(const int _i); int getNrBursts(); bool setMaxBursts(const int _i); int getMaxBursts(); bool setNrPings(const int _i); int getNrPings(); bool setMsShower(const QString &_c); QString getMsShower(); bool setQSORandom(bool _k); bool getQSORandom(); bool setMyCity(const QString &_c); QString getMyCity(); bool setMyCounty(const QString &_c); QString getMyCounty(); bool setMyCountry(const QString &_c); QString getMyCountry(); bool setMyCQZone(const int _i); int getMyCQZone(); bool setMyDXCC(const int _i); int getMyDXCC(); bool setMyFists(const int _c); int getMyFists(); bool setMyIOTA(const QString &_c); QString getMyIOTA(); bool setMyIotaID(const int _i); int getMyIotaID(); bool setMyITUZone(const int _i); int getMyITUZone(); bool setMyLatitude(const QString &_c); QString getMyLatitude(); bool setMyLongitude(const QString &_c); QString getMyLongitude(); bool setMyName(const QString &_c); QString getMyName(); bool setMyPostalCode(const QString &_c); QString getMyPostalCode(); bool setMySig(const QString &_c); QString getMySig(); bool setMySigInfo(const QString &_c); QString getMySigInfo(); bool setMyState(const QString &_c); QString getMyState(); bool setMyStreet(const QString &_c); QString getMyStreet(); bool setMyUsacaCounties(const QString &_c); QString getMyUsacaCounties(); bool setNotes(const QString &_c); QString getNotes(); bool setPrefix(const QString &_c); QString getPrefix(); bool setPrecedence(const QString &_c); QString getPrecedence(); bool setPublicKey(const QString &_c); QString getPublicKey(); bool setRegion(const QString &_c); QString getRegion(); bool setTenTen(const int _i); int getTenTen(); bool setSFI(const int _i); int getSFI(); bool setSig(const QString &_c); QString getSig(); bool setSigInfo(const QString &_c); QString getSigInfo(); bool setSilentKey(bool _k); bool getSilentKey(); bool setSkcc(const QString &_c); QString getSkcc(); bool setSrx(const int _i); int getSrx(); bool setSrxString(const QString &_c); QString getSrxString(); bool setState(const QString &_c); QString getState(); bool setStx(const int _i); int getStx(); bool setStxString(const QString &_c); QString getStxString(); //bool setSubmode(const QString &_c, bool requestMode = false); bool setSubmode(const QString &_c); QString getSubmode(); bool setSwl(bool _k); bool getSwl(); bool setUksmg(const int _i); int getUksmg(); bool setUsacaCounties(const QString &_c); QString getUsacaCounties(); bool setVeProv(const QString &_c); QString getVeProv(); bool setWeb(const QString &_c); QString getWeb(); bool setWwffRef(const QString &_c); QString getWwffRef(); bool setMyWwffRef(const QString &_c); QString getMyWwffRef(); bool toDB(int _qsoId = 0); //bool add(); //bool modify(const int _qsoId); bool isComplete(); QString getADIF(); signals: void debugLog (QString _func, QString _msg, DebugLogLevel _level); void getBandSignal (double fr); // Request the band to be filed for a given frequency void getModeSignal (QString submode); // Request the mode to be filled for a given submode void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution private: void logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level); QString getAddQueryString(); QString getModifyQueryString(); QSqlQuery getPreparedQuery(const QString &_s); int getBandIdFromBandName(bool _rxBand=false); // if rxBand = true, it will chec the bandRX int getModeIdFromModeName(); int qsoId, logId, dxcc, a_index, k_index, cqz, fists, fists_cc, my_fists, iota_ID, itu_zone, nr_bursts, max_bursts, nr_pings, my_cqz, my_itu_zone, my_dxcc, my_iota_ID, srx, stx, uksmg; int ten_ten, sfi; double freq_tx, freq_rx, pwr_rx, pwr_tx, age, ant_el, ant_az, freq, distance; QString satName, satMode, callsign, stationCallsign, operatorCall, propMode, band, band_rx, mode, gridsquare, my_gridsquare, qth, name, RST_tx, RST_rx; QString qsl_rcvd, qsl_sent, qslSenVia, qslRecVia, qslVia, check, clase; QString lotw_qsl_sent, lotw_qsl_rcvd, sota_ref, my_sota_ref, my_rig, my_antenna, my_arrl_sect, vucc_grids, my_vucc_grids; QString clublog_status, hrdlog_status, QRZCom_status; QString eqsl_qsl_sent, eqsl_qsl_rcvd; QString comment, address, ant_path, arrl_sect, continent, rig, country, award_granted, award_submitted, county, contacted_op, contacted_owner, contest_id; QString credit_granted, credit_submitted,darc_dok, email, qso_complete, usaca_counties, ve_prov, web, wwff_ref; QString iota, ownerCall, latitude, longitude, ms_shower, notes, prefix, precedence, public_key, qslmsg, region, sig, sig_info, skcc, srx_string, stx_string, state, submode; QString my_city, my_county, my_country, my_iota, my_latitude, my_longitude, my_name, my_postal_code, my_sig, my_sig_info, my_state, my_street, my_usaca_counties, my_wwff_ref; QTime qso_time_off; QDateTime qso_dateTime; QDate QSLRDate, QSLSDate, QSLLoTWRDate, QSLLoTWSDate, qso_date_off; QDate eQSLRDate, eQSLSDate, clublogDate,clublogQSOUpdateDate, hrdlogUploadDate; QDate QRZComDate; bool backup, lotwUpdating, realTime, manualMode, silent_key; bool keepComment, keepOther, keepMyData, keepSat, modifying, isValidDistance, forceInit, qso_random, swl; bool haveBand, haveMode, haveDateTime, haveCall; Utilities *util; Adif *adif; DebugLogLevel logLevel; // DataProxy_SQLite *dataProxy; bool decltype_function(const QString& _c); //empty function to find correct typenames for mem_fn, DO NOT RENAME static QHash SetDataHash; void InitializeHash(); //Overloaded helper functions to accept string data for nonstring functions bool setAge(const QString &data); bool setA_Index(const QString &data); bool setAnt_az(const QString &data); bool setAnt_el(const QString &data); bool setCQZone(const QString &data); bool setDistance(const QString &data); bool setDXCC(const QString &data); bool setFists(const QString &data); bool setFistsCC(const QString &data); bool setMyFists(const QString &data); bool setIotaID(const QString &data); bool setItuZone(const QString &data); bool setK_Index(const QString &data); bool setMaxBursts(const QString &data); bool setMyCQZone(const QString &data); bool setMyDXCC(const QString &data); bool setMyIotaID(const QString &data); bool setMyITUZone(const QString &data); bool setNrBursts(const QString &data); bool setNrPings(const QString &data); bool setSFI(const QString &data); bool setSrx(const QString &data); bool setStx(const QString &data); bool setTenTen(const QString &data); bool setUksmg(const QString &data); bool setFreqTX(const QString& data); bool setFreqRX(const QString& data); bool setRXPwr(const QString& data); bool setTXPwr(const QString& data); bool setClublogQSOUpdateDate(const QString& data); bool setEQSLQSLRDate(const QString& data); bool setEQSLQSLSDate(const QString& data); bool setForceInit(const QString& data); bool setHRDUpdateDate(const QString& data); bool setLoTWQSLRDate(const QString& data); bool setLoTWQSLSDate(const QString& data); bool setQRZCOMDate(const QString& data); bool setQSLRDate(const QString& data); bool setQSLSDate(const QString& data); bool setDate(const QString& data); bool setDateOff(const QString& data); bool setQSORandom(const QString& data); bool setSilentKey(const QString& data); bool setSwl(const QString& data); bool setTimeOff(const QString& data); bool setTimeOn(const QString& data); bool setLoTWQSLRDate2(const QString& data); bool setLoTWQSLSDate1(const QString& data); bool setLoTWQSLSDate2(const QString& data); }; #endif // QSO_H klog-2.3.3/awards.h0000644000015700001710000001673514542412415014003 0ustar jenkinsjenkins#ifndef KLOG_AWARDS_H #define KLOG_AWARDS_H /*************************************************************************** awards.h - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ //#include // For the "tr" function #include #include #include #include #include #include #include #include #include #include #include "world.h" #include "awarddxmarathon.h" #include "dataproxy_sqlite.h" #include "utilities.h" #include "klogdefinitions.h" class QProgressDialog; class Awards : public QObject { Q_OBJECT //friend class World; public: Awards(DataProxy_SQLite *dp, const QString &_parentFunction); ~Awards(); void setAwards(const int _qsoId); void setAwards(const int _dxcc, const int _waz, const int _band, const int _mode, const int _workedOrConfirmed, const int _logNumber, const int _qsoId); /* _workedOrConfirmed = 0 Set as Worked _workedOrConfirmed = 1 Set as Confirmed */ void setManageModes(const bool _manageModes=false); // Defines if the mode is to be taken into account when calculating an award void recalculateAwards(); //void recalculateDXCC(const int _logNumber); //void setAwards(const int _qsoId, bool modify); int getDXCCWorked(const int _logNumber); int getDXCCConfirmed(const int _logNumber); int getWAZWorked(const int _logNumber); int getWAZConfirmed(const int _logNumber); bool updateDXCCBandsStatus(const int _logNumber=0); int getQSOsInLog(const int _logNumber); bool getIsDXCCConfirmed(const int _dxcc, const int _logNumber); bool isThisSpotConfirmed(const QStringList &_qs); QString checkIfValidIOTA(const QString &_tiota); //TODO: There is an equivalent function in the MainWindowInputOthers class. I should use only one! int getEntityDXStatus (const int _enti, const int _bandid, int _modeid = -1, int _log = -1); QString getQSOofAward (const int _enti, const int _bandid, const int _log, const bool _confirmed); int getQSOIdofAward (const int _enti, const int _bandid, const int _log, const bool _confirmed); int getDXStatus (const QStringList &_qs); QString getDXStatusString (const int &_status); // Needs to be called with the output of getDXStatus QString getDXCCStatusBand2(const int _dxcc, const int _band, const int _logNumber=0); // Returns -, W or C (Not worked, worked, Confirmed) QString getDXCCStatusBand(const int _dxcc, const int _band); // Returns -, W or C (Not worked, worked, Confirmed) void setColors (const QString &_newOne, const QString &_needed, const QString &_worked, const QString &_confirmed, const QString &_default); QColor getQRZDXStatusColor(const QStringList &_qs); // Receives Entity, band, mode & log QColor getDefaultColor(); int getDXMarathonQSO(const int _year, const int _logNumber); int getDXMarathonDXCC(const int _year, const int _logNumber); int getDXMarathonCQ(const int _year, const int _logNumber); int getDXMarathonScore(const int _year, const int _logNumber); bool isDXMarathonNeed(const int _dxcc, const int _cq, const int _year, const int _logNumber); // Receives: QStringList _qs; //_qs << QRZ << BandId << lognumber; /* 0 - New one. 1 - Worked but not confirmed: New one in this band. 2 - Worked but not confirmed: Worked in this band. 3 - Confirmed: New one in this band. 4 - Confirmed: Worked in this band. 5 - Confirmed: Confirmed in this band. 6 - Default: Not applicable */ private: void setAwardDXCC(const int _qsoId); //bool setAwardDXCC(const int _dxcc, const int _band, const int _mode, const QString &_workedOrConfirmed, const int _logNumber, const int _qsoId); int setAwardDXCCst(const int _dxcc, const int _band, const int _mode, const bool _confirmed, const int _logNumber, const int _qsoId); int setAwardDXCCConfirmed(const int _band, const int _mode, const int _dxcc, const int _newQSOid); // Changes the status of a DXCC from worked to confirmed int setDXCCToQSO(const int _dxcc, const int _qsoid); // Defines the DXCC in a QSO int setCQToQSO(const int _cqz, const int _qsoid); // Defines the CQ zone in a QSO int dxccStatusBandMode(const int _ent, const int _band, const int _mode, const int _logNumber, bool _checkingMode); //-1 error / 0 Not worked / 1 worked / 2 confirmed int dxccStatus(const int _ent, const int _logNumber); //-1 error / 0 Not worked / 1 worked / 2 confirmed /* _confirmed = 0 Set as Worked _cConfirmed = 1 Set as Confirmed */ /**/ int dxccStatusBand(const int _ent, const int band, const int _logNumber); //-1 error / 0 Not worked / 1 worked / 2 confirmed int dxccStatusMode(const int _ent, const int band, const int _logNumber); //-1 error / 0 Not worked / 1 worked / 2 confirmed /**/ void setAwardWAZ(const int _qsoId); //bool setAwardWAZ(const int _cqz, const int _band, const int _mode, const QString &_workedOrConfirmed, const int _logNumber, const int _qsoId); int setAwardWAZst(const int _cqz, const int _band, const int _mode, const bool _confirmed, const int _logNumber, const int _qsoId); /* _confirmed = 0 Set as Worked _confirmed = 1 Set as Confirmed */ //int getProgresStepForDialog(int totalSteps); QColor newOneColor; // QColor neededColor; // QColor workedColor; // QColor confirmedColor; // QColor defaultColor; World *world; DataProxy_SQLite *dataProxy; DXMarathon *dxMarathon; Utilities *util; typedef QMultiHash DXStatus; DXStatus dxccWorked, dxccConfirmed, wazWorked, wazConfirmed; bool manageModes; QList dxccStatusList; signals: void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution void awardDXCCUpdated(); }; #endif // AWARDS_H klog-2.3.3/setupdialog.h0000644000015700001710000001505014542412415015027 0ustar jenkinsjenkins#ifndef KLOG_SETUPDIALOG_H #define KLOG_SETUPDIALOG_H /*************************************************************************** setupdialog.h - description ------------------- begin : sept 2011 copyright : (C) 2011 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include "setuppages/setuppageuserdata.h" #include "setuppages/setuppagebandmode.h" #include "setuppages/setuppagemisc.h" #include "setuppages/setuppagedxcluster.h" #include "setuppages/setuppagecolors.h" #include "setuppages/setuppagelogs.h" #include "setuppages/setuppageworldeditor.h" #include "setuppages/setuppageelog.h" #include "setuppages/setuppageudp.h" #include "setuppages/setuppagesats.h" #include "setuppages/setuppagehamlib.h" #include "setuppages/setuppagesubdivisions.h" #include "setuppages/setuppagelogview.h" #include "utilities.h" #include "locator.h" #include "klogdefinitions.h" class QListWidget; class QListWidgetItem; class QStackedWidget; class SetupDialog : public QDialog { Q_OBJECT public: //SetupDialog(DataProxy_SQLite *dp, const bool _firstTime=true, QWidget *parent = nullptr); SetupDialog(DataProxy_SQLite *dp, QWidget *parent = nullptr); ~SetupDialog(); void init(const QString &_softwareVersion, const int _page=0, const bool _alreadyConfigured = true); void setData(const QString &_softwareVersion, const int _page = 0, const bool _alreadyConfigured=true); void setClubLogActive(const bool _b); //void setQRZCOMAutoCheckActive(const bool _b); void checkIfNewBandOrMode(); void setLogLevel(const DebugLogLevel _sev); void loadDarkMode(); // Reads the config to setup the DarkMode signals: void exitSignal(const int status); // 1 = OK, -1 = NOK, 2 = Cancel clicked void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution void debugLog (QString _func, QString _msg, DebugLogLevel _level); //void qrzcomAuto(bool); //void newLogRequested(const bool _s); // true show new log private slots: void changePage(QListWidgetItem *current, QListWidgetItem *previous); void slotReadConfigData(); void slotOkButtonClicked(); void slotCancelButtonClicked(); void slotAnalyzeNewLogData(const QStringList _qs); // We receive the station callsign and operators from the logs tab void slotSetStationCallSign(const QString &_p); // We receive te station callsign from the userData tab to fill the new log void slotSetOperators(const QString &_p); // We receive te station operators from the userData tab to fill the new log void slotQueryErrorManagement(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); void slotFocusOK(); //void slotQRZCOMAuto(const bool _b); private: void showEvent(QShowEvent *event); //void setConfigFile(const QString &_configFile); void setSoftVersion(const QString &_softwareVersion); void setConfigured(const bool _configured); void setPage(const int _page); void connectActions(); void saveSettings(); bool loadSettings(); void createIcons(); bool processConfigLine(const QString &_line); void setDefaults(); void readActiveBands (const QStringList &actives); void readActiveModes (const QStringList &actives); bool isValidBand (const QString &b); bool isValidMode (const QString &b); QString checkAndFixASCIIinADIF(const QString &_data); bool haveAtleastOneLog(); void logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level); bool firstTime; // To know if we are calling it from the Start wizard or not bool nolog; // If there is no log being managed QString dxClusterServerToUse; QStringList dxClusterServers; QPushButton *okButton, *closeButton; QTabWidget *tabWidget; int logsPageTabN; QListWidget *contentsWidget; QStackedWidget *pagesWidget; SetupPageUserDataPage *userDataPage; SetupPageBandMode *bandModePage; SetupPageDxCluster *dxClusterPage; SetupPageMisc *miscPage; SetupPageColors *colorsPage; SetupPageLogs *logsPage; SetupPageWorldEditor *worldEditorPage; SetupPageELog *eLogPage; //SetupPageClubLog *clubLogPage; //SetupPageEQSL *eQSLPage; //SetupPageLoTW *lotwPage; SetupPageUDP *UDPPage; SetupPageSats *satsPage; SetupPageHamLib *hamlibPage; //SetupPageInterfacesWindows *interfacesWindowsPage; SetupPageSubdivisions *subdivisionsPage; SetupPageLogView *logViewPage; //SetupPageRegionalAwards *regionalAwardsPage; int pageRequested; // The page on the Dialog that is requested to be shown when you call it //QString klogDir; QString version; QStringList bands, modes, logViewFields; Locator *locator; DataProxy_SQLite *dataProxy; Utilities *util; //QString windowSize; //QString latestBackup; int constrid; // Just an id for the constructor to check who is being executed at one specific time DebugLogLevel logLevel; // Manages as syslog, the severity of the application debug log }; #endif // SETUPDIALOG_H klog-2.3.3/fileawardmanager.cpp0000644000015700001710000002407514542412415016342 0ustar jenkinsjenkins/*************************************************************************** fileawardmanager.cpp - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles user : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "fileawardmanager.h" FileAwardManager::FileAwardManager(DataProxy_SQLite *dp, const QString &_parentFunction) { Q_UNUSED(_parentFunction); dataProxy = dp; util = new Utilities(Q_FUNC_INFO); world = new World(dataProxy, Q_FUNC_INFO); } FileAwardManager::~FileAwardManager() { delete(dataProxy); delete(util); delete(world); } bool FileAwardManager::importNewAwardFile() { //qDebug() << "FileAwardManager::importNewAwardFile" ; QString fileName = QFileDialog::getOpenFileName(nullptr, tr("Open Award file"), util->getHomeDir(), tr("Award files (*.awa)")); //qDebug() << "FileAwardManager::importNewAwardFile - file: " << fileName ; QFile file( fileName ); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << "FileAwardManager::importNewAwardFile File not found" << fileName; showError(tr("Award file not opened"), tr("KLog was not able to read the award file"), QString(tr("It was not possible to open the file %1 for reading.") ).arg(fileName)); return false; } else { //qDebug() << "FileAwardManager::importNewAwardFile File opened"; } QString line = QString(); int number = 0; bool hasEOH = false; // id / name / shortname / prefix / regionalgroup / regionalid / dxcc / cqz / ituz / start_date / end_date / deleted QString sub_name = QString(); QString sub_shortname = QString(); QString sub_prefix = QString(); QString sub_regionalGroup = QString(); int sub_regionalID = -1; int sub_dxcc = -1; int sub_cqz = -1; int sub_ituz = -1; QDate sub_startDate = QDate(); QDate sub_endDate = QDate(); bool sub_deleted = false; qint64 pos; //Position in the file pos = file.pos(); while ( !file.atEnd() ) { // KLog first read the full file, to detect potential format errors and counting the number of references //qDebug() << "FileAwardManager::importNewAwardFile: First read, counting and looking for errors: " << line; line = file.readLine().trimmed().toUpper(); //qDebug() << "FileAwardManager::importNewAwardFile: " << line; number = number + line.count("EOR>"); if ((line.count("")>0) ) { hasEOH = true; } //qDebug() << " //FileAwardManager::importNewAwardFile in the while, end of loop" ; } //qDebug() << "FileAwardManager::importNewAwardFile: While finished " ; if (!hasEOH) { showError(tr("AWA wrong format"), tr("The AWA file does not have the right format"), QString(tr("AWA file does not have an field") )); return false; } file.seek(pos); //bool haveAll = false; QStringList fields; QString aux; aux.clear(); hasEOH = false; while ( !file.atEnd() ) { line = (file.readLine()).toUpper(); fields.clear(); fields << line.split("<", QT_SKIP); if (!hasEOH) { // Lets read the HEADER // IF EOH if (line.contains("")) { hasEOH = true; } foreach (aux, fields) { //qDebug() << "FileAwardManager::importNewAwardFile: Reading header: " << aux; aux = aux.trimmed(); aux = "<" + aux; QStringList adifField; adifField.clear(); adifField << util->getValidADIFFieldAndData(aux); if (adifField.length()==2) { if (adifField.at(0) == "SUBDIV_ENTITY" ) { sub_dxcc = world->getQRZARRLId(adifField.at(1)); } else if (adifField.at(0) == "SUBDIV_REFERENCES") { //regionalAward->addRegionalAwardNumberOfReferences(adifField.at(1).toInt()); } else if (adifField.at(0) == "SUBDIV_VERSION") { //regionalAward->addRegionalAwardVersion(adifField.at(1).toInt()); } else if (adifField.at(0) == "SUBDIV_SPONSOR") { //regionalAward->addRegionalAwardSponsor(adifField.at(1)); } else if (adifField.at(0) == "SUBDIV_NAME") { //regionalAward->addRegionalAwardName(adifField.at(1)); } else { //qDebug() << "FileAwardManager::importNewAwardFile: Invalid AWA field found HEADER" << adifField.at(0); } } aux.clear(); } } else { // NOT in EOH // Read line, MODIFY AWARD //qDebug() << "FileAwardManager::importNewAwardFile: Parsing : " << line; foreach (aux, fields) { aux = aux.trimmed(); aux = "<" + aux; QStringList adifField; adifField.clear(); adifField << util->getValidADIFFieldAndData(aux); //qDebug() << "FileAwardManager::importNewAwardFile: Length: " << QString::number(adifField.count()); if (adifField.count()==2) { //qDebug() << "FileAwardManager::importNewAwardFile: Parsing : (" << adifField.at(0) << "/" << adifField.at(1) << ")"; if (adifField.at(0) == "SUBDIV_REFNUMBER" ) { sub_regionalID = adifField.at(1).toInt(); } if (adifField.at(0) == "SUBDIV_DXCC" ) { sub_dxcc = adifField.at(1).toInt(); } if (adifField.at(0) == "SUBDIV_CQ" ) { sub_cqz = adifField.at(1).toInt(); } if (adifField.at(0) == "SUBDIV_ITU" ) { sub_ituz = adifField.at(1).toInt(); } else if (adifField.at(0) == "SUBDIV_PREF") { sub_prefix = adifField.at(1); } else if (adifField.at(0) == "SUBDIV_SHORT") { sub_shortname = adifField.at(1); } else if (adifField.at(0) == "SUBDIV_NAME") { sub_name = adifField.at(1); } else if (adifField.at(0) == "SUBDIV_GROUP") { sub_regionalGroup = adifField.at(1); } else if (adifField.at(0) == "EOR") {// END OF REGISTRY //qDebug() << "FileAwardManager::importNewAwardFile: EOR FOUND!\nLet's add the reference."; QStringList _subDiv; dataProxy->addDXCCEntitySubdivision(sub_name, sub_shortname, sub_prefix, sub_regionalGroup, sub_regionalID, sub_dxcc, sub_cqz, sub_ituz, sub_startDate, sub_endDate, sub_deleted); sub_name = QString(); sub_shortname = QString(); sub_prefix = QString(); sub_regionalGroup = QString(); sub_regionalID = -1; sub_dxcc = -1; sub_cqz = -1; sub_ituz = -1; sub_startDate = QDate(); sub_endDate = QDate(); sub_deleted = false; } else { //qDebug() << "FileAwardManager::importNewAwardFile: Invalid AWA field found in BODY" << adifField.at(0); } }} } } return false; } void FileAwardManager::showError(const QString &_header, const QString &_msg, const QString &_detailedMsg) { //qDebug() << "FileAwardManager::showError: " << _msg; QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("KLog - %1").arg(_header)); msgBox.setText(_msg); msgBox.setInformativeText(_detailedMsg); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.exec(); } klog-2.3.3/elogclublog.h0000644000015700001710000000737014542412415015013 0ustar jenkinsjenkins#ifndef KLOG_ELOGCLUBLOG_H #define KLOG_ELOGCLUBLOG_H /*************************************************************************** elogclublog.h - description ------------------- begin : feb 2015 copyright : (C) 2015 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include "utilities.h" class eLogClubLog : public QObject { Q_OBJECT public: explicit eLogClubLog(); ~eLogClubLog(); void setDefaultCallsign(const QString &_defaultStationCallsign); int sendQSO(QStringList _qso); int deleteQSO(QStringList _qso); //int deleteQSOid(const int _qsoId); int modifyQSO (QStringList _oldQSO, QStringList _newQSO); void sendLogFile(const QString &_file, QList _qso, bool _overwrite); void loadSettings(); private: QString getClubLogAdif(const QStringList _q); //int sendData(const QString &_clublogCall, const QString &_q); // Sends the data (http post) to ClubLog int sendDataParams(const QString &_clublogCall, const QUrlQuery &_params, bool _adding); QString prepareToTranslate(const QString &_m); // Get the message and put it in a tr to be able to translate it QString email, pass, appPass, api, stationCallsign; QNetworkAccessManager *manager; QNetworkReply* reply; int currentQSO; QNetworkReply::NetworkError result; QString target; bool uploadingFile; QList qsos; Utilities *util; //bool useQSOStationCallsign; private slots: void slotQsoUploadFinished(QNetworkReply* data); void slotFileUploadFinished(QNetworkReply* data); void downloadProgress(qint64 received, qint64 total); void slotErrorManagement(QNetworkReply::NetworkError networkError); signals: void actionReturnDownload(const int _i, const int _qsoId); void done(); void actionShowProgres(qint64 received, qint64 total); void actionError(const int _i); void showMessage(const QString &_t); void disableClubLogAction(const bool _b); void signalFileUploaded(QNetworkReply::NetworkError, QList); }; #endif // DOWNLOADCTY_H klog-2.3.3/searchmodel.h0000644000015700001710000000572714542412415015007 0ustar jenkinsjenkins#ifndef KLOG_SEARCHMODEL_H #define KLOG_SEARCHMODEL_H /*************************************************************************** searchmodel.h - description ------------------- begin : sep 2020 copyright : (C) 2020 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include "awards.h" #include "dataproxy_sqlite.h" class SearchModel : public QSqlRelationalTableModel { Q_OBJECT public: SearchModel(DataProxy_SQLite *dp, QObject *parent); ~SearchModel(); void createSearchModel(const int _i); void setFilterString(const QString &_st); void setStationCallsignInHeader(const bool _s); void update(); void setColors (const QString &_newOne, const QString &_needed, const QString &_worked, const QString &_confirmed, const QString &_default); void setDXCCColumn(const int _i); void setBandIdColumn(const int _i); void setModeIdColumn(const int _i); void setLogNColumn(const int _i); private: //void setColumnsToDX(); //QSqlRelationalTableModel *SearchModel; QVariant data(const QModelIndex &index, int role) const; Awards *award; DataProxy_SQLite *dataProxy; bool stationCallsignInHeader; int dxcc, bandid, modeid, logn; signals: void queryError(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery); // To alert about any failed query execution }; #endif // SEARCHMODEL_H klog-2.3.3/dxccstatuswidget.h0000644000015700001710000000764714542412415016115 0ustar jenkinsjenkins#ifndef KLOG_DXCCSTATUSWIDGET_H #define KLOG_DXCCSTATUSWIDGET_H /*************************************************************************** dxccstatuswidget.h - description ------------------- begin : feb 2016 copyright : (C) 2016 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include //#include #include "awards.h" #include "world.h" #include "dataproxy_sqlite.h" #include "locator.h" #include "klogdefinitions.h" //TODO: Creating the widget to show the DXCC status class DXCCStatusWidget : public QWidget { Q_OBJECT public: explicit DXCCStatusWidget(DataProxy_SQLite *dp, const QString &_parentFunction, QWidget *parent = nullptr); ~DXCCStatusWidget(); void update(); //void awardsUpdated(); void setBands(const QString &_callingFunc, const QStringList &_ent, const bool _creating = false); // Receives the list of bandIDs void setCurrentLog(const int _logN); void setMyLocator(const QString &_loc); void refresh(); signals: //void showQso(const int _qsoid); // identified QSO double clicking on DXCC void showQsos(QList _qsos); void fillInQSOSignal(); void debugLog (QString _func, QString _msg, DebugLogLevel _level); //void updateAwards(); public slots: //void slotSearchLineEditTextChanged(); void slotRefreshButtonClicked(); private slots: //void slotRightButton(const QPoint& pos); //void slotWikipedia(); void slotItemEntered(QTableWidgetItem * item ); void slotItemDoubleClicked(QTableWidgetItem * item ); private: void createUI(); void setDefaultBands(); void addEntity(const QList &_ent); // DXCC id, bandid, bandid, ... void addEntity2(const QStringList &_ent); // DXCC id, bandid, bandid, ... // void showMenuRightButtonFromLogCreateActions(); // void righButtonFromLogMenu(const int trow); QTableWidget *dxccView; Awards *awards; World *world; DataProxy_SQLite *dataProxy; Locator *locator; QHeaderView *hv, *hh; //QLineEdit *searchLineEdit; QPushButton *refreshButton; //QCheckBox *showAllLogsButton; int numberOfColumns; // Columns will be number Of Bands + 2 (Id + Name) QStringList bandNames, validBands; int logNumber, tempLog; // log in use in the log / log to be used in the widget QString loc; // The locator of the user. QAction *showDXCCWikipediaAct; int currentLog; }; #endif // DXCCSTATUSWIDGET_H klog-2.3.3/eqslutilities.h0000644000015700001710000000753214542412415015415 0ustar jenkinsjenkins#ifndef KLOG_EQSLUTILITIES_H #define KLOG_EQSLUTILITIES_H /*************************************************************************** eqslutilities.h - description ------------------- begin : oct 2020 copyright : (C) 2020 by Jaime Robles user : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include "utilities.h" // https://www.eqsl.cc/qslcard/Programming.cfm class eQSLUtilities : public QObject { Q_OBJECT public: explicit eQSLUtilities(const QString &_parentFunction); ~eQSLUtilities(); void setUser(const QString &_call); void setPass(const QString &_pass); void setCredentials(const QString &_user, const QString &_pass, const QString &_defaultStationCallsign); //int sendQSO(QStringList _qso); //int deleteQSO(QStringList _qso); //int modifyQSO (QStringList _oldQSO, QStringList _newQSO); void sendLogFile(const QString &_file, QList _qso); private: //QString geteQSLAdif(const QStringList _q); //int sendData(const QString &_eQSLUser, const QString &_q); // Sends the data (http post) to eQSL //int sendDataParams(const QString &_eQSLUser, const QUrlQuery &_params); QStringList prepareToTranslate(const QString &_m); // Get the message and put it in a tr to be able to translate it QString user, pass, stationCallsign; QNetworkAccessManager *manager; QNetworkReply* reply; int currentQSO; QNetworkReply::NetworkError result; QString target; bool uploadingFile; QList qsos; Utilities *util; //bool useQSOStationCallsign; private slots: void slotQsoUploadFinished(QNetworkReply* data); //void slotFileUploadFinished(QNetworkReply* data); void downloadProgress(qint64 received, qint64 total); void slotErrorManagement(QNetworkReply::NetworkError networkError); signals: void actionReturnDownload(const int _i, const int _qsoId); void done(); void actionShowProgres(qint64 received, qint64 total); void actionError(const int _i); void showMessage(const QString &_t); void disableeQSLAction(const bool _b); void signalFileUploaded(QNetworkReply::NetworkError, QList); }; #endif // EQSLUTILITIES_H klog-2.3.3/locator.cpp0000644000015700001710000004572414542412415014520 0ustar jenkinsjenkins/*************************************************************************** locator.cpp - description ------------------- begin : vie feb 7 2003 copyright : (C) 2003 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "locator.h" #include Locator::Locator(){ } Locator::~Locator(){ } bool Locator::isValidLocator(const QString& tlocator){ /* -------------- Subroutine ----------------------- Check valid locator (VALID: AA00AA -> RR99XX) Input : char *locator = 4 - 8 characters word wide locator. returned value == -1 No error. (Valid locator). returned value == 0 Error. (Invalid locator). Note: also string "END" is considered a valid locator, but returned value is -2. ------------------------------------------------- Wikipedia: Character pairs encode longitude first, and then latitude. The first pair (a field) encodes with base 18 and the letters "A" to "R". The second pair (square) encodes with base 10 and the digits "0" to "9". The third pair (subsquare) encodes with base 24 and the letters "a" to "x". The fourth pair (extended square) encodes with base 10 and the digits "0" to "9". The fifth and subsequent pairs are not formally defined, but recycling the third and fourth pair algorithms is one possible definition: BL11bh16oo66 */ //qDebug() << "Locator::isValidLocator: " << tlocator; //int lenght_of_locator; QString testLocator ="A"; testLocator = tlocator.toUpper(); //lenght_of_locator = testLocator.length(); Locators up to 8 digits! //IN, IN70, IN70DD, IN70DD20, IN70DD20 QRegularExpression rx; rx.setPattern("^[A-R]{2}$"); if (rx.match(testLocator).hasMatch()) { //qDebug() << "Locator::isValidLocator: Match 2: " << testLocator; return true; } else { rx.setPattern("^[A-R]{2}[0-9]{2}$"); if (rx.match(testLocator).hasMatch()) { //qDebug() << "Locator::isValidLocator: Match 4: " << testLocator; return true; } else { rx.setPattern("^[A-R]{2}[0-9]{2}[A-X]{2}$"); if (rx.match(testLocator).hasMatch()) { //qDebug() << "Locator::isValidLocator: Match 6: " << testLocator; return true; } else { rx.setPattern("^[A-R]{2}[0-9]{2}[A-X]{2}[0-9]{2}$"); if (rx.match(testLocator).hasMatch()) { //qDebug() << "Locator::isValidLocator: Match 8: " << testLocator; return true; } else { //qDebug() << "Locator::isValidLocator: NOT VALID: " << testLocator; return false; } } } } } Coordinate Locator::getLocatorCoordinate(const QString _tlocator) { Coordinate _position; _position.lat = 0.0; _position.lon = 0.0; if (!isValidLocator(_tlocator)) { //qDebug() << Q_FUNC_INFO << ": Not valid: " << tlocator; return _position; } _position.lat = getLat (_tlocator); _position.lon = getLon (_tlocator); return _position; } Coordinate Locator::getLocatorCorner (const QString& tlocator, bool northWest) { //qDebug() << Q_FUNC_INFO << ": " << tlocator; Coordinate _position, _north, _south; _position.lat = 0.0; _position.lon = 0.0; Coordinate _positionC = _position; _north = _position; _south = _position; if (!isValidLocator(tlocator)) { //qDebug() << Q_FUNC_INFO << ": Not valid: " << tlocator; return _position; } _positionC.lat = getLat (tlocator); _positionC.lon = getLon (tlocator); if (tlocator.length() == 2) { _north.lat = _positionC.lat + 5; _north.lon = _positionC.lon - 10; _south.lat = _positionC.lat - 5; _south.lon = _positionC.lon + 10; } else if (tlocator.length() == 4) { _north.lat = _positionC.lat + 0.5; _north.lon = _positionC.lon -1; _south.lat = _positionC.lat - 0.5; _south.lon = _positionC.lon + 1; } else if (tlocator.length() == 6) { _north.lat = _positionC.lat ;//+ 0.020833333333333; //(2.5/60/2); _north.lon = _positionC.lon - 0.0416666666666667;//(5/60/2); _south.lat = _positionC.lat - (2*0.020833333333333); //(2.5/60/2); _south.lon = _positionC.lon + 0.0416666666666667;//(5/60/2); } //qDebug() << Q_FUNC_INFO; //qDebug() << "Center: lat/lon" << QString::number(_positionC.lat) << "/" << QString::number(_positionC.lon); //qDebug() << QString ("North : %1, %2").arg(_north.lat).arg(_north.lon); //qDebug() << QString ("South : %1, %2").arg(_south.lat).arg(_south.lon); if (northWest) { return _north; //qDebug() << QString ("North : %1, %2").arg(_position.lat).arg(_position.lon); } else { return _south; //qDebug() << QString ("South : %1, %2").arg(_position.lat).arg(_position.lon); } } double Locator::getLat(const QString& tlocator){ //qDebug() << "Locator::getLat: " << tlocator; // Read formula from: https://unclassified.software/files/source/MaidenheadLocator.cs //Revisar las formulas porque salen distancias erroneas if (!isValidLocator(tlocator)) { return 0.0; } QString aux = tlocator.toUpper(); if (aux.length() == 2) { return (((aux.at(1)).toLatin1() - 'A') * 10) - 85; } if (aux.length() == 4) { //return (((aux.at(1)).toLatin1() - 'A') * 10) + ((aux.at(3)).toLatin1() - '0' * 1) - 85; return (((aux.at(1)).toLatin1() - 'A') * 10) + ((aux.at(3)).digitValue() + 0.5) - 90; } if (aux.length() == 6) { double result = (((aux.at(1)).toLatin1() - 'A') * 10 ) + (aux.at(3).digitValue()) + (((aux.at(5)).toLatin1() - 'A') * (2.5/60)) + (static_cast(2.5/60)) - 90; //qDebug() << QString("%1: Locator/Latitude: %2/%3").arg(Q_FUNC_INFO).arg(aux).arg(result); return result; } if (aux.length()== 8) { return ((aux.at(1)).toLatin1() - 'A') * 10 + ((aux.at(3)).digitValue() * 1) + (((aux.at(5)).toLatin1() - 'A') * (2.5/60)) + ((aux.at(7)).toLatin1() - '0' * 0.5) / 240 - 90; } if (aux.length()== 10) { return ((aux.at(1)).toLatin1() - 'A') * 10 + ((aux.at(3)).toLatin1() - '0') + ((aux.at(5)).toLatin1() - 'A' + 0.0) / 24 + ((aux.at(7)).toLatin1() - '0' + 0.0) / 240 + static_cast((aux.at(9)).toLatin1() - 'A' + 0.5) / 240 / 24 - 90; } else { return 0.0; } } double Locator::getLon(const QString& tlocator) { //qDebug() << "Locator::getLon: " << tlocator; if (!isValidLocator(tlocator)) { return 0.0; } QString aux = tlocator.toUpper (); if (aux.length() == 2) { return (((aux.at(0)).toLatin1() - 'A') * 20) + 10 - 180; } if (aux.length() == 4) { //qDebug() << QString("%1 + %2 + %3 - 180 = %4") // .arg((((aux.at(0)).toLatin1() - 'A') * 20)) // .arg((((aux.at(2)).digitValue () ) * 2)) // .arg(1) // .arg((((aux.at(0)).toLatin1() - 'A') * 20) + (((aux.at(2)).digitValue () ) * 2) +1 - 180); // return ((aux.at(0)).toLatin1() - 'A') * 20 + 10 + (((aux.at(2)).digitValue () ) * 2) + 0.0416666666666667 - 180; return (((aux.at(0)).toLatin1() - 'A') * 20) + (((aux.at(2)).digitValue () ) * 2) + 1 - 180; } if (aux.length() == 6) { //qDebug() << QString("%1 + %2 + %3 + %4 - 180 = %5").arg((((aux.at(0)).toLatin1() - 'A') * 20)).arg((((aux.at(2)).digitValue () ) * 2)).arg((((aux.at(4)).toLatin1() - 'A')/12 )).arg(0.0416666666666667).arg((((aux.at(0)).toLatin1() - 'A') * 20) + (((aux.at(2)).digitValue () ) * 2) + (static_cast((aux.at(4)).toLatin1() - 'A')/12.0 ) + 0.0416666666666667 - 180); return (((aux.at(0)).toLatin1() - 'A') * 20) + (((aux.at(2)).digitValue () ) * 2) + (static_cast(((aux.at(4)).toLatin1()) - 'A')/12.0 ) + 0.0416666666666667 - 180; } if (aux.length()== 8) { return ((aux.at(0)).toLatin1() - 'A') * 20 + ((aux.at(2)).digitValue()) * 2 + static_cast((aux.at(4)).toLatin1() - 'A' + 0.0) / 12 + static_cast((aux.at(6)).toLatin1() - '0' + 0.5) / 120 - 180; } //else if (aux.length()== 10) //{ // return ((aux.at(0)).toLatin1() - 'A') * 20 + ((aux.at(2)).toLatin1() - '0') * 2 + ((aux.at(4)).toLatin1() - 'A' + 0.0) / 12 + ((aux.at(6)).toLatin1() - '0' + 0.0) / 120 + ((aux.at(8)).toLatin1() - 'A' + 0.5) / 120 / 24 - 180; // } else { return 0.0; } } int Locator::getBeam(const double lon1, const double lat1, const double lon2, const double lat2){ double lon_a,lat_a,lon_b,lat_b, bearing; //qDebug() << "Locator::getBeam1: " << QString::number(lon1) << "/" << QString::number(lat1); //qDebug() << "Locator::getBeam2: " << QString::number(lon2) << "/" << QString::number(lat2); lon_a=lon1*PI/180; // Convert degrees to radians lat_a=lat1*PI/180; lon_b=lon2*PI/180; lat_b=lat2*PI/180; //earing_Distance( double lon_a, double lat_a, /* Lon/Lat of point A */ // double lon_b, double lat_b, /* Lon/Lat of point B */ // double *bearing, double *distance )/* From A to B */ //{ double cos_gc_arc, /* Great circle arc A to B */ cos_bearing, sin_bearing, /* cos/sin of bearing A to B */ lon_diff; /* Difference in longitude of B from A */ //double gc_arc; /* Longitude differnce of B from A */ lon_diff = lon_b - lon_a; /* Calculate great circle distance A to B */ cos_gc_arc = cos(lon_diff)*cos(lat_a)*cos(lat_b) + sin(lat_a)*sin(lat_b); //gc_arc = acos( cos_gc_arc ); /* Distance in km */ // *distance = eradius * gc_arc; /* Calculate bearing A to B */ cos_bearing = sin(lat_b) - sin(lat_a) * cos_gc_arc; sin_bearing = sin(lon_diff) * cos(lat_a) * cos(lat_b); bearing = atan2(sin_bearing, cos_bearing); /* Correct negative (anticlockwise) bearings */ if( bearing < 0.0 ) { bearing = (2*PI) + bearing; } bearing = 360 - (180/PI*bearing); bearing = 360 - bearing; //qDebug() << "Locator::getBeam: " << QString::number(bearing); /* Convert to degrees */ return int(bearing); } int Locator::getDistance(const double lon1, const double lat1, const double lon2, const double lat2, const bool _imperialSystem){ //http://en.wikipedia.org/wiki/Haversine_formula //qDebug() << "Locator::getDistanceKilometres: MyPos("<< QString::number(lon1) << ")"; // << QString::number(lat1) << ") - DxPos(" << QString::number(lon2) << "/" << QString::number(lat2) << ")"; double lo1,la1,lo2,la2; // TODO: Is it needed to check if the longitude and latitude are correct and/or between the magins? // if (!( (checkCoords(lon1, lat1) ) && (checkCoords(lon2, lat2)) )) // return 0; lo1=lon1* DEG_TO_RAD; // Convert degrees to radians la1=lat1* DEG_TO_RAD; lo2=lon2* DEG_TO_RAD; la2=lat2* DEG_TO_RAD; if (!_imperialSystem){ //qDebug() << "Locator::getDistance (Km): " << QString::number((int)(acos(cos(la1)*cos(lo1)*cos(la2)*cos(lo2)+cos(la1)*sin(lo1)*cos(la2)*sin(lo2)+sin(la1)*sin(la2)) * EARTH_RADIUS)); return int(acos(cos(la1)*cos(lo1)*cos(la2)*cos(lo2)+cos(la1)*sin(lo1)*cos(la2)*sin(lo2)+sin(la1)*sin(la2)) * EARTH_RADIUS); }else{ // In milles //qDebug() << "Locator::getDistance (Milles): " << QString::number(((int)(acos(cos(la1)*cos(lo1)*cos(la2)*cos(lo2)+cos(la1)*sin(lo1)*cos(la2)*sin(lo2)+sin(la1)*sin(la2)) * EARTH_RADIUS))* 0.62137); return int(((acos(cos(la1)*cos(lo1)*cos(la2)*cos(lo2)+cos(la1)*sin(lo1)*cos(la2)*sin(lo2)+sin(la1)*sin(la2)) * EARTH_RADIUS)) * 0.62137); } } bool Locator::checkCoords(const double lon1, const double lat1){ //qDebug() << "Locator::checkCoords" ; // Checks if a coordinates is correct. if ((lat1 > 90.0 || lat1 < -90.0) && (lon1 > 180.0 || lon1 < -180.0)){ return true; }else{ return false; } } QString Locator::getLocator(const double lon1, const double lat1, int length) const{ /* -------------- Subroutine ----------------------- Calculate locator from longitude and latitude Input : lon = Longitude in decimal degrees (+ = West; - = East). lat = Latitude in decimal degrees (+ = North; - = South). Output: locator = 6 characters world wide locator. ------------------------------------------------- */ //qDebug() << "Locator::getLocator: (" << QString::number(lon1) << "/" << QString::number(lat1) << ")"; QString locat = ""; //NO locator double lo, la; int alo,bla,clo,dla,elo,fla; lo = (lon1+180)/20; la = (lat1+90)/10; alo=int(floor(lo)); bla=int(floor(la)); locat = locat + QChar(alo+'A'); locat = locat + QChar(bla+'A'); //qDebug() << Q_FUNC_INFO << ": " << locat; if (length == 2) { return locat; } lo=(lo-(double(alo)))*10; la=(la-(double(bla)))*10; clo = int(floor(lo)); dla = int(floor(la)); locat = locat + QChar(clo+'0'); locat = locat + QChar(dla+'0'); //qDebug() << Q_FUNC_INFO << ": " << locat; if (length == 4) { return locat; } elo = int(floor((lo-double(clo) ) * 24 )) ; fla = int(floor((la-double(dla) ) * 24 )); locat = locat + QChar(elo+'A'); locat = locat + QChar(fla+'A'); //qDebug() << Q_FUNC_INFO << ": " << locat; //locat = locat + QChar(elo+'A'); //locat = locat + QChar(fla+'A'); //qDebug() << Q_FUNC_INFO << ": " << locat; return locat; } int Locator::getBeamBetweenLocators (const QString& tlocator1, const QString& tlocator2) { //qDebug() << "Locator::getBeamBetweenLocators: " << tlocator1 << "/" << tlocator2; if ( !(isValidLocator(tlocator1) && isValidLocator(tlocator2) ) ) { return -1; } else { double lon1 = getLon(tlocator1); double lon2 = getLon(tlocator2); double lat1 = getLat(tlocator1); double lat2 = getLat(tlocator2); return getBeam(lon1, lat1, lon2, lat2); } } int Locator::getDistanceBetweenLocators (const QString& tlocator1, const QString& tlocator2, const bool _imperialSystem) { if ( !(isValidLocator(tlocator1) && isValidLocator(tlocator2) ) ) { return -1; } else { double lon1 = getLon(tlocator1); double lon2 = getLon(tlocator2); double lat1 = getLat(tlocator1); double lat2 = getLat(tlocator2); return getDistance(lon1, lat1, lon2, lat2, _imperialSystem); } } QStringList Locator::getAll(int _length) { //qDebug() << Q_FUNC_INFO << QString(" - %1").arg(_length); QStringList list; list.clear(); QString locator; QChar letter1, letter2, letter3, letter4, num1, num2; for (int i = 0; i<18; i++) { letter1 = 'A' + i; for (int j = 0; j<18; j++) { letter2 = 'A' + j; if (_length<=2) { locator.append(letter1); locator.append(letter2); list.append(locator); //qDebug() << Q_FUNC_INFO << locator ; locator.clear(); } else { for (int k = 0; k<10; k++) { num1 = '0' + k; for (int l = 0; l<10; l++) { num2 = '0' + l; if (_length<=4) { locator.append(letter1); locator.append(letter2); locator.append(num1); locator.append(num2); list.append(locator); //qDebug() << Q_FUNC_INFO << locator ; locator.clear(); } else { for (int m = 0; m<24; m++) { letter3 = 'a' + m; for (int n = 0; n<24; n++) { letter4 = 'a' + n; if (_length<=6) { locator.append(letter1); locator.append(letter2); locator.append(num1); locator.append(num2); locator.append(letter3); locator.append(letter4); list.append(locator); //qDebug() << Q_FUNC_INFO << locator ; locator.clear(); } } } } } } } } } return list; } QStringList Locator::getShortLocators(const QStringList &locators, const int _length) { QStringList shortLocators; shortLocators.clear (); foreach(QString i, locators) { if (i.length() == _length) { shortLocators << i; } else if (i.length()>_length) { QString a = i; a.truncate(4); shortLocators << a; } } shortLocators.removeDuplicates(); shortLocators.sort(); return shortLocators; } klog-2.3.3/updatesettings.cpp0000644000015700001710000005650714542412415016121 0ustar jenkinsjenkins/*************************************************************************** updatesettings.h - description ------------------- begin : mar 2023 copyright : (C) 2023 by Jaime Robles email : jaime@robles.es ***************************************************************************/ /***************************************************************************** * This file is part of KLog. * * * * KLog is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * KLog is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with KLog. If not, see . * * * *****************************************************************************/ #include "updatesettings.h" #include "global.h" UpdateSettings::UpdateSettings() { } UpdateSettings::~UpdateSettings() { } bool UpdateSettings::findInFile() { //qDebug() << Q_FUNC_INFO; Utilities util(Q_FUNC_INFO); QString searchString("[UserData]"); QString _fileName = util.getCfgFile (); //qDebug() << Q_FUNC_INFO << " File: " << _fileName; if (!QFile::exists(_fileName)) { //qDebug() << Q_FUNC_INFO << " - File does not exist"; return false; } //qDebug() << Q_FUNC_INFO << " - File exists"; QFile file(_fileName); QTextStream in (&file); QString line; if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << Q_FUNC_INFO << " - Can't open the file"; return false; } do { line = in.readLine(); //qDebug() << Q_FUNC_INFO << " - Line: " << line; if (line.contains(searchString, Qt::CaseSensitive)) { //qDebug() << Q_FUNC_INFO << " - String founded!"; file.close(); return true; } } while (!line.isNull()); file.close(); //qDebug() << Q_FUNC_INFO << " - String NOT found!!"; return false; } bool UpdateSettings::renameFile(const QString &_oldName, const QString &_newName) { if (QFile::exists(_newName)) { if (!QFile::remove (_newName)) { return false; } } QFile file(_oldName); if (!file.copy(_newName)) { return false; } return file.remove (); } bool UpdateSettings::updateFile() { //qDebug() << Q_FUNC_INFO ; Utilities util(Q_FUNC_INFO); // 3 steps: // Find if update is needed // Crete a backup file // Generate the new from backup if (findInFile ()) // Do we need to update the file? { //qDebug() << Q_FUNC_INFO << " - No need to update"; return true; } //qDebug() << Q_FUNC_INFO << " - Updating setting file..."; QMessageBox msgBox; msgBox.setWindowTitle(tr("KLog - Settings update")); msgBox.setIcon(QMessageBox::Warning); msgBox.setText(tr("The settings system has been changed and KLog will update your settings file.")); msgBox.setStandardButtons(QMessageBox::Ok ); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); QString _oldFile = util.getCfgFile (); QString _backupFile = util.getCfgFile () + "-back"; //qDebug() << Q_FUNC_INFO << " - Renaming file"; if (!renameFile (util.getCfgFile (), _backupFile)) { //qDebug() << Q_FUNC_INFO << " - Renaming file FAILED"; return false; } //qDebug() << Q_FUNC_INFO << " - Opening backup file"; QFile file(_backupFile); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) /* Flawfinder: ignore */ { //qDebug() << Q_FUNC_INFO << " - Opening backup file FAILED"; return false; } while (!file.atEnd()){ QByteArray line = file.readLine(); processConfigLine(line); } //qDebug() << Q_FUNC_INFO << " - Settings migrated"; return true; } bool UpdateSettings::processConfigLine(const QString &_line) { //qDebug() << Q_FUNC_INFO << _line; Utilities util(Q_FUNC_INFO); QString line = _line.simplified(); QStringList values = line.split("=", QT_SKIP); if (line.startsWith('#')) { return true; } if (!( (line.contains('=')) && (line.contains(';')))){ return false; } QString value = values.at(1); QString tab = (values.at(0)).toUpper(); int endValue = value.indexOf(';'); if (endValue>-1) { value = value.left(value.length() - (value.length() - endValue)); } //QSettings settings(util.getCfgFile(), QSettings::IniFormat); QSettings settings(util.getCfgFile(), QSettings::IniFormat); if (tab == "CALLSIGN") { settings.beginGroup ("UserData"); settings.setValue ("Callsign", value); settings.endGroup (); }else if(tab =="SELECTEDLOG"){ settings.setValue ("SelectedLog", value.toInt ()); }else if(tab =="VERSION"){ settings.setValue ("Version", value); }else if (tab == "OPERATORS"){ settings.beginGroup ("UserData"); settings.setValue ("Operators", value); settings.endGroup (); }else if (tab=="CQZ"){ settings.beginGroup ("UserData"); settings.setValue ("CQz", (value).toInt()); settings.endGroup (); }else if (tab=="ITUZ"){ settings.beginGroup ("UserData"); settings.setValue ("ITUz", (value).toInt()); settings.endGroup (); }else if (tab=="MODES"){ settings.beginGroup ("BandMode"); settings.setValue ("Modes", value.split (", ", QT_SKIP)); settings.endGroup (); }else if (tab=="BANDS"){ //qDebug() << Q_FUNC_INFO << ": " << value; settings.beginGroup ("BandMode"); settings.setValue ("Bands", value.split (", ", QT_SKIP)); settings.endGroup (); }else if (tab=="LOGVIEWFIELDS"){ settings.setValue ("LogViewFields", value.split (", ", QT_SKIP)); //settings.setValue ("LogViewFields", value); }else if (tab=="REALTIME"){ settings.beginGroup ("Misc"); settings.setValue ("RealTime", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="SHOWSECONDS"){ settings.beginGroup ("Misc"); settings.setValue ("ShowSeconds", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="UTCTIME"){ settings.beginGroup ("Misc"); settings.setValue ("UTCTime", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="ALWAYSADIF"){ settings.beginGroup ("Misc"); settings.setValue ("AlwaysADIF", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="USEDEFAULTNAME"){ settings.beginGroup ("Misc"); settings.setValue ("UseDefaultName", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="DBPATH"){ settings.beginGroup ("Misc"); settings.setValue ("DBPath", value); settings.endGroup (); }else if (tab=="DEFAULTADIFFILE"){ settings.beginGroup ("Misc"); settings.setValue ("DefaultADIFFile", value); settings.endGroup (); }else if (tab=="IMPERIALSYSTEM"){ settings.beginGroup ("Misc"); settings.setValue ("ImperialSystem", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="COMPLETEWITHPREVIOUS"){ settings.beginGroup ("Misc"); settings.setValue ("CompleteWithPrevious", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="SENDQSLWHENREC"){ settings.beginGroup ("Misc"); settings.setValue ("SendQSLWhenRec", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="MANAGEDXMARATHON"){ settings.beginGroup ("Misc"); settings.setValue ("ManageDXMarathon", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="DEBUGLOG"){ settings.beginGroup ("Misc"); settings.setValue ("DebugLog", value); settings.endGroup (); }else if (tab=="SHOWCALLSIGNINSEARCH"){ settings.beginGroup ("Misc"); settings.setValue ("ShowCallsignInSearch", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="CHECKNEWVERSIONS"){ settings.beginGroup ("Misc"); settings.setValue ("CheckNewVersions", util.trueOrFalse (value)); settings.endGroup (); //}else if (tab=="PROVIDEINFO"){ //settings.setValue ("ProvideInfo", util.trueOrFalse (value)); }else if (tab=="SENDEQSLBYDEFAULT"){ settings.beginGroup ("Misc"); settings.setValue ("SendEQSLByDefault", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="DUPLICATEDQSOSLOT"){ if (value.toInt()>=0) { settings.beginGroup ("Misc"); settings.setValue ("DuplicatedQSOSlot", value.toInt()); settings.endGroup (); } }else if (tab == "CHECKVALIDCALLS"){ settings.beginGroup ("Misc"); settings.setValue ("CheckValidCalls", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="UDPSERVER"){ settings.beginGroup ("UDPServer"); settings.setValue ("UDPServer", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="UDPNETWORKINTERFACE"){ settings.beginGroup ("UDPServer"); settings.setValue ("UDPNetworkInterface", value); settings.endGroup (); }else if (tab=="UDPSERVERPORT"){ settings.beginGroup ("UDPServer"); settings.setValue ("UDPServerPort", value.toInt()); settings.endGroup (); }else if (tab=="LOGFROMWSJTX"){ settings.beginGroup ("UDPServer"); settings.setValue ("LogFromWSJTX", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="LOGAUTOFROMWSJTX"){ settings.beginGroup ("UDPServer"); settings.setValue ("LogAutoFromWSJTX", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="REALTIMEFROMWSJTX"){ settings.beginGroup ("UDPServer"); settings.setValue ("RealTimeFromWSJTX", util.trueOrFalse (value)); settings.endGroup (); }else if (tab=="INFOTIMEOUT"){ settings.beginGroup ("UDPServer"); settings.setValue ("InfoTimeOut", value.toInt ()); settings.endGroup (); }else if (tab =="NAME"){ settings.beginGroup ("UserData"); settings.setValue ("Name", value); settings.endGroup (); }else if (tab =="ADDRESS1"){ settings.beginGroup ("UserData"); settings.setValue ("Address1", value); settings.endGroup (); }else if (tab =="ADDRESS2"){ settings.beginGroup ("UserData"); settings.setValue ("Address2", value); settings.endGroup (); }else if (tab =="ADDRESS3"){ settings.beginGroup ("UserData"); settings.setValue ("Address3", value); settings.endGroup (); }else if (tab =="ADDRESS4"){ settings.beginGroup ("UserData"); settings.setValue ("Address4", value); settings.endGroup (); }else if (tab =="CITY"){ settings.beginGroup ("UserData"); settings.setValue ("City", value); settings.endGroup (); }else if (tab =="ZIPCODE"){ settings.beginGroup ("UserData"); settings.setValue ("ZipCode", value); settings.endGroup (); }else if (tab =="PROVINCESTATE"){ settings.beginGroup ("UserData"); settings.setValue ("ProvinceState", value); settings.endGroup (); }else if (tab =="COUNTRY"){ settings.beginGroup ("UserData"); settings.setValue ("Country", value); settings.endGroup (); }else if (tab =="POWER"){ settings.beginGroup ("UserData"); settings.setValue ("Power", value.toInt ()); settings.endGroup (); }else if (tab =="RIG1"){ settings.beginGroup ("UserData"); settings.setValue ("Rig1", value); settings.endGroup (); }else if (tab =="RIG2"){ settings.beginGroup ("UserData"); settings.setValue ("Rig2", value); settings.endGroup (); }else if (tab =="RIG3"){ settings.beginGroup ("UserData"); settings.setValue ("Rig3", value); settings.endGroup (); }else if (tab =="ANTENNA1"){ settings.beginGroup ("UserData"); settings.setValue ("Antenna1", value); settings.endGroup (); }else if (tab =="ANTENNA2"){ settings.beginGroup ("UserData"); settings.setValue ("Antenna2", value); settings.endGroup (); }else if (tab =="ANTENNA3"){ settings.beginGroup ("UserData"); settings.setValue ("Antenna3", value); settings.endGroup (); }else if (tab =="STATIONLOCATOR"){ Locator locator; if ( locator.isValidLocator(value) ) { settings.beginGroup ("UserData"); settings.setValue ("StationLocator", value); settings.endGroup (); } }else if (tab =="DXCLUSTERSHOWHF"){ settings.beginGroup ("DXCluster"); settings.setValue ("DXClusterShowHF", util.trueOrFalse (value)); settings.endGroup (); }else if (tab =="DXCLUSTERSHOWVHF"){ settings.beginGroup ("DXCluster"); settings.setValue ("DXClusterShowVHF", util.trueOrFalse (value)); settings.endGroup (); }else if (tab =="DXCLUSTERSHOWWARC"){ settings.beginGroup ("DXCluster"); settings.setValue ("DXClusterShowWARC", util.trueOrFalse (value)); settings.endGroup (); }else if (tab =="DXCLUSTERSHOWWORKED"){ settings.beginGroup ("DXCluster"); settings.setValue ("DXClusterShowWorked", util.trueOrFalse (value)); settings.endGroup (); }else if (tab =="DXCLUSTERSHOWCONFIRMED"){ settings.beginGroup ("DXCluster"); settings.setValue ("DXClusterShowConfirmed", util.trueOrFalse (value)); settings.endGroup (); }else if (tab =="DXCLUSTERSHOWANN"){ settings.beginGroup ("DXCluster"); settings.setValue ("DXClusterShowANN", util.trueOrFalse (value)); settings.endGroup (); }else if (tab =="DXCLUSTERSHOWWWV"){ settings.beginGroup ("DXCluster"); settings.setValue ("DXClusterShowWWV", util.trueOrFalse (value)); settings.endGroup (); }else if (tab =="DXCLUSTERSHOWWCY"){ settings.beginGroup ("DXCluster"); settings.setValue ("DXClusterShowWCY", util.trueOrFalse (value)); settings.endGroup (); }else if (tab =="DXCLUSTERSERVERTOUSE"){ settings.beginGroup ("DXCluster"); //qDebug() << Q_FUNC_INFO << "DXClusterServerToUse: " << value; settings.setValue ("DXClusterServerToUse", value); settings.endGroup (); }else if (tab =="DXCLUSTERSERVERPORT"){ QList clusters; clusters.clear (); settings.beginGroup ("DXCluster"); int size = settings.beginReadArray("DXClusterServers"); for (int i = 0; i < size; ++i) { settings.setArrayIndex(i); clusters.append (settings.value("Server").toString()); //qDebug() << Q_FUNC_INFO << " - Reading Servers: " << settings.value("Server").toString(); } settings.endArray(); settings.endGroup (); clusters.append (value); //qDebug() << Q_FUNC_INFO << " - AddedServer: " << value; settings.beginGroup ("DXCluster"); settings.beginWriteArray("DXClusterServers"); for (int i = 0; i < clusters.size(); ++i) { settings.setArrayIndex(i); settings.setValue("Server", clusters.at(i)); //qDebug() << Q_FUNC_INFO << " - Writting Servers: " << clusters.at(i); } settings.endArray(); settings.endGroup (); }else if (tab =="DXCLUSTERSAVE"){ settings.beginGroup ("DXCluster"); settings.setValue ("DXClusterSave", util.trueOrFalse (value)); settings.endGroup (); }else if (tab =="DXCLUSTERSENDTOMAP"){ settings.beginGroup ("DXCluster"); settings.setValue ("DXClusterSendToMap", util.trueOrFalse (value)); settings.endGroup (); }else if(tab =="NEWONECOLOR"){ settings.beginGroup ("Colors"); settings.setValue ("NewOneColor", value); settings.endGroup (); }else if(tab =="NEEDEDCOLOR"){ settings.beginGroup ("Colors"); settings.setValue ("NeededColor", value); settings.endGroup (); }else if(tab =="WORKEDCOLOR"){ settings.beginGroup ("Colors"); settings.setValue ("WorkedColor", value); settings.endGroup (); }else if(tab =="CONFIRMEDCOLOR"){ settings.beginGroup ("Colors"); settings.setValue ("ConfirmedColor", value); settings.endGroup (); }else if(tab =="DEFAULTCOLOR"){ settings.beginGroup ("Colors"); settings.setValue ("DefaultColor", value); settings.endGroup (); }else if(tab =="DARKMODE"){ settings.beginGroup ("Colors"); settings.setValue ("DarkMode", util.trueOrFalse (value)); settings.endGroup (); }else if(tab =="HAMLIBRIGTYPE"){ settings.beginGroup ("HamLib"); settings.setValue ("HamLibRigType", value.toInt ()); settings.endGroup (); }else if(tab =="HAMLIBSERIALPORT"){ settings.beginGroup ("HamLib"); settings.setValue ("HamlibSerialPort", value); settings.endGroup (); }else if(tab =="HAMLIBSERIALBAUDS"){ settings.beginGroup ("HamLib"); settings.setValue ("HamlibSerialBauds", value.toInt ()); settings.endGroup (); }else if(tab =="HAMLIB"){ settings.beginGroup ("HamLib"); settings.setValue ("HamlibActive", util.trueOrFalse (value)); settings.endGroup (); }else if(tab=="HAMLIBREADONLY"){ settings.beginGroup ("HamLib"); settings.setValue ("HamlibReadOnly", util.trueOrFalse (value)); settings.endGroup (); }else if(tab =="HAMLIBSERIALDATABITS"){ settings.beginGroup ("HamLib"); settings.setValue ("HamLibSerialDataBits", value.toInt ()); settings.endGroup (); }else if(tab =="HAMLIBSERIALSTOPBITS"){ settings.beginGroup ("HamLib"); settings.setValue ("HamLibSerialStopBit", value); settings.endGroup (); }else if(tab =="HAMLIBSERIALFLOWCONTROL"){ settings.beginGroup ("HamLib"); settings.setValue ("HamLibSerialFlowControl", value); settings.endGroup (); }else if(tab =="HAMLIBSERIALPARITY"){ settings.beginGroup ("HamLib"); settings.setValue ("HamLibSerialParity", value); settings.endGroup (); }else if (tab == "HAMLIBRIGPOLLRATE"){ settings.beginGroup ("HamLib"); settings.setValue ("HamlibRigPollRate", value.toInt ()); settings.endGroup (); }else if (tab == "HAMLIBNETADDRESS"){ settings.beginGroup ("HamLib"); settings.setValue ("HamlibNetAddress", value); settings.endGroup (); }else if (tab == "HAMLIBNETPORT"){ settings.beginGroup ("HamLib"); settings.setValue ("HamlibNetPort", value.toInt ()); settings.endGroup (); }else if(tab =="CLUBLOGACTIVE"){ settings.beginGroup ("ClubLog"); settings.setValue ("ClubLogActive", util.trueOrFalse (value)); settings.endGroup (); }else if(tab =="CLUBLOGREALTIME"){ settings.beginGroup ("ClubLog"); settings.setValue ("ClubLogRealTime", util.trueOrFalse (value)); settings.endGroup (); }else if(tab =="CLUBLOGPASS"){ settings.beginGroup ("ClubLog"); settings.setValue ("ClubLogPass", value); settings.endGroup (); }else if(tab =="CLUBLOGEMAIL"){ settings.beginGroup ("ClubLog"); settings.setValue ("ClubLogEmail", value); settings.endGroup (); }else if(tab =="EQSLACTIVE"){ settings.beginGroup ("eQSL"); settings.setValue ("eQSLActive", util.trueOrFalse (value)); settings.endGroup (); }else if(tab =="EQSLCALL"){ settings.beginGroup ("eQSL"); settings.setValue ("eQSLCall", value); settings.endGroup (); }else if(tab =="EQSLPASS"){ settings.beginGroup ("eQSL"); settings.setValue ("eQSLPass", value); settings.endGroup (); }else if(tab =="QRZCOMACTIVE"){ settings.beginGroup ("QRZcom"); settings.setValue ("QRZcomActive", util.trueOrFalse (value)); settings.endGroup (); }else if(tab =="QRZCOMSUBSCRIBER"){ settings.beginGroup ("QRZcom"); settings.setValue ("QRZcomSubscriber", util.trueOrFalse (value)); settings.endGroup (); }else if(tab =="QRZCOMUSER"){ settings.beginGroup ("QRZcom"); settings.setValue ("QRZcomUser", value); settings.endGroup (); }else if(tab =="QRZCOMAUTO"){ settings.beginGroup ("QRZcom"); settings.setValue ("QRZcomAuto", util.trueOrFalse (value)); settings.endGroup (); }else if(tab =="QRZCOMPASS"){ settings.beginGroup ("QRZcom"); settings.setValue ("QRZcomPass", value); settings.endGroup (); }else if(tab =="QRZCOMLOGBOOKKEY"){ settings.beginGroup ("QRZcom"); settings.setValue ("QRZcomLogBookKey", value); settings.endGroup (); }else if(tab =="LOTWACTIVE"){ settings.beginGroup ("LoTW"); settings.setValue ("LoTWActive", util.trueOrFalse (value)); settings.endGroup (); }else if(tab =="LOTWPATH"){ settings.beginGroup ("LoTW"); settings.setValue ("LoTWPath", value); settings.endGroup (); }else if(tab =="LOTWUSER"){ settings.beginGroup ("LoTW"); settings.setValue ("LoTWUser", value); settings.endGroup (); }else if(tab =="LOTWPASS"){ settings.beginGroup ("LoTW"); settings.setValue ("LoTWPass", value); settings.endGroup (); }else if(tab =="LATESTBACKUP"){ QDateTime dtime = QDateTime::fromString(value, "yyyyMMdd-hhmmss"); settings.setValue ("LatestBackup", dtime.toString(Qt::ISODate)); }else if(tab =="MAINWINDOWSIZE"){ QSize windowSize; QStringList values; values.clear(); values << value.split("x"); if ((values.at(0).toInt()>0) && (values.at(1).toInt()>0)) { windowSize.setWidth(values.at(0).toInt()); windowSize.setHeight(values.at(1).toInt()); } settings.setValue ("MainWindowSize", windowSize); }else if(tab =="DELETEALWAYSADIFILE"){ settings.beginGroup ("Misc"); settings.setValue ("DeleteAlwaysAdiFile", util.trueOrFalse (value)); settings.endGroup (); }else if (tab == "LATESTBACKUP"){ settings.setValue ("LatestBackup", value); }else{ //qDebug() << "SetupDialog::processConfigLine: NONE: " << QT_ENDL; } return true; }